15
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Code の fork、既定ONのはずが使えなかった — 環境変数1つで決まっていた

15
Last updated at Posted at 2026-08-18

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.jsonenv、止めたいなら permissions.denyAgent(fork)
  • fork は本当に会話を継承する。 親だけが知る値を、ツールなしで答えた
  • 通常のサブエージェントは会話を見られない。 ただし環境情報とメモリ索引は見えている
  • 通常のサブエージェントは、何も答えなくても3万トークンかかる

「既定でONになった」という記述だけ読んで使おうとすると、エラーの意味が分からずに止まります。
Agent type 'fork' not found が出たら、まず環境変数を疑ってください。


参考

※ 引用は原文と日本語訳を併記しています。訳は読みやすさを優先しているので、正確な表現は原典をご確認ください。

関連記事

15
15
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?