Claude Code の課金の暴走を防ぐ

Claude Code はループに陥ると、数分で利用枠を丸ごと使い切ることがあります。このページは、実際に起きている問題と、それを止める hook を示します。

問題: 暴走するループ

実際の事故: 数分で利用枠の80%を消費

GitHub の起票 #38335(80以上の反応): Max プランのセッションの上限が異常に速く尽きるという報告。セッションの開始から数分で80%が消費されることもあった。

実際の事故: 使用量の爆発

GitHub の起票 #37917: 単純なタスクがセッションの予算を丸ごと消費する、極端なトークンの消費。

よくある原因:

解決1: 呼び出しの頻度の制限

tool-call-rate-limiter の hook は、呼び出しの頻度が閾値(既定: 60秒に30回)を超えると、道具の呼び出しを止めます。

#!/bin/bash
# tool-call-rate-limiter.sh — PreToolUse hook
RATE_FILE="${HOME}/.claude/rate-limiter.log"
MAX_CALLS="${CC_RATE_LIMIT_MAX:-30}"
WINDOW="${CC_RATE_LIMIT_WINDOW:-60}"

mkdir -p "$(dirname "$RATE_FILE")"
NOW=$(date +%s)
CUTOFF=$((NOW - WINDOW))

echo "$NOW" >> "$RATE_FILE"
RECENT=$(awk -v cutoff="$CUTOFF" '$1 >= cutoff' "$RATE_FILE" | wc -l)

awk -v cutoff="$CUTOFF" '$1 >= cutoff' "$RATE_FILE" > "${RATE_FILE}.tmp"
mv "${RATE_FILE}.tmp" "$RATE_FILE"

if [ "$RECENT" -gt "$MAX_CALLS" ]; then
    echo "BLOCKED: $RECENT calls in ${WINDOW}s (max: $MAX_CALLS)" >&2
    exit 2
fi
exit 0

解決2: 連続エラーの遮断

consecutive-error-breaker の hook は、N回(既定: 5回)連続で非ゼロの終了コードが続いたら警告し、行き詰まった再試行のループを検知します。

#!/bin/bash
# consecutive-error-breaker.sh — PostToolUse hook
EXIT_CODE=$(echo "$(cat)" | jq -r '.tool_result.exit_code // "0"')
STATE_FILE="/tmp/cc-error-streak"
MAX="${CC_ERROR_STREAK_MAX:-5}"

if [ "$EXIT_CODE" = "0" ]; then
    echo "0" > "$STATE_FILE"; exit 0
fi

CURRENT=$(cat "$STATE_FILE" 2>/dev/null || echo "0")
echo $((CURRENT + 1)) > "$STATE_FILE"

if [ $((CURRENT + 1)) -ge "$MAX" ]; then
    echo "⚠ $((CURRENT + 1)) consecutive errors. Try a different approach." >&2
fi
exit 0

解決3: 1日の使用量の追跡

daily-usage-tracker の hook は、すべての道具の呼び出しを記録し、節目(1日あたり100/250/500/1000回)で警告します。

3つとも入れる

1コマンドで、費用の保護の hook を含む734の例の hook が入ります:

npx cc-safe-setup --install-example tool-call-rate-limiter

npx cc-safe-setup --install-example consecutive-error-breaker

npx cc-safe-setup --install-example daily-usage-tracker

あるいは全部入れる: npx cc-safe-setup --shield

関連する hook

関連するページ

さらに詳しく: 事故防止の実践ガイド(Zenn) · English version · 全ツール