タスクごとに最適なハーネスをResearch Preview

Claude Code に Dynamic Workflows(ダイナミックワークフロー) が登場した。Claude がタスクに応じてオーケストレーションスクリプトをその場で書き、ランタイムがバックグラウンドで実行する仕組みだ。1 セッション内で数十から数百の並列サブエージェントを走らせ、結果をまとめる前に検証する。週単位かかっていた複雑なエンジニアリング作業を、数日で完了させることを狙っている。

デフォルトの Claude Code ハーネスはコーディング向けに作られているが、多くのタスクはコーディングに似ているため幅広く役立つ。一方で Research、セキュリティ分析、エージェントチーム、コードレビューのように、ピーク性能を出すには専用ハーネスを別途組む必要があった領域もある。Workflows はそうしたハーネスを Claude Code 上でネイティブに、しかも動的に生成できるようにする。作ったワークフローは他者と共有・再利用もできる。

本記事は Anthropic の Claude Code チームに所属する Thariq Shihipar 氏と Sid Bidasaria 氏によるブログ記事「A harness for every task: dynamic workflows in Claude Code」をもとに、要点を整理したリサーチノートである。

なぜ動的ワークフローなのか

デフォルトのハーネスにタスクを依頼すると、Claude は同じコンテキストウィンドウの中で計画と実行を同時にこなす。多くのコーディングタスクではこれが極めて有効だが、長時間・大規模並列・高度に構造化された敵対的タスクでは破綻しやすい。単一コンテキストで複雑な作業を続けるほど、次の 3 つの失敗モードに陥りやすくなるためだ。

Agentic laziness

複雑な多段タスクを途中で打ち切り、部分的な進捗で「完了」と宣言してしまう。たとえばセキュリティレビュー 50 項目のうち 20 項目で終えてしまうような挙動。

Self-preferential bias

自分の出力や発見を優先しがちになる傾向。とくにルーブリックに照らして検証・採点を求められたとき、判定が甘くなる。

Goal drift

多くのターンを経るうちに当初の目的への忠実度が徐々に失われる。とくに要約(compaction)のたびに情報が欠落し、エッジケース要件や「X するな」という制約が抜け落ちる。

ワークフローを作ると、それぞれ独立したコンテキストウィンドウと、絞り込まれた目標を持つ複数の Claude をオーケストレーションできる。これによって上記の失敗モードを構造的に抑え込める。

3 つのプリミティブの使い分け

Workflows は Subagents、Skills に続く第 3 のオーケストレーションプリミティブだ。「次に何を実行するか、その判断とプランを誰が保持するのか」という軸で整理すると理解しやすい。

SubagentsSkillsWorkflows
正体Claude が spawn するワーカーClaude が従う指示ランタイムが実行するスクリプト
次の実行を決めるのはClaude(ターンごと)Claude(指示に従う)スクリプト
中間結果の保管場所Claude のコンテキストClaude のコンテキストスクリプト変数
再現できるものワーカー定義指示オーケストレーション自体
スケール数タスク/ターン同左数十〜数百エージェント/run

Subagents や Skills では Claude がターンごとにオーケストレータを務め、すべての結果がコンテキストに載る。一方 Workflows ではスクリプトがループ・分岐・中間結果を抱え、Claude のコンテキストには最終回答だけが返る。これが大規模な並列処理を成立させる鍵になっている。

6 つの合成可能なパターン

Workflows を使うには、ただ「ワークフローを作って」と頼むか、トリガーワード ultracode を使えばよい。とはいえ、Claude がワークフローを組むときに使い、組み合わせる代表的なパターンを把握しておくと、いつ使うべきか、どうプロンプトで誘導するかの見通しが立つ。

パターン内容向くタスク
Classify-and-act分類エージェントがタスク種別を判定し振り分ける。末尾に置いて出力の判定にも使える種類が混在するキュー処理、モデルルーティング
Fan-out-and-synthesize細かいステップに分割して各エージェントが処理し、結果を統合する。synthesize は全 fan-out を待って構造化出力をマージするバリアステップ数が多い、各ステップにクリーンなコンテキストが要るとき
Adversarial verification各エージェントの出力を、別エージェントがルーブリックや基準に照らして敵対的に検証するself-preferential bias の抑制
Generate-and-filterアイデアを多数生成し、ルーブリックや検証でフィルタ、重複排除して高品質なものだけ返すネーミング、設計案の絞り込み
Tournament分割でなく競争。N 個のエージェントが別アプローチで同一タスクに挑み、judging エージェントが pairwise で勝者を決める定性評価、ソート(絶対採点より比較判断が信頼できる)
Loop until done作業量が未知のとき、停止条件(新しい発見がない、ログにエラーがない)を満たすまで spawn を繰り返す不定量の triage、デバッグ

プロンプト例

具体的にどんな依頼が可能か、記事で挙げられている例を引いておく。発想を広げる手がかりになる。

「50 回に 1 回失敗するテストがある。ワークフローを組んで再現し、仮説を立てて worktree で敵対的に検証して。どれか 1 つが通るまで止めないで」

「直近 50 セッションを掘り返し、自分が繰り返している修正を見つけて、頻出するものを CLAUDE.md のルールにして」

「業務プランを、投資家・顧客・競合それぞれの視点から別々のエージェントに引き裂かせて」

「80 件の履歴書をバックエンドのロール向けにランク付けして、上位 10 件を二重チェックして。ルーブリックは AskUserQuestion で私にヒアリングして」

