Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

すべてのタスクにハーネスを:Claude Codeにおける動的ワークフロー

先週、Claude Codeに動的ワークフロー(dynamic workflows)をリリースしました。Claudeは、目の前のタスクに合わせてカスタム構築された独自のハーネス(harness:実行支援環境)を、その場で動的に記述できるようになりました。

デフォルトのClaude Codeのハーネスはコーディング向けに構築されていますが、多くのタスクがコーディングタスクに類似しているため、それ以外の多くの種類のタスクにも有用であることが分かっています。しかし、リサーチ(Research)、セキュリティ分析(security analysis)、エージェントチーム(agent teams)、コードレビュー(Code Review)など、最高のパフォーマンスを達成するためにClaude Codeの上部へカスタムのハーネスを構築しなければならなかった特定のタスククラスも存在します。

ワークフローを使用すると、Claude Code上に構築されたハーネスを動的に作成でき、Claudeがこれらすべての問題をよりネイティブに解決できるようになります。また、これらのワークフローを他のユーザーと共有したり、再利用したりすることも可能です。

この記事では、皆様がワークフローを最大限に活用できるよう、私の初期のワークフロー体験とそこから得た学びについて紹介します。なお、ベストプラクティスはまだ開発段階にあります。動的ワークフローは通常より多くのトークンを消費するため、複雑で価値の高いタスクに最も適しています。

プロンプトの例

技術的な詳細に入る前に、ワークフローによって実現できる可能性について考えていただくために、いくつかのプロンプトの例から始めたいと思います:

「このテストは、おそらく50回に1回程度失敗します。ワークフローを設定して、これを再現してください。競合するいくつかのレースコンディションの仮説を立て、証拠によって1つの説が生き残るまで調査を止めないでください。」

「ワークフローを使用して、私の過去50回のセッションを確認し、私が繰り返し行っている修正内容を抽出して、よくあるものを CLAUDE.md のルールに変換してください。」

「ワークフローを使用して、過去6ヶ月間のSlackの #incidents チャンネルを調査し、誰もチケットを作成していない、繰り返し発生している根本原因を見つけてください。」

「私のビジネスプランを読み込み、投資家、顧客、競合他社の視点から、それぞれ異なるエージェントがそれを徹底的に検証して批判するワークフローを実行してください。」

「ここに80通の履歴書が入ったフォルダーがあります。ワークフローを使用して、バックエンドの役割に対する順位を付け、上位10件をダブルチェックしてください。評価基準を決定するために、AskUserQuestionツールを使用して私にインタビューしてください。」

「このCLIツールの名前が必要です。ワークフローを使用して多くのオプションをブレインストーミングし、トーナメントを行って上位3つを選定してください。」

「ワークフローを使用して、あらゆる場所で私たちのUserモデルの名前をAccountに変更してください。」

「私のブログ記事の下書きに目を通し、ワークフローを使用して、すべての技術的な主張をコードベースと照らし合わせて検証してください。間違った内容を公開したくありません。」

動的ワークフローの仕組み

動的ワークフローは、サブエージェント(subagents)の生成と調整を支援する、いくつかの特別な関数を備えたJavaScriptファイルを実行します。

動的ワークフローには、データの処理を支援するために、JSON、Math、Arrayなどの標準的なJavaScript関数も含まれています。

動的ワークフローが、エージェントが使用するモデルや、サブエージェントを独自のワークツリー(worktree)で実行するかどうかを決定できることは、特に知っておくと役立ちます。これにより、Claudeは必要なインテリジェンスレベルと分離の度合いを選択できます。

ユーザーの操作やターミナルの終了などによってワークフローが中断された場合、セッションを再開することで、ワークフローは中断した場所から処理を引き継ぐことができます。

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

デフォルトのClaude Codeハーネスにタスクを依頼する場合、同じコンテキストウィンドウ内で計画と実行の両方を行う必要があります。多くのコーディングタスクにおいて、これは非常に効果的ですが、実行時間が長く、大規模に並列化され、高度に構造化され、あるいは対立的な(検証を必要とする)タスクでは破綻することがあります。

