Claude Code のサブエージェントに、こう指示したことはないだろうか。「判断に迷ったら、勝手に進めず一度聞いて」。
そして返ってくる報告は、いつも「聞かれた記憶がない」ものだった、ということはないだろうか。
実はこれ、AIがサボっていたわけじゃなかった。そのサブエージェントには、そもそも「聞く」という選択肢が最初から存在しない。
Claude Code の実測環境は 2.1.215(claude --version で確認)。サブエージェント周りの仕様は更新が速いので、手元のバージョンでは挙動が変わっている可能性がある。
公式ドキュメントに、はっきり書いてあった
Claude Code の公式ドキュメント「Create custom subagents」に、こういう一節がある。
The first filter removes these tools, even when listed in the
toolsfield:
Agent, when the subagent is at the depth limit; in a fork the tool stays listed but returns an error instead of spawningAskUserQuestionEndConversation, which can end only the main conversationEnterPlanModeExitPlanMode, unless the subagent'spermissionModeisplanScheduleWakeupTaskOutputWaitForMcpServersWorkflow
(訳: 第1のフィルタは、tools フィールドに書いてあっても、これらのツールを除去する。Agent(子をさらに持てるかどうか)はネストの深さが上限に達した時だけ、ExitPlanMode は permissionMode が plan でない限り、という条件付き。一方 AskUserQuestion(ユーザーへの質問)・EnterPlanMode ほかは無条件で除去される)
出典: Claude Code 公式ドキュメント「Create custom subagents」
ここで大事なのは、全部が同じ扱いではないということだ。Agent はネストの深さ上限に達した時だけ外れる条件付きの項目で、既定の設定なら5層までネストできる(=サブエージェントが子を持てなくなるわけではない)。ExitPlanMode も「permissionMode が plan の場合を除く」という条件付き。それに対して AskUserQuestion には条件が無い。どんな設定でも、無条件で全サブエージェントから消える。
tools に明示的に書いても消される。 system prompt に「迷ったら聞いて」と書き足しても、聞くための道具自体が起動した瞬間に取り上げられている。
つまりサブエージェントに選べる行動は、実質2つしかない。自分で決めるか、決めずに報告して終わるか。 「迷ったら聞け」は、聞く手段を持たない相手にとっては「自分で決めろ」と同じ意味になる。
指示文にどれだけ「聞いて」と書いても、この図の左上(AskUserQuestionを使う分岐)自体が最初から無い。残っているのは右側の2つだけだ。
聞けないだけじゃなかった。併せて分かった仕様
ここまで来たので、「任せ方」に直結する他の仕様も公式ドキュメントで確認し直した。
| 事実 | 公式原文 |
|---|---|
| サブエージェントは既定で背景実行 | 「As of v2.1.198, subagents run in the background by default.」 |
| 結果が要るなら前景で走る | 「Claude runs a subagent in the foreground when it needs the result before continuing.」 |
| 背景の結果は後のターンにしか届かない | 「A background subagent's results reach Claude as a completion notification in a later turn.」 |
| 背景時は内蔵ツールが減る | 「a background subagent keeps every MCP tool but only these built-in tools: Read, Grep, Glob, Bash, PowerShell, Edit, Write, …」 |
CLAUDE.md は全階層が継承される(~/.claude/CLAUDE.md も含む) |
「every level of the CLAUDE.md hierarchy the main conversation loads, including ~/.claude/CLAUDE.md」 |
ただし Explore と Plan だけは CLAUDE.md を読まない |
「Explore and Plan are the only subagents that omit CLAUDE.md and git status. There is no frontmatter field or per-agent setting to change which agents skip them.」 |
出典(全行共通): Claude Code 公式ドキュメント「Create custom subagents」
かみ砕くと、こういうことだ。頼んだ仕事は既定で裏で動き出し、結果はすぐには返ってこない(前景で走らせたい時はその意図を明示する必要がある)。裏で動いている間は使えるツールも絞られる。ルールを CLAUDE.md に書いておけば大抵は届くが、Explore と Plan にはそもそも届かない。
「頼んだのに反応がない」「さっき決めたはずのルールが効いていない」——サブエージェントに作業を任せていてこの感覚に覚えがあるなら、原因はAIの気まぐれではなく、この仕様そのものかもしれない。
じゃあ、AIエージェントは使えないのか
ここで「AIエージェントは信用できない」という話に落とすつもりはない。仕様を知っていれば、任せ方は設計できる。 聞けない相手に判断を丸投げするから事故になるだけで、最初から「判断はこちらで持つ」前提にしておけば、この制約はむしろ扱いやすい。
具体的な線引きはシンプルだ。
- 判断が要る仕事は任せない。 「どちらの方針でも成立する」「これは元の設計と食い違う」——そういう分岐が出る仕事を渡すと、聞く手段のない相手からは独自解釈が返ってくるだけ
- 読んで要約を返す仕事だけ任せる。 大量のログを読ませて要点だけ返させる、コードを検索させて該当箇所を報告させる——判断を伴わない仕事なら、背景実行でも問題にならない
- 結果がすぐ要る作業は、前景で走らせたい意図を明示する。 何も言わずに任せると背景実行に落ち、結果は「あとのターン」まで来ない
-
CLAUDE.md 頼みで縛り切ろうとしない。 全階層読み込まれるとはいえ
Explore/Planは例外。守らせたいルールは、その場のタスク文にも直接書く
実際にどう役割分担へ落とし込んだかは、個人ブログ(総合配信プラットフォームと銀行を、並行で作る — AIエージェントの「編成」に実機能を実装させ、実測で分業をチューニングした記録・外部サイトに移動します)にまとめている。
「迷ったら聞いて」の代わりに書いていること
今は指示文から「迷ったら聞いて」を消した。代わりに書いているのは「迷ったら、判断せず実行を止めて報告して終わってください」。聞く力ではなく、止まる力を渡す。 それだけで、独断で進めて後から辻褄合わせをされる場面はだいぶ減った。
やってみて分かったこと
正直に書くと、最初は指示文の書き方が悪いんだと思っていた。「迷ったら聞いて」を「必ず一度確認してから進めて」に変えてみたり、太字にしてみたり、system prompt の目立つ位置に移動させてみたり——何度も文面だけをいじっていた。 公式ドキュメントの「無条件で剥奪されるツール」の一覧に行き着くまで、これは自分のプロンプトの精度の問題だと思い込んでいた。どう文面を工夫しても直らないはずだと分かったのは、そのツール自体が渡されていないと知ってからだった。
「動かない原因は自分の書き方が下手なせいだ」と思い込む前に、まず「そもそもその手段は存在するのか」を疑ってみるといいと思う。
参考にした公式ページ
- Claude Code 公式ドキュメント「Create custom subagents」(サブエージェントから除去されるツールの一覧・背景実行の仕様・CLAUDE.mdの継承範囲):https://code.claude.com/docs/en/sub-agents
個人ブログ(https://mint041223techblog.netlify.app/)に日々の開発で気づいたことを詳しく書いています(外部サイトに移動します)。