When a refusal triggers a model switch and entitlements are unknown, you get Opus 4.8 instead of Opus 5.
What's wrong with this entry?
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.
- The first-party branch went from
if (!rm()) return s2c("claude-opus-4-8"); let r = EE();in 2.1.219 toif (!rm()) return l2c(c2c); let r = d2c(EE());, wherec2cis the constant "claude-opus-4-8" andd2cperforms the mapping. - The next-fallback-model resolver applies the same mapping:
l2c(rm() ? r.id : s2c(r.id), "exact")becomesf2c(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 oldUji().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 === 0holds, the same predicate the build reports elsewhere asentitlement_blind. Otherwise behaviour is unchanged.
claude-opus-4-8
Strings lifted out of the shipped bundle, so the claim above can be checked against them.
Related
Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.
-
v2.1.222
Model refusal fallback updates the shown model
Both mention model fallback
-
v2.1.227
Advisor calls carry prior turns and a refusal fallback
Both mention model fallback
-
v2.1.227
Model roster flag can redirect refusal fallback
Both mention model fallback