[Bug] Anthropic API fallback from claude-fable-5 to claude-opus-5 silently discards prompt cache
Bug Description
# Bug report: claude-fable-5 silently falls back to claude-opus-5 (13 occurrences, one-way, never recovers)
## Environment
| Item | Value |
|---|---|
| Claude Code | 2.1.220 |
| OS | Windows 11 Pro, Build 26200 (x64) |
| Node | v24.14.1 |
| settings.json model | claude-fable-5[1m] |
| effortLevel | high |
| Concurrent sessions | 8 |
## Summary
With claude-fable-5[1m] pinned in settings.json, sessions are repeatedly switched to claude-opus-5 by a server-emitted fallback event. Across 13 occurrences (2026-07-31 10:57:56 to 2026-08-02 07:48:28) the switch is always in the same direction - there is not a single fallback back to claude-fable-5, and no automatic recovery. The pinned model only returns when I manually re-select it via /model.
The transcripts contain the event itself but no reason field:
``json
{"type":"fallback","from":{"model":"claude-fable-5"},"to":{"model":"claude-opus-5"}}
`
## Why this is severe rather than cosmetic
Each fallback invalidates the prompt cache. The transcripts record this explicitly next to the fallback events:
`json
"diagnostics":{"cache_miss_reason":{"type":"model_changed","cache_missed_input_tokens":[REDACTED]}}
`
Observed values in this data set: **190,979, 239,142, 318,538, 352,623, 387,782, 403,938, 495,480, 541,124, 620,688, 621,442** cache-missed input tokens. The session then stalls while the whole context is re-read. From the user side this is indistinguishable from a hang - which is exactly how it was first reported ("Fable collapses after seconds").
## Evidence: all 13 occurrences
| # | Timestamp (local, CEST) | Session | From | To | requestId | Tool call in flight | Cache tokens lost |
|---|---|---|---|---|---|---|---|
| 1 | 2026-07-31 10:57:56 | 440ce71a | claude-fable-5 | claude-opus-5 | req_011Cda1tyMHmfg7FCrAwozjL | Grep | 318,538 |
| 2 | 2026-07-31 13:03:26 | 440ce71a | claude-fable-5 | claude-opus-5 | req_011CdaBSqyDxevMtFhKNHPZz | PowerShell | 495,480 |
| 3 | 2026-08-01 00:36:56 | faa2d9b2 | claude-fable-5 | claude-opus-5 | req_011Cdb6M2GMCExGcdAoH5kfv | Read | 239,142 |
| 4 | 2026-08-01 07:56:31 | 6bc51f13 | claude-fable-5 | claude-opus-5 | req_011CdbfrX6baHi69Dv6eA9Yk | Read | (not recorded) |
| 5 | 2026-08-01 09:39:07 | 6bc51f13 | claude-fable-5 | claude-opus-5 | req_011Cdbog8P1TAhnXa5Uu4Az5 | (none recorded) | 352,623 |
| 6 | 2026-08-01 09:43:27 | 69a5df51 | claude-fable-5 | claude-opus-5 | req_011Cdbp1fz5651xgY5L9BU9y | PowerShell | (not recorded) |
| 7 | 2026-08-01 09:55:18 | 69a5df51 | claude-fable-5 | claude-opus-5 | req_011CdbpueaRxkfqMaKU5ECzH | (none recorded) | 190,979 |
| 8 | 2026-08-01 14:47:08 | 6bc51f13 | claude-fable-5 | claude-opus-5 | req_011CdcD9xgK2CB9zwEwuXk5u | (none recorded) | 541,124 |
| 9 | 2026-08-01 18:13:30 | 6bc51f13 | claude-fable-5 | claude-opus-5 | req_011CdcUrMhmDthKb9faGX2gQ | (none recorded) | 620,688 |
| 10 | 2026-08-01 18:15:14 | 6bc51f13 | claude-fable-5 | claude-opus-5 | req_011CdcV3F6hfz6iDGtwfH8hv | (none recorded) | 621,442 |
| 11 | 2026-08-01 19:19:21 | b1e59816 | claude-fable-5 | claude-opus-5 | req_011CdcZkC12jRmuHvUn2imqD | Read | 387,782 |
| 12 | 2026-08-01 19:48:55 | b1e59816 | claude-fable-5 | claude-opus-5 | req_011CdccBaxLCY8yXNXhntQDw | PowerShell | 403,938 |
| 13 | 2026-08-02 07:48:28 | 6bc51f13 | claude-fable-5 | claude-opus-5 | req_011CddZ3JFvTUFCsHR2hxPaz | (none recorded) | (not recorded) |
Reverse fallbacks (claude-opus-5 -> claude-fable-5) in the same data set: **0**.
Model mix per affected session (assistant messages):
- 440ce71a: claude-fable-5=559, claude-opus-4-8=202, claude-opus-5=290
- 69a5df51: claude-fable-5=472, claude-opus-5=336
- 6bc51f13: <synthetic>=3, claude-fable-5=111, claude-opus-5=1035
- b1e59816: <synthetic>=1, claude-fable-5=6, claude-opus-4-8=621, claude-opus-5=812
- faa2d9b2: claude-fable-5=166, claude-opus-5=548
## What I ruled out locally
- **Not a client crash.** All 8 claude.exe processes ran continuously for 9.5-36.6 hours with zero restarts. Zero Windows Application error events (1000/1001/1002), zero WER reports for claude.exe/node.exe, zero Resource-Exhaustion events in 48h.
- **Not a stream abort.** Only 5 API Error: Connection closed mid-response messages exist across all sessions in 40 hours - far too few to explain the observed behaviour, and not correlated with the fallbacks.
- **Not content-triggered, as far as the transcript shows.** Every fallback occurs in the middle of an ordinary tool call - Read of a scratchpad note, PowerShell running nvidia-smi, Read of a Python config file, Grep`. None coincides…
Note: Content was truncated.