Claude Code compact は「会話が長くなったら要約して枠を空けるコマンド」と説明されがちですが、実際には何が残るかは、その内容がどう読み込まれたかによって変わります。プロジェクト直下の CLAUDE.md はディスクから再注入されるので消えませんが、paths: フロントマター付きのルールは会話ごと要約されて消えます。スキル本文は戻ってきますが上限つきで切り詰められます。本記事では公式仕様を仕組みごとに整理し、5,000トークンという閾値が実際にどれだけのファイルに効くのかを当サイトのリポジトリで実測して示します。
30秒でわかる /compact
・一様には消えない。CLAUDE.md・自動メモリ・プランはディスクから再注入される
・paths: 付きルールとネストした CLAUDE.md は消える。会話履歴に載る仕組みだから
・ファイルの読み直しは最大5件、最終更新が新しい順
・5,000トークン超のファイルは中身が戻らない。Read でなく Referenced file として参照だけ返る
・スキル本文は1つ5,000/合計25,000トークンで打ち切り、切り詰めは先頭を残す
・圧縮自体が大きな要求。話題が変わっただけなら費用ゼロの /clear が正解
Claude Code 全体の設定・運用はClaude Code|2026年版・インストールからCLAUDE.md・Hooks・本番運用までの実装手引きにまとめています。本記事はコンテキスト圧縮という一点に絞ります。自分のコンテキストが今どうなっているかの確認手段はClaude Code 使用量 確認の6手段|/usage で見えるもの・見えないものを実測で切り分けるを参照してください。
Claude Code compact で何が残り、何が消えるのか
公式ドキュメントは、圧縮後の扱いを読み込まれ方(mechanism)ごとに表で定義しています。日本語圏でほとんど紹介されていない部分なので、まずここを正確に写します。
| 読み込まれ方 | 圧縮後の扱い |
|---|---|
| システムプロンプト・出力スタイル | 変化なし(そもそもメッセージ履歴の一部ではない) |
プロジェクト直下の CLAUDE.md・スコープなしのルール |
ディスクから再注入 |
| 自動メモリ | ディスクから再注入 |
| プランモードで書いたプラン | ディスクから再注入 |
paths: フロントマター付きのルール |
対象ファイルを読んだときに再読み込み |
サブディレクトリのネストした CLAUDE.md |
そのディレクトリのファイルを読んだときに再読み込み |
| Claudeが読んだ/編集したファイル | 最大5件を読み直す(最終更新が新しい順) |
| 呼び出したスキルの本文 | 再注入。ただし1スキル5,000/合計25,000トークン上限、古い順に破棄 |
| フックが以前に追加した文脈 | 会話と一緒に要約される |
compact ソースにマッチする SessionStart フック |
実行され、出力が圧縮後の文脈に追加される |
ここで最も実務に効くのが5行目と6行目です。paths: 付きのルールとネストした CLAUDE.md は、トリガーとなるファイルが読まれたときにメッセージ履歴へ載る仕組みです。したがって圧縮では他の会話と同じように要約されて消えます。公式ドキュメントは対処もはっきり書いていて、圧縮をまたいで残したいルールは paths: を外すか、プロジェクト直下の CLAUDE.md へ移すことを勧めています。
「圧縮したら急に規約を守らなくなった」という症状は、この挙動でほぼ説明がつきます。ルールが消えたのであって、モデルが忘れたわけではありません。
なお v2.1.198 以降、要約リクエストはセッションの拡張思考の設定を引き継ぎます。セッションで思考が有効なら思考ありで要約し、無効なら無効のままです。思考は要約の作り方に影響するだけで、要約後にセッション設定が変わることはありません。
5,000トークンという閾値が実際にどれだけ効くか
上の表の7行目「最大5件を読み直す」には続きがあります。公式ドキュメントは、5,000トークンを超えるファイルは中身なしのパス参照として戻り、表示も Read ではなく Referenced file になると明記しています。ルール自体は読み直されますが、ファイルの中身は戻りません。
この閾値がどれくらい厳しいのかを、当サイトのリポジトリで実測しました。count_tokens API を使い、種類ごとに無作為抽出して測っています(claude-sonnet-5・2026-08-30)。
| ファイル種別 | 母数 | 抽出 | 5,000トークン超 | 中央値 | 最大 |
|---|---|---|---|---|---|
| 記事(日本語 Markdown) | 1,116 | 20 | 15件=75% | 11,953 | 16,531 |
| Python ツール | 131 | 20 | 7件=35% | 3,799 | 10,058 |
| レイアウト/インクルード(HTML) | 10 | 10 | 3件=30% | 3,419 | 41,807 |
日本語の文書はほとんどが閾値を超えます。中央値が11,953トークンなので、記事を編集していたセッションが圧縮されると、編集中だったファイルの中身は原則として戻ってきません。一方、Pythonのソースは中央値3,799トークンで多くが閾値内に収まります。同じ「ファイルを読んで作業する」でも、扱う対象によって圧縮後の回復度がまったく違うということです。
手元で同じ測り方をする
count_tokens は課金されないので、圧縮の前に自分のファイルがどちら側かを確認できます。
for f in $(git ls-files '*.md'); do
n=$(jq -Rs '{model:"claude-sonnet-5",messages:[{role:"user",content:.}]}' < "$f" \
| curl -s https://api.anthropic.com/v1/messages/count_tokens \
-H "x-api-key: $ANTHROPIC_API_KEY" -H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" -d @- | jq .input_tokens)
[ "$n" -gt 5000 ] && echo "$n $f"
done
出力されたファイルは「圧縮後にパス参照でしか戻らない」側です。作業中はこれらを開きっぱなしにせず、必要な部分だけを渡すか、読み取りをサブエージェントへ逃がすほうが安全です。
スキルについても同じ形の上限があります。1スキルあたり5,000トークン・合計25,000トークンで打ち切られ、超過分は古く呼び出したものから落とされます。重要なのは切り詰め方で、先頭を残す方式です。公式ドキュメントはこれを踏まえて、重要な指示を SKILL.md の上のほうに置くよう明示的に勧めています。長いスキルを書いている場合、末尾に置いた注意事項は圧縮後に存在しないものとして扱われる可能性があります。
自動圧縮の閾値を変える3つの場所と優先順位
/compact を手で打たなくても、コンテキストが埋まれば自動で圧縮が走ります。その発火点は変更できます。
・/autocompact 500k:ユーザー設定の autoCompactWindow に保存され、現在のセッションにも適用される。ただし管理設定など優先度の高いスコープが同じキーを持つ場合はそちらが勝ち、コマンドはその旨を伝える。/autocompact auto でモデルに合わせた既定へ戻せる
・--autocompact フラグ:その起動だけ有効で、保存された設定を変えない。/autocompact と違い管理設定のような優先度の高いスコープに阻まれない
・CLAUDE_CODE_AUTO_COMPACT_WINDOW:スクリプトやクラウド環境向け。設定されている間はコマンド・フラグ・設定のすべてに優先し、/autocompact は変更でなく上書きされている旨を報告する
既定の発火点はモデルと構成で変わります。公式ドキュメントによれば、自動圧縮の窓を指定しない場合はモデルのコンテキスト上限に達したときに圧縮されますが、例外があります。Sonnet 4.6 と Opus 4.6(拡張コンテキストなし)は200Kの境界で圧縮され、Opus 4.8 と Opus 5 も200Kの窓で動く環境——Amazon Bedrock・Google Cloud の Agent Platform・Microsoft Foundry——では同様です。CLAUDE_CODE_DISABLE_1M_CONTEXT=1 を設定した場合、Sonnet 5 や Fable 5 のようにネイティブで1M窓を持つモデルも200Kで圧縮されます。Anthropic API 上の Sonnet 5 は既定で約967Kトークンで自動圧縮されます。
自動圧縮を切ると「圧縮されない」ではなく「止まる」
環境変数 DISABLE_COMPACT で全ての圧縮を無効にできますが、公式ドキュメントは結果を明記しています。自動圧縮が有効なら200Kの境界で圧縮されるところ、無効にすると同じ境界でコンテキスト長超過のエラーになって停止します。「圧縮されると要約で情報が落ちるから切る」という判断は、長いセッションを続けられなくなることと引き換えになります。
なお自動圧縮の窓を200Kより大きく設定しても保留は解除されません。Claude Code はその窓をモデルのコンテキスト窓で頭打ちにするためです。
これらのフラグが本当に配布物に入っているかを、当サイトの検証環境(v2.1.241・Mach-O arm64 バイナリ)で確認しました。文字列検索の結果が検索方法の副作用でないことを示すため、存在しないはずの名前を対照群として同じ方法で検索しています。
| 検索した文字列 | 出現数 |
|---|---|
CLAUDE_CODE_AUTO_COMPACT_WINDOW |
17 |
autoCompactWindow |
35 |
DISABLE_COMPACT |
14 |
CLAUDE_CODE_DISABLE_1M_CONTEXT |
5 |
Not enough messages to compact |
2 |
Referenced file |
2 |
CLAUDE_CODE_NOT_A_REAL_FLAG_XYZ(対照群) |
0 |
対照群が0件である一方、公式ドキュメントが挙げる名前はすべて実在しました。ドキュメントの記述が、いま配布されている版の実装と一致していることの確認になります。
Claude Code compact が走るときに実際に起きること
ここまでの仕様を、圧縮1回ぶんの流れとして並べ直します。手で /compact を打った場合も、閾値に達して自動圧縮(autocompact)が走った場合も、公式ドキュメントによれば同じ処理です。
または /compact を実行"] --> B["会話履歴を読んで要約
v2.1.198以降は拡張思考の設定を継承"] B --> C["ディスクから再注入
CLAUDE.md・自動メモリ・プラン"] C --> D["直近のファイルを最大5件読み直す
最終更新が新しい順"] D --> E{"そのファイルは
5,000トークン超か"} E -- "超える" --> F["Referenced file として
パスだけ戻る(中身なし)"] E -- "収まる" --> G["Read として
中身ごと戻る"] F --> H["スキル本文を再注入
1つ5,000/合計25,000で打ち切り"] G --> H H --> I["compact ソースの SessionStart フックを実行
出力を圧縮後の文脈へ追加"] I --> J["プロンプトキャッシュ上は
「期待される再構築」として計上"]
図の最後2ステップは、知っていると設計の幅が変わる部分です。
SessionStart フックによる再注入。公式ドキュメントは、compact ソースにマッチする SessionStart フックを圧縮後に実行し、その出力を圧縮後の文脈へ追加すると定めています。つまり「圧縮のたびに必ず入れ直したい情報」がある場合、paths: 付きルールのように消える仕組みに置くのではなく、このフックで再注入するのが正攻法です。要約の中身に依存せず、毎回同じ内容を確実に戻せます。
プロンプトキャッシュ上の扱い。圧縮は会話全体を書き換えるため、本来ならキャッシュミスとして計上されるはずの再処理が発生します。しかし公式ドキュメントは、Claude Code 自身が会話を書き換えた場合(圧縮、または古いツール結果のコンテキストからの削除)は、同種のミスを「期待される再構築(expected rebuilds)」として別枠で数えるとしています。/usage の Prompt cache 行でミス回数が跳ねていないのに再処理が起きている場合、この区分に入っている可能性があります。
もう1点、モデルのフォールバックにも圧縮起因の制約があります。公式ドキュメントは、フォールバックの連鎖が圧縮にも適用される一方で、Claude Code は主モデルよりコンテキスト窓が小さいモデルへはフォールバックしないと述べています。理由は明快で、窓の小さいモデルで要約しようとすると要約する前に会話の一部が切り落とされてしまうからです。すべてのフォールバック先が小さい場合、圧縮は元のエラーを表示し、再試行できる状態になります。
設計として読み替えると
・圧縮をまたいで確実に残したい指示 → プロジェクト直下の CLAUDE.md、または compact ソースの SessionStart フック
・圧縮で消えても構わない補助情報 → paths: 付きルール、ネストした CLAUDE.md
・圧縮後に中身ごと戻ってほしいファイル → 5,000トークン未満に分割しておく
・スキルの重要な指示 → SKILL.md の先頭側に置く(切り詰めは先頭を残す)
/compact と /clear の使い分け
公式ドキュメントは、この2つを費用の観点で対比しています。
検索では「claude code clear」と「claude code compact」が別々に調べられていますが、この2つは同じ「枠を空ける」目的の対になった手段なので、片方だけを知っていると選び損ねます。
/compact は無料ではありません。公式ドキュメントは「圧縮は要約する会話を読むので、大きなコンテキストの圧縮はそれ自体が大きな要求になる」と述べ、続けて「まっさらに始めたいなら /clear は費用ゼロ」と対比しています。つまり続きの文脈が本当に必要なときだけ /compact を使い、話題が変わっただけなら /clear を使うのが費用面での正解です。
/clear の前に /rename でセッションに名前を付けておくと、あとで /resume から戻れます。捨てるのが惜しくて圧縮を選んでいるなら、この手順で代替できます。
要約の内容も指定できます。/compact Focus on code samples and API usage のように指示を付けると、自動圧縮が「重要そう」と推測したものではなく、自分が選んだものを残せます。恒久的に効かせたいなら CLAUDE.md に書く方法もあります。
# Compact instructions
When you are using compact, please focus on test output and code changes
会話の一部だけを圧縮する方法もあります。/rewind でメッセージを選び、Summarize from here(ここから要約)か Summarize up to here(ここまで要約)を選ぶと、範囲を限定した圧縮ができます。
なお、まっさらなセッションで /compact を打つと Not enough messages to compact. と表示されます。要約する会話履歴がまだ存在しないためで、エラーではありません。この文字列も上のバイナリ検索で実在を確認しています。
窓を広げるという別解——1Mコンテキストと claude code 自動圧縮の関係
会話を縮める代わりに窓を広げる、という方向もあります。ただし窓を広げても自動圧縮が消えるわけではなく、発火点が動くだけです。「claude code コンテキスト 圧縮」を止めたくて1M窓に切り替える場合、ここを取り違えると期待外れになります。
公式ドキュメントによれば、1Mトークンのコンテキスト窓に対応するのは Fable 5・Sonnet 5・Opus 4.6 以降・Sonnet 4.6 です。ただしプランによって使えるかどうかが分かれます。
| プラン | Opus の1Mコンテキスト | Sonnet 4.6 の1Mコンテキスト |
|---|---|---|
| Max / Team / Enterprise | サブスクに含まれる(自動でアップグレード) | usage credits が必要 |
| Pro | usage credits が必要 | usage credits が必要 |
| API・従量課金 | フルアクセス | フルアクセス |
料金面では、1M窓は標準のモデル料金で、200Kを超えたトークンに割増はありません。拡張コンテキストがサブスクに含まれるプランでは、そのままサブスクの範囲で賄われます。
そのうえで自動圧縮との関係です。Anthropic API 上の Sonnet 5 は常に1M窓で動き、[1m] サフィックスの選択も usage credits も不要ですが、窓が埋まる前に既定で約967Kトークンで自動圧縮されます。閾値を変えたければ CLAUDE_CODE_AUTO_COMPACT_WINDOW を使います。つまり1M窓にしても圧縮は起きます。起きる位置が200Kから967K付近へ動くだけです。
逆に窓を絞る運用もあります。CLAUDE_CODE_DISABLE_1M_CONTEXT=1 を設定すると、Claude Code はモデル選択から1M系のバリアントを外し、Sonnet 5 や Fable 5 のようにネイティブで1M窓を持つモデルも200K窓として扱います。ここで注意すべき挙動が1つあります。
200Kに抑えた状態では、自動圧縮の窓を上げても効かない
公式ドキュメントは明記しています。CLAUDE_CODE_DISABLE_1M_CONTEXT=1 を設定した状態では、自動圧縮の窓を200Kより大きく設定しても抑制は解除されません。Claude Code がその窓をモデルのコンテキスト窓で頭打ちにするためです。
・自動圧縮が有効なら、200Kの境界で圧縮される
・自動圧縮が無効なら、同じ200Kの境界でコンテキスト長超過のエラーになって停止する
/autocompact 500k を打ったのに200Kで圧縮される、という状況はこの組み合わせで起こります。なお v2.1.223 より前は、この抑制の対象が Sonnet 5・Opus 4.8・Opus 5 のセッションだけでした。
もう1つ、LLMゲートウェイ経由の場合の落とし穴があります。ANTHROPIC_BASE_URL をゲートウェイに向けていると Claude Code は1M対応を検証できないため、Sonnet 5 でも窓を200Kとして見積もります。フル窓を使うにはモデルピッカーで「Sonnet 5 (1M context)」を明示的に選ぶ必要があり、これは内部的に sonnet[1m] にマップされます。同じ構成では、保存された claude.ai のログインが有効な認証情報のままなら Claude Code はプランの usage credits を確認しません。[1m] の選択肢は出たままで、リクエストが通るかどうかはゲートウェイ側が決めます。
圧縮を減らす——そもそも埋めない設計にする
圧縮は対症療法です。公式ドキュメントが挙げている「埋めない」側の手当てを整理します。
| 手当て | 効果 | 注意 |
|---|---|---|
話題が変わったら /clear |
費用ゼロで枠が空く | 固定費(CLAUDE.md)は再度読まれる |
| 大きな読み取りをサブエージェントへ | ファイル内容がサブエージェント側に留まる | エージェントチームは plan モードで約7倍 |
未使用MCPサーバーを /mcp で無効化 |
ツール定義の占有が減る | 定義は既定で遅延読み込み。それでも積み上がる |
CLIツールを優先(gh・aws 等) |
ツール一覧の登録が増えない | 公式は「常により効率的」と明記 |
CLAUDE.md の分量を絞る |
毎セッションの固定費が下がる | 公式の目安は200行未満 |
| フックで出力を前処理 | 1万行のログが数百トークンに | PreToolUse で grep して返す |
このうち固定費の効き幅は当サイトで実測しています。プロジェクトの CLAUDE.md は57,952文字・491行で 44,042トークンでした。公式の目安どおり先頭200行に収めると 16,085トークンまで下がり、63%の削減になります。圧縮の頻度そのものを下げたいなら、会話の切り方より先にここを見るほうが効きます。2026年9月14日には週次上限が今日比で約17%減るため、同じ作業を少ないトークンで回せるかどうかの重みは今後上がります(Claude Code 制限まとめ|9/14に週次上限が恒久+25%=今日比17%減、一次ソースで検証)。
削減手段の比較——どのツールがどれだけ効くのか、削減率の主張がどこまで再現するのか——はClaude Code トークン節約プラグイン比較|削減率と導入コストで選ぶ5ツールにまとめてあります。
まとめ
・圧縮後に何が残るかは読み込まれ方で決まる。CLAUDE.md・自動メモリ・プランは再注入、paths: 付きルールとネストCLAUDE.mdは消える
・ファイルの読み直しは最大5件、5,000トークン超は中身でなくパス参照。当サイトの日本語記事は75%が閾値超
・スキル本文は1つ5,000/合計25,000トークンで打ち切り、先頭が残るので重要な指示は上に置く
・閾値の指定は環境変数 > フラグ > コマンドの優先順位。DISABLE_COMPACT は「圧縮しない」ではなく「境界で止まる」
・/compact は大きな要求、/clear は費用ゼロ。話題が変わっただけなら clear
・v2.1.241 の実バイナリで関連フラグの実在を確認(対照群は0件)
参照ソース
・Claude Code 公式ドキュメント — Explore the context window(What survives compaction)
・Claude Code 公式ドキュメント — Model configuration(Set the auto-compact window)
・Claude Code 公式ドキュメント — Manage costs effectively
・Anthropic API — Token counting(count_tokens)