1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeのセッション再開で$342消えた——トークン爆発を防ぐ2つのhook

1
Last updated at Posted at 2026-06-14

セッション再開しただけで$342

GitHub Issueに衝撃的な報告が上がった。

#38029——ユーザーがセッションを再開しただけで、65万出力トークンが一瞬で消えた。$342。ユーザーは何も入力していない。再開しただけだ。

「resume my last session」と打った。それだけで$342が溶けた。

同じ事故が複数報告されている

この手の事故は1件ではない。

  • #38239(32リアクション)——セッション再開後にトークン消費が急増
  • #37917(35リアクション)——再開時のコンテキスト復元でコストが跳ね上がる

共通するパターンは「コンテキストの肥大化」だ。長時間セッションで会話履歴が膨らみ、再開時にその全量がコンテキストウィンドウに流し込まれる。モデルは巨大なコンテキストを処理しようとして、大量の出力トークンを生成する。

結果、ユーザーの意図しないコスト爆発が起きる。

なぜ起きるか

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.mdtasks/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)の並行運用・サブエージェントの沈黙の失敗対策など、テーマ別の手引きを公開しています。気になる人は著者の本の一覧から、価格と評価を見て選べます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?