「ブログ草稿の技術的な主張を、すべてコードベースと照合して。間違ったまま公開したくない」

ユースケース別の使いどころ

記事では「ワークフローは非技術的な作業でこそ、むしろ有用なことが多い」と強調されている。代表的なユースケースを整理する。

マイグレーションとリファクタ

callsite、失敗するテスト、モジュールなどを単位に分解し、各修正を worktree 内のサブエージェントが行い、別エージェントが敵対的にレビューしてマージする。リソースを大量消費するコマンドを使わせない指示を添えると、マシンのリソースを使い切らずに並列度を最大化できる。

ディープリサーチ

Claude Code には dynamic workflows で実装された /deep-research スキルが同梱されている。Web 検索を fan-out し、ソースを取得して主張を敵対的に検証し、引用付きレポートを統合する。Web 検索に限らず、Slack の文脈からステータスレポートを作る、コードベースを深く探索して機能の仕組みを調べる、といった用途にも応用できる。

ディープ検証

レポート内のすべての事実主張を 1 つのエージェントが洗い出し、各主張をサブエージェントが個別に詳細チェックする。さらにソースの質を確かめる検証エージェントを重ねることもできる。

ソート

1000 行を超えるリストを 1 プロンプトでソートさせると品質が劣化し、コンテキストにも収まらない。代わりに tournament、pairwise 比較のパイプライン、並列の bucket-rank からのマージを使う。各比較が独立したエージェントになり、決定論的なループがブラケットを保持するので、コンテキストには進行中の順序だけが残る。

メモリとルール遵守

CLAUDE.md に書いても守られないルールがあれば、「1 ルールにつき 1 検証エージェント」で確認するワークフローを作る。懐疑役(skeptic)のペルソナでルール自体を見直させると、誤検知を抑えられる。逆方向に、過去セッションやレビューコメントから繰り返している修正をマイニングし、並列エージェントでクラスタ化、各候補を敵対的に検証して、生き残ったものを CLAUDE.md に蒸留する使い方もできる。

根本原因の調査

デバッグは複数の独立した仮説を立てて検証するのが最も効くが、単一コンテキストだと self-preferential bias に陥る。ログ、ファイル、データのように分離した証拠から別々のエージェントに仮説を生成させ、検証役と反証役のパネルにかける。コードに限らず、売上分析(なぜ 3 月に売上が落ちたか)、データ基盤のパイプライン障害、あらゆるポストモーテムに使える。

大規模なトリアージ

サポートキューやバグ報告を、各項目を分類し、既存のトラッキングと重複排除し、アクション(修正の試行や人へのエスカレーション)を取る。有用なのが quarantine パターンで、信頼できない公開コンテンツを読むエージェントには高権限のアクションを禁じ、情報に基づいて動くのは別のエージェントに担わせる。/loop と組み合わせれば継続的に回せる。

探索とテイスト/評価/モデルルーティング

設計やネーミングのようにテイストが絡む探索では、レビューエージェントにルーブリックを与え、tournament で順位付けする。軽量な評価(eval)も、worktree で別エージェントを spawn し、比較エージェントがルーブリックで採点する形で回せる。さらに分類エージェントにタスクを調査させ、複雑さに応じて Sonnet か Opus かを振り分けるモデルルーティングも可能だ。

事例:Bun の Zig から Rust への書き換え

workflows による大規模ポート

Bun は dynamic workflows を使って Zig から Rust へ書き換えられた。タスクを callsite、失敗するテスト、モジュールといった操作対象の系列に分解するのが鍵になる。各修正のために worktree でサブエージェントを起こして直し、別エージェントが敵対的にレビューしてマージする。リソースを大量消費するコマンドを使わないよう指示することで、並列度を最大化しつつマシンのリソースを枯渇させずに済む。

使うときのコツと、使うべきでないとき

詳細なプロンプトほど良い結果が出る。上で挙げたパターン名を明示的に指示するのが効く。ワークフローは大きなタスク専用ではなく、「quick workflow を使って」と頼めば、ある前提に対する軽い敵対的レビューのような小さな用途にも使える。

/loop と /goal の併用: triage、research、verification のように繰り返せるワークフローは、定期実行する /loop と、ハードな完了要件を設定する /goal と組み合わせる。

トークン予算: 「use 10k tokens」のように予算を指定すると、タスクが使うトークンの上限を設定できる。

保存と共有: ワークフローメニューで s を押すと保存できる。~/.claude/workflows に置くか、スキルとして配布する。スキル経由で配布する場合は、ワークフローを「そのまま実行するスクリプト」ではなく「テンプレート」として扱うよう促すと、柔軟性が高まる。

使うべきでないとき

まとめ

Dynamic Workflows は、Claude が自分でハーネスを書いて複数のエージェントをオーケストレーションできるようにする仕組みだ。鍵は「プランをコードに移す」点にあり、ループ・分岐・中間結果をスクリプトが保持することで、単一コンテキストの失敗モード(agentic laziness、self-preferential bias、goal drift)を構造的に抑え込む。

Classify-and-act、Fan-out-and-synthesize、Adversarial verification、Generate-and-filter、Tournament、Loop until done という 6 つのパターンを組み合わせることで、コーディングから研究、検証、トリアージ、ポストモーテムまで幅広いタスクに適用できる。価値があるのは「量産」ではなく「再現可能な品質パターン」をコードとして codify できる点だ。

一方でトークン消費は大きく、ベストプラクティスもこれからの領域だ。まずはスコープを絞ったタスクから、創造的に試していくのがよいだろう。