セッション再開しただけで$342
GitHub Issueに衝撃的な報告が上がった。
#38029——ユーザーがセッションを再開しただけで、65万出力トークンが一瞬で消えた。$342。ユーザーは何も入力していない。再開しただけだ。
「resume my last session」と打った。それだけで$342が溶けた。
同じ事故が複数報告されている
この手の事故は1件ではない。
共通するパターンは「コンテキストの肥大化」だ。長時間セッションで会話履歴が膨らみ、再開時にその全量がコンテキストウィンドウに流し込まれる。モデルは巨大なコンテキストを処理しようとして、大量の出力トークンを生成する。
結果、ユーザーの意図しないコスト爆発が起きる。
なぜ起きるか
Claude Codeはセッション再開時に過去の会話履歴を復元する。問題は、その履歴が際限なく膨らむことだ。
- ツール呼び出しの入出力がすべて履歴に残る
- ファイルの読み書き結果が丸ごと含まれる
- エラー→リトライのループがあると、同じ内容が何度も蓄積される
数時間のセッションを経ると、コンテキストは数十万トークンに達する。これを再開すると、モデルは「前回の続き」を再構築しようとして膨大な出力を生む。
hook 1: resume-context-guard——再開時のコンテキスト爆発を検知
セッション再開時に会話履歴ファイルのサイズを推定し、大きすぎれば警告する。
コード全文(resume-context-guard.sh)
#!/bin/bash
# resume-context-guard.sh
# トリガー: Notification(セッション再開の通知を検知)
# 目的: コンテキストが肥大化したセッションの再開前に警告
WARN_KB="${CC_CONTEXT_WARN_KB:-500}"
BLOCK_KB="${CC_CONTEXT_BLOCK_KB:-2000}"
# Claude Codeのセッションディレクトリ
SESSION_DIR="$HOME/.claude/projects"
if [ -z "$SESSION_DIR" ] || [ ! -d "$SESSION_DIR" ]; then
exit 0
fi
# 直近のセッションファイルを探す
LATEST=$(find "$SESSION_DIR" -name "*.jsonl" -type f -mmin -5 2>/dev/null | \
xargs ls -t 2>/dev/null | head -1)
[ -z "$LATEST" ] && exit 0
SIZE_KB=$(du -k "$LATEST" 2>/dev/null | cut -f1)
[ -z "$SIZE_KB" ] && exit 0
if [ "$SIZE_KB" -gt "$BLOCK_KB" ]; then
cat >&2 <<EOF
BLOCKED: Session context is ${SIZE_KB}KB (limit: ${BLOCK_KB}KB).
This session is too large to resume safely.
Run /compact first, or start a new session.
Cost risk: resuming a ${SIZE_KB}KB context can consume $50-300+ in tokens.
EOF
exit 2
fi
if [ "$SIZE_KB" -gt "$WARN_KB" ]; then
cat >&2 <<EOF
WARNING: Session context is ${SIZE_KB}KB (threshold: ${WARN_KB}KB).
Consider running /compact before continuing.
Large contexts increase cost and reduce response quality.
EOF
fi
exit 0
動作
| コンテキストサイズ | 動作 |
|---|---|
| 500KB以下 | 通常通り |
| 500KB〜2MB |
警告: /compactの実行を促す |
| 2MB超 | ブロック: 再開を止める |
閾値は環境変数で変更できる。
export CC_CONTEXT_WARN_KB=300 # 300KBで警告
export CC_CONTEXT_BLOCK_KB=1500 # 1.5MBでブロック
hook 2: output-explosion-detector——出力トークンの異常増加を検知
1回の応答が50KB超、またはセッション累計の出力が500KB超になったら警告する。$342事故は65万出力トークン——つまり約2.5MBの出力だった。50KBの閾値なら、爆発の初期段階で止められる。
コード全文(output-explosion-detector.sh)
#!/bin/bash
# output-explosion-detector.sh
# トリガー: PostToolUse
# 目的: 1回の出力サイズとセッション累計を監視
SINGLE_WARN_KB="${CC_OUTPUT_SINGLE_WARN_KB:-50}"
SESSION_WARN_KB="${CC_OUTPUT_SESSION_WARN_KB:-500}"
SESSION_BLOCK_KB="${CC_OUTPUT_SESSION_BLOCK_KB:-1000}"
STATE="/tmp/cc-output-explosion-$(echo "$PWD" | md5sum | cut -c1-8)"
# セッション累計を読み込み
SESSION_TOTAL=0
[ -f "$STATE" ] && SESSION_TOTAL=$(cat "$STATE" 2>/dev/null || echo 0)
# stdinからツール出力を読み取り、サイズを計算
INPUT=$(cat)
OUTPUT_BYTES=$(echo "$INPUT" | wc -c)
OUTPUT_KB=$((OUTPUT_BYTES / 1024))
# セッション累計を更新
SESSION_TOTAL=$((SESSION_TOTAL + OUTPUT_KB))
echo "$SESSION_TOTAL" > "$STATE"
# 1回の出力が大きすぎる
if [ "$OUTPUT_KB" -gt "$SINGLE_WARN_KB" ]; then
cat >&2 <<EOF
WARNING: Single output is ${OUTPUT_KB}KB (threshold: ${SINGLE_WARN_KB}KB).
Large outputs consume tokens rapidly. Check if the tool is dumping excess data.
EOF
fi
# セッション累計がブロック閾値を超えた
if [ "$SESSION_TOTAL" -gt "$SESSION_BLOCK_KB" ]; then
cat >&2 <<EOF
BLOCKED: Session output total is ${SESSION_TOTAL}KB (limit: ${SESSION_BLOCK_KB}KB).
Token explosion detected. Run /compact or start a new session.
EOF
exit 2
fi
# セッション累計が警告閾値を超えた
if [ "$SESSION_TOTAL" -gt "$SESSION_WARN_KB" ]; then
cat >&2 <<EOF
WARNING: Session output total is ${SESSION_TOTAL}KB (threshold: ${SESSION_WARN_KB}KB).
Consider running /compact soon.
EOF
fi
echo "$INPUT"
exit 0
動作
| 条件 | 動作 |
|---|---|
| 1回の出力 > 50KB | 警告 |
| セッション累計 > 500KB | 警告 |
| セッション累計 > 1MB | ブロック |
settings.json設定例
2つのhookをまとめて登録する。
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash ~/.claude/hooks/resume-context-guard.sh"
}
]
}
],
"PostToolUse": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash ~/.claude/hooks/output-explosion-detector.sh"
}
]
}
]
}
}
hookファイルの配置先は ~/.claude/hooks/ だ。ディレクトリがなければ作る。
mkdir -p ~/.claude/hooks
chmod +x ~/.claude/hooks/resume-context-guard.sh
chmod +x ~/.claude/hooks/output-explosion-detector.sh
予防策: hookを入れる前にできること
hookは防衛線だ。そもそもコンテキストを肥大化させない運用のほうが重要になる。
/compactを早めに実行する。 セッションが長くなってきたら、/compactで会話履歴を圧縮する。体感で30分以上の作業セッションなら、区切りのいいところで一度実行しておくといい。
大きなセッションは再開せず、新規で始める。 数時間に及ぶセッションの再開は常にリスクがある。必要な情報はCLAUDE.mdやtasks/todo.mdに書き出しておいて、新しいセッションで拾い直す方が安全だ。
--resumeフラグに注意する。 claude --resumeは直前のセッションをそのまま復元する。直前のセッションが巨大だった場合、再開した瞬間にコストが発生する。
まとめ
| 対策 | 効果 |
|---|---|
| resume-context-guard | 再開前にコンテキストサイズを検査 |
| output-explosion-detector | 出力トークンの異常増加を即座に検知 |
/compactの定期実行 |
コンテキスト肥大化の予防 |
| 巨大セッションの新規開始 | 再開リスクの回避 |
$342は高い授業料だ。hookを2つ入れるだけで、同じ事故は防げる。
hookの設定をもっと体系的に学びたい方は、Claude Code Hooks 実践ガイド(Zenn Book)で446本のhookパターンを解説している。
同じ事故防止本は Kindle 版(Amazon・¥800)でも読めます。Kindle Unlimited なら追加料金なしで全文読めるので、まず無料で中身を確かめたい方はそちらが早いです。
まず、自分のトークン消費がどこで膨らんでいるかは、無料のトークン消費チェックアップで30秒あたりをつけられます。無料で自分の浪費を確かめてから、下の本で全手順を読むのが早いです。
費用そのものを構造立てて減らしたい方は、Claude Codeのトークン費用を減らす運用ガイド(Zenn Book、¥2,500)が次の一歩になる。本記事の hook は再開時のトークン爆発を「止める」予防だが、こちらは普段の消費そのものを減らす側で、モデルの使い分け・文脈の圧縮・無駄な再読の削減を26章で整理している。
設定の安全診断だけなら、以下のコマンドで即座に実行できる。
npx cc-safe-setup
446のhook例と6,099のテストを収録。セッション再開の事故防止以外にも、rm -rfブロック、sudo禁止、DB削除防止など、Claude Codeの安全運用に必要なhookが揃っている。
ほかにも、800時間の運用データから、トークン消費の削減・複数ベンダー(Claude / Codex / Gemini / Copilot)の並行運用・サブエージェントの沈黙の失敗対策など、テーマ別の手引きを公開しています。気になる人は著者の本の一覧から、価格と評価を見て選べます。