一行要約

dynamic workflow の本質は「計画を Claude の context ではなくコードに移すこと」で、そのおかげで中間結果はスクリプト変数に留まり、Claude の context には最終回答だけが残る。代償はトークンで、1 run あたり最大 1,000 エージェントまで走りうる。

要点

何が他と違うのか — 「誰が計画を保持するか」

SubagentsSkillsAgent teamsWorkflows
正体Claude が起こすワーカーClaude が従う指示peer セッションを監督するリードエージェントランタイムが実行するスクリプト
次に何を走らせるか決めるのはClaude、ターンごとClaude、プロンプトに従ってリードエージェント、ターンごとスクリプト
中間結果の置き場Claude の context windowClaude の context window共有タスクリストスクリプト変数
再利用できるものワーカー定義指示チーム定義オーケストレーション自体
規模1ターンに数個同上少数の長時間 peer1 run に数十〜数百
中断されたらターンをやり直すターンをやり直すteammate は走り続ける同一セッション内で再開可能

A workflow script holds the loop, the branching, and the intermediate results itself, so Claude’s context holds only the final answer. workflow のスクリプト自体がループ・分岐・中間結果を保持するので、Claude の context には最終的な答えだけが残る

計画をコードに移すことのもう1つの効用は、繰り返し可能な品質パターンを適用できること。独立したエージェントに互いの発見を敵対的にレビューさせてから報告させる、複数の角度から計画を起草して互いに比較させる、といったことができる。

起動の3経路

経路やり方
プロンプトで頼むultracode キーワードを含める、または「use a workflow」と自然文で書く
Claude に任せる/effort ultracode を設定すると、セッション中のすべての実質的なタスクで Claude が workflow を計画する
既存のコマンドを走らせるbundled の /deep-research、または自分が保存したもの

キーワードが効くのは「自分がタイプしたプロンプト」だけ(対話プロンプト、IDE 拡張のパネル、Remote Control、origin{ kind: "human" } と刻む Agent SDK アプリ)。次の経路では workflow を起動しない。

  • -p で渡したプロンプト
  • human と刻まずに Agent SDK が送ったプロンプト
  • scheduled task のプロンプト
  • webhook のペイロードや pull request のコメントが会話に中継された場合

ultracodexhigh の reasoning effort と自動 workflow オーケストレーションを組み合わせた設定。1つのリクエストが連続した複数の workflow(理解する用、変更する用、検証する用)になりうる。セッション限りで、新セッションではリセットされる。

承認と権限(重要な落とし穴)

permission modeプロンプトが出るタイミング
Default / accept edits毎回(「この workflow は今後聞かない」を選んだ場合を除く)
Auto初回のみ。Yes を選ぶと user settings に記録される。ultracode がオンならスキップされる
Bypass permissions / claude -p / Agent SDK一度も出ない。即座に走る

Your permission mode controls only the launch prompt above. The subagents the workflow spawns always run in acceptEdits mode and inherit your tool allowlist, regardless of your session’s mode. File edits are auto-approved. あなたの permission モードが制御するのは、上記の起動プロンプトだけである。workflow が立てる subagent は、セッションのモードによらず常に acceptEdits モードで動き、あなたのツール許可リストを引き継ぐ。ファイルの編集は自動承認される。

allowlist にないシェルコマンド・web fetch・MCP ツールは実行中に確認を求めてくることがある。長い run では事前に allowlist へ追加しておく

スクリプトの形

保存されたスクリプトは meta ブロックとスクリプト本体からなる。本体は top-level await を使えるプレーンな JavaScript

  • agent() — subagent を1つ起こす
  • pipeline() — リストの各要素に対して1つずつ走らせる

agent() は、途中で止めた場合や回復不能な API エラーの場合に null を返すpipeline() はその null を結果配列に残すので、.filter(Boolean) で落とすのが定型。

ランタイムの制約

制約理由
実行中のユーザー入力を受け付けない中断できるのはエージェントの権限プロンプトのみ。段階ごとの承認が要るなら各段階を別の workflow にする
スクリプト自身にファイルシステム・シェルへの直接アクセスがない読み書きとコマンド実行はエージェントの仕事。スクリプトは統率するだけ
モジュールをロードできないimport() を含むスクリプトは開始前に失敗する)本体はプレーン JavaScript。ライブラリが要る作業はエージェントのタスクに入れる
同時実行は最大 16 エージェント(CPU コアが少ないマシンではより少ない)ローカル資源の消費を抑える
1 run あたり合計 1,000 エージェント暴走ループの防止

実行のされ方と再開

  • ランタイムは会話とは別の隔離環境でスクリプトを実行する
  • 各 run はスクリプトを ~/.claude/projects/ 配下のセッションディレクトリに書き出す。Claude は開始時にそのパスを受け取るので、読ませたり、前回の run と diff したり、編集して再実行させたりできる

再開のルール(2つ) — ここは直感に反する。

  1. 停止時にまだ走っていたエージェントは保存されない。再開時に最初からやり直す
  2. リプレイはエージェントの開始順に従う。 キャッシュされた結果は「最初に完了しなかったエージェント」で止まり、それより後に開始したエージェントは、完了していても全部やり直しになる

Say a script starts four agents, A, B, C, and D, in that order, and you stop the run while B is still going. On resume, A returns from cache. B runs again because it never finished. C and D run again too, because they started after B, even though both completed before you stopped. あるスクリプトが A、B、C、D の4つのエージェントをこの順で起動し、B がまだ動いている最中に実行を止めたとする。再開時、A はキャッシュから返る。B は完了していなかったので再実行される。C と D も再実行される。停止前に両方とも完了していたにもかかわらず、B より後に開始されたからである。

