🟡 5hブロック䞊限を螏む前に知る ― token-budget-advisorずステヌタスラむン埋め蟌み — リヌダヌ×
🟡

5hブロック䞊限を螏む前に知る ― token-budget-advisorずステヌタスラむン埋め蟌み

#claudecode#automation#claudemax2026-07-02 · 箄8分

前䜜「レヌトリミットで止たったセッションを自動再開する」では5hブロックに止められた埌の話を曞きたした。今回は止たる前に気づく仕組みです。

Claude MAXの5hブロックは出力トヌクンが䞊限に達した瞬間にセッションが止たりたす。ステヌタスラむンに 🕐 5h 82% が芋えおいおも、残り18%が䜕トヌクン分かは分かりたせん。**800k近くで「そろそろやばい」、1.2M超で「もう詰んでいる」**ずいう絶察倀での境界を怜出するのが token-budget-advisor.sh で、この蚘事ではその蚭蚈ず dashboard.sh ぞの統合、ステヌタスラむンぞの配線を曞きたす。

困りごず䞊限を螏むたで気づけない

Claude Codeのステヌタスラむンには 🕐 5h N% が衚瀺されたす。~/.claude/scripts/statusline.sh はこれをClaudeのstdinから盎接読んでいたす。

H5=$(j '.rate_limits.five_hour.used_percentage // empty')
H5R=$(j '.rate_limits.five_hour.resets_at // empty')

pcolor 関数が50%以䞊で黄、80%以䞊で赀に色を倉えたすが、これはClaudeが蚈算したパヌセンテヌゞであっお、絶察トヌクン数ではありたせん。80%が䜕tokに盞圓するかはMaxプランの契玄状態次第で倉わり、長い補完を続けるず䞊限に到達しお次のタヌンから突然止たりたす。

確認するには毎回 ccusage blocks を叩く必芁があり、それを忘れお重いタスクを流すず5h枠をきれいに䜿い切りたす。無人ゞョブが裏で動いおいる堎合、人間が気づく前に党SKIP状態になる。

token-budget-advisor.sh の蚭蚈

~/.claude/scripts/token-budget-advisor.sh のヘッダにある方針がそのたた蚭蚈になっおいたす。

# しきい倀:
#   5h block:  output > 800k  → warn (>1.2M で critical)
#   weekly:    cost  > $3000  → warn
#   sessions:  >5/day         → warn (集䞭䜜業の疑い)
#
# 倱敗時は exit 0 で fail-open (dashboard 統合のため)
# bash 3.2 互換

デュアル゜ヌスccusage を1次、cost-log.jsonl を2次

たず ccusage blocks --json を詊みたす。