これは、単一のコンテキストウィンドウ内でClaudeが複雑なタスクに長く取り組むほど、いくつかの特定の失敗モードの影響を受けやすくなるためです:

  • エージェントの怠慢(Agentic laziness): 特に複雑で複数の部分からなるタスクを完了する前にClaudeが途中で処理を止め、一部(例えば、セキュリティレビューの50項目的うち35項目)しか進んでいないにもかかわらず、タスクが完了したと宣言してしまう現象。
  • 自己優先バイアス(Self-preferential bias): 特に成果物を評価基準に照らし合わせて検証または判断するように求められた際、Claudeが自身の出力や調査結果を優先(肯定)してしまう傾向。
  • ゴールの喪失(Goal drift): 多くのターンを経る、特に要約(コンパクション)が行われた後に、当初の目的への忠実さが徐々に失われていく現象。各要約ステップは情報が欠落する性質(ロスがある)ため、エッジケースの要件や「Xを行わない」といった制約などの詳細が失われる可能性があります。

ワークフローを作成することは、それぞれ独自のコンテキストウィンドウと明確に焦点を絞り、分離された目標を持つ、個別のClaudeサブエージェントを調整することで、これらの問題に対処するのに役立ちます。

動的ワークフローと静的ワークフローの比較

以前に、Claude Agent SDKや claude -p を使用して静的ワークフローを作成し、複数のClaude Codeインスタンスを連携させたことがあるかもしれません。

しかし、静的ワークフローはすべてのエッジケースに対応させる必要があるため、通常はより汎用的なものになってしまいます。Claude Opus 4.8 と動的ワークフローの登場により、Claudeはあなたのユースケースに合わせて特別にカスタマイズされたハーネスを記述できるほど十分に賢くなりました。

動的ワークフローを使用する際の有用なパターン

動的ワークフローの使用を開始するには、Claudeにワークフローを作成するように依頼するか、トリガーワードの「ultracode」を使用して、Claude Codeが確実にワークフローを作成するように指示します。

しかし、動的ワークフローがどのように機能するかというメンタルモデルを構築しておくことで、いつそれらを使用すべきか、またプロンプトを通じてどのようにClaudeを誘導できるかを理解するのに役立ちます。

ワークフローを構築する際、Claudeが使用し、組み合わせる可能性のあるいくつかの一般的なパターンがあります:

分類と実行(Classify-and-act)

分類エージェントを使用してタスクのタイプを決定し、そのタスクに基づいて異なるエージェントや動作にルーティングします。または、最後に分類器を使用して出力を決定します。

分散と統合(Fan-out-and-synthesize)

タスクを多くの小さなステップに分割し、各ステップでエージェントを実行し、それらの結果を統合します。これは、多数の小さなステップが存在する場合や、各ステップが干渉や相互汚染を避けるために独自のクリーンなコンテキストウィンドウの恩恵を受けられる場合に特に有用です。統合ステップは障壁(バリア)として機能し、すべての分散されたエージェントの完了を待ってから、それらの構造化された出力を1つの結果にマージします。

対立的検証(Adversarial verification)

生成された各エージェントに対して、別のエージェントを実行し、評価基準や基準に照らし合わせてその出力を対立的に検証します。

生成とフィルタリング(Generate-and-filter)

あるトピックについて多数のアイデアを生成し、それらを評価基準や検証によってフィルタリングし、重複を排除して、テスト済みの最高品質のアイデアのみを返します。

トーナメント(Tournament)

作業を分担するのではなく、エージェント同士を競わせます。異なるアプローチを用いて同じタスクをそれぞれ試みるN個のエージェントを生成します。その後、勝者が決定するまで、判定エージェントを使用してプロンプトやモデルがペアワイズ(1対1の対決)形式で結果を審査します。

完了するまでループ(Loop until done)

作業量が不明なタスクの場合、固定の回数だけ繰り返すのではなく、停止条件(新しい発見がない、またはログにエラーがないなど)が満たされるまでエージェントを生成するループを回します。

ユースケース

どのような場合にClaude Codeに動的ワークフローを作成させるべきか、クリエイティブに考えてみてください。ワークフローは技術的でない仕事においてさらに有益である場合があることが分かっています。

移行とリファクタリング

Bunは、ワークフローを使用してZigからRustへと書き直されました。その詳細については、JarredのXのスレッドで読むことができます。

