[BUG] VS Code extension: Fable 5 blocked behind 'requires usage credits' on Max 5x plan - consent dialog never renders, /model hint is circular
Environment
- Extension: Claude Code for VS Code
2.1.220(anthropic.claude-code-2.1.220-win32-x64) - OS: Windows 11 Home 10.0.26200
- Plan: Claude Max 5x (
default_claude_max_5x) - plan includes Fable 5 at no extra usage cost (up to 50% of weekly quota) - Auth: re-logged in (
/login) to refresh tokens before reproducing; entitlement prompt unchanged
Expected behavior
Selecting Fable 5 from the model picker (or /model fable) on a Max 5x plan should either use the plan's included Fable allowance directly, or show the one-time Fable consent dialog and then proceed on plan usage.
Actual behavior
Every path to Fable via the UI/commands dead-ends in a "buy credits" wall:
- Model picker → Fable shows a blocking dialog:
> Fable 5 requires usage credits
> Fable 5 runs on usage credits, billed separately from your plan. You don't have usage credits yet. [Buy usage credits on claude.ai] [Switch to the default model and continue]
/model claude-fable-5(andclaude-fable-5[1m]) responds:
> Fable 5 uses usage credits and needs a one-time consent · pick Fable from /model in an interactive session to set it up
This instruction is circular: picking Fable from /model in an interactive session is exactly what produces the credits dialog from (1). There is no path where the "one-time consent" can actually be granted.
- The consent dialog itself never renders. The only dialog ever shown is the "Buy usage credits" one.
Workaround that proves entitlement is fine
Setting the default model in .claude/settings.json:
{ "model": "claude-fable-5" }
then fully restarting VS Code → new sessions run on Fable 5 with no credit prompt and no consent dialog, billed against the plan. So the account is entitled; only the interactive switching path is broken.
However: once in a Fable session, switching to any other model (e.g. /model sonnet) and then back to Fable re-triggers the credits dialog. The settings.json override is only honored at session start.
Attempts that did NOT help
- Re-login (
/login) to refresh tokens/entitlements - no change /model claude-fable-5and/model claude-fable-5[1m]from the prompt - both return the circular consent message- Restarting VS Code without the settings.json override - picker still shows the credits dialog
Investigation (minified extension bundle)
Traced through anthropic.claude-code-2.1.220-win32-x64/extension.js (minified bundle; positions are chunk offsets, not source lines):
Model registry entry (duplicated in chunks 54 and 190):
id:"claude-fable-5", ... context:{window:1e6, native_1m:!0, supports_1m_beta:!0}, ... pricing:"tier_10_50"
Fable carries a native 1M window (window:1e6, native_1m:!0) and supports_1m_beta:!0 at the same time. Compare Haiku 4.5's entry: context:{window:200000, supports_1m_suffix:!0} — a 200k default with a separate suffix-based opt-in. If any code path treats Fable's supports_1m_beta like a suffix-style opt-in and produces/matches the alias claude-fable-5[1m] literally, that would line up with the alias-resolution root cause described in #79337.
Runtime consent-gate flags found in the same bundle:
fableCreditsRequired
fableConsentSessionFallback
fableBridgeDialogTimedOut
fableConsentDialogInteracted
The naming strongly suggests the intended flow is: Fable access is gated behind a one-time consent dialog (fableConsentDialogInteracted), delivered over a bridge to the webview; if the bridge dialog times out or is never answered (fableBridgeDialogTimedOut), the session falls back (fableConsentSessionFallback) to fableCreditsRequired - i.e. the "buy credits" wall.
Hypothesis: in the VS Code extension the consent bridge dialog never renders (times out silently), so every interactive model switch falls into the credits-required fallback - regardless of actual plan entitlement. The settings.json path works because a session that starts on Fable never goes through the interactive consent bridge.
Plan/entitlement resolution itself (planSlug, weekly-quota gating) is not present in extension.js - it appears to be decided server-side or in the CLI core process, so the fallback misclassification may also be reproducible in plain CLI (the /model responses above suggest it is).
Related issues
- #79386 - original report of the credits prompt on Max
- #79337 - entitlement check failing to resolve
claude-fable-5[1m]-style aliases (literal string match) - #79412 -
/modelvs/usagedisplay inconsistency
The entitlement cluster reportedly started ~2026-07-20 when Fable 5 moved from promotional to standard Max-plan inclusion, and was reported fixed in late July - but 2.1.220 with fresh tokens still reproduces it as of 2026-07-28.
Repro steps
- Log in to Claude Code VS Code extension with a Max 5x account (no purchased usage credits)
- Open the model picker, select Fable 5
- Observe "Fable 5 requires usage credits" dialog - no consent dialog is ever offered
- Run
/model claude-fable-5→ observe the circular "pick Fable from /model in an interactive session" message - Set
"model": "claude-fable-5"in.claude/settings.json, restart VS Code → session runs Fable on plan usage, proving entitlement /model sonnetthen/model fable→ credits dialog returns
Resolution on my account (confirms the consent-gate hypothesis)
After running one or more sessions that started on Fable via the settings.json override, I reverted settings.json back to "model": "claude-sonnet-5" and restarted VS Code. Model switching from the UI (including to Fable and claude-fable-5[1m]) now works freely with no credits prompt.
This is consistent with the one-time consent being satisfied account-side by the settings.json-started session - i.e. the session-start path records the consent/entitlement state that the interactive dialog path was supposed to establish but never could (dialog never rendered → timed out → fableConsentSessionFallback → fableCreditsRequired).
Implications:
- The bug is in the interactive consent flow, not entitlement itself - affected Max users are stuck in the circular loop with no in-product way to grant consent.
- Repro is single-shot per account: once consent is recorded (via the workaround), the broken path can no longer be observed from that account.
- Effective workaround for affected users: set
"model": "claude-fable-5"in.claude/settings.json, restart VS Code, run one session, then revert the setting - UI switching works from then on.