[BUG] Fable 5 prompts 'usage credits required' on Max plan from 2026-07-20, the day it became standard on Max (saved model claude-fable-5[1m])
What's Wrong?
On 2026-07-20 — the first day Fable 5 becomes a standard part of Max plans — Claude Code refuses to run Fable 5 on a Max plan, silently downgrades the session to Opus 4.8, and reports that Fable requires usage credits:
Switched to Opus 4.8 (1M context) for this session · Fable 5 requires usage credits · /model to change
Running /model opens the credits top-up page:
Opened https://claude.ai/settings/usage?from=cc_cli_limit_message in your browser to manage usage credits.
Once topped up, run /model to switch to Fable 5.
No plan limit was exhausted at the time — the account was nowhere near its weekly usage limits, and the session had just started.
The saved default model is the 1M alias:
// ~/.claude/settings.json
"model": "claude-fable-5[1m]",
"switchModelsOnFlag": false
Note the label asymmetry that also shows up here, matching #74562: the fallback is announced as "Opus 4.8 (1M context)" (1M label present), while Fable is referred to as plain "Fable 5" (1M label absent).
What Should Happen?
Per the official Help Center article (Claude Fable 5 on your plan), as of 2026-07-20 on Max plans:
"Fable 5 is included as a standard part of your plan. You can use up to 50% of your weekly usage limits on Fable 5 at no extra cost."
So on a Max plan, below the 50% threshold, selecting Fable 5 should simply work — no credits prompt, no silent downgrade to Opus.
If the client genuinely cannot serve claude-fable-5[1m] (e.g. the 1M context window is a separate entitlement — the Help Center article does not document 1M scoping for Fable at all), then the message should say that — "the 1M context window is not included; Fable 5 at standard context is available on your plan" — rather than a generic "Fable 5 requires usage credits", which is factually wrong for Max as of today.
Steps to Reproduce
- Be on a Max plan, well under weekly usage limits, on 2026-07-20 or later.
- Set
"model": "claude-fable-5[1m]"in~/.claude/settings.json. - Start a Claude Code session.
- Session is switched to Opus 4.8 with "Fable 5 requires usage credits";
/modelroutes to the credits page instead of selecting Fable.
Environment
- Claude Code 2.1.215
- macOS 26.5.2 (darwin, arm64), VS Code integrated terminal
- Node v26.3.0
- Plan: Max, weekly limits not exhausted
~/.claude/settings.json:"model": "claude-fable-5[1m]","switchModelsOnFlag": false- No
ANTHROPIC_MODEL/CLAUDE_MODELenv overrides, no project-level model setting
Likely root cause (hypothesis)
This looks like the same alias-resolution defect hypothesized in #78622, now surfacing against the new post-promo entitlement structure rather than the promo:
- #74562 —
sonnet[1m]/fable[1m]aliases do not apply the 1M context window; onlyopus[1m]works. - #67650 — internal quota probe sends the model ID with a literal
[1m]suffix →404 not_found_error.
If the entitlement check is performed against the literal string claude-fable-5[1m] instead of resolving it to claude-fable-5 + a 1M context flag, then the new Max entitlement for Fable 5 would never match, and the client would fall back to credits — exactly the observed behaviour, on exactly the day the entitlement changed.
Related issues
- #78622 — same symptom on 2026-07-17 during the promo window (closed)
- #74562 —
fable[1m]alias does not apply 1M context - #67650 — quota probe sends literal
[1m]suffix → 404 - #74388 — model/billing routing mismatch between selected and billed model
Caveat
Account-side entitlement state is not visible from the client, so I cannot fully rule out that Fable 5 at 1M context legitimately sits outside the Max inclusion while Fable 5 at standard context is included. If that is the case, this is still a bug in the message and the silent downgrade path: nothing tells the user that dropping [1m] would restore included access. Happy to provide account details for private triage.
75 Comments
Reproducing this on a Max 5x plan today (2026-07-20), with server-side usage data that directly contradicts the client's claim.
Web usage page (authoritative, refreshed minutes before the prompt):
Fable: 30% used (resets Mon 07:59)All models: 16% usedUsage credits: toggle off, never purchasedClaude Code CLI (v2.1.215),
/model→ Fable 5:So the plan-included Fable allowance is at 30% of a 50% cap — well below the threshold the Help Center describes — yet the client insists Fable is credits-only and is not part of the plan. Repeated
/modelattempts give the identical prompt.Two extra data points that may help narrow it down:
~/.claude.json→oauthAccount.profileFetchedAt) was refreshed 46 minutes before the prompt, so this is not an obviously stale-profile problem:hasExtraUsageEnabled: false,organizationRateLimitTier: default_claude_max_5x.Also worth noting the promotional uplift currently shown on the same usage page (Claude Code weekly limits +50% until Aug 19) — per #74051 the credits gate appears to ignore active promotional allowance too.
The practical impact is that the only offered path is to purchase credits for capacity the plan already grants and the account has 70% of remaining.
same
One more data point that rules out the documented prerequisite: the Help Center article (Claude Fable 5 on your plan) states "In Claude Code, Fable 5 requires version 2.1.170 or later." The affected client here is 2.1.215, so the version requirement is met and cannot explain the credits prompt.
The same article also states the access rules are platform-independent — "This works the same way across Claude on the web, Claude Mobile, Claude Desktop, Claude Cowork, and Claude Code" — and that on Max plans "Fable 5 is included as a standard part of your plan. You can use up to 50% of your weekly usage limits on Fable 5 at no extra cost," effective July 20, 2026.
So on a Max plan sitting at 30% weekly Fable usage on a current client, every documented precondition for plan-included access is satisfied, yet the CLI still routes to the credits purchase flow.
It happened to me and I just started a new chat and resumed the conversation that was interrupted using Fable 5 and it worked.
Another data point on 2.1.215 / macOS 26.5.2 (arm64, native installer), Max plan, saved model
claude-fable-5[1m]— same as the OP.claude.ai itself now contradicts the CLI in writing. The usage page shows this notice:
…while Claude Code simultaneously offers:
Limits at that moment were nowhere near exhausted:
| Limit | Used |
|---|---|
| Current session | 15% |
| Weekly — All models | 8% |
| Weekly — Fable | 4% |
So the account-side state is fine and the client-side selection-time check is the thing that is wrong. That matches nratzan's analysis in #74051: in-flight Fable sessions keep running and keep drawing on the allowance at $0.00 credits, so the server accepts the entitlement — it is only the client's pre-flight check that demands a nonzero credit balance.
The prescribed restart did not fix it here either (same as #79351).
The part that costs real work: this does not only appear at selection time. It fired mid-session, during a long autonomous run, and silently swapped the model:
Losing the selected model partway through a long task is a materially worse failure than a prompt at startup — and since the documented remedy is "restart Claude Code", the only sanctioned fix for a mid-session swap is to throw away the session. Whatever the root cause, it would help a lot if a failed or stale entitlement check did not silently change the model of a session already in flight.
For anyone hitting this now, the two workarounds reported in this cluster (
/loginre-auth per #79341, or starting a new chat and resuming per this thread) both point at a stale cached entitlement rather than a real billing state.Restarting my session didn't help with this, so here's my current workaround:
No idea how durable this is. Treat it as a temporary at best.
Same issue, cant use my 100$ credit for fable.
See https://github.com/anthropics/claude-code/issues/79345#issuecomment-5026325503.
Same issue, Max plan, no org, v2.1.204, 47% Fable usage, VS Code extension
Same issue here, but with an additional data point: it only happens with CLAUDE_CODE_OAUTH_TOKEN.
I'm on a Max plan with plenty of Fable headroom. Setup:
Claude Code updated to the latest version
Token freshly regenerated via claude setup-token after the July 20 plan change, so it's not a stale-token issue
No ANTHROPIC_API_KEY set in the environment
Result:
Interactive login (/login via browser OAuth) → Fable 5 works fine, no credits prompt
Same account, authenticated via CLAUDE_CODE_OAUTH_TOKEN from claude setup-token → immediately get the "usage credits are required for this model" prompt, and restarting doesn't help
So this looks like the setup-token auth path isn't picking up the post-July-20 Max plan Fable entitlement, while the interactive OAuth path resolves it correctly. Hope this helps narrow it down.
Same issue here! Claude Code v2.1.216. Max 5x plan.
Claude code is showing this when selecting Fable model:
3. Fable Fable 5 · Most capable for your hardest and longest-running tasks · Requires usagecredits
So for some reason it is saying that it requires usage credits although I am on Max plan.
Same issue . But fable working on claude web and desktop app. The main issue is terminal side. The issue still persists
same
Adding a data point confirming this reproduces beyond the
claude-fable-5[1m]saved-model path:claude updatereports it as latest — no fix shipped yet)~/.claude/settings.jsonhas"model": "opus", no[1m]alias anywhere/model→ "Switch to Fable 5?" shows "Fable 5 runs on usage credits, purchased separately from your plan. You don't have usage credits yet." and offers only (1) set up credits or (2) keep current model. No path to use the Max-included Fable 5 entitlement.So the entitlement mismatch isn't limited to the
[1m]alias in settings.json — it also fires on a plain interactive switch with a clean config. Points at the Max Fable 5 entitlement (effective 2026-07-20) not being recognized at all, rather than purely an alias-resolution defect.Facing the same issue, can't find a work around. I have updated, restarted, even asked opus to find me a solution but to no avail.
same issue
same
same issue
/logout and /login worked for me.
I'm on pro plan and it worked, have you guys check the allowed usage limit and set it > 0?
Hitting this exact issue on a Max (5x) plan, confirmed 2026-07-21. Selecting Fable 5 in Claude Code prompts that usage credits are required, even though Settings → Usage explicitly says "Fable 5 is still included with your Max plan" and tells you to restart Claude Code as the fix. Fully quit and relaunched (Cmd+Q) and the prompt still appears. Weekly Fable usage in that same panel showed 86% used (resets Thursday) — so this isn't a real limit block, it's the false-credits-prompt bug.
Seeing this too, on Max (default_claude_max_20x, Stripe subscription), Claude Code VS Code extension 2.1.216 on Windows 10.
Selecting Fable in the model picker silently reverts to the default model (Opus, then Sonnet) instead of running Fable — no visible error, just a downgrade. Confirmed via my own session transcript (~/.claude/projects/.../*.jsonl): every turn after selecting Fable was served by claude-opus-4-8 or claude-sonnet-5, never claude-fable-5.
This isn't a usage-limit issue — my 5-hour utilization was 3%, weekly was 0%, nowhere near the 50% Fable threshold on Max.
This may contradict the [1m]-literal-string theory above. I tested both model strings directly via the CLI (claude -p "hi" --model claude-fable-5 and claude -p "hi" --model "claude-fable-5[1m]"), and both succeeded — both resolved to claude-fable-5 in the response's modelUsage field, exit 0, no credits error. So the bare API/CLI path accepts Fable fine; the failure seems specific to the in-app picker/UI path.
Two things that look suspicious on my account:
hasExtraUsageEnabled: false, with cachedExtraUsageDisabledReason: "org_level_disabled"
The picker's cached model option (additionalModelOptionsCache in ~/.claude.json) has only one Fable entry, labeled "Requires usage credits" — looks like a stale pre-July-20 label that the picker may still be gating on client-side.
Tried pinning "model": "claude-fable-5" and "switchModelsOnFlag": false in ~/.claude/settings.json — didn't resolve it after a full restart.
I just got this email from Anthropic, but honestly I don't trust it.
Hi Michael,I can confirm that on your Max plan, Fable 5 is included as a standard part of your subscription—you can use up to 50% of your weekly usage limits on Fable 5 at no extra cost.[1] The false prompt you're seeing won't result in any actual charges to your account while Fable 5 remains within your plan's included usage.This specific issue—where Claude Code incorrectly shows the "Fable 5 is now consuming usage credits" banner for Max plan users—was addressed in version 174 of Claude Code (released June 12, 2026).[2] If you're still seeing the prompt after restarting, you may need to update to the latest version of Claude Code to resolve it.Regarding the GitHub issue you mentioned: we review all product bug reports, and reporting it here is all that's needed. There's currently no way to track the status of a specific fix, but you can check back later to see if the issue has been resolved. Reaching out multiple times about the same issue won't expedite a fix.Please let me know if this helps or if you have any further questions. | Hi Michael,I can confirm that on your Max plan, Fable 5 is included as a standard part of your subscription—you can use up to 50% of your weekly usage limits on Fable 5 at no extra cost.[1] The false prompt you're seeing won't result in any actual charges to your account while Fable 5 remains within your plan's included usage.This specific issue—where Claude Code incorrectly shows the "Fable 5 is now consuming usage credits" banner for Max plan users—was addressed in version 174 of Claude Code (released June 12, 2026).[2] If you're still seeing the prompt after restarting, you may need to update to the latest version of Claude Code to resolve it.Regarding the GitHub issue you mentioned: we review all product bug reports, and reporting it here is all that's needed. There's currently no way to track the status of a specific fix, but you can check back later to see if the issue has been resolved. Reaching out multiple times about the same issue won't expedite a fix.Please let me know if this helps or if you have any further questions.
-- | --
Hi Michael,I can confirm that on your Max plan, Fable 5 is included as a standard part of your subscription—you can use up to 50% of your weekly usage limits on Fable 5 at no extra cost.[1] The false prompt you're seeing won't result in any actual charges to your account while Fable 5 remains within your plan's included usage.This specific issue—where Claude Code incorrectly shows the "Fable 5 is now consuming usage credits" banner for Max plan users—was addressed in version 174 of Claude Code (released June 12, 2026).[2] If you're still seeing the prompt after restarting, you may need to update to the latest version of Claude Code to resolve it.Regarding the GitHub issue you mentioned: we review all product bug reports, and reporting it here is all that's needed. There's currently no way to track the status of a specific fix, but you can check back later to see if the issue has been resolved. Reaching out multiple times about the same issue won't expedite a fix.Please let me know if this helps or if you have any further questions.
Hi Michael,
I can confirm that on your Max plan, Fable 5 is included as a standard part of your subscription—you can use up to 50% of your weekly usage limits on Fable 5 at no extra cost.[[1]](https://support.claude.com/en/articles/15424964-claude-fable-5-on-your-plan) The false prompt you're seeing won't result in any actual charges to your account while Fable 5 remains within your plan's included usage.
This specific issue—where Claude Code incorrectly shows the "Fable 5 is now consuming usage credits" banner for Max plan users—was addressed in version 174 of Claude Code (released June 12, 2026).[[2]](https://code.claude.com/docs/en/changelog) If you're still seeing the prompt after restarting, you may need to update to the latest version of Claude Code to resolve it.
Regarding the GitHub issue you mentioned: we review all product bug reports, and reporting it here is all that's needed. There's currently no way to track the status of a specific fix, but you can check back later to see if the issue has been resolved. Reaching out multiple times about the same issue won't expedite a fix.
Please let me know if this helps or if you have any further questions.
/login to prompt the login screen and then authorizing to the same account helped resolve this exact issue for me.
that worked for me thank you so much
Guess what? Logging out and logging back in worked perfectly for me. Thank you for posting this obvious answer. Meanwhile Anthropic support still can't figure out the solution.
I'm having this issue too. And logged out and logged back in and that worked for one terminal, but then I opened up another terminal and it redirected me to usage credits once again. Claude Code in zsh Mac, 20x Max plan, 2.1.217
Same issue here, also on Max plan (5x), confirmed via Settings -> Usage: only 3% of Fable weekly limit used ("All models" at 16%), so nowhere near the 50% threshold. The Usage panel itself shows the banner "Fable 5 is still included in your Max plan. If you see a message to set up usage credits, restart Claude Code" - which confirms this is a known client-side bug, not an entitlement change.
Environment:
Restarting Claude Code did not consistently resolve it for me. Adding my report as another data point for the [1m] alias-resolution hypothesis above.
I was having the same issue as everybody else but running
/logoutand then running Claude again and reauthenticating fixed it for me.Adding another confirmed data point, Max plan (5x), macOS, Claude Code 2.1.217, standard interactive OAuth login (no setup-token, no ANTHROPIC_API_KEY set).
Symptom persists across all of the following, in this order:
/logoutthen re-login (full re-auth flow, not just restart)additionalModelOptionsCacheandmodelAccessCachein~/.claude.json— this did NOT cause a fresh correct refetch; it just removed Fable from the/modelpicker entirely. Restoring the original (stale) cache entry brought the option back, with the same "Requires usage credits" block as before.claude --model claude-fable-5directly (not via the/modelpicker) — same block.Key finding: the backend/API entitlement is fine. Running headless bypasses the bug entirely:
returns a real Fable 5 response —
is_error: false,modelUsage.claude-fable-5.contextWindow: 1000000, billed normally, no credits error.So this confirms the bug is isolated to the interactive code path (both the
/modelpicker and interactive launch with--modelflag), not a real entitlement/billing state, and not fixable by clearing local cache. Relevant local state on this account:This lines up with the hypothesis a few comments up: the interactive path appears to gate Fable behind the extra-usage/overage-credits check (
hasExtraUsageEnabled) instead of checking the plan-included Fable allowance, while the headless path (and the underlying API) correctly checks the real entitlement.Also affected on Max, Windows.
ANTHROPIC_MODEL/CLAUDE_MODELoverridesSelecting Fable 5 via
/modelstill reports "Fable 5 requires usage credits" and routes to the credits top-up page, despite being nowhere near the 50% weekly threshold that Max is supposed to include Fable under (per the Help Center article, effective 2026-07-20). Same symptom as the original report; still present on 2.1.217, so the fix has not shipped yet.+1 for the alias-resolution hypothesis — the entitlement check appearing to run against the literal
[1m]string rather than resolving toclaude-fable-5+ a context flag matches what's described here and in #74562 / #67650.For the subset of reports here authenticating via
CLAUDE_CODE_OAUTH_TOKEN/claude setup-token(e.g. @Williamleejx above — "only happens with CLAUDE_CODE_OAUTH_TOKEN"), the root cause is now pinned down in #79597 — with earlier dupes #73350 (the first report, 07-02, naminghasAvailableSubscription: false) and #79360:The setup-token's server profile never populates
subscriptionType(~/.claude.json→oauthAccountcarries no tier;profileFetchedAtrefreshes each launch but the tier stays absent). The interactive entitlement check therefore can't confirm plan coverage and fail-closes to the credits wall. It isn't a stale token — a freshly minted one behaves identically. The tell: headlessclaude -p --model claude-fable-5works fine (it skips the client-side gate and the server authorizes against the real plan), while the interactive picker walls it.Workaround for that subset: unset the token so a
/logincredential drives —env -u CLAUDE_CODE_OAUTH_TOKEN claude. On always-on / multi-instance hosts where a plain default-dir/loginwould rotate refresh tokens between concurrent sessions, put the/loginin an isolatedCLAUDE_CONFIG_DIRinstead (full setup +--output-format jsonverification in #79597).Note this only accounts for the token-auth cases — the pure-
/loginreports in this thread (e.g. @xli21-code, clean config, no token) look like a separate variant of the same wall and aren't explained by the setup-token profile gap.Adding a clean data point for the pure-
/loginvariant @AndrewLuebke carved out as separate from the setup-token gap (#79597) — this reproduces the credits wall with no token involved at all, on Max 20x.Auth:
/loginonly.CLAUDE_CODE_OAUTH_TOKENis not set at any scope — verified process, User, and Machine (Windows). Noenvblock in settings.json, no shell-profile injection.claude setup-tokenis not in the picture, soenv -u CLAUDE_CODE_OAUTH_TOKENdoes nothing here.Plan (from
~/.claude.json→oauthAccount):organizationRateLimitTier: "default_claude_max_20x"— i.e. Max 20x, which includes Fable 5organizationType: "claude_max",organizationRole: "admin"(personal one-person org)billingType: "stripe_subscription",hasExtraUsageEnabled: trueseatTier: nullsubscriptionType: undefined← the field the interactive gate checksA friend on the same Max 20x plan uses Fable 5 with no wall, so this isn't tier-gating — it's the missing
subscriptionType.Behavior:
/modelpicker → Fable 5 walls to the usage-credits prompt.claude --model claude-fable-5(launch flag) → session starts, but the first interactive prompt hits the same wall. So the gate fires at message-send in the interactive TUI regardless of how the model was selected — not just in the picker.claude -p --model claude-fable-5 "…"→ works, exit 0, on-plan, no wall.profileFetchedAtrefreshes on every launch (confirmed updating to the current day), butsubscriptionTypestays absent on each re-fetch — not stale data, and re-auth doesn't repopulate it.Version:
2.1.217on the native installer, andclaude updatereports "up to date" (latest on the native channel; npmlatestis also 2.1.217). So updating the client is not a fix for this variant — I'm already on the newest build and it still walls. (Updating did fix it for others who were on older builds.)Matches the tell exactly: the server authorizes Fable 5 against the real Max plan headlessly, while the interactive session fail-closes on the missing
subscriptionType. Same server-side symptom as the token subset, reached without any token — which is why the setup-token workaround doesn't help this group. Fix likely needs the profile fetch to populatesubscriptionTypeforclaude_maxaccounts (including org-routed / personal-org ones) regardless of auth method.Additional data point from a Max 20x account, v2.1.217 on Windows 11 (CLI in VS Code terminal + desktop app) — including proof the gate is wrong about where billing actually goes:
Local state fully ruled out. Plain
"model": "claude-fable-5"pin (no[1m]), noANTHROPIC_API_KEYin any scope (Process/User/Machine), noapiKeyHelper, credentials showsubscriptionType: maxwith standard Claude Code scopes. A fresh/loginon the correct account minted a new token and did not clear the prompt — so the flag survives token refresh.The gate contradicts actual billing. With usage credits enabled ($80.58 balance), I clicked "Continue with Fable 5" and ran a session. Result: the credits balance stayed exactly $80.58 and the claude.ai Usage page shows Fable ticking against the plan's weekly limit (13%). So Fable is billing the Max subscription correctly — the "runs on usage credits" dialog and the "Fable 5 · Claude API" header are misreporting the billing path.
Escalation: disabling usage credits hard-blocks Fable. After turning the usage-credits toggle OFF on claude.ai, the CLI went from mislabeling to refusing: "Usage credits are turned off. Re-enable to use Fable 5" with only "Set up usage credits" / "Switch to Sonnet 5" offered. Meanwhile the desktop app's own Usage page shows the banner "Fable 5 is still included with your Max plan. If you see a prompt to set up usage credits for it, restart Claude Code" — restarting does not fix it.
Workaround for others: re-enable the usage-credits toggle and pick "Continue with Fable 5" — verified it bills the subscription, not credits, at least while under the plan limits.
I'm a max20 user and I only used it as an extension for vscode and experienced the same phenomenon, installed claude in powershell and resolved
I use Claude CLI with my Max ($200/mo) subscription. I noticed the issue ("Fable runs on usage credits" message) on one machine but not the other, so in my case it was an auth token issue (using MacOS/bash).
Fix that worked for me:
CLAUDE_CODE_OAUTH_TOKENand verify it is no longer set in the environment:unset CLAUDE_CODE_OAUTH_TOKEN./model fable, it should no longer mention anything about credit.I'm currently on:
2.1.218 (Claude Code).Confirming the same symptom on a Max plan, well under weekly limits.
/model→ Fable 5 shows the generic "Fable 5 requires usage credits" prompt and routes to the credits top-up page instead of switching./usageat the time showedCurrent week (Fable): 50% used— halfway through the weekly Fable allowance, not close to any cap.~/.claude/settings.jsonwas"model": "claude-fable-5[1m]"(the 1M-context alias), matching the repro here. Removing the[1m]suffix (plain"claude-fable-5") did not resolve it —/modelstill shows the same generic credits prompt when actively selecting Fable, so the entitlement check on the live/modelpicker path appears independent of the saved default in settings.json (that setting only affects session startup, not the runtime check triggered by picking a model mid-session).Environment: macOS, Claude Code (Max plan).
+1, reproducing today (2026-07-23) on Max plan, Claude Code v2.1.215 (macOS,
~/.local/bin/claude)./model claude-fable-5returns:Data point: rotating the OAuth token (
claude setup-token→ fresh token → replacedCLAUDE_CODE_OAUTH_TOKEN) did not resolve it. Freshly minted token, same error immediately. So this doesn't appear to be stale client-side entitlement — the newly issued token is being served the same (incorrect) plan entitlement for Fable.Same account, web usage page shows Fable covered by the plan.
Happy to attach
~/.claude.jsonentitlement snippet if useful — reply here.Root-cause data point that may help others here, from debugging the same "Fable 5 requires usage credits" gate on a Max plan.
**The deciding factor is the credential source, not the token or its scopes** (verified on Claude Code 2.1.218):
CLAUDE_CODE_OAUTH_TOKENenvironment variable puts Claude Code in "Claude API" mode —/statusshows anAuth token:row and noLogin method/Organization/Email. In this mode Fable 5 is credit-gated ("Fable 5 runs on usage credits — you have $0.00 in credits") even on a Max plan that covers it.~/.claude/.credentials.json(env var unset, i.e. a normal/login) yields/status: Login method: Claude Max account, and Fable 5 works as plan-covered.It is not about scopes: exporting a full-scope token (
user:file_upload,user:inference,user:mcp_servers,user:profile,user:sessions:claude_code,subscriptionType: max) throughCLAUDE_CODE_OAUTH_TOKENstill produced "Claude API" mode and still credit-gated Fable. Only the credentials file yields subscription mode.Practical takeaway: if you're hitting this, check whether
CLAUDE_CODE_OAUTH_TOKEN(orANTHROPIC_API_KEY) is set — CI / automation / devcontainer setups that export it will land in API mode and hit the Fable credit gate regardless of plan. Unsetting it so Claude Code reads the/logincredentials file restores plan coverage.I found a potential workaround, see: https://github.com/anthropics/claude-code/issues/79341#issuecomment-5065127466
I'm having the same problem since yesterday using Claude Code CLI.
/loginsends me into a infinite login loop [receive email -> click login -> agree to permissions -> new email sent -> repeat]I don't think anyone linked it here yet: https://github.com/anthropics/claude-code/issues/79360 talks about the CLAUDE_CODE_OAUTH_TOKEN issue @slalter mentioned.
Confirming this on the CLI — and it reproduces with a clean
settings.json(no
claude-fable-5[1m]saved model).Environment
claude --version) — also the latest published on npmSymptom.
/model fablerefuses to switch and silently stays on Opus 4.8:Re-running just prints
Kept model as Opus 4.8.Why this is the entitlement-probe bug, not a real limit:
/usageshows a dedicated "Current week (Fable): 11% used" bar — the Max Fableallowance is present and 89% free, nowhere near exhausted.
/usagealso shows Fable already ran this week:claude-fable-5: 112 input, 18.6k output, 535.9k cache read (~$2.78 notional).So the account demonstrably HAS the Fable entitlement, yet the switch is refused.
they should not be required — Max includes up to 50% of weekly limits on Fable at
no extra cost.
~/.claude/settings.jsonhas"model": "claude-opus-4-8"— there is noclaude-fable-5[1m]saved model. So this reproduces without the[1m]saved-model config from the original report, which points at the faulty
[1m]quota probe firing even on a plain
/model fableswitch (cf. #67650).Net: a Max user with a live Fable entitlement and 89% weekly allowance remaining is
told they "need usage credits." Happy to attach full
/usage//statusoutput.This was the issue for me thanks so much for sharing your solution! Slight difference at my end though, unset wasn't enough and I had to remove
export CLAUDE_CODE_OAUTH_TOKEN="<string>"from my ~/.bashrc. My version was 2.1.220 and I'm on Kubuntu 24.04. It's interesting you are using bash on MacOS, this points to bash shell as the issue, likely the environment is not cleaning itself up.Reproducing on a Max plan (20x tier). Fable is unavailable/gated in
/modelon a fresh Claude Code session; doing a full/logout+/loginmakes it available again for that session, but the very next new session reverts back to unavailable.Debug log (
~/.claude/debug/<session>.txt) for an affected session shows the session's OAuth token is missing theuser:profilescope:Credentials are stored in the macOS Keychain via the normal interactive login flow (no
ANTHROPIC_API_KEYenv var, no setup-token in use), so this isn't a case of intentionally using a reduced-scope credential — something is narrowing the token down touser:inference-only between sessions.Bootstrapis what appears to fetch the profile/entitlements data used to resolve model availability, so a 403 there due to the missing scope lines up with the client falling back to a stale or incomplete entitlement snapshot that omits Fable.This matches the pattern others in this thread reported (
/loginre-auth as a temporary fix, reverting on the next session) and points at scope handling during token refresh/session bootstrap as a likely root cause, separate from any real billing/entitlement state server-side.Follow-up to my earlier comment here, for the token-auth subset (
CLAUDE_CODE_OAUTH_TOKEN/claude setup-token): there's now a fix that keeps the token, so you don't have to drop it and/login— which isn't viable on headless / CI / multi-instance hosts. Credit to @vzellmeister's teardown in #79597. Declare your tier via env var alongside the token:Fresh session →
/model fableselects cleanly, and the header shows "Claude Max" instead of "Claude API". Confirmed on Max 20x / 2.1.220 (Linux).SUBSCRIPTION_TYPE=maxis the lever (the picker checkssubscriptionType === "max"); full mechanism + a tier-detection gotcha are in #79597.Note this only helps the token-auth group — the pure-
/loginvariant (e.g. org-routed Max accounts withsubscriptionTypeundefined) still needs the server-side fix.Thank you very much; this is the only solution so far that has resolved my problem.😆
Confirming this pattern on my end (Max plan, macOS, VS Code extension v2.1.220, model saved as
claude-fable-5[1m]).Interactive picker (VS Code panel):
/model claude-fable-5[1m]→ silently accepts ("Set model to claude-fable-5"), but the panel later blocks the actual request with the "Fable 5 requires usage credits — You don't have usage credits yet." paywall dialog, even though Usage settings shows Fable at only 3% of weekly allowance used and explicitly states "Fable 5 is still included with your Max plan."claude-fable-5(no[1m]) via/model claude-fable-5gives a different message instead: "Fable 5 uses usage credits and needs a one-time consent · pick Fable from /model in an interactive session to set it up."/modelwith no args and selecting Fable 5 from the picker — does not surface any consent dialog at all. No UI appears, nothing to accept, and the model still doesn't work.Headless mode works fine, isolating this to the interactive/consent UI path specifically (same shape as #79597, but triggered without setup-token auth):
No error, correct model used. So the account-side Max entitlement is clearly fine — this is purely a client-side interactive/consent flow defect in the VS Code extension.
Happy to provide more logs/repro details if useful.
Same issue... tried a restart, removed 1M in json no luck. Help!
I was able to solve the issue.
Confirmed root cause + working workaround
Environment: Claude Code extension v2.1.220 (VSCodium, Remote-WSL / Ubuntu on Windows 11), signed in via claude.ai OAuth, Stripe subscription upgraded Pro → Max ($100/mo).
Symptom: After upgrading to Max, the extension's Account & Usage panel kept showing
"Plan: Claude pro" and selecting Fable 5 showed the "Fable 5 requires usage credits" banner.
claude.ai in the browser correctly showed Max. Restarting VSCodium and rebooting the machine
did NOT fix it.
Root cause (verified on disk): the stale plan is cached inside the stored OAuth
credential, not in the profile:
~/.claude.json→oauthAccount.organizationType: "claude_max"✅ (profile refresh hadpicked up the upgrade)
~/.claude/.credentials.json→subscriptionType: "pro"❌ (token minted before theupgrade; this is what gates the plan display and Fable)
Restarts can never fix this because every restart reuses the stored token — the stale
subscriptionTypeclaim survives until a new token is minted. Note the entitlement field isin
.credentials.json, not in~/.claude.json'soauthAccountblock (nosubscriptionTypekey exists there in 2.1.220).
Workaround that fixed it:
extension has no explicit sign-out, and none was needed. (CLI
/login, or moving~/.claude/.credentials.jsonaside and reopening, should work the same way.)grep -o '"subscriptionType":"[^"]*"' ~/.claude/.credentials.json→ now"max".claudeprocess reads the credential once atits own startup, so any session started before the re-auth keeps the stale claim in
memory. Sessions are independent: restarting one is enough to test; others can follow later.
After this, the panel reads correctly and Fable 5 requests go through on the Max plan.
A subsequent automatic token refresh also returned
"max", so the server side is consistent —the bug is that the client never re-mints/re-reads the token on plan change, and the
Account & Usage panel renders the token's stale claim.
Suggested fix: on plan/entitlement mismatch between the profile fetch
(
organizationType) and the token claim (subscriptionType), force a token refresh (orprompt re-auth) instead of trusting the stored token for the session's lifetime.
Corroborating on Linux, Max 20x, v2.1.220 — but with evidence pointing upstream of the
[1m]alias theory.TL;DR: the client renders my plan as "Claude Pro" despite the account being Max 20x. Pro is the credits-only tier for Fable, so every symptom in this issue follows from that single misclassification. Disabling 1M context does not fix it.
The entitlement is real — proven with credits disabled
Usage credits are turned off on this account (
hasExtraUsageEnabled: false; the dialog itself says "Usage credits are turned off"). Yet headless Fable calls succeed and bill to the plan:If Fable genuinely required credits and credits were disabled, that call had to fail. It doesn't. The entitlement is present; only the interactive client disagrees.
[1m]does not appear to be the causeVerified by driving the real TUI in a pty and capturing the rendered picker (not by reading the config cache):
CLAUDE_CODE_DISABLE_1M_CONTEXT=1→ picker still showsRequires usage creditsANTHROPIC_DEFAULT_FABLE_MODEL=claude-fable-5→ no changeThe tier label
Launching interactively with
--model claude-fable-5, the model line reads:Claude Prois emitted by the binary itself (12 occurrences in the executable), not by my custom statusline script — that script only printsuser@host:cwd | [model] [bar] %. There is no cachedprovalue anywhere in~/.claude.json. The account isorganizationType: claude_max,organizationRateLimitTier: default_claude_max_20x.The cached option is not locally correctable
claude-fable-5[1m]appears zero times in the binary — it is server-supplied. Writingclaude-fable-5intoadditionalModelOptionsCachein~/.claude.jsonis overwritten back toclaude-fable-5[1m]on the next session start. Also of note:modelAccessCachecomes back as[]andadditionalModelCostsCacheas{}.Affected paths
| path | result |
|---|---|
|
/modelpicker | blocked, credits dialog ||
/model claude-fable-5(explicit base id) | blocked, falls back to Opus 5 ||
claude --model claude-fable-5, interactive | blocked ||
claude -p --model fable, headless | works, bills to plan |The headless path being the only one that works is consistent with the gate being purely client-side UI — the API accepts Fable on this account without credits.
Env: Linux 7.0.0-28-generic, Claude Code 2.1.220 (native installer), Max 20x.
Confirming this is still present on 2.1.220 (current latest), Max plan, macOS.
Same symptom: selecting the Fable row in the
/modelpicker shows the consent dialog "Fable 5 runs on usage credits, purchased separately from your plan. You don't have usage credits yet.", even though Fable is included on Max at up to 50% of limits. The only Fable row my picker offers has the valueclaude-fable-5[1m](visible inadditionalModelOptionsCachein~/.claude.json).I can confirm the alias-resolution hypothesis from the original report. Tested headless on the same account, same machine, minutes apart:
| Selection | Result |
| --- | --- |
|
claude -p "..." --model claude-fable-5| runs normally, no credits prompt ||
claude -p "..." --model fable| runs normally, no credits prompt ||
claude-fable-5[1m]via the/modelpicker | credits dialog, session does not start on Fable |So the account entitlement is fine. Only the
[1m]-suffixed id fails the entitlement check, which is consistent with the literal string being passed through instead of resolving toclaude-fable-5plus a 1M context flag.Workaround for anyone hitting this: type
/model fableinstead of selecting Fable from the picker. Typing the alias makes Claude Code check availability with the server directly. Per the model-config docs, Fable 5 always runs with the 1M context window on the Anthropic API, so the[1m]suffix is redundant on this model and nothing is lost by avoiding that row.One note on the 2.1.210 changelog entry, "Fixed the Fable model row showing 'Requires usage credits' for plans that include it, when a stale cache had baked the label in": that fix does not cover this case. My profile was fetched roughly two hours before the repro,
modelAccessCacheis empty, andadditionalModelCostsCacheis{}, so there is no stale label involved. The failure is at selection time, not a cached row label.This didn't work for me. Same version 2.1.220. I switched to Claude GUI Mac app and have no issues accessing Fable there.
Reproducing this on a premium Team seat, not Max, and with a data point that
rules out the
[1m]alias-resolution hypothesis for at least some accounts.Claude Code 2.1.220 (native install, installed 25 July 2026), Windows 11 Home
10.0.26200, VS Code integrated terminal, OAuth subscription auth, no
ANTHROPIC_API_KEY. Seat tierteam_bendep_nonprofit_premium,organizationTypeclaude_team,organizationRateLimitTierdefault_raven,userRateLimitTierdefault_claude_max_5x.The gate fires on the canonical id, not just
[1m]My session transcript records the fallback as a system event:
originalModelisclaude-fable-5, with no[1m]suffix. I reached that state bylaunching with
claude --model claude-fable-5, which is the workaround suggestedearlier in this thread. So a fix scoped to resolving
claude-fable-5[1m]toclaude-fable-5plus a 1M flag would not fix this account.This also matches @vhscom's report above that
/model fabledid not help on 2.1.220.Model selection succeeds; the consent gate is what fails
Worth separating the two, because they behave differently:
claude --model claude-fable-5starts the session with the header"Fable 5 with high effort · Claude Team", so selection itself resolved fine.
does not leave the session on Fable. It falls back to Opus 5.
The server-side entitlement is intact
Headless mode never reaches the interactive consent gate, and there Fable works.
Same machine, same account, minutes apart from the failure above:
Runs normally, no dialog, no fallback. The returned
modelUsageconfirms Fableactually served it, at the full 1M context window:
Same result with
--model claude-fable-5and--model fable. Note that theheadless path accepts the
[1m]-suffixed id too, which is further evidence that thesuffix is not what the gate is choking on.
Anthropic Support confirmed on 2 August 2026 that this seat tier does include Fable 5
up to 50% of weekly limits, that the server recognises the entitlement, and that the
fault is in the CLI's interactive consent gate. They directed me to file here.
Ruled out
The stale-OAuth-token cause from #79412 does not apply here.
~/.claude/.credentials.jsonhassubscriptionType: "team"andrateLimitTier: "default_claude_max_5x", matchingorganizationType: "claude_team"in
~/.claude.json, so/logout+/loginwould not change the tier. Also tried:updating to 2.1.220, full restart, fresh sessions in different projects. The gate
returns every time.
Possibly relevant client state
In
~/.claude.jsonthe caches the gate would consult are empty, and the pickeroffers only the
[1m]variant with no plain Fable row:Cached feature flags that contradict the gate
Two more things from
~/.claude.jsonthat look relevant, since the gate has to bereading its credits-only decision from somewhere:
My seat tier is not
enterprise, so by the first flag this account should not be onthe credits-only path at all, yet it is. I do not know what the two
*_fable_5booleans control, but if either is the plan-inclusion rollout gate, anaccount that is entitled server-side while both flags are
falseclient-side wouldproduce exactly this behaviour. Worth checking whether the flag rollout for Fable 5
inclusion reached premium Team seats, or only Max.
A second organization on the same login
This account has both a personal org and the Team org under one login. Both appear in
overageCreditGrantCache, timestamped eight minutes apart on 6 May 2026, the day apersonal Max subscription was cancelled and this seat was upgraded to the Team plan.
I do not think this is the direct cause, because the active session resolves to the
correct Team org, the OAuth token is minted with
subscriptionType: "team", and theheadless test succeeds on that same token. But if the consent gate resolves the
billing context independently of
oauthAccount.organizationUuid, a login carrying apersonal org alongside a Team membership is a plausible way to land on the wrong
entitlement, and it would explain why this reproduces for some premium Team seats and
not others. Cheap to rule out.
Scope note
This thread is titled for Max plans, and the related status incident
(
tnypgb2jbqnq) was titled "Fable 5 requiring usage credits on Max plans" andmarked resolved on 20 July. It is still live on a premium Team seat on 2 August,
on a CLI version installed after that resolution date. If the July fix was scoped to
Max entitlements, Team premium may need to be handled separately.
I keep getting the error that Fable isn't included in my max plan on
2.1.220 (Claude Code)inside VSCode.Met this issue in cc cli after updating to the latest 2.1.220 version, I'm in the max plan.
Is this issue different from https://github.com/anthropics/claude-code/issues/79360? I was having this problem (Claude telling me I needed usage credits despite having a Max plan) but it was due to the setup-token issue from that issue. The fix in that issue worked for me. (Mostly just posting this on the off chance that this whole issue is a red-herring?)
@gigamonkey Partly, but not entirely — it's worth pulling the two apart, because treating this as a straight dup of #79360 will send the wrong fix to half the people here.
**The setup-token subset of this thread is #79360.** If you authenticate via
CLAUDE_CODE_OAUTH_TOKEN/claude setup-token, theCLAUDE_CODE_SUBSCRIPTION_TYPE=maxfix there resolves it (glad it worked for you — it's the clean path for that group).But #79337 is broader than that. The reports from @Tevinhead (Linux, Max 20x) and @matanhakim (a Team seat, not Max) show the client misclassifying the plan as "Claude Pro" on plain
/login, no token involved at all. Pro is the credits-only tier for Fable, so every symptom follows from that single misclassification — Tevinhead even proved it with usage credits disabled (hasExtraUsageEnabled: false), so it isn't a real entitlement problem. Same failing gate as #79360 (subscriptionType !== "max"), different cause for why it isn't populated: stale plan cache (see @thapar's Stripe Pro→Max upgrade), org-routing, Team seats, Google Play billing, etc.**Crucially, the #79360 env-var fix does not help that group.** In the credential resolver,
CLAUDE_CODE_SUBSCRIPTION_TYPEis only read whenCLAUDE_CODE_OAUTH_TOKENis set — it short-circuits on the token. Pure-/loginusers have no token env var, so the resolver readssubscriptionTypefrom the credentials store instead, and the env var is simply inert for them.So the taxonomy:
CLAUDE_CODE_SUBSCRIPTION_TYPE=max./login(stale cache, org-routed, Team, Play billing) → env var won't help;/logout+/loginrefreshes it for some (re-walls on a second concurrent terminal), but the real fix is server-side.Not a red-herring — just two failure modes funneling into one symptom. Both end at the same
subscriptionType !== "max"gate, which is probably where a single upstream fix should land.I hit this on Windows (CLI 2.1.221, Max 20x) — the credits dialog reappeared in every new terminal while my Mac on the same account never showed it — and traced the root cause. Sharing since it explains the July 20 start date and the flakiness across machines/restarts.
Root cause: stale server-side feature-flag evaluations
The consent dialog is gated on the GrowthBook flag
tengu_saffron_lattice, fetched at session start viaapi.anthropic.com(/api/eval-authed/…— verified with a local proxy sniff;cdn.growthbook.iois never contacted).The server returns inconsistent evaluations per request. Diffing
~/.claude.json→cachedGrowthBookFeaturesafter each session, the same account + same machine + same attributes got, minutes apart:"tengu_saffron_lattice": {"enabled": true, "planLimitsEndDate": "2026-07-20T07:00:00Z"}"tengu_saffron_lattice": {"enabled": false}The client treats
planLimitsEndDatein the past as "promo over → Fable requires credits", so every session that draws the stale evaluation shows the dialog (or silently downgrades). That's why:Not a client parsing bug per se — the client faithfully renders a two-week-old flag payload that the server should no longer be serving. Things that do not help, tested: clearing
modelAccessCache/clientDataCacheSlots, rotatinganonymousId, re-login (temporary), pinning"model": "claude-fable-5[1m]"(the mid-session dialog variant still fires on first message).Workaround
DISABLE_GROWTHBOOK=1(e.g. insettings.json→env) makes the flag reader fall back to built-in defaults, which evaluate to "no gate". Verified: interactive session starts on Fable 5 (1M), first message sends with no dialog. Side effect: all remote flags/experiments are frozen to defaults, so treat it as temporary until the server-side evaluations are fixed/purged.@FZ1010 found the "why" behind the flakiness — worth surfacing, because it completes the picture.
Their analysis above traces the cross-machine / every-new-terminal variance to a stale server-side GrowthBook evaluation: the consent dialog is gated on
tengu_saffron_lattice, fetched per session fromapi.anthropic.com, and the server returns inconsistent evals —{enabled: true, planLimitsEndDate: "2026-07-20"}(stale) vs{enabled: false}(fresh) minutes apart on the same account. The client reads a pastplanLimitsEndDateas "promo over → Fable needs credits," so any session that happens to draw the stale payload shows the wall. That explains the exact 2026-07-20 start date, why/logout+/loginonly temporarily helps (the next fetch often draws fresh), and why some machines "never" see it while others see it constantly.Put together with the earlier findings, the gate behaves like an AND of two conditions:
which gives two independent client-side levers, each already A/B-verified in this cluster — clear either condition and the wall goes away:
subscriptionType="max"— theCLAUDE_CODE_SUBSCRIPTION_TYPE=maxfix (#79360). Clears the second condition. Works for setup-token auth, and for Team seats via the literal"max"(see @ripperhe's clean A/B on #79597).DISABLE_GROWTHBOOK=1(insettings.json → env) — @FZ1010's fix. Clears the first condition by falling back to built-in flag defaults. Works regardless of subscriptionType, so it's the lever for the pure-/logingroup whose plan is rendered as "Pro" (the cases I earlier flagged as needing a server-side fix — turns out there's a client-side stopgap after all). Caveat from @FZ1010: it freezes all remote flags/experiments to defaults, so treat it as temporary.(The AND model is an inference from combining the two A/Bs — @ripperhe isolated lever 1, @FZ1010 isolated lever 2 — not something either stated outright, but both independently clearing the wall is exactly what an AND gate predicts.)
Net for anyone still stuck: setup-token / Team → lever 1; plain
/loginwith the plan shown as "Pro" → lever 2. Both are stopgaps — the real fix is server-side: stop serving the two-week-staletengu_saffron_latticepayload, and give the Fable entitlement check a proper server fallback (the same one/upgradealready uses).So annoying this is still an issue and knowing Anthropic it was probably intentional for revenue-maxing. Just like how they disabled /queue while Codex and Hermes naturally have it.
For me it is working now
for Claude Code v2.1.222
Fixed in 2.1.222, and the fix is not in the changelog.
I hit this on a Max 20x plan and can confirm upgrading
2.1.221 → 2.1.222resolves it. More usefully, I captured the entitlement state on both sides, which shows this was client-side, not an account or billing problem.The evidence.
~/.claude.jsonholds the server-supplied entitlement. Every field is byte-identical before and after the fix:| field | 2.1.221 (Fable refused) | 2.1.222 (Fable works) |
|---|---|---|
|
additionalModelOptionsCache|[{value: "claude-fable-5[1m]", label: "Fable"}]| identical ||
modelAccessCache|[]| identical ||
additionalModelCostsCache|{}| identical ||
orgModelDefaultCache|null| identical ||
cachedExtraUsageDisabledReason|org_level_disabled| identical ||
oauthAccount.hasExtraUsageEnabled|false| identical ||
oauthAccount.profileFetchedAt|2026-08-05T08:58:19Z| unchanged |profileFetchedAtnot moving is the important part: the client never re-consulted the server after the update. Same cached entitlement data in, different behavior out, only the binary changed. So the server was always sending a correct Max entitlement and 2.1.221 was misreading it.This supports the alias-resolution hypothesis in this issue. Note the option string is still
claude-fable-5[1m]after the fix. Only the code reading it changed.Things that did NOT fix it, so others can skip them:
cachedExtraUsageDisabledReason: org_level_disabledandhasExtraUsageEnabled: falseare still set right now, with Fable working fine. Do not buy credits for this.claude auth logout+claude auth login. Forced a genuine profile refetch (profileFetchedAtadvanced) and the entitlement came back identical, still gated./model claude-fable-5on 2.1.221 hit the same credits prompt asclaude-fable-5[1m].Useful diagnostic while you are still on a broken build: run
/usage. If it shows a plan-covered Fable meter (mine readCurrent week (Fable) 0% used) while/modelsays credits-only, the entitlement exists and the picker is misclassifying it. That is #79412 in one command.If
claude updatefails for you too: on a slow or proxied link the built-in updater cannot finish the ~266 MB non-resumable download (socket hang up/stream has been aborted). Resumable path:Re-run the
curlverbatim after any drop;-C -resumes. Verify sha256 against the manifest. On Windows you can then swap it in while Claude Code is running, since Windows allows renaming a running executable:Move-Item claude.exe claude-<old>.exe.bakthenMove-Item claude-<VER>.exe claude.exe. Restart the session for it to take effect.Adding a Linux / Max 20x data point confirming this was still firing on 2.1.221 as of today (2026-08-05), plus a recurrence record from session logs that corroborates the flaky server-side flag evaluation traced by @FZ1010.
Environment
organizationRateLimitTier: default_claude_max_20x,organizationType: claude_max)/loginOAuth only — noCLAUDE_CODE_OAUTH_TOKEN, noANTHROPIC_API_KEY, noapiKeyHelper(so not the setup-token subset from #79597/#79360)hasExtraUsageEnabled: false,cachedExtraUsageDisabledReason: "org_level_disabled",spend.can_purchase_credits: false) — yet the dialog says "Set up usage credits on claude.ai"Recurrence record (from
~/.claude/projects/*/*.jsonl): five out of five fresh CLI sessions between 2026-07-23 and 2026-08-05 fired this at session start:Today's instance:
2026-08-05T11:37:18Zonversion: 2.1.221. NotepersistedAsDefault: true— each occurrence silently overwrites the saved default model in~/.claude/settings.json, so the downgrade sticks for future sessions even if the flag evaluation later comes back correct. This persistence is what makes the flaky-eval root cause so annoying in practice: one bad eval poisons the default until the user notices.Fable weekly quota was at ~7% used when it fired — nowhere near the 50% Max threshold. Manual
/model→ Fable on 2.1.221 hit the hard "Switch to Fable 5? … You don't have usage credits yet" dialog with no proceed option.Resolution + attribution caveat:
/logout+/logincleared it (third time since July that re-auth was the fix on this machine). However, the binary auto-updated 2.1.221 → 2.1.222 in the same window, so I can't cleanly attribute today's recovery between the re-auth and the fix reported by @wenqifu / @vondrasoft above. Will report back if it recurs on 2.1.222.Still reproducing on 2.1.223 — i.e. after the 2.1.222 fix — on Max 20x with plain OAuth. Adding it because this combination isn't yet in the thread, and because a passing headless call against a failing picker localises the defect more precisely than the reports so far.
The discriminator: headless works, picker doesn't
Same account, same binary, minutes apart.
--modelflag via-p— succeeds:Interactive
/modelin the same session — refused, with the usage-credits message and a downgrade to Opus.So the account is entitled and the API serves Fable. The gate is client-side and specific to the interactive selection path.
This corroborates @lsmith77's 2026-08-03 result (headless
claude -p --model 'claude-fable-5[1m]'returningis_error: falsewhile the picker refused), and shows that split survived the 2.1.222 fix rather than being resolved by it.Two incidental findings from the same output:
canonicalModel: "claude-fable-5"withcontextWindow: 1000000— the[1m]suffix resolves cleanly to the canonical id, and Fable's 1M window is native rather than a separate SKU. That argues against the 1M-entitlement reading in the original post, at least on this account.api_error_status.Flag state is the fixed state, and it still fires
Per @FZ1010's
tengu_saffron_latticeanalysis, this is the healthy payload — no staleplanLimitsEndDateanywhere in~/.claude.json, and Max is absent from the credits-only tier list:modelAccessCache: []andadditionalModelCostsCache: {}match the values @wenqifu recorded on both sides of the 2.1.222 fix, so they aren't the discriminator here either.Profile was refetched at 10:54 local, ~5.5h after the 2.1.223 install at 05:19, so this is not a stale-cache session.
Entitlement
Well under weekly limits; the failing session had just started.
Environment
latestchannel), installed 2026-08-06 05:19 localTERM_PROGRAM=vscode)/loginOAuth only — noCLAUDE_CODE_OAUTH_TOKEN, noclaude setup-token, noANTHROPIC_API_KEY, noANTHROPIC_AUTH_TOKEN, noANTHROPIC_BASE_URL, noapiKeyHelper. So not the #79360 / #79597 subset.~/.claude/settings.json:"model": "opus"— notclaude-fable-5[1m]. The refusal happens on interactive selection, so the saved-model repro in the original post isn't required to trigger it.Why this may be worth separating from the resolved cases
The reports marked fixed by 2.1.222 (@wenqifu, @vondrasoft) and the stale-flag mechanism (@FZ1010) both explain a client that believes the plan lacks entitlement. Neither explains this: the flags say entitled, the version carries the fix, and the API demonstrably serves Fable to this account — yet the picker still refuses.
That points at the picker's own entitlement check reading a different source than the one the
--modelpath consults, rather than at flag staleness. If it would help, I can capture the picker's decision inputs from a debug run — happy to run whatever instrumentation is useful.This shit is pissing me off. I paid for 20x claude, and I cannot use Fable 5. It tells me to add credits to my balance. I'm on the 20x plan, and its supposed to be included.
Still reproducing on 2.1.224 — one version past @alex-greenbull's 2.1.223 report — and with an entitlement state that's the inverse of every data point in this thread so far, which I think narrows the defect usefully.
The new bit:
out_of_credits, notorg_level_disabledPrior reports (@wenqifu, @bbszabi) all had usage credits disabled at org level and the flag off. Mine is the opposite and still fails:
| field | @wenqifu / @bbszabi | this report |
|---|---|---|
|
oauthAccount.hasExtraUsageEnabled|false|true||
cachedExtraUsageDisabledReason|org_level_disabled|out_of_credits||
additionalModelOptionsCache|[{value: "claude-fable-5[1m]", label: "Fable"}]| identical ||
modelAccessCache|[]| identical ||
additionalModelCostsCache|{}| identical ||
orgModelDefaultCache|null| identical ||
organizationRateLimitTier| — |default_claude_max_20x||
organizationType| — |claude_max|Same symptom from opposite sides of the credits flag. That points at the picker gating on the credit balance itself rather than on
hasExtraUsageEnabled— i.e. Fable is being routed through the extra-usage path unconditionally, instead of the plan-included path that Max is entitled to.Weekly usage at the time: "Current week (Fable)" at 25%, session at 2%, all-models week at 16%. Nowhere near any limit.
Headless works, picker refuses — confirmed on 2.1.224
Corroborating @alex-greenbull's discriminator, one version later. Same account, same binary, minutes apart. Both aliases succeed:
Note the plain alias also resolves to a 1M context window, so the
[1m]suffix isn't the discriminator here — which rules out the "1M is a separate entitlement" hypothesis raised in the original post, at least for this account.Why this proves the refusal is spurious
The account is out of credits (
cachedExtraUsageDisabledReason: "out_of_credits", zero balance). The two Fable calls above therefore cannot have been funded from credits. They must have drawn on the plan-included Fable allowance — the very allowance the picker claims doesn't exist when it says "Fable 5 requires usage credits".So the server-side plan-included path is working correctly and the client is refusing to use it. Consistent with @wenqifu's finding that this is client-side, but from a different angle: not just identical entitlement fields across the fix, but a positive demonstration that the plan path serves requests while the picker is denying it.
Environment
/loginonly — noANTHROPIC_API_KEY, noCLAUDE_CODE_OAUTH_TOKEN, noapiKeyHelper~/.claude/settings.json:"model": "claude-fable-5[1m]"/modelthen reports "Kept model as Opus 5 (1M context)"A tell worth noting: with the saved default at
claude-fable-5[1m], the downgraded session's own context still described itself as Fable 5 while/usageattributed 100% of consumption toclaude-opus-5. So the session is built against the requested model and then served by the fallback, which makes the downgrade easy to miss.Suggested fix
Gate Fable on plan entitlement first, and only fall through to the credits path when the plan genuinely doesn't include it (Pro / Team Standard, per the Help Center article). On Max, an empty credit balance should be irrelevant to Fable selection while the weekly Fable allowance has headroom.
Still reproducible on v2.1.224 — Max 20x, CLI on WSL2 Ubuntu.
Today at 17:49 UTC, a new session with saved default model
claude-fable-5showed the "Fable 5 requires usage credits" consent prompt. I declined and the session fell back to Opus 5. The transcript recorded:A new session on the same machine 3 minutes later (17:52 UTC) started on
claude-fable-5with no prompt, running on plan limits. So the prompt came from stale entitlement state, not from the 50% weekly Fable cap. A real cap does not clear in 3 minutes.Note: this happened on 2.1.224, so the 2.1.219 fix ("Fixed the Fable model row showing 'Requires usage credits' for plans that include it, when a stale cache had baked the label in") does not cover this path.
Correction to my comment above: the "Fixed in 2.1.222" claim was wrong. Please disregard it.
I upgraded 2.1.221 → 2.1.222, Fable worked, and I reported it fixed. It broke again the next day. The same "upgrade fixes it" pattern then repeated with 2.1.223 and also failed to hold. Full log, Max 20x, plain
/login, Windows:| when | client | Fable |
|---|---|---|
| Aug 5 | 2.1.221 | refused |
| Aug 5 | 2.1.222 (just swapped) | worked |
| Aug 6 | 2.1.222 | refused |
| Aug 6 | 2.1.223 (just swapped) | worked |
| Aug 8 | 2.1.223 | refused |
| Aug 8 | 2.1.223, nothing changed | worked again |
The last row is the one that matters: it recovered with no version change, no re-auth, and no entitlement change.
oauthAccount.profileFetchedAtdid not move and every entitlement field was byte-identical to the refusing state. So the version correlation in my earlier comment was coincidence. Each apparent "fix" was really just a restart, and a restart is what re-rolls the outcome.That is what @FZ1010's
tengu_saffron_latticeanalysis predicts: the flag is evaluated per session and the server returns it inconsistently, so every new session is a fresh draw. It accounts for the intermittency, for why upgrading appears to work (you restart), for why re-auth works for some people, and for why it always comes back.Constant across every refusal and every success on this account:
The entitlement never wavered. Confirming @MarkNJennings and @alex-greenbull on the cap too: one refusal happened at 81% of the weekly Fable allowance and another at 0%, so consumption is not the discriminator either.
Things that did not durably fix it here: upgrading (three times),
claude auth logout+login, selecting the unsuffixedclaude-fable-5, and clearingmodelAccessCache/clientDataCacheSlots/cachedGrowthBookFeatures. One warning on that last one: deletingadditionalModelOptionsCacheremoves Fable from the/modelpicker entirely until the next profile fetch repopulates it, which made things worse rather than better.Now running
DISABLE_GROWTHBOOK=1per @FZ1010. I will report back on whether it holds beyond a single day, which is the bar my earlier comment failed to clear.Apologies to anyone who upgraded on the strength of that comment.
Confirming this on a similar setup — settings.json fix worked for me.
Environment:
Claude Code 2.1.225
Windows 11
Plan: Max 20x, weekly limits not exhausted
Symptom: Same as reported — session downgraded to Opus with "Fable 5 requires usage credits," despite being well under my weekly limit.
Fix: Changed "model": "claude-fable-5[1m]" to "model": "claude-fable-5" (dropped the [1m] suffix) in ~/.claude/settings.json, restarted the session, and Fable 5 loaded normally without the credits prompt.
This supports the alias-resolution hypothesis — the entitlement check seems to choke specifically on the literal [1m] suffix rather than resolving it to the base model + context flag. Would be great to get a fix (or at least a clearer error message pointing users toward this workaround) since it's not obvious that dropping [1m] restores standard access.
Can confirm, with a version bisection: works on 2.1.212, fails on 2.1.220 and 2.1.223 — same account, same day.
Setup: Max plan, weekly limits not exhausted (Fable usage well under 50%), macOS (darwin-arm64), npm install, "model": "claude-fable-5[1m]" in ~/.claude/settings.json. Reproduced across two machines on the same account.
On 2.1.220 and 2.1.223: exact symptom described in this issue — session silently switches to Opus 4.8 with "Fable 5 requires usage credits," and /model routes to the credits page.
On 2.1.212 (pinned via npm): claude-fable-5[1m] works with no credits prompt. /status shows Model: claude-fable-5[1m] (claude-fable-5), and /context reports the 1M window applied (231.7k/1m tokens). Note the model picker does not list a Fable 1M variant on either version — the string must be entered manually.
This brackets the regression to somewhere in 2.1.213–2.1.220. It also seems to weigh against the "1M is a separate entitlement" theory, since 2.1.212 serves Fable at 1M within Max inclusion against the same post-July-20 backend — consistent with the alias-resolution hypothesis in the OP (entitlement check running against the literal [1m] string in newer versions).
I am past 200K and still going:
/context
⎿ Context Usage
⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ Fable 5
⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ claude-fable-5
⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ 231.7k/1m tokens (23%)
⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶
⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ Estimated usage by category
⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛁ System prompt: 4.2k tokens (0.4%)
⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛁ System tools: 16.2k tokens (1.6%)
⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛁ Memory files: 13.8k tokens (1.4%)
⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛁ Skills: 3.7k tokens (0.4%)
⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛁ Messages: 194.5k tokens (19.4%)
⛶ Free space: 767.5k (76.8%)
Same on Max x20, Claude Code 2.1.220, macOS 27.0.
Slightly different trigger than the OP, which may narrow it down: mine isn't a settings-pinned Fable model. My
~/.claude/settings.jsonhas"model": "opus[1m]"; Fable 5 was selected in-session and running fine.Sequence: run
/login→ browser auth completes → back in the terminal, the session is booted down to Opus withMax x20 includes Fable 5 at 50% of weekly limits, and my live utilization at the time was 4% on the 5-hour window and 1% on the 7-day (read live, not from a cache), so "you don't have usage credits yet" is factually wrong for this account.
So the entitlement check appears to re-run on re-auth and fail there, even when Fable was never set in settings — which suggests whatever is broken sits in the post-login model-resolution path, not only in reading a
claude-fable-5[1m]value out of config. If the alias-resolution hypothesis in the OP is right, note that my default is also a[1m]alias (opus[1m]), so a suffix-handling defect would be consistent with both reports.Additional repro details: entitlement is lost specifically on the token refresh path (Windows only)
I can reproduce this consistently on Windows and have narrowed down the trigger. Fable 5 works fine immediately after a fresh login, but breaks after the OAuth access token expires during a long-idle session.
Environment
Claude Code 2.1.227 (terminal), Windows 11 Pro 10.0.26200
Claude Max (20x) subscription, OAuth login (no ANTHROPIC_API_KEY, no apiKeyHelper)
Same account works fine on macOS and Linux — this only happens on Windows
Timeline (local time, UTC+9)
Aug 10, 15:56 — Ran /logout → /login. Fresh token written to ~/.claude/.credentials.json (subscriptionType: max, rateLimitTier: default_claude_max_20x). Fable 5 immediately selectable and working.
Aug 10, 19:04 — Last successful claude-fable-5 response in the session (confirmed from the session transcript).
Aug 10, 23:56 — Access token expired (expiresAt was exactly 12h after issuance). Session left idle overnight, connection kept open.
Aug 11, 14:33 — Sent a new prompt in the same session. The prompt was logged in the transcript but no assistant message followed — instead the "usage credits required" gate appeared, before any API call was made.
Key observations
.credentials.json was never rewritten after the fresh login (mtime still Aug 10 15:56 when I inspected it on Aug 11). Whatever refresh happened on the first request after expiry either failed to persist, or produced a token that doesn't carry the Max/Fable entitlement.
Running /logout → /login again immediately restores Fable access, so the entitlement itself is fine on the account — it's only the refresh path that loses it.
Reproduces reliably: leave a session idle past the 12h token lifetime, then send any prompt.
Thanks for the unusually thorough report. Triaged on Linux against the released 2.1.233 build.
What I tried: dropped in your exact
~/.claude/settings.json("model": "claude-fable-5[1m]","switchModelsOnFlag": false) and started a session. It ran on Fable 5 at a 1M context window — no credits prompt, no downgrade. I couldn't match step 1 (a Max plan), so I can't drive the plan-entitlement path itself from here.On the hypothesis:
[1m]normalization for Fable was fixed back in 2.1.173, before your 2.1.215, and my run confirms the suffix resolves correctly. So alias resolution isn't what's failing here — the credits decision is made from your account's plan entitlement, not from the model string.What does match your symptom are two fixes released after 2.1.215:
Changelog — please update to 2.1.233 or later and sign out/in once so a fresh token is used.
On the label difference: Fable 5 includes 1M context by default, so it has no separate "(1M context)" variant to label, while Opus ships both. Closing — reply and we'll reopen if it still happens on 2.1.233+.
🤖 Generated with Claude Code
**Still reproducing on 2.1.237 — and it is specifically the in-session switch path, not Fable access itself.**
Max 5x, clean env, fresh login. On the same binary and the same account, within the same hour:
| Path | Result |
| --- | --- |
|
claude --model claude-fable-5(launch) | ✅Fable 5 with high effort · Claude Max||
/model fable(in-session switch) | ❌Fable 5 runs on usage credits — you have $0.00 in credits||
/model claude-fable-5(in-session, explicit base id) | ❌ same dialog ||
claude -p --model fable(headless) | ✅ runs, bills to plan ||
claude -p --model 'claude-fable-5[1m]'(headless) | ✅ runs, bills to plan |Launch-time and headless resolve the entitlement correctly on this account; only the in-session switch check fails. Interactive launch was verified by driving the real TUI in a pty, not inferred from config.
This also means the workaround given in #82722 ("typing
/model claude-fable-5manually works fine") does not hold on 2.1.237 — retested, still gated.The server disagrees with the client at the same moment.
GET /api/oauth/profile, using the client's own access token:~/.claude.json, written by the client right after its own profile fetch:Ruled out, so this is not a duplicate of the usual suspects:
env | grep -iE 'claude|anthropic'is clean. NoCLAUDE_CODE_OAUTH_TOKEN, noANTHROPIC_API_KEY, noapiKeyHelper, noenvblock in any settings.json.has_claude_max: Truefor this exact token, so the account-side entitlement is present.hasAvailableSubscription, yet Fable runs anyway at launch — so that flag appears to be a red herring rather than the gate's input.GET /api/oauth/usage: 5h 4%, weekly-all 9%, and aweekly_scopedbucket withscope.model.display_name = "Fable"at 0%.Two observations from
/api/oauth/usagethat may be the actual lead:scope.model.display_name = "Fable"butscope.model.id = null. If the switch-path check matches the target model id against the scoped-limit model id, a null id could never match and would fall through to "credits required" — which would explain why launch-time, which presumably doesn't run that comparison, succeeds. Speculative: I haven't seen the client code.spend.can_purchase_credits = falseon this account. So the dialog's only actionable option, "Manage usage credits on claude.ai", is a dead end here. Whatever the gate's cause, it is offering a remedy the account cannot perform.Practical impact: on Max, changing models mid-session is impossible — the session has to be discarded and relaunched with
--model claude-fable-5.Env: macOS 26 (darwin 25.3.0, arm64), Claude Code 2.1.237 native install, Max 5x (
default_claude_max_5x), OAuth login, no API key, no gateway.Happy to provide account identifiers privately.