Weekly quota drained in hours: Fable auto-selection persists after opt-out + idle cache_read polling

Resolved 💬 1 comment Opened Jul 15, 2026 by MashimashiScript Closed Jul 15, 2026

Weekly quota drained in hours: Fable auto-selection persists after opt-out + idle cache_read polling

Summary

On the Max plan (VS Code extension + CLI), I burned through 1.37B cache_read tokens in 24h — with 665M of that on claude-fable-5 after I had explicitly opted out of Fable. This exhausted my weekly Fable sub-quota (~50% cap) and pushed my 5-hour session to 77% while I was barely typing. Two root causes appear to compound:

  1. Fable opt-out isn't persistent — the tengu-fable-off-switch GrowthBook flag flips back to activated=false across restarts, and the selected model is also baked into ~/.claude.json's clientDataCacheSlots.*.model, so even if I switch back to Opus via /model and restart, existing session slots resume on claude-fable-5.
  2. Idle sessions still generate cache_read charges — VS Code extension tabs left open (even with no user input) accumulate cache_read_input_tokens in ~/.claude/projects/*/*.jsonl at a rate that scales with tab count.

Because cache_read is billed at 10% but counted at 100% against weekly quota, this silently vaporizes the plan allocation.

Environment

  • Plan: Max ($200/mo tier — 3万円/月)
  • Platform: macOS 15 (Darwin 25.5.0), arm64
  • CLI: claude --version2.1.205
  • VS Code extension: 2.1.210
  • Multiple concurrent tabs (typical: 5–10 across projects)

Evidence

1. clientDataCacheSlots bakes model in per-session

Redacted snapshot of ~/.claude.json after user-initiated /model switch to Opus and full restart:

slot=bi1-6dfa...  model=claude-opus-4-7
slot=bi1-4e55...  model=claude-fable-5   ← survived opt-out until manually patched
slot=bi1-df2f...  model=claude-opus-4-7
slot=bi1-6525...  model=claude-fable-5   ← same

Flag state at the same moment:

"tengu-fable-off-switch": {"activated": true}

Even with the flag on, existing slots resumed on Fable. I had to write a SessionStart hook that rewrites every clientDataCacheSlots.*.model == "claude-fable-5" back to claude-opus-4-7 on every launch:

# ~/.claude/hooks/fable-off-guard.sh (workaround, should not be necessary)
python3 -c "
import json
p='/Users/yoshi/.claude.json'
d=json.load(open(p))
for _,slot in d.get('clientDataCacheSlots',{}).items():
    if isinstance(slot,dict) and slot.get('model')=='claude-fable-5':
        slot['model']='claude-opus-4-7'
json.dump(d, open(p,'w'), indent=2)
"

2. Idle cache_read consumption (measured from local jsonls)

Aggregating cache_read_input_tokens from ~/.claude/projects/*/*.jsonl for a 24h window (2026-07-14 12:15 → 2026-07-15 12:15 JST):

model                    cache_read tokens
claude-opus-4-7            705,185,419
claude-fable-5             665,735,433   ← this is entirely post-opt-out
TOTAL                    1,370,920,852

top sessions (each mostly idle, tab left open):
  katasumi        184,397,085
  physical-ai-crm 159,976,172
  routely         124,987,361
  salon-r         123,364,138
  lubepeak-chat   114,501,195

I was not actively working in most of these projects during this window — the extension tabs were just open. The cache_read counters kept climbing.

Repro

  1. Fresh VS Code with the Claude Code extension.
  2. Open 5+ project tabs, each running a Claude Code session.
  3. In /model, switch to claude-opus-4-7. Restart.
  4. Observe ~/.claude.json → several clientDataCacheSlots.*.model remain claude-fable-5.
  5. Leave the tabs idle for a few hours. Do not type.
  6. Check ~/.claude/projects/*/*.jsonlcache_read_input_tokens keeps accumulating on entries with "model": "claude-fable-5".
  7. Check Anthropic usage panel — weekly Fable sub-quota falls despite no typing and no Fable selection.

Ask

  • Make Fable opt-out truly persistent (flag + all slots + running workers).
  • Publish what the extension is doing during idle time and expose a way to disable ambient polling for users who prefer explicit cache warming.
  • Ensure cache_read billed at 10% is also counted at 10% (not 100%) against weekly quota, or at minimum document this clearly on the pricing/quota page.

Happy to attach a full jsonl sample and .claude.json (redacted) if useful.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