Claude Codeがセッション途中で”前提を忘れる”のはオートコンパクティングが原因──仕組みと完全対策ガイド

Claude Codeがセッション途中で"前提を忘れる"のはオートコンパクティングが原因──仕組みと完全対策ガイド AI開発

「さっき決めた命名規則を守らなくなった」「絶対にやらないでと言ったのにやり始めた」「序盤の設計方針と矛盾するコードを書いてくる」――Claude Codeを長いセッションで使っていると、こうした「途中でアホになる」現象に遭遇することがあります。

これは使い方が悪いわけでも、Claude Codeの品質が低いわけでもありません。コンテキストウィンドウが一定量を超えると、古い会話を自動要約するオートコンパクティングが発動することが主な原因です。

この記事では、オートコンパクティングの仕組みを理解したうえで、「重要情報を守る」ための具体的な対策を網羅します。コスト管理の全体像はコスト管理完全ガイド、コンテキスト最適化の設計論はコンテキストエンジニアリングガイドも参照してください。

スポンサーリンク

オートコンパクティングの仕組み

Claude Codeは会話のやり取りをコンテキストウィンドウに保持しながら動作します。このウィンドウには上限があり(claude-opus-4-6なら200K、Sonnetなら200K)、使用量が約83.5%に達すると、古い会話を自動的に要約・圧縮します。これがオートコンパクティングです。

コンテキストサイズ コンパクション発動トークン数 保持バッファ
200Kトークン 約167Kトークン(83.5%) 33Kトークン
1Mトークン(claude-opus等) 約835Kトークン(83.5%) 165Kトークン

80%付近でコンテキスト使用率の警告が表示され始め、83.5%で発動します。33Kのバッファは、コンパクション後のレスポンス生成に使われる領域です。

コンパクションが起きても会話が消えるわけではありません。「削除」ではなく「要約」です。ただし、要約は完璧ではないため、細かいニュアンスや否定形の指示が抜け落ちることがあります。

何が消えて何が残るか

オートコンパクティングで特に落ちやすい情報と残りやすい情報には、はっきりとした傾向があります。

消えやすい情報 残りやすい情報
変数名・関数名の由来と命名の根拠 使用言語・フレームワークの大枠
「〜はやらないでください」という否定系の制約 直近数回のやり取り
セッション序盤で決めたアーキテクチャ方針 主要なファイル名・クラス名
長いAPIレスポンスやコマンド出力の詳細 コード変更パターンと主な決定事項
「なぜそう設計したか」という背景・理由 ビルド・テストコマンド
中間ステップの細かい計算・検討過程 デバッグの主要な洞察

つまり、Claudeは「何を作っているか」は残っても、「なぜそうしているか」を落としやすいのです。命名規則を破り始めたり、別方針のコードを書き始めたりするのは、この「なぜ」が消えた結果です。

対策①:CLAUDE.mdにCompact Instructionsを書く

CLAUDE.mdはコンパクション後に自動再読み込みされます。ここに重要な方針を書いておくことで、コンパクションが起きても「毎回注入される情報」として機能します。

さらに、# Compact instructionsセクションを設けると、オートコンパクティングの要約時に「保持を優先する観点」を指示できます。

CLAUDE.md(Compact Instructionsパターン)
# プロジェクト概要
TypeScript + Next.js 15(App Router)のECサイト

# 絶対に守る設計方針
- コンポーネントはServer Componentsをデフォルトにする
- ファイル名はkebab-case、コンポーネント名はPascalCase
- エラーハンドリングは必ずResult型を使う(throwしない)
- テストはVitestとReact Testing Libraryを使う

# 現在の作業状態
- 実装中: カートシステム(src/features/cart/)
- 次のタスク: 決済フローの実装

# Compact instructions
When compacting, preserve:
- The Result<T, E> error handling pattern (never throw)
- The kebab-case/PascalCase naming rules
- The Server Component priority rule
- Current task progress and file paths

Compact instructionsに書くべき内容は「要約から落ちると困るもの」です。命名規則・設計制約・否定系の指示を中心に記載するのが効果的です。

CLAUDE.mdの詳細な書き方はCLAUDE.md完全ガイドを参照してください。

対策②:手動/compactで観点を指定する

