You'll noticeTier: how much it should matter to you
3Useful: my rating, 1 to 5
0Signal: worth watching, 1 to 5
Model FallbackArea: what it touches
ImprovementsKind: in v2.1.220,
ImprovementsSection of the release
What
The refusal and model-fallback picker gained a normalization step that rewrites any model whose canonical id is "claude-opus-5" to "claude-opus-4-8" before it is used as a fallback target. A refusal that used to fall back to Claude Opus 5 on affected setups now falls back to Claude Opus 4.8.
Details
The first-party branch went from if (!rm()) return s2c("claude-opus-4-8"); let r = EE(); in 2.1.219 to if (!rm()) return l2c(c2c); let r = d2c(EE());, where c2c is the constant "claude-opus-4-8" and d2c performs the mapping.
The next-fallback-model resolver applies the same mapping: l2c(rm() ? r.id : s2c(r.id), "exact") becomes f2c(rm() ? d2c(r.id) : l2c(r.id), "exact").
The non-exact candidate scan skips the same models: Gji().find((n) => N1e(lo(n)) && !u2c(n) && r(n)) versus the old Uji().find((n) => N1e(lo(n)) && r(n)).
The gate is a runtime condition, not a remote flag. The substitution only applies when the helper body Hn() === "firstParty" && zA() && !bH() && eZ() === null && ZJt().length === 0 holds, the same predicate the build reports elsewhere as entitlement_blind. Otherwise behaviour is unchanged.
Evidence
claude-opus-4-8
Strings lifted out of the shipped bundle, so the claim above can be checked against them.