Claude Codeの会話から起動したサブエージェントに渡るもの・渡らないもの:CLAUDE.mdは渡る、会話は渡らない
私の経験に基づく記録ですので、これを推奨するものでも、動作を保証するものでもありません。あくまでも参考情報としてご覧ください。
スキルの model: を調べていたときに、Claude Code が裏で起動するサブエージェントにも CLAUDE.md が丸ごと渡っているらしいと気づきました(前回の記事はコチラ)。
計測してみると、サブエージェントを1つ起動して3行の答えをもらうだけで、約10万トークンかかっていました。
何が渡っていて、どこで減らせるのかを調べてみました。
サブエージェントとは
Claude Code が作業の一部を別の Claude に任せるときに使う、同じセッションの中の子です(Agent ツール)。
別のセッションを開始するのとは別物で、子のやり取りは画面に流れず、結果だけが親に戻ってきます。
メリットは、検索結果やログのような長い中身が子の方で完結するので、親の会話が肥大化しないことと、作業を同時並行で走らせられることです。
自分で定義すれば、子ごとに渡す CLAUDE.md・使えるツール・モデルを選べるのもメリットです。
「サブエージェントで調べて」と自分で頼むこともできますし、頼まなくても Claude Code が自分の判断で起動することもあります(今回は自分で頼みました)。
自分で定義ファイル(.claude/agents/)を作ったサブエージェントではなく、Claude Code に最初から入っている汎用のサブエージェントを会話から起動した場合の話です。
試したこと
ai-blog のフォルダで新規セッションを開いて、②の答え合わせ用に「今日の日付と、このフォルダ名を言って」と1つ頼んだのちに、下記のように頼みました。
その後、CLAUDE.md を別の場所に退避して、ない状態で同じことを頼みました。
Haiku のサブエージェントを1つ起こして、次の3つを答えさせて。
①ブログ名・ペンネーム
②私がこのセッションでさっき何を頼んだか
③自分のモデル ID
① ブログ名は「コードメモ帳」、ペンネームは「めもちょ」。
② 知らない。親セッションの会話は与えられていない。
③ claude-haiku-5-5。
CLAUDE.md を外した方では、こうでした。
① ブログ名はメモリに「コードメモ帳」とあるだけで確定できない。ペンネームは知らない。
② それより前の依頼は、今の情報には見当たらない。
③ claude-haiku-5-5。
結果
| CLAUDE.md あり | CLAUDE.md を外した | |
|---|---|---|
| ① ブログ名・ペンネーム | 答えた | ほぼ知らない |
| ② 親でさっき頼んだこと | 知らない | 知らない |
| ③ モデル ID | claude-haiku-5-5 | claude-haiku-5-5 |
| 子の入力トークン | 約10.5万 | 約4.9万 |
| 子の出力トークン | 約4,000 | 約1,900 |
| 指示から報告まで | 20秒 | 9秒 |
トークン数は、Claude Code が保存している子のログ(~/.claude/projects/ の下、セッションごとの subagents/ フォルダ)の usage から取りました。
親のログには子のやり取りは一切残っておらず、戻ってきたのは最終報告の3行だけでした。
何が渡っていたか
公式ドキュメントの「What loads at startup」と、私の環境(Claude Code 2.1.309)での実測を並べるとこうでした。
| 渡るもの | 公式 | 実測 |
|---|---|---|
| 親が書いた指示文 | 渡る | 渡っていた |
| CLAUDE.md(全階層) | 渡る(Explore と Plan は除く) | 丸ごと渡っていた(約7万字) |
| 親の会話履歴 | 渡らない | 渡っていなかった(②が「知らない」) |
| 自動メモリ | 渡らない | 索引の MEMORY.md だけ付いていた(CLAUDE.md を外した子がブログ名を知っていたのはこれ) |
CLAUDE.md は丸ごと渡り、親の会話は渡りません。
自動メモリだけ公式と違っていましたが、これは私の環境での実測なので、環境によって変わる可能性があります。
1回のトークン使用量
3行の答えに10万トークンは重いなあと思い内訳を見てみると、CLAUDE.md のぶんが約5.6万で、
残りの約4.9万はツールの定義(44個で約10万字)などで、こちらは CLAUDE.md を外しても同じだけかかります。
しかも子は親のキャッシュを使わないので(公式の表でも fork 以外は Separate cache)、親が同じ CLAUDE.md をもう読んでいても、子は10万トークンを一から読み直していました。
公式にも「子のリクエストも同じ使用量の枠に数える」とあるので、この10万トークンはそのまま自分の枠から減ります。
まとめ
無計画にサブエージェントを使うと、トークンが無駄に使われてしまいますが、
サブエージェントを自分で定義してうまく設計すれば、トークンの使い方は最適化できそうです。
そもそもCLAUDE.mdが7万字は太りすぎなので、適宜ダイエットが必要ですね。
ダイエットした話はコチラ。
CLAUDE.md を子に渡さない設定(omitClaudeMd)を試した話はコチラ。