自動発動を待たずに、作業の区切りで手動で/compactを打つのが最も確実な方法です。引数に観点を渡すことで、要約品質が大きく上がります。

/compact コマンドの引数指定
# 基本(引数なし)
/compact

# 観点を指定(推奨)
/compact Focus on the auth module and current test failures

# API設計の判断を保持
/compact Keep the API design decisions and error handling patterns

# 型定義を保持
/compact Preserve all TypeScript type definitions and Result<T,E> pattern
タイミング 推奨/compactコマンド
機能実装完了後 /compact Keep the implemented feature and its test cases
バグ修正完了後 /compact Preserve the root cause analysis and fix approach
コミット前 /compact Focus on changed files and why the changes were made
設計議論後 /compact Keep all architectural decisions and the reasons behind them

なぜ手動の方が良いか:自動発動は観点の指定ができません。また、83.5%ギリギリで発動するため、複雑な文脈が多く残った状態で圧縮されます。60〜70%の段階で手動コンパクトすれば、情報量が少ない状態での圧縮になり要約品質が上がりやすいです。

対策③:CLAUDE_AUTOCOMPACT_PCT_OVERRIDEで閾値を早める

環境変数CLAUDE_AUTOCOMPACT_PCT_OVERRIDEで、オートコンパクティングの発動閾値を変更できます。

重要な制限:この環境変数は閾値を「早める方向にのみ」機能します。内部実装でMath.min(指定値, デフォルト値)が適用されるため、デフォルトの83.5%より遅らせることはできません。
CLAUDE_AUTOCOMPACT_PCT_OVERRIDE の設定方法
# シェルで直接設定
export CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=75

# settings.json に恒久設定(推奨)
# ~/.claude/settings.json
{
  "env": {
    "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "75"
  }
}
設定値 発動タイミング 使い方
75(推奨) コンテキストの75%で発動 品質劣化ゾーン手前で早めに圧縮
60 コンテキストの60%で発動 頻繁なコンパクションを許容する場合
50 コンテキストの50%で発動 常に新鮮な状態を保ちたい場合

閾値を早めるとコンパクションの頻度が上がりコストが増える点に注意してください。品質と頻度のトレードオフです。長い設計議論や重要な制約が多いプロジェクトでは75が、通常の開発では設定しない(デフォルト83.5%)でよいことが多いです。

対策④:/wrapup → /clear → /catchup ワークフロー

コンパクションに頼らず、明示的にセッションを区切る方法です。Claude Codeの公式ドキュメントも推奨するワークフローで、コンテキストを完全にリセットしながら重要な状態を引き継げます。

/wrapup → /clear → /catchup ワークフロー
# ステップ1: 現在の作業状態をCLAUDE.mdに保存
/wrapup
# → Claudeが作業の要約をCLAUDE.mdに書き込む

# ステップ2: コンテキストを完全にリセット
/clear
# → 会話履歴をすべてクリア(コンテキスト使用量がゼロに)

# ステップ3: 新しいセッションで続きから再開
/catchup
# → CLAUDE.mdを読み込んで作業状態を復元
コマンド 役割
/wrapup 現在の作業状態・決定事項・次のタスクをCLAUDE.mdに書き込む
/clear 会話履歴を完全クリア(CLAUDE.mdは消えない)
/catchup CLAUDE.mdを読んで前回の状態から再開する

このワークフローの利点は、「コンパクションに任せる」のではなく「人間が意図的に区切りを設ける」点です。/wrapupで書き込む内容を確認・編集できるため、引き継ぐ情報を自分でコントロールできます。

対策⑤:大きな出力をコンテキストに流し込まない

コンテキストをすぐに埋める原因のひとつが、大量のコマンド出力をそのまま会話に流すことです。

大きな出力をファイルに逃がす
# NG: ログをそのままClaude Codeに送る
# → 数千行のログがコンテキストを圧迫

# OK: ファイルに書き出してから参照させる
npm test 2>&1 | tee test-output.txt
# → "test-output.txtを読んでエラーを分析して" と依頼

# OK: エラー行だけに絞る
npm test 2>&1 | grep "FAIL\|Error\|×" > test-errors.txt

同様に、git log --oneline -100のような長い履歴や、大量のAPIレスポンスも直接流し込まず、ファイル経由で必要な部分だけを参照させるのが効果的です。

