Sonnet 5 selected and displayed, but every response is silently served by claude-fable-5, consuming capped Fable allowance
<img width="1277" height="672" alt="Image" src="https://github.com/user-attachments/assets/f92c5cf2-f285-4b8d-a6eb-30e9c9199f50" />
Description
Since 07-02-26, every assistant response in my Claude Code sessions has been served by claude-fable-5 despite the model being explicitly set to Sonnet 5. The UI reports Sonnet 5 everywhere: the status line shows [Sonnet 5], /model confirms "Set model to Sonnet 5", and the injected system prompt tells the model it is claude-sonnet-5. But the server-side "model" field stamped on every assistant message in the session transcript JSONL says claude-fable-5.
Steps to reproduce
- Set model to Sonnet 5 via /model (status line confirms [Sonnet 5])
- Run any turns
- Inspect the session transcript in ~/.claude/projects/<project>/<session-id>.jsonl
- Every "type":"assistant" record shows "model":"claude-fable-5"
Evidence (redacted transcript excerpts)
First/middle/last assistant records from each session's local transcript JSONL. Content redacted; timestamps, session IDs, server-issued message IDs, and model stamps verbatim. Full transcripts available privately on request.
Session A, model set to Sonnet 5, 546/546 turns served by fable-5:
{"timestamp": "2026-07-03T16:59:24.675Z", "sessionId": "2c9bffa8-a823-456e-be0c-fb348c21ecbf", "type": "assistant", "message": {"model": "claude-fable-5", "id": "msg_01Dm3iCPYaS6wrVRjNjt8qua", "content": "<REDACTED>"}}
{"timestamp": "2026-07-03T23:05:44.842Z", "sessionId": "2c9bffa8-a823-456e-be0c-fb348c21ecbf", "type": "assistant", "message": {"model": "claude-fable-5", "id": "msg_01XBZqRwJ6E39KFjxhaW1eq5", "content": "<REDACTED>"}}
{"timestamp": "2026-07-04T05:54:10.982Z", "sessionId": "2c9bffa8-a823-456e-be0c-fb348c21ecbf", "type": "assistant", "message": {"model": "claude-fable-5", "id": "msg_017eBtwTDDapySXMhJYKU5j3", "content": "<REDACTED>"}}
Session B, Sonnet 5 re-selected via /model mid-session, 67/67 turns served by fable-5:
{"timestamp": "2026-07-04T06:52:13.680Z", "sessionId": "e803a47f-4b18-4ac7-bc82-d6206367d15c", "type": "assistant", "message": {"model": "claude-fable-5", "id": "msg_01JytSDLeHdQrkWN66VWjoUV", "content": "<REDACTED>"}}
{"timestamp": "2026-07-04T17:45:57.539Z", "sessionId": "e803a47f-4b18-4ac7-bc82-d6206367d15c", "type": "assistant", "message": {"model": "claude-fable-5", "id": "msg_01TMF4HdGHCLVuysybXLhGka", "content": "<REDACTED>"}}
Control, session ending 2026-07-02 before the Fable 5 redeployment, correctly served as configured:
{"timestamp": "2026-06-29T16:37:27.730Z", "sessionId": "2c419fdd-39af-4f0e-8845-697d5461a75d", "type": "assistant", "message": {"model": "claude-opus-4-8", "id": "msg_01BFc5kQYiRgRPZWf8vaiPig", "content": "<REDACTED>"}}
{"timestamp": "2026-07-02T20:47:13.260Z", "sessionId": "2c419fdd-39af-4f0e-8845-697d5461a75d", "type": "assistant", "message": {"model": "claude-opus-4-8", "id": "msg_012hVSFmiburdLnFudZ3rfCG", "content": "<REDACTED>"}}
Expected behavior
Selecting Sonnet 5 serves claude-sonnet-5. The published model-switching policy (help center article 15363606) covers exactly one automatic switch: Fable 5 falling back to Opus 4.8 on safety blocks, with a visible notice and response labeling. Silent upward routing from Sonnet to Fable, with the UI continuing to claim Sonnet, is documented nowhere.
Impact
Fable 5 access on Max plan is a limited allowance through 6/7/26. I had explicitly planned how to spend my remaining Fable 5 capacity. Instead, lightweight HTML/deck iteration that I deliberately routed to Sonnet 5 was silently served by Fable, consuming that allowance roughly 3x faster than the model I chose. The plan I built around my remaining Fable access is now destroyed. Beyond my case, this means Max users cannot trust that the displayed model is the billing/limits reality.
Environment
- Claude Code CLI 2.1.201, macOS (Darwin 25.5.0), iTerm2
- Max 5x plan
- settings.json model was opus[1m] for part of the window; explicitly re-set to Sonnet 5 via /model with no change in serving
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
件名: Fable 5モデルの割当が正しく機能しない(既知のインシデントに関連)
Claude Code(Max プラン)で
/model claude-fable-5を選択しても、UI上はFable5に切り替わったように見えるにもかかわらず、実際にはSonnet 5に戻ってしまう現象が発生しています。早急な修正と、影響を受けた利用枠の補填を希望します。
Thanks for the detailed transcript excerpts — that made this easy to narrow down.
What we checked: the
modelvalue stamped on each assistant record in the session transcript is the model name the API returned for that response, not something the CLI decides locally. When Sonnet 5 is selected, the CLI sendsclaude-sonnet-5in the request (which matches what you saw in the system prompt), so aclaude-fable-5stamp means the response was served by Fable on the API side. Nothing in the CLI remaps a Sonnet selection to Fable.We tried to reproduce on the current release, 2.1.233 (macOS):
claude -p "Reply with OK" --model sonnet --output-format stream-jsonand the same with--model claude-sonnet-5. Every assistant record and the usage summary came back asclaude-sonnet-5. So we can't reproduce it today; this looks like it was on the serving side around July 2–4 rather than a bug in the CLI itself, and we're passing the message IDs you included along to the team that owns model serving and usage accounting.If you still see Sonnet 5 sessions stamped
claude-fable-5on 2.1.233 or later, please reply with the date/time, one fresh assistant message ID, andclaude doctoroutput, and we'll dig back in.🤖 Generated with Claude Code
We weren't able to reproduce this. Could you provide steps to trigger the issue — what you ran, what happened, and what you expected? This issue will be closed automatically if there's no activity within 7 days.