Weekly quota drained in hours: Fable auto-selection persists after opt-out + idle cache_read polling
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:
- Fable opt-out isn't persistent — the
tengu-fable-off-switchGrowthBook flag flips back toactivated=falseacross restarts, and the selected model is also baked into~/.claude.json'sclientDataCacheSlots.*.model, so even if I switch back to Opus via/modeland restart, existing session slots resume onclaude-fable-5. - Idle sessions still generate cache_read charges — VS Code extension tabs left open (even with no user input) accumulate
cache_read_input_tokensin~/.claude/projects/*/*.jsonlat 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 --version→ 2.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
- Fresh VS Code with the Claude Code extension.
- Open 5+ project tabs, each running a Claude Code session.
- In
/model, switch toclaude-opus-4-7. Restart. - Observe
~/.claude.json→ severalclientDataCacheSlots.*.modelremainclaude-fable-5. - Leave the tabs idle for a few hours. Do not type.
- Check
~/.claude/projects/*/*.jsonl—cache_read_input_tokenskeeps accumulating on entries with"model": "claude-fable-5". - 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_readbilled 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.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