Feature: auto-restore the primary model after a model_refusal_fallback instead of staying on the fallback for the rest of the session

Open 💬 0 comments Opened Jun 10, 2026 by phsb5321

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)

  1. 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 fable the same session keeps working on Fable for hundreds of messages).
  2. A setting akin to the new fallbackModel (2.1.166) to opt into auto-restore, e.g. refusalFallback: "retry-only" | "sticky".
  3. 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 fable after each flip.
  • A UserPromptSubmit/Stop hook that tails the transcript for model_refusal_fallback events 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).

View original on GitHub ↗