Follow Discord
Sweep 22 Oct 2026 · 04:32Z Build v2.1.308 527 read Stable v2.1.308 Latest v2.1.308 Next v2.1.308 Feeds RSS JSON llms.txt llms-full.txt Unofficial

Claude Code v2.1.220 ·

Refusal fallback no longer picks Opus 5 when entitlements are unknown

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

You'll notice Improvements
JSON All of v2.1.220
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.

See this entry in the whole of v2.1.220 →

Feedback