Huge stability pass with 121 fixes across mods, MCP, plugins and cloud sessions, plus idle compaction that avoids cache-expiry reprocessing and new /usage warnings.
CLAUDE_CODE_DISABLE_FILE_MENTIONS environment variable: Claude gets the paths of @ file mentions to read with its file tools, not the files' contentsCLAUDE_CODE_IDLE_COMPACT_MIN_TOKENS to change idle compaction's 200K-token minimum; "idleCompaction": false in settings.json turns it off. Both need v2.1.290 or later$.prompt.media so a prompt.submit hook of a mod installed by managed settings can read the bytes of an image or document attached to the prompt$.session.identity() for mods installed by managed settings: how the session is signed in, and its organization and email when managed forceLoginOrgUUID lists that organizationsize, weight, mono and tabular to a mod's Text and named spacing steps (xs to xl) to its Box; bold is deprecated in favor of weight--shutdown-drain-sec to claude self-hosted-runner orchestrator: on SIGTERM it stops polling and gives the poll in flight and running spawn hooks up to that many seconds to finishskill.prompt hook receives/effort and /fast in agent view to set what new sessions start with; a bare /model, /effort or /fast there now opens a picker--safe-mode--disallow-tools and a disallowed_tools case field to claude plugin eval to keep specific built-in tools, such as Agent, out of eval runsCLAUDE_CODE_ATTRIBUTION_HEADER=0 in the env of a Claude apps gateway's code policyCLAUDE_CODE_ATTRIBUTION_HEADER=0queue door to the session.append mod hook, so a mod can make the transcript's queue records differ from the prompt as sent/plugin and claude plugin validate naming a mod's hooks that are skipped where an organization manages Claude Code/usage warnings for max effort, workflows, always-on context and large tool resultsclaude auth loginanthropic-skills: prefix to it/reload-skills to say it re-sends the full skill list to Claude, which is how to get skills back after compactionapiKeyHelper was in useANTHROPIC_BASE_URL ending with "Prompt is too long · automatic compaction failed" near 200K tokens instead of sending the request--max-turns, --max-budget-usd, an interrupt, or the end of the host's conversation.claude in itUserPromptSubmit or mod prompt.submit hooks were still running (regression in 2.1.296)--plugin-dir folder, whose code Claude Code reloads and runs outside the sandbox--debug, --debug-file), and a hang on exit when the debug log is on a disk or network mount that stops accepting writes-c scripts that don't run rm. An rm built at run time in a script Claude Code can't read no longer prompts unless CLAUDE_CODE_STRICT_INLINE_SHELL_RM_PROMPT=1claude mcp list, claude doctor and /status reporting an empty .mcp.json as invalid/btw jumping the transcript to the bottom when asked while scrolled up in fullscreenbwrap: Can't mkdir /mnt/c/Program Files/ClaudeCode when the sandbox can write to the Windows driveclaude remote-control sessionsprompt.submit rewrite being silently dropped, sending the prompt as typed, for some prompts with a pasted image or an image that can't be read.config.json in the config directory/sandbox reporting success when its setting could not be saved because the project folder is not writable; it now says nothing changed and whyconstructor or prototype in an MCP config never being connectedconstructor or toString asking for permission in auto mode and bypass permissions mode.catch, being run again without end when it waits on another mod's noun that does its work outside the callavailableModelsMatch: exact or deniedModels blocks; it now answers 400 and leaves them out of its model listsANTHROPIC_BASE_URLANTHROPIC_BASE_URL being aborted after 180 seconds with no data arriving; they now wait 300 seconds, whether or not feature flags are loadedtool.describe or prompt.section answer that changed after $.ui.invalidate never reaching Claude; the new answer is now sent on the next turnenabledMcpjsonServers or disabledMcpjsonServers held a single server name (letters, digits, - or _) as a plain stringclaude plugin test pausing a hook's time budget while a served $ method it had called kept making $ calls after answeringnext(), returns, or sends to a $ method being refused whole when one of its getters throws a RangeError; now only that key is refused/usage, the approaching-limit warning (terminal and VS Code) and the status line sometimes showing more than 100% used (anthropics/claude-code#92238)mcp__<server>) not applying when the server's normalized name contains a double underscoreplugin_loaded telemetry event reporting has_hooks as false for plugins whose hooks are a hooks module, built-in plugins includedANTHROPIC_BASE_URL); Anthropic API keys are still sent$ to a function declaration imported from another file of the mod__proto__ keys silently removed, which could skip a tool.check guard on a tool call another mod madeclaude -p saying nothing when a settings file fails validation: text-output runs now list the file and the invalid entry on stderrforceLoginOrgUUIDclaude mcp list, claude mcp get and subagent MCP servers starting a server that a policy check blocks; it is now reported as blocked without being started/reload-plugins not loading a plugin installed from another terminal a moment earlier--bare, which keeps the mode; they now name /stop and claude --resume, as safe mode ones do← not saying why it stayed put over a queued message while Remote Control is on$.http.fetch in mods refusing a 304, 204 or 205 response that declares a Content-Length over the 4 MiB body limit/config push notification toggles sending your account the previous setting instead of the one you just chose--input-format stream-json running together without a line break when merged into one turn--exec-path wrapper's own --mcp-config when connectors change mid-sessionclaude plugin eval passing runs that the API refused: a run that ends on an API error now scores 0 without grading and makes the suite exit 1forceLoginOrgUUID and forceLoginMethod from MDM or the managed-settings file being hidden or replaced by server-managed settings--bare sessions leaving out an MCP server named constructor or prototype that --channels asked for/clear reattaching to the Remote Control session of the conversation after it/, sent with the Agent SDK's verbatimPrompts option, running as a slash command when CLAUDE_CODE_RESUME_INTERRUPTED_TURN re-ran it after a restart--safe-mode silently leaving safe mode when the session was woken or restarted/btw side questions in non-interactive sessions not being cancelled when the session ends, and running a second time when the same request arrived again mid-rundenyRead and allowRead globs with braces, parentheses or backslashes in a folder's name being read differently by Claude Code's settings checks than by the sandboxallowRead and allowWrite entries not being re-checked when the directory they start from is replaced by a symlinkclaude mcp add <name> -- <command> --background being started as a background session--bg or --background to a background session being taken for the flag, which could start new sessions over and over instead of delivering it--worktree sessions leaving a folder behind in .git/worktrees in repositories using git's reftable ref storageclaude self-hosted-runner sessions using Anthropic-managed git showing tracked files as staged deletions when starting in a reused clone whose remote is still emptyultracode is on in settingsheaders/headersHelper values, which broke servers behind an authenticating proxy<head> is published again unchanged$.ui.open reporting a mod's pane as placed in sessions where no surface draws it, such as Claude Code for VS Code and claude -pagent.spawn mod hook not running when a finished subagent or a killed teammate is resumed: the hook's event now carries resume, and a mod can refuse itclaude plugin validate rejecting a mod's $.state references when plugin.json has no types key and the contract is at ./types/index.d.tsdimColor text looking the same as plain text under the dark ANSI theme and on 16-color terminalsPreToolUse hook or a mod's tool.check hook allowedSendMessage not finding a subagent by name after the CLI restarted and resumed the session (names given before the last compaction still need the agent ID)CLAUDE_CODE_RESUME_INTERRUPTED_TURN sometimes answering a finished turn again after a restart, when a tool ended the turn and a skill loaded in the same step$.env.set changing the environment or shell prefix that command hooks from managed settings start with< or > is no longer offered until renamed; such a name: is ignoredui.render trees in claude plugin test: each mod's Box or Text root now carries part: { plugin } naming the mod, so exact-tree assertions must include itclaude plugin test to fail a call to a mod's served $ method that has not answered within ten seconds, as a session doesmcp__a no longer allows a server named a__b or a_; write mcp__<server>__* with the server's whole normalized nametools: lists to take only the named MCP server's tools; list a server whose name contains __ as mcp__<whole name>__*MCP_PROTOCOL_NEGOTIATION=legacy opts outapi.anthropic.com to reach Claude in full instead of being cut at 4,096 charactersPermissionRequest hook can no longer approve shell commands or subagents; those prompts wait or are denied-w and -r if the long flags do not fit the terminal. If neither fits a kept worktree, rows above it say where to run it/btw side questions in non-interactive sessions to return a timeout error when still unanswered after 11 minutesUserPromptSubmit hooks to run before a skill or custom slash command expands, so a hook that blocks the prompt now also stops its embedded shell commandsUserPromptSubmit hook to first run on the prompt after the one that invokes the skillturn.start mod hook to also hear subagents' and teammates' turns, not only the main loop's; tell them apart by e.agentId (absent on the main loop)/ultrareview can't upload a repository to stop suggesting git add ., which could stage or commit untracked files such as .envsetup and doctor say when the runner's machine has no git credentials--retire-at and delaying shutdown