Source Intelligence

DisclaimerUnofficial, and not affiliated with Anthropic. Nearly all of this is read straight out of what ships: npm bundles, captured prompts, published docs. Anthropic's own notes go in verbatim, marked as theirs. The rest is my reading, and every entry carries the strings behind it. If one looks wrong, vote it down and say why.

All of v2.1.220 Home All releases olderv2.1.219 v2.1.221newer
Claude Code v2.1.220

Refusal fallback no longer picks Opus 5 when entitlements are unknown

You'll notice
Useful3 Signal0
Model Fallback

When a refusal triggers a model switch and entitlements are unknown, you get Opus 4.8 instead of Opus 5.

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.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

See this entry in the whole of v2.1.220 →