45395 - シコウサクゴ -

セッション設計:AIとの1セッションをどう区切るか

2026-04-03
AI駆動開発
AI駆動開発
Claude Code
セッション設計
コンテキスト管理
生産性
Last updated:2026-04-05
14 Minutes
2705 Words

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に書きます。

1
CLAUDE.mdに書くもの:
2
- 開発ルール(コーディング規約、禁止事項)
3
- ワークフロー定義(施策開始/完了の手順)
4
- QAワークフロー(commit前の自動チェック)
5
- リスク検出ルール(本番影響、データ変更)
6
7
CLAUDE.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
3
NEW-11(リトライ上限の自動調整):
4
ステータス: B-8(実装中)
5
進捗: 設計完了、コア実装完了、テスト15/24件作成
6
残作業: テスト9件追加、QAワークフロー実行、PR作成
7
ブランチ: feature/auto-adjust-retry-limit
8
最終更新: 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
# 回帰テストの結果を永続化する例
2
import json
3
from pathlib import Path
4
5
6
def 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セッション: スコープを限定し、コンテキストウィンドウを施策1つ分に収めます。複数施策の同時着手は、コンフリクト・コンテキスト汚染・追跡困難を引き起こします
  2. 情報の永続化設計: CLAUDE.md(自動読み込み)・WBS(進捗管理)・.tmp/(一時メモ)・ADR(設計判断)に情報を分散配置し、コンテキスト圧縮の影響を最小化します
  3. セッション終了時のWBS更新: セッション間の情報引き継ぎはWBSが担います。終了時の更新を怠ると、次セッションで情報が失われ、手戻りが発生します

セッションの区切り方は、AIとの協働における基礎設計です。ここを雑にすると、どれだけ優秀なAIでも長期プロジェクトで品質を維持できません。

Article title:セッション設計:AIとの1セッションをどう区切るか
Article author:45395
Release time:2026-04-03

記事へのご質問・ご感想をお聞かせください

フィードバックを送る