· Agents

あらゆるタスクに対応するハーネス:Claude Codeにおけるダイナミックなワークフロー

A harness for every task: dynamic workflows in Claude Code

この記事は 原文 を DeepL で機械翻訳したものである。正確な内容は原文を参照のこと。

先週、Claude Code で動的ワークフローをリリースしました。これにより、Claudeは、その場その場のタスクに合わせてカスタマイズされた独自のテスト環境をその場で生成できるようになりました。

デフォルトのClaude Codeハネスはコーディング用に設計されていますが、実際には多くのタスクがコーディング作業に似ているため、他のさまざまな種類のタスクにも役立ちます。しかし、研究、セキュリティ分析、エージェントチーム、コードレビューなど、最高のパフォーマンスを引き出すためにClaude Codeの上にカスタムハネスを構築せざるを得なかった特定の種類のタスクも存在します。

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

この記事では、ワークフローを最大限に活用できるよう、私が実際に体験した初期のワークフロー運用やそこから得た知見について解説します。なお、ベストプラクティスは現在も発展途上であることに留意してください。動的なワークフローは多くの場合、より多くのトークンを使用するため、複雑で付加価値の高いタスクに最も適しています。

プロンプトの例

技術的な詳細に入る前に、ワークフローの可能性について考えていただくきっかけとして、いくつかのプロンプト例をご紹介したいと思います:

「このテストは、50回に1回程度の割合で失敗する。その現象を再現できるワークフローを構築せよ。競争する仮説を立て、そのうちの1つが証拠に耐えうるまで、決して諦めるな。」

「ワークフローを活用して、直近の50回のセッションを振り返り、繰り返し行っている修正点を見つけ出し、特に頻繁に現れるものを CLAUDE.md ルール」に変換する」

「ワークフローを活用して、Slackの過去6か月間の#インシデントを精査し、誰もチケットを発行していない繰り返し発生している根本原因を特定する。」

「私のビジネスプランを使って、投資家、顧客、競合他社のそれぞれの視点から、複数の担当者がそれを徹底的に分析するワークフローを実行してください。」

「ここに80通の履歴書が入ったフォルダがあります。ワークフローを使ってバックエンド職の候補者をランク付けし、上位10名については再確認してください。評価基準については、『AskUserQuestion』ツールを使って私に面接を行ってください。」

「このCLIツールの名前を決めたい。ワークフローを使って候補をたくさん出し合い、トーナメント形式で上位3つを選出してください。」

「ワークフローを使用して、Userモデルをすべての場所でAccountに名前を変更してください。」

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

ダイナミックワークフローの仕組み

動的なワークフローでは、サブエージェントの生成や連携を支援するいくつかの特別な関数が含まれたJavaScriptファイルが実行されます:

図A ワークフロースクリプトを構成する3つの基本要素:agent()は1つのサブエージェントを生成し、parallel()とpipeline()は複数のサブエージェントを組み合わせる。
図A ワークフロースクリプトを構成する3つの基本要素:agent()は1つのサブエージェントを生成し、parallel()とpipeline()は複数のサブエージェントを組み合わせる。

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

動的なワークフローによって、エージェントが使用するモデルや、サブエージェントを独自のワークツリーで実行するかどうかを決定できる点は特に有用であり、これによりClaudeは必要な知能レベルや隔離レベルを選択できるようになります。

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

ダイナミックなワークフローが選ばれる理由

デフォルトのClaude Codeハネスにタスクを実行させる場合、計画と実行の両方を同じコンテキストウィンドウ内で行う必要があります。多くのコーディングタスクでは、この方法は非常に効果的ですが、実行時間が長く、大規模な並列処理を伴う、高度に構造化された、あるいは敵対的なタスクでは、うまく機能しなくなる可能性があります。

これは、Claudeが単一のコンテキストウィンドウ内で複雑なタスクを処理する時間が長くなるほど、いくつかの特定の障害モードの影響を受けやすくなるためです:

  • 「エージェントの怠慢」とは、Claudeが特に複雑で複数の段階からなるタスクを完了する前に処理を中断し、部分的な進捗(例えば、セキュリティレビューの対象50項目のうち35項目を処理した段階)で作業が完了したと宣言することを指します。
  • 「自己選好バイアス」とは、Claudeが、特に評価基準に基づいて自身の結果や知見を検証・評価するよう求められた際に、それらを優先的に好む傾向を指す。
  • 「ゴールドリフト」とは、特に圧縮処理の後、多くのターンにわたって当初の目的からの忠実度が徐々に失われていく現象を指します。要約の各ステップでは情報が失われるため、エッジケースの要件や「Xを行わない」といった制約などの詳細が失われてしまう可能性があります。

