{"version":"2.1.220","anchor":"refusal-fallback-no-longer-picks-opus-5-when-entitlements-ar","canonical_anchor":"refusal-fallback-no-longer-picks-opus-5-when-entitlements-ar","heading":"Refusal fallback no longer picks Opus 5 when entitlements are unknown","tier":"notice","area":"Model Fallback","scope":null,"heads_up":null,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.220\/e\/refusal-fallback-no-longer-picks-opus-5-when-entitlements-ar","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.220","markdown":"### Refusal fallback no longer picks Opus 5 when entitlements are unknown\n\nWhen a refusal triggers a model switch and entitlements are unknown, you get Opus 4.8 instead of Opus 5.\n\n**What**\n\nThe 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.\n\n**Details**\n\n- 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.\n- 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\")`.\n- 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))`.\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.\n\n**Evidence**\n\n`claude-opus-4-8`\n\n- Area: Model Fallback\n- Tier: You'll notice\n- Useful: 3\/5\n- Signal: 0\/5"}