Claude Code は3単語のステータスラインにトークンの約15〜20%を消費します
Claude Code burns ~15–20% of your tokens on a 3-word status line (gist.github.com)
要約
この記事は、Anthropic の Claude Code が、エージェントのステータスラインを更新するために、バックグラウンドで大量のトークンを消費する問題を指摘しています。この「agent_summary」機能は、デフォルトで有効になっており、APIリクエストの約15〜20%を占め、コスト増加やレート制限の圧迫につながります。著者は、この機能を無効にするためのスクリプトと設定方法を提供し、その仕組みと影響について解説しています。
全文翻訳
Claude Code は3単語のステータスラインにトークンの約15〜20%を消費します。無効にする方法
Claude Code は、エージェントのステータスラインを更新するために、トークンの約15〜20%を消費します。これは Bun のプリロードによって agent_summary が有効になっているためです。Flamerix AI による、flamerix.ai · MITライセンス
Flamerix AI · MITライセンス
Linux、Claude Code 2.1.257–2.1.312 でテスト済み(テスト済みバージョンを参照)。バイナリは変更されていません(
BUN_OPTIONS=--preload)。アップデートでサイレントに元に戻される可能性があるため、検証を参照してください。
TL;DR
curl -fsSL https://gist.githubusercontent.com/flamerix-ai/c3905705cc4205e5de3011fa2e74efce/raw/no-agent-summary.js -o ~/.local/share/no-agent-summary.js
claude daemon stop --any
BUN_OPTIONS="${BUN_OPTIONS:+$BUN_OPTIONS }--preload $HOME/.local/share/no-agent-summary.js" claude
すべての Claude Code プロセスで永続化するには、インストールを参照してください。
問題点
約30秒ごとに、すべてのバックグラウンドエージェントに対して、Claude Code はそのエージェントのトランスクリプト全体をエージェント自身のモデル(通常は Opus)に送信し、「直近のアクションを3〜5単語で説明してください」と尋ねます。この回答はエージェントパネルのステータスラインを更新するだけで、モデルや会話には到達しません。これを無効にする設定はなく、2.1.232(2026年8月)以降はデフォルトで有効になっています。
この異常は DRIM によって Claude Code の OpenTelemetry エクスポートで検出されました。claude_code.api_request イベントを query_source でグループ化すると、agent_summary がメインの会話自体よりも多くのコストを占めていることが示されました。
query_source = agent_summary | フック前の週 | フック後2日間 |
|---|---|---|
| 全 Claude Code 支出に占める割合 | 16.4 % (メイン会話: 15.7 %) | 0 % |
| 全 API リクエストに占める割合 | 19.7 %、約5件に1件 | 0 % |
| Opus へのその支出の割合 | 96 % | — |
| 出力トークンあたりの入力トークン | ≈ 9,000 : 1 | — |
ここでの支出は、Claude Code のリクエストごとの見積もり(cost_usd)であり、請求書ではありません。サブスクリプションでは、失うのはレート制限のヘッドルームです。これを測定したのは私たちだけではありません。 #86879 には、4つの独立した測定結果(18〜26%)が集められています。
修正方法(仕組み)
no-agent-summary.js は Bun のプリロード(約80行のコード)です。setTimeout/setInterval をラップし、コールバックのソーステキストにサマライザーアンカー(例: [AgentSummary] Timer fired ログ行)が含まれている場合、タイマーを起動する代わりに不活性なハンドルを返します。他のすべてのタイマーはそのまま通過します。OpenTelemetry エクスポートでは、抑制されたリクエストは query_source = agent_summary を持つ claude_code.api_request イベントです。
なぜタイマーフックなのか、より簡単なものではないのか:モジュールはプリコンパイルされた Bun バイトコードとして出荷されるため、バイナリ内の JS テキストを編集しても何も変わりません。API クライアントはラップされた globalThis.fetch を通過しません。しかし、Function.prototype.toString は、バイトコードから実行される場合でもコールバックのソースを返すため、タイマーは内部の文字列によって認識できます。不活性タイマーは正確に 2³¹−1 ms を使用します。Node と Bun はより大きな遅延を 1 ms として扱います。そのため、「無限」の遅延はすぐに発生します。
インストール
-
no-agent-summary.jsを安定した場所に配置します。その絶対パスをメモしておきます。 -
BUN_OPTIONSをグローバルに設定して、すべての Claude Code プロセスがそれを受け取るようにします。いずれかを選択してください:
# ~/.profile, ~/.bashrc, ~/.zshrc
export BUN_OPTIONS="${BUN_OPTIONS:+$BUN_OPTIONS }--preload /abs/path/no-agent-summary.js"
# ~/.config/fish/config.fish
set -gx BUN_OPTIONS "--preload /abs/path/no-agent-summary.js"
# ~/.config/environment.d/50-no-agent-summary.conf (systemd user env; user services and timersにも到達します。
# user manager が次に開始するとき(通常は次のログイン時)に適用されます)
BUN_OPTIONS=--preload /abs/path/no-agent-summary.js
または、PATH のより早い位置にあるラッパー claude(case は Claude Code プロセスが別のプロセスを開始するときに冪等性を保ちます):
#!/bin/sh
HOOK=/abs/path/no-agent-summary.js
case " ${BUN_OPTIONS-} " in
*" --preload $HOOK "*) ;; # すでにフックされている場合は何もしない
*) export BUN_OPTIONS="${BUN_OPTIONS:+$BUN_OPTIONS }--preload $HOOK" ;; # フックを追加
esac
: "${CC_AGENT_SUMMARY_LOG:=${XDG_RUNTIME_DIR:-/tmp}/no-agent-summary.log}" # ログファイルのデフォルトを設定
export CC_AGENT_SUMMARY_LOG
exec /path/to/the/real/claude "$@"
- インストール後、デーモンと既に実行中のすべてのセッションを再起動し、
BUN_OPTIONSが設定されている環境から Claude Code を起動します。
claude daemon stop --any
環境変数
| 変数 | 値 | 効果 |
|---|---|---|
CC_AGENT_SUMMARY_MODE | off (デフォルト), pass | off はサマリータイマーを抑制します。pass は A/B テスト用です。フックをロードし、すべてのタイマーを起動します。他の値は stderr に警告を表示し、off として動作します。 |
CC_AGENT_SUMMARY_LOG | ファイルパス、オプション | ロード時に preload active mode=… bun=… hooked=… を追記します。一致したタイマーごとに1行(最初の20件)、および終了カウントを記録します。 |
CC_AGENT_SUMMARY_MARKER | ファイルパス、オプション | ロード時に preload active … 行で上書きされます。 |
注意点
- インストール後はデーモンを再起動してください。 デーモン、pty ホスト、およびプリウォームされた
bg-spareセッションは、デーモンを起動したクライアントの環境を継承します。そのため、BUN_OPTIONSが設定される前に起動されたデーモンは、フックされていないセッションを生成し続けます。したがってclaude daemon stop --anyが必要です。 - ヘッドレス実行にも必要です:
claude -p、cron、CI、エディタ連携など。 - プラットフォーム: Linux でテスト済み、macOS および Windows では未テスト。Windows では
/$bunfs/ゲートはおそらくフックをインストールしません。 - A/B テスト:
CC_AGENT_SUMMARY_MODE=passはフックをロードしますが、すべてのタイマーを起動します。サマリーが復活するため、offの結果がフックによるものであることがわかります。 - バックグラウンドプロセス: デーモン、pty ホスト、
bg-spareは、環境に--preloadを含める必要があります(Linux では/proc/<pid>/environ)。そうでない場合は、デーモンを再起動してください。
検証(アップデートごと)
- プリロードのロード:
BUN_OPTIONS="--preload $HOME/.local/share/no-agent-summary.js" CC_AGENT_SUMMARY_LOG=/tmp/nas.log claude --version && cat /tmp/nas.log
preload active mode=… という出力が期待されます。行がない場合:BUN_OPTIONS がプロセスに到達していないか、パスが絶対パスではありません。
- タイマーの抑制: 同じ
BUN_OPTIONSとCC_AGENT_SUMMARY_LOG=/tmp/nas.logで、バックグラウンドサブエージェントを1〜2分間実行します。ログにsummary timer #1 suppressed (setTimeout, delay=30000)と表示され、エージェントパネルのステータスが更新されなくなります。OpenTelemetry をエクスポートする場合、query_source = agent_summaryはゼロのままになるはずです。これは、すべての障害モードを検出できる唯一のチェックです。
Fail-open(失敗時にオープンする)
マッチングはソーステキストで行われます。アンカーはコールバック内に存在する必要があります。アップデートでそれが壊れた場合、フックは何もマッチせず、サマリーはサイレントに戻ります。発生する可能性のあるシナリオ:
- ログ行またはクエリソースIDの名前が変更された。
- コールバックが
fn.bind(...)(toStringにソースがない)または別のラッパー経由で渡された。 - 文字列がコールバック外の共有定数に移動された。
- タイマーがアンラップされた API(
timers/promises、スケジューラーループ)に移動された。
そのため、アップデートごとに検証を実行してください。
効果
- 私たちのマシン(2.1.301)では、すべての Claude Code プロセスでこれを実行しています。それ以来、
agent_summaryリクエストはゼロで、他のサイドクエリが増加してそれを置き換えることもありませんでした。 - サブエージェント、バックグラウンドエージェント、フォークされたスキル、バックグラウンドセッションは正常に実行されます。サマリーフォークのみがスキップされます。
- 可視的な変更:エージェントパネルのステータス表示が更新されなくなります。SDK の
task_progressにsummaryがなくなります。 - オーバーヘッド:各ユニークなタイマーコールバックに対して1回の
Function.prototype.toString呼び出し(WeakMapにキャッシュ)。claude --version:約10 ms → 約17 ms(1回の測定)。
テスト済みバージョン
npm の @anthropic-ai/claude-code-linux-x64 からの Linux x64 バイナリ(SHA256 はネイティブインストーラーの manifest.json チェックサムと一致します)。静的: 抽出されたバンドルのサマリータイマーコールバックにはフックアンカーが含まれています。ライブ: claude -p --model haiku と CLAUDE_CODE_AGENT_PROGRESS_SUMMARIES=1 を使用し、1つのサブエージェントが約20秒の8ステップを実行し、--debug-file で [AgentSummary] Forking をカウントします。
| バージョン | 公開日 | sha256 | 静的 | 約2.5分間のエージェント実行におけるサマリーフォーク:フックなし / フック pass / フック off | メモ |
|---|---|---|---|---|---|
| 2.1.312 | 2026-10-27 | 4f4178ce41d8 | OK | 5 / 5 / 0 | 2026-10-28 時点の latest。インタラクティブ:6(フックなし)/ 0 (off) |
| 2.1.310 | 2026-10-23 | b73676430af1 | OK | 5 / 5 / 0 | |
| 2.1.308 | 2026-10-22 | 356733f185fa | OK | 5 / 6 / 0 | 2026-10-28 時点の stable。pass 実行のエージェントは8ステップではなく9ステップかかりました |
| 2.1.301 | 2026-10-15 | bc1aad9982c7 | OK | 5 / 5 / 0 | 前のフックビルドでも同様。インタラクティブ off も 0。2026-10-26 から日常使用、テレメトリで agent_summary リクエストはゼロ |
| 2.1.280 | 2026-09-22 | 1e08503dbdf3 | OK | 1 / 1 / 0 (タイマーは 11 / 11 / 0 回発生) | インタラクティブ:-p ではこのバージョンでサマリーを有効にできません。エージェントは権限プロンプトで停止したため、後続のタイマーは変更されていないトランスクリプトをスキップしました |
| 2.1.257 | 2026-09-01 | 9a64bda9d872 | OK | 1 / 1 / 0 (タイマーは 11 / 11 / 0 回発生) | 2.1.280 と同じ |
5 / 5 / 0 = そのバージョンではフォークが発生しますが、フックをロードするだけでは何も変わりません。off でそれが削除されます。
これに設定がない理由
- ドキュメント化されたスイッチは有効にするだけです。 SDK オプション
agentProgressSummariesはデフォルトでfalseですが、バンドル内では OR の1つの項であり、それを書き込むすべてのコードパスがtrueを設定します。したがって、falseは何も変更せず、ドキュメント化されていないCLAUDE_CODE_AGENT_PROGRESS_SUMMARIESはサマリーを有効にするだけです。 - 間隔はサーバーに属します。 これはモデルファミリーごとのサーバーフラグから取得され、30〜240秒に制限されます。デフォルトは既に最小値であり、どの値もタイマーを無効にしません。
- 明白な環境変数は見つかりません。
DISABLE_NON_ESSENTIAL_MODEL_CALLSは、一部のパッケージャーが設定しますが、バイナリには全く存在しません。CLAUDE_CODE_FORK_SUBAGENT=0およびCLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1はそれを停止しますが、フォークサブエージェントやバックグラウンドエージェントを一緒に停止するだけです。 - プロンプトキャッシュはコストを削減しますが、ゼロにはしません。 これらの呼び出しの約 98% はキャッシュからトランスクリプトを再読み込みします。コールドキャッシュにヒットする約 2% は、そのコストの3分の1を占めます。
- トランスクリプトを読み取るコストツールはこれを見ません。 これらのリクエストはディスク上のセッションログに書き込まれません(#104358)。OpenTelemetry エクスポートのみがそれらを表示します。バックグラウンドトークン使用量に関するドキュメントにもリストされていません。一方、Agent View の行サマリーは、Haiku クラスのモデルが数分ごとに更新されるとドキュメント化されています。
- より安価なバリアントが既に存在しますが、無効になっています。 2.1.310 には
shortモードが搭載されています。フルトランスクリプトの代わりに約2kトークンのノートで、オプションでより小さなモデルによって書き込まれます。デフォルトは依然としてフルトランスクリプトであり、サーバーフラグのみがそれを変更できます。
タイムライン(2026年)
| バージョン(公開日) | 変更内容 |
|---|---|
| 2.1.32 (2月5日) | コードが最初に登場。パブリックビルドでは無効 |
| 2.1.72 (3月9日) | SDK オプトインとしてアクセス可能に |
| 2.1.117 (4月21日) | フォークゲートまたはサーバーロールアウトの背後にあるインタラクティブ CLI でアクセス可能に |
| ≤ 2.1.220 (7月24日) | フォークされたスキルは常に要約される |
| 2.1.232 (8月13日) | インタラクティブなバックグラウンドエージェントでデフォルトで有効に |
| 2.1.300 (10月14日) | 間隔がサーバーで調整可能に(30〜240秒) |
| 2.1.310 (10月23日) | より安価な short モードが登場、無効なまま |
私たちのテレメトリでは、その週あたりの支出の割合は7月(フォークゲートは既に私たちに開かれていました)の 3.5〜7% から、2.1.233 を取得した週には 7.3%、次に 11.8% に増加し、10月中旬には約16%になりました。
ライセンスと免責事項
MIT © 2026 Flamerix AI。現状有姿で提供され、いかなる保証もありません。使用は自己責任で行ってください。Flamerix AI は、その使用に起因するいかなる損害、データ損失、またはアカウントアクションについても責任を負いません。クライアントの実行時動作を変更することは、使用するサービスの利用規約に違反する可能性があります。その確認はご自身で行ってください。
「Claude」および「Claude Code」は Anthropic, PBC の商標です。このプロジェクトは独立しており、Anthropic と提携、スポンサー、または承認されているものではありません。