- Bug fixes and reliability improvements
anthropics/claude-code · CHANGELOG.md · 1 entries · synced automatically when Anthropic publishes official notes for a version.
Version 2.1.220 adds a new beta header to auto-mode classifier requests. Model selection is now more conservative when entitlements cannot be read: Opus 5 is skipped entirely if the client cannot see model entitlements, and refusal fallback will no longer select Opus 5 when entitlement state is unknown. The classifier beta-rejection latch still keys off a null placeholder and remains in development, though its warning text has been reworded. The rest of the release is internal, covering the version and build stamp bump to 2.1.220 and a bundle-wide reformatting pass that leaves behavior unchanged, with prompt text for /code-review, /simplify, skill-saving, and credential paths byte-identical to the prior release.
anthropics/claude-code · CHANGELOG.md · 1 entries · synced automatically when Anthropic publishes official notes for a version.
Anything you can use today, anything that visibly changes, and anything worth poking at. One line each, open for detail.
The automatic retry that would drop a rejected classifier beta can never trigger in this build.
The path that drops a classifier beta after an HTTP 400 followed by a successful bare retry is keyed on a beta constant that is null in both builds, so it never fires.
null in 2.1.219 and 2.1.220 alike.tengu_auto_mode_beta_latch and permission_auto_mode_classifier, is present but unreachable.tengu_auto_mode_beta_latch
Auto mode's permission classifier now tags its requests with a beta marker on Anthropic-hosted sessions.
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETASThe permission classifier used by auto mode attaches a beta descriptor to its API requests, where the previous build sent none. Both classifier stages now carry it.
WA("auto_mode_classifier", "auto-mode-classifier-2026-07-16") and adds it to the frozen known-betas list, so it is also reachable through the header lookup map.extraBetas array; it now returns this beta.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS or hipaa mode, in which case the list stays empty.auto-mode-classifier-2026-07-16
If your session has no model access info cached, Claude won't fall back to Opus 5.
A new predicate detects sessions where Claude Code has no entitlement data at all, and the Opus lineup walk used for refusal fallback filters Opus 5 out in that state.
isEntitlementOverlayUnavailable returns true when the provider is first-party, an OAuth token is stored, the profile scope is absent, no Anthropic API key is set, and the cached model-access list is empty..find((n) => N1e(lo(n)) && !u2c(n) && r(n)), and a sibling helper substitutes "claude-opus-4-8" in its place.isEntitlementOverlayUnavailable
When a refusal triggers a model switch and entitlements are unknown, you get Opus 4.8 instead of Opus 5.
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.
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.l2c(rm() ? r.id : s2c(r.id), "exact") becomes f2c(rm() ? d2c(r.id) : l2c(r.id), "exact").Gji().find((n) => N1e(lo(n)) && !u2c(n) && r(n)) versus the old Uji().find((n) => N1e(lo(n)) && r(n)).Hn() === "firstParty" && zA() && !bH() && eZ() === null && ZJt().length === 0 holds, the same predicate the build reports elsewhere as entitlement_blind. Otherwise behaviour is unchanged.claude-opus-4-8
The version shown in /status, bug reports and update checks is now 2.1.220.
/statusThe build-time constant block embedded throughout the bundle carries a new version, timestamp and commit hash, rethreaded through roughly 55 call sites.
claude-code/<version> user agent, update-check output (Current version: ), telemetry and analytics payloads, and the npm install/view commands targeting @anthropic-ai/claude-code.BUILD_REF_NAME suffix helper still returns the empty string, and the JOSE compactDecrypt calls in the OIDC JWE path were re-minified with no behaviour change.VERSION: "2.1.220", BUILD_TIME: "2026-07-24T22:17:45Z"
A warning message about a rejected classifier beta was reworded, though you can't reach it.
The warn-level log emitted when the auto-mode classifier's beta is rejected changes from "the bare retry succeeded" to "the retry without it succeeded".
beta rejected (HTTP 400) and the retry without it succeeded
Assorted internal code was reformatted and renamed with nothing you can perceive changing.
Several unrelated areas were reflowed or had their module-init closures renamed, with no semantic difference found in any of them.
createHash("sha1") and createHash("sha256"), MCP server-config mapping, the SDK set_model control request, QR-code rendering and several string-splitting sites./worktrees/ and config.worktree.lock.failed to validate JWT signature
Version strings in update messages, doctor output and daemon logs were re-stamped to 2.1.220.
claude updateThe inlined build constants appearing in around 40 user-visible and log strings were re-stamped, with no surrounding logic touched.
claude update messages, user agents, doctor output and daemon logs.GIT_SHA: "4073f59596e272f39393db4f96abc5f4b10eff21"
Code review, simplify and skill-saving instructions are unchanged despite looking rewritten in the bundle.
/code-review/simplifyA large group of apparently new and removed code is pure bundler renaming, with prompt wording unchanged from 2.1.219.
## Phase 3 \u2014 Sweep for gaps