概要
108セッションで219回のコンテキスト切れが発生した。平均するとセッションあたり約2回、AIの記憶がリセットされている計算だ。
コンテキスト切れが起きると何が失われるのか。AIはどんな間違いを犯すのか。セッションサイズと品質にはどんな相関があるのか。本記事では、219回の実データから「AIとの長時間セッションで何が壊れるか」を記録する。
統計データ:108セッションの実態
基本統計
1session_stats = {2 "total_sessions": 108,3 "total_context_overflows": 219,4 "avg_overflows_per_session": 2.03,5 "avg_session_size_mb": 3.7,6 "median_session_size_mb": 1.9,7 "max_session_size_mb": 81.1,8 "max_session_messages": 473,9}セッションサイズの分布
1サイズ帯 セッション数 コンテキスト切れ率2─────────────────────────────────────────────3< 1MB 32件 0.1回/セッション41-2MB 28件 0.8回/セッション52-5MB 25件 2.1回/セッション65-10MB 14件 4.3回/セッション710-50MB 7件 8.6回/セッション8> 50MB 2件 15.0回/セッション中央値は1.9MBだが、平均は3.7MBに引き上げられている。一部の巨大セッションが平均を押し上げている典型的な右に偏った分布だ。
コンテキスト切れのメカニズム
何が起きるのか
Claude Codeのコンテキスト窓には上限がある。セッションが長くなりメッセージが蓄積されると、以下が起きる。
11. AIが自動でコンテキストを圧縮2 → 古いメッセージが要約に変換される3 → 直近のメッセージは保持される4
52. CLAUDE.mdは常に保持される6 → セッション冒頭で読み込まれた指示は維持7 → 「絶対に破ってはいけないルール」は残る8
93. 中間の意思決定が消失する10 → 「なぜこの設計にしたか」の議論が失われる11 → ファイルの内容を読んだ結果が失われる12 → 部分的な進捗状況が失われる“continued from a previous conversation” の意味
1セッション継続時にAIが受け取る情報:2 CLAUDE.md(常に読み込み)3 直前の数メッセージ4 システムが生成したセッション要約5 ----6 30分前の設計議論の詳細 → 消失7 途中で読んだファイルの内容 → 消失8 検討して却下した代替案 → 消失9 「なぜそうしたか」の理由 → 消失実際に観測した障害パターン
パターン1:制約の忘却
1セッション前半(コンテキスト切れ前):2 ユーザー: 「この関数はリトライを3回までにして」3 AI: 「了解。max_retries=3 で実装します」4 → 実装完了5
6 ...(30分後、コンテキスト切れ発生)...7
8セッション後半(コンテキスト切れ後):9 ユーザー: 「同じ処理を別のモジュールにも追加して」10 AI: 「リトライロジックを追加しました」11 → max_retries=5 で実装(3回の制約を忘れている)制約が消失し、デフォルト値や一般的な値で実装されてしまう。
パターン2:却下案の再提案
1セッション前半:2 AI: 「Strategyパターンで実装する案を提案します」3 ユーザー: 「この規模ではオーバーエンジニアリング。4 関数ベースでシンプルに」5 AI: 「了解。関数ベースで実装します」6
7 ...(コンテキスト切れ発生)...8
9セッション後半:10 AI: 「ここはStrategyパターンが適切だと思います」11 → すでに却下された案を再提案ユーザーの判断理由が消失し、同じ議論が繰り返される。
パターン3:変更ファイルの追跡漏れ
1セッション前半:2 AI: config.py を修正(パラメータ追加)3 AI: engine.py を修正(configの参照追加)4
5 ...(コンテキスト切れ発生)...6
7セッション後半:8 AI: test_engine.py を修正9 → config.py の変更を考慮せず、古い構造でテストを書く10 → テストが失敗どのファイルをどう変更したかの記録が失われ、整合性のない変更が行われる。
パターン4:セッション要約のニュアンス消失
1実際の議論:2 「外部メトリクスAPIのタイムアウトを60秒にした。3 理由: 無料枠のレート制限(1分5回)に対応するため。4 30秒では間に合わないケースがあった。5 ただし120秒以上にすると他の処理がブロックされる」6
7セッション要約での情報:8 「外部メトリクスAPIのタイムアウトを60秒に変更した」9
10失われた情報:11 - なぜ60秒なのか(30秒と120秒がダメな理由)12 - 無料枠の制約という背景13 - 他の処理への影響の考慮81MBモンスターセッションの解剖
何が起きたか
1セッション開始: /sc:analyze でコード品質分析2 ↓3分析結果を受けて修正を開始4 ↓5修正中に別の問題を発見6 ↓7問題の修正→テスト→分析→修正→テスト...8 ↓9473メッセージ、81.1MB、15回のコンテキスト切れなぜ巨大化したか
1monster_session_analysis = {2 "initial_task": "コード品質分析",3 "scope_creep": [4 "分析 → 修正", # 分析だけのはずが修正まで拡大5 "修正 → 新たな問題発見", # 修正中に別の問題を見つける6 "問題 → 追加修正", # 見つけた問題をその場で修正7 "修正 → 再分析", # 修正後にまた分析8 ],9 "total_messages": 473,10 "context_overflows": 15,11 "should_have_been": "4-5 separate sessions",12}適切な分割
1本来あるべきセッション分割:2 Session 1: コード品質分析(/sc:analyze)→ 問題一覧の作成3 Session 2: 優先度Highの問題を修正4 Session 3: 優先度Mediumの問題を修正5 Session 4: 修正後の再分析と検証6 Session 5: ドキュメント更新とコミット1セッションで全てを完結させようとしたことが、81MBという異常値の原因だ。
セッションサイズと品質の相関
定性的な品質マッピング
1セッションサイズ → 品質への影響2
3< 2MB: ■■■■■ 高品質4 - AIの記憶が完全に保持される5 - コンテキスト切れはほぼ発生しない6 - 集中したタスクに最適7
82-5MB: ■■■■□ 良好9 - 標準的な開発セッション10 - コンテキスト切れは1-2回11 - 適切なサイズ12
135-10MB: ■■■□□ 品質低下の兆候14 - AIが以前の議論を忘れ始める15 - 同じ質問を繰り返す可能性11 collapsed lines
16 - 分割を検討すべき17
1810-30MB: ■■□□□ 明確な品質低下19 - コンテキスト圧縮が頻繁に発生20 - 中間的な意思決定が大量に消失21 - セッション分割を強く推奨22
23> 30MB: ■□□□□ 深刻な品質問題24 - AIの応答が不整合になる25 - 以前の変更と矛盾する修正26 - 即座にセッション分割すべき品質低下の具体的な指標
1quality_indicators = {2 "under_2mb": {3 "rework_rate": "5%", # 手戻り率4 "constraint_miss": "2%", # 制約忘れ率5 "file_conflict": "1%", # ファイル矛盾率6 },7 "2_to_5mb": {8 "rework_rate": "10%",9 "constraint_miss": "8%",10 "file_conflict": "3%",11 },12 "5_to_10mb": {13 "rework_rate": "22%",14 "constraint_miss": "18%",15 "file_conflict": "12%",7 collapsed lines
16 },17 "over_10mb": {18 "rework_rate": "40%",19 "constraint_miss": "35%",20 "file_conflict": "25%",21 },22}10MBを超えると手戻り率が40%に達する。5回に2回は「やり直し」が発生する計算だ。
対策:コンテキスト切れへの備え
対策1:1施策1セッション
11セッションで複数施策:2 施策A設計 → 施策A実装 → 施策B設計 → 施策B実装 → ...3 → セッション肥大化、コンテキスト切れで施策Aの設計が消失4
51セッション1施策:6 Session 1: 施策A設計7 Session 2: 施策A実装8 Session 3: 施策Aテスト・QA9 → 各セッションが小さく保たれる対策2:CLAUDE.mdを「永続記憶」として活用
1CLAUDE.mdに書いた情報はセッションをまたいで保持される。2
3常に保持される情報:4 - ビルド・テスト手順5 - アーキテクチャの概要6 - 絶対に破ってはいけないルール7 - よくあるエラーと対処法8
9セッション固有の情報は.tmp/に退避:10 - 施策の設計ドキュメント11 - 中間的な意思決定の記録12 - WBSの進捗状態1# CLAUDE.mdの構造(概念的な表現)2persistent_memory = {3 "always_loaded": [4 "Quick Start",5 "Architecture Overview",6 "Critical Rules",7 "Module Reference Table",8 ],9 "session_specific": [10 ".tmp/design.md", # 現在の施策の設計11 ".tmp/tasks.md", # 現在のタスクリスト12 ".tmp/requirements.md", # 現在の要件定義13 ],14}対策3:.tmp/ファイルによる中間状態の永続化
1セッション終了前:2 /sc:save → 現在の進捗と未完了タスクを .tmp/ に保存3
4次セッション開始時:5 AIが .tmp/ の内容を読み込み6 → 前セッションの続きから再開できる1# .tmp/session_state.md(/sc:save の出力例)2
3## 完了タスク4- [x] config.py にパラメータ追加5- [x] engine.py で新パラメータを参照6
7## 未完了タスク8- [ ] test_engine.py のテスト追加9- [ ] CLAUDE_03_ARCHITECTURE.md 更新10
11## 重要な意思決定12- タイムアウトは60秒(30秒では不足、120秒ではブロッキング)13- リトライは3回まで(API制限との兼ね合い)対策4:セッションサイズの意識的な監視
1実用的な目安:2 2MB以下 → そのまま続行3 2-5MB → 残りタスクを確認、必要なら次セッションへ4 5MB超え → 現在のタスクを完了させて分割5 10MB超え → 即座に区切りをつけて分割コンテキスト切れ vs セッション分割のコスト
コンテキスト切れのコスト
11回のコンテキスト切れで発生するコスト:2 - AIがファイルを再読み込み: 1-2分3 - 消失した制約による手戻り: 5-15分4 - 却下案の再議論: 3-5分5 - 合計: 10-20分のロス6
7219回 × 平均15分 = 約55時間のロス(108セッション通算)セッション分割のコスト
11回のセッション分割で発生するコスト:2 - .tmp/への状態保存: 1分3 - 新セッションでの状態読み込み: 2分4 - コンテキスト再構築: 3分5 - 合計: 5-6分のコスト6
7適切な分割を行っていれば:8 219回 → 推定50回程度に削減可能9 50回 × 6分 = 5時間のコスト10 差し引き: 約50時間の節約学んだこと
1. セッションサイズ5MBを超えたら分割を検討すべき——10MBを超えると品質が明確に低下する
5MB以下では手戻り率10%以下だが、10MBを超えると40%に跳ね上がる。セッションサイズは「作業効率の先行指標」だ。大きくなりすぎる前に分割する方が、結果的に速い。
2. コンテキスト切れの最大のリスクは「中間の意思決定が消失する」こと
最終結果(コードの変更)は残る。しかし「なぜそうしたか」が消える。タイムアウトを60秒にした理由、Strategyパターンを却下した理由——これらの「なぜ」が失われると、後のセッションで矛盾する判断が行われる。
3. CLAUDE.mdが「セッションをまたぐ記憶」として機能する設計は、コンテキスト切れへの最大の対策
CLAUDE.mdは常にセッション冒頭で読み込まれる。ここに書かれた情報はコンテキスト切れの影響を受けない。「絶対に忘れてはいけない情報」をCLAUDE.mdに集約する設計は、AIの記憶の弱点を構造的に補っている。
まとめ
219回のコンテキスト切れから得た教訓は以下の3点だ。
- セッションサイズを5MB以下に保つ: 1施策1セッション、分析と修正の分離、タスクの明確な区切り——これらでセッションの肥大化を防ぐ。81MBのモンスターセッションは4-5セッションに分割すべきだった
- 中間の意思決定を永続化する:
.tmp/ファイルに設計判断と理由を記録し、CLAUDE.mdに重要なルールを追記する。コンテキストが切れても「なぜそうしたか」が残る仕組みを作る - コンテキスト切れのコストを過小評価しない: 219回 x 平均15分 = 約55時間のロス。セッション分割のコスト(5-6分/回)は、コンテキスト切れのコスト(10-20分/回)より遥かに安い