A workflow that fans work out across many small agents therefore preserves more progress than one long agent. したがって、作業を多数の小さなエージェントに分散させる workflow のほうが、1つの長いエージェントより進捗を多く保てる。

再開は同一セッション内でのみ機能する。 workflow の実行中に Claude Code を終了すると、次のセッションでは最初から始まる。

コスト管理

  • 大きなタスクに踏み込む前に、小さなスライスで試す(リポジトリ全体ではなく1ディレクトリ、広い問いではなく狭い問い)
  • Large workflow 警告: 25 エージェントを超えて予定される、または予測トークン合計が 150万を超えると、タスクパネルの進捗行に警告が出る。これは助言であって、run を止めたり制限したりはしない。size guideline を自分で選んでいればその値が 25 の閾値を置き換える。ultracode がオンのセッションでは警告は出ない
  • workflow 内の全エージェントは、スクリプトが別を指定しない限りセッションのモデルを使う。CLAUDE_CODE_SUBAGENT_MODEL はその両方を上書きする

size guideline(Claude への助言であって上限ではない):

Claude が目指すエージェント数
unrestricted指定なし。タスクに応じて Claude が決める
small5 未満
medium15 未満(既定)
large50 未満

保存と配布

/workflows で run を選んで s で保存。Tab で保存先を切り替える。

保存先共有範囲
.claude/workflows/(プロジェクト)リポジトリを clone した全員
~/.claude/workflows/(ホーム)全プロジェクトで使えるが自分だけ
  • 同名ならプロジェクト側が走る
  • monorepo では、作業ディレクトリからリポジトリルートまでの間で既に存在する最も近い .claude/workflows/ に書かれる。読み込みもその経路上すべてから行われ、同名なら作業ディレクトリに最も近いものが走る
  • symlink 越しの書き込みは拒否される(プロジェクト側は .claude / .claude/workflows / 対象ファイルのいずれかが symlink なら拒否、個人側は対象ファイル自体が symlink のときだけ拒否)
  • plugin で配布する場合は plugin ルートの workflows/ に置く。plugin 名で namespace される/acme-tools:release-audit

引数を渡す: 保存した workflow は args パラメータで入力を受け取る。スクリプトは args というグローバルとして読む。Claude が構造化データとして渡すので、パースなしに配列・オブジェクトのメソッドを呼べる。省略時は undefined

bundled workflow

/deep-research <question> — 問いを複数の角度から web 検索でファンアウトし、見つけた情報源を取得して相互検証し、各主張に投票して、相互検証を通らなかった主張を除いた出典付きレポートを返す。WebSearch ツールが必要。自分で呼んだときだけ走る

v2.1.196 以降、検証エージェントがレート制限や API エラーで主張を確認できなかった場合、「反証された」ではなく「未検証」として列挙される

進捗の見方(/workflows のキー操作)

キー動作
/ フェーズまたはエージェントを選択
Enter / 掘り下げる(フェーズ → エージェント → プロンプト・直近のツール呼び出し・結果)
Esc / 1階層戻る
j / kエージェント詳細内のスクロール
f状態でフィルタ(押すたびに巡回)
p一時停止 / 再開
x選択中のエージェントを停止(run にフォーカスがあれば全体を停止)
r選択中の実行エージェントを再起動
srun のスクリプトをコマンドとして保存

無効化

範囲方法
自分/config で Dynamic workflows をオフ / ~/.claude/settings.json"disableWorkflows": true / CLAUDE_CODE_DISABLE_WORKFLOWS=1
組織全体managed settings に "disableWorkflows": true、または Claude Code admin settings のトグル

無効化すると bundled workflow コマンドが使えなくなり、ultracode キーワードも発火せず、/effort メニューから ultracode が消える。

そのまま使える具体例

保存されたスクリプトの形:

export const meta = {
  name: 'audit-routes',
  description: 'Audit every route handler for missing auth checks',
}
 
const found = await agent('List every .ts file under src/routes/.', {
  schema: { type: 'object', required: ['files'], properties: { files: { type: 'array', items: { type: 'string' } } } },
})
 
const audits = await pipeline(found.files, file =>
  agent(`Audit ${file} for missing authentication checks.`, { label: file }),
)
 
return audits.filter(Boolean)

タスクの形ごとのプロンプト例(スクリプトは自分で書かない):

use a workflow to audit every route handler under src/routes/ for missing authentication checks, and adversarially verify each finding before reporting it
use a workflow to run npx tsc --noEmit and keep fixing the reported errors until the type check passes or two rounds in a row make no progress
use a workflow to migrate every component under src/components/ from styled-components to Tailwind, working on each file in its own isolated copy
use a workflow to review every file changed in this PR for correctness issues, then merge the per-file findings into one ranked summary
use a workflow to find flaky tests in this repo: run the suite repeatedly, record which tests fail intermittently, and stop once two rounds in a row find nothing new

キーワードで単発起動する:

ultracode: audit every API endpoint under src/routes/ for missing auth checks

セッション全体を workflow 前提にする:

/effort ultracode
claude --effort ultracode

サイズの指針を変える:

/config workflowSizeGuideline=small

保存した workflow に引数を渡す:

Run /triage-issues on issues 1024, 1025, and 1030

原典で言及されている関連文書

未取得の派生リンク