環境
- Claude Code(Max プラン、2026-05 〜現在 daily 運用)
- 複数リポジトリ横断セッション(sns-automation / masatoman.net)
- OS: macOS / Linux(GitHub Actions 経由含む)
何が起きたか
Claude Code のコンテキスト使用量が 100% に近づくと、auto compact(自動コンテキスト圧縮) が走ります。圧縮後に Claude が「さっき決めたこと」を忘れ、前の指示と違うコードを生成し始める事象を複数回確認しました。
GitHub Issues でも独立した複数の報告があります(#66144 等)。
疑った原因(外れ)
最初は「モデルの調子が悪い日がある」と思っていましたが、関係ありませんでした。
次に「CLAUDE.md の設定が悪い」を疑いましたが、セッション頭では正常だったため原因ではありませんでした。
実際の原因
コンテキストが 100% に達した後の auto compact です。
compact の仕組み:
- 会話履歴を自動要約に置き換える
- 以降の Claude は「要約から推測した前提」で動く
- 要約には直前の詳細な指示・制約が入らないことがある
結果として、compact 前と compact 後で Claude の前提がズレます。特に長時間のルーティン実行中(複数リポジトリ横断など)に起きやすい。
回避策1:PreCompact hook でログを退避する
compact が走る直前に、セッションの生ログを _inbox/ にコピーする hook を実装しました。
# ~/.claude/hooks/precompact-backup.sh
#!/bin/bash
INBOX="$HOME/_inbox/claude-sessions"
mkdir -p "$INBOX"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
SESSION_LOG="$HOME/.claude/current-session.jsonl"
if [ -f "$SESSION_LOG" ]; then
cp "$SESSION_LOG" "$INBOX/session_${TIMESTAMP}.jsonl"
echo "PreCompact backup: $INBOX/session_${TIMESTAMP}.jsonl"
fi
// ~/.claude/settings.json
{
"hooks": {
"PreCompact": [
{
"type": "command",
"command": "bash ~/.claude/hooks/precompact-backup.sh"
}
]
}
}
compact 後に挙動がズレたら _inbox/ の最新ファイルを確認し、失われた前提を Claude に再共有できます。
回避策2:コンテキスト 80% で手動 /compact を打つ
auto compact に任せず、自分でタイミングを制御します。
| コンテキスト使用量 | アクション |
|---|---|
| 〜60% | 通常作業 |
| 60〜80% | 次フェーズに必要な情報を整理し始める |
| 80%〜 | 手動 /compact + 「次のタスクは〇〇」を明示して実行 |
| 100% | auto compact が走る。状態 drift のリスク高 |
手動 compact の前に「次に続けるタスクは〇〇です。この前提を要約に含めてください」と伝えると、情報損失を減らせます。
回避策3:1タスク1セッション設計
根本解は「1セッション内のスコープを小さくする」ことです。
❌ 悪い例:調査→設計→実装→push を1セッションで完結
✅ 良い例:「調査セッション」と「実装セッション」に分割
CLAUDE.md に「不要ファイルを読まない」制約を書いておくとコンテキスト消費が減り、compact 到達を遅らせられます。
まとめ
- auto compact 後の state drift は「モデルの調子」ではなく仕様上の挙動
- PreCompact hook で「圧縮前ログの退避」を自動化する
- 80% で手動 /compact を打って「要約内容を自分でコントロール」する
- ルーティンは1実行のスコープを絞って構造で避ける
AI ツールを業務に組み込む設計の実験ログを書いています。 https://masatoman.net