Claude Codeとの作業には「セッション」という暗黙の区切りがあります。セッションが長くなるとコンテキストウィンドウが埋まり、AIが初期の指示を忘れ、エラーが増えます。
この問題に対して「1施策1セッション」の原則を導入しました。セッションの開始・終了を明確に定義し、セッションをまたぐ情報はCLAUDE.mdとWBSに永続化する設計です。これにより、セッション途中でコンテキストが圧縮されても、重要な情報が失われなくなりました。
問題:長いセッションで何が起きるか
コンテキストウィンドウの飽和
1セッション開始(コンテキスト使用率: 5%)2 ↓ CLAUDE.md読み込み3 ↓ WBS読み込み4 ↓ 施策Aの要件定義5 ↓ 施策Aの設計6 ↓ 施策Aの実装(コード量が多い)7 ↓ テスト実行結果の確認8 ↓ ---- コンテキスト使用率: 60% ----9 ↓ 施策Bの要件定義10 ↓ 施策Bの設計11 ↓ 施策Bの実装12 ↓ ---- コンテキスト使用率: 90% ----13 ↓ 施策Cに着手しようとするが...14 ↓ Claudeが施策Aで定義した制約を忘れている15 ↓ 施策AとCで矛盾するコードが生成されるコンテキストウィンドウは有限です。Claudeは古いメッセージを自動的に圧縮しますが、圧縮された情報は詳細を失います。特に「施策Aで定義した制約」のような暗黙の文脈は圧縮時に消えやすくなっています。
実際に起きた事故
1事故: 1セッションで3施策に着手した結果2 1. 施策A(フィルター追加)で config.py を修正3 2. 施策B(バッチサイズ最適化)で同じ config.py を別の方向に修正4 3. 施策C(ログ改善)で logger.py を修正5 4. 施策Bのテストが施策Aの変更を前提としていなかった6 5. マージ時にコンフリクト発生7 6. コンフリクト解消中に施策Aの変更が消失8 7. 本番でフィルターが無効化 → 16日間気づかず1セッションに複数施策を詰め込んだことが根本原因でした。
解決策:1施策1セッション
セッションのライフサイクル
1セッション開始2 ↓ A-1: ブランチ作成3 ↓ A-2: CLAUDE.md/WBS読み込み → 施策内容把握4 ↓ A-3: 競合チェック → ユーザー確認5 ↓ B-4〜B-7: 仕様→設計→テスト設計→タスク6 ↓ B-8: 実装・テスト(QA自動実行)7 ↓ C-9〜C-11: ドキュメント移動→デプロイ手順書→PR作成8セッション終了1つの施策をセッション開始から完了まで一気に進めます。施策の途中で別の施策に手を出しません。
なぜ1施策1セッションが最適か
1✅ 1施策1セッション2 - スコープが明確: このセッションで何を達成するかが決まっている3 - コンテキスト窓に余裕: 1施策分のコード・テスト・ドキュメントで収まる4 - クリーンなブランチ: feature/{施策名} ブランチに変更が集約される5 - 追跡可能: 「このPRはこの施策」と1対1対応6
7❌ 1セッションで3施策に着手8 - コンテキスト窓が溢れる9 - 施策Aの変更が施策Bに影響10 - マージコンフリクト発生11 - PRに複数施策が混在し、レビュー困難コンテキスト管理の設計
CLAUDE.md: セッションをまたぐ記憶
CLAUDE.mdは毎セッション開始時に自動で読み込まれます。そのため、「セッションをまたいで保持すべき情報」はすべてCLAUDE.mdに書きます。
1CLAUDE.mdに書くもの:2 - 開発ルール(コーディング規約、禁止事項)3 - ワークフロー定義(施策開始/完了の手順)4 - QAワークフロー(commit前の自動チェック)5 - リスク検出ルール(本番影響、データ変更)6
7CLAUDE.mdに書かないもの:8 - 個別施策の詳細(→ WBS, .docs/)9 - 一時的な設計メモ(→ .tmp/)10 - 実行結果やログ(→ Git commit message, PR)ドキュメントの参照タイミング
すべてのドキュメントをセッション開始時に読み込むとコンテキストを圧迫します。必要なときに必要なものだけ読み込む設計にしています。
1| ドキュメント | いつ参照するか | サイズ目安 |2|-----------------|------------------------|-----------|3| CLAUDE.md | セッション開始時(自動) | 3-5KB |4| .wbs/CURRENT.md | A-2(施策内容把握) | 2-3KB |5| .docs/NNN_*.md | B-4(要件定義)で必要な分 | 1-2KB/件 |6| .tmp/*.md | B-5〜B-7で順次生成 | 1-3KB/件 |7| ADR | 設計判断が必要なとき | 0.5-1KB/件 |CLAUDE.mdは自動読み込みですが、それ以外はオンデマンドです。これにより、セッション開始時のコンテキスト消費を最小限に抑えます。
WBS: セッション間の進捗引き継ぎ
WBS(.wbs/CURRENT.md)はセッション終了時に必ず更新します。次のセッションでA-2(施策内容把握)を実行したとき、前セッションの進捗を正確に把握するためです。
1# WBSの更新例2
3NEW-11(リトライ上限の自動調整):4 ステータス: B-8(実装中)5 進捗: 設計完了、コア実装完了、テスト15/24件作成6 残作業: テスト9件追加、QAワークフロー実行、PR作成7 ブランチ: feature/auto-adjust-retry-limit8 最終更新: 2026-03-27 セッション2この情報がなければ、次セッションのAIは「どこまで進んだか」を把握できません。
アンチパターン:複数施策セッション
典型的な失敗パターン
1❌ パターン1: 「ついでに」2 「施策Aの実装中にバグを見つけたので、ついでに修正」3 → 修正が施策Aのブランチに混入4 → PRのスコープが曖昧になる5
6 ✅ 対策: バグはissueに記録し、別セッションで修正7
8❌ パターン2: 「待ち時間に」9 「テスト実行中に暇だから、施策Bの設計を始めよう」10 → コンテキストに施策A + 施策Bの情報が混在11 → AIが施策Aの制約を施策Bに適用してしまう12
13 ✅ 対策: テスト実行中は結果を待つ。設計メモは別ファイルにメモだけ14
15❌ パターン3: 「似ているから一緒に」5 collapsed lines
16 「施策Cと施策Dは関連が深いから1セッションで」17 → 2施策分のコンテキストでウィンドウ圧迫18 → 後半で品質低下19
20 ✅ 対策: 関連施策でも別セッション。依存関係はWBSで管理セッション中断への対処
計画的な中断
長時間の回帰テストなど、セッション内で完了しない処理がある場合です。
1対処フロー:2 1. 実行中の処理の状態を記録3 - 何を実行しているか4 - 完了条件は何か5 - 結果をどこに保存するか6 2. WBSを更新(「B-8: 回帰テスト実行中、結果待ち」)7 3. セッションを終了8 4. 処理完了後、新セッションで結果を確認して続行1# 回帰テストの結果を永続化する例2import json3from pathlib import Path4
5
6def save_test_checkpoint(7 measure_id: str,8 completed_modules: list[str],9 remaining_modules: list[str],10 results_so_far: dict[str, float],11) -> Path:12 """回帰テストの中間結果を保存"""13 checkpoint = {14 "measure_id": measure_id,15 "completed_modules": completed_modules,7 collapsed lines
16 "remaining_modules": remaining_modules,17 "results_so_far": results_so_far,18 "timestamp": "2026-03-27T15:30:00",19 }20 path = Path(f".tmp/test_checkpoint_{measure_id}.json")21 path.write_text(json.dumps(checkpoint, indent=2, ensure_ascii=False))22 return path緊急中断
予期しないセッション中断(ネットワーク切断、マシンスリープなど)への備えです。
1緊急時の原則:2 1. WIPコミットを行う(git commit -m "WIP: {施策名} - {現在のステップ}")3 2. WBSに進捗を記録4 3. .tmp/ に現在の作業状態を保存5
6復旧時:7 1. 新セッション開始8 2. CLAUDE.md → WBS → .tmp/ の順に読み込み9 3. WIPコミットの差分を確認10 4. 中断箇所から再開コンテキスト圧縮と情報の永続化
Claudeの自動圧縮
Claudeはコンテキストウィンドウが限界に近づくと、古いメッセージを自動的に要約・圧縮します。この挙動は制御できません。
1圧縮で失われやすい情報:2 - 会話の序盤で定義した制約条件3 - コードの具体的な行番号や変数名4 - エラーメッセージの詳細5
6圧縮でも残りやすい情報:7 - 直近の作業内容8 - 繰り返し言及された重要なルール9 - CLAUDE.mdの内容(毎回読み込まれるため)永続化の戦略
1情報の種類 → 永続化先 → 復元方法2─────────────────────────────────────────────────3開発ルール → CLAUDE.md → 自動読み込み4施策の進捗 → .wbs/CURRENT.md → A-2で読み込み5設計判断 → ADR → 必要時に参照6一時的な設計メモ → .tmp/*.md → 必要時に参照7実装済みコード → Gitリポジトリ → ファイル読み込み8テスト結果 → CI/CDログ → 必要時に参照コンテキストウィンドウは「作業メモリ」であり、永続化先は「長期記憶」です。重要な情報を長期記憶に移すことで、コンテキスト圧縮の影響を最小化します。
セッション設計のチェックリスト
セッション開始時
1□ 1施策のみを対象とする2□ CLAUDE.md の自動読み込みを確認3□ WBSから施策の現在ステータスを把握4□ ブランチが正しいことを確認5□ 前セッションのWIP commitがあれば差分を確認セッション終了時
1□ WBSのステータスを更新2□ .tmp/ に作業中の設計メモがあれば保存3□ 未完了のタスクがあればWBSに残作業を記録4□ コミットメッセージに施策IDを含める5□ 次セッションで最初にやるべきことをWBSに記載学んだこと
1. 1施策1セッションが最も安全で効率的
複数施策を1セッションに詰め込む誘惑は強いものです。「ついでに」「待ち時間に」「似ているから」——どの理由も合理的に見えますが、コンテキスト汚染とブランチ混在のリスクを上回るメリットはありません。
2. CLAUDE.mdは「セッションをまたぐ記憶」として機能する
CLAUDE.mdに書かれた情報は毎セッション自動で読み込まれます。開発ルール・ワークフロー・禁止事項——セッションをまたいで一貫して適用されるべき情報をここに集約することで、セッション間の一貫性が保たれます。
3. セッション終了時のWBS更新を忘れると情報が失われる
コンテキストウィンドウは揮発性です。セッションが終了すれば消えます。WBSに進捗を書き込まずにセッションを終了すると、次のセッションでAIは「どこまで進んだか」を把握できません。結果、同じ作業を繰り返すか、中途半端な状態から誤った前提で作業を始めることになります。
まとめ
セッション設計で重要なのは以下の3点です。
- 1施策1セッション: スコープを限定し、コンテキストウィンドウを施策1つ分に収めます。複数施策の同時着手は、コンフリクト・コンテキスト汚染・追跡困難を引き起こします
- 情報の永続化設計: CLAUDE.md(自動読み込み)・WBS(進捗管理)・.tmp/(一時メモ)・ADR(設計判断)に情報を分散配置し、コンテキスト圧縮の影響を最小化します
- セッション終了時のWBS更新: セッション間の情報引き継ぎはWBSが担います。終了時の更新を怠ると、次セッションで情報が失われ、手戻りが発生します
セッションの区切り方は、AIとの協働における基礎設計です。ここを雑にすると、どれだけ優秀なAIでも長期プロジェクトで品質を維持できません。