ワークフローを作成することで、それぞれ独自のコンテキストウィンドウを持ち、明確かつ独立した目標を持つ個別のClaudeサブエージェントを連携させることにより、こうした問題に対処することができます。

動的ワークフローと静的ワークフロー

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

しかし、静的なワークフローはあらゆるエッジケースに対応する必要があるため、通常はより汎用的なものになります。Claude(Opus 4.8)と動的ワークフローの導入により、Claudeは、ユーザーのユースケースに合わせてカスタマイズされた独自のハーネスを作成できるほど、高度な知能を備えるようになりました。

図B 静的ハーネスは、どの質問に対しても同じ手順を実行しますが、動的ワークフローは、その直前のワークフローに合わせて構成されます。
図B 静的ハーネスは、どの質問に対しても同じ手順を実行しますが、動的ワークフローは、その直前のワークフローに合わせて構成されます。

動的ワークフローを使用する際の役立つパターン

Claudeにワークフローの作成を依頼するか、トリガーワード「ultracode」というトリガーワードを使用するだけで、Claude Codeがワークフローを作成するよう設定できます。

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

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

図C 「Claude」が構成する6つのワークフローパターン。
図C 「Claude」が構成する6つのワークフローパターン。

「分類して行動する」

分類エージェントを使用してタスクの種類を判断し、そのタスクに応じて異なるエージェントや動作にルーティングします。あるいは、最後に分類器を使用して出力を決定することもできます。

ファンアウト・アンド・シンセサイズ

タスクを多くの小さなステップに分割し、各ステップでエージェントを実行してから、それらの結果を統合します。これは、小さなステップが多数ある場合や、各ステップが独自のクリーンなコンテキストウィンドウを持つことで、相互干渉や相互汚染を防ぐことができる場合に特に有用です。 統合ステップはバリアであり、すべてのファンアウトエージェントの処理が完了するのを待ち、それらの構造化された出力を1つの結果に統合します。

敵対的検証

生成されたエージェントごとに、別のエージェントを生成し、その出力を評価基準や基準に照らして敵対的に検証する。

生成とフィルタリング

あるトピックについて多数のアイデアを生成し、評価基準や検証に基づいてそれらを絞り込み、重複を排除した上で、検証済みで最高品質のアイデアのみを抽出する。

トーナメント

作業を分割する代わりに、エージェント同士に競争させましょう。N個のエージェントを生成し、それぞれが異なるアプローチで同じタスクに挑戦させます。その後、プロンプトやモデルが、判定エージェントを用いて結果を2つずつ比較・評価し、勝者が決まるまでこのプロセスを繰り返します。

完了するまでループする

作業量が不明なタスクについては、固定回数の処理を行うのではなく、停止条件(新たな発見がない、またはログにエラーがもうない)が満たされるまで、エージェントの生成をループさせてください。

活用事例

Claude Codeにいつ、どのように依頼するかを創造的に考え、ダイナミックなワークフローを構築しましょう。私の経験では、ワークフローは技術的な作業以外でも、むしろさらに役立つことがあることがわかりました。

移行とリファクタリング

Bunは、ワークフローを活用してZigからRustへと書き直されました。その詳細については、Jarredのスレッドをご覧いただくか、100万行規模のコードベースでAIコードの移行をどのように実行しているかをご確認ください。

重要なのは、タスクを、例えばコールサイト、テストの失敗箇所、モジュールなど、処理が必要な一連のステップに分解することです。ワークツリー内の各修正項目ごとにサブエージェントを起動して修正を行い、別のエージェントに敵対的レビューを行わせ、それらをマージします。 マシン上のリソースが不足することなく最大限の並列化を実現できるよう、リソースを大量に消費するコマンドは使用しないようエージェントに指示することを検討してください。

綿密な調査

当社は、動的ワークフローを利用する内に、高度な調査スキル(/deep-research)を『Claude Code』誌内で発表しました。具体的には、この手法はウェブ検索をファンアウトし、情報源を取得し、その主張を敵対的検証を行い、引用されたレポートを合成します。