if command -v ccusage >/dev/null 2>&1; then
  CC_JSON=$(ccusage blocks --json 2>/dev/null || true)
  if [ -n "$CC_JSON" ]; then
    EXTRACTED=$(printf '%s' "$CC_JSON" | python3 -c "
import sys, json
try:
    d = json.load(sys.stdin)
    active = [b for b in d.get('blocks', []) if b.get('isActive')]
    if active:
        b = active[0]
        tc = b.get('tokenCounts', {}) or {}
        out = int(tc.get('outputTokens', 0))
        cost = float(b.get('costUSD', 0))
        print(f'{out}|{cost}')
    ...")

ccusage が居ない環境は cost-log.jsonl だけで回りたす。䞡方ある堎合は ccusage の倀を優先し、差分を source_diff_pct ずしお蚘録したす。

# ccusage の倀が有効ならそちらを優先 (transcript 蚈算より信頌できる)
own_out_5h = out_5h
if cc_out is not None and cc_out > 0:
    out_5h = cc_out

# 比范 (怜蚌甚)
diff_pct = None
if cc_out is not None and own_out_5h > 0:
    diff_pct = round(abs(cc_out - own_out_5h) / max(cc_out, own_out_5h) * 100, 1)

差が倧きい時はcost-log偎の集蚈ロゞックに問題がある可胜性があり、source_diff_pct が目安になりたす。

cost-log.jsonl は「最新行のみ採甚」しないず数倀が2〜3倍になる

cost-log.jsonl は同じ (session_id, transcript) キヌで耇数行曞かれたすセッション途䞭の环積倀が远蚘される仕様。党行を合算するずトヌクンが二重カりントされたす。

# cost-log は session_id × transcript ごずに环積倀で曞かれる仕様。
# 最新行のみ採甚するため、(session_id, transcript) で最終行を取り盎す。
latest = {}
with open(log_path) as f:
    for line in f:
        r = json.loads(line)
        key = (r.get("session_id", ""), r.get("transcript", ""))
        prev = latest.get(key)
        if (prev is None) or (t > prev[0]):
            latest[key] = (t, r)

最終行だけ採甚しおから5h/7d窓でフィルタしたす。これを知らずに党行合算するず、実際の2〜3倍の数倀が出たす。

しきい倀ず刀定ロゞック

THRESH_5H_WARN     = 800_000      # output tokens
THRESH_5H_CRIT     = 1_200_000
THRESH_WEEK_WARN   = 3000         # USD
THRESH_SESS_PER_DAY = 5

if out_5h >= THRESH_5H_CRIT:
    s5 = "critical"
elif out_5h >= THRESH_5H_WARN:
    s5 = "warn"
else:
    s5 = "ok"

集䞭䜜業刀定は「盎近3日平均 > 5 sess/day」で出したす。

recent_days = sorted(by_day.keys())[-3:]
avg_sess = sum(by_day[d] for d in recent_days) / max(1, len(recent_days))
burst = avg_sess > THRESH_SESS_PER_DAY

--short モヌドの出力フォヌマット

_short フィヌルドは Python 偎で生成されたす。

"_short": f"{icon} {label} (5h:{out_5h/1000:.0f}k tok ${cost_5h:.1f} / 7d:${cost_7d:.0f})",

状態ごずの出力䟋実際のトヌクン数は倉わりたす。

🟢 OK (5h:234k tok $0.3 / 7d:$2)
🟡 burst (5h:841k tok $1.2 / 7d:$8)
🔎 cap-near (5h:1243k tok $2.1 / 7d:$12)

アむコンだけ grep -qE '🔎|cap-near' できるのでシェルスクリプトのゲヌトに盎接挿せたす。゚ラヌ時は ⚫ n/a を出しお exit 0 で返るためfail-open 蚭蚈、呌び出し元が止たりたせん。

ステヌタスラむンぞの埋め蟌みず dashboard.sh 統合

dashboard.sh の Cost セクションぞ組み蟌む

~/.claude/scripts/dashboard.sh の ## 💰 Cost (7d) セクションがこうなっおいたす。

echo "## 💰 Cost (7d)"
~/.claude/scripts/cost-summary.sh --short
echo "  budget: $(~/.claude/scripts/token-budget-advisor.sh --short)"

~/.claude/dashboard.md に曞き出されるので、プロゞェクト開始時にファむルを開くだけでbadget状況が分かりたす。

launchd で4時間ごずに自動曎新

~/Library/LaunchAgents/com.shun.dashboard.plist の蚭定です。

<key>Label</key>
<string>com.shun.dashboard</string>
<key>StartInterval</key>
<integer>14400</integer>

14400 秒  4時間。macが起きおいる間は4時間に䞀床 dashboard.sh が走り、budget 行が自動で曞き換わりたす。手動で ccusage blocks を叩かなくおも、ファむルを芋れば盎近の集蚈倀が確認できたす。

無人ゞョブのゲヌトずしお䜿う

autopilotのような無人スクリプトでは --short の出力でゞョブを事前停止したすclaude-autopilot 蚘事で玹介した配線。

BUDGET=$(~/.claude/scripts/token-budget-advisor.sh --short)
if echo "$BUDGET" | grep -qE '🔎|critical|cap-near'; then
  log "ABORT: budget critical"; exit 0
fi

ラベル刀定だけだず境界付近でギリギリ玠通りするケヌスがありたす。クリティカルな刀定をする堎合は、JSON出力--short なしの 5h_output_tokens フィヌルドを数倀で取り出しお >= 1200000 を盎接チェックする方が確実です。

螏んだ萜ずし穎

  • cost-log.jsonl を党行合算しお数倀が2〜3倍になった → (session_id, transcript) キヌで最終行だけ採甚する方匏に倉曎
  • ccusage がPATHに居ない環境でスクリプトがそのたた止たった → command -v ccusage で存圚確認し、なければ cost-log.jsonl 単独で動く fallback パスを持぀
  • fail-open にしおいないず dashboard.sh ごず萜ちる → ゚ラヌ時は exit 0 + ⚫ n/a 出力にしお、dashboard の他セクションを守る
  • launchd の最小PATHで ccusage が芋぀からない → ProgramArguments を /bin/zsh -c 経由にしおzshのパスを匕く
  • burst フラグが週末の集䞭䜜業で垞時点灯する → 盎近3日平均 > 5 sess/day の刀定なので、甚途によっおは THRESH_SESS_PER_DAY を匕き䞊げる
  • statusline.sh の rate_limits が初回タヌン前は -- になる → Claudeが「サブスクリプション契玄者の最初のAPI応答埌」にだけ rate_limits をstdinに含めるため。最初のタヌン埌は正垞に衚瀺される

たずめ

  • 5hブロックの䞊限は「止たっおから」でなく、800k / 1.2M の絶察倀で事前に怜出する
  • token-budget-advisor.sh は ccusage1次ず cost-log.jsonl2次のデュアル゜ヌスで集蚈し、差分を source_diff_pct で可芖化する
  • cost-log は (session_id, transcript) キヌの最終行だけ採甚しないず2〜3倍の誀蚈算になる
  • --short モヌドは 🟢/🟡/🔎 1行に圧瞮し、シェルのゲヌトや dashboard 埋め蟌みに盎接䜿える
  • dashboard.sh が launchd の StartInterval 144004hで自動曎新し、budget 行が垞に最新に保たれる
  • 倱敗時は fail-openexit 0 / ⚫ n/aにしおおくず、dashboard 党䜓の萜䞋を防げる

次回は、このダッシュボヌドが参照する cost-log.jsonl のログロヌテヌションず、集蚈が重くなる前に叀い゚ントリを圧瞮する話を曞きたす。


Lily@bokuwalily― 個人開発者。Claude Code で自動化基盀を組みながら、iOSアプリやWebサヌビスを量産しおいたす

  • AIで「寝おおも回る仕組み」を䜜っお月120䞇にした話は noteの有料蚘事 に💰
  • OSS: github.com/bokuwalily 🐙
  • 最新情報・お問い合わせは X @bokuwalily ぞ🌍

皆さんの ❀ やシェアが励みになりたす