重要なのは、タスクを、例えばコールサイト(呼び出し元)、失敗しているテスト、モジュールなど、操作が必要な一連のステップに分解することです。ワークツリー内で修正を行うためのサブエージェントを修正ごとに立ち上げ、別のエージェントに対立的なレビューを行わせた上でマージします。お使いのPCのリソースが枯渇することなく最大限に並列化できるよう、リソースを大量に消費するコマンドを使用しないようエージェントに指示することを検討してください。

ディープリサーチ

私たちは、動的ワークフローを使用するディープリサーチスキル(/deep-research)をClaude Code内に公開しました。具体的には、ウェブ検索を分散(fan-out)させ、ソースを取得し、その主張を対立的に検証した上で、引用付きのレポートを統合します。

しかし、このようなリサーチはウェブ検索以外にも応用できます。例えば、SlackのコンテキストからステータスレポートをまとめるようClaudeに依頼したり、コードベースを深く探索して機能の仕組みを調査したりすることが挙げられます。

ディープ検証

一方で、レポート内のすべての事実に基づく主張を検証し、ソースを確認したい場合は、1つのエージェントにすべての事実主張を特定させ、それぞれの主張を詳細にチェックするためのサブエージェントを生成するワークフローを作成するとよいでしょう。また、検証エージェントにソース調査サブエージェントをチェックさせ、そのソースが高品質であることを確認することもできます。

ソート(並べ替え)

Claude Codeが得意とする定性的な測定に基づいてソートしたいアイテムのリストがあるかもしれません(例:バグの深刻度順にソートされたサポートチケット)。しかし、1つのプロンプトで1,000行以上をソートしようとすると、品質が低下し、コンテキストに収まらなくなります。代わりに、トーナメントや、ペアワイズ比較エージェントのパイプラインを実行するか(絶対的なスコアリングよりも相対的な比較判断の方が信頼性が高いため)、あるいは並列でバケットランク(バケツソート)を行ってからマージします。各比較は個別のエージェントで行われるため、決定論的なループが対戦表を保持し、実行順序のみがコンテキストに残ります。

メモリとルールの遵守

CLAUDE.md に記述しているにもかかわらず、Claudeが見落としたり苦労したりする特定のルール群がある場合は、検証エージェントによってチェックされなければならないルールリストを含むワークフローを作成します(ルールごとに1つの検証エージェントを割り当てます)。ルールを見直してそれらが適切であるかを確認する「懐疑派」ペルソナのサブエージェントを作成することで、誤検知(偽陽性)が多すぎる事態を防ぐことができます。

逆方向も機能します。最近のセッションやコードレビューのコメントから、あなたが繰り返し行っている修正内容をマイニングし、並列エージェントでクラスタリングし、各候補を対立的に検証(このルールは実際のミスを防げただろうか?)した上で、生き残ったルールを CLAUDE.md に集約します。

根本原因の調査

デバッグは、複数の独立した仮説を立てて検証するときに最も効果を発揮しますが、1つのコンテキストウィンドウのみを使用している場合、Claudeは自己優先バイアスに陥る可能性があります。

ワークフローは、互いに関連のない証拠から仮説を生成するエージェントを立ち上げることで、構造的にこれを防止できます。例えば、ログ、ファイル、データをそれぞれ専門に扱う個別のエージェントを生成します。各仮説は、検証者と反論者からなる委員会による審査を受けることができます。

これはコードだけに限りません。ワークフローは、売上(なぜ3月に売上が落ちたのか?)、データエンジニアリング(なぜこのパイプラインが失敗したのか?)、あるいはあらゆるポストモータム(事後分析)に活用できます。

大規模なトラブルシューティング(トリアージ)

すべてのチームには、人間だけでは完全に処理しきれないサポートキュー、バグ報告、あるいはその他のバックログが存在します。

トリアージワークフローは、各項目を分類し、すでに追跡されているものと重複排除し、アクションを実行します。これは、修正を試みるか、人間のユーザーにエスカレーションすることを意味します。

トリアージワークフローの有用なパターンは「隔離(クアランティン)」です。これには、信頼できない公開コンテンツを読み取るエージェントが高権限のアクションを実行するのを禁止し、代わりに情報に基づいてアクションを起こす役割を持つエージェントがそれを実行するようにします。

