Claude Code v2.1.323
Claude Code v2.1.323 was released on .
Summary
Claude Code 2.1.323 is here with experimental Code Mode, where Claude writes JavaScript to call its tools. Plugins now honor version ranges, and validate catches TypeScript hook issues. Plus a long list of sign-in and permission fixes. Curious what Code Mode can do?
Release Context
- This was the 262nd Claude Code release of 2026 tracked by Havoptic.
- It shipped 3 days after Claude Code v2.1.322 (November 10, 2026).
- Claude Code: ships every 1.9 days — 21 releases in the last month.
Why it matters: Claude Code can now write code to call its tools.
Shipped around the same time
Within 3 days of this release, other AI coding tools also shipped:
- GitHub Copilot CLI v1.0.112 (November 13, 2026)
- Grok Build v1.0.85 (November 13, 2026)
- GitHub Copilot CLI v1.0.111 (November 13, 2026)
- OpenCode v2.3.0 (November 13, 2026)
- OpenAI Codex CLI rust-v0.169.0 (November 13, 2026)
Compare Claude Code
- Claude Code vs OpenAI Codex CLI
- Claude Code vs Cursor
- Claude Code vs Gemini CLI
- Claude Code vs Kiro CLI
- Claude Code vs GitHub Copilot CLI
- Claude Code vs Devin Desktop
- Claude Code vs Antigravity CLI
- Claude Code vs Grok Build
- Claude Code vs Cline
- Claude Code vs OpenCode
- Claude Code vs Zed
- Claude Code vs Factory Droid
- Claude Code vs Devin
- Claude Code vs Lovable
- Claude Code vs Amp
- Claude Code vs GitHub Copilot in VS Code
- Claude Code vs Replit Agent
- Claude Code vs Bolt
- Claude Code vs v0
Release Notes
- Added Code Mode, an experimental opt-in in which Claude writes JavaScript to call its tools; see https://code.claude.com/docs/en/code-mode to turn it on, or to turn it off for an organization
- Added engines["claude-code"] to plugin.json: plugins outside their stated Claude Code version range are not installed, updated or loaded, and install and update pick the newest version that fits
- Added type checking of a plugin's TypeScript hooks module to claude plugin validate; each finding is a warning, and --strict fails on it
- Added to claude plugin validate the $ nouns a mod's engine.create hook adds, withholds or replaces
- Added support for CLAUDECODEAUTOMODEMODEL in managed settings for Claude Desktop sessions on third-party providers (takes effect once Claude Desktop includes this version)
- Added a progress heartbeat every 30 seconds while hooks run long in claude -p and SDK sessions, so a host such as Claude Desktop won't end the turn as hung (once it includes this version)
- Added .docx support to Artifact tool asset uploads
- Added a /diff to close hint to the diff panel, and the keys that focus and close a panel to the ? shortcut guide
- Added a start-up warning for Bash allow rules with a in a variable's value, such as Bash(PORT= npm run dev)
- Added a warning when a plugin's language server can't start, naming the server and what to check
- Added a one-time startup notice naming CLAUDECODEPERFORCEMODE when Perforce settings are found and the mode is off
- Added CLAUDECODEDISABLEAGENTPROGRESSSUMMARIES (available since 2.1.318): set it to 1 to turn off subagent progress summaries and the requests that write them (anthropics/claude-code86879)
- Added CLAUDECODERESUMEHINTCOMMAND, which a program that starts Claude Code can set to have the exit hint name its own resume command
- Added unsetOptionCount to the claude plugin install --json result: how many userConfig options are not yet set
- Added isPromptCovered to the props a mod's pane is drawn with, telling it when a dialog or a field above the prompt covers the prompt
- Fixed running /compact again, or after a command such as /context, summarizing away a message that Claude had not answered yet
- Fixed a resumed session joining your next message to an old interrupted message that was not resumed
- Fixed a memory spike at the next prompt after Claude changed a very large file
- Fixed a setting saved in a running session undoing a hand edit made to settings.json moments earlier; a settings file you delete during a session now stays deleted
- Fixed claude plugin commands and claude mcp list signing you out of a Console profile when they ended while the token was being renewed
- Fixed Edit and Bash running out of memory on certain /proc files, and Edit hanging or running out of memory on devices and named pipes
- Fixed Claude Code failing to start, or to clear stored credentials at sign-out, when saving its configuration file failed with "Out of memory"
- Fixed requests sent without streaming failing on errors that streamed requests recover from, such as a rejected image, thinking block or beta header
- Fixed ExitWorktree, the worktree exit dialog and /resume leaving the session in the wrong folder when the folder the shell was in before entering the worktree had been deleted
- Fixed accents and other combining marks sometimes landing left of the text, leaving stale copies on screen, or silently disappearing when text wraps
- Fixed the last key of a key chord, such as Enter in ctrl+x enter, acting on a dialog's text field when the chord's own action isn't available there
- Fixed ps processes piling up when the process listing Claude Code runs before stopping a command takes too long
- Fixed subagent transcripts and large tool results being saved apart from the session's transcript after entering a worktree created by a WorktreeCreate hook or belonging to a nested repository
- Fixed a session on a named Anthropic profile moving to another sign-in when /fork, the Left arrow or --bg continued it in the background; reopen any session that was open during the update
- Fixed a background session sending a conversation under another sign-in when its named Anthropic profile is missing, changed or overridden; it now stops and says so
- Fixed a session on an API key, auth token or workload identity from its shell (not a setup token) moving to another sign-in in the background; it now stops and says so
- Fixed MCP tool calls ending in the sign-in server's error, such as TOKENEXPIRED, instead of asking you to sign in again
- Fixed an expired claude.ai login showing "Credit balance too low" when a saved Console key or ant auth login profile without credit was used instead
- Fixed a session on a named Anthropic profile being handed to an older background service that could not keep its sign-in; it now says to restart the service
- Fixed a background session's sign-in leaving the previous account's login or other credentials in place; it now clears them for every session on the computer, and a refused sign-in can leave no login
- Fixed background sessions moving between a profile and the stored login when an update restarted them
- Fixed sessions opened before a sign-in keeping signed-out feature flags after the sign-in
- Fixed sessions that kept failing after a Claude apps gateway sign-in expired: once you sign in again with /login in another terminal, they carry on at the next message
- Fixed the billing notice naming your ant auth login organization when a custom X-Api-Key header is set
- macOS: Fixed "Not logged in · Please run /login" coming back right after a successful /login or a token refresh when the keychain was slow to answer
- Fixed turns failing in Claude Desktop when an organization's gateway answers an expired token with 403: Claude Code now asks Desktop for a fresh token and retries
- Fixed the error shown when Amazon Bedrock refuses your account a model: it no longer says to refresh your AWS credentials, it says to enable the model
- Fixed the awsAuthRefresh or gcpAuthRefresh command sometimes running twice for one request when three or more sessions needed a fresh sign-in at once
- Fixed the claude -p warning about an ended claude.ai login to say that claude auth logout also removes saved MCP server logins and plugin secrets
- Fixed Bash permission prompts offering "don't ask again" for commands that write to sensitive paths such as .git or .claude, where the saved rule did not stop the next prompt
- Fixed a case where some lsof commands ran without a permission prompt
- Fixed Bash commands that write a file with cat > file <<EOF being shown as "Read 1 file"
- Fixed a case where Bash permission checks judged an rm from the wrong folder and skipped the dangerous-removal prompt under bypass permissions or a Bash allow rule
- Fixed --permission-mode auto or a settings defaultMode: auto starting in a mode that could allow more when auto mode was unavailable. It now starts in Manual mode, which asks first
- Fixed plan files sometimes being written outside the project when plansDirectory is set; a write that can't be shown to stay inside the project is now refused
- Fixed a permission prompt when Claude read the output of its own background command or agent after entering a worktree
- Fixed a case where Bash permission checks missed part of a command
- Fixed a case where the Bash sandbox could switch off during a session
- Fixed Bash allow rules with an attached wildcard, such as Bash(ls), skipping the permission prompt in some cases; a rule that names a variable, such as Bash(NODEENV), now asks
- Fixed auto mode running behind a gateway at ANTHROPICBASEURL on a model whose gateway name contains "haiku"; such a model, other than claude-haiku-5-5, is now refused, as Haiku 4.5 is
- Fixed Bash deny and ask rules missing some commands run through sudo, env and similar wrappers
- Fixed Bash allow rules written with combined sudo flags skipping the permission prompt in some cases
- Fixed sandbox.excludedCommands letting a command that it does not name run outside the sandbox in some cases
- Fixed a case where the Write and Edit tools could write to a path covered by a Read deny rule
- Fixed a case where a Bash command ran without a permission prompt for zsh users with certain non-default shell options set
- Fixed the Bash sandbox not fully protecting Claude Code's own config on installs still using the legacy config file
- Fixed a permission prompt from a mod's tool.check hook naming every plugin hooked on the tool instead of the one that asked
- Fixed sandboxed commands being able to read Claude Code's file checkpoint copies under the config directory
- Fixed a rewind sometimes changing your permission mode
- Fixed project settings sometimes being read through a symbolic link that leads to a different folder than the one Claude Code checked
- Fixed HTTP hooks failing with HTTP 500 on Linux when CLAUDECODESUBPROCESSENVSCRUB is set and sandbox.enabled is off
- Fixed claude -p and the Agent SDK running Bash unsandboxed when --settings or SDK settings that turn the sandbox on fail validation; Claude Code now stops at start-up and names the invalid setting
- Fixed /export silently stopping early after a long run of calls to an MCP tool that is no longer loaded
- Fixed earlier MCP tool calls missing from a resumed conversation, and lines repeating in scrollback, when the server connects late
- Fixed claude mcp add --help splitting long example commands across lines in narrow terminals and pipes, so a pasted example ran without its header
- Fixed plugins with defaultEnabled: false staying off in a claude.ai chat's cloud session after you turn them on in claude.ai
- Fixed /fast on and /fast off on Vertex not asking a plugin's config.set hook, as the /fast menu does
- Fixed documents created through the Claude Docs connector not opening in your browser when you work in a terminal
- Fixed the misleading "not cached" error for a plugin only a repository's settings enable: it now says it isn't installed, gives the install command, and shows in text and stream-json -p runs
- Fixed mods being able to reword Claude Code's own confirmation questions
- Fixed a mod's hot reload sometimes ignoring a file created just after a failed reload
- Fixed marketplaces named npm, pip, uv, cargo, github or gh being refused as reserved names
- Fixed a stopped MCP call, or a stopped shell command in fullscreen, reading as "Called" or "Ran" in a collapsed tool group: it now says no result was recorded and shows its input
- Fixed load errors of plugins enabled by managed settings going only to the debug log in SDK and Desktop sessions: init.pluginerrors now lists them
- Fixed plugin installs hiding what a plugin's install command wrote to stderr when that command succeeded, such as a note that the plugin has no skills yet
- Fixed one malformed entry in a plugin marketplace's renames map making Claude Code ignore the marketplace's other renames
- Fixed claude --bg --safe-mode sessions stopping at startup to ask about project MCP servers that safe mode never starts
- Fixed MCP link prompts offering Accept for non-http links without saying the link wouldn't open
- Fixed /mcp and /plugins opening an MCP server's page with the cursor on "Disable" when the server needs authentication but still holds its sign-in; the page now offers "Reconnect" and opens on it
- Fixed plugins with a version list in enabledPlugins staying off with no message: /plugin and claude plugin list now say why
- Fixed plugins and marketplaces failing to install on Windows when the path of a cloned file reaches 260 characters
- Fixed a Stop pressed right after sending a message showing as an error in remote and SDK sessions while a UserPromptSubmit or plugin prompt hook was still running
- Fixed an MCP server staying disconnected with no tools after an Agent SDK app or claude -p caller removed and re-added it, when a tool call had tried to reach it in between
- Fixed text-output claude -p runs printing nothing to stderr when a --plugin-dir mod's hook hangs or crashes the hooks worker
- Fixed SDK sessions giving an MCP server named by --allowedTools or an mcptool hook less than 2s before the first turn when settings lowered CLAUDECODEMCPSTARTUPWAITMS after start-up
- Fixed headless sessions ending when an SDK host sent a null entry in an MCP server's tools list
- Fixed WebFetch dropping empty table cells and shifting later values a column left
- Fixed temporary files of a session that had changed directory being left behind when the session expired under cleanupPeriodDays
- Fixed managed settings (managed-settings.json, managed-settings.d) sometimes being missed at start-up while another program was rewriting the file: start-up now reads such a file a second time
- Fixed .claude/settings.local.json not being ignored globally when the folder became a git repository later, or on a new machine
- Fixed /diff waiting for Claude to finish before closing the diff panel in fullscreen
- Fixed /memory showing wrong or roundabout paths for folders whose names start with the working directory's or home folder's name, and losing slashes in the file path on Windows
- Fixed a broken emoji character in a tool call's parameter name being resent with later requests, which strict JSON parsers reject
- Fixed a collapsed tool call looking as if it ran after you rejected it with a reason: it now shows "Not run · rejected"
- Fixed a case where part of a saved session could be lost on NFS or FUSE file systems when Claude Code discarded a reply
- Fixed WebFetch not rechecking organization policy and CLAUDECODEDISABLEWEBFETCH at each call
- Fixed file titles, app names and session names in @-mentions from claude.ai and the desktop app sometimes being treated as text you typed
- Fixed a multi-row status line being pushed off screen by a long prompt in the fullscreen renderer
- Fixed a case where certificate errors behind a TLS-inspecting proxy persisted when the proxy itself is reached over https://
- Fixed Pro and Max accounts being offered feedback drafts that their organization would refuse
- Fixed Claude in Chrome's policy message telling people to contact their admin when no admin setting can turn it on
- Fixed the artifact preview sometimes opening a different artifact than the one Claude just published
- Fixed certificate name-constraint errors being retried for minutes; they now fail at once with a message that says what to fix
- Fixed claude --teleport opening an empty session when the server could not find the session's history, and claude -p --teleport exiting without an error when the resume failed
- Fixed a misspelled keybinding modifier, such as ctl+k, binding the bare key; the binding is now ignored
- Fixed /btw answers and recaps sometimes including earlier replies from the conversation
- Fixed start-up requests switching from an organization's managed proxy and CA settings to user-set ones when a read of the managed settings file failed
- Fixed Claude giving a wrong reason when a new message interrupted a file it was sending you
- Fixed CLAUDECODERESUMEINTERRUPTEDTURN re-running a turn that a hook's continue: false had stopped
- Fixed Claude being told that automatic model switching is off when safeguards stopped a subagent whose model had no other model to switch to
- Fixed the changed-files list of remote sessions leaving out files added with git add -N before the first commit
- Fixed some Claude in Chrome tool calls, such as browserbatch, not showing the tool's name in the fullscreen transcript (ctrl+o) or in a subagent's progress
- Fixed subagent progress summaries skipping an update when the reply took between 10 and 20 seconds
- Fixed claude doctor and /status saying a linked managed settings file is still read when it could not be read
- Fixed an interactive --chrome session giving no reason for starting without Claude in Chrome when your organization's policy turns it off: a line now says so
- Fixed the /rewind list on network paths and hung folders: it named every tracked file as changed, was slow to show labels, and showed none at all when a file read never returned
- Fixed --debug and --debug-file replacing a file named latest in the debug log's folder
- Fixed a timed-out feedback send being reported as too large; it now says the request timed out
- Fixed screen reader mode cutting off an announcement when the system clock moved forward while it was being read
- Fixed screen reader mode dropping dictated or pasted text, and emoji, typed into an answer to a question or permission prompt
- Fixed the name label under permission and plan dialogs hiding part of some agent names
- Fixed a case where pressing Ctrl+C just as claude update finished removed the claude command
- Fixed the fullscreen header naming the session's effort level for a viewed subagent on a different model, which that subagent doesn't use
- Fixed the model picker and /model showing a picked effort level that CLAUDECODEEFFORTLEVEL overrides
- Fixed the tip after a slow worktree creation suggesting a sparsePaths list without .claude, which left worktrees without your project settings and rules
- Fixed the newest model's highlight missing from the /model picker
- Fixed /upgrade and Ctrl+clicked links in fullscreen failing silently when no browser can open: the address is now shown
- Fixed the Claude apps gateway's JSON logs escaping newlines and other control characters in a message twice
- Fixed terminal control sequences in a subagent's message taking effect instead of showing as plain text when the message is expanded
- Fixed Claude in Chrome setup saying /chrome finishes the connection; it now tells you to restart with claude --chrome
- Fixed the Option-key hint appearing while typing ø or π inside words on Danish, Norwegian, Faroese and Greek keyboard layouts
- Fixed a Claude Desktop session getting stuck as busy after another of your sessions sent it the same message twice or many messages at once
- Fixed long tool results staying on disk after a session run with --no-session-persistence; they are now removed on normal exit, Ctrl+C or SIGTERM
- Fixed PreCompact, PostCompact and post-compaction SessionStart hooks not receiving agentid and agenttype when a subagent compacts
- Fixed CLAUDECODETRANSCRIPTLOCALGC dropping messages from the saved transcript when another process rewrote the file while it was being trimmed
- Fixed the "Now using usage credits" notice repeating or not showing past the weekly Fable limit when Claude Code made a quick side request on a smaller model, such as naming the session
- Fixed Fable's weekly limit showing no reset time and no options menu in the terminal
- Fixed a wait chosen in the usage limit menu silently moving to a later reset when its request was refused; the menu now opens
- Fixed /usage hiding limit bars for setup tokens and CLAUDECODEOAUTHTOKEN: it keeps the session and weekly bars and says why the rest are missing
- Fixed /usage showing a whole-session percentage beside a subagent type's name, and saying sessions ran 8 hours when it only counts hours with requests
- Remote Control: Fixed sessions showing as disconnected for a minute or more after a network change such as switching Wi-Fi or reconnecting a VPN
- Fixed Remote Control showing nothing while Claude Code asks whether to use usage credits: the question now also shows in the Claude app
- Fixed Remote Control showing a session as running while it waited on a permission prompt that can only be answered in the terminal
- Remote Control: Fixed claude remote-control reconnecting as a new computer when restarted in the same folder more than 4 hours after it stopped; it now keeps its identity for up to 30 days
- Remote Control: Fixed sessions left running at shutdown, and finished sessions holding their slot, when the disk stops responding
- Remote Control: Fixed other devices and phone notifications not showing what Claude is asking permission for when DISABLETELEMETRY or DONOTTRACK is set
- Remote Control: Fixed the host exiting, or stopping reading a session's output, in verbose or debug mode when a tool call's command was a number, boolean or object
- Remote Control: Fixed a host that could stall after sessions failed to start in folders on a filesystem that had stopped responding
- Remote Control: Fixed sessions from the desktop app showing as idle on your phone while background subagents were still running
- Fixed the Agent SDK's managedSettings ignoring the Remote Control, agent view, Workflows and Artifact off switches
- Fixed OpenTelemetry export failing silently when an otlp exporter had an endpoint but no OTELEXPORTEROTLPPROTOCOL: it now defaults to http/protobuf
- Fixed OpenTelemetry export to the default localhost:4318 endpoint going through a configured proxy
- Fixed one malformed OTELRESOURCEATTRIBUTES entry dropping all of that variable's attributes from the OpenTelemetry resource; the others are now kept, and /status names the one left off
- Fixed OpenTelemetry userprompt events and interaction spans recording a background agent's reply when OTELLOGASSISTANTRESPONSES=0
- Fixed OpenTelemetry exports failing when a proxy took over 10 seconds to reach the collector; it now has 25 seconds, also the most that OTELEXPORTEROTLPTIMEOUT can allow (previously 30)
- Fixed OpenTelemetry agent.name showing a user-defined subagent's name instead of custom when an official plugin's skill launched it
- Fixed claude agents showing a status from an earlier turn after a session resumes
- Fixed read-only git commands needing approval, or being refused under claude -p, when CLAUDECODESUBPROCESSENVSCRUB is set on Linux
- Fixed claude agents losing a typed prompt: Esc now needs a second press to clear it, and ctrl+y restores it
- Fixed the move-to-background key doing nothing in claude attach and claude agents sessions; to detach with Ctrl+B d, press d within 800 ms of Ctrl+B
- Fixed background sessions ignoring a DISABLEERRORREPORTING set only in your shell when the background service started without it
- Fixed false "needs input" notifications in claude agents after replying to a blocked session, and repeated ones after a background turn ended with no text and only basic tools such as Bash or Read
- Fixed claude -p silently using another model in text output when settings block the requested one; it now warns on stderr
- Fixed claude -p printing notes about deniedModels and availableModels entries on every run; /status and claude doctor still list them
- Windows: Fixed some file-reading Bash commands running without a permission prompt when given a wildcard or a list of files
- Windows: Fixed Claude Code running a .cmd or .bat wrapper found beside a program's .exe in the same PATH folder (a git.cmd next to git.exe, say); it now runs the .exe, as cmd.exe would
- Windows: Fixed shell commands failing with "Working directory was deleted" on drives where a folder's real path can't be resolved
- Fixed a cloud session's history becoming unreadable if its machine stopped just after the history was rewritten
- Fixed scheduled tasks from an ended session sometimes not running after another session in the same folder used /clear, /resume or /branch
- Fixed an approved plan being answered with "You are not in plan mode" when the approval arrived after the session's process had restarted, in cloud, self-hosted runner and SDK sessions
- Cloud sessions: Fixed an answer to Claude's question being lost after a restart in a long conversation
- Fixed a message dropping out of a cloud session's conversation when the session restarted before Claude replied
- Cloud sessions: Fixed Claude saying an attached image is missing when the message names its file
- Fixed a resumed cloud session making a model call nobody asked for when files arrived right after a chat's first reply
- Fixed streamed replies in cloud sessions missing text from the middle when the session's container shut down partway through a reply
- Fixed skill files sent from Cowork cloud sessions sometimes failing to upload on the first try
- Self-hosted runner: Reverted the exit code of an on-demand runner whose work order was superseded to 1; 2.1.321 and 2.1.322 had changed it to 0
- Improved sign-in errors in /login and claude setup-token for a rejected, unreachable or timed-out request: they now say what happened and what to check
- Improved Bash permission checks so the same command more reliably gets the same answer on a slow or busy machine
- Improved Bash permission checks: some commands that could run differently from how they were checked now ask for permission
- Improved /mcp to show how many of a server's tools were left out because the API would reject their input schema, and why
- Improved the "Not now" choice when Claude Code asks to turn on the mods it writes in a session: it now says when they load
- Improved the error for an MCP tool call whose connector ID is mistyped by a character or two: for a server that the host application registered, it now names the tool to call
- Improved Claude Desktop and cloud sessions for claude.ai accounts with more than 2,000 plugins turned on: a shorter wait at startup, and Claude can now say why plugins are missing
- Improved memory use with many subagents: a finished subagent's transcript is freed sooner instead of staying in memory while later subagents run
- Improved installing with the install script: the latest version is no longer downloaded twice
- Improved WebFetch speed and memory use on deeply nested pages
- Improved the cleanupPeriodDays cleanup to count folders it can't read as errors
- Improved the Claude apps gateway's /v1/models to state maxinputtokens for models whose context window is certain on every upstream
- Improved ToolSearch to say when a tool Claude searched for by its short name is already available, instead of only reporting no match
- Improved start-up on Linux when /home is an autofs map: Claude Code no longer looks up files in /home itself. Set CLAUDECODEAUTOMOUNTROOTS for a map root deeper than one folder below /
- Improved the Fable limit message in -p, SDK, IDE and cloud sessions: it now says when the limit resets, along with how to continue
- Changed /security-review to ask before Claude runs it, and skills' inline git commands to stop in bare-repository worktrees and similar folders until you allow them, outside auto mode and bypass
- Changed how many messages each of your sessions on the same machine can send the others without a prompt from you, from about 20 to 100,000
- Changed the number of messages a Claude Desktop Code tab session can send to your other sessions before it waits for you to type again from 20 to 100,000
- Changed organization settings and policy requests to no longer use a proxy set only by ALLPROXY; set HTTPSPROXY if your network needs a proxy for them
- Changed the context window assumed for a model ID that Claude Code doesn't recognize from 200K to 1M; use /autocompact to compact earlier, or CLAUDECODEDISABLE1MCONTEXT=1 to keep 200K
- Changed sessions on other vendors' models with a smaller window: once full, they can fail every turn until /clear, so set CLAUDECODEDISABLE1MCONTEXT=1 before they fill
- Changed Claude Code's own ripgrep and most internal git commands to run without most of its sign-in tokens and API keys, so a credential helper or hook under such a git command no longer finds them
- Changed MCPSDKGENERATION=v1 to run the v2 MCP client in a compatibility mode (earlier handshake, relaxed OAuth sign-in checks), because the v1 MCP client is removed
- Changed the tool Claude uses to finish an MCP server sign-in so that it asks you to confirm, even in bypass and auto modes; where nobody can be asked, such as in dontAsk mode, use /mcp
- Self-hosted runner: Changed a session at a connector's approval prompt or sign-in inside a running tool to be released as paused at the idle or lifetime limit; a late answer resumes from a fresh clone
- Changed artifact updates to ask first, even under an allow rule, when people outside your organization can see the artifact or Claude can't check who can
- Changed glab config set without --global or --host, and glab config edit --local, to fail read-only inside the Bash sandbox; run them outside it
- Changed the Bash sandbox on macOS, Linux and WSL to ignore write access granted through a symlink in a writable folder that leads elsewhere or to a missing path; grant the real path instead
- Changed "don't ask again" so an allow rule that looks like it holds a secret, or would be saved to a settings.local.json that git tracks, lasts for the session only and isn't saved
- Changed the sandbox on macOS and Linux: git worktree add, move and remove now fail read-only, as do commits in a worktree the session wasn't started in or given, even one inside the project
- Changed start-up to stop when a --settings file isn't valid JSON and has a sandbox key, even one that turns the sandbox off
- Changed what happens when a tool's permission check fails with an error after a PreToolUse hook returned "allow": Claude Code now decides the call as if no hook had answered
- Changed what happens when a tool's permission check fails on input that a PermissionRequest hook rewrote: Claude Code now asks again, or refuses the call where nobody can answer
- Changed the GitLab merge request badge to show only for the repository a sandboxed session opened in
- Changed the claude mcp add --help example to a local command
- Changed mods: a , namespace or negated hook on engine.create now only observes. To add or withhold a $ noun, hook engine.create by name
- Changed claude plugin validate to fail a mod whose engine.create hook isn't written in the one accepted form; installed mods keep loading
- Changed marketplace and plugin installs to fail when a git submodule isn't on the commit its repository records
- Changed project (.mcp.json) MCP server approvals to match the server's exact name; an approval entry written in another spelling now asks again
- Changed self-hosted runners under --trust-workspace false and VS Code sessions in an untrusted folder: the repository's settings can no longer disable your hooks or turn plugins on or off
- Changed tool.list plugin hooks so the tools they add or remove apply to the model and every agent
- Changed claude plugin install and /plugin to show a warning instead of success when a plugin's install command writes to stderr
- Changed claude.ai chats and Cowork tasks to check a plugin file for secret keys before sending it, and to ask first if it may hold one
- Changed claude rm and the agents view to say a session is removed from the list, not deleted; claude rm help says the conversation is kept and claude --resume lists it
- Changed /stickers to say that the sticker pack is all claimed for now, instead of opening a page in the browser
- Changed a managed settings policyHelper to no longer take environment variables from user or --settings files; set what it needs in managed env or the launching shell
- Changed a /skill or @file typed between two files picked in claude.ai or the desktop app, or after a picked file and a link, to no longer take effect
- Changed split-pane agent teammates to check that requests come from their team lead: one that outlives its lead has its asks refused, and plan approvals must be re-sent after /clear or /resume
- Changed worktree creation to refuse checkouts whose .git folders are links or hold hard links, such as git-new-workdir layouts and cp -al copies; use a plain clone
- Changed what Claude is told after safeguards stop a forked skill or a workflow agent: retry with a narrower prompt or tell you, instead of doing the work itself
- Changed browser tool calls (Claude in Chrome, the desktop browser pane) to refuse some escaped or JSON-text inputs and tell Claude how to respell them
- Changed workflows so that a prompt an app marks as not typed no longer reaches their agents as your request
- Changed computer use on macOS to refuse key chords that hold Space with Control or Option, and more system shortcuts that need your grant
- Changed first-run setup in Terminal.app to name the "Use Option as Meta key" setting, what Option stops typing, and how to undo it before you agree
- Changed the maximum of CLAUDECODEOVERLOADEDRETRYMAXDELAYMS from 64000 to 300000
- Changed workflows in the desktop app's Code tab to pause at a usage limit and continue after it resets
- Changed the spend limit and 1M context errors, and /usage-credits, in cloud sessions and under Remote Control: they no longer give a web address
- Changed which MCP servers are reported by name in OpenTelemetry exports to follow the current connector directory
- Changed /logout in a background session, which had no effect: it now signs out every session on the computer, deletes stored MCP logins and plugin secrets, and ends the session, as in a terminal
- macOS: Changed the Bash sandbox so lsof and similar tools may show less about processes a command did not start
- Changed cloud scheduled tasks: a PostToolUse hook from your own settings can no longer replace the plan in ExitPlanMode's result
- Changed CLAUDEAUTOCOMPACTPCTOVERRIDE in Anthropic-hosted cloud sessions to stop applying to auto-memory extraction and, in some sessions, to /btw; the main conversation still follows it
- Removed the subagentStatusLine setting: subagent rows always use the default look, and settings files that still hold the key load as before
- Deprecated a plugin's agent setting: it still applies, and now warns at startup, in claude plugin list and in claude plugin validate
- [VSCode] Added a Claude Code trust prompt before the first session in a folder you haven't trusted; declining leaves the folder's settings and MCP servers unused
- [VSCode] Added the live output of a running Bash or PowerShell command to the chat, under the command's card
- [VSCode] Fixed a response that was discarded because its tool call could not be parsed still showing after Claude retried
- [VSCode] Fixed a queued message missing from a conversation or fork when it directly followed a compaction summary
- [VSCode] Fixed the "Buy usage credits on claude.ai" button counting as agreement to pay for Fable while usage credits were off
- [VSCode] Fixed the "extensions want to relaunch the terminal" warning coming back on open terminals after every window reload or restart
- [VSCode] Fixed "Couldn't load this conversation's saved history" appearing in a new chat whose Claude process had restarted before the first prompt
- [VSCode] Fixed the sign-in screen showing the login choices again after a pasted code; it now shows "Signing in…" until the sign-in finishes
- [VSCode] Fixed the "You've hit your Fable limit" line staying in the VS Code and JetBrains panels after you pick another model
- [VSCode] Fixed the Fable usage warning in the VS Code and JetBrains panels naming usage credits when they're off or used up
- [VSCode] Fixed the diff tab not opening for multi-line edits on files with CRLF line endings
- [VSCode] Fixed dictation continuing to record after switching sessions
- [VSCode] Improved sign-in errors behind TLS-inspecting proxies: a certificate failure now says what to do, as the terminal does
- [VSCode] Changed opening a Claude Code on the web session in a folder where Claude Code's sandbox is on: the extension no longer switches to the session's branch for you, and the dialog says why
- [Claude Code on the web] Improved the message when a file fails to upload to a cloud or Remote Control session: it now gives the reason, such as too many pages, a password or a time-out
- [Claude Code on the web] Improved adding a repository Claude can't access to a cloud session: a short message and a Reconnect GitHub button replace the long error
- [Claude Code on the web] Fixed self-hosted sessions staying on "Starting Claude Code" after it had started, when you reopened a paused session without sending a message
- [Claude Code on the web] Fixed a paused session in a self-hosted environment sometimes still showing "Sending" and a Stop button under the "Session paused" banner
- [Claude Code on the web] Fixed pull request updates from GitHub Enterprise Server linking to github.com in cloud sessions; new updates link to your own server
- [Claude Code on the web] Improved the message when some network secrets can't be added to a new cloud environment: it lists each host, says why where it can, and stays until you dismiss it
- [Claude Code on the web] Fixed very large GitHub Actions job logs and run log archives failing to download or being cut off in cloud sessions
- [Claude Code on the web] Improved the new-session repository picker when GitHub single sign-on hides organizations: it now says so even with other repositories listed, and links to reconnect GitHub
- [Claude Code on the web] Fixed new cloud sessions started from the iOS app with a repository not getting a branch of their own
- [Claude Code on the web] Fixed an open cloud or Remote Control session's page staying "Disconnected" after a few minutes of failed connections; it now tries to reconnect by itself
- [Claude Code on the web] Fixed Try again on an open cloud or Remote Control session's "Connection lost" card sending "Try again" as your message; it now tries to reconnect instead
- [Claude Code on the web] Fixed the Stop button disappearing from a cloud session five minutes into a reply that had shown nothing yet while Claude was still working
- [Claude Code on the web] Fixed an approval prompt sometimes disappearing from a tab left open after a self-hosted runner released the session while it waited for your answer
- [Claude Code on the web] Added a failure notification when a scheduled task's run can't start because its settings require a sandbox that isn't available where it runs
- [Claude Code on the web] Improved the Git providers page when your GitHub sign-in has expired: it now asks you to reconnect instead of silently hiding organizations you can link
- [Claude Code on the web] Fixed removing a repository from a scheduled task silently moving its GitHub trigger to another repository; Save now waits until you pick one
- [Claude Code on the web] Fixed git clones and fetches that take longer than ten minutes in a cloud session sometimes being cut off at the very end
- [Claude Code on the web] Added the No repository option to the repository picker for new sessions on a self-hosted environment
- [Claude Code on the web] Added a warning to a cloud session's Delete dialog when deleting it will pause scheduled tasks that run in that session
- [Remote Control] Fixed your own session saying its environment was deleted when you deleted nothing; it now says your computer is no longer connected
- [Remote Control] Fixed some sessions still showing as running in the session list after the computer disconnected before Claude started; they now show an error mark or as idle
- [Claude Tag] Added Claude Tag sessions started in Slack to the Compliance API on Enterprise plans, in beta: list the sessions and read their transcripts
- [Claude Tag] Added a confirmation step when an admin turns off Claude Tag for the organization, with a dialog that says what stops
- [Claude Tag] Fixed scheduled tasks in a Slack channel moved between Enterprise Grid workspaces failing to use Slack until someone posted there
- [Claude Tag] Fixed the Approve and post card in a DM with Claude appearing for private or Slack Connect channels, where Claude can't post; Claude now gets the reason and shows no card
- [Claude Tag] Added a Scope filter to the Network events tab of Claude Tag's Activity page, so admins can download one scope's events instead of the whole organization's
- [Claude Tag] Fixed Remove connector in Claude Tag admin settings being refused when access bundles also held its credentials; it now removes those set on the connector and leaves the bundles' own
- [Claude Tag] Fixed the Channels tab in Claude Tag admin settings splitting a workspace from its channels across pages; channels now appear right under their workspace
- [Claude Tag] Fixed the Set for Claude Tag link on the Cloud environments admin page not leading to the environment setting; it now opens the Slack page's Advanced tab, where you set it
Other Recent Claude Code Releases
- v2.1.321 (November 9, 2026)
- v2.1.319 (November 6, 2026)
- v2.1.318 (November 3, 2026)
- v2.1.317 (November 2, 2026)
- v2.1.316 (October 31, 2026)
Upgrading from v2.1.323? See all 1 release since.
All Claude Code releases · All AI coding tool releases on Havoptic