Claude Code 2.1.232 で、サブエージェントの fork が既定で有効になりました。
fork は、親の会話をまるごと引き継ぐサブエージェントです。前提を説明し直さずに作業を投げられます。
使ってみようとしたら、こうなりました。
Agent type 'fork' not found.
バージョンは 2.1.234。 条件は満たしています。原因を調べたら、環境変数1つでした。
まず結果
| 条件 | fork |
|---|---|
| 現在のセッション(VSCode拡張・2.1.234・変数未設定) | 使えない |
CLAUDE_CODE_FORK_SUBAGENT=1 |
使える |
CLAUDE_CODE_FORK_SUBAGENT=0 |
使えない |
未設定は 0 と同じ挙動でした。「既定でON」が効いていません。
そして ON にしたときの中身がこれです。
| 質問「秘密の数字と合言葉は?」 | 回答 |
|---|---|
| fork | 4271/紫陽花(正解) |
| 通常のサブエージェント | 不明 |
「既定でON」には条件がある
公式ドキュメントを読み直しました。
When fork mode is on in interactive sessions (default v2.1.232+)
(対話セッションで fork モードが有効なとき(v2.1.232以降は既定))
「interactive sessions」と書いてあります。 そしてすぐ下にこれがありました。
# Turn on fork mode (non-interactive mode)
export CLAUDE_CODE_FORK_SUBAGENT=1
非対話モードでは、明示的にONにする必要があります。 つまり既定ONは対話セッション限定でした。
自分の環境変数を見ると、こうなっていました。
CLAUDE_CODE_ENTRYPOINT = claude-vscode
CLAUDE_CODE_CHILD_SESSION = 1
CLAUDE_CODE_FORK_SUBAGENT = (未設定)
CHILD_SESSION=1 です。VSCode 拡張から起動した子セッション扱いでした。
ただし、どういう条件で「対話」と判定されるかは公開されていません。 断定はできないので、
「バージョンを満たしていても使えない環境がある」という事実だけ押さえておきます。
環境変数で本当に切り替わる
対照実験をしました。同じバイナリに、同じプロンプトを投げています。
CLAUDE_CODE_FORK_SUBAGENT=1 claude -p 'Agent tool を subagent_type:"fork" で呼んで ok と返させて'
# → ok
CLAUDE_CODE_FORK_SUBAGENT=0 claude -p '(同じプロンプト)'
# → Agent type 'fork' not found. Available ag...
変数だけで切り替わりました。 未設定は 0 と同じ結果です。
常用するなら settings.json に入れておけます。
{
"env": { "CLAUDE_CODE_FORK_SUBAGENT": "1" }
}
逆に、fork だけ止めたい場合はこちらです。fork モードは残したまま、起動だけ拒否できます。
{
"permissions": { "deny": ["Agent(fork)"] }
}
ONにすると、本当に会話を継承する
ここが本題です。「引き継ぐ」が本当かを測りました。
1つのセッションの中で、まず秘密の数字と合言葉を持たせます。そのうえで、
fork と通常のサブエージェントに、まったく同じ質問を投げました。
1. 秘密の数字は 4271、合言葉は「紫陽花」です。記憶してください。
2. fork を呼び、「秘密の数字と合言葉を答えてください。
ツールは使わず、わからなければ不明と答えて」と質問。
3. general-purpose にも、まったく同じプロンプトを渡す。
結果です。
fork=4271/紫陽花 / plain=不明
fork は答えました。通常のサブエージェントは答えられませんでした。
「ツールを使うな」と指示しているので、ファイルを読んで調べたのではありません。 会話を継いでいます。
通常のサブエージェントは何を見ているのか
ついでに、こちらも測りました。別のセッションで、この会話でしか起きていないことを3つ質問しています。
| 質問 | 回答 |
|---|---|
| 記事のタイトルを差し替えた理由と、変更前後 | 不明 |
| 直近5本の平均LGTM数 | 不明 |
| あるスクリプトに見つかったバグ | 不明 |
全部「不明」でした。返ってきた説明がこれです。
この会話には、あなたからの今回のメッセージ以前のやり取りがありません。
私が参照できるのは、システムから渡された環境情報とメモリ索引だけです。
会話履歴はゼロ。 ただし環境情報とメモリの索引は見えています。 完全な白紙ではありません。
このときの消費が 34,836トークン、ツール使用0回、4.5秒でした。何も答えていないのに3万トークン使います。
これは渡される定義(システムプロンプトやツール一覧)の分です。
どちらを使うか
公式の説明が、そのまま判断基準になります。
Use a fork when any other subagent would need too much background to be useful
(他のサブエージェントでは前提が多すぎて役に立たないとき、fork を使う)
| 状況 | どちらか |
|---|---|
| 今の作業の続きを投げたい | fork。 説明を書き直さなくて済む |
| 出力が長く、本流に混ぜたくない | 通常のサブエージェント。 要約だけ返させる |
| ツールを制限したい | 通常のサブエージェント |
fork には制約もあります。fork はさらに fork を作れません。 また、
fork モードが有効な対話セッションでは、すべてのサブエージェントが既定でバックグラウンド実行になります。
コスト面では fork が有利です。親とプロンプトキャッシュを共有するためで、
公式も「同じ文脈が要るタスクなら、新規サブエージェントより安い」としています。
まとめ
- 2.1.232 の「fork が既定でON」は、対話セッション限定。 非対話では明示的にONが要る
- 手元の 2.1.234(VSCode拡張・子セッション)では
Agent type 'fork' not foundだった -
CLAUDE_CODE_FORK_SUBAGENT=1で使えるようになる。 未設定は 0 と同じ - 常用するなら
settings.jsonのenv、止めたいならpermissions.denyにAgent(fork) - fork は本当に会話を継承する。 親だけが知る値を、ツールなしで答えた
- 通常のサブエージェントは会話を見られない。 ただし環境情報とメモリ索引は見えている
- 通常のサブエージェントは、何も答えなくても3万トークンかかる
「既定でONになった」という記述だけ読んで使おうとすると、エラーの意味が分からずに止まります。
Agent type 'fork' not found が出たら、まず環境変数を疑ってください。
参考
- Subagents — Claude Code Docs
- Claude Code changelog — 2.1.232 の項
- 検証環境: Windows 10 / Claude Code 2.1.234(VSCode拡張)
※ 引用は原文と日本語訳を併記しています。訳は読みやすさを優先しているので、正確な表現は原典をご確認ください。
関連記事
- Claude Codeの新機能、"仕事の引き継ぎ"じゃありません — 同じく、紹介と実際の仕様がズレていた話
- CLAUDE.md を厚くしても意味がなかった話 — サブエージェントに渡す前提をどう減らすかの話