しかし、こうした調査は単なるウェブ検索だけにとどまりません。例えば、Claude に、Slack のコンテキストから状況報告をまとめさせたり、コードベースを詳細に調査して機能の仕組みを調べさせたりすることもできます。

徹底的な検証

図D 詳細な検証:事実の主張ごとに1つのチェッカーエージェントを配置し、必要に応じてその背後に情報源監査人を配置する。
図D 詳細な検証:事実の主張ごとに1つのチェッカーエージェントを配置し、必要に応じてその背後に情報源監査人を配置する。

一方、参照されている事実に関する主張をすべて確認し、その出典を特定したいレポートがある場合は、1人のエージェントがすべての事実に関する主張を特定し、その後、サブエージェントを起動してそれぞれを詳細に確認するようなワークフローを作成するとよいでしょう。 また、検証エージェントを設けて、ソース確認サブエージェントの作業内容を確認し、その出典が高品質であることを保証することも可能です。

並べ替え

図E A トーナメント型ソート:比較のたびに新しいエージェントが割り当てられるため、1つのコンテキストですべての1,000個の項目を保持する必要がない。
図E A トーナメント型ソート:比較のたびに新しいエージェントが割り当てられるため、1つのコンテキストですべての1,000個の項目を保持する必要がない。

Claude Codeが評価に適していると考える定性的指標に基づいて並べ替えたい項目のリストがあるかもしれません。例えば、バグの重大度順に並べ替えたサポートチケットなどです。しかし、1つのプロンプトで1000行以上のデータを並べ替えようとすると、品質が低下し、コンテキストに収まらなくなってしまいます。 その代わりに、トーナメント方式、ペアワイズ比較エージェントのパイプライン(絶対的な採点よりも比較判断の方が信頼性が高い)、あるいはバケットランクを並列で実行してからマージするようにしてください。各比較は独立したエージェントであるため、決定論的なループがトーナメント表を保持し、コンテキストに残るのは実行順序のみとなります。

記憶と規則の順守

FIG F ルールごとのレビュー:クリーンなコンテキストにおいて、ルールごとに1人の検証者が確認を行い、その後、懐疑論者がフラグをフィルタリングする。
FIG F ルールごとのレビュー:クリーンなコンテキストにおいて、ルールごとに1人の検証者が確認を行い、その後、懐疑論者がフラグをフィルタリングする。

もし、Claudeが、たとえ CLAUDE.mdsに設定してもが対応していない、あるいは処理が困難な特定のルールセットがある場合は、検証エージェントによってチェックされる必要があるルールのリストを含むワークフローを作成してください。ルールごとに1つの検証エージェントを割り当てます。ルールが整合していることを確認するために「懐疑的なペルソナ」サブエージェントを作成してルールをレビューさせることで、誤検知の過剰発生を防ぐことができます。

逆の方向も同様に有効です。最近のセッションやコードレビューのコメントを分析して、繰り返し犯している修正点を抽出し、並列エージェントを用いてそれらをクラスタリングし、各候補を敵対的検証(このルールがあれば実際のミスを防げたか?)にかけ、その後、生き残ったものを再び CLAUDE.md.

根本原因の調査

デバッグは、いくつかの独立した仮説を立て、それらを検証するのが最も効果的ですが、コンテキストウィンドウを1つしか使用していない場合、Claudeは自己選好バイアスに陥る可能性があります。

ワークフローでは、互いに独立した証拠から仮説を生成するためにエージェントを起動させることで、これを構造的に防ぐことができます。例えば、ログ、ファイル、データごとに個別のエージェントを用意します。そうすれば、各仮説は検証者と反証者からなる審査委員会による審査を受けることになります。

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

大規模なトリアージ

図G 隔離してから処理:リーダーエージェントは、特権を持たずに信頼できないコンテンツにアクセスし、アクターエージェントにはその要約のみが表示される。
図G 隔離してから処理:リーダーエージェントは、特権を持たずに信頼できないコンテンツにアクセスし、アクターエージェントにはその要約のみが表示される。

どのチームにも、サポートの待ち行列やバグ報告、あるいは人間だけでは完全に処理しきれない何らかの未処理案件が存在します。