これをClaudeに継続的に行わせるには、トリアージワークフローを /loop と組み合わせてください。

探索とテイスト(感性)

ソリューションへのさまざまなアプローチを探索する際、特にデザインや命名などのように感性(テイスト)に基づいており、評価基準の恩恵を受けられる場合にワークフローが役立ちます。

Claudeにいくつかの解決策を模索させ、レビューエージェントに優れた解決策とはどのようなものかという評価基準を与えることを試してみてください。レビューエージェントがその基準を満たしていると判断した時点でタスクは完了します。また、その評価基準に基づいたトーナメントを通じて、解決策を順位付けしたり選択したりすることもできます。

評価(Evals)

ワークツリー内で個別のエージェントを立ち上げ、さらに比較エージェントを立ち上げて、特定の出力を評価基準に照らし合わせて比較・採点することで、特定のタスクに対する軽量な評価を実行できます。例えば、作成したスキルを特定の基準に照らし合わせて評価し、改良することが挙げられます。

モデルとインテリジェンスのルーティング

タスクに合わせて調整された分類エージェントを作成し、どのモデルを使用するかを決定させます。これは、タスクに多くのツール呼び出しが含まれる場合や、実行前にリサーチを行うことでそのタスクに最適なモデルを特定できる場合に役立ちます。

例えば、「認証モジュールの仕組みを説明する」というタスクに最適なモデルは、認証モジュール内のファイル数やコードベースの形状によって異なります。分類エージェントがこのリサーチを行い、予想されるタスクの複雑さに基づいて、SonnetまたはOpusにルーティングすることができます。

どのような場合に動的ワークフローを使用すべきでないか

ワークフローは新しい機能です。極めて優れた成果を生み出すユースケースが多く存在する一方で、すべてのタスクに必要なわけではなく、結果として大幅に多くのトークンを消費してしまう可能性があります。

これまでに行ったことのない方法でClaude Codeを拡張するために、ワークフローをクリエイティブに使用するのが最善です。通常のコーディングタスクについては、「本当にこれ以上の計算量が必要か?」と自問してみてください。例えば、ほとんどの伝統的なコーディングタスクには、5人のレビュー担当者による委員会は必要ありません。

動的ワークフローを構築するためのヒント

プロンプティング

動的ワークフローにおいて、上記で説明した具体的な手法を用いて詳細なプロンプトを作成することが、最善の結果をもたらします。

ワークフローは大規模なタスクのためだけのものではありません。モデルに「クイックワークフロー(quick workflow)」を使用するようプロンプトで指示することができます。例えば、仮定に対する迅速な対立的レビューを作成できます。

/goal および /loop との組み合わせ

トリアージ、リサーチ、検証などの繰り返し実行できるワークフローを使用する場合は、定期的な間隔で実行するために /loop と組み合わせ、厳格な完了要件を設定するために /goal と組み合わせてください。

トークン消費の予算

動的ワークフローに対して明示的なトークン消費予算を設定し、タスクが使用するトークン数を制限することができます。「10kトークンを使用する」などのプロンプトを与えることで、上限を設定できます。

動的ワークフローの保存と共有

ワークフローメニューで「s」を押すことで、ワークフローを保存できます。これらを ~/.claude/workflows にチェックインするか、スキルを介して配布することができます。

これらをスキル経由で共有するには、JavaScriptワークフローファイルをスキルのフォルダに配置し、SKILL.md内でそれらを参照します。柔軟性を高めるために、スキル内のワークフローを、そのまま実行する必要があるスクリプトではなく、テンプレートとして捉えるようClaudeにプロンプトで指示するとよいでしょう。

発見のための新たな出発点

ワークフローは、Claude Codeを拡張するための有用な新しい方法です。Claudeを活用してタスクを達成するための新しい方法を探索するための出発点として、これらを捉えることをお勧めします。最適な使用方法については、まだ多くの発見の余地があります。皆さんが何を発見したか、ぜひ教えてください。

‍

この記事は、AnthropicでClaude Codeの開発に取り組む技術スタッフのThariq ShihiparとSid Bidasariaによって執筆されました。