対策⑥:Auto MemoryとMemory MCPを活用する

Claude Code v2.1.59以降では、プロジェクトの重要情報を自動でメモリファイルに記録するAuto Memory機能が搭載されています。コンパクションが発生しても、メモリファイルは消えません。

Auto Memoryの確認と操作
# Auto Memoryのon/offを切り替え
/memory

# 保存場所
~/.claude/projects/<project-path>/memory/
  MEMORY.md        # インデックス(常時ロード)
  user_role.md     # ユーザー情報
  feedback_*.md    # フィードバック
  project_*.md     # プロジェクト情報

Auto Memoryの詳細、およびより強力な長期記憶システム(SQLite+ベクトル検索)の構築方法はClaude Codeメモリ戦略完全ガイドを参照してください。

オートコンパクティングを無効化する

特定のユースケースでオートコンパクティングを完全に無効化したい場合は、~/.claude.jsonsettings.jsonではなく.claude.json)に設定を追加します。

settings.jsonにautoCompactEnabled: falseを書いても無視されます(スキーマ未定義のため)。必ず~/.claude.jsonに書いてください。
~/.claude.json(オートコンパクティング無効化)
{
  "autoCompactEnabled": false
}

無効化した場合は、コンテキストが100%に達するとセッションが強制終了します。/wrapup/clearワークフローを手動で管理するか、定期的に/compactを実行してください。

対策まとめ:優先度別チェックリスト

優先度 対策 効果 手間
★★★ CLAUDE.mdにCompact Instructionsを書く 毎回注入・コンパクション後も保持
★★★ 作業区切りで手動/compactを実行 要約品質を制御できる
★★ CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=75に設定 品質劣化ゾーン手前で圧縮 低(設定一度のみ)
★★ /wrapup→/clear→/catchupワークフロー 完全リセットで確実に状態引き継ぎ
大きな出力をファイルに逃がす コンテキスト消費を節約
Auto Memory/Memory MCPで外部記憶 コンパクションに依存しない記憶 高(初期設定)

よくある質問

Qコンパクションが起きたことはどうやって分かりますか?
Aコンテキスト使用率が80%を超えたあたりでClaude Codeが警告を表示します。コンパクション後はコンテキスト使用量が大きく減少します。ccusageのstatuslineを設定していると「? 25,000 (12%)」のようにリアルタイムで確認できます。設定方法はsettings.jsonのstatusLine.commandnpx -y ccusage statuslineを指定するだけです。
QCLAUDE.mdとCompact Instructionsの内容は重複してもいいですか?
A積極的に重複させるべきです。通常のCLAUDE.mdは毎回読まれますが、Compact Instructionsは「コンパクション要約時の観点」を指示します。「絶対に守る設計方針」を本文にも書き、Compact Instructionsでも「Preserve the design constraints」と書くことで二重の保護になります。
QCLAUDE_AUTOCOMPACT_PCT_OVERRIDEを83より大きい値(例:90)に設定したら遅くなりますか?
Aなりません。内部実装でMath.min(指定値, デフォルト値)が適用されるため、83.5より大きい値を指定しても83.5のまま動作します。閾値を遅らせることは現在の仕様では不可能です。
Q/compactをよく打つとコストが増えますか?
Aコンパクション自体にもトークン消費があります(要約生成のため)。ただし、コンテキストが大きい状態でのレスポンス生成の方がトークン消費が大きいため、早めにコンパクトした方がトータルで安くなることが多いです。コスト管理の全体像はコスト管理完全ガイドを参照してください。
Qコンパクション後に「さっきの話を覚えていますか?」と聞いてもダメですか?
A効果は限定的です。「要約に含まれていれば」思い出せますが、落ちた情報は本当に消えています。確実なのは、コンパクション前の対策(CLAUDE.md・手動/compact・/wrapup)です。コンパクション後に気づいた場合は、重要な前提を明示的に再度伝えてから作業を続けてください。
Q/rewindコマンドとはなんですか?
A/rewindはコンパクション前の会話状態に戻すコマンドです。コンパクションが起きた直後であれば、以前のチェックポイントに巻き戻せます。ただしコンパクション発動から時間が経つと使えなくなります。気づいた直後に試してみる価値はあります。