トリアージワークフローでは、各項目を分類し、すでに追跡されている項目との重複チェックを行い、適切な措置を講じます。これには、修正を試みることもあれば、担当者にエスカレーションすることも含まれます。

トリアージワークフローにおいて有用な手法の一つが「隔離」です。これは、信頼できない公開コンテンツを読み取るエージェントが、高い権限を要する操作を実行できないように制限し、その代わりに、その情報に基づいて処理を行う担当のエージェントがそれらの操作を実行するようにするものです。

トリアージのワークフローを /loop と組み合わせることで、Claude にこれを継続的に実行させることができます。

探求と味わい

ワークフローは、解決策へのさまざまなアプローチを検討する際に役立ちます。特に、デザインやネーミングのように主観的な要素が関わる場合や、評価基準を設けることで有益となる場合には有効です。

Claudeにさまざまな解決策を検討するよう依頼し、審査担当者に「優れた解決策」の評価基準を提示してみてください。審査担当者が基準を満たしていると判断した時点で、タスクは完了となります。また、評価基準に基づいて、解決策を順位付けしたり、トーナメント形式で選定したりすることも可能です。

評価

ワークツリー内で個別のエージェントを起動し、さらに比較用エージェントを起動して、特定の出力を評価基準と照らし合わせて比較・採点することで、特定のタスクに対して軽量な評価を実行できます。例えば、作成したスキルを特定の基準に基づいて評価し、それに基づいて改善を行うといったことが可能です。

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

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

例えば、「authモジュールがどのように機能するかを説明する」というタスクに最適なモデルは、authモジュールに含まれるファイルの数やコードベースの構成によって異なります。分類エージェントがこの調査を行い、タスクの予想される複雑度に基づいて、Sonnet または Opus へルーティングすることができます。

ダイナミックワークフローを使用すべきでない場合

ワークフローは新しい機能です。大きな成果をもたらすユースケースは数多くありますが、すべてのタスクで必要というわけではなく、結果としてトークンを大幅に多く消費してしまう可能性があります。

ワークフローを創造的に活用し、Claude Codeをこれまでとは異なる方法で活用するのが最善です。日常的なコーディング作業については、次のように自問してみてください。「本当にこれ以上の計算リソースが必要なのか?」例えば、従来のコーディング作業のほとんどは、5人のレビューアによる審査を必要としません。

この判断は、一つ上のレベルであるアーキテクチャ層においても同様に当てはまります。つまり、マルチエージェントとシングルエージェントのどちらを採用するかという決定も、同様の論理に基づいています。すなわち、並列処理と専門化には、それに見合うだけの調整コストが必要なのです。

ダイナミックなワークフローを構築するためのヒント

プロンプト

ダイナミックなワークフローに対して、前述した具体的な手法を用いた詳細なプロンプトを設定することで、最良の結果が得られます。

ワークフローは、大規模なタスクだけに限ったものではありません。モデルに「クイックワークフロー」を実行させることもできます。例えば、ある仮定について、手っ取り早く敵対的レビューを行うことも可能です。

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

トリアージ、調査、検証など、繰り返し実行可能なワークフローを使用する場合は、それらを /loop を組み合わせて定期的に実行し、/goal を使用して厳格な完了要件を設定してください。

トークンの使用予算

動的ワークフローでは、タスクが使用するトークンの数を制限するために、トークンの使用上限を明示的に設定できます。例えば、「10kトークンを使用」といった上限を指定することで、上限値を設定できます。

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

ワークフローメニューで「s」キーを押すと、ワークフローを保存できます。これらを ~/.claude/workflows 、またはスキルを通じて配布することができます。

図 H ダイナミックワークフローパネル — 「s」キーを押すと、実行内容を再利用可能なワークフローとして保存できます。
図 H ダイナミックワークフローパネル — 「s」キーを押すと、実行内容を再利用可能なワークフローとして保存できます。

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

発見への新たな出発点

ワークフローは、Claude Codeの機能を拡張するための便利な新しい方法です。これを、Claudeを活用してタスクを達成するための新しい方法を模索する出発点として捉えてみてください。ワークフローを最大限に活用する方法については、まだまだ発見すべきことがたくさんあります。何か見つけたことがあれば、ぜひ教えてください。

そもそもハーネスに何を含めるべきかという原則については、Claude を使用した構築のための 3 つのハーネス設計パターンを参照してください。

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