スキルの 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 Code

① ブログ名は「コードメモ帳」、ペンネームは「めもちょ」。
② 知らない。親セッションの会話は与えられていない。
③ claude-haiku-5-5。

CLAUDE.md を外した方では、こうでした。

Claude Code

① ブログ名はメモリに「コードメモ帳」とあるだけで確定できない。ペンネームは知らない。
② それより前の依頼は、今の情報には見当たらない。
③ 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)を試した話はコチラ。