Feature: auto-restore the primary model after a model_refusal_fallback instead of staying on the fallback for the rest of the session
Problem
When Fable 5's safety classifier flags a message, Claude Code emits a model_refusal_fallback system event (direction: retry), retries the turn on Opus 4.8 — and then stays on Opus 4.8 for the remainder of the session. There is no automatic return to the user's selected model, and the one-line warning is easy to miss in a busy session.
For users running many parallel sessions this silently degrades whole fleets: on a single day I found 7 sessions across 7 projects that had each flipped to Opus after one classifier hit (workloads touching terminal-automation escape sequences and security tooling trip the cybersecurity heuristic regularly — see #66657 for false-positive reports). Each flip also silently changes the context window (fable-5[1m] → plain opus-4-8).
Transcript evidence (2.1.170):
{"type":"system","subtype":"model_refusal_fallback","direction":"retry",
"originalModel":"claude-fable-5[1m]","level":"warning","trigger":"refusal",
"content":"Fable 5's safety measures flagged this message ... Switched to Opus 4.8."}
After this event every subsequent assistant message is claude-opus-4-8 until a manual /model.
Expected behavior (any of these would resolve it)
- Retry-then-return: use the fallback model for the flagged request only, returning to the primary model on the next turn (the classifier scores per-message, so one flagged message shouldn't re-route the whole session — empirically, after a manual
/model fablethe same session keeps working on Fable for hundreds of messages). - A setting akin to the new
fallbackModel(2.1.166) to opt into auto-restore, e.g.refusalFallback: "retry-only" | "sticky". - At minimum: make the switch loud (persistent statusline indicator / re-warn on each subsequent turn) so users notice they're no longer on their selected model.
Current workarounds
- Manual
/model fableafter each flip. - A UserPromptSubmit/Stop hook that tails the transcript for
model_refusal_fallbackevents and nags + desktop-notifies (hooks cannot restore the model themselves — there is no programmatic/model).
Environment
- Claude Code 2.1.170, Linux (NixOS), Max plan
- Model: `claude-fable-5[1m]" set via /model and settings.json
Related: #66657 (classifier false-positives — this issue is about the stickiness of the fallback, which amplifies every false positive into a session-long downgrade).