Error during compactionの意味と対処 — Claude Code
「Error during compaction: Conversation too long」で/compact自体が失敗したときの原因と、Escで数ターン戻ってから再実行する対処を解説します。
/compactを実行したのに要約が完成せず、「Error during compaction: Conversation too long」と表示されることがあります。これは会話が長すぎるだけでなく、要約そのものを書き込む空きがコンテキストに残っていない状態です。/compactを繰り返しても同じエラーが続くので、まずEscを2回押して数ターン前まで巻き戻してから再実行します。
Error during compactionとは何が起きているエラーか
通常の「Context exceeds token limit」や「Prompt is too long」は、会話が上限を超えて新しいリクエストが送れなくなった状態です。これは/compactで解消できます。ところが今回のエラーは、その回復手段であるはずの/compact自体が失敗するケースです。
Error during compaction: Conversation too long. Press esc twice to go up a few messages and try again./compactは会話履歴を要約してから、その要約をあらためてコンテキストに書き込みます。会話がすでに上限ぎりぎりまで埋まっていると、要約後の内容を書き込む空きすら残っていません。「要約を作る処理」自体がコンテキストを消費するため、圧縮するには圧縮するための余白が要る、という逆説的な状態に陥ります。
なぜ発生するか — 空きが無い状態でcompactが走る2パターン
このエラーが起きるのは主に2つの状況です。
- auto-compactが発火した瞬間に、すでにウィンドウが満杯だった。自動圧縮は上限に近づいた時点で先回りして走りますが、直前のツール出力やレスポンスが一気に大きかった場合、発火した時点で手遅れになっていることがあります
- 「Prompt is too long」を見たあとに、手動で
/compactを実行した。この時点で会話はすでに上限を超えており、要約を書き込む余白がそもそも残っていません
前者はauto-compactの発火タイミングの問題、後者は「エラーが出てから対処する」という順序そのものの問題です。特に後者は、/contextが示す「Context limit reached」の行を見た直後に起きやすいパターンです。上限に近づいたら余白があるうちに/compactを先に打つほうが、このエラーそのものを避けられます。
fallbackModelでフォールバック連鎖を設定している場合は、もう1つ別の原因があります。フォールバック連鎖は圧縮処理もカバーしますが、Claude Codeは主モデルよりコンテキストウィンドウが小さいモデルへはフォールバックしません。小さいモデルで要約すると、会話の一部がその時点で切り捨てられてしまうためです。設定した候補がすべて主モデルより小さいウィンドウしか持たない場合、圧縮はこの元のエラーをそのまま表示します。この場合はEscで戻る対処に加えて、フォールバック連鎖の構成そのものを見直す必要があります。
対処 — Escで数ターン戻ってから再実行する
対処は次の順で進めます。
- Escを2回押す。プロンプト入力欄が空の状態でEscを2回押すと、これまでのプロンプトを一覧するメニューが開きます(
/rewindと同じ操作) - 一覧から数ターン前のポイントを選ぶ。これにより直近の重いメッセージがコンテキストから外れ、空きができます
- 空きができたところであらためて
/compactを実行する - それでも空きが足りなければ
/clearで新しいセッションを始める。それまでの会話は保存されており、/resumeでいつでも呼び戻せます
入力欄に文字が入っている状態でEscを2回押すと、メニューは開かず入力中のテキストが消えるだけの動作になります。消えたテキストは入力履歴に残るため、Upキーで呼び戻してからあらためてEscを2回押してください。
Escを2回押して開くメニューには、選んだ時点まで会話を戻す以外にも選択肢があります。
| 選択肢 | 動作 |
|---|---|
| Restore conversation | 動作選んだ時点まで会話を戻す(コードは変更しない) |
| Restore code and conversation | 動作会話とコードの両方を選んだ時点まで戻す |
| Restore code | 動作コードだけを戻し、会話はそのまま残す |
| Summarize from here | 動作選んだ時点以降の会話を要約に圧縮する |
| Summarize up to here | 動作選んだ時点より前の会話だけを要約に圧縮し、以降のメッセージはそのまま残す |
このエラーへの対処として特に有効なのが「Summarize up to here」です。会話の前半だけを狙って要約に圧縮し、直近のやり取りはそのまま残すため、/compactのように会話全体をまとめて要約しようとして同じエラーを繰り返す事態を避けやすくなります。要約後は会話の中に「Summarized conversation」という区切りが挿入され、Claudeは元のメッセージ内容もセッションのトランスクリプトから参照し続けられます。要約する範囲は、矢印キーで「Summarize」の行を選んだあとに表示される「add context (optional)」欄へ指示を書けば絞り込めます。どちらの要約オプションでも、ディスク上のファイルには影響しません。会話の記録だけを対象にした操作であることを覚えておくと、コードの巻き戻しと混同せずに使い分けられます。
非常に長いセッションでは、選べる範囲に差が出ることがあります。Claude Codeはセッション内で直近100件のチェックポイントについてだけファイルスナップショットを保持する仕組みで、それより古いチェックポイントはコードの巻き戻し対象から外れます。一方、「Restore conversation」や「Summarize」は会話の記録に対する操作でファイルスナップショットを必要としないため、100件を超えて古いプロンプトを選んだ場合でもメニューには「Restore code」系の選択肢が出ないだけで、会話側の操作は選べます。
v2.1.216で見た目の罠が直った
このエラーには、表示上の落とし穴がありました。v2.1.216より前のバージョンでは、圧縮失敗のメッセージが、成功時と同じ地味な色合いのスタイルで表示されていました。エラーであることが視覚的に区別しづらく、/compactが失敗したのにそのまま作業を続けてしまい、結局そのあと別のリクエストが「Prompt is too long」で弾かれてから初めて異常に気づく、という遠回りが起きやすい状態でした。
現在のバージョンでは、このメッセージを含む/compactの失敗はエラー用のスタイルで表示されるため、成功と見分けがつかない事態は起きにくくなっています。バージョンをclaude --versionで確認し、古いままならclaude updateしておくと、この種の見落としを避けられます。
| 挙動 | v2.1.216より前 | v2.1.216以降 |
|---|---|---|
| 圧縮失敗時の表示スタイル | v2.1.216より前成功時と同じ地味な色合い | v2.1.216以降エラー用のスタイルで区別 |
| 失敗への気づきやすさ | v2.1.216より前遅れやすい(次のリクエスト失敗で気づく) | v2.1.216以降その場で分かる |
根本原因を減らすには — 圧迫要素を先に削る運用
このエラーを繰り返し踏むなら、/compact任せにせず、コンテキストを圧迫している要素を事前に削っておく運用が効きます。特に効くのは、使っていないMCPサーバーの無効化です。MCPサーバーが増えるほどツール定義そのものがコンテキストを占有し、会話本文が同じ長さでも上限に達するタイミングが早まります。
サブエージェントを多用するワークフローでは、親から引き継ぐツール定義の分だけ最初から余白が狭くなる点も見落としがちです。起動前に整理しておくと、このエラー自体に当たりにくくなります。使っていないMCPサーバーを/mcp disable <name>で切る、肥大化したCLAUDE.mdをパス指定ルールへ分割するといった対策はContext exceeds token limitの意味と対処で表にまとめています。
auto-compactの発火条件そのものや、要約後に何が残り何が消えるかという仕組みはClaude Code compactの発火条件と要約後に残る情報が詳しいです。起動場所や読み込み除外設定でコンテキストに入れる情報量自体を絞る設計はClaude Codeのコンテキスト管理を参照してください。
まとめ
「Error during compaction: Conversation too long」は、会話がすでに上限ぎりぎりで、要約を書き込む空きすら残っていないときに/compact自体が失敗するエラーです。対処はEscを2回押して/rewindメニューから数ターン前まで会話を戻し、空きを作ってから/compactを再実行します。それでも足りなければ/clearで新しいセッションを始め、必要なら/resumeで元の会話に戻ってください。v2.1.216以降はこの失敗がエラー用のスタイルで表示されるため、成功と見誤ることも減っています。
よくある質問
Escで数ターン戻すと、そのやり取りは完全に消えますか
消えません。/rewindメニューで「Restore conversation」を選ぶと、その時点までの会話に戻した状態で作業を再開しますが、元のセッションの記録自体は保持されています。/clearを使った場合も同様で、それまでの会話は保存されており/resumeから呼び戻せます。
ファイルへの変更も一緒に巻き戻されますか
選ぶ操作によります。/rewindメニューには会話だけを戻す「Restore conversation」と、コード変更もあわせて戻すオプションがあり、後者を選んだ場合のみファイルの変更が戻ります。コンテキストの空きを作るだけが目的なら、コードには触れない「Restore conversation」で十分です。
Summarize up to hereとSummarize from hereはどう使い分けますか
狙う範囲が逆です。Summarize up to hereは選んだ時点より前の会話を要約し、直近のやり取りをそのまま残します。空きを作りたいだけならこちらが基本です。Summarize from hereは選んだ時点より後の会話を要約するもので、たとえば試行錯誤が長引いた区間だけをまとめて、それより前の初期方針の会話は原文のまま残したいときに向いています。
auto-compactを無効にしていると、このエラーの出方は変わりますか
DISABLE_AUTO_COMPACTで自動圧縮を無効にしていても、手動の/compactは使えます。ただし自動での先回りが無くなる分、上限ぎりぎりまで会話が伸びてから初めて/compactを打つ場面が増えやすく、結果としてこのエラーに当たる頻度は上がりがちです。無効にしたまま運用する場合は、上限に近づく前に自分から早めに/compactする習慣が有効です。