# Claude Code v2.1.285

> Claude Code v2.1.285, released 29 Sep 2026 (2026-09-29). 428 entries read out of the shipped bundle. Unofficial, and not affiliated with Anthropic.

[Web version](https://changelogs.core-directive.com/v/2.1.285)

You can now use claude-sonnet-5 with high effort and automatic thinking switched on by default. The high effort option is now labelled Recommended instead of Default. Admins can use the new managed setting `allowedProviders` to limit which API providers Claude Code may run on. Setting `CLAUDE_CODE_DISABLE_WEB_FETCH` turns off WebFetch, the tool Claude uses to download web pages. Claude Code can now load relevant memories saved to your account before a turn. The new `claude plugin configure` command shows a plugin's options and can save values piped in as JSON.

Seven changes are in the build but not switched on yet. A new `plugin test` command runs a mod's tests and is marked as early access. Waking and retrying background MCP tasks now sits behind a remote switch that is off by default. A report-delivering tool can end the agent's turn, but only when a server switch allows it. The `precomputeCompactionEnabled` setting still stays hidden unless a server switch turns it on.

Directory sync for cloud sessions is now fully removed. The `CLAUDE_CODE_DIR_SYNC_*` variables and `CLAUDE_CODE_DISABLE_DIR_SYNC` no longer do anything. Launching with `--cloud` no longer offers to sync your folder, and bundle upload still works. On macOS and Linux, `CLAUDE_CODE_LEGACY_BUNDLE` is now ignored with a warning. Passing `unrestrictedPaths` to the agent toolset now throws an error. An @-mentioned audio file no longer gets turned into a transcript for Claude.

## What probably matters to you

Anything you can use today, anything that visibly changes, and anything worth poking at. One line each, open for detail.

### Model catalog: claude-sonnet-5 entry, effort badge now 'Recommended'

The effort picker labels options 'Recommended' instead of 'Default', claude-sonnet-5 gets thinking settings, and one model now defaults to medium effort

**Unclear.** It is not clear whether the level the picker selects by default also changed.

**What**

The model catalog, the list behind the model and effort pickers, moved from version 1123 to 1330. Effort is how much reasoning Claude does before answering, and thinking is its visible reasoning step.

- The badge on the medium and high effort options now reads "Recommended" instead of "Default". The "How does this work?" label was also reworded.

- One model with effort levels from low to max now defaults to `medium` instead of `high`.

- `claude-sonnet-5` gets a thinking entry with effort `high` and mode `auto`, placed ahead of `claude-sonnet-4-6`.

- One model no longer offers an "Off" choice for thinking and is marked `always_on`. It also gains `voice_model` `claude-sonnet-5`.

- The Opus 5.5 description is now "For complex work and everyday tasks" instead of "Most capable for ambitious work".

**Why**

If you leave effort alone, one model now reasons at medium effort by default, and for another you can no longer turn thinking off. The picker's "Recommended" badge is a suggestion rather than a marker of the current default.

- Area: Models
- Names: `claude-sonnet-5`
- Tier: You'll notice
- Useful: 5/5
- Signal: 5/5

### New protocol lets Desktop, mobile and VS Code draw plugin UI, plus list_directory

New ui_* messages let desktop, mobile and VS Code surfaces attach to a session and draw plugin UI, and a gated list_directory request is added

**Unclear.** It is not settled whether all of these messages are new or whether the feature is switched on for anyone.

**What**

Claude Code gained a new set of messages that let outside apps, called surfaces, connect to a running session and show user interface drawn by plugins. The surfaces named are desktop, mobile and vscode. The message schemas are part of the plugin hooks engine, the part of Claude Code that runs plugin code in response to events.

- Attaching and leaving: `ui_attach`, `ui_detach`

- Drawing and interaction: `ui_render`, `ui_press`, `ui_input`, `ui_select`, `ui_scroll`, `ui_focus`, `ui_close`, `ui_copy`, `ui_message`

- Panes: `ui_panes`, `ui_pane_show`, `ui_pane_focus`

- Surface-side modules: `ui_client_module`, `ui_client_press`

- The prompt box: `ui_prompt_read`, `ui_prompt_fill`, `ui_prompt_suggest`, `ui_prompt_edit`

- Building blocks a plugin can draw with: Box, Text, Button, Input, Select, Link, Code, Markdown, Client and Svg

The headless control handler, which answers requests from a connected app when there is no terminal screen, now handles these `ui_*` requests and a new `list_directory` request. Before, it handled only `read_file` and `get_workspace_diff`. `list_directory` runs only when `CLAUDE_CODE_REMOTE` is set, on Linux, and with the remote switch `tengu_gentle_hummingbird` on. Nothing has been read about that switch.

**Why**

This defines how plugins could show buttons, inputs, panes and other controls inside Claude Desktop, the mobile app and VS Code, not only in the terminal. It also lets a connected app ask a remote session to list a folder's contents.

- Area: Plugins
- Tier: Use it now
- Useful: 5/5
- Signal: 5/5

### New `plugin test` command runs a mod's tests

A new `plugin test [dir]` command runs a mod's tests, marked as early access

**Unclear.** It is not clear how the hooksModules early access is turned on.

**What**

The plugin command gains a `test` subcommand, written as `plugin test [dir]`, where `[dir]` is an optional folder. It is described as "Run a mod's tests". It is marked as early access under `hooksModules`, so it is not available to everyone by default.

**Why**

People who write plugins (add-on packages for Claude Code) get a command for running their own tests.

- Area: Plugins
- Names: `hooksModules`
- Tier: Nothing to try yet
- Useful: 5/5
- Signal: 5/5
- Present in the build but not switched on

### Unreleased MCP tasks feature gains two server-controlled switches

Two new switches, `tengu_mcp_tasks` and `tengu_mcp_task_worker_wake`, guard an MCP tasks feature and default to off unless the server enables them

**Unclear.** It is unclear what the switch's further condition checks, and whether the old resume switch is still used anywhere else.

**What**

MCP servers are outside tools Claude Code can connect to. This release adds code for an MCP tasks feature, controlled by switches (flags) that Anthropic's server can turn on remotely:

- `tengu_mcp_tasks`: a new check guarding the MCP tasks feature. If the server gives no value, it counts as off. The code that uses this check is not visible in this release.

- `tengu_mcp_task_worker_wake`: replaces `tengu_ccr_context_build_after_resume_enabled` at the same places in the code. It now controls how MCP tasks are woken up and retried rather than how context is built after resuming a session. When it is off, the task scheduler skips any task that is not being cancelled, so the wake and retry steps never run. It also guards two other places. It too counts as off if the server gives no value.

No reading has yet been taken of either new switch.

**Why**

These switches prepare a feature that is not yet active by default. Nothing changes for you unless Anthropic turns the switches on from its side.

- Flag `tengu_mcp_task_worker_wake`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: off) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Flag `tengu_ccr_context_build_after_resume_enabled`: Off in both readings (read for one account on one subscription tier against v2.1.285; this account: off, anonymous baseline: off, compiled default: not a boolean we can read) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Flag `tengu_mcp_tasks`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: off) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: MCP
- Tier: Nothing to try yet
- Useful: 3/5
- Signal: 4/5
- Present in the build but not switched on

### Claude Code can now load memories saved to your account

Before a turn, Claude Code can now load relevant memories saved to your account as well as local ones, and /pause-memory stops that too

**Unclear.** It is not clear what decides whether account memory recall is turned on.

**What**

Claude Code can load relevant memories into the conversation before a turn. A memory is a note saved from earlier work. Until now it only looked in memories stored locally on your machine. It can now also search memories saved to your account and add any that match, alongside the local ones.

The `/pause-memory` command has a new message for this: Claude will not load your account memory or save new memories in this session. A session is one conversation with Claude Code. Claude Code also now counts how often it searches and reads account memory during a session.

**Why**

This is a new place that memories can come from, so what Claude sees at the start of a turn can include things saved to your account and not just things on this machine. Use `/pause-memory` to keep account memory out of a session.

- Area: Memory
- Tier: You'll notice
- Useful: 5/5
- Signal: 4/5

### MCP tasks can run in the background and accept follow-up messages

Background MCP tasks can take a follow-up message mid-run, and a crashed one is reported as failed with the code drive_crashed

**Unclear.** It is not clear what switches this on or whether it is reachable yet.

**What**

MCP servers are external tools Claude Code can connect to. Claude Code can now keep track of tasks from those servers that run in the background, meaning they keep working while you carry on. Each background task has its own separate record.

- Follow-up messages: a message you send can be merged into a background task that is still running, instead of waiting for it to finish.

- Crashes: if the process running a background task stops unexpectedly, the task is marked as failed with the code `drive_crashed`.

**Why**

This is the first groundwork for MCP tasks that run in the background. When one crashes, it is reported as failed rather than left looking unfinished.

- Area: MCP
- Tier: You'll notice
- Useful: 5/5
- Signal: 4/5

### Memory recall adds account memories and labels local ones

Memory recall gains a new account memory source and 'local' labels, and withdrawn memory snapshots get clearer wording

**Unclear.** It is not clear what switches on account memory or what decides when the local label appears.

**What**

Memory recall is Claude Code bringing saved notes into a conversation when they seem relevant. It now handles a second source, account memories, next to the memory files on your machine:

- A new `account_memory_recall` attachment type. It is shown to the model, counted in memory-size accounting next to `relevant_memories`, and draws nothing in the message view.

- The recall selector gets the names of recalled account memories and the turn count. It now keeps only text entries that pass a validity check.

- The old listing of memory files, which ended with "... more memories not listed", is replaced.

- The screen can show "Recalled N local memories" and " · local" when a local-recall flag is set.

- When an earlier memory snapshot is withdrawn from shared cowork memory, the model is now told: "The memory snapshot shown earlier has been removed from this conversation; do not rely on anything it said." This replaces "The previous memory snapshot was withdrawn; disregard it." This reminder also takes a new `toolsOnly` option.

- New reason texts: "after auto-memory was turned off for this session" and "after auto-memory was turned back on for this session".

**Why**

What Claude sees from memory may now include account memories as well as local files, and the "local" label shows which kind you are looking at.

- Area: Memory
- Tier: You'll notice
- Useful: 4/5
- Signal: 3/5

### Resuming a session that is running in the background now opens it and hands over your prompt

Resuming a conversation that is still running in the background now attaches to it and delivers your prompt, instead of stopping with instructions

**Unclear.** Exactly when a session counts as one Claude Code can open is not settled.

**What**

A background session is a Claude Code conversation that keeps running without a terminal window attached to it. Before, choosing one in `/resume` or with `claude --resume` stopped with a message saying the session was still running, and told you to run `claude attach` or `claude stop`. Now Claude Code tries to open it for you:

- The session is opened as if you had run `claude attach <jobId>`, and Claude Code prints "Opening ..., running in the background".

- If you gave a prompt, it is first sent to that session so it runs as the next turn.

- Before handing over, Claude Code checks that the background session is running the same Claude Code build. If it is not, you get an `ESKEW` error.

- This needs an interactive terminal for both input and output. It does not happen with conflicting flags such as an `--output-format` other than text.

- The path sits behind `tengu_resume_open_live_bg`, whose built-in fallback is on when the server sends no value.

If opening fails or a launch prompt is still pending, a screen explains why. It now shows the session title followed by " is running in the background". It also says whether your prompt was queued, not confirmed, or not sent, and still suggests `claude attach`, `claude stop` and `claude --resume ... --fork-session`. A separate message tells you when your latest conversation is running in the background. It points to `claude agents` or `claude --resume`, and adds `--fork-session` when forking into a new copy is possible.

**Why**

Resuming a busy background session no longer dead-ends, and a prompt you typed is not silently lost. You are told what happened to it.

- Area: Sessions
- Names: `/resume`, `--resume`
- Tier: You'll notice
- Useful: 4/5
- Signal: 3/5

### Plugin command line: configure options without the menu, set bundled MCP server settings, and see data size

New `claude plugin configure`, `plugin install --config` reaching bundled MCP server settings, and `plugin list --data-size` for scripts

**Unclear.** It is not clear whether `--data-size` shows up in the command's help or is hidden.

**What**

More plugin setup can now be done from the command line, without the interactive `/plugin` menu. A plugin's options, called `userConfig`, are the settings it asks you for, such as an API key.

- `claude plugin configure <plugin>`: a new subcommand. Run on its own, it shows a plugin's options and which are unset. With `--values-stdin`, it reads a JSON object of single-line strings from standard input and saves them, for example `claude plugin configure <plugin> --values-stdin < values.json`. Options you leave out keep their values. `--json` gives machine-readable output, and `--cowork` is also accepted. Input is capped at 256 KB and each value at 64 KB. Values are checked against the plugin's option list, and sensitive values are hidden in error output.

- `plugin install --config KEY=VALUE`: can be repeated, and a pair with no key is an error. It can now also set the own `user_config` field of a bundled `.mcpb` MCP server, written as `<server>.<key>=<value>`. Before, it accepted only options declared in the plugin's manifest. A key that is undeclared, or declared by more than one bundled server, is an error. After installing, the command lists options left unset and MCP servers that still need configuration.

- `claude plugin list --json --data-size`: takes a plugin id, or nothing for all plugins, and reports `dataDirSize` and `dataDirUnreadable`. Each entry also gains `projectEnabled` and `hasUserConfig`. Naming a plugin that is not installed exits with an error.

**Why**

Scripts can now install a plugin, fill in its settings, secrets included, and check how much disk space its data folder uses. Before, setting options was only possible through the interactive menu.

- Area: Plugins
- Names: `--data-size`, `claude plugin list`, `--json`
- Tier: Use it now
- Useful: 5/5
- Signal: 2/5

### New `claude --desktop` opens a session in the Claude Desktop app

The new --desktop flag opens Claude Desktop instead of the terminal, and can pick a session with --continue or --resume

**Unclear.** It is not clear whether the option is hidden or available only on some platforms.

**What**

A new command-line option, `--desktop`, opens the Claude Desktop app instead of running Claude Code in the terminal. You can combine it with `--continue` to open your most recent conversation, or with `--resume <id>` to open a specific session.

It has several limits:

- It works only on macOS and Windows (x64). On other systems it says `--desktop` isn't available on this platform.

- It needs you to be signed in with a Claude account.

- It refuses to run non-interactively, alongside other flags, in restricted, safe or bare mode, or when given a prompt or input piped in from another command.

- Claude Code looks for `--desktop` only before any `--` separator on the command line.

**Why**

This gives you a direct way to move a terminal conversation into the desktop app, for example to continue working in a graphical window.

- Area: Desktop App
- Names: `--desktop`
- Tier: Use it now
- Useful: 5/5
- Signal: 2/5

### Claude Desktop's helper can pass work details when it starts a session

The first request an SDK client sends to Claude Code now accepts a work and environment ID, used only by Claude Desktop's helper

**What**

The first request a program sends when it connects to Claude Code through the SDK (the initialize request) can now carry `attachServeRequest`, holding a work ID and an environment ID. It is only for Claude Desktop's serve-only helper, which it launches with `--attach-serve`.

**Why**

This is a detail of how Claude Desktop talks to Claude Code and has no direct effect if you use Claude Code in a terminal.

- Area: Desktop App
- Names: `attachServeRequest`
- Tier: Under the hood
- Useful: 4/5
- Signal: 4/5

### `set_max_thinking_tokens` now checks `thinking_display` and can refuse part of a request

The SDK `set_max_thinking_tokens` request now validates `thinking_display`, refuses bad parts, and does not apply the value "highlights"

**Unclear.** It is unclear whether this message can be reached in normal use.

**What**

The SDK (the kit for driving Claude Code from your own program) can send a `set_max_thinking_tokens` request to change the thinking budget (`max_thinking_tokens`) and how thinking is shown (`thinking_display`). The request is now checked as a whole:

- Validation: `max_thinking_tokens` and `thinking_display` are checked together. If the check fails, the reply is `set_max_thinking_tokens: part of the request refused`.

- "highlights": asking for `thinking_display` "highlights" produces a message that it "was not applied", and the display stays as it was. The accepted values are "summarized" and "omitted".

**Why**

If your program changes thinking settings, part of a request can now be rejected. Check the reply rather than assuming the new display setting took effect, and use "summarized" or "omitted".

- Area: Thinking Display
- Names: `thinking_display`
- Tier: You'll notice
- Useful: 2/5
- Signal: 4/5

### Admins can limit which API providers Claude Code may use

The new managed setting `allowedProviders` lists the API providers allowed, and Claude Code refuses to run on any other

**Unclear.** It is unclear whether a policy sent from the server is enforced the same way as one set on the machine.

**What**

Managed settings are settings an administrator sets for the machines they manage. A new one, `allowedProviders`, lists the API providers Claude Code may use. An API provider is the service Claude Code sends requests to. It can only be set in managed settings. Accepted names are:

- `anthropic`

- `bedrock`

- `vertex`

- `foundry`

- `anthropicAws`

- `mantle`

- `customEndpoint`

- `gateway`

If the list is not set, every provider is allowed. If it is empty, none is, and Claude Code will not start on that machine. A session on a provider or custom endpoint not in the list is refused at startup, at login and when it contacts the API, with "API provider not allowed by managed settings". The message says what to unset or pin, for example in the "env" block of managed settings. Sign-in checks the provider before opening the browser login. `claude gateway` refuses to start under such a policy, and the status screen shows an "Allowed providers" row.

**Why**

Admins can lock down which providers and endpoints Claude Code sends requests to. Users who hit the limit get a message saying what to change.

- Area: Managed Settings
- Names: `allowedProviders`
- Tier: Use it now
- Useful: 5/5
- Signal: 3/5

### Apps can ask Claude Code to connect to an MCP server

Claude Code now handles an `mcp.connect` request that takes the name of an MCP server

**Unclear.** It is not clear which interface accepts this request.

**What**

Claude Code now handles a request called `mcp.connect`. It requires a `server` value, which must be a non-empty piece of text.

**Why**

An app that controls Claude Code may be able to tell it to connect to a named MCP server, an outside program that supplies extra tools.

- Area: SDK
- Names: `mcp.connect`
- Tier: Use it now
- Useful: 5/5
- Signal: 3/5

### Hosted remote sessions can take the agent proxy certificate from an environment variable

In hosted remote sessions, the agent proxy can read its certificate authority from `CCR_AGENT_PROXY_CA_CERT_B64` instead of always downloading it

**Unclear.** It is not clear what normally sets this variable, or whether the background certificate check always runs.

**What**

In hosted remote sessions, Claude Code runs on a remote machine instead of your own computer. There, traffic can go through an agent proxy, a middleman that forwards requests. The proxy needs a certificate authority (CA), the certificate that lets connections through it be trusted. Previously Claude Code always downloaded that CA. It can now read it from the `CCR_AGENT_PROXY_CA_CERT_B64` environment variable, which holds the certificate as base64-encoded PEM text.

This applies when `CLAUDE_CODE_REMOTE` and `CCR_AGENT_PROXY_ENABLED` are set. Claude Code checks the value before using it:

- The text must be valid base64.

- It must be within a size limit.

- It must contain a certificate block.

If the value fails any check, Claude Code ignores it and downloads the CA as before. It also ignores the variable in essential-traffic-only mode. A separate background check later downloads the CA the proxy is serving and rewrites the stored certificate bundle if the two differ.

`CCR_AGENT_PROXY_CA_CERT_B64` and `CLAUDE_CODE_MCP_SERVE_SETTINGS` were also added to the list of environment variables that are passed through to child processes.

**Why**

Supplying the certificate up front lets a hosted session start faster, without waiting on a download. Because the background check rewrites the bundle when the served certificate differs, a certificate that has been replaced does not leave the session stuck with an old one.

- Area: Sessions
- Names: `CCR_AGENT_PROXY_CA_CERT_B64`
- Tier: Use it now
- Useful: 5/5
- Signal: 3/5

### Workflow scripts can append to a session with `$.session.append`

Workflow scripts gain `$.session.append`, which appends to a session without sending a turn, next to the existing `send`

**Unclear.** It is not clear what appending does to the session once it arrives.

**What**

Workflow scripts could already send a message into a session with `send`. They now also have `$.session.append`, which appends to the session. Both now check their input the same way.

**Why**

A script can add to a session without sending Claude a new turn to answer.

- Area: Workflows
- Tier: Use it now
- Useful: 5/5
- Signal: 3/5

### Delivering a report can now end the agent's turn

Behind a server-controlled switch, the tool that delivers a report to its caller can now make the agent stop straight after

**Unclear.** It is not clear which tool this is or what in Claude Code acts on the instruction to end the turn.

**What**

One tool lets an agent hand a report back to whoever asked for it, answering "Report delivered to your caller." Behind a switch the server controls, its result can now also tell Claude Code to end the agent's turn, instead of handing the report back and letting the agent carry on.

**Why**

An agent that delivers a report, such as a subagent (a helper Claude starts to do part of a job), may stop right after doing so, which changes how long it runs.

- Flag `tengu_purring_pine`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Agents
- Tier: Nothing to try yet
- Useful: 3/5
- Signal: 4/5
- Present in the build but not switched on

### Programs using the SDK can turn on prompt suggestions when restarting a session

A program asking Claude Code to re-initialize a session can now turn on prompt suggestions, if a remote setting allows it

**What**

Programs can drive Claude Code through its SDK, a toolkit for building on top of it. Such a program can ask a running session to re-initialize, which means restarting its setup. If that request asks for prompt suggestions, the session now turns them on, but only when a remotely controlled setting allows it. That setting is off unless it is switched on remotely. Usage reports now record whether suggestions were asked for and whether they were turned on.

**Why**

Programs that host Claude Code can now switch on prompt suggestions partway through, for the accounts the remote setting covers.

- Flag `tengu_gleaming_rivest`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: off) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: SDK
- Tier: Nothing to try yet
- Useful: 3/5
- Signal: 4/5
- Present in the build but not switched on

### Workflows off switch now enforced from managed settings, with clearer limits

Admins can turn workflows off through managed settings with disableWorkflows or CLAUDE_CODE_DISABLE_WORKFLOWS; cloud Code Review and /ultrareview are not stopped

**Unclear.** It is not clear which wins when the environment variable, the setting and the organization's own policy disagree.

**What**

Workflows are Claude Code's multi-step automated runs. Managed settings are settings an administrator puts on a machine that users cannot override. Claude Code now checks managed settings for `disableWorkflows`, or for `CLAUDE_CODE_DISABLE_WORKFLOWS` in their `env` block, and refuses to start a workflow when either is set.

- Refusals now say why. One message covers workflows turned off by the machine's administrator, for example "Code review did not run: workflows are turned off in this machine's managed settings". Another covers managed settings that could not be read.

- The setting's description now reads "Disable the Workflows feature." It adds that Code Review and `/ultrareview` run in the cloud and are not stopped by it.

- The policy check now also takes into account where the session's event came from. It can skip resuming a launch that needs that information.

**Why**

Administrators get a central way to switch workflows off, and users get a message explaining why a launch was refused. Admins should know the limit: cloud-run Code Review and `/ultrareview` are not covered by this switch.

- Area: Managed Settings
- Tier: Use it now
- Useful: 4/5
- Signal: 2/5

### Background shell commands now stop after a time limit

Commands run in the background now stop after 30 minutes by default, up to 2 hours with a longer timeout, and Claude is told to restart them

**Unclear.** It is not clear what switches these off or whether the time limit applies to everyone.

**What**

Claude can run a shell command in the background, meaning the command keeps going while the conversation continues. It does this by passing `run_in_background` to the Bash tool, the tool Claude uses to run terminal commands. Before this release, a background command had no deadline and could only be stopped when the machine ran low on memory. It now has a time limit:

- `timeout` with `run_in_background` sets how long the command may run in the background. The default is 1800000 ms (30 minutes) and the maximum is 7200000 ms (2 hours).

- When the limit is reached, the command is stopped. Its stop reason reads "stopped after reaching its background time limit". Claude is told to restart it with `run_in_background` and a longer timeout.

- The Bash and PowerShell tool descriptions now say that `timeout` on its own applies to a foreground command, one that Claude waits on. The Bash instructions now include the background default and maximum. Tool results also gain a `backgroundedByTurnAbort` field.

- The session state gains `backgroundTasksDisabled`, `backgroundDeadlineDisabled` and `unsandboxedCommandsDisabled`, with matching methods to turn each one off. These let background tasks, the background deadline, or unsandboxed commands be disabled for a session. Unsandboxed commands are commands run outside the protective sandbox.

**Why**

Long-running jobs started in the background, such as dev servers, watchers or long builds, will now be stopped after 30 minutes unless a longer timeout is given. If you rely on a background job running for longer, expect Claude to ask for or set a longer `timeout`. Nothing can run past 2 hours in one go.

- Area: Bash Tool
- Names: `timeout`
- Tier: You'll notice
- Useful: 4/5
- Signal: 2/5

### Bedrock and Vertex: Haiku default tracking and automatic fallback when a model is unavailable

On Bedrock and Vertex, a probed Haiku default no longer counts as your own setting, and models your account cannot use now fall back to the next tier

**Unclear.** What switches the fallback ladder on and which providers it covers are not known.

**What**

When Claude Code runs through a third-party cloud provider such as Amazon Bedrock or Google Vertex, it checks which models your account can use. It can also fill in the default model environment variables for you. An environment variable is a named setting passed to the program when it starts. This release extends that handling and adds an automatic fallback:

- `ANTHROPIC_DEFAULT_HAIKU_MODEL` now gets a `CLAUDE_CODE_3P_PROBE_WROTE_HAIKU_DEFAULT` marker. When Claude Code's own availability check wrote the value, it is no longer treated as something you set yourself. This already worked this way for Opus and Sonnet. Before, the Haiku variable always counted as user-set.

- New `CLAUDE_CODE_3P_SEEDED_SONNET_DEFAULT` and `CLAUDE_CODE_3P_SEEDED_OPUS_DEFAULT` variables record when a Sonnet or Opus default was filled in automatically. These markers are passed on to child processes along with the other model variables.

- A new fallback ladder moves a model tier down to the next model when your account cannot access the one it would use. The ladder follows the model environment variables. The error shown reads "is not available to this account. Ask your cloud admin to enable it, or choose another model."

- When the Opus tier falls back, `ANTHROPIC_DEFAULT_OPUS_MODEL_NAME` and `ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION` are rewritten to say Opus is unavailable and to name the model used instead.

- When the default Sonnet model is unavailable on Bedrock or Vertex, the replacement model is now also registered with Claude Code, not only written to the environment variable. This path sits behind a server-controlled switch, `tengu_bedrock_default_fallback`.

- `CLAUDE_CODE_DISABLE_MODEL_ACCESS_FALLBACK` turns the fallback ladder off, alongside the existing `CLAUDE_CODE_NO_MODEL_FALLBACK`.

**Why**

If your cloud account has not enabled a model, Claude Code may now switch to a different one instead of failing. The model picker will say so. If you would rather get an error than a silent downgrade, set `CLAUDE_CODE_DISABLE_MODEL_ACCESS_FALLBACK`.

- Area: Models
- Tier: You'll notice
- Useful: 4/5
- Signal: 2/5

### Apps that host Claude Code can ask it to list a directory

A new `list_directory` request lets an app that hosts or controls Claude Code ask it to list a folder's contents

**Unclear.** Which apps send this request and what, if anything, limits it is not known.

**What**

Apps that host Claude Code, such as an editor, can send it control requests. A new `list_directory` request was added to the requests Claude Code handles, and to its set of requests that mostly only read information.

**Why**

A host app can ask Claude Code to list a folder.

- Area: SDK
- Names: `list_directory`
- Tier: Use it now
- Useful: 4/5
- Signal: 3/5

### Hidden command lets the VS Code extension clear out deleted worktrees

A hidden `claude drop-worktree-registrations` command, used by the VS Code extension, removes git's records of deleted worktrees

**What**

Claude Code has a new hidden command, `claude drop-worktree-registrations`, that the VS Code extension runs. A worktree is an extra working folder attached to a git repository. When such a folder is deleted, git can keep a record of it. This command reads a list of those worktrees, given as JSON, and removes git's records of them.

The command will not run in two cases:

- When it is run by hand in a terminal.

- Inside a Claude Code session, which it detects through `CLAUDE_CODE_CHILD_SESSION`.

**Why**

The VS Code extension now cleans up deleted worktrees through Claude Code itself. The command is not meant to be run by hand.

- Area: Worktrees
- Names: `claude drop-worktree-registrations`
- Tier: Use it now
- Useful: 4/5
- Signal: 3/5

### SDK sessions accept requests to drive the terminal interface

Programs driving Claude Code can now send requests to press, type, select, scroll and show or close panes in its interface

**Unclear.** It is not clear what sends these requests or whether anything gates them.

**What**

The SDK lets another program drive Claude Code by sending it control requests. The kinds of control request it accepts, which already covered things like interrupting and stopping a task, now also include:

- `ui_press` and `ui_client_press`

- `ui_input`

- `ui_select`

- `ui_pane_show` and `ui_close`

- `ui_scroll`

- `ui_prompt_edit`

These interface requests are accepted only when the request's `by` value is not "app". A session also gains a field for the program hosting its interface, and sessions gain a `session.append` message.

**Why**

This looks like groundwork for letting an app control Claude Code's terminal interface remotely.

- Area: SDK
- Tier: Use it now
- Useful: 4/5
- Signal: 3/5

### Claude Code can try another model when access to one is denied

When a model request fails with permission denied, Claude Code can now retry with the next model on a fallback list

**Unclear.** The purpose of the change is inferred, and what part of Claude Code uses this list is unclear.

**What**

Claude Code now builds a list of fallback models, meaning other models to try in turn. When a request fails because access to a model was denied, it retries with the next model on the list. The list is not built when you have already set a fallback model or a small fast model.

**Why**

This could keep a session going when one model is not available to your account.

- Area: Models
- Tier: You'll notice
- Useful: 4/5
- Signal: 3/5

### New --desktop flag, and background commands now accept options in front of them

`--desktop` opens the Claude Desktop app and now errors when combined with background or worktree options

**What**

A flag is an option you add to the `claude` command. The new `--desktop` flag opens the Claude Desktop app. Claude Code stops with an error if you combine it with:

- `--bg`, `--background` or `--routine`, which run Claude Code in the background

- `--worktree` or `--tmux`

The background commands `logs`, `attach`, `stop`, `kill`, `respawn` and `rm` used to be recognized only as the first word after `claude`. They are now also recognized after general options, as in `claude --settings x logs`. Any `--settings` or `--managed-settings` given before them is applied first.

**Why**

You can put general options before background commands, and those settings take effect. The clear errors keep `--desktop` from being mixed with options it can't honour.

- Area: Desktop App
- Names: `--desktop`
- Tier: Use it now
- Useful: 5/5
- Signal: 2/5

### Turn off web page fetching with CLAUDE_CODE_DISABLE_WEB_FETCH

Setting the environment variable CLAUDE_CODE_DISABLE_WEB_FETCH turns off WebFetch, the tool Claude uses to download web pages

**Unclear.** Other parts of Claude Code also read this variable, and it is not clear what it changes there.

**What**

Claude Code now reads a new environment variable, `CLAUDE_CODE_DISABLE_WEB_FETCH`. An environment variable is a named value you set in your shell or system before starting Claude Code. When this one is set, the WebFetch tool is turned off. WebFetch is the tool Claude uses to download a web page and read it.

**Why**

It gives you, or an administrator, a simple way to stop Claude Code from fetching web pages.

- Area: Web Fetch
- Names: `CLAUDE_CODE_DISABLE_WEB_FETCH`
- Tier: Use it now
- Useful: 5/5
- Signal: 2/5

### Claude Code now says why the 'highlights' feature is unavailable

When 'highlights' is unavailable, Claude Code now names the reason: provider, experimental betas turned off, model, or the API rejecting it

**Unclear.** It is not clear where the reason is shown to a reader.

**What**

'Highlights' is a beta (pre-release) feature. When it cannot be used, Claude Code now looks up the reason in a fixed list and names it. The reasons are:

- the provider, the service that runs the model, does not support it

- experimental betas are off, through `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS` or organization policy

- the model does not support it

- the API rejected the request

**Why**

If highlights does not work for you, the reason now points at what to check, such as whether `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS` is set.

- Area: Thinking Display
- Tier: You'll notice
- Useful: 2/5
- Signal: 4/5

### Artifact pinning no longer waits on a remote switch

Artifact pinning now defaults to available unless CLAUDE_CODE_ARTIFACT_PIN turns it off, and no longer checks tengu_cobalt_plinth_holly

**Unclear.** What Claude Code does with this setting once it is on was not checked.

**What**

Artifact pinning lets you pin and unpin artifacts. When the `CLAUDE_CODE_ARTIFACT_PIN` environment variable was not set, the check used to ask a remote switch, `tengu_cobalt_plinth_holly`, and treated it as off if there was no answer. That lookup is gone:

- With `CLAUDE_CODE_ARTIFACT_PIN` unset, pinning now defaults to on, so it is available in local sessions without any remote switch.

- `CLAUDE_CODE_ARTIFACT_PIN` can still turn it off.

- The remote-session exceptions are unchanged. Pinning stays off when `CLAUDE_CODE_REMOTE` is set and an internal check fails, and another internal check can still turn it off in remote sessions.

- Deleting artifacts is separate and still depends on the remote switch `tengu_cobalt_plinth_alder`, treated as off when there is no answer.

**Why**

In local sessions you get artifact pin and unpin by default. If you do not want it, set `CLAUDE_CODE_ARTIFACT_PIN` to turn it off.

- Flag `tengu_cobalt_plinth_holly`: On for this account, and not off by default (read for one account on one subscription tier against v2.1.285; this account: on, anonymous baseline: on, compiled default: not a boolean we can read) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Artifacts
- Names: `CLAUDE_CODE_ARTIFACT_PIN`
- Tier: Use it now
- Useful: 3/5
- Signal: 2/5

### Precomputed compaction setting still hidden unless switched on remotely

The `precomputeCompactionEnabled` option still only appears in settings when a server-side switch is on, which falls back to off

**Unclear.** What the setting does once shown is not established.

**What**

The `precomputeCompactionEnabled` option is still only added to the settings menu when a server-side switch is on. That switch falls back to off when the server sends nothing, so the option is otherwise hidden. Apart from internal renaming, this is unchanged. In the last readings, taken before this release, the flag server returned off both for this site's account and for a signed-out baseline.

**Why**

You will not see this option unless it is switched on for your account.

- Flag `tengu_sepia_moth`: Off in both readings (read for one account on one subscription tier against v2.1.285; this account: off, anonymous baseline: off, compiled default: off) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Compaction
- Names: `precomputeCompactionEnabled`
- Tier: Nothing to try yet
- Useful: 3/5
- Signal: 3/5
- Present in the build but not switched on

### `/memory` can turn auto memory on or off for just this session

/memory gains a session-only auto memory toggle and new refusals, and its Account memory line is removed

**Unclear.** When the session toggle row appears is not stated.

**What**

Auto memory is Claude Code saving notes it learns for later sessions. Before, `/memory` had only a lasting on/off toggle for it. Changes:

- Session toggle: a new row turns auto memory on or off for the current session only.

- Project picks: picking a project can now be refused, and not saved, while writes are on.

- Session kind: some kinds of session can refuse the choice.

- Account memory: the tool that edits memory settings accepts an account memory setting and reports an error when raising an account setting is refused.

- The "Account memory" line is removed from the selector.

**Why**

You get finer control over memory, but also new cases where a choice is refused, so watch for those messages.

- Area: Memory
- Names: `/memory`
- Tier: Use it now
- Useful: 4/5
- Signal: 2/5

### Admins can restrict sign-in providers with a new allowedProviders setting

A new `allowedProviders` managed setting can block `claude auth login` and `setup-token` when the policy disallows Anthropic's own sign-in

**What**

Managed settings are settings an administrator puts in place on a machine. They gain an `allowedProviders` key. When it does not permit the first-party provider, meaning signing in directly with Anthropic, these commands refuse to run:

- `claude auth login`

- `setup-token`, which creates a long-lived Claude.ai subscription token

If the value of `allowedProviders` is invalid, the settings check reports it and asks you to fix it.

**Why**

Administrators get control over which sign-in providers can be used on a machine. If sign-in is refused, this policy may be why.

- Area: Managed Settings
- Names: `allowedProviders`
- Tier: Use it now
- Useful: 4/5
- Signal: 2/5

### Diagnostics file can now record slow or stalled streaming responses

With CLAUDE_CODE_DIAGNOSTICS_FILE set, Claude Code can log a record whenever a piece of a streamed response arrives slowly

**Unclear.** It is not clear whether every streamed response is watched once the diagnostics file is set, or only some.

**What**

The diagnostics file set with `CLAUDE_CODE_DIAGNOSTICS_FILE` can now capture stalls in streamed responses. A streamed response arrives as a series of pieces, called frames. When a frame arrives slowly, Claude Code writes a `cli_sse_frame_stall` record noting:

- the gap before the frame arrived

- how far Claude Code's own processing had fallen behind

- how much CPU time was used

The stall watcher is only created when `CLAUDE_CODE_DIAGNOSTICS_FILE` is set and the code reading the stream asks for it. Otherwise nothing is measured.

Separately, the waits between reconnect attempts and between retried requests are now worked out by one shared routine instead of separate calculations.

**Why**

This is for troubleshooting only. Nothing changes unless you set the diagnostics file, and if you do, it gives you a way to see where a slow response was held up.

- Area: Diagnostics
- Names: `CLAUDE_CODE_DIAGNOSTICS_FILE`
- Tier: Use it now
- Useful: 3/5
- Signal: 2/5

### ctrl+n now works like the down arrow and Return in one of the lists

In one of Claude Code's lists, ctrl+n is now accepted wherever the down arrow or Return is accepted

**Unclear.** It is not clear which list or menu this handler belongs to.

**What**

One of Claude Code's key handlers used to respond only to the down arrow and Return. It now also accepts ctrl+n. Holding Alt or Meta at the same time turns this off.

**Why**

ctrl+n moves down in many terminal programs and editors, such as Emacs. If you are used to it, you can now press it in this list without reaching for the arrow keys.

- Area: Terminal UI
- Tier: Use it now
- Useful: 2/5
- Signal: 1/5

## Improvements

### Auto-memory can be off for a session, carries into background sessions, and pause messages changed

A new per-session auto-memory-off state gets its own notice, passes to background sessions, and pause messages now say only the user can resume

**Unclear.** How these pieces fit together, and whether auto-memory being off really carries into background sessions, is not confirmed.

**What**

Auto-memory is Claude Code saving and reading notes about you and your work between sessions. Next to the existing pause, there is now a separate "auto-memory off for this session" state:

- New session state `autoMemoryOffThisSession` and `restoredAutoMemoryOff`, alongside the existing `memoryToggledOff`, plus a new notice with the key `session-auto-memory-off` next to `memory-paused`. A new message begins "Memory is still paused from".

- Background sessions, which are other Claude Code sessions started to run on their own, now receive `CLAUDE_BG_AUTO_MEMORY_OFF` next to `CLAUDE_BG_MEMORY_TOGGLED_OFF`. It is added to three allow-lists and cleared in the background-session environment cleanup, so an off state appears to carry over from the session that started it.

- The agents-view handoff passes `autoMemoryOffThisSession` too.

- The SDK description of `auto_memory.enabled` now says it is on for every session and is not turned off by an environment variable, launch flag, safe mode or per-model switch.

- Messages when memory is paused: "Cannot write to memory while it is paused for this session; only the user can turn it back on." and "Cannot read memory while it is paused for this session; only the user can turn it back on." They no longer tell Claude to run `/pause-memory`.

- `/pause-memory` (also `memory-pause` and `toggle-memory`) may now be hidden, depending on a check. When resuming is possible it says "Run /pause-memory again to resume."; otherwise it says the session cannot turn memory back on.

Separately, a check of MCP servers (helper programs that give Claude extra tools) now also counts servers of type `cached`, not only `connected` and `pending`.

**Why**

Turning auto-memory off now has a clear state of its own, with its own notice, and background sessions started from that session appear to keep it off. The new messages stop Claude from telling you to run a command it cannot run itself.

- Area: Memory
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Cloud sessions: directory sync removed, legacy bundle upload retired on macOS and Linux

Starting a cloud session no longer uses directory sync, CLAUDE_CODE_LEGACY_BUNDLE stops working on macOS and Linux, and creation messages are clearer

**Unclear.** It is not clear what decides whether the older upload method is still allowed.

**What**

When you start a cloud session, for example with `claude --cloud`, Claude Code has to get your local files to it. Several ways of doing this were removed or narrowed:

- Directory sync is gone. These environment variables are no longer read anywhere: `CLAUDE_CODE_DISABLE_DIR_SYNC`, `CLAUDE_CODE_DIR_SYNC_GIT`, `CLAUDE_CODE_DIR_SYNC_STREAM`, `CLAUDE_CODE_DIR_SYNC_ENGINE`, `CLAUDE_CODE_DIR_SYNC_FFWD` and `CLAUDE_CODE_DIR_SYNC_DISABLE_ANCHORING`. The first-upload and folder-seeding steps are gone, along with the note that your folder is not a git repository and the hint to run `CLAUDE_CODE_DIR_SYNC_ENGINE=none claude --cloud`. Sessions now report directory sync as off.

- Uploading your repository as a git bundle (one file holding the repository) remains. The old message "Cannot start a cloud session from this folder right now" and the reroute and fallback paths after a bundle failure are gone.

- `CLAUDE_CODE_LEGACY_BUNDLE` is no longer honoured on macOS and Linux. Setting it there logs "CLAUDE_CODE_LEGACY_BUNDLE is not honoured on macOS and Linux: the default upload method runs". Only Windows keeps the older path. A new message suggests pushing your work and connecting GitHub instead. It was also dropped from a list of bundle variables that now holds only `CCR_ENABLE_BUNDLE` and `CCR_FORCE_BUNDLE`, though it is still used elsewhere.

- When a bundle upload fails with an unsupported layout, falling back to the older capture method now depends on a check. If the check says no, the upload is refused.

- Sessions tied to a device fail early if they are created with built-in tools and a first message together. The session request now also carries `maxTurns` and `builtinTools`.

- The waiting message is shorter: "A message is waiting · esc to take it back" instead of mentioning files still syncing.

- Interrupting or timing out while a cloud session is still being created now says so, for example "Interrupted while the cloud session was being created - it may still be running".

**Why**

If you relied on any `CLAUDE_CODE_DIR_SYNC_*` variable, or on `CLAUDE_CODE_LEGACY_BUNDLE` on a Mac or Linux machine, it no longer has any effect. Some cloud sessions that used to start by falling back to another method may now fail with a message, and connecting GitHub is the suggested way around it.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Headless SDK sessions send plugin UI events and requests to the host app

Headless stream-json sessions now send ui_* messages (toasts, status, panes, prompt fill and more) so a host app can show plugin interface pieces

**Unclear.** It is not clear which host apps answer these requests, or which plugin features send them.

**What**

A headless session is Claude Code running without its own screen, driven by another program (the host) through the SDK with `stream-json` output. Plugin interface actions there used to do nothing but log "no notification bar in a headless session". Now they are passed to the host:

- System messages with subtypes `ui_toast`, `ui_status`, `ui_invalidate`, `ui_log`, `ui_panes`, `ui_scroll` and `ui_focus`. The last five are sent only when a check passes. Before, only `commands_changed` was sent.

- Requests the host answers: `ui_copy`, `ui_prompt_read`, `ui_prompt_fill` and `ui_prompt_suggest`, sent on non-remote connections. If an answer is shaped like an error and is not from the expected client, it is ignored and the request keeps waiting.

- An allowlist of message subtypes now includes these `ui_*` subtypes and `session_title_changed`.

- New hooks for connecting and resolving plugin MCP servers.

In the same area, reconnect and retry delays now go through one shared helper with random variation of 0.25 either way, and errors when waking a worker map to reasons such as `wake_unsupported_host`.

**Why**

A host app can now show plugin notifications, status and panes, and let plugins read or fill in the prompt box. This only has an effect if the host answers these messages.

- Area: SDK
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Remote session transport gains read receipts, ack flushing and flush-on-first-delta

The CCR remote session transport adds inbound read receipts, a flushDeliveryAcks method and a flush-on-first-delta option that falls back to off

**Unclear.** What turns read receipts on, and whether anything uses the new acknowledgement step, is not known.

**What**

CCR is the connection Claude Code uses for remote sessions, where messages stream between Claude Code and another place such as the web. This release adds new options to it:

- `inboundReadReceipts`, a new transport option. When it is on, the filter for incoming streamed events changes, and 'processed' delivery reports are skipped for certain events. Before, every received event was reported as both received and processed as soon as it arrived.

- `flushDeliveryAcks`, a new transport method that sends pending delivery reports.

- `streamEventFlushOnFirstDelta`, a new worker setting, with a `setStreamEventFlushOnFirstDelta` setter on the transport. It is read from the remote switch `tengu_ccr_stream_flush_on_first_delta` and falls back to off when nothing is set. Nothing has been read about that switch.

- The read-receipt behaviour is controlled by a separate check that the findings could not identify.

The related switch `tengu_ccr_event_hold_enabled` falls back to on when nothing is set. No reading of it has been taken under this release.

**Why**

These options change how a remote session confirms that messages have arrived and been handled. Because they are controlled from Anthropic's servers and mostly fall back to off, most people will see no difference until they are switched on.

- Flag `tengu_ccr_stream_flush_on_first_delta`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: off) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Flag `tengu_ccr_event_hold_enabled`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Sessions
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Auto mode at startup now waits for your organization's policy and can be held back for HIPAA

Claude Code now waits for a pending organization policy before starting in auto mode, can withhold auto mode for HIPAA reasons, and skips it in remote sessions

**Unclear.** It is not clear what marks a session as flagged under the HIPAA policy, or whether this behaviour is switched on remotely.

**What**

A permission mode decides how much Claude does without asking you first, and auto mode lets it go ahead on more actions. When a session starts, Claude Code picks a starting mode. Before, it only re-checked that choice when its cache of server settings was empty. It now also waits on your organization's policy verdict, the policy decision for your account:

- Startup now records whether it is waiting on server settings, on a pending policy verdict, or both. It picks the mode again once the verdict arrives. The log line now says "startup resolved ... against a pending policy verdict" as well as the empty-cache case.

- The result gains `autoDefaultWithheldForPendingVerdict`, which holds back auto mode as the default while the verdict is pending.

- The result also gains `autoStartWithheldForHipaaTaint`, which holds back starting in auto mode when the session is marked as affected by HIPAA, the US health-data privacy rules. Both flags are false in the default case.

- A new message reads "Not shown under your organization's policy: measured by scanning the session transcripts saved on this machine."

- Remote sessions, those with `CLAUDE_CODE_REMOTE` set, are now skipped when deciding whether to default to auto mode.

- For non-interactive sessions, those run without you at the keyboard, the built-in fallback of `tengu_moss_anchor` is now also on. This fallback is only used when the server sends no value.

**Why**

This stops auto mode being chosen before your organization's policy is known. Organizations with HIPAA restrictions may find auto mode held back at startup. Scripted or non-interactive runs may now start in auto mode when the server sends no setting.

- Area: Auto Mode
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Bundled SDK: agent file tools reject unrestrictedPaths, plus worker and workspace changes

The bundled SDK's agent toolset and environment worker now refuse unrestrictedPaths and gain a workspace header, a work secret and sturdier heartbeats

**Unclear.** It is not clear how much of this can be reached from the Claude Code command line rather than only through the SDK.

**What**

These changes affect people who build on the Anthropic SDK bundled with Claude Code, especially its environment worker. The environment worker is the component that runs managed-agent sessions on your own machines.

- `unrestrictedPaths` is no longer supported by the agent toolset (`AgentToolContext`) or by `EnvironmentWorker`. Passing it now throws an error. Before, it was accepted.

- The file tools (read, write, edit, glob, grep) are always kept inside the working directory plus `allowedRoots`. In the worker, that means `workdir` plus the memory folders.

- `EnvironmentWorker` now takes a per-item `ANTHROPIC_WORK_SECRET` and reads a `sessions_token` from it. It mounts and syncs session memory stores using `memorySyncIntervalMs` and `memorySyncDeletions`.

- An optional `workspace_id`, sent as the `anthropic-workspace-id` header, is now available on batches, deployment runs, agent versions, and memory and work calls.

- New endpoints add and remove workspaces on federation rules.

- The work heartbeat, the regular check-in that keeps a work item claimed, now ends with `lease_lost`, `assumed_lost` or `heartbeat_rejected` and uses a request timeout. Before, it simply aborted the work item.

**Why**

Code that passes `unrestrictedPaths` will now fail, so remove the option and give file access through the working directory or `allowedRoots` instead. The heartbeat change means a lost claim on a work item ends with a clear reason rather than an abrupt abort.

- Area: Environment Workers
- Names: `unrestrictedPaths`
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Audio transcript attachments removed

Mentioning or pasting an audio file no longer produces a transcript, and tools can now opt out of automatic approval in bypass mode

**Unclear.** It is not clear which tools, if any, exclude themselves from bypass permissions mode.

**What**

Claude Code used to turn an audio file you mentioned with `@` into text. That is gone:

- The `audio_transcript` attachment is removed. It told Claude that an `@`-mentioned audio file had been transcribed with Anthropic's speech-to-text service.

- The message view no longer shows a "Transcribed" line or a "transcription failed" error.

- Pasting no longer treats audio as text-like, and the `onAudioPaste` handler is removed from the prompt box.

Separately, bypass-permissions mode, where Claude runs tools without asking, now respects a tool's `excludedFromModeBypassAllow` flag. A tool that sets it is not approved automatically in that mode.

**Why**

Audio files you mention or paste are no longer transcribed for Claude. Some tools may still ask for your approval even in bypass-permissions mode.

- Area: Permissions
- Names: `bypassPermissions`
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Background tasks dialog groups self-managed tasks into one row

A new 'self-managed tasks' kind is collapsed into a single expandable row in the background tasks dialog and excluded from one task-type check

**Unclear.** It is not clear which tasks count as self-managed or what controls the self-managed section.

**What**

Claude Code can run tasks in the background while you keep working, and the background tasks dialog (opened with `/tasks`) lists them. This release adds a new grouping for tasks called self-managed tasks:

- The dialog now gathers some tasks into a single `self_managed_tasks` row. Selecting that row expands it to show the individual tasks. The findings could not trace which tasks count as self-managed.

- The dialog also has a new section keyed `self-managed`. It appears only when a separate internal setting is switched on.

- A check that decides how a task is treated now returns false for `self_managed_tasks`, the same way it already did for `monitor_ws`.

- The `local_workflow` part of the dialog no longer checks whether workflows are available before showing or stopping them.

**Why**

If you run many background tasks, some may now appear under one collapsed row instead of as separate lines, so you may need to open that row to find a particular task. Workflows listed in the dialog can also be shown and stopped without the availability check that used to come first.

- Area: Background Tasks
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Unverifiable repository visibility can be policy-denied, logged once per repository

A repository whose visibility can't be verified may now be treated as blocked by policy, logged once per host and repo; Chrome's native host also reports the computer name

**Unclear.** It is not clear whether this depends on a remotely controlled setting or when it applies.

**What**

Claude Code sometimes checks whether a GitHub repository is public or private.

- When that lookup returns "unverified", the repository can now be marked as denied by policy and recorded as `policy_denied`. Before, the result was simply stored.

- A new `policyDeniedLogged` record makes sure such a denial is logged only once per host and repository.

Separately, the Chrome native host, the small helper that lets the Claude browser extension talk to Claude Code, now includes `computer_name` in its `get_status` reply. Control characters and a trailing `.local` are removed from the name. Before, the reply held only `native_host_version`.

**Why**

A repository whose visibility cannot be confirmed may now be treated as blocked by your organization's policy rather than allowed through. The browser extension can now show which machine it is connected to.

- Flag `tengu_org_policy_denied`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: not a boolean we can read) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Managed Settings
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Background sign-in warm-up request, blocked under HIPAA policy

Claude Code sends a background /v1/me request to prepare sign-in, and new HIPAA policy entries can deny it and MCP task worker wake-up

**Unclear.** Where the worker-restart policy is checked, and so what exactly stops happening, is not confirmed.

**What**

Claude Code now sends a small background request to `GET /v1/me` to prepare its sign-in with the Anthropic API. The request runs quietly without waiting for an answer, retries with a growing delay, and gives up after a timeout. It is skipped unless:

- the provider is Anthropic's own API (`firstParty`) and not a gateway, and

- the policy check `allow_api_auth_warm` passes.

Two new policy entries are denied for organisations under HIPAA rules when no cached answer is available:

- `allow_api_auth_warm` (requirement HIPAA-R59), which controls this warm-up request

- `allow_mcp_task_worker_wake` (requirement HIPAA-R57), which controls waking an MCP task worker. MCP is the system that connects Claude Code to outside tools.

**Why**

The warm-up is a network call Claude Code makes on its own in the background. Organisations under HIPAA rules will not get this warm-up or the MCP task worker wake-up.

- Area: Managed Settings
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Projects tool gains a restricted mode, and project_write refuses NUL bytes

Some sessions now turn off local uploads and memory for the Projects tool, file handling is size-capped, and project_write refuses content with NUL bytes

**Unclear.** Which sessions get the restricted mode, and where the file store's size limit comes from, is not clear.

**What**

The Projects tool lets Claude read and write documents in a project. Before, its description was fixed and local file uploads and memory reads were always allowed. Now:

- The tool's description is built with a `localUploads` option and a `memory` option, and both can be switched off in some sessions.

- In those sessions, `project_write` with `local_path` fails with "project_write: local_path is not available in this session; pass the text as content."

- Large project reads and downloads of files that were not extracted go through a size-limited file store for the session. If the limit is 0, the message is "this session does not keep files".

- `project_write` refuses content that contains NUL bytes (zero characters, common in binary or UTF-16 files) before uploading. The message says "The content contains NUL bytes, which project docs cannot store" and tells Claude to convert the content to UTF-8.

**Why**

In some sessions Claude must pass document text directly instead of pointing at a local file. Binary or UTF-16 files are no longer saved as broken project documents.

- Area: Projects
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Cloud sessions started with --environment prepare to pass on blocked tools

Creating a cloud session with --environment can now send a list of blocked tools, though that list is always empty in this build

**Unclear.** Because the list is always empty in this build, it is unclear whether any of this changes how a cloud session behaves yet.

**What**

The `--environment` flag creates a new cloud session, meaning a Claude Code session running on a remote machine. When it is used without the interactive screen, the request that creates the session can now include a list of disallowed tools, which are tools the session is not allowed to use. Claude Code also records how many tools were on that list. If one of your deny rules (a permission rule that blocks a tool) is written without its closing bracket, creating the session now stops with an error.

In this build the list of disallowed tools is always empty.

**Why**

This prepares for your deny rules to be carried over to cloud sessions, so a tool you block locally would also be blocked remotely.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### The sandbox may now ignore network and file permissions a repository grants itself

The sandbox now tracks one-time notices for ignoring a repository's own network, file and allowed-domain settings

**Unclear.** It is not confirmed that these repository settings are actually dropped, or under which conditions.

**What**

The sandbox is a restricted environment that limits what commands Claude runs can reach. It now keeps track of whether it has logged a one-time notice for each of three kinds of setting coming from a repository:

- network allowances

- filesystem grants

- allowed domains

These sit beside an existing notice for ignored excluded commands. This points to the sandbox dropping these repository-supplied settings and noting it once each time.

**Why**

If you rely on a project's own settings to widen what the sandbox allows, those widenings may no longer apply.

- Area: Sandbox
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Claude in Chrome can come from the remote session host instead of the built-in server

If the remote host supplies Claude in Chrome through `--mcp-config`, Claude Code uses that and does not start its own Chrome server

**Unclear.** How Claude Code recognises that an entry came from the remote host is not known.

**What**

Claude in Chrome lets Claude Code work with your Chrome browser. It runs as an MCP server, a small add-on program that gives Claude Code extra tools. Before, Claude Code always started its own built-in Chrome server.

Now, if the remote session host supplies a Claude in Chrome server through `--mcp-config`, Claude Code does not start the built-in one. One of three things then happens:

- A `deniedMcpServers` policy blocks the entry, and it is dropped.

- An organization policy denies the extension, and the entry is not used.

- Otherwise the entry is used, and a matching instruction is added to Claude's system prompt.

**Why**

Browser tools supplied by the remote host now take priority over the local built-in server, while existing admin policies can still block them.

- Area: Chrome & Browser
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Uploaded BMP, TIFF, HEIC, HEIF and AVIF images can now get a preview copy

Attachment uploads can now convert BMP, TIFF, HEIC, HEIF and AVIF images to PNG or JPEG previews, falling back to the original file when needed

**Unclear.** It is not clear which parts of Claude Code pass the `originalsOnly` option.

**What**

When Claude Code uploads an attached file for a session linked to another surface, it used to send the file exactly as it was. It can now convert images in BMP, TIFF, HEIC, HEIF and AVIF formats to PNG or JPEG before uploading.

- The original is uploaded instead when the image has several pages, is cut off, is rotated or mirrored, is larger than the preview size, or is over the upload limit.

- If uploading the converted copy fails with `http_413`, `http_5xx` or `network_error`, the original is uploaded instead. The failure message includes "could not make a preview copy of".

- `originalsOnly` turns conversion off. It is set when the request asks for it, or when the server-controlled switch `tengu_playful_panda` is off.

- The chat upload now returns the file's `file_uuid` together with details of the copy, such as whether it is an image and its media type.

**Why**

Images in formats that cannot be previewed directly should now show as previews. When a copy cannot be made, the original file still gets through.

- Area: Attachments
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Cloud sessions can now be started with a turn limit and a chosen set of tools

Starting a cloud session can now send a turn limit and a list of built-in tools, and the server confirms the turn limit

**Unclear.** It is not clear what sets the turn limit or when this newer interface is used.

**What**

A cloud session is a Claude Code conversation that runs on remote servers instead of on your machine. When Claude Code starts one through the newer version of the session-starting interface, it now also sends:

- A maximum number of turns, where a turn is one round of Claude working and replying.

- A list of the built-in tools the session may use.

Once the session is created, the server confirms whether it accepted the turn limit, and Claude Code reports progress when the session exists. If the list of built-in tools is empty, starting the session fails with the reason `builtin_tools_empty`. A failed start can now stop early.

**Why**

A turn limit on a cloud session is now passed to the server and confirmed, and not only kept on your side.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### HIPAA organisation policy can block bundled skills

A new organisation policy, allow_bundled_skills, is denied for HIPAA organisations, so bundled skills are not allowed there

**Unclear.** It is not clear how the policy is fetched or exactly what happens to the skills list when it is denied.

**What**

Organisations can set policies that control what Claude Code is allowed to do. A new policy, `allow_bundled_skills`, covers bundled skills, which are ready-made instruction packs Claude can use. For organisations under the HIPAA policy set (requirement HIPAA-R56), it is denied.

If Claude Code has no stored copy of the policy to check, it allows bundled skills.

**Why**

If your organisation is under HIPAA rules, bundled skills will be switched off for you.

- Area: Skills
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Plugins now explain why their MCP servers did not connect

Plugin MCP servers now report clear reasons when they are not connected, such as sign-in needed, still connecting, `--bare` or policy blocks

**Unclear.** Whether this plugin hook feature is available to users yet is not clear.

**What**

MCP servers are outside tools Claude Code can connect to, and plugins can bring their own. Claude Code now explains when a plugin's MCP server is not available:

- Waiting to connect: plugin hooks (plugin code that runs at set moments) that need an MCP server now wait for it to finish connecting. If it fails, they say why, for example that the server `needs you to sign in; run /mcp`, or that it "is still connecting after" a period of time.

- Reasons for not connecting: a plugin's MCP server can be refused because of safe mode, `--bare`, `--strict-mcp-config`, a remote client, a managed MCP setup that allows only its own servers, the server not being approved, being disabled, or being blocked by policy. For example: "This session runs with --bare, which connects no plugin servers."

**Why**

When a plugin's tools are missing, you now get a specific reason instead of silence, and often the fix, such as signing in with `/mcp` or starting without `--bare`.

- Area: Plugins
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Replying to a background job fails if it runs a different Claude Code build

A reply that continues a background job now fails with the error code ESKEW if the job runs a different Claude Code build

**What**

A background job is Claude Code work that keeps running without you watching it. You can reply to one with a follow-up, and that reply now accepts a next-turn option for the job's next step. If you send a next turn to a job that was started by a different Claude Code build, the reply fails with the code `ESKEW` and a message saying the job runs a different Claude Code build.

**Why**

Your follow-ups are not sent to an older background process that may no longer match the Claude Code you are using.

- Area: Sessions
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Plugin hook modules can block a tool call before it runs

A plugin hook that runs before a tool call can now deny it, and plugins get a clear reason when a message they add to the session is refused

**Unclear.** It is not clear whether this plugin hook path is switched on for anyone, or what check decides that.

**What**

A hook is a piece of code that Claude Code runs automatically at a set moment. `PreToolUse` is the moment just before a tool call, meaning an action Claude takes such as reading a file or running a command. A hook of this kind supplied through the plugin hook system can now deny the tool call. When it does, the result shows as an error naming the hook and the tool, in the form `Error: Hook PreToolUse:<tool>`.

The way a plugin adds messages to the current session, meaning the ongoing conversation, is also stricter. It now accepts only two kinds of entry:

- A hidden user message that is not shown as something you typed

- A system notice

Anything else is refused, and the refusal says why.

**Why**

This extends the plugin hook system, which is not documented, so that a plugin can stop a tool call before it happens rather than only observe it. Plugin authors who add messages to a session should expect other kinds of entry to be turned away.

- Area: Hooks
- Names: `PreToolUse`
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Replies to background sessions can now wait for the next turn

Replies to a background session can be marked for its next turn, and a reply to a blocked session is no longer typed into its terminal

**Unclear.** It is not clear which part of Claude Code sends these replies or how a reader would use the next-turn option.

**What**

A background session is a Claude Code conversation that keeps running without being on your screen. Sending it a reply now accepts an option that saves the reply for the session's next turn. A reply sent this way always goes through Claude Code's own message channel rather than being typed into the session's terminal.

If the session is blocked, meaning it is waiting on something, and it is not running in exec mode, the reply is no longer typed into its terminal. Claude Code reports that the reply was not delivered.

**Why**

Replies to a background session can now wait for its next turn instead of being typed in while it is busy.

- Area: Sessions
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Vertex model availability checks reworked

Claude Code's check of which Vertex models your account can use was rebuilt: the old cached check is gone and a new one remembers refused models

**Unclear.** It is not clear what starts the test, whether it is switched on for everyone, or whether it leads to Claude Code switching models on its own.

**What**

When you use Claude on Google Vertex, Claude Code checks whether your account can reach the models it wants to use. This check is called a probe.

- The old probe function, which cached results and logged lines like `[vertex-probe] ...: accessible (cached)`, has been removed.

- New functions probe whether the default and fallback models are accessible. They remember the results, record models that were refused, and log `[3p-model-memory] vertex record failed` when saving a result fails.

- Results are keyed on `ANTHROPIC_VERTEX_PROJECT_ID`, `ANTHROPIC_GOOGLE_CLOUD_PROJECT`, `ANTHROPIC_VERTEX_BASE_URL`, `GOOGLE_APPLICATION_CREDENTIALS`, `CLOUDSDK_CONFIG` and `CLAUDE_CODE_SKIP_VERTEX_AUTH`, so changing any of them triggers a fresh check.

**Why**

On Vertex, Claude Code now remembers which models your account cannot use and checks the fallback model too. This can lead to an automatic switch to another model when one is not available. Changing your project, endpoint or credentials starts the check over.

- Area: Vertex
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Headless mode waits briefly for a settings check before it starts

Headless mode now waits, with a time limit, for a pending settings check and accepts details for handing a live session to the background

**Unclear.** It is not clear what supplies the handover details or whether this path is switched on.

**What**

Headless mode is Claude Code running without its interactive screen, for example with `-p`. It now waits for a pending settings fetch to finish, up to a time limit, before it continues, so a refresh of your permission settings can complete first. It also now accepts details for handing over a live session that is being moved to the background.

**Why**

This supports moving a session you are running in the foreground into the background while it is still going.

- Area: Headless Mode
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Subagents in headless sessions have a new input to whether they run in background

The Agent tool now considers whether it was called by a subagent in a non-interactive session when deciding to run in the background

**Unclear.** The exact conditions and whether nested subagents end up more or less likely to run in the background are not clear.

**What**

A subagent is a separate helper Claude starts with the Agent tool to work on part of a task. The Agent tool decides whether a subagent runs in the background, meaning it works on its own while the main conversation carries on. That decision now also takes into account whether the caller is itself a subagent in a non-interactive session, such as one started with `-p`. When that is the case and a further condition holds, it changes whether the subagent is forced to run in the background.

**Why**

This may change whether subagents started by other subagents run in the background when you use `-p`.

- Area: Subagents
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Organization policy limits recheck when the `claude ssh` credential changes

Policy limits now refetch or hold back some settings when the credential supplied by the `claude ssh` launcher changes

**What**

Policy limits are restrictions your organization sets on what Claude Code may do. When you connect through the `claude ssh` launcher, the launcher supplies a credential, which is the login proof Claude Code sends to the server. Claude Code now notices when that credential changes. When it does, Claude Code either fetches the policy again or holds back settings that apply only on your machine.

Claude Code also reloads the policy when the credential set in the environment is no longer the one actually being sent.

**Why**

This keeps your organization's policy matched to the account a remote session is really using, so limits fetched under one credential are not applied under another.

- Area: Managed Settings
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Organization memory writes are refused in unsupported kinds of session

Turning on writes to organization memory is now refused unless the session is of a supported kind

**Unclear.** It is not clear which kinds of session are allowed to write.

**What**

Organization memory is shared memory that Claude Code can read and write across your organization's projects. Turning on writes to it now fails if the current session is not of a supported kind. Choosing a memory selection that would turn on writes in such a session is refused too. Before, the only refusals were for identity, remotely controlled settings, and reading being switched off.

**Why**

Writing to synced project memory is now limited to certain kinds of session, so in other sessions Claude Code can still read that memory but cannot change it.

- Area: Memory
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Message about hidden MCP tools now covers hiding a whole server's tools

The debug message for an MCP tool hidden from Claude now says the session hides that tool or every tool from its server

**Unclear.** It is not clear what hides a whole server's tools or how it is turned on.

**What**

The debug message logged when an MCP tool is kept from Claude has been reworded. It no longer says the tool was hidden because `keepMcpToolsFromModel` listed it. It now says the session keeps either this tool, or every tool from its MCP server, away from Claude.

**Why**

The wording suggests a session can now hide all of an MCP server's tools at once, not just tools named one by one.

- Area: MCP
- Names: `keepMcpToolsFromModel`
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Shorter pointer notice when an agent hands work back to itself

When a routed agent's single clean handback goes to that same agent, Claude Code can use a short pointer notice instead

**Unclear.** What the pointer notice looks like and when this path is reached are not known.

**What**

Claude Code can pass work to other agents, which are separate AI helpers that take on a task and then hand the result back. When a routed agent makes one clean handback and the recipient is that same agent, Claude Code can now send a short pointer notice instead.

This sits behind a remote switch, and the code falls back to on when the server sends no value.

**Why**

It looks like a way to shorten handback messages between agents.

- Flag `tengu_hushed_kestrel`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Agents
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Tools can opt out of being allowed automatically in auto mode

Auto mode's list of automatically allowed tools can now leave out a tool that marks itself as excluded, so that tool is never allowed automatically

**Unclear.** Which tools, if any, mark themselves as excluded is not known.

**What**

In auto mode, Claude Code runs some tools without stopping to ask you first, based on an allowlist (a list of tools it treats as safe to run automatically). The check against that list used to look a tool up by its name alone. It now looks at the tool itself, and a tool can declare that it is excluded from the list. A tool that does this is never allowed automatically, even in auto mode.

**Why**

A tool can now ask to always go through the normal permission prompt, whatever auto mode would otherwise allow.

- Area: Auto Mode
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### New notice when auto mode is not your organization's default

Claude Code has a new message saying auto mode isn't your organization's default and that Shift+Tab switches to it

**Unclear.** It is not clear where this message appears or what makes Claude Code show it.

**What**

Claude Code has a new message: "Auto mode isn't the default for your organization · Shift+Tab to switch". Auto mode is one of the modes you can cycle through with Shift+Tab.

**Why**

The message is meant for people whose organization does not make auto mode the default, and tells them how to switch to it.

- Flag `tengu_org_policy_denied`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: not a boolean we can read) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Auto Mode
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Memory settings gain fields for session pause and account memory

Memory settings information now has room for a per-session status and account memory, with a message for when memory is paused

**Unclear.** The per-session status may never appear in this build, since nothing supplies it yet.

**What**

The information Claude Code gathers for memory settings can now include a status for the current session and an account memory entry. Before, it covered only memory files, folders, automatic memory and automatic dreaming. A new message reads: "Memory is paused for this session; only the user can turn it back on."

**Why**

This points to memory that can be paused for a single session, and to memory tied to your account.

- Area: Memory
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Conversation shows a summary when memory is saved to your account

Saved-memory notices in the conversation now say when memory is local, and memory saved to your account gets its own summary

**Unclear.** It is not clear what turns on account memory or who can use it.

**What**

When Claude Code saves something to memory, it shows a notice in the conversation. Memory is the notes Claude Code keeps so it can recall them later. These notices now say when the memory was saved locally, on your own machine.

Memory saved to your account now gets its own summary with:

- a header

- a short hint

- the paths of the files that were saved

- lines from the saved content

In the previous build these notices fell back to an older, plainer layout.

**Why**

You can now see where a memory went and what was stored in it, so a save to your account is easier to tell apart from a local one.

- Area: Memory
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Prompt to make auto mode your default now falls back to showing

When the server sends no setting, the one-time offer to make auto mode your default permission mode now falls back to on instead of off

**What**

The one-time question offering to make auto mode your default permission mode is still controlled remotely. What changed is what Claude Code falls back to when the server sends no value: it used to be off and is now on. The other conditions still apply, including that someone who has not finished onboarding (the first-run setup) is not asked. The flag server has so far returned off for this site's account and for an account that is not signed in, and nothing has been read under this release yet.

**Why**

If the server does not send a setting, you may now be asked whether to make auto mode your default.

- Flag `tengu_maple_pier`: Off in both readings (read for one account on one subscription tier against v2.1.285; this account: off, anonymous baseline: off, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Auto Mode
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Memory extraction retries turns it did not finish reviewing

When a pass that saves memories from your conversation stops early, the next pass looks at the same turns again

**Unclear.** It is not clear which setups use the MCP mode of memory extraction.

**What**

Claude Code can review your conversation and save useful points as memories. It uses a bookmark to track which turns (one message from you and Claude's reply) it has already looked at. In the mode that runs through MCP, the Model Context Protocol for connecting outside tools, that bookmark used to move forward after every pass, whatever happened. Now it stays put when:

- a pass stops early, or

- the pass's saved changes are refused because a newer message has arrived.

The next pass then reviews those same turns again. After several unfinished passes in a row, Claude Code gives up and moves the bookmark on. Usage reports now also record how many memories were written, how many were refused, and whether the retry limit was reached.

**Why**

Memories are less likely to be silently skipped when a pass fails.

- Flag `tengu_bramble_lintel`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: not a boolean we can read) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Memory
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Claude is told not to take instructions from GitHub, Slack or other sessions

Messages from GitHub, Slack and other sessions are now treated as information rather than orders, and Claude no longer proceeds without a human

**What**

Claude Code can queue up notifications for Claude, such as scheduled triggers or messages from other places. The text Claude sees with them has changed:

- Scheduled triggers are to be treated as prompts that were saved in advance.

- Messages from GitHub, Slack or other sessions are information, not instructions from you.

- Claude should not take actions that reach outside, based on those messages.

The old line saying not to wait for a human when none is around is gone. Claude is also told to ignore any older version of this text that says to go ahead without a human.

**Why**

This matters most in sessions that run on their own or on a schedule. Someone could hide instructions in a GitHub comment or Slack message to trick Claude, which is called prompt injection. Claude is now told not to act on those.

- Area: Terminal UI
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Unanswered WebFetch permission questions can be withdrawn in remote sessions

In remote sessions, an unanswered WebFetch permission question can now be withdrawn, and one kind of denial now fails without asking

**Unclear.** Exactly what a user sees when an unanswered question is withdrawn is not clear.

**What**

WebFetch is the tool Claude uses to download a web page. Claude Code asks your permission before some fetches.

This release changes how those permission questions behave:

- In remote sessions (Claude Code running away from your computer and reached through a web link), a WebFetch permission question that nobody answers can now be withdrawn.

- When a fetch is refused because of where the web address came from, the call now ends with an error and does not ask you.

**Why**

In a remote session, this affects which permission questions you see and whether one stays open waiting for you.

- Flag `tengu_rosy_flute`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Flag `tengu_velvet_cairn`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Web Fetch
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Account memory text is hidden in conversations, and memory refreshes at turn end

Account memory tool inputs and results can be replaced with a placeholder, and remote sessions now fetch memory at the start and end of a turn

**Unclear.** When the placeholder replacement is applied is not stated.

**What**

Account memory is information Claude keeps about you across conversations. Claude Code now has two new behaviours for it:

- The inputs and results of the account memory tool can be replaced with the placeholder "[account memory text removed from this conversation]".

- In remote sessions (Claude Code running on a server rather than your own computer), memory is fetched early in a turn and again when the turn ends. A turn is one request from you plus Claude's full reply.

A remotely controlled setting decides how many seconds the end-of-turn refresh waits.

**Why**

What Claude remembers about your account may be kept out of the saved conversation. In remote sessions it may also be kept more up to date.

- Flag `tengu_fancy_crab`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: not a boolean we can read) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Memory
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Plugin messages can carry decorations into the input box

Plugins sending a message now pass along decorations when present, and filling the input box takes an extra piece of information

**Unclear.** What decorations look like on screen, and whether any normal release path uses them, are not known.

**What**

Plugins are add-ons that extend Claude Code. When a plugin sends a message, Claude Code used to pass along only its text, mode and origin. It now also passes `decorations` when the plugin supplies them.

Writing text into the input box (where you type before sending) now also passes one more piece of information than before.

**Why**

Plugins gain a new capability in how they fill the input box.

- Area: Plugins
- Tier: You'll notice
- Useful: 2/5
- Signal: 3/5

### Cloud session seeding refuses a symbolic git HEAD; sandbox and device checks tightened

Cloud sessions reject a git HEAD on a symbolic ref and suggest git switch, alongside sandbox config and untrusted-device enrollment tweaks

**Unclear.** It is not clear what condition decides when the administrator-managed merging applies.

**What**

When you start a cloud session, Claude Code copies ('seeds') your git repository into it. Seeding now refuses a repository whose current position (HEAD) is checked out under a symbolic ref, meaning a second name that points at another branch. The error is `symbolic_head`, and it comes with a hint to use `git switch` to move to the branch by its own name. Seeding also now checks the working files before it rebuilds its cached copy of the repository.

Other changes in the same area:

- Sandbox settings now keep track of symlink permissions granted later and of blocked folders. The sandbox is a walled-off area that limits what commands can touch. A symlink is a shortcut that points to another file or folder.

- In managed mode, `ignoreViolations` and the options that allow a weaker nested sandbox or weaker network isolation are now combined through a shared merge step.

- When a request is refused with a 403 error because the device is not trusted, Claude Code now checks whether cloud sessions or Remote Control should enroll the device before trying to recover. Before, it always tried to recover.

**Why**

If a cloud session will not start and mentions a symbolic ref, switch to your branch by name with `git switch` and try again. The other changes tighten how the sandbox and device trust are handled.

- Area: Sandbox
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Turning on this machine's settings for cloud sessions can now be blocked with a reason

The 'Use this machine's settings in cloud sessions' toggle now checks first and can say why it cannot turn on; in this build it reports unsupported

**Unclear.** Which situations can block the change is not known.

**What**

Claude Code can run sessions in the cloud and forward your local settings to them, controlled by the `remoteHomeSettings` toggle, shown as 'Use this machine's settings in cloud sessions'. Before, changing this toggle always went ahead.

- The toggle and the home-settings prompt now run a check before making the change.

- If the check fails, the change is stopped with a reason, starting "Could not turn this on". There are two reasons: 'unsupported' and 'flag_off'. For example: "Could not turn this on: forwarding settings to cloud sessions is not available in this version".

- In this build, the check always reports 'unsupported'.

**Why**

If you try to forward your settings to cloud sessions and it does not work, you now see a message saying why, instead of the toggle appearing to succeed.

- Area: Managed Settings
- Names: `remoteHomeSettings`
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### WebFetch reports rate-limited domain checks and applies read_file rules to artifacts

WebFetch now says when its domain safety check is rate-limited, sorts fetch failures by cause, and checks read_file rules for artifact links

**Unclear.** It is not clear whether these categories are shown to you or only used in usage reporting.

**What**

WebFetch is the tool Claude uses to read a web page. Before fetching, it checks whether the domain is safe.

- When that check is refused for too many requests (HTTP 429), the error code is now `ERATELIMIT_PREFLIGHT` and the message says the domain "is temporarily rate-limited (too many domain checks from this network)". Before, it was the generic "Unable to verify if domain" message.

- Fetch failures are now sorted into kinds. Proxy problems: transport, bad response, rate limited, unavailable, rejected. Problems with the target: `invalid_input`, `url_not_allowed` and others.

- Fetching an artifact link now also checks permission rules for the `read_file` action, using the artifact's file path. Before, only the read action was checked.

**Why**

If you hit the rate limit, the message now says the domain check was rate-limited instead of looking like a network fault. Rules that deny or ask before reading files now also apply when Claude fetches an artifact link.

- Area: Web Fetch
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Built-in plugins renamed, with old and new names treated as the same plugin

Built-in plugins gain cc-plugin-* names, and enabledPlugins lookups and writes now treat old and new spellings as one plugin

**Unclear.** Which names count as aliases of which marketplace is not spelled out.

**What**

Plugins add features to Claude Code, and the `enabledPlugins` setting turns them on or off. Some built-in plugins now have new names starting with `cc-plugin-`, such as `cc-plugin-responsive-mode`. The bundled security plugin is now `cc-plugin-sec-default@builtin`.

To keep existing settings working:

- Looking up, enabling or disabling a plugin now matches every spelling of a built-in plugin's name. Before, only an exact name match counted.

- Checks for duplicate plugin names also treat the old and new spellings as the same plugin.

- Writing `enabledPlugins` replaces older spellings of a plugin id instead of adding a second entry.

- The documentation says to keep listing the security plugin as `sec-default@builtin` for older releases.

**Why**

The rename should not leave you with the same plugin listed twice, or with a plugin switched off because your settings still use its old name. Administrators who order hooks in managed settings should know that the bundled security plugin now goes by `cc-plugin-sec-default@builtin`.

- Area: Plugins
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### claude_authenticate joins a login already in progress and respects allowedProviders; --desktop refuses subcommands

SDK login requests now reuse a sign-in already under way and are blocked by the allowedProviders managed setting; --desktop can't be combined with subcommands

**Unclear.** What `--desktop` does and whether it appears in the help output are not stated.

**What**

`claude_authenticate` is the request that programs driving Claude Code through the SDK (the toolkit for controlling Claude Code from other software) use to sign a user in. It changes in two ways, and a new command-line option appears:

- A repeat `claude_authenticate` request now joins the OAuth sign-in (the browser-based login) that is already in progress and reuses its URLs. Before, each request cleaned up the old sign-in and started a new one.

- If the `allowedProviders` managed setting (a setting controlled by your organization's administrator) does not permit the Anthropic API, login is refused with "Login blocked: this machine's managed settings do not permit signing in to the Anthropic API here (allowedProviders)". Before, there was no provider check.

- A new `--desktop` option appears. It is refused when combined with a subcommand, with the message "--desktop can't be combined with".

**Why**

Tools that send a second login request while one is pending no longer restart the sign-in and invalidate the first link. Administrators who limit which API providers a machine may use now have that limit applied to SDK logins too.

- Area: Desktop App
- Names: `--desktop`
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Built-in release notes now run up to 2.1.283

The release notes bundled inside Claude Code were refreshed and now cover 2.1.283 and earlier

**Unclear.** Whether notes for the version this build ships as are included is not clear.

**What**

The release notes bundled inside Claude Code were updated and now cover version 2.1.283 and earlier. Among the listed changes: interactive sessions on third-party providers, or with telemetry off, now start in auto mode when no permission mode is configured.

**Why**

The notes you can read from inside Claude Code now include these recent changes.

- Area: Release Notes
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Bedrock connection no longer picks up default credentials on its own

The Bedrock client now passes its options correctly, stops looking up default credentials by itself and identifies itself as AnthropicBedrock/JS

**Unclear.** Whether this client is the one Claude Code uses for your own Bedrock connection is not clear.

**What**

Bedrock is Amazon's service for running Claude models. The client that talks to it has changed in three ways:

- It no longer looks up default credentials automatically.

- It now passes an empty API key and an optional sign-in token, and passes the rest of its options correctly; before, the wrong set of options was passed along.

- It now identifies itself to the service as `AnthropicBedrock/JS`.

**Why**

This could change how Claude Code signs in to Bedrock, so it is worth watching if you use Bedrock.

- Area: Bedrock
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Web fetch and design sync stay off until your organization's policy loads

When the organization policy has not loaded, the status message now says web fetch and design sync stay off until it does

**Unclear.** What causes those policy details to be held back is not known.

**What**

Claude Code loads your organization's policy, the rules an administrator sets, and shows its status. Before, if loading failed, the status said no restrictions were applied this session.

The status messages now add web fetch and design sync to the list of features that stay off. When certain policy details are held back, the message says no restrictions apply this session, except that web fetch and design sync stay off until the policy loads.

**Why**

Web fetch no longer runs freely while the policy is missing. It waits for the policy to load, and the status message tells you why it is unavailable.

- Area: Managed Settings
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Organization Skills policy can withhold some skills, and plugin installs check for conflicts

Some skills withheld by an organization's Skills policy now fail as unknown, and plugin install checks installed plugins for conflicts first

**Unclear.** It is not clear where the Skills policy comes from or what counts as a conflict during plugin install.

**What**

Skills are packaged instructions Claude can use. A forked skill that your organization's Skills policy withholds now fails with an "Unknown skill" error. Separately, `plugin install` now checks your installed plugins for conflicts and stops before installing if it finds one.

**Why**

These are effects of policy set by an administrator, so a skill or plugin install failing may come from your organization's settings.

- Area: Skills
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Built-in plugins have new names starting with cc-plugin-

The plugins that ship with Claude Code were renamed with a cc-plugin- prefix, such as agents-md becoming cc-plugin-agents-md

**Unclear.** It is not clear whether existing settings that use the old names are updated automatically.

**What**

Claude Code comes with some plugins built in. A plugin is an add-on that adds commands, skills or tools. These built-in plugins now have new names:

- `sec-default` is now `cc-plugin-sec-default`

- `agents-md` is now `cc-plugin-agents-md`

- `telemetry` is now `cc-plugin-telemetry`

- `plugin-authoring` is now `cc-plugin-plugin-authoring`

**Why**

The names of these plugins in your settings, including in `enabledPlugins`, may be different now. If you turn one of them on or off by name, check that you are using the new name.

- Area: Plugins
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Login screen shows only the sign-in methods your organization allows

The login screen now follows the allowedProviders managed setting, hiding sign-in options your organization does not permit

**What**

Managed settings are settings that an organization's administrator sets for everyone. The login screen now follows the `allowedProviders` managed setting and whether your organization allows signing in directly with Anthropic:

- The Claude account and Console options are hidden when direct sign-in with Anthropic is not allowed.

- The 3rd-party platform option lists only the providers your organization permits. Before, it always read "Amazon Bedrock, Microsoft Foundry, or Vertex AI".

- If no sign-in method is left to offer, the screen shows an error asking you to contact your administrator.

**Why**

Administrators can now limit which sign-in methods people see, so nobody picks an option the organization has blocked.

- Area: Auth
- Names: `allowedProviders`
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Memory folders without an index can get one written automatically

Claude Code can now write an index file into a memory folder that has topic notes but no index, linking each note with its title and description

**Unclear.** It is not known what triggers this or whether a setting controls it.

**What**

A memory folder holds notes Claude Code keeps between conversations. If a folder has topic notes (`.md` files) but no index file, Claude Code can now write one. The index lists a link to each note with its title and a shortened description.

- Files with unsafe names are skipped.

- If the folder cannot be written to, Claude Code gives up and logs a message.

**Why**

This creates a new file on disk in existing memory folders, so you may notice an index appear that you did not write.

- Area: Memory
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Turn limits are now passed to cloud sessions

A --max-turns limit on a cloud headless run is now sent to the cloud session, and Claude Code records whether the limit was confirmed

**Unclear.** Whether the cloud service actually enforces the turn limit is not known.

**What**

A headless run works without the interactive screen. When Claude Code creates one in the cloud, it now passes along the turn limit set with `--max-turns`. Before, the limit was not forwarded. Claude Code also records whether the cloud service confirmed the limit, and keeps that confirmation with the session.

Claude Code now also reacts when the service reports that the session already exists.

**Why**

A turn limit you set on a cloud headless run can now reach the cloud service, which can then honour it and confirm it back.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Bedrock, Mantle and Vertex connections share headers and can send your API key

Bedrock, Mantle and Vertex clients now share one set of headers and add an `X-Api-Key` header from `ANTHROPIC_API_KEY` unless one is set

**Unclear.** Whether `CLAUDE_CODE_SKIP_AWS_CRED_CACHE` still has any effect, and how the new credential lookup caches credentials, is not clear.

**What**

Claude Code can talk to Claude through third-party providers such as Amazon Bedrock, Mantle and Google Vertex. How it connects to them changed:

- The Bedrock, Mantle and Vertex connections now add a shared set of headers (extra labels sent with each request).

- If `ANTHROPIC_API_KEY` is set, its value is sent as an `X-Api-Key` header, unless a header of that name is already present. This is useful when a gateway sits between Claude Code and the provider.

- The checks that test whether Bedrock and Mantle are reachable now report what went wrong, not only yes or no.

- The special handling for `CLAUDE_CODE_SKIP_AWS_CRED_CACHE`, which used to skip the cached AWS credentials, has been replaced by one shared way of looking up AWS credentials.

**Why**

If you use a third-party provider, how Claude Code authenticates may behave differently. This matters most if you have `ANTHROPIC_API_KEY` set or rely on `CLAUDE_CODE_SKIP_AWS_CRED_CACHE`.

- Area: Third-Party Providers
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Tools offered through `mcp serve` can apply permissions and refuse calls

When Claude Code runs as an MCP server, tool calls can now carry permission settings and be refused with a message

**Unclear.** What supplies these permission settings with each call is not clear.

**What**

`mcp serve` runs Claude Code as an MCP server. MCP (Model Context Protocol) is a standard way for one program to offer tools to another, so this lets other programs use Claude Code's tools.

When a tool call arrives, Claude Code now uses permission settings passed in with the call, if there are any. It can refuse the call and send back a message saying why. Before, every call used default settings.

**Why**

Permission rules can now apply to tools that other programs call through `mcp serve`, not only to tools used directly inside Claude Code.

- Area: MCP
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### MCP servers can keep individual tools deferred even when `alwaysLoad` is set

With `alwaysLoad` on, a tool an MCP server marks with `anthropic/alwaysLoad` set to false now still waits behind tool search

**Unclear.** Only the option's description is known to say this; it is not confirmed that tool loading follows it.

**What**

MCP servers are outside programs that give Claude Code extra tools. Normally Claude Code can hold back some of those tools until they are needed, finding them through tool search rather than listing them all to Claude up front. The `alwaysLoad` option on a server tells Claude Code to always include every tool from that server instead.

The description of `alwaysLoad` now names one exception. If the server itself lists a tool with `_meta` `anthropic/alwaysLoad` set to false, that tool stays held back behind tool search even when you set `alwaysLoad` on the server.

**Why**

A server author can now keep particular tools out of the prompt, for example large or rarely used ones, even when a user asks for the server's tools to always load.

- Area: MCP
- Names: `alwaysLoad`
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Claude may now take local command output into account

Claude is no longer told to ignore output from commands you run in Claude Code, and now treats it as context for later messages

**What**

When you run a local command inside Claude Code (for example a slash command), Claude Code adds a note before its output. That note used to tell Claude not to respond to the output or consider it unless you asked.

It now says the command was run directly in Claude Code rather than sent to Claude as a request, that its output goes straight to you, and that it is recorded as context for later messages.

**Why**

Without the blanket instruction to ignore it, Claude may now use what a local command printed when you carry on the conversation.

- Area: Slash Commands
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Background check for model access on Bedrock, Vertex and Mantle

When a model is denied on Bedrock, Vertex or Mantle, Claude Code now checks lower model tiers in the background and remembers which ones work

**Unclear.** It is not clear what starts the background check or whether a setting controls it.

**What**

If you use Claude through Amazon Bedrock, Google Vertex or Mantle, and a model request is denied or refused, Claude Code now checks in the background whether lower model tiers are available to you. It remembers the results of these checks.

There is also a new start-up check. It builds a tiny test request, one token long, that includes Claude Code's billing details. A token is a small piece of text. If Claude Code cannot build this request, it logs a warning.

**Why**

This looks like groundwork for falling back to a model you can use when your first choice is refused on one of these cloud providers.

- Area: Models
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Tool restrictions and turn limits now carry over to spawned sessions

Spawned sessions now keep your `disallowedTools` and `tools` restrictions and your `maxTurns` limit

**What**

Claude Code can start other sessions of itself, such as background sessions that run while you do something else. More of your settings now pass to these sessions:

- `disallowedTools` and `tools`, which control which tools Claude may use, are now saved with the permission settings.

- `maxTurns`, which limits how many turns a session may take, is now passed on.

- The sandbox status now includes `allow_all_unix_sockets`. The sandbox is the protective boundary around commands Claude runs.

**Why**

A background or spawned session now follows the same tool limits and turn limit you set for the session that started it.

- Area: Sessions
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Cloud sessions gain messages for limiting tools with --tools

Cloud sessions now have messages for limiting a session to the tools you list with `--tools`, covering empty lists, unsupported cases and org limits

**Unclear.** It is not clear whether limiting cloud sessions with --tools can be used yet.

**What**

Claude Code now has messages for limiting a cloud session to the tools you list with `--tools`. A cloud session is a Claude Code session that runs on Anthropic's servers. The messages cover these cases:

- An empty `--tools` list is refused

- `--tools` together with a prompt is refused for sessions attached to this computer

- Your organization does not offer this limit

- A duplicate session was merged into another

- The tool list could not be confirmed, in which case the session is archived

A separate new message warns when a `--disallowed-tools` rule has an opening parenthesis that is never closed, because a cloud session would drop that rule.

**Why**

This points to cloud sessions gaining the ability to be restricted to certain built-in tools, rather than refusing `--tools` outright. Check `--disallowed-tools` rules for unbalanced parentheses, since a broken rule would be dropped instead of applied.

- Area: Cloud Sessions
- Names: `--tools`
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Turn limits are no longer listed as unsupported in cloud sessions

Cloud sessions no longer flag a turn limit as unenforced, and the flag table for cloud sessions gains a desktop entry

**Unclear.** It is not clear whether the cloud side actually enforces the turn limit, or what the new desktop entry does.

**What**

When you start a cloud session (a Claude Code session that runs on a remote machine instead of your own), Claude Code checks your command-line options against a table of options that cloud sessions do not support. The entry for the maximum number of turns, which used to say "no turn limit is enforced in a cloud session yet", has been removed from that table. The turn limit you set is now passed into the cloud session's settings. The same table also gains an entry for desktop.

**Why**

A turn limit set with `--max-turns` may now carry over to a cloud session instead of being reported as unsupported.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Admins can restrict which API providers Claude Code may use

Claude Code can refuse to start with `provider_not_allowed` when managed settings limit providers with `allowedProviders`

**Unclear.** Only the description of this refusal reason was seen, not the code that enforces it.

**What**

The list of reasons Claude Code can give for refusing to start now includes `provider_not_allowed`. It applies when managed settings (settings an administrator sets for a machine) list the API providers allowed in `allowedProviders`, and the session uses a provider not on that list. An API provider is the service Claude Code sends its requests to.

**Why**

Administrators get control over which API providers Claude Code may use on a machine.

- Area: Managed Settings
- Names: `allowedProviders`
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Windows asks for approval when it can't check a hook for a cloud session

On Windows, Claude Code has two new reasons to ask before running a cloud session command that one of your hooks cannot vet

**Unclear.** It is not clear whether these new approval prompts are behind a flag.

**What**

A hook is a command you set up to run automatically at certain points, for example to check a command before it runs. A cloud session is a Claude Code session that runs on a remote machine and syncs your project. When a cloud session wants to run a command and Claude Code on a Windows computer cannot confirm that one of your local hooks lies outside the synced project, it now asks for your approval. There are two new explanations for why:

- On Windows, Claude cannot yet confirm that the program behind the hook lies outside the synced project.

- Claude cannot confirm that the folder the hook would start in lies outside the synced project.

Before this, the only explanations were that the hook's script was inside the project, that it could not be read, or that it was a model hook.

**Why**

The cloud session can rewrite files in the synced project, so a hook stored there cannot be trusted to check its own commands. On Windows, commands that a local hook would normally have vetted now stop and ask you instead of running unchecked.

- Area: Hooks
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Workshop pages now explain why a <select> dropdown is rejected

Publishing a workshop page with a element now fails with a specific explanation and a suggested alternative

**What**

When you publish a workshop page, Claude Code checks its markup first. A `<select>` element (a dropdown menu) now fails that check with its own message: browsers and the checker read what is inside a dropdown differently, so markup inside it would not be inspected. The message suggests building the control from a list or buttons instead. Before, a `<select>` got only the general "is not allowed on a workshop page" message.

The checks on how many files a publish contains and where they sit were also merged into shared code, so the same checks now run whether or not the publish specifies a type.

**Why**

If a page uses a dropdown, the error now tells you why and what to use instead, rather than a bare refusal.

- Area: Elsewhere
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Memory starts loading earlier and is rechecked after a turn

Claude Code now starts loading memory before file downloads begin and checks it again after a turn when a recheck is due

**Unclear.** It is not clear whether a switch controls whether this runs.

**What**

Memory here means the saved notes Claude Code loads into a session. Claude Code now starts loading them earlier, as soon as files begin downloading, instead of waiting. After a turn (one exchange between you and Claude), it checks memory again when a recheck is due.

**Why**

Starting early should cut the wait for memory in headless sessions (runs without the interactive screen) and remote sessions.

- Area: Memory
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Untrusted-device refusals now say whether a token or a signature was the problem

When the server refuses a device as untrusted, Claude Code now tells a refused token apart from a missing signature

**Unclear.** The wording a user sees for each of these cases is not known.

**What**

When the server refuses a request because the device is not trusted, Claude Code now tells apart the kinds of refusal instead of treating them as one:

- The device's login token was refused.

- The server wants the request to be signed.

When extra sign-in checks are in force, it can also report that the device cannot be enrolled. Before, every such refusal was handled as a single untrusted-device error.

**Why**

This affects the errors you can see in Remote Control and when signing in to cloud features, where a clearer reason makes the problem easier to fix.

- Area: Auth
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Switching models now refreshes startup data

Changing the model now refreshes the data Claude Code loaded at startup, as part of reworked model-switch handling

**Unclear.** It is not clear what the remotely controlled setting changes for someone switching models.

**What**

The steps that run when you switch models have been reorganised. When the model changes, Claude Code now refreshes the data it loaded at startup. Behind a remotely controlled setting, it also saves a copy of client data that has already been shown. That setting falls back to on when the server sends nothing.

**Why**

Switching models may behave slightly differently than before.

- Flag `tengu_moonlit_lobster`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Models
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Clear error when managed policy settings cannot be read

Claude Code has a new error saying it could not read managed policy settings, which may restrict allowed API providers

**Unclear.** It is not clear what triggers this error or how it relates to a related remotely controlled setting.

**What**

Managed policy settings are settings an administrator sets for every Claude Code user in an organization. Claude Code now has an error for when it cannot read them. The error says this may restrict which API providers the machine may use, which is controlled by the `allowedProviders` setting, and tells you to contact your administrator.

**Why**

A failure to read your organization's policy is now reported to you, which helps explain why an API provider might be blocked.

- Flag `tengu_org_policy_denied`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: not a boolean we can read) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Managed Settings
- Names: `allowedProviders`
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Fewer shell permission refusals for NAME=value arguments after some commands

Some allowed shell commands followed by a NAME=value argument no longer fail the permission check as an unsafe variable setting

**Unclear.** Which commands this covers and which names the pattern accepts are not known.

**What**

Before Claude Code runs a shell command, it checks whether the command is safe to run without asking you. One thing it looks for is text of the form `NAME=value`, which can set an environment variable. Environment variables are named settings that programs read. Before, any `NAME=value` whose name was not on a known-safe list made the check fail.

Now a `NAME=value` that comes after the command word of certain allowed commands is no longer treated as an unsafe variable setting, as long as the name fits a set pattern. This sits behind a remote switch, and the code falls back to on when the server sends no value.

**Why**

Commands such as `cmd KEY=val` should lead to fewer permission prompts or fallbacks.

- Flag `tengu_quiet_larkspur`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Permissions
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Remote session viewer picks up background tasks and tracks whose turn it was

When you view a remote session, Claude Code now takes over its background tasks and only re-arms the idle alert for your own turns

**Unclear.** How the list of background tasks is filled in is not known.

**What**

When you view a remote session, which is Claude Code running on another machine, two things change:

- Claude Code now picks up the session's background tasks, jobs that keep running while you do other things, so they appear in your view.

- Claude Code now counts turns for each connected client. When a result arrives for a turn that was not started from your client, it no longer re-arms the notification that tells you the session has gone idle.

**Why**

This affects attaching to and resuming remote sessions. You should see existing background tasks, and fewer idle alerts caused by other clients.

- Area: Sessions
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Some organization policies now hide the usage breakdown

Under some organization policies, such as HIPAA-type ones, Claude Code shows a notice in place of the usage breakdown

**Unclear.** The screen or command that shows this breakdown is not identified.

**What**

When your organization has a policy of a HIPAA-type kind, Claude Code no longer shows the usage breakdown. HIPAA is a US health-data privacy law. In place of the breakdown you see this message: "Not shown under your organization's policy: this breakdown is built by scanning the session transcripts saved on this machine." A session transcript is the saved record of a conversation. The previous build reported a failed status here.

**Why**

If you work at a regulated organization and the breakdown is missing, this message explains why. The breakdown depends on reading saved conversations, and your organization's policy does not allow that.

- Area: Usage
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Rewinding a conversation stops MCP tasks started after that point

Rewinding through the `rewind_conversation` request now stops background MCP tasks started at or after the rewind point

**Unclear.** It is not clear whether MCP background tasks are available to everyone or only when switched on remotely.

**What**

`rewind_conversation` is a request that programs driving Claude Code can send to take a conversation back to an earlier message. It now also stops background tasks that came from MCP servers (outside tools connected to Claude Code) if they were started at or after the point you rewind to. If stopping one fails, the rewind still goes ahead.

**Why**

Rewinding no longer leaves those tasks running on their own for a part of the conversation that no longer exists.

- Area: SDK
- Names: `rewind_conversation`
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Thread summaries can now suggest a reply for more work in the same files

Summaries now offer a quick reply when saying yes means more work in the thread's own files, but not for posting, pushing or deploying

**Unclear.** It is not clear which feature shows these summaries or whether it is switched on for everyone.

**What**

Claude Code can write a summary of a thread that includes a suggested reply you can send with one click. The rules for when that reply is offered were widened.

Before, no reply was suggested whenever saying yes would run, merge, deploy, delete, send, pay for or change anything outside the repository. Now a reply is suggested when a yes means more work in the thread's own files. It still stays empty when:

- a yes would post, push, merge or deploy something

- you first have to click, connect or log in to something yourself

**Why**

You will see a ready-made reply more often when the next step is simply further work on the same files. Actions that reach outside the thread still need you to write the reply yourself.

- Area: Elsewhere
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Warnings when project settings change during a cloud session

Claude Code can now warn that project settings changed while a cloud session was attached, or between attaches, possibly by that session

**Unclear.** It is not clear exactly when these warnings are shown.

**What**

Claude Code has two new warning messages for cloud sessions, meaning sessions that run on a remote machine and that you attach to:

- project settings changed while a cloud session was attached

- project settings changed between one attach and the next

Both warn that the cloud session itself may have made the change.

**Why**

These warnings let you notice when a remote session may have edited your project settings, so you can check the change before relying on it.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Memory context starts loading earlier in each session

Claude Code now starts loading memory context early in a session, checks it again after each turn, and times each stage of a turn

**Unclear.** It is not clear whether the setting that groups task notifications changed in this release or only appears differently in the code.

**What**

Claude Code now starts loading its memory context, the saved notes it brings into a conversation, early in the session, and checks it again after each turn. The loop that runs each turn also now records which stage it is in, such as waiting for the session to start, opening a turn, running tools and sitting idle.

The grouping of task notifications is controlled by a remote setting that falls back to on when the server sends nothing.

**Why**

Memory context should be ready sooner, and the time each stage of a turn takes can now be measured.

- Flag `tengu_swirling_meteor`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Memory
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Subagents are told their final report ends their run

Subagents are now told the call that delivers their final report ends their run, and that plain text at the end is not delivered

**What**

A subagent is a helper Claude Code starts to work on part of a task, which hands back a final report when done. The instructions for the tool it uses to deliver that report now say: `The call ends your run, so do everything else first`. They also say that plain text written at the end of the run is not delivered. Before, the instructions only said to make this the last tool call and then stop.

**Why**

Subagents are told more plainly to finish their work before reporting and to put their answer in the report, so results are less likely to go missing.

- Area: Subagents
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### The plugin-authoring skill now goes by cc-plugin-plugin-authoring

The skill that ships with Claude Code for writing plugins was renamed from plugin-authoring to cc-plugin-plugin-authoring

**Unclear.** It is not clear whether every user can use this skill or only some users.

**What**

Claude Code comes with a built-in skill for writing plugins. A skill is a packaged set of instructions Claude can load when it is useful. That skill has been renamed from `plugin-authoring` to `cc-plugin-plugin-authoring`. The skill is the same; only its name is different.

**Why**

If you call this skill by name, or mention it by name in your own instructions or scripts, update the name to `cc-plugin-plugin-authoring`.

- Area: Skills
- Names: `cc-plugin-plugin-authoring`
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### GitHub app check skipped when you use Bedrock, Vertex or other providers

Claude Code no longer checks for the GitHub app when it is connected through a provider other than Anthropic's own service

**Unclear.** It is not confirmed that the setting controlling this skip stays on unless the server turns it off.

**What**

Claude Code can check whether the GitHub app is installed. It now skips that check when you are not using Anthropic's own service, for example when you reach Claude through Amazon Bedrock or Google Vertex AI. In that case the check reports the app as not installed and reports access to your linked account as "inconclusive". A remote setting controls this skip.

**Why**

If you use Bedrock, Vertex or another outside provider, Claude Code no longer looks up the GitHub app using a login meant for Anthropic's own service.

- Flag `tengu_synchronous_bunny`: Off in both readings (read for one account on one subscription tier against v2.1.285; this account: off, anonymous baseline: off, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: GitHub App
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Messages can now name the custom API address you are using

When Claude Code is pointed at a custom API address, messages can now name its host or say "a custom endpoint"

**Unclear.** It is not clear which message shows the endpoint name.

**What**

If you point Claude Code at a different API server than the default, some messages now name that server's host, or say "a custom endpoint" when the host cannot be worked out. Some internal usage data about model consent and runs that did nothing was also added.

**Why**

Messages shown while using a custom API address can say which address is involved.

- Area: API Errors
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### New environment variables passed through to host apps and child processes

`CLAUDE_CODE_HOST_PROMPT_SUPERSEDES_RECORD`, `CLAUDE_CODE_MCP_SERVE_SETTINGS` and `CLAUDE_CODE_DISABLE_WEB_FETCH` are now passed along

**Unclear.** What these variables do beyond being passed along is not settled.

**What**

Environment variables are settings given to a program through its shell. Claude Code passes some of them on to programs it starts or that host it. These were added to those lists:

- `CLAUDE_CODE_HOST_PROMPT_SUPERSEDES_RECORD`, passed to host apps and child processes. In print mode (`-p`), it also sets an internal setting, which is reset when no system prompt has been set

- `CLAUDE_CODE_MCP_SERVE_SETTINGS`, passed to child processes

- `CLAUDE_CODE_DISABLE_WEB_FETCH`, added to a list of variables passed through

**Why**

These are switches for apps and tools that build on Claude Code, and they now reach the processes Claude Code starts.

- Area: Environment Variables
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Permission rules can now block or pause listing a type

A deny rule now stops a type from being listed, and an ask rule pauses the listing and asks for the exact type name

**Unclear.** Which tool or command performs this type listing is not identified.

**What**

Permission rules are the allow, ask and deny entries in your settings that control what Claude Code may do without asking you. They now apply when Claude Code lists a type:

- Deny rule: listing a type a deny rule covers fails with the error `list_type_rule_denied`. This holds whether the rule names the type by its link or covers it however the request spells the type's name.

- Ask rule: the listing stops, the result is marked unavailable, and the message says to list it again with `type` set to exactly the type the rule names.

**Why**

Permission rules can now restrict type listing, which they did not do before.

- Area: Permissions
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Claude Code recognizes errors saying its version is too old

Claude Code can now recognize errors saying its version is below the minimum a model or your organization's policy requires

**Unclear.** What Claude Code does after recognizing such an error is not stated.

**What**

Claude Code now recognizes error messages saying the installed version is too old for a model or for the organization's policy, such as one ending "is older than the minimum version required by your organization's policy".

**Why**

In practice, these version errors can now be told apart from other failures.

- Area: API Errors
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### MCP server list labels WebSocket servers with (WS)

The MCP server summary now shows (WS) after the address of WebSocket servers, as it already did for SSE and HTTP

**Unclear.** Whether WebSocket MCP servers can actually connect, or sit behind a switch, is not stated.

**What**

MCP (Model Context Protocol) servers connect Claude Code to outside tools. The summary line for each server now handles servers of type "ws" (WebSocket, a connection that stays open in both directions) and prints `(WS)` after the address, alongside the existing SSE and HTTP labels.

**Why**

WebSocket MCP servers are now recognized in server listings.

- Area: MCP
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Feedback is only saved locally when save_locally is true

A submit_feedback request without a draft now saves locally only when save_locally is true, and otherwise is submitted normally

**What**

For a `submit_feedback` request with no `draft_id`, Claude Code now saves the report on your machine only when `save_locally` is true. When it is not, the report goes through the normal submission path.

Before, every such request went through the local-save step, with the `save_locally` value passed along to it.

**Why**

Apps that send feedback without asking for a local save now get an ordinary submission, and the local copy happens only when it was asked for.

- Area: SDK
- Names: `save_locally`
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Claude is told when a file it sent you is shown as a converted copy

After sending you a file, Claude is now told if the chat shows a converted copy and to refer to files by name, not as above or below

**Unclear.** It is not clear whether this report is used everywhere or only when some condition is met.

**What**

When Claude delivers a file to you, it gets a short report back. That report used to be a plain list of what was delivered. It now also:

- says when the chat is showing a converted copy of an image or file, and that the file at its original path is unchanged

- tells Claude to refer to a file by its name, never as above or below

File paths in the report are also cleaned up before Claude sees them.

**Why**

This changes what Claude reads after sending a file. It should keep Claude from assuming the original was altered when you only see a converted copy, and from pointing at files by where they sit on screen.

- Area: Attachments
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Claude Code remembers which models your AWS or Google Cloud account can use

Model access checks for AWS and Google Cloud accounts are now saved and reused at start-up, unless CLAUDE_CODE_SKIP_MODEL_ACCESS_MEMORY is set

**Unclear.** It is not clear how long saved results are kept or exactly which providers are covered.

**What**

When you use Claude through AWS or Google Cloud credentials, Claude Code checks at start-up which models your account can use. It now saves each result, allowed or refused, per account in a `cache/model-access.json` file and can reuse it on later starts.

To tell accounts apart, Claude Code builds a fingerprint of your AWS config and credentials files or your gcloud identity files. If one of those files is over 4 MB or is not a regular file, saved results are not reused.

To turn this memory off, set `CLAUDE_CODE_SKIP_MODEL_ACCESS_MEMORY`. Related log lines start with `[3p-model-memory]`.

**Why**

Start-up can skip some model checks, so it may be quicker. A saved answer can go out of date, though: if your model access changes and Claude Code still behaves as before, set `CLAUDE_CODE_SKIP_MODEL_ACCESS_MEMORY`.

- Area: Models
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Sandbox can report its configured network and file permissions

The sandbox can now report its configured network allowances, file permissions and Unix socket setting, and cleans up more after a command

**Unclear.** Whether the check that blocks running outside the sandbox is actually used yet is not clear.

**What**

The sandbox is the restricted area Claude Code can run commands in, limiting which files and network addresses they can reach. It can now report:

- which network allowances are configured

- which file system permissions are configured

- whether all Unix sockets (a way for programs on one machine to talk to each other) are allowed

- whether a trusted setting has closed off the option of running a command outside the sandbox

The cleanup that runs after each command now also runs an extra cleanup step.

**Why**

This suggests stricter handling of sandbox rules, where some configurations can stop commands from falling back to running unsandboxed.

- Area: Sandbox
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Pasted audio is no longer filtered out when sending a prompt

When you send a prompt, pasted audio is no longer handled separately, and only pasted images are filtered

**Unclear.** Whether the audio change is a deliberate removal, a bug, or a tidy-up is not clear.

**What**

When you send a prompt, Claude Code sorts through what you pasted. It used to treat pasted images and pasted audio specially. Now only images are treated specially, so pasted audio is no longer filtered out. The message saying file sync was set up from another directory is now built in a different way.

**Why**

This may mean support for pasted audio was removed.

- Area: Input
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Directory sync needs git 2.32 or newer and warns about more setups

Directory sync now runs git with a cleaned environment, needs git 2.32 or newer, and gives new reasons when it cannot read git

**Unclear.** How many setups actually run git through this cleaned, version-checked path is not clear.

**What**

Directory sync now runs git with a cleaned environment, meaning it strips the environment variables git would otherwise pick up. It also needs git 2.32 or newer, because that version can be told to ignore your personal git configuration. If git is older, or its version cannot be read, sync reports that it "is older than 2.32, or its version could not be read".

There are new reasons sync gives when it cannot use git normally:

- `volume_in_reach`, about a volume within the area sync covers

- `old_git`, when git is older than 2.32

- a case where your home directory is itself a git checkout

The usage report sent to Anthropic when git is not found on the starting path also records more details.

**Why**

In cloud sessions, sync could skip reading git without saying so when git was too old. If you rely on it, check that your git is 2.32 or newer.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Auto mode always lets Claude Code's own tool calls skip the safety check

In auto mode, tool calls that Claude Code generates itself now always skip the classifier, with no remote switch to turn this off

**What**

In auto mode, a classifier (a model that judges whether an action is safe) usually checks each tool call Claude makes. Tool calls that Claude Code generates itself already skipped that check. That shortcut used to sit behind a remote switch that was on by default. The switch has been removed, so the shortcut now always applies.

**Why**

The shortcut can no longer be turned off from the server. Tool calls that Claude Code generates itself will skip the classifier in auto mode in every case where the shortcut applies.

- Flag `tengu_structured_creek`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: not a boolean we can read) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Auto Mode
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### The gateway refuses requests when provider policy disallows it

The gateway now checks provider policy at most once a minute and refuses requests, and startup, when that policy disallows it

**Unclear.** Where the provider policy comes from and who sets it is not clear.

**What**

Claude Code's gateway now checks a provider policy, at most once every 60 seconds. When the policy disallows it, the gateway answers requests with a 503 error (the standard "service unavailable" response) and records `provider_policy` as the reason in its audit log. It also refuses to start in that case.

**Why**

A managed gateway can now be shut off by policy. If you see 503 errors with that reason, the cause is policy, not a fault in the gateway.

- Area: Gateway
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Auto mode does not start in sessions marked as covered by HIPAA

Claude Code now declines to start in auto mode, without a message, when the account or session is marked as covered by HIPAA

**Unclear.** What causes an account or session to be marked as covered by HIPAA is not clear.

**What**

Auto mode is a mode where Claude carries out actions without asking you to approve each one. When a session is asked to start in auto mode, Claude Code now first checks whether the account or session is marked as covered by HIPAA, the US health privacy law. If it is, auto mode is not started. Before, only the usual check for whether auto mode was available was made.

**Why**

If your account or session carries this HIPAA marker, auto mode will not start and no error explains it. Expect to approve actions yourself in that case.

- Area: Auto Mode
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Some tools no longer lock a session into one isolation mode

Tools that Claude Code now treats as web tools no longer lock the session into a single isolation mode, and that check now depends on the session

**Unclear.** It is not clear which tools fall into the category that is now treated as web tools.

**What**

When certain tools run, Claude Code can lock the session into one isolation mode for the rest of the conversation. A tool is an action Claude Code takes, such as running a command. Isolation is how separated that work is kept from the rest of your system.

Before this build, a tool's category was used directly to decide whether to set that lock. The check now also depends on the current session. Tools that fall into one particular category are treated as web tools, and they no longer set the lock.

**Why**

Running some tools may no longer tie the rest of the session to a single isolation mode.

- Area: Elsewhere
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Project settings files are ignored for more keys

Claude Code now ignores more keys in a project's settings file, with the same warning to set them in your own or managed settings

**Unclear.** It is not clear which keys are now ignored or under what condition.

**What**

Some settings cannot be set in a project's own settings file, the one shared with everyone who works on that project. Claude Code now drops keys from project settings under an additional condition, so more of them can be ignored there. The warning is the same: the key "is ignored - project-scoped settings can't set this key. Set it in ~/.claude/settings.json or managed settings instead."

**Why**

If you see this warning for a key that used to work in a project settings file, move it to `~/.claude/settings.json` or to managed settings.

- Area: Settings
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Memory tidy-up instructions always include the indexing step

The instructions for tidying saved memories no longer have a version that skips indexing, so the last phase is always "Prune and index"

**What**

Claude Code can save memories, which are notes it keeps between conversations, and it periodically consolidates them. Consolidating means tidying them up and merging related notes. The instructions it follows for this used to have two versions. One of them, chosen when a setting was on, ended with a phase called "Prune" and left out indexing. That version is gone. The final phase is now always "Phase 4 - Prune and index", and the guidance on how to label each type of memory is always included.

**Why**

Everyone now gets the same consolidation instructions, and the step that indexes saved memories always runs as part of the tidy-up.

- Area: Memory
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Claude is told to write and publish a page in the same reply

Instructions now tell Claude to write and publish a page in one message, and a proposed skill's card is described as sitting where it appears in the reply

**Unclear.** A check controls whether this applies and it is not clear what that check is or who it covers.

**What**

Two sets of instructions that Claude Code gives the model have changed:

- Page publishing: the guidance used to say to write the page to a file and then publish it. It now says to write it and publish it in the same message.

- Skill proposals: when a proposed skill passes its check, the result Claude receives now tells it that the card appears at that point in its reply, so it can refer to "the card above". A skill is a reusable set of instructions Claude can follow.

**Why**

The wording pushes Claude to finish a published page within one reply instead of spreading the work across several.

- Area: Artifacts
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Turn limits are checked for cloud sessions and ignored when attaching

A turn limit for a cloud session must be a whole number from 1 to 2147483647, and attaching to an existing session keeps that session's own limit

**Unclear.** It is not clear which command or interface these checks belong to.

**What**

A session is one continuous conversation with Claude Code. A turn limit is the most rounds of work it may do before it stops. Claude Code now checks the turn limit you give in two cases:

- Cloud sessions: the limit must be a whole number from 1 to 2147483647.

- Attaching to a session that already exists: the session keeps the turn limit it was created with, if it had one, and any limit you pass when attaching is not enforced. Claude Code tells you this.

**Why**

It makes clear that a turn limit such as `--max-turns` does nothing when you attach to a session that is already running, so you are not left thinking a new limit applies.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Remote control stops retrying device trust when the server says no

When the server refuses an untrusted device, Claude Code now re-registers the device only if the refusal allows it

**What**

A trusted device is a computer your account has approved for remote control of Claude Code sessions. When the server refuses a request because the device is not trusted, Claude Code now reads the reason the server gives. It tries to register the device as trusted again only when that reason allows it. Otherwise it logs the refusal and stops. Restoring an archived session now has a separate outcome for this case.

**Why**

Remote-control sessions no longer keep retrying device registration that cannot succeed.

- Area: Remote Control
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Policy blocks more kinds of plugin marketplace source

The check on allowed plugin marketplace sources now blocks more git sources and derived sources under a policy condition

**Unclear.** Which sources are now blocked and what policy condition triggers it is not clear.

**What**

A plugin marketplace is a source Claude Code installs plugins from. Under a certain policy condition, the check on which marketplace sources are allowed now blocks more git sources, and also blocks sources derived from others. Before, it blocked only one kind of git address.

**Why**

This may be a tightening of what an organization's policy allows.

- Area: Plugins
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### The auto-dream setting is locked in more situations

The auto-dream option can no longer be switched when auto-memory is held off for this session or the session was started by a tool call or background runner

**Unclear.** Where the locked auto-dream option is shown is not stated.

**What**

The auto-dream option can be switched on or off only when auto-memory is available. Before, it was locked only while auto-memory was off. It is now also locked in these cases:

- Auto-memory off: switched off for every session.

- Held off: auto-memory is held off for this session only.

- Started automatically: the session was started by a tool call or by a background runner rather than by you.

**Why**

You may find the auto-dream option cannot be changed in a session where it could be changed before.

- Area: Memory
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Claude Code can refuse to run without the sandbox in more cases

Refusing to run when the sandbox is unavailable can now be triggered by another condition as well as `sandbox.failIfUnavailable`

**Unclear.** What the added condition checks is not settled.

**What**

The sandbox limits which files and network addresses commands run by Claude can reach. Claude Code decides whether to refuse to start when the sandbox cannot run. Before, only the `sandbox.failIfUnavailable` setting decided this, and it was off unless you set it. Now a second condition can also make Claude Code refuse.

**Why**

Claude Code may now refuse to run without the sandbox in some setups, even if you have not set `sandbox.failIfUnavailable`.

- Area: Sandbox
- Names: `sandbox.failIfUnavailable`
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### HIPAA policy blocks repository visibility checks

Under the HIPAA policy profile, a new capability called Repository visibility checks is denied

**Unclear.** It is not clear what Claude Code uses the repository visibility check for.

**What**

Organizations can apply policy profiles that control what Claude Code is allowed to do. A new capability, `allow_repo_visibility_probe`, is labelled "Repository visibility checks" and tied to requirement HIPAA-R36. The `hipaa` profile denies it.

If Claude Code has no stored policy answer ready when the capability is checked, it holds the capability back rather than allowing it.

**Why**

Organizations on the HIPAA profile will not have Claude Code check whether a repository is visible.

- Area: Managed Settings
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Moving a session to the background now refuses unsafe cases and waits for the current turn

Requests to background a session now refuse unsafe cases up front and wait until Claude finishes its current reply

**Unclear.** It is not clear which parts of Claude Code ask to move a session other than the left arrow key.

**What**

A session is one running conversation with Claude Code. You can move a session to the background with the left arrow key and reopen it later. Before this release, the safety checks for that move only ran when you pressed the key. Other ways of asking for the same move skipped them.

Those checks are now shared, so every request to move a session is refused in these cases:

- Saving of the session is turned off.

- The session was started with `--project-config-root`.

- Commands are still queued, waiting to run.

- You have typed text in the input box that you have not sent.

A session started with `--project-config-root` now shows a warning that it can't be moved to the background.

If Claude is still in the middle of a turn (one round of Claude reading your message and replying), a request to move the session no longer runs straight away. Claude Code holds it until the turn finishes.

**Why**

Every route for moving a session to the background now gets the same protections, so you are less likely to lose unsent text or queued work. Because the move waits for the current reply to finish, it no longer collides with work Claude is still doing.

- Flag `tengu_bg_leftarrow_inprocess`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Sessions
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Default fallback models now depend on a server setting and on differing from the main model

Whether Claude Code uses a default fallback model now also depends on a server setting and on the fallback differing from the main model

**Unclear.** The exact effect on which fallback model a reader ends up using is unclear.

**What**

A fallback model is a second model Claude Code can switch to when the main one can't be used. Whether a default fallback applies now depends on two further things:

- `selfTargetDefaultFallbacksEnabled`, a setting that Anthropic's servers provide

- whether the fallback model is different from the main model

**Why**

This changes when a fallback is offered for a model whose fallback is the same model.

- Area: Models
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Auto mode's rule against unrequested actions in connected apps was revised

Auto mode's safety rule now blocks posting, sending, spending, approving or merging in connected apps when you only asked to read, review or draft

**Unclear.** It is not clear which version of the auto mode instructions uses the revised rule.

**What**

Auto mode lets Claude act without asking you each time. A separate checker, called the classifier, decides whether each action is allowed. Its rule "Unrequested Commit in a Connected App" has been revised.

The rule is about web apps and accounts you have connected. It blocks Claude from committing to an action there, such as posting, sending, spending, approving or merging, when you only asked it to read, review or draft.

**Why**

Auto mode is stricter about acting in your connected apps when you only asked to look at or prepare something.

- Area: Auto Mode
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### File uploads can now be blocked by organization policy, with a general message

Uploads and downloads through the Files API now run an extra organization policy check and show a general policy message

**Unclear.** It is unclear what the extra check tests.

**What**

The Files API is how Claude Code uploads and downloads files through Anthropic's service. Before an upload, download or upload from a file path, Claude Code now runs an extra check. It passes along the server address it is using.

The refusal used to say the Files API is unavailable for HIPAA-regulated organizations. It now says: "File upload is disabled by your organization's policy."

**Why**

If your organization has turned off file uploads, you now see a plain policy message whatever the reason, and uploads may be refused in cases that used to go through.

- Area: Managed Settings
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Resuming a session that is still running elsewhere now carries your prompt

If another process is still running a session you resume, Claude Code now passes your prompt to the screen that handles it, and `--resume` can take a title

**Unclear.** It is not clear how the handoff appears on screen or what happens to the prompt afterwards.

**What**

A session is one conversation with Claude Code. If you resume a session that another Claude Code process is still running, Claude Code shows a screen saying the session is in use. That screen used to receive only the session, the process holding it, and whether you could fork it (start a copy). It now also receives a handoff that includes the prompt you gave, so the prompt is not lost.

In interactive use, `--resume` can now also be given a title.

**Why**

This changes what happens when you try to resume a session that is already running somewhere else.

- Area: Sessions
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Auto mode's safety check reaches the server in more cases

Auto mode's server-side safety check dropped one of the conditions it needed before running

**Unclear.** It is not clear what the removed condition checked, so the cases now covered are unknown.

**What**

In auto mode, Claude Code carries out actions without asking you each time, and a classifier (an automatic safety check) decides whether each action is allowed. Part of that check runs on Anthropic's servers. One of the conditions that had to be true before Claude Code sent that request has been removed, so the server check now runs in more cases.

If the classifier is unavailable, Claude Code still refuses the action and suggests trying again.

**Why**

The server-side check now applies in situations where it was skipped before.

- Area: Auto Mode
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Remote sandbox file tools refuse read-only folders and absolute glob patterns

In remote sandboxes, write and edit refuse read-only folders, read can view part of a large file, and glob rejects absolute patterns

**Unclear.** Which environment runs these file tools is not stated.

**What**

Claude Code's file tools, as used in a remote sandbox (an isolated environment where commands run), behave more strictly:

- write and edit: refuse any path inside a read-only folder, saying it "is inside read-only directory".

- read: accepts `view_range` for files over the size limit, instead of only telling you to use Bash to read a slice.

- glob: always rejects absolute patterns and asks for a relative one, even where they were allowed before, and caps how many files it scans.

**Why**

These tools are harder to use against folders or paths they should not touch.

- Area: Sandbox
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### `compactBeforeNextTurn` can't be used alongside a compaction edit

An error now stops compactBeforeNextTurn from being used while context_management has a compaction edit

**Unclear.** This check may come from the bundled Anthropic SDK rather than from Claude Code itself.

**What**

Compaction shrinks earlier conversation to free room. Using `compactBeforeNextTurn` while `context_management` contains a compaction edit now raises an error saying it can't be used while `context_management` has a compaction edit.

**Why**

If you build on the SDK, you get a clear error instead of two compaction settings clashing.

- Area: Compaction
- Names: `compactBeforeNextTurn`, `context_management`
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Account memory switch now also shows in demo mode

The account memory switch is no longer hidden when `IS_DEMO` is set, and account memory options were regrouped

**Unclear.** What decides whether account memory is available in the first place is not clear.

**What**

Account memory lets Claude keep notes tied to your account. The account memory options Claude Code offers changed:

- The options are now account memory and moving local memory to your account.

- The switch for account memory is now added whenever account memory is available, without checking the `IS_DEMO` environment variable first.

**Why**

The account memory switch now appears in demo mode too, where it used to be hidden.

- Area: Memory
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### New quit notice for unsent remote session messages, and offline sync dialog removed

Quitting a remote session with unsent messages now says they were still waiting to be sent, and the offline folder sync dialog is gone

**Unclear.** It is unclear whether offline folder sync is now handled somewhere else.

**What**

In a remote session (a session running on another machine), quitting while messages are unsent now shows a notice saying they were "still waiting to be sent when you quit". Before, it said the cloud session had not yet received this machine's files or settings. The dialog shown when folder syncing was offline has been removed, and a step that starts the remote worker was added.

**Why**

You will no longer see the offline folder sync dialog in remote sessions, and the quit notice now describes unsent messages directly.

- Area: Sessions
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Replies to a background session can queue a prompt for its next turn

A reply sent to a background session can now carry a prompt that is queued for its next turn, unless it is a slash command

**Unclear.** It is not established what sends replies that use this option.

**What**

A background session is a Claude Code session that keeps running without a terminal open on it. The part that handles replies sent to such a session can now take a prompt and queue it for the session's next turn. Prompts that are slash commands (commands starting with `/`) are skipped.

**Why**

This is a new internal route for getting a prompt into a background session.

- Area: Sessions
- Tier: You'll notice
- Useful: 2/5
- Signal: 2/5

### Allowing a network request for good can now save to your user settings

The sandbox network prompt's "don't ask again" choice can now be saved to user settings, applying in any project

**Unclear.** It is not clear what decides whether the choice is saved to user settings or to the project's local settings.

**What**

The sandbox is a set of limits on what commands run by Claude can do, including which websites they can reach. When a command asks to reach a new website, the prompt offers "Yes, and don't ask again". That choice used to be saved to your local settings for the current project every time.

Claude Code now chooses where to save it. When it saves to your user settings, the option reads "in any project (user settings)". Programs that drive Claude Code through its SDK, and receive permission suggestions instead of a prompt, get the same save location, or a suggestion that lasts only for the current session when there is none.

**Why**

A website you allow may now be remembered for all your projects rather than just the one you are in, so check the wording of the option before choosing it.

- Area: Sandbox
- Tier: You'll notice
- Useful: 3/5
- Signal: 1/5

### Strict sandbox network allowlist now ignores domains allowed by a project

Under `sandbox.network.strictAllowlist` or an admin mandate, websites allowed in project or local settings are no longer added

**Unclear.** It is not clear what switches on the administrator sandbox requirement.

**What**

The sandbox limits which websites commands run by Claude can reach. When `sandbox.network.strictAllowlist` is on, or an administrator requires the sandbox, Claude Code now ignores websites allowed in project settings and local settings. Before, those were added to the list. This covers:

- `sandbox.network.allowedDomains`

- `WebFetch(domain:)` permission rules

A debug log notes how many entries were ignored.

**Why**

A repository you clone can no longer widen which websites the sandbox allows through its own settings files. Websites you need must be allowed in user or managed settings instead.

- Area: Sandbox
- Names: `sandbox.network.strictAllowlist`
- Tier: You'll notice
- Useful: 3/5
- Signal: 1/5

### Very large API_TIMEOUT_MS values are now capped

A value you set for `API_TIMEOUT_MS` is now held to a maximum instead of being used however large it is

**Unclear.** The maximum value is not stated.

**What**

`API_TIMEOUT_MS` is an environment variable that sets how long, in milliseconds, Claude Code waits for a request to the model. A value you set is now reduced to a fixed maximum when it is larger. Before, any value was used as given.

**Why**

Very large timeouts are no longer used as written. If you set a huge value, Claude Code will wait at most the maximum.

- Area: API
- Names: `API_TIMEOUT_MS`
- Tier: You'll notice
- Useful: 3/5
- Signal: 1/5

### Secret redaction catches more passwords written inside URLs

Secret scrubbing now catches more forms of usernames and passwords written into URLs, including quoted and encoded ones

**What**

Claude Code scrubs secrets from text such as logs before they are stored or shown. A URL can carry a username and password before an `@` sign, like `https://user:pass@host`. This part is called userinfo.

- The `url-userinfo` pattern now handles quoted userinfo and delimiter characters. Before, it was a simple match on everything between `://` and `@`.

- New patterns are added: `url-userinfo-tail`, `url-userinfo-later-at`, `url-userinfo-encoded` and `masked-value-rest`.

- Patterns for sensitive assignments, such as `password=...`, now accept other kinds of whitespace.

**Why**

Credentials written into URLs are removed in more of the forms they appear in, so fewer slip through into logs or output.

- Area: Redaction
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Plugin install refuses when another installed plugin shares its folder

Installing a plugin now fails with plugin-folder-held when another installed plugin would share its folder or data directory

**Unclear.** It is not clear exactly what counts as holding the folder.

**What**

Plugins add commands and other features to Claude Code. Installing one now checks whether another installed plugin would use the same folder or the same saved-data folder. Plugin names are compared without regard to capital letters, and '@' and '.' are treated as '-'.

- On a clash, the install fails with the reason `plugin-folder-held` (`PluginFolderHeldError`) and the message "plugin not installed: another installed plugin has one of its folders". The message says which plugin to uninstall first, or to ask an administrator when the install is managed.

- The failure reports `sharedWith: "installed"`, the list of plugins holding the folder, and whether the main folder was kept.

- A dependency that was forced into the install and hits this clash is skipped, and the plugin that pinned it stays demoted.

- Recommended-plugin installs show an install-refused warning instead of a generic failure.

**Why**

Two plugins whose names differ only by capitals or punctuation could overwrite each other's files or saved data. They are now refused with a clear reason, so you may see this new install failure.

- Area: Plugins
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Plugins with a bundled MCP server that needs setup now say so and point to Configure

When a plugin's bundled MCP server can't start until it is configured, Claude Code now reports it and points to /plugin → Installed → Configure

**Unclear.** Where and when this message is shown is not known.

**What**

An MCP server is a helper program that gives Claude extra tools. Some plugins bundle one as an `.mcpb` package, and it may need settings, such as a key, before it can run. Claude Code now treats this as its own state, `mcpb-needs-config`, instead of failing quietly:

- Skip message: "Bundled MCP server was not started: it needs configuration."

- New hint: a bundled MCP server needs configuration before it can start, with directions to the plugin's Installed tab in `/plugin` and its Configure option.

- Plugin error list: a new `mcpb-needs-config` error says to open the plugin in the Installed tab and choose Configure. It is listed once per server name, and it now comes with an action to fix it. Before, these errors had no action.

- Warning record: a plugin whose bundled server needs setup now records a warning that names the skipped server. Before, only a debug log line existed, and it pointed to `/plugin → Manage plugins`. The path given is now `/plugin → Installed → plugin → Configure`.

- Install and enable messages: a `needs-config` result now shows "Plugin is now active." followed by an extra note. Before, it fell through to "Run /reload-plugins to activate."

- Plugin refresh: now returns a `needs_config` status when this warning applies to a plugin.

In the same area, the rules that allow or block MCP servers by policy gained extra checks. They now also look at servers given by URL and at servers that come from plugins.

**Why**

Before, a plugin could install fine while its bundled server simply never started, with no visible reason. Now you are told which server was skipped and where to fill in its settings, and the install message no longer suggests reloading when setup is what is missing.

- Area: Plugins
- Names: `/plugin`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Sandbox settings descriptions explain which settings file wins

Sandbox setting descriptions now explain how managed, --settings, user and project settings combine, including allowUnsandboxedCommands

**Unclear.** It is not clear whether this is only descriptive text or whether this release also enforces these rules.

**What**

The sandbox is the protection that limits which files and network addresses Claude Code's commands can reach. The built-in descriptions of its settings were expanded:

- `sandbox.enabled` now reads "Run Bash commands inside the sandbox. Default: false."

- `ignoreViolations` and `enableWeakerNestedSandbox` gain descriptions, including a Linux-only option to run without the fresh /proc mount.

- `allowUnsandboxedCommands`: a `false` set in managed settings, a `--settings` file or user settings holds, and in some cases a project-level value is ignored.

- `overrides_locked` is now described as true also when `allowUnsandboxedCommands: false` comes from a `--settings` file or user settings, not only from an admin policy.

- Project settings cannot re-open paths that another layer denies for reading, and a project-level `network.strictAllowlist` value is ignored in some cases.

**Why**

These are descriptions, not new behaviour. They make it clearer that a project's own settings file cannot loosen sandbox limits set by your administrator, a `--settings` file or your own user settings.

- Area: Sandbox
- Names: `--settings`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Project sandbox.network settings ignored under admin control, including proxy ports

Under an admin sandbox mandate, sandbox.network entries from project and local settings are ignored, and only managed settings may replace the proxy

**What**

The sandbox limits which hosts and ports commands run by Claude can reach, using the `sandbox.network` settings. Before, project settings, which can be committed to a repository, could supply these network allowances. Now:

- When an admin sandbox mandate (managed settings require the sandbox) or a trusted network deny list applies, `sandbox.network` allowances from project and local settings are ignored. A log line says "[sandbox] admin sandbox mandate: ignoring sandbox.network."

- Under `allowManagedDomainsOnly`, only managed settings can replace the filtering proxy (the program that checks where sandboxed traffic goes) through `httpProxyPort` and `socksProxyPort`. A project that tries is logged with "a project may not replace the filtering proxy".

- `httpProxyPort` and `socksProxyPort` now have descriptions in the settings schema.

**Why**

A repository's settings can no longer send sandboxed traffic through a proxy of its own or widen network access when an administrator controls the sandbox.

- Area: Sandbox
- Names: `sandbox.network`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Artifact publishing retries more reliably and reports when it merged over a newer version

Artifact publish retries honour retry-after with jitter and retry relay outages, and the result now warns when it merged over a newer version

**Unclear.** What a merged version means for the artifact a reader sees is not settled.

**What**

Artifacts are files Claude Code publishes so they can be viewed or shared. This release changes how publishing works:

- Retries now wait according to the server's `retry-after` hint plus a small random delay, and a relay-unavailable response also triggers a retry. Before, the delay only came from `retry-after`, with a cap.

- Claude Code now keeps track of its own version and any merged version of a publish.

- A publish response can include `merged_over`, which describes the base version, the live version, and the files that were changed or left out.

- When a publish was merged over a newer version, the result shown to Claude now says so, lists the changed and removed files, and tells it to re-read them before editing.

- File reads now include a `title`, and the relay request can ask for compression with a `compress` option.

**Why**

Publishing should fail less often during brief server outages. The merged-over note stops Claude from overwriting files that changed elsewhere, because it is told to read the newer content first.

- Area: Artifacts
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Repository sandbox file grants are dropped or withheld in more cases

Sandbox read and write grants from a repo's project or local settings are now ignored under an admin mandate or when they point into denied paths

**Unclear.** Exactly when an administrator's sandbox requirement counts as active is not stated.

**What**

The sandbox limits which files commands run by Claude can read and write. Project and local settings files, which can be committed to a repository, can add grants to that list. Before, their `allowWrite` and `allowRead` entries were always merged in. Now they are checked first:

- Under an admin sandbox mandate (managed settings require the sandbox), `sandbox.filesystem.allowWrite`, Edit allow-rule paths and `allowRead` paths from project and local settings are dropped. A one-time log line says "[sandbox] filesystem grants restricted to trusted settings tiers: ignoring".

- The same grants are also dropped when the path is under or inside a path you denied reading.

- With `blockReadsOutsideWorkingDirectories` on, repo-committed `allowRead` and `allowWrite` grants are withheld if they are globs (wildcard patterns), UNC paths (Windows network-share paths), automount paths, or lead through symlinks (shortcuts to other locations) into denied read paths. The log line starts "[sandbox] withheld".

**Why**

A repository's settings can no longer quietly widen what sandboxed commands may touch. If you relied on project or local settings to grant sandbox access, check the log for these lines when a command is refused.

- Area: Sandbox
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Plugin and marketplace git clones now respect your git SSH settings

Git clones for plugins and marketplaces now read `core.sshCommand` and `ssh.variant` from your git config, not only SSH environment variables

**What**

When Claude Code uses git to download (clone) a plugin or a marketplace over SSH, it now looks at more of your SSH setup:

- Git config: it reads `core.sshCommand` and `ssh.variant` from your git configuration. Before, it inspected only the `GIT_SSH_COMMAND`, `GIT_SSH` and `GIT_SSH_VARIANT` environment variables.

- `GIT_SSH_COMMAND` is now built for the clone from these settings.

- `GIT_SSH_VARIANT` is set from your environment or, if that is not set, from `ssh.variant` in git config.

- OpenSSH check: it tests whether the configured SSH command is OpenSSH. The lookup runs inside a private temporary folder.

If no temporary folder can be created, the clone stops with an error that says: "Set CLAUDE_CODE_TMPDIR to a usable directory to fix this." `CLAUDE_CODE_TMPDIR` is a setting that tells Claude Code where to put its temporary files.

**Why**

If you connect to git servers through a custom SSH command set in git config, such as `core.sshCommand`, plugin and marketplace clones should now use it too. If a clone fails with the temporary folder message, point `CLAUDE_CODE_TMPDIR` at a folder Claude Code can write to.

- Area: Plugins
- Names: `core.sshCommand`, `ssh.variant`, `GIT_SSH_COMMAND`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Plugin options and secrets now carry across dependencies and renamed plugins

A plugin's saved options and secrets are now combined from its whole dependency chain and from its older names after a rename

**Unclear.** It is not clear which plugins count as part of the dependency chain.

**What**

Some plugins ask for settings when you install them, including secrets such as keys, which are kept in `pluginSecrets`. This release changes which plugins those saved values are gathered from:

- Dependency chain: a plugin that depends on other plugins now combines secrets from every plugin in that chain, plus its own. Before, it combined only one parent's secrets with its own.

- Renamed plugins: when a plugin's options and secrets are saved, values stored under the plugin's older, replaced ids are merged into its current id, and the old entries are removed. The plugin's `mcpServers` settings are merged the same way. Before, values were written only under the single current id.

If saving these sensitive options fails, Claude Code reports "Failed to save sensitive plugin options for" the plugin.

**Why**

A plugin that depends on others can now see secrets set on more of the plugins it builds on. A plugin that has been renamed should keep the configuration you already gave it instead of asking again or losing it.

- Area: Plugins
- Names: `pluginSecrets`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Bash tool instructions reworded on timeouts and background commands

Claude's Bash tool instructions now tie the 10-minute limit to foreground commands and describe background commands as running across turns

**What**

The Bash tool is how Claude runs commands in your terminal. The instructions Claude receives for it were rewritten in this release. The change appears in the main command-line and SDK prompts, and in the command-security-review and command-team-onboarding prompts.

- The timeout line now says the limit of 600000ms (10 minutes) is for a foreground command, one Claude waits on. The default is still 120000ms (2 minutes).

- The `run_in_background` option is now explained as running the command detached: "it keeps running across turns and re-invokes you when it exits". One version adds "No `&` needed."

- The earlier wording is kept in one form: use it only if you don't need the result immediately and are OK being notified when the command completes later.

In the capture taken under this release, the longest Bash description is 10,061 characters.

**Why**

These are Claude's own instructions, so the wording shapes how it uses background commands. Claude is now told plainly that a background command keeps running after its turn ends and that it will be brought back when the command finishes, and that it should not add `&` itself.

- Area: Bash Tool
- Names: `run_in_background`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### The "Saved memories" notice can now include an extra describing word

The line reporting how many memories were saved can now put a describing word before "memory" or "memories"

**Unclear.** What the extra word says and when it appears are not clear.

**What**

The line that reports how many memories were saved, such as "Saved 2 memories", can now include an extra describing word before "memory" or "memories", for example to say they are local.

**Why**

This is a label change to the saved-memories notice.

- Area: Memory
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### New wording says a value came from your organization, not an admin setting

Claude Code has a new message saying a value was set by your organization's configuration rather than an admin setting

**Unclear.** Where this message is shown is not known.

**What**

Claude Code has a new message: "set by your organization's configuration, not an admin setting". It explains that a value came from your organization's configuration rather than from a setting an administrator chose.

**Why**

It gives you clearer wording about where a setting you cannot change came from.

- Area: Managed Settings
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### Small changes to sandbox status, the gateway and `claude daemon`

Sandbox status accounts for another fallback case, the gateway rejects some keys, and `claude daemon` gains a --[no-]chrome option

**Unclear.** It is not clear which keys the gateway rejects.

**What**

- Sandbox status now takes into account one more case where commands can fall back to running outside the sandbox. The sandbox is a restricted environment that shell commands run inside.

- The gateway now rejects certain keys with a message saying they are "not supported through the gateway".

- `claude daemon` help lists a `--[no-]chrome` option to turn Claude in Chrome on or off for sessions it starts.

**Why**

These are minor behaviour changes.

- Area: Sandbox
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### PowerShell commands with a time limit skip one input check

A PowerShell input check is now skipped when the command carries a wall-clock time limit

**Unclear.** It is not clear what this check rejects when it does apply.

**What**

Claude Code checks PowerShell commands before running them. One of those checks, which concerns running commands in the background, is now skipped when the command has a wall-clock time limit set (`shellWallCapMs`).

**Why**

A PowerShell command that carries a time limit is no longer rejected by this check.

- Area: Elsewhere
- Names: `shellWallCapMs`
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### Clearer reasons when a remote session refuses an untrusted device

Failed remote session connections for untrusted devices now carry a specific reason, with unknown ones reported as remote_connect_unknown_sub_reason

**Unclear.** It is not clear whether these reasons are shown to the user or only recorded for diagnostics.

**What**

When Claude Code fails to open the live connection to a remote session, it now reads a reason and extra detail sent with the failure, instead of only checking for a plain "untrusted device" message. If the untrusted-device reason is one Claude Code does not recognise, it is reported as `remote_connect_unknown_sub_reason`.

**Why**

This gives more specific diagnostics when a remote connection is refused because the device is not trusted.

- Area: Sessions
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### The Claude in Chrome setting is now marked as needing consent

The 'Claude in Chrome enabled by default' setting is now flagged as needing consent, and a new message says some features are limited by policy

**Unclear.** It is not clear what the consent flag changes in the settings panel or whether it is tied to the organization policy message.

**What**

In the settings panel, the row labelled 'Claude in Chrome enabled by default' is now flagged as needing consent. Several other rows carry the same flag, and the panel checks it in several places. This flag is controlled by a server-side switch, and when the server sends nothing, the row is flagged.

The build also includes a new message: 'Per your organization's policy, some features are limited'.

**Why**

The settings panel now treats this setting differently from before. You may see the Chrome setting behave differently there, or see the policy message.

- Flag `tengu_joyful_parasol`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Chrome & Browser
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### Mockup checker refuses HTML elements placed inside SVG

Claude Code's mockup checker now rejects an HTML element placed inside an SVG image, where browsers read the markup differently

**What**

Claude Code checks mockup files before using them. That checker now refuses an HTML element placed inside SVG (a format for drawings made of code). The message says the element is not an SVG element, and that browsers and the checker read what follows it differently.

**Why**

When a browser and the checker read the same markup in different ways, content could slip past the checker. Refusing this pattern closes that gap.

- Area: Elsewhere
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### Design-skill reminder before HTML artifact publishing has a new skip case

The reminder to load the design skill before publishing an HTML artifact now has one more skip case and checks for one tool instead of two

**Unclear.** What the new skip condition tests, and which single tool the check now looks for, is not clear.

**What**

Claude Code has a check that asks Claude to load its design skill before publishing an HTML artifact. Two things about that check changed:

- It now has one more condition under which it is skipped.

- It used to look for either of two tools before applying, and now looks for only one.

The check stays off unless it is switched on remotely.

**Why**

The reminder should now appear in fewer situations when it is active. Whether it is active for any account is decided by the server.

- Flag `tengu_cobalt_plinth_sorb`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: off) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Artifacts
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### Plugin uninstall has an extra condition and an off status is added

Uninstalling from a plugin's manage view now needs an extra condition, and plugins that are neither on nor enabled now show as off

**Unclear.** It is not clear what the extra uninstall condition is or what the account listing means for users.

**What**

Plugins add extra commands and features to Claude Code. Three things changed in how they are handled:

- The uninstall option on a plugin's manage screen now appears only when an extra condition is met.

- Each time plugins are synced, the record of which plugins are listed for your account resets to pending.

- Plugins that are neither on nor enabled now have an "off" status.

**Why**

This looks like groundwork for listing plugins at the account level. It is not yet clear what it changes for you.

- Area: Plugins
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### Some skills can no longer be called and report an unknown command

The Skill tool now refuses some skills with "Unknown command", and disallowed tools in skill settings are read in one place

**Unclear.** Which skills the new check refuses is not clear.

**What**

A skill is a packaged set of instructions Claude Code can load. The Skill tool now answers "Unknown command" for a further group of skills, as it already did for synced skills.

The list of tools a skill or plugin command is not allowed to use is now read through one shared step, rather than by reading the two setting names directly.

**Why**

Some skills may now be hidden from use.

- Area: Skills
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### Remote project sync is treated as off when no sync engine is available

With no sync engine, a remote machine set to two_way or upload_only project sync is treated as off, and the separate-copy hint is always shown

**Unclear.** How Claude Code decides that no sync engine is available is not stated.

**What**

A remote machine can be set to sync your project files with `two_way` or `upload_only`. Claude Code now treats both settings as `off` when no sync engine is available. The sync engine is the part that does the copying.

The hint saying the remote machine works on a separate copy of your files is now always shown. Before, `two_way` and `upload_only` showed a different hint about leaving out files git ignores.

**Why**

When reading files on a remote machine, you may now see the separate-copy hint where you used to see the git-ignore hint.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### Trusted-device refusals that need a signature get their own message

When a device is refused as untrusted because a signature is wanted, Claude Code now shows a separate message

**Unclear.** The wording of the new signature_wanted message is not known.

**What**

When a device is refused because it is not a trusted device, Claude Code used to show one fixed message telling you to run `/login` to enroll. The message now depends on the kind of refusal, and a refusal of kind `signature_wanted` gets its own message.

**Why**

If a trusted-device check for remote control refuses you, you may now see a different error depending on the reason.

- Area: Auth
- Names: `/login`
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### Notice that memory stays paused in tool-started or background sessions

Claude Code has a new notice that memory stays paused and cannot be resumed from a session started by a tool or running in the background

**Unclear.** It is not clear where these messages are shown or what switches them on.

**What**

Claude Code has two new messages about memory, the notes it keeps about a project between conversations:

- A notice that memory stays paused and cannot be resumed from a session started by a tool or running in the background. A session is one conversation with Claude Code.

- A hint to look for the project's memory files under `/projects/<project uuid>/`.

**Why**

These messages point to memory behaving differently depending on how a session was started. If memory is paused, a background or tool-started session is not the place to turn it back on.

- Area: Memory
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### Clearer error when a request can only be signed by the session's own computer

A new error says the session refused a request only its bound computer can sign, and that signing in again won't fix it

**Unclear.** It is not clear in which situations this message is shown.

**What**

Claude Code has a new error message. It says the session refused a request that only the computer the session is bound to can sign, so signing in again won't fix it.

**Why**

If you see this message, logging out and back in will not help. The request has to come from the computer the session belongs to.

- Area: Auth
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### Scheduled trigger messages are now described as a routine's stored prompt

Claude is now told a scheduled trigger is the stored prompt of a routine or task on the account, not a check-in someone scheduled

**Unclear.** It is not clear exactly where this label is shown to Claude.

**What**

A scheduled trigger is a message that starts Claude working at a set time. The label Claude sees for these messages has changed. It now reads "scheduled trigger (the stored prompt of a routine or task on this account)". Before, it read "scheduled trigger (a check-in you or your owner scheduled)".

**Why**

This label tells Claude where the message came from, and that can affect how far Claude trusts it. The new wording says the message is a saved prompt belonging to the account, not a check-in from a person.

- Area: Background Tasks
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### Approving an MCP request after the fact can now fail with an error

After you approve an MCP tool request after the fact, a new check can stop it from being sent again and raise an error

**Unclear.** It is not clear when this check refuses to send the request again.

**What**

MCP is the way Claude Code connects to outside tools. When you approve such a request after it has already been held back, Claude Code used to carry on straight away. It now runs another check first, and that check can stop the request from being sent again. When that happens, the error code is `ccr_proxy_needs_approval_resend_refused`.

**Why**

This is a rare error. If you see this code, the tool request was not sent again even though you approved it.

- Area: MCP
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### Tool-use summaries now recognise reads of account memory

When Claude reads account memory files, the short summary of its tool use now collects those paths separately

**Unclear.** It is not clear whether anything controls this or how it changes what the summary line shows.

**What**

Claude Code sometimes collapses a run of tool calls (actions Claude takes, such as reading a file) into a short summary line. That summary now has a separate case for reads of account memory, and it collects the paths of those reads on their own list.

**Why**

This points to a memory kept at the level of your account rather than a single project. It does not yet show what you will see on screen.

- Area: Memory
- Tier: You'll notice
- Useful: 1/5
- Signal: 2/5

### Git commands can run detached from the terminal, and are not started while Claude Code exits

The helper Claude Code uses to run git gained an option to run detached from the terminal, and refuses to start while Claude Code is exiting

**Unclear.** It is not clear which features use the option to run without a terminal.

**What**

Claude Code uses an internal helper to run git and other commands. It can now start those commands without a controlling terminal, meaning the command is not attached to the terminal window you are typing in. The helper also refuses to start a command while Claude Code is shutting down. In that case it reports that the process was not started because Claude Code was exiting, and suggests trying again after it restarts.

**Why**

This is an internal reliability change. If you see the message about Claude Code exiting, run the action again once Claude Code is back up.

- Area: Git
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### `CLAUDE_CODE_SKIP_AWS_CRED_CACHE` no longer turns off one AWS credential step

Claude Code's AWS client now always uses its credential provider chain step, even when `CLAUDE_CODE_SKIP_AWS_CRED_CACHE` is set

**Unclear.** The variable may still be read elsewhere, so how caching behaves with it set is unclear.

**What**

Claude Code's AWS client uses a step that goes through the places AWS credentials can come from. Before, that step was skipped when `CLAUDE_CODE_SKIP_AWS_CRED_CACHE` was set. Now it is always used, and a different step does the work.

**Why**

If you set `CLAUDE_CODE_SKIP_AWS_CRED_CACHE`, credential caching may behave differently than you expect.

- Area: Bedrock
- Names: `CLAUDE_CODE_SKIP_AWS_CRED_CACHE`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### The Compliance row in /status is now called Organization configuration

In /status, the Compliance row is now called Organization configuration, and the related notice is shorter and appears once

**Unclear.** It is not clear what triggers the notice.

**What**

In `/status`, the row that was labelled "Compliance" is now labelled "Organization configuration". The notice shown when organization policy restricts Claude Code has changed too:

- It no longer says "some features are restricted" and now ends with " · /status".

- It is one shared notice, not a separate one for each restriction.

- It is checked once at startup against the current state.

**Why**

If you work under an organization policy, you will see different wording in `/status` and in this notice.

- Area: Terminal UI
- Names: `/status`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Claude is told plainly when a stopped shell command never ran

When a shell command is cancelled before running, Claude now gets a clear signal that nothing ran, with a message based on who stopped it

**Unclear.** The new wording of the cancellation message is not known.

**What**

The Bash tool is how Claude runs shell commands. When a Bash command is cancelled in the two cases handled here, the result Claude receives now states outright that nothing ran. The accompanying message is built in one shared way based on who stopped the call, replacing the separate wording each case used, such as a note that the call reached its deadline.

Separately, the Bash tool's own description, as captured under this release, now says the 10-minute maximum timeout applies to a foreground command.

**Why**

Claude gets a consistent signal that a cancelled command never started, so it is less likely to assume it had an effect.

- Area: Bash Tool
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Handing a session to the desktop app now says why it failed

When `/desktop` cannot hand off, Claude Code now reports whether the app is missing, outdated or would not open

**What**

`/desktop` continues your current session in the Claude Code Desktop app. When that handoff fails, Claude Code now reports one of three reasons:

- the desktop app is not installed

- the desktop app is outdated

- the desktop app could not be opened

The error text also changed. It used to say "Open Claude Desktop and run /desktop again." It now says "Open Claude Desktop and try again."

**Why**

You learn what went wrong instead of getting one general failure. The new wording no longer assumes you started the handoff by typing `/desktop`, so the same message works when the handoff is started some other way.

- Area: Desktop App
- Names: `/desktop`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Amazon Bedrock now checks environment credentials first

Bedrock sign-in now tries AWS keys from environment variables first, and ignores `credentials`, `config` and `profile` with a warning

**What**

When Claude Code uses Amazon Bedrock, it looks for AWS credentials, the keys that prove who you are to AWS, in several places in turn. It now tries credentials set in environment variables first.

The AWS client also no longer accepts three options:

- `credentials`

- `config`

- `profile`

If any of them is given, Claude Code ignores it and warns that it is not supported.

**Why**

If you use Bedrock and have AWS keys set in your environment, those keys are now picked before other sources. If you relied on one of the three options above, it no longer has any effect.

- Area: Bedrock
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Attachment downloads retry on failures, and early fetching can be switched off

Attachment downloads now retry after stalls and some server errors, and fetching attachments ahead of time can be turned off by a setting

**Unclear.** The name of the setting that controls early fetching, and whether it is on by default, are not known.

**What**

Claude Code can fetch attachments ahead of time, before they are needed. This early fetching now stops straight away when a setting reads as off.

Attachment downloads now retry, waiting a little longer each time, when the download stalls or the server answers with a 5xx error, 408 (request timeout) or 429 (too many requests). Previously there was no retry. The timing record kept for each download also counts inline images and failures.

**Why**

Whether early fetching is on affects how quickly attachments arrive, and the retries let a download recover from a brief stall or server hiccup instead of failing.

- Area: Attachments
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Safer cleanup of leftover git worktrees

Claude Code now removes stale git worktrees more carefully, checking each one before deleting and replacing the old prune step

**Unclear.** It is not clear which features run this cleanup.

**What**

A git worktree is an extra working folder linked to the same repository. When Claude Code runs git on a machine you provide, its cleanup of leftover worktrees has changed:

- stale worktrees are removed with `worktree remove --force`, skipping ones that cannot be removed because they are Windows reparse points (links to other locations)

- worktrees are unregistered with a limited, contained step instead of running `worktree prune`

- before deleting, the scan checks the worktree's gitdir file, confirms the repository root is the expected one, and compares file identity numbers

**Why**

These checks lower the risk of deleting the wrong folders, especially on shared or network drives.

- Area: Worktrees
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### AWS credentials in environment variables are now checked first

With no AWS profile set, Claude Code now tries AWS credentials from environment variables before the standard AWS credential lookup

**What**

When Claude Code signs in to AWS without a named profile, it now looks for credentials in environment variables first. Environment variables are settings you give a program through your shell. If none are found there, it falls back to the standard AWS lookup it used before, which was previously the only source it checked.

**Why**

This changes the order Claude Code uses to find AWS credentials, which matters if you use Claude through Amazon Bedrock. If you have credentials both in environment variables and somewhere else, such as a credentials file, the environment variables now take priority.

- Area: Bedrock
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Stopped tool calls now say when nothing ran

A tool call stopped before its command started now reports that nothing ran, whether it hit a deadline, shutdown or cancel

**What**

A tool call is one action Claude takes, such as running a command. When a call is stopped before its command actually starts, the message now says that nothing ran. This covers a call stopped:

- At its deadline

- Because Claude Code was shutting down

- Because it was cancelled

Claude Code also records in its usage data when a stopped call ran nothing.

**Why**

Both you and Claude can tell that the stopped call changed nothing, so trying it again is safe.

- Area: Tools
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Web fetching may follow a few more links and stops sooner on failures

The helper behind WebFetch may now follow about five same-site links, must not guess URLs, and retries a failed fetch at most once

**Unclear.** Whether these instructions apply in every configuration is not settled.

**What**

When Claude uses the `WebFetch` tool, a helper subagent (a separate Claude working on its behalf) does the fetching. Its instructions changed:

- It may follow up to about five links on the same site. Before, it was limited to the URLs it was given, redirect targets, or an obviously relevant next page.

- It must not guess URLs.

- It retries once on a timeout or a status that says to try again.

- Other failures, including rejections by a proxy or a policy, are treated as permanent and not worked around.

The `WebFetch` tool's own description is unchanged in this release; only the helper's instructions moved.

**Why**

It changes how far a fetch can reach and how failures are handled: a blocked page now stays blocked rather than being retried by other routes.

- Area: Web Fetch
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### /setup-vertex is turned off when managed settings configure Vertex

The /setup-vertex command is now unavailable when your organization's managed settings already provide a Vertex configuration

**Unclear.** Exactly what the managed-settings check for Vertex looks at is not stated.

**What**

`/setup-vertex` reconfigures Google Vertex AI authentication, project, region or model pins. It still stays hidden unless `CLAUDE_CODE_USE_VERTEX` is set. It now has a second condition: it is only enabled when managed settings (settings an administrator installs centrally) contain no Vertex entry.

**Why**

In organizations that pin their Vertex setup through managed settings, the reconfigure command is no longer available, so users cannot change what the administrator set.

- Area: Vertex
- Names: `/setup-vertex`, `CLAUDE_CODE_USE_VERTEX`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Better handling of Windows drives on WSL for sandbox file protections

On WSL, Claude Code reads Windows drive mounts more carefully, and sandbox read and write rules now work for paths inside them

**What**

On WSL (Windows Subsystem for Linux, which runs Linux inside Windows), Windows drives appear as mounted folders. Claude Code now reads the system's list of mounts more carefully. It:

- spots malformed entries

- recognises 9p mounts and mounts that use a `prefixpath=` option

- recognises shares of other Windows drives

The sandbox's read and write protections, which control which files commands may touch, now also apply to paths inside one of these mounts.

**Why**

WSL users get file protections that match how their Windows drives are actually mounted, including folders inside a mount.

- Area: Windows
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Workflow scripts now run in strict mode

Workflow scripts run in their isolated environment now use JavaScript strict mode

**What**

Workflow scripts run in their own isolated environment now start in strict mode. Strict mode is a JavaScript setting that turns some loose or error-prone code into errors.

**Why**

The rules for scripts in that environment are tighter. A script that relied on loose JavaScript behaviour may now fail with an error.

- Area: Workflows
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Starting a cloud session from WSL or an NTFS folder handles Windows file rules

When copying unsaved work into a cloud session, Claude Code now applies Windows file-name rules on WSL and NTFS, and reports a clear error if listing stops

**Unclear.** It is not clear whether this seeding step is available to everyone or only when switched on.

**What**

When a cloud session starts, Claude Code can package your uncommitted work (changes not yet saved in git) to seed it. That step now:

- applies NTFS path rules, the file-name rules Windows drives use, when it runs on WSL (Windows Subsystem for Linux) or in a folder on an NTFS drive

- fails with a clear message if listing your git index is cancelled or runs out of time, rather than a vague "could not list the index"

**Why**

Starting a cloud session from Windows or WSL is less likely to trip over file names, and when it stops early you can see why.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### The max-turns error now shows which turn limit was reached

When a run stops at its turn limit, the error now reads "Error: Reached max turns (N)" with the limit in brackets

**What**

A turn is one round of Claude Code working on your request. When a run stops because it has reached its maximum number of turns, the result label now includes that number, for example "Error: Reached max turns (25)". It used to read only "Error: Reached max turns". If Claude Code cannot work out the number, it shows the old text without it.

**Why**

When you hit the limit, you can see straight away which limit applied, which helps if you set different limits in different places.

- Area: Headless Mode
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Error for a disabled built-in skill can now say why it is off

When a built-in skill is turned off, the error can now give a specific reason and say if a `skillOverrides` entry also turns it off

**Unclear.** Which specific reasons the error can give is not stated.

**What**

Skills are sets of instructions Claude can use for particular tasks, and some ship with Claude Code. When you try to use one of these built-in skills and it is turned off, the error can now include a specific reason. It also says when a `skillOverrides` entry in your settings turns the skill off as well. Before, the message only gave generic wording about `disableBundledSkills` and `CLAUDE_CODE_DISABLE_BUNDLED_SKILLS`.

**Why**

If an administrator or a setting has turned off a skill, it is easier to see which setting is responsible and what to change.

- Area: Skills
- Names: `skillOverrides`, `disableBundledSkills`, `CLAUDE_CODE_DISABLE_BUNDLED_SKILLS`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Shortened output no longer cuts a hidden secret in half

When Claude Code shortens output and hides secrets, it now moves its cut points so it does not split a secret and leave part of it showing

**Unclear.** Which output this applies to is not settled.

**What**

Claude Code can shorten long output and replace secrets such as passwords or tokens with `[REDACTED]`. When it shortens text, it now moves the cut so it does not land in the middle of a secret. It watches for the signs that often come before one, such as `=`, `:`, a quote mark, `bearer` or `basic`. It also keeps count of how many characters were removed. Before, it simply cut at a line break and kept the end.

**Why**

A shortened log or output tail is less likely to show part of a credential.

- Area: Redaction
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Claude in Chrome permission requests offer to allow for the session

When Claude in Chrome asks for permission, it now includes a suggestion to allow it for the rest of the session

**Unclear.** How the suggestion is shown in the permission request is not settled.

**What**

When Claude in Chrome needs your permission, the request now includes a suggestion to allow the tool for the rest of the session. Before, it carried only the message "Claude in Chrome requires permission." with no suggestion.

**Why**

Accepting the suggestion should save you from answering the same Chrome permission request again and again in one session.

- Area: Chrome & Browser
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Error results can now include an error code

When a run ends in an error, the result message can now carry an `error_code` field if the error is one Claude Code recognises

**Unclear.** Which error codes are on the known list, and so when the field appears, is not stated.

**What**

When Claude Code finishes a run with an error, it sends a result message saying how the run ended. Programs that drive Claude Code through the SDK read this message. The SDK is the toolkit for using Claude Code from your own code.

That error result used to carry only a subtype and the error text. It can now also carry an `error_code` field. The field appears only when the error matches one of the codes Claude Code knows about.

**Why**

If you build on the SDK, your program can check a fixed code and decide what to do next. It no longer has to match the wording of the error text.

- Area: SDK
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Transcript view uses the main screen layout with the prompt hidden

Transcript mode now uses the main screen layout with the prompt and history elements hidden, not a separate layout

**Unclear.** The visible effect of the new layout on transcript view is not clear.

**What**

Transcript mode is the view that shows the full record of the conversation. It used to be drawn with a separate layout of its own. It now uses the main screen layout, with the prompt box and the surrounding history elements hidden.

**Why**

The way transcript view is drawn has changed, so it may look or behave slightly differently.

- Area: Terminal UI
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Sandbox status shown to host apps now describes the rules actually enforced

The sandbox status that Claude Code reports to host apps now describes the enforced rules and gains a field for allowing all Unix sockets

**Unclear.** It is not clear whether the sandbox enforces anything differently or only reports it differently.

**What**

The sandbox is a set of limits on what commands run by Claude can reach. Claude Code reports the sandbox's current state to host apps, meaning programs that embed Claude Code. That report has changed:

- `fs_allow_read`, `fs_allow_write` and `unix_sockets` now say they report what is enforced. Project settings are left out while managed settings, set by an organization, require the sandbox.

- A new field, `allow_all_unix_sockets`, says whether all Unix sockets are allowed. A Unix socket is a way for programs on the same machine to talk to each other.

- The descriptions of `allowedDomains` and `strictAllowlist` are expanded to match, and note that `WebFetch(domain:…)` allow rules are left out of the allowlist.

**Why**

A host app showing sandbox settings can now show the policy that is in force, not settings that are being overridden.

- Area: Sandbox
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Mistakes in the allowedProviders setting are now reported as errors

Claude Code now reports an error when `allowedProviders` is not a list, holds non-text entries, or names a provider it does not know

**Unclear.** It is not clear which settings files this check covers.

**What**

When Claude Code loads settings, it now checks `allowedProviders` and reports an error in these cases:

- The value is not a list

- An entry in the list is not text

- An entry names a provider Claude Code does not know. The error lists the names it does know.

Names that are not valid are dropped from the settings Claude Code uses.

**Why**

A typo in `allowedProviders` used to pass through silently. Now it is flagged, so check the error message for the correct provider names.

- Area: Managed Settings
- Names: `allowedProviders`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Highlighted text in the terminal can now use background colour, bold, italic and strikethrough

Highlighted text in the terminal display now keeps background colour, bold, italic and strikethrough, not just colour, dimming and underline

**Unclear.** It is not clear which parts of Claude Code produce these highlights.

**What**

When Claude Code highlights part of a line of text in its terminal display, it now passes more styles through to the screen. Previously a highlight could only carry:

- a text colour

- dimmed text

- underline

It can now also carry:

- a background colour

- bold

- italic

- strikethrough (a line through the text)

**Why**

Highlights can now look more distinct, because styles that were dropped before are shown.

- Area: Terminal UI
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Unknown slash commands are checked differently before being treated as file paths

Typing an unknown slash command now checks the name first and skips the file-path check for forms that are not local paths

**Unclear.** What the two new checks look for is not known.

**What**

Slash commands are instructions you type starting with `/`. When you type one Claude Code does not know, it used to always check your disk to see whether the text was really a file path. It now:

- first checks whether the name is valid

- skips the disk check for forms that are not local paths

- drops commands that a new check flags

**Why**

This affects what happens when you paste or type a path that starts with `/`, and whether it is treated as a command or as a path.

- Area: Slash Commands
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### SDK result messages can now report a breakdown of time before the first model request

Successful SDK results gain timing fields that break down the delay before the first model request, under the same conditions as startup timing

**What**

The SDK is the toolkit for running Claude Code from your own programs. When a run finishes successfully, it sends back a result message. That message used to carry only `time_to_request_ms` and some frame timings. It can now also carry a more detailed breakdown:

- `time_to_request_phases_ms`, time split by phase before the first request to the model

- `process_turn_index`, which turn this is within the process

- `time_to_request_cpu_ms`, processor time spent

- `time_to_request_loop_lag_ms`, time lost to delays in Claude Code's internal processing

- `time_to_request_major_faults`, a count of slow memory accesses that had to go to disk

- `turn_start_phases_ms`, time split by phase at the start of the turn

- `turn_start_control_requests_ms`, time spent on control requests at the start of the turn

- `api_error`, a typed error field

These fields appear in sessions run with `CLAUDE_CODE_REMOTE`, and on setups that set `CLAUDE_CODE_EMIT_STARTUP_TIMING`.

**Why**

If Claude Code feels slow before it starts answering, these fields show where that time goes.

- Area: SDK
- Names: `time_to_request_ms`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Bedrock and Vertex AI model checks remember results and recheck before falling back

On Bedrock and Vertex AI, Claude Code now remembers per-model access results with expiry and rechecks a model live before using it

**Unclear.** How long each remembered result lasts, and exactly what you will see differently, is not stated.

**What**

When you use Claude through Amazon Bedrock or Google Vertex AI and have not pinned a specific model, Claude Code checks which models your account can use and falls back to another if needed. Before, it kept a single cached yes-or-no answer. Now:

- Each model gets its own recorded result: refused, denied, temporary or accessible, and each result expires.

- Models that refused are remembered.

- A candidate model is confirmed with a fresh live check before it is used.

- A version check can mark a model as unavailable.

- Saved results are tied to the endpoint address and to whether authentication is skipped, so changing either does not reuse old results.

None of this runs when `CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST` is set.

**Why**

If you use Bedrock or Vertex AI, you should see fewer false "model unavailable" fallbacks and fewer repeated checks.

- Area: Models
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### SDK result messages include the API error when there is one

The SDK's result message now includes api_error when present, alongside api_error_status and api_error_code

**Unclear.** When `api_error` is actually filled in is not stated.

**What**

The Agent SDK lets programs run Claude Code. The result message it returns at the end of a run now includes an `api_error` field when one is present. Before, it carried only `api_error_status` and `api_error_code`.

**Why**

Programs using the SDK get more detail about an API error.

- Area: SDK
- Names: `api_error`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Claude in Chrome checks permissions for each navigation and batch action

Claude in Chrome now allows, blocks or asks about navigation and batched browser actions based on the web address and your domain rules

**Unclear.** It is unclear whether this check replaces an earlier permission path for these actions or runs alongside it.

**What**

Claude in Chrome, which lets Claude control your Chrome browser, now runs a permission check before navigating or running a `browser_batch` call (one call that bundles several browser actions). The check works like this:

- Addresses that are not ordinary web pages are refused.

- Sites whose domain is on your deny list are refused.

- Sites whose domain is on your allow list go ahead.

- When the `chromeClassifierFloorEnabled` setting is on, Claude asks you before going ahead.

- Input that cannot be read safely is refused with the message "Can't run this Claude in Chrome action: its input couldn't be safely checked."

For a `browser_batch` call, each action inside the batch is checked on its own.

**Why**

Browser navigation now follows per-domain permission rules, and a batch cannot slip an unchecked action past them.

- Area: Chrome & Browser
- Names: `browser_batch`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Forked subagents can no longer exit plan mode

A forked subagent that tries to leave plan mode is now refused, because that belongs to the session that started it

**Unclear.** Exactly which built-in subagent this check applies to is not clear.

**What**

Plan mode is a mode where Claude plans its work for your approval before making changes. A forked subagent is a helper that is started as a copy of the current session to handle part of the work. Such a subagent now cannot use the `ExitPlanMode` tool, whether it is in plan mode or in the fallback mode. It gets the message "A fork cannot exit plan mode; that belongs to the session that forked it. Finish your part and report back." Before, the only check was whether the session was in plan mode.

**Why**

This stops a helper from approving its parent session's plan on its own, so leaving plan mode stays with the session you are working in.

- Area: Subagents
- Names: `ExitPlanMode`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### WSL mount table checks: malformed lines block cloud sessions, clearer error text

On WSL, a malformed /proc/self/mounts line now blocks cloud sessions until fixed, and the unreadable-mounts error is reworded

**What**

On WSL (Windows Subsystem for Linux, which runs Linux inside Windows), Claude Code reads the file `/proc/self/mounts` to learn which Windows drives are attached. This release changes how it handles problems with that file:

- A new check spots a line in `/proc/self/mounts` that is incomplete, repeats an option, or names a drive only as its device. Claude Code reports the line number and serves no cloud session until the line is fixed. Before, only a mount table that could not be read at all was reported.

- The existing `mount_table_unreadable` error has new wording. It now says the list of mounted drives could not be read in full, and suggests checking the debug log if it fails again. It used to say it could not read which Windows drives WSL has mounted.

**Why**

If you use Claude Code on WSL and cloud sessions stop starting, an unusual entry in your mount table may be the cause. The message now points to the exact line to fix, and to the debug log for more detail.

- Area: Windows
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### claude ssh gets a stale_tunnel_credential failure case

claude ssh now reports when the machine's credentials changed while your organization's policy was loading, and handles it like a timeout

**What**

`claude ssh` runs Claude Code on another machine over a secure connection (a tunnel). Before a session starts, Claude Code loads your organization's policy. That loading has a new failure case for when the machine running `claude ssh` changes its credentials partway through:

- `stale_tunnel_credential` is a new reason the policy load can fail. It comes with its own message: "the machine running claude ssh changed credentials while your organization's policy was loading".

- This outcome is now grouped with timeout and parse_failed as a "live" outcome, rather than being treated separately.

- A new function marks a session's verdict as disowned (`sessionVerdictDisowned`) and announces that the verdict changed, the first time this happens.

**Why**

If a credential change interrupts policy loading in an ssh session, you now get a message that says what happened instead of a less specific failure.

- Area: Elsewhere
- Names: `claude ssh`
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Git remote addresses in some unsafe forms are now ignored

Claude Code now refuses to read some unsafe git remote addresses, such as ones that look like command options

**Unclear.** Exactly which address forms are now rejected is not clear.

**What**

A git remote is the address of the online copy of a repository. When Claude Code reads that address, it now rejects some unsafe forms before trying to match it, for example addresses that look like command options. Before, only the normal pattern matching was applied.

**Why**

This is hardening against a crafted address being used to slip unexpected instructions into commands.

- Area: Git
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Auto mode block messages take their reason from a different value

When auto mode blocks an action, the message and log now read the block reason from a different value, possibly fixing the reason shown

**Unclear.** It is unclear whether the reason you actually see is any different after this change.

**What**

Auto mode lets Claude Code carry out actions without asking you each time, using a checker called a classifier to decide which actions are safe. When the classifier blocks an action, Claude Code shows a message and writes a log line giving the reason. Both now take that reason from a different value than before.

**Why**

This may fix the block message showing a reason that did not belong to the action that was blocked.

- Area: Auto Mode
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Repeat sign-in replies now show a short "you can close this window" page

If the browser sends the sign-in reply again after the code arrived, it gets a plain page saying sign-in is finishing

**What**

When you sign in through your browser, the browser sends a reply back to Claude Code on your machine. Once Claude Code has the sign-in code, any later reply gets a plain page that reads "Sign-in is already finishing. You can close this window."

**Why**

If your browser sends the reply twice, you see this message instead of a confusing error.

- Area: Auth
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Shell commands with a heredoc `<<-` split across lines are now rejected

Claude Code's shell parser now refuses a heredoc `-` that only sits next to `

**What**

A heredoc is a way to feed several lines of text into a shell command, started with `<<` or `<<-`. A backslash at the end of a line joins it to the next one. Claude Code reads shell commands before running them. It now rejects a command where the `-` only ends up next to `<<` because of such a join. Before, it was accepted.

**Why**

This makes shell command checking harder to trick. A command written this way could be read one way by Claude Code and another way by the shell.

- Area: Permissions
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Git commands when creating a worktree now use stricter settings

Creating a worktree now runs git with a hardened set of settings, including limits on network protocols and no interactive SSH prompts

**Unclear.** The full set of git commands covered by these settings is not clear.

**What**

A worktree is an extra working copy of a git repository. When Claude Code creates one, the git commands it runs now get their settings from a shared setup step instead of a fixed list. That setup includes stricter git settings:

- `GIT_ALLOW_PROTOCOL`, which limits the network protocols git may use, now only accepts names made of letters, digits and `-`.

- SSH runs in batch mode, so it will not stop to ask for input.

**Why**

This tightens security around the git commands Claude Code runs for you.

- Area: Worktrees
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Managed settings read errors now include the system error code

When a managed settings file or folder cannot be read, the error now includes the system's error code where there is one

**What**

Managed settings are settings an administrator puts in place on a machine, in a file or a drop-in folder. When Claude Code cannot read one, the error it records now includes the system's error code, where one is available.

**Why**

The code makes it easier to work out why the file or folder could not be read.

- Area: Managed Settings
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Claude no longer gets tips on finding an artifact again after publishing it

After publishing an artifact, Claude is no longer told about the gallery, `/artifacts` or ctrl+], so it is less likely to pass those tips on

**What**

An artifact is a page Claude can publish from a session. After publishing one, Claude Code sends Claude a short message confirming it. That message used to add tips on getting back to it later: the gallery, the `/artifacts` command and the ctrl+] shortcut. Those tips have been removed.

What remains is the basic confirmation. In apps that show the publish as a card, Claude is also told to describe the page in a sentence and not to paste the link unless you ask for it.

**Why**

Claude is now less likely to tell you how to find the artifact again, so if you need it later, use `/artifacts` yourself.

- Area: Artifacts
- Names: `/artifacts`
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Turning off unsandboxed commands is honored from an additional settings source

Setting `allowUnsandboxedCommands` to false is now also read through a second settings lookup

**Unclear.** It is not clear which settings source the additional lookup reads.

**What**

`allowUnsandboxedCommands` set to false stops commands from running outside the sandbox (the limits on what commands run by Claude can reach). Claude Code used to read it only from the sandbox settings and from settings passed on the command line. It now also treats it as false when a second, more general settings lookup returns false.

**Why**

The restriction may now apply in more places than before.

- Area: Sandbox
- Names: `allowUnsandboxedCommands`
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Rejected marketplace git URLs now come with the reason

When a plugin marketplace's git URL is rejected, the error now says what is wrong with it

**What**

A marketplace is a catalog of plugins that Claude Code downloads from a git address. When that address cannot be used, the error used to say only that it was not one Claude Code will clone. It now says the git URL can't be used and adds the specific problem found.

**Why**

You can see what to fix in the address instead of guessing why it was refused.

- Area: Plugins
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### `claude mcp get` processes each output line before printing

`claude mcp get` now passes each line of its output through an extra step and detects local servers differently

**Unclear.** It is not clear what the extra step does to each line, including whether it hides secrets.

**What**

`claude mcp get` shows the setup of an MCP server, an outside tool provider Claude Code connects to. It now passes each line of its output through an extra step before printing. It also uses a separate check to decide whether a server is a local one that talks over standard input and output, instead of looking only at its declared type.

**Why**

The extra step may hide or clean up parts of the printed setup, such as secrets.

- Area: MCP
- Names: `claude mcp get`
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Forced removal of agent worktrees now checks for links pointing outside the repository

Force-deleting an agent's worktree now refuses when the path goes through a link or no longer matches, and cleans up only stale git records

**What**

A worktree is an extra working copy of a git repository that lives in its own folder. Claude Code can create one for an agent to work in. When Claude Code force-deletes one of these worktrees, it now first checks what the stored folder path really points to. It refuses to delete anything in two cases:

- The path reaches into the repository through a link, meaning a shortcut-like file system entry, that comes from outside the repository.

- The folder it checked is not the same one that is actually at that path.

In both cases nothing is force-deleted. The message asks you to remove the link or the folder yourself, or to try again.

Git keeps a list of worktrees it knows about. When entries in that list are out of date, Claude Code now removes just those entries. Before, it only checked that the worktree's git data linked back to the repository and then told git to clean up every out-of-date entry at once.

**Why**

These checks stop a forced deletion from following a link and deleting files outside the repository by mistake.

- Area: Worktrees
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Git addresses for plugins and marketplaces are checked more strictly

Claude Code now refuses git addresses with certain odd characters when installing plugins or adding marketplaces, and explains which forms work

**What**

Plugins and plugin marketplaces can be downloaded from git addresses. Claude Code now refuses a git address when it contains any of the following:

- `%00` anywhere in the address.

- Square brackets that git could read as the name of a server.

- A backslash before the first `/` of an `http` or `https` address.

- `://` inside a short-form address such as `git@host:path`.

When an address is refused, Claude Code says it is refusing to clone or refusing to query, and gives the reason. An error about an unreadable address now lists the forms Claude Code accepts. A `file://` address that contains a drive letter gets an extra note that only applies on Windows.

The same check now covers downloading, looking up available versions, and asking a remote for its contents. It also covers two more places:

- A marketplace given as a network git address. If the address fails the check, the marketplace is skipped.

- Marketplaces listed from claude.ai. A git-based one only appears in the list if its address passes the check.

**Why**

Some unusual addresses can make git connect to a different server than the one the address seems to name. Refusing them closes that trick. A few odd addresses that used to work will now be refused.

- Area: Plugins
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Login details inside URLs are more thoroughly hidden in logs

Logs now mask usernames and passwords in URLs as ***:***@ and also strip any extra @-separated parts that follow

**What**

Some web addresses carry a username and password before the host, for example `https://user:pass@host`. When Claude Code writes logs, it now masks that part as `***:***@`, and also removes any further `@`-separated pieces that follow it. That way a password containing an `@` cannot leave part of itself behind.

**Why**

This keeps credentials that appear in URLs from leaking into log files.

- Area: Redaction
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Plugins that need configuration count as activated after install

A newly installed plugin that still needs configuration is now treated as activated and reported as needing configuration, not as needing a reload

**What**

A plugin is an add-on that extends Claude Code. After a plugin is installed, Claude Code tries to switch it on straight away. If the plugin still needs configuration, the install now counts it as activated and reports that it needs configuration. Before, that case fell through to reporting that a reload was required.

**Why**

Plugins that need to be set up no longer ask you to reload Claude Code, so the message you see points at the real next step: configuring the plugin.

- Area: Plugins
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Auto-compact line in `/context` rewritten

The auto-compact window line in `/context` is built a different way, so its wording may differ slightly

**Unclear.** The exact new wording of the labels is not known.

**What**

The "Auto-compact window" line in `/context` was rewritten. Auto-compact is when Claude Code shortens a long conversation automatically so it fits. The line still says where that window setting comes from, but the labels now come from a single table rather than fixed text for each case, so the wording may differ slightly from before.

**Why**

In practice this line may read a little differently, while still telling you where the auto-compact window comes from.

- Area: Compaction
- Names: `/context`
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### File downloads get a separate time limit for the server's first reply

A file download helper now has a time limit for the server's first reply and returns a failure instead of raising an error when it cannot build the address

**Unclear.** Which downloads in Claude Code use this helper is not stated.

**What**

One of Claude Code's helpers for downloading files changed in two ways:

- It accepts a time limit for how long to wait for the response headers, the first part of the server's reply that arrives before the file itself. Once the headers arrive, it restarts the timer that detects a stalled download. Before, it used one fixed timeout that was refreshed while data streamed in.

- If it cannot build the address to download from, it returns a failure result instead of raising an error.

**Why**

It makes file downloads more robust when a server is slow to answer or the download address cannot be built.

- Area: Elsewhere
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Subagents get reworded instructions for sending their final report

The tool a subagent uses to hand back its final report now tells it the call ends its run, so it must come last

**What**

A subagent is a helper Claude that Claude Code starts to handle part of a task, and it hands its result back through a report tool. That tool's description is reworded. It now says "The call ends your run, so make it your last." Before, it asked for the call "once, as your last tool call".

**Why**

The wording changes how subagents are told to finish, making clear that sending the report ends their work.

- Area: Subagents
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### More Windows environment variables are passed through

Claude Code now passes more Windows environment variables through, including ALLUSERSPROFILE, SYSTEMDRIVE and the COMMONPROGRAMFILES ones

**Unclear.** Which pass-through list this is, and so which programs receive these variables, is not stated.

**What**

Environment variables are named values Windows provides to programs, such as where system folders live. Claude Code keeps a list of Windows variables it passes through, and that list now also includes:

- `ALLUSERSPROFILE`

- `SYSTEMDRIVE`

- `COMMONPROGRAMFILES`

- `COMMONPROGRAMFILES(X86)`

- `COMMONPROGRAMW6432`

**Why**

Programs Claude Code starts on Windows that need these variables should now work instead of failing to find them.

- Area: Windows
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Git addresses starting with git:// are now refused with a clear message

Git addresses using git:// are now rejected because they are not encrypted, and the error lists the supported address forms

**Unclear.** It is not clear which features check git addresses this way.

**What**

Claude Code now checks git addresses more strictly:

- Addresses starting with `git://` are rejected, because that form isn't encrypted.

- The error message lists the address forms that are supported.

- Short addresses in the style `user@host:path` are checked more carefully, and some are now refused.

**Why**

An unsupported or unencrypted git address now fails with an explanation of what to use instead.

- Area: Git
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Stricter checks on git remote URLs

Git remote URLs with bracketed hosts, encoded null characters or ambiguous hosts are now rejected when Claude Code matches repositories

**Unclear.** Which Claude Code features rely on this repository matching is not stated.

**What**

A git remote URL is the address a repository is pushed to and pulled from. Claude Code reads these addresses to work out which repository you are in and to check them against allowed lists. That reading is now stricter. A remote URL is rejected when it has:

- a host written in square brackets

- a percent-encoded null character (`%00`) or a raw null character

- a host that different URL readers would interpret differently

**Why**

These are known tricks for making one address look like another, so the stricter checks make repository matching harder to fool. A remote with an unusual address that worked before may now be refused.

- Area: Git
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Safer cleanup of leftover git worktree records

Removing a stale git worktree record now checks its paths first, refuses links and odd paths, and respects locked worktrees

**Unclear.** Which command triggers this cleanup is not stated.

**What**

A git worktree is an extra working copy of a repository in another folder, and git keeps a small record of each one inside the `.git` folder. When Claude Code removes a record for a worktree that no longer exists, it now does more checking first:

- it verifies where the record points before touching it

- it refuses symbolic links (shortcuts to other locations) and unusual paths

- it leaves locked worktrees alone

If it cannot complete the checks, it shows a warning starting "Could not vet the worktree registrations".

**Why**

This makes worktree cleanup harder to abuse with a deliberately crafted repository that tries to trick Claude Code into deleting files it should not.

- Area: Worktrees
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Hidden stats breakdown now cites your organization's policy

The note on a hidden session stats breakdown now says your organization's policy hides it, instead of naming HIPAA

**Unclear.** Whether the situations that hide the breakdown also widened, or only the message changed, is not clear.

**What**

Some session statistics come from scanning the session transcripts saved on your computer. When that breakdown is hidden, the message used to say it was not shown for HIPAA-regulated organizations. It now says: "Not shown under your organization's policy: these stats are built by scanning the session transcripts saved on this machine."

**Why**

The new wording suggests the breakdown can be hidden for reasons beyond HIPAA, the US health privacy rules.

- Area: Usage
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Claude Code recognizes more PowerShell syntax error messages

Claude Code can now recognize PowerShell parse errors and errors from Invoke-Expression in command output

**Unclear.** How Claude Code uses these recognized errors is not stated.

**What**

Claude Code now recognizes more kinds of error output from PowerShell, the Windows command shell. It can spot parser errors, such as a missing closing quote, and errors from `Invoke-Expression`.

**Why**

This may help Claude Code handle PowerShell commands that fail because of a syntax mistake.

- Area: Elsewhere
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Package registry host list updated

A list of package registry hosts now covers npm, JSR, PyPI, crates.io and the Go module proxy

**Unclear.** Which feature uses this list, such as the sandbox, is not stated.

**What**

Claude Code keeps a list of package registry hosts, the websites programming languages download libraries from. The list now names:

- `registry.npmjs.org`

- `jsr.io` and `npm.jsr.io`

- `pypi.org` and `files.pythonhosted.org`

- `index.crates.io`

- `proxy.golang.org`

**Why**

This is likely a list of network addresses Claude Code allows by default.

- Area: Sandbox
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Reading an artifact now also returns its title

When Claude reads an artifact, the result now includes the page title when it is known

**What**

When Claude reads an artifact, the result now includes the page's title when it is known. Before, no title was returned.

**Why**

Claude can now tell which page it read by its title, without looking through the content.

- Area: Artifacts
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Git config written by Claude Code now turns on long path support

A git config file that Claude Code generates now sets `longpaths = true`, so git can handle very long file paths

**Unclear.** Which git config file this is, and when Claude Code generates it, is not clear.

**What**

A git configuration file that Claude Code generates now includes `longpaths = true` in its `[core]` section. This setting lets git work with file paths longer than Windows' traditional limit.

**Why**

Repositories with deeply nested folders or long file names should run into fewer git errors in the setup that uses this config.

- Area: Windows
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Claude Code help skill can only fetch pages from Claude's docs sites without asking

The built-in skill that answers questions about Claude Code now has web fetching approved only for code.claude.com and platform.claude.com

**Unclear.** Whether pages from other sites can still be fetched after you approve a permission prompt is not clear.

**What**

Claude Code has a built-in skill, a bundle of instructions Claude loads for one kind of job, that answers questions about Claude Code's features and settings. It comes with a list of tools it may use without asking you. That list used to include `WebFetch`, the tool for fetching web pages, for any website. It now covers only two sites:

- `WebFetch(domain:code.claude.com)`

- `WebFetch(domain:platform.claude.com)`

**Why**

The skill's automatic web access is now limited to Claude's documentation. If it tries to fetch a page from anywhere else, you will probably be asked for permission first.

- Area: Skills
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Reading an artifact now returns its page title

When Claude reads an artifact's files, the result now includes the page title, and files fixed by the artifact's type are no longer listed

**Unclear.** It is not clear whether the Artifact tool is available to everyone or only when switched on.

**What**

The Artifact tool lets Claude read and update artifacts. When Claude reads an artifact's files, the result now includes the page's title when there is one.

For artifacts whose type is fixed, the result used to list the files that come with that type. It now only says: "The type's files are fixed and not listed here." Results from updating an artifact also add a blank line before that note.

**Why**

This changes what Claude sees when it reads or updates an artifact.

- Area: Artifacts
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Subagents are told their final report ends their run

Subagents are now told that sending their report ends their run, so it should be their last step

**Unclear.** It is not clear which kinds of subagent receive this instruction.

**What**

A subagent is a helper agent the main session starts to handle part of a task. When it finishes, it sends back a report. Its instructions used to say to send the report and then stop. They now say that sending the report ends the run, so it should be the last thing it does.

**Why**

This is a small change to how subagents wrap up and hand back their results.

- Area: Subagents
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Uploaded-folder cloud session refusal now cites your organization's policy

When a cloud session from an uploaded copy of your folder is refused, the message now cites your organization's policy instead of HIPAA

**Unclear.** It is not clear what triggers the refusal or whether it now applies to more organizations than before.

**What**

You can start a cloud session, which runs on Anthropic's servers, from an uploaded copy of the folder you are working in. When that is refused, the message used to say it was unavailable for HIPAA-regulated organizations. HIPAA is a US law about health data. The message now says: "Cloud sessions started from an uploaded copy of this working tree are disabled by your organization's policy. Start the session from a GitHub repository source instead."

**Why**

The refusal is no longer described as a health-data rule. It now points to organization policy in general, and it tells you to start from a GitHub repository instead.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### GitHub conditional access errors now get retried

A GitHub conditional access refusal is now retried with a pause like IP allowlist, suspended app and SAML SSO errors

**What**

Some GitHub errors are retried after a pause instead of failing at once. That list used to have three errors: IP allowlist, app suspended and SAML SSO. It now also includes `github_idp_conditional_access`. That is the error GitHub gives when your organization's sign-in service, called an identity provider, blocks access because a condition is not met.

**Why**

If your organization uses conditional access rules on its sign-in service, these GitHub errors are now handled like the other access errors instead of being treated differently.

- Area: GitHub App
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Git's security settings changed for git commands Claude Code runs

Git commands run by Claude Code now take their allowed network protocols from a shared value and set `GIT_NO_LAZY_FETCH` and `GIT_TERMINAL_PROMPT`

**Unclear.** The new value of `GIT_ALLOW_PROTOCOL` is not known.

**What**

The settings Claude Code passes to some git commands it runs have changed:

- `GIT_ALLOW_PROTOCOL`, which limits the network protocols git may use, is no longer fixed to "none" and now comes from a shared value.

- One group of settings, including `GIT_LITERAL_PATHSPECS`, is replaced by `GIT_ALLOW_PROTOCOL`, `GIT_NO_LAZY_FETCH` and `GIT_TERMINAL_PROMPT`.

**Why**

This changes the safety limits placed on git when Claude Code runs it.

- Area: Git
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Adding a plugin marketplace checks git URLs before the policy check

When you add a plugin marketplace from a git URL, Claude Code now validates the URL first and stops with an error if it fails

**Unclear.** What kinds of git address the new check rejects is not settled.

**What**

A plugin marketplace is a catalog of plugins you can add to Claude Code. When the marketplace comes from a git address, Claude Code now checks that address first and stops with an error if the check fails. This happens before the check against your organization's allowed list of marketplaces.

**Why**

Some marketplace additions may now fail that did not before, and a bad git address is refused earlier, with its own error instead of a policy message.

- Area: Plugins
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Sandbox drops read and write paths that were re-linked after setup

Sandbox `allowRead` and `allowWrite` paths re-pointed by a link after setup are now checked again and dropped if unsafe or pointing into a denied path

**Unclear.** How often this situation can arise in normal use is not settled.

**What**

The sandbox limits which files commands run by Claude may read and write. A symbolic link is a file that points to another location. If an `allowRead` or `allowWrite` path is re-pointed through a symbolic link after the sandbox settings were put together, Claude Code now checks it again. The path is dropped when:

- Unsafe: it no longer resolves safely.

- Denied: it now leads into a path the sandbox is not allowed to read.

Each dropped path is logged with "[Sandbox] dropped".

**Why**

Swapping a link after setup can no longer be used to reach files the sandbox is meant to keep unreadable.

- Area: Sandbox
- Names: `allowRead`, `allowWrite`
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Instructions for saving memories no longer vary

Claude now always gets the same instruction for saving memories: save as whichever type fits best, following the memory type and what-not-to-save rules

**What**

Claude Code can save memories, notes kept for later sessions. The instruction Claude gets about saving them no longer switches between two versions. It now always says that when you explicitly ask it to remember something, it should save it as whichever type fits best. It should also follow the rules on memory types and on what not to save. The other version, which said to save it immediately and follow separate memory-writing guidance, is gone.

**Why**

Everyone now gets the same memory instruction, the older of the two versions.

- Area: Memory
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Shorter message when this computer is removed from claude.ai

Removing a computer on claude.ai now shows a shorter message: cloud sessions started here can no longer use this computer

**Unclear.** It is unclear whether file sync itself was removed or only these messages.

**What**

When you remove a computer in claude.ai, Claude Code shows a message about the cloud sessions started from it. It now reads: "cloud sessions started here can no longer use this computer." Cloud sessions are Claude Code sessions that run on Anthropic's servers.

The old message said those sessions could no longer run commands on this computer or sync their changes back to it. That wording is gone. The message "File sync is on for this session" has also been removed.

**Why**

The new message no longer mentions syncing changes back, and the file sync notice is gone. So do not rely on changes from a cloud session being copied back to this computer.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### /update refusal now names both directories involved

When `/update` refuses because a session came from another project, the message now names that directory and the current one

**What**

`/update` will not update a session that was started in a different project directory than the one you are in now. The refusal used to say only that the session was resumed from a different directory. It now names the directory the session belongs to and the directory it is running in.

The message still tells you to restart with `--resume` to continue on the latest version. `--resume` is the command-line option for reopening an earlier session.

**Why**

You can see straight away which directory the session came from. That makes it easier to go back there and restart it.

- Area: Slash Commands
- Names: `/update`
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Git worktree cleanup now confirms the repository first

Before listing or removing git worktrees, Claude Code now confirms the git directory and does nothing if it cannot

**What**

A git worktree is an extra working folder attached to the same repository. Claude Code can clean these up.

It used to run `git worktree remove --force` directly. It now points git at a checked `--git-dir` when listing and removing worktrees. If it cannot confirm that git directory, it does not run git and says so. Git's records of worktrees whose folders no longer exist are now removed separately.

**Why**

This stops cleanup from acting on the wrong repository's worktrees.

- Area: Worktrees
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Reworded refusal when your organization blocks fetching arbitrary web addresses

The WebFetch refusal for an organization policy that blocks arbitrary web addresses now comes from a shared template starting "Arbitrary-URL egress"

**Unclear.** The full wording of the new message is not given.

**What**

Your organization's policy can stop WebFetch, the tool Claude uses to download web pages, from reaching any web address it likes. The message for that case used to read "arbitrary-URL egress is disabled by your organization's policy". It is now built from a template shared with other policy messages and begins "Arbitrary-URL egress".

**Why**

The wording of this refusal may be slightly different from before.

- Area: Web Fetch
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### The setup-bedrock command has a new availability check

The `setup-bedrock` command is now enabled only when a new check passes, as well as depending on `CLAUDE_CODE_USE_BEDROCK`

**Unclear.** What the new check looks at, such as managed settings or a locked provider, is not known.

**What**

The `setup-bedrock` command reconfigures Amazon Bedrock authentication, region and model pins. Amazon Bedrock is Amazon's service for running Claude models.

Whether this command was hidden used to depend only on `CLAUDE_CODE_USE_BEDROCK`. It now also has a separate check that decides whether it is enabled.

**Why**

If you use Bedrock, you may find `setup-bedrock` available in some setups and not in others.

- Area: Bedrock
- Names: `/setup-bedrock`
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Managed settings docs: allowedProviders is replaced, not merged

The settings description now says allowedProviders, like the other restriction allowlists, is taken whole from the helper and not merged

**What**

Organizations can supply managed settings (settings installed centrally by an administrator) through a helper program. The built-in description of how the helper's output is combined with other settings now lists `allowedProviders` among the restriction allowlists, alongside names such as `allowedMcpServers` and `availableModels`.

When the helper provides one of these lists, that list is used as the complete value and is not merged with values from anywhere else.

**Why**

Administrators who set `allowedProviders` through a helper can see that the helper's list is the whole list, so any provider missing from it is not allowed.

- Area: Managed Settings
- Names: `allowedProviders`, `allowedMcpServers`, `availableModels`
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### File limit message now says uploaded files instead of synced files

When a session has reached its file limit, the message now refers to uploaded files, and one failure reason is gone

**What**

When a session has no room for more files, the message now reads "the session holds as many uploaded files as it may" instead of saying "synced files". A separate failure reason, `no_standing_pack`, has been removed.

**Why**

Only the wording you see changes.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Gateway's Bedrock connection ignores `CLAUDE_CODE_SKIP_AWS_CRED_CACHE`

The gateway's Bedrock connection now always uses the AWS credential lookup, even when CLAUDE_CODE_SKIP_AWS_CRED_CACHE is set

**Unclear.** It is not clear which other places still honour the variable.

**What**

When the gateway connects to Amazon Bedrock, setting `CLAUDE_CODE_SKIP_AWS_CRED_CACHE` used to stop it from attaching its AWS credential lookup to the connection. That lookup is now always attached on this path, whatever the variable says. Other parts of Claude Code still read the variable.

**Why**

If you relied on `CLAUDE_CODE_SKIP_AWS_CRED_CACHE` to avoid cached AWS credentials when using Bedrock through the gateway, that setting no longer applies there.

- Area: Gateway
- Names: `CLAUDE_CODE_SKIP_AWS_CRED_CACHE`
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Cloud sessions give a generic message when a synced folder holds your settings

When a cloud session skips your plugins because its synced folder holds your Claude settings, you now see the generic could-not-check message

**What**

A cloud session is a Claude Code session that runs on Anthropic's servers. When the folder such a session syncs contains your Claude settings, Claude Code used to say that your plugins were not used for that reason. That case now shows the general message saying it could not check your plugins.

**Why**

You now get less specific guidance in this case. If your plugins are missing from a cloud session, check whether the synced folder contains your Claude settings.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Timed-out or cancelled tools no longer say they may have partly run when nothing ran

When a tool call times out or is cancelled before anything ran, Claude is no longer told it may have partly run

**What**

A tool call is an action Claude takes, such as running a command. When one times out or is cancelled, Claude Code tells Claude how it ended and when. It used to add that the call may have partly run if it had started. That part is now left out when nothing ran.

**Why**

Claude gets a more accurate picture of what happened, so it is less likely to check for or undo work that never took place.

- Area: Tools
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Organization policy refusals now say when a provider is not allowed

When your organization's policy blocks something because the provider is not allowed, the refusal now says so instead of using the general reason

**Unclear.** It is not clear which command shows this refusal.

**What**

When a policy set by your organization refuses something, the refusal now carries the reason `provider_not_allowed` when the provider is not permitted. A provider is the service Claude Code reaches Claude through. Before, every such refusal was marked with the same reason, `org_pin`.

**Why**

It is now possible to tell apart a refusal because the provider is not allowed from other policy refusals.

- Area: Managed Settings
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Sandbox text explains when read-deny values are ignored or dropped

New sandbox text says glob, UNC and automount values are ignored, and values re-pointed into a denied read path are dropped

**Unclear.** It is not clear where this text appears or which setting it describes.

**What**

The sandbox is the protected area Claude Code runs commands in, which limits what files they can read and write. Claude Code now includes text describing how the sandbox treats certain values:

- A value that sits under a path you have denied for reading is ignored.

- A value written as a glob (a wildcard pattern such as `*.txt`) is ignored.

- A value written as a UNC path (a Windows network path starting with `\\`) or an automount path is ignored.

- A value inside a writable directory is checked again before every command, and dropped once it has been re-pointed into a denied read path.

**Why**

The text describes a tightening of the sandbox. A value cannot be quietly redirected into a folder you blocked from reading, because it is checked again before each command runs.

- Area: Sandbox
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Plugin enable and disable errors now say more about what blocked them

Failed plugin enable or disable results now carry the governing scope, whether to disable first, and related dependencies

**Unclear.** What the new step run before enabling or disabling does is not known.

**What**

Plugins are add-ons that extend Claude Code. When enabling or disabling one fails, the result used to hold only an error code and a message. It now also includes:

- `governingScope`, which settings level controls the plugin

- `disableFirst`, whether something must be disabled first

- `dependencies`, the plugins involved

Enabling and disabling also run a new step beforehand, and disabling now looks up the plugin's canonical id (its one official name).

**Why**

Programs that manage plugins can react to a failure, for example by disabling a dependency first, instead of only showing a message.

- Area: Plugins
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### WSL safety checks for risky folders now look at mount points

On WSL, Claude Code's check for risky folders now also looks at how drives are mounted, not only at path names

**Unclear.** What difference this makes for someone using Claude Code on WSL is not known.

**What**

WSL is the Windows Subsystem for Linux, a way to run Linux inside Windows. On WSL, Claude Code's check for risky folders now also looks at mount points (where a drive or folder is attached into the file system), in addition to comparing path names as before.

**Why**

The folder safety checks on WSL are stricter.

- Area: Windows
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### A git version check now accepts git 2.32 instead of requiring 2.41

One of Claude Code's git version checks now passes with git 2.32 or later, where it used to require git 2.41

**Unclear.** It is not clear which feature this version check controls.

**What**

Claude Code checks which version of git is installed before it uses certain git features. One of those checks now passes from git 2.32 onward. It used to require git 2.41.

**Why**

If your git is older than 2.41 but at least 2.32, the feature behind this check is no longer turned away because of your git version.

- Area: Git
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### The idle /clear hint now also counts from turns that finish elsewhere

The 'new task? /clear' hint after a long idle spell now counts from the latest completed turn, including one that finished elsewhere

**Unclear.** Nothing was found that reports these other turn completions, so this timing may not have any effect yet.

**What**

When you come back to Claude Code after a long idle spell, it can show a hint like "new task? /clear to save N tokens". `/clear` starts a fresh conversation. Tokens are the units the model's context is measured in. The idle spell is 75 minutes.

That idle time used to be counted only from the moment your own last request finished. It now counts from whichever came later: your last request finishing, or another turn finishing elsewhere. A turn is one round of Claude reading a message and replying.

The hint's thresholds can still be adjusted with the `CLAUDE_CODE_IDLE_THRESHOLD_MINUTES` and `CLAUDE_CODE_IDLE_TOKEN_THRESHOLD` environment variables.

**Why**

The hint no longer suggests clearing the conversation while other turns have finished recently.

- Area: Slash Commands
- Names: `/clear`
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Problems loading plugin MCP servers are now collected as warnings

Problems loading a plugin's MCP servers are now gathered into a separate list of warnings

**Unclear.** It is not clear whether or where these warnings are shown to you.

**What**

A plugin is an add-on that can bring MCP servers with it. An MCP server is an outside program that gives Claude extra tools. When Claude Code loads a plugin's MCP servers, it now gathers any problems into a separate list of warnings and adds them to its state.

**Why**

Problems with a plugin's MCP servers may now appear as warnings.

- Area: Plugins
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Merging configuration data now ignores keys named __proto__

When Claude Code merges structured data, it now drops any key named __proto__

**What**

Claude Code sometimes combines pieces of structured data, such as settings described by a schema (a description of what the data should look like). When it does, it now deletes any entry named `__proto__` and skips it while combining.

**Why**

In JavaScript, the language Claude Code is written in, `__proto__` is a special name. Data that contains it can alter how every object behaves, a kind of attack known as prototype pollution. Skipping it closes off that attack.

- Area: Settings
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Clearer messages when Claude Code refuses to upload your project to the cloud

Messages refusing to upload a working tree to the cloud were reworded and split by cause, and now refuse more git setups

**Unclear.** It is unclear which command performs this upload.

**What**

Claude Code can upload your working tree, meaning the files in your project folder, to the cloud. It refuses in some situations. Those refusals used to share one general message. They now have separate, reworded messages for more cases:

- The project's `.git` is a symbolic link (a shortcut to another location), which the upload does not follow.

- A git pointer file is hard-linked, meaning the same file appears under more than one name.

- The project's own folder could not be examined at the time.

The message about git configuration files pulled in from elsewhere now lists which config files are checked. The messages no longer repeat your file paths or git folder locations back to you.

**Why**

If an upload is refused, the message tells you more precisely why, so it is easier to fix.

- Area: Cloud Sessions
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### A skill that fetches from platform.claude.com can no longer be run remotely

A built-in skill that fetches pages from platform.claude.com can no longer be run from a remote or bridged session

**Unclear.** It is not clear which skill this is.

**What**

A skill is a packaged set of instructions Claude can follow. One skill that is allowed to fetch web pages from platform.claude.com is now marked so it cannot be run through the bridge, the link that lets a session be driven remotely.

**Why**

From a remote or bridged session, this skill is no longer available. You can still run it in a session on your own machine.

- Area: Skills
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Downloaded skills are unpacked more carefully

Claude Code now refuses anything but plain files when unpacking a downloaded skill, and stops if it cannot safely leave an entry out

**What**

A skill is a packaged set of instructions Claude can follow, and some skills arrive as a downloaded archive (a single bundled file). Before, Claude Code unpacked everything in the archive after a simple check of the names. Now it:

- lists every entry in the archive in detail first

- separates plain files from special entries, such as links

- leaves special entries out and rejects anything that is not a plain file

- refuses to unpack the archive at all if it cannot safely leave an entry out

**Why**

This makes it harder for a harmful skill archive to write files outside the places it should.

- Area: Skills
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Remote sessions retry device recovery for any refusal reason

Remote sessions now re-enrol the device and retry for any refusal reason, not only untrusted_device

**Unclear.** Which refusal reasons other than `untrusted_device` exist is not known.

**What**

A remote session is one controlled from a device other than the machine it runs on. When the server refused a request, Claude Code used to re-enrol the device and retry only if the reason was `untrusted_device`. It now does this for any refusal reason and passes that reason to the recovery step.

**Why**

More kinds of refusal can now be recovered from automatically, instead of the session failing.

- Area: Sessions
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Git configuration safety check reads more files and settings

A git configuration safety check now reads config.worktree as well as config, and flags includes, core.worktree and unreadable files

**Unclear.** It is not clear where this check runs, what happens when it flags something, or what the shared second name case covers.

**What**

Claude Code runs a safety check on a git repository's configuration files. This check now reads the per-worktree file, config.worktree, as well as the main config file. A worktree is an extra working copy of the same repository. The check now flags:

- an include, which pulls settings in from another file

- a core.worktree setting

- a configuration file it cannot read

- a shared second name

- the worktreeConfig setting

The way it handles git hook configuration keys has also changed. Git hooks are scripts that git runs on its own at certain moments, such as before a commit.

**Why**

More of a repository's configuration is now looked at. A setting placed in a worktree file or pulled in through an include is less likely to slip past the decisions Claude Code makes about permissions and its sandbox, the restricted area it runs commands in.

- Area: Git
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Remote Control only re-registers your device when the refusal is about trust

When the sessions server refuses Remote Control, Claude Code reads the reason and only re-registers the device if it is untrusted

**What**

A 403 is the server's way of refusing a request. When the sessions server refuses a Remote Control request this way, Claude Code now reads the reason it gave. The reason can be one of these:

- `untrusted_device`: the device is not trusted

- `session_stale_relogin`: the session is out of date and needs you to log in again

Claude Code now tries to recover the device's credentials only when the reason is an untrusted device. Before, it re-registered the device after any 403. The wait between reconnect attempts is also calculated differently.

**Why**

This changes how Remote Control reconnects and recovers from sign-in problems. A refusal that needs a fresh login no longer sets off a device re-registration that could not fix it.

- Area: Remote Control
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Small changes to the ctrl+b hint and to switching models

The ctrl+b background hint can now be hidden, and switching models can refresh account data for some models

**Unclear.** It is not clear when the hint is hidden or which models trigger the refresh.

**What**

The hint that tells you ctrl+b sends a task to the background can now be hidden. Switching to another model can now refresh the data Claude Code holds about your account, for models marked as needing that.

**Why**

These are small behaviour changes. In practice, the ctrl+b hint may not appear in some places, and switching to certain models may reload account details.

- Area: Terminal UI
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Disabled feedback now comes with a reason

When feedback is switched off, Claude Code now gives a reason it is unavailable instead of returning nothing

**Unclear.** It is not clear how or where the reason is shown to you.

**What**

When feedback is disabled and Claude Code tries to put together a feedback report, it now returns an empty feedback ID along with a reason why feedback is unavailable. Before, it returned nothing at all.

**Why**

The feedback screen can now explain why feedback is not available rather than failing silently.

- Area: Elsewhere
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Plugins whose hooks share any name with another plugin are now skipped

A plugin's hooks are skipped if they share any of several names with a plugin that loads first, not just its main name

**Unclear.** It is not clear which extra names are now compared.

**What**

When Claude Code loads a plugin's hooks, it checks whether another plugin with the same name has already loaded. Hooks are scripts that run at set points while Claude Code works. This check now compares several names for each plugin instead of only the main one.

If any name matches, the second plugin is skipped. The message says another plugin of that name loads first, either a managed one or one from an earlier source.

**Why**

The rules for which plugin wins are stricter now. A plugin you expected to load could be skipped because one of its other names matches a plugin that loads before it.

- Area: Plugins
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Remote environment list now loads in pages

Claude Code now fetches your remote environments page by page, so long lists are no longer cut short after the first request

**Unclear.** The maximum number of pages is not known.

**What**

Claude Code now fetches your list of remote environments one page at a time instead of in a single request. It stops after a set number of pages. If the server says there are more, Claude Code logs a warning that the rest are not listed.

**Why**

Accounts with many remote environments now see more of them. If you have more than the page limit allows, the warning tells you the list is incomplete.

- Area: Sessions
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Plugins with unconfigured MCP servers now produce warnings

Loading a plugin now collects warnings for its MCP servers that still need configuration

**Unclear.** Where these warnings are shown to the user is not clear.

**What**

When Claude Code loads a plugin that brings its own MCP servers (external programs that give Claude extra tools), it now collects a warning for each of those servers that still needs configuration before it can be used.

**Why**

You may get a clearer message when a plugin's MCP server is not set up, instead of it silently not working.

- Area: Plugins
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### The message about blocked plugin network access is now built differently

The notice that plugins cannot use the network is now put together from a shared policy check instead of a fixed sentence

**Unclear.** What the shared check looks at, and the full wording of the new message, are not clear.

**What**

When plugins are not allowed to use the network, Claude Code used to show the fixed message "network access from plugins is disabled by policy". The message now starts with "Network access from plugins is" and the rest comes from a shared check of your policy. The separate message "nonessential network traffic is disabled for this session" is unchanged.

**Why**

The decision about plugin network access may now go through a different policy check than before.

- Area: Plugins
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Monitor's blocked-connection message has new punctuation

The message when Monitor is blocked from opening a live connection for compliance reasons now uses a full stop instead of a colon

**What**

When Monitor is blocked for compliance reasons from opening a WebSocket, which is a type of live network connection, it now shows "Monitor cannot open a WebSocket." followed by the details. The colon has become a full stop, and there is no full stop after the details anymore.

**Why**

Only the wording changed. Nothing changes in how the message behaves.

- Area: Elsewhere
- Tier: You'll notice
- Useful: 1/5
- Signal: 0/5

### Git tracing is now switched off explicitly for Claude Code's git commands

Claude Code now sets `GIT_TRACE2`, `GIT_TRACE2_PERF` and `GIT_TRACE2_EVENT` to "0" instead of empty when it runs git

**What**

When Claude Code runs git, it sets `GIT_TRACE2`, `GIT_TRACE2_PERF` and `GIT_TRACE2_EVENT` to "0" instead of an empty value. These environment variables control git's tracing output, and "0" turns it off.

**Why**

Some git versions can treat an empty value differently, while "0" reliably turns tracing off, so extra trace output is less likely to appear in git commands Claude Code runs.

- Area: Git
- Tier: You'll notice
- Useful: 1/5
- Signal: 0/5

### Reworded hint for blocking every skill

The hint for a wildcard skill deny rule now says it denies every skill rather than every skill tool

**Unclear.** It is not clear which exact rule the hint suggests you use.

**What**

A skill is a packaged set of instructions Claude can use, and a deny rule is a permission rule that blocks something. When you write a deny rule for skills with a wildcard, the hint Claude Code shows now ends with "to deny every skill." instead of "to deny every skill tool."

**Why**

This is a wording change only.

- Area: Skills
- Tier: You'll notice
- Useful: 1/5
- Signal: 0/5

## Bug Fixes

### Hooks whose output is cut short now fail instead of hanging

Hooks now wait for their output to finish after exiting, and fail with an "output incomplete" message if it was cut off

**Unclear.** It is not clear exactly when Claude Code decides a hook's output was cut off.

**What**

A hook is a command you set up to run automatically at certain points while Claude Code works, such as before a tool runs. Claude Code reads what the hook prints. It used to wait until the hook's output channels closed. It now waits for the hook process to exit and then gives the output a moment to finish arriving.

If the output was cut off before it ended, the hook now fails. The message says the output is incomplete, that its output was cut before the end on this machine, and suggests a retry. For hooks on events that are able to block an action, this failure blocks the action. The handling of exit code 2, the code a hook uses to block, also takes cut-off output into account.

**Why**

A hook that starts a background program which keeps the output channel open should no longer leave Claude Code waiting forever. The trade-off is that a hook whose output is truncated now counts as a failure, and on blocking events that stops the action.

- Area: Hooks
- Tier: You'll notice
- Useful: 3/5
- Signal: 1/5

### Resuming long sessions finds the compaction point more reliably

When loading a saved conversation, Claude Code now finds the point where it was compacted even when that marker sits far into the line

**What**

Compaction is when Claude Code shortens a long conversation by replacing older parts with a summary. The saved conversation marks where that happened. When loading a saved conversation, Claude Code scans only the start of each line, and the marker could fall past that point if earlier parts of the line were large. It now also recognises the marker by a second field that appears within the scanned part.

**Why**

Resuming a long session after compaction should no longer miss where it was compacted.

- Area: Compaction
- Tier: You'll notice
- Useful: 3/5
- Signal: 1/5

### Signing in no longer hangs if fetching your account roles stalls

The request for your account roles during sign-in now stops waiting after 10 seconds instead of waiting indefinitely

**What**

When you sign in with your account, Claude Code asks the server which roles your account has. That request now has a 10-second time limit; before, it had none.

**Why**

If the server never answers, sign-in stops waiting after 10 seconds rather than hanging.

- Area: Auth
- Tier: You'll notice
- Useful: 3/5
- Signal: 1/5

### Workflow scripts no longer crash on an unhandled failed agent call

When a workflow script leaves a failed agent(), parallel(), pipeline() or workflow() call unhandled, Claude Code logs it and keeps running

**Unclear.** Whether the handler also catches unhandled failures from outside workflow scripts is not settled.

**What**

Workflow scripts can call `agent()`, `parallel()`, `pipeline()` and `workflow()`. Each call hands back a promise, a placeholder for a result that arrives later. If one of those calls fails and the script never deals with the failure, Claude Code now logs "Workflow: swallowed an unhandled rejection (not exiting)" and keeps running instead of exiting.

**Why**

A forgotten failure in a workflow script no longer takes down the whole process. Look for that log line if a step seems to vanish silently.

- Area: Workflows
- Tier: You'll notice
- Useful: 3/5
- Signal: 1/5

### Claude Code recovers from MCP servers that stop responding while connecting

If a local MCP server stalls or exits during connection, Claude Code now restarts it once using the older connection method

**What**

An MCP server connects Claude Code to outside tools. A local MCP server talks to Claude Code through its standard input and output.

When connecting, Claude Code now sends one more message after the server accepts its subscription request. Some servers stop answering at that point, or exit. Claude Code then restarts the server once using the older way of connecting, which leaves out the subscription request. This must fit within the time left for connecting.

**Why**

Some servers used to hang at this step, including mark3labs/mcp-go before 1.1.1. They should now connect instead.

- Area: MCP
- Tier: You'll notice
- Useful: 3/5
- Signal: 1/5

### Subagents get a clear refusal when they try to enter plan mode

Asking to enter plan mode from a subagent is now refused up front with "Only the main session can enter plan mode."

**Unclear.** It is not clear whether subagents can still see the `EnterPlanMode` tool at all.

**What**

Plan mode is a mode where Claude plans its work for your approval before making changes. Only your main session can enter it, not a subagent (a helper that Claude starts to handle part of a task). Before, a subagent trying to enter plan mode caused an internal error while the `EnterPlanMode` tool ran. Now the request is checked before it runs and refused with the message "Only the main session can enter plan mode."

**Why**

The subagent now gets a clean, readable refusal instead of a crash-style error, so it can carry on with its task.

- Area: Subagents
- Names: `EnterPlanMode`
- Tier: You'll notice
- Useful: 3/5
- Signal: 1/5

### Hooks whose output was cut off are no longer trusted

When a hook's output stream closes early, Claude Code no longer reads it as a verdict or reports the hook's script as missing

**What**

Hooks are your own scripts or commands that Claude Code runs at set moments, such as when Claude stops or before a tool runs. Claude Code reads what a hook prints to decide what to do next. It now checks whether the hook's stdio (the input and output streams it uses to talk to Claude Code) closed before the end of the stream:

- A hook's output is no longer read as a clean verdict if its stdio closed before end-of-stream. Part of the output may have been lost, and Claude Code says it is "refusing to read the partial capture as a verdict". This matters most for hooks that grant permissions or add context to the conversation.

- The check that decides a Stop hook or similar hook's script is missing no longer fires when stdio was incomplete or closed without an end (`stdioClosedWithoutEnd`). Before, it looked only at empty normal output and a "no such file" or "can't open" message in the error output.

**Why**

A cut-off answer from a hook can no longer be mistaken for a permission decision. You should also see fewer false reports that a hook's script is missing.

- Area: Hooks
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Fewer false "GitHub app not installed" results, with clearer access errors

When the GitHub app's status is unknown, Claude Code now asks the server to recheck and explains SSO or IP allowlist blocks

**What**

Some Claude Code features, such as web setup and cloud sessions, need the Claude GitHub app installed on your repository. When the check for that app came back with no status, Claude Code used to treat it as "not installed".

Now it asks the server to check the repository again. When the server gives a reason, Claude Code shows an explanation, for example:

- your GitHub organization only allows access from approved IP addresses (an IP allowlist)

- your GitHub organization requires single sign-on (SSO)

- your identity provider applies conditional access rules

**Why**

You should see fewer wrong "app not installed" messages, and when access really is blocked, the message tells you what to fix.

- Area: GitHub App
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Remote sessions clear stale background tasks sooner

In remote sessions, tracked background tasks are now cleared when the remote worker goes away, when catch-up history is cut short, or on disconnect

**What**

In a remote session, Claude Code keeps a list of tasks running in the background. Before, that list was cleared only on reconnect. It is now also cleared when:

- the remote machine doing the work goes away

- the history sent to catch up is cut short

- the connection drops

Claude Code records how many tasks were dropped.

**Why**

Background-task indicators for work that no longer exists should stop lingering in remote sessions.

- Area: Sessions
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Fix for picking the best matching version of a dependency

A version lookup compared the wrong value and never found the best matching version; it now compares the right one

**Unclear.** Which feature, plugins or something else, uses this version lookup is not stated.

**What**

Claude Code has code that picks which version of a plugin or dependency to use. It works out the highest version that fits the requested range, then looks it up. The lookup compared against the wrong value, so it could never find a match. It now looks up the version it actually chose.

**Why**

Before this fix, the matching version was never selected, so this lookup always came back empty.

- Area: Plugins
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Folder-only ignore rules like `dir/` now match the folder itself

Ignore rules written for folders, such as `dir/`, now match that folder, because Claude Code checks folders with a trailing slash

**Unclear.** It is not clear which feature uses these ignore rules.

**What**

Ignore rules follow the style of a `.gitignore` file, where a pattern ending in a slash, such as `dir/`, only means a folder. Claude Code used to check a path against these rules without the slash, so such a rule could miss the folder itself. When the path is a folder, Claude Code now checks it as `path/`, so folder-only rules match.

**Why**

Rules written in the usual `.gitignore` way for folders now apply to those folders as you would expect, which matters where these rules decide what Claude may touch.

- Area: Elsewhere
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### `/model` in a cloud session waits for the session to be ready

In a cloud session, `/model` now waits for the cloud session to start before loading models, instead of timing out or falling back

**What**

`/model` opens a picker for switching the AI model. In a session running in the cloud, the picker now waits for the cloud session to finish starting and shows "Waiting for the cloud session to be ready…" until it is. Before, it always showed "Loading models from the cloud session…" and could time out or fall back if the cloud session was not ready yet.

**Why**

`/model` is less likely to fail when you open it right after starting a cloud session that is still getting ready.

- Area: Models
- Names: `/model`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### A turn that stopped at the turn limit is no longer resumed as interrupted

On resume, a turn that stopped at the max-turns limit now counts as complete and is not re-run as if it had been interrupted

**Unclear.** It is not clear exactly what a reader sees differently on resume.

**What**

Claude Code can be given a limit on how many turns (rounds of work) it takes. When you resume a session, Claude Code checks how its last turn ended. A turn that stopped because it hit that limit is now counted as finished at the limit. Before, it was counted as interrupted and could be picked up and run again automatically.

**Why**

Resuming a session that stopped at its turn limit no longer re-runs the last turn, which had in fact been stopped on purpose.

- Area: Sessions
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Re-attaching a dismissed artifact brings it back

Attaching an artifact that was already attached but dismissed now restores it and reports that it is listed again

**Unclear.** It is not stated what an artifact is here or where the attach action is reached.

**What**

When you attach an artifact that is already attached but was dismissed (hidden from the list), Claude Code now un-dismisses it and reports that it is listed again. Before, it only reported that the artifact was already attached and left it dismissed.

**Why**

Attaching a dismissed artifact a second time now brings it back into view instead of doing nothing.

- Area: Artifacts
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Official marketplace auto-install opt-out is now read by a reworked check

A small check that used to read the cloud worker generation number now reads `CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL` instead

**Unclear.** The variable may already have been read elsewhere in the previous version, so how much this changes in practice is unclear.

**What**

A small internal check that used to read `CLAUDE_CODE_WORKER_EPOCH` now reads `CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL`, the environment variable (a setting you give a program through your shell) that stops Claude Code from automatically registering the official plugin marketplace.

**Why**

This gives the opt-out another place where it is honoured, so setting it can keep the official marketplace from being added automatically.

- Area: Plugins
- Names: `CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL`
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Pasting an MCP login code by hand now counts as receiving it

When you paste an MCP server's login code manually, Claude Code now records that the code arrived before using it

**Unclear.** Where the received flag is checked, and so whether it prevents failed logins, is not confirmed.

**What**

Some MCP servers (outside tools connected through the Model Context Protocol) ask you to log in through a browser. If you paste the login code back by hand instead of letting it arrive automatically, Claude Code now records that the code was received before it goes on to use it. Before, it used the code without recording that.

**Why**

This is a small fix to the manual-paste login. It likely stops a later timeout or cancellation from treating a successful login as failed.

- Area: MCP
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Browser sign-in remembers when its code has already arrived

During browser sign-in, Claude Code now records that it received the sign-in code and checks this first when a later reply comes in

**Unclear.** It is not clear what else in Claude Code uses the record that a code was received.

**What**

When you sign in through your browser, Claude Code briefly listens on your machine for the browser to send back a sign-in code. This reply is called the callback. Claude Code now notes when a callback with a code has been accepted. When a later callback arrives that belongs to the same sign-in, it checks that note before doing anything else.

**Why**

This most likely stops Claude Code from reporting a timeout or an error after the code has already arrived.

- Area: Auth
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Hover highlights clear when the mouse moves away

Claude Code now clears its record of what the mouse is over when the pointer moves to a different spot

**Unclear.** Which parts of the interface use hover highlighting is not known.

**What**

In Claude Code's terminal interface, a mouse event that lands on a different spot now clears the remembered hover position and tells the item that the pointer has left. Before, the hover stayed in place until the next hover.

**Why**

Highlights should no longer stay on screen after the pointer has moved away.

- Area: Terminal UI
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Clearer error when starting a monitor is interrupted

If starting a monitor is interrupted, Claude Code now cleans up and says the call was interrupted and nothing is running

**What**

When Claude starts a monitor and that step is cut short, Claude Code now waits for it to finish and cleans up. If the agent is stopping, it reports the existing stopped error. Otherwise it reports a new message: "This call was interrupted before the monitor started; nothing is running."

**Why**

The failure message is clearer, and a half-started monitor is not left behind.

- Area: Elsewhere
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Content filter errors are now identified more precisely

An error now counts as blocked by the content filter only if the API returned status 400 or no status, not whenever the text appears

**What**

When the API refuses to return output because of its content filtering policy, the error says "Output blocked by content filtering policy". Claude Code used to label any error containing that text as a content filter block. It now does so only when the error's status code, the number the API returns to describe a failure, is 400 or missing.

**Why**

Other errors that happen to mention that text are no longer reported as content filter blocks, so the reason Claude Code gives for a failure is more accurate.

- Area: API Errors
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Cancelled PowerShell hooks no longer report a missing PowerShell

A PowerShell hook cancelled while Claude Code looks for PowerShell now ends as cancelled instead of a not-found error

**Unclear.** What pinning project hooks does is not explained.

**What**

A hook is a command you set up to run automatically at certain points while Claude Code works. For hooks that run in PowerShell, Claude Code first has to find PowerShell on your computer. If the hook is cancelled during that search, it now ends as cancelled. Before, it carried on and reported that no PowerShell executable could be found.

Separately, a step that pins project hooks is now skipped when Claude Code could not read the Windows settings.

**Why**

On Windows you should see fewer misleading errors, such as being told PowerShell is missing when the hook was simply cancelled.

- Area: Hooks
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Telemetry shutdown now flushes an additional data source

When Claude Code exits, OpenTelemetry shutdown now flushes and closes one more data source, and a broken reference is fixed

**Unclear.** It is not clear which data source is the one now flushed at shutdown.

**What**

OpenTelemetry is the system some setups use to collect usage data from Claude Code. When Claude Code shuts down, it now flushes and closes one more data source, after waiting half of the shutdown timeout. The shutdown code previously referred to a list that did not exist on one path. The timeout is set with `CLAUDE_CODE_OTEL_SHUTDOWN_TIMEOUT_MS`.

**Why**

Some telemetry that may previously have been lost when Claude Code exited may now be sent before it closes.

- Area: Telemetry
- Names: `CLAUDE_CODE_OTEL_SHUTDOWN_TIMEOUT_MS`
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Your git log format setting no longer affects Claude Code's git commands

Claude Code now runs its own git commands with format.pretty=medium so a custom log format cannot break how it reads the output

**What**

When Claude Code runs git itself, it forces a few settings so your personal git configuration cannot change the output. It now also sets `format.pretty` to `medium`, git's standard layout for commit logs.

**Why**

If you have set a custom log format in your git configuration, Claude Code can still read git's output correctly. Your own git commands are not affected.

- Area: Git
- Names: `format.pretty`
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Bash commands cancelled just before starting are now cleaned up

A shell command cancelled right before it starts is now cleaned up, and the Bash tool now states time limits for background commands

**What**

When a shell command is cancelled just before it starts, Claude Code now cleans up after it.

In this release's description of the Bash tool, which is what Claude reads to learn how to run commands, the 10-minute limit is said to apply to foreground commands. The description also gives a limit for background commands: 1800000 ms (30 minutes) by default and at most 7200000 ms (2 hours).

**Why**

Cancelling a command while it is starting no longer leaves stray output files behind.

- Area: Bash Tool
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Early telemetry records wait for a destination instead of being lost

Telemetry records created before a collector is ready are now held and sent later, up to a limit

**What**

Telemetry records sent to an outside collector, a service that receives usage data, are now held until the route to that collector is set up. Before, they were dispatched straight away even when no route was open.

The number held is capped. Past that cap, new records are dropped and Claude Code logs the warning `[3P telemetry] Event record dropped: no road installed and too many already waiting for one`.

**Why**

Records from the first moments of a session are no longer lost just because the collector was not ready yet. If you see the warning, some records were still dropped.

- Area: Telemetry
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Commands cancelled before they start are cleaned up right away

A shell command that is already cancelled when it is created is now cleaned up immediately

**What**

When Claude Code creates a shell command (a command run in your terminal) and the request to cancel it has already arrived, it now runs the cleanup immediately. Before, the command was registered as running without checking whether it had already been cancelled.

**Why**

This stops commands cancelled very early from being left behind or hanging.

- Area: Bash Tool
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Commands already cancelled are no longer started

If a command was cancelled before it started, Claude Code now returns a cancelled result instead of starting it anyway

**Unclear.** It is likely but not certain that this is the path that runs hook commands.

**What**

Before starting a command, Claude Code now checks whether it has already been cancelled. If it has, the command is not started and Claude Code returns a failed result marked as aborted.

**Why**

Processes no longer start after you have already cancelled them.

- Area: Bash Tool
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### The permission prompt tool's server is tracked correctly when the folder changes

When the working folder changes, Claude Code now finds the permission prompt tool's MCP server from the listed tools, not only from its parsed name

**Unclear.** The exact effect a user would notice is not clear.

**What**

An MCP server is an add-on program that gives Claude Code extra tools. A permission prompt tool is one that answers permission requests in place of you. When the working folder changes, Claude Code clears out MCP servers that no longer apply. It now works out which server the permission prompt tool belongs to by looking at the tools that server lists, as well as by the server name it parsed. Before, it used only the parsed name.

**Why**

This fixes a case where the permission prompt tool could be missed after the working folder changed.

- Area: MCP
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Windows now matches its own machine name regardless of letter case

On Windows, the check for whether a host is this machine now ignores letter case and matches shortened forms of the name

**Unclear.** What Claude Code uses this check for is not clear.

**What**

On Windows, the check for whether a host name means this machine now ignores upper and lower case and also matches shortened forms of the machine name.

**Why**

This changes which host names Claude Code treats as local.

- Area: Windows
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Settings error for an unknown hook event shows its tip again

When your settings name a hook event Claude Code does not recognize, the validation error again includes its helpful tip

**What**

Hooks are commands you set up in your settings to run automatically at certain moments, such as before or after Claude uses a tool. Each hook is filed under an event name. When a settings file lists an event name Claude Code does not recognize, the error it reports can include a tip. Claude Code now detects that mistake in a different way, so the tip appears again for this case.

**Why**

A change in how settings are checked had stopped the tip from appearing. With it back, a mistyped or unsupported hook event name comes with a pointer to what went wrong, rather than a bare validation error.

- Area: Hooks
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

## In Development

### Policy limits and remote settings can use a token from the environment

With no API key, Claude Code can now fall back to a bearer token from the environment when fetching policy limits and remote settings

**Unclear.** Which environment variable supplies the token and how the remote switch decides to skip the fallback are not settled.

**What**

Claude Code fetches policy limits and remote settings from Anthropic, and these requests need a credential. Before, when there was no sign-in token or API key, the request stopped with "No API key available". Now it can fall back to a bearer token (a credential sent along with each request) taken from the environment.

The fallback applies only under certain conditions, including not using `ANTHROPIC_UNIX_SOCKET`. A remotely controlled switch can skip it.

**Why**

Setups that only provide a token, with no API key, can now reach policy limits, which affects whether an organization's managed policies are applied.

- Flag `tengu_copper_kite`: Off in both readings (read for one account on one subscription tier against v2.1.285; this account: off, anonymous baseline: off, compiled default: not a boolean we can read) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Flag `tengu_steady_sunbeam`: Off in both readings (read for one account on one subscription tier against v2.1.285; this account: off, anonymous baseline: off, compiled default: not a boolean we can read) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Managed Settings
- Tier: Nothing to try yet
- Useful: 2/5
- Signal: 3/5
- Present in the build but not switched on

### Compaction summary can carry a separate note meant only for the model

The message built after compaction can now hold a second, model-only text, though nothing fills it in yet

**Unclear.** It is not clear where, if anywhere, the model-only text is set.

**What**

Compaction is when Claude Code shortens a long conversation by replacing earlier messages with a summary. The message it builds after compacting used to be plain text. It now has two parts: the visible content, and an optional text intended only for the model. The part that builds this message never fills in the model-only text.

**Why**

Nothing changes for now, since the model-only part is left empty. It looks like preparation for text that the model sees but the reader does not.

- Area: Compaction
- Tier: Under the hood
- Useful: 1/5
- Signal: 3/5
- Present in the build but not switched on

### Auto mode check now considers the mode that was active before a rewrite

The plan and auto mode check now also looks at the mode that was active before a rewrite, and a line-reading helper sits behind a server switch

**Unclear.** It is not clear what the newly switched helper controls or which part of Claude Code was reworked.

**What**

Claude Code runs a check to decide whether plan mode or auto mode applies. That check now also looks at the mode that was active before a rewrite. Separately, a helper that used to read text line by line, skipping blank lines and comment lines starting with `#`, has been reworked. It now sits behind a server-side switch, and the code treats that switch as off when the server sends nothing. The message timestamps option in settings is also still controlled by a server-side switch.

**Why**

This could change how auto mode behaves in some cases.

- Flag `tengu_sleepy_rabbit`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: off) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Flag `tengu_silk_hinge`: Off in both readings (read for one account on one subscription tier against v2.1.285; this account: off, anonymous baseline: off, compiled default: off) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Auto Mode
- Tier: Nothing to try yet
- Useful: 1/5
- Signal: 2/5
- Present in the build but not switched on

## Internal Changes

### Remote clients can get read receipts for messages they send to a session

The remote connection can now report when an incoming message was read and track messages that arrive more than once

**Unclear.** It is not clear what decides whether read receipts are offered for a given connection.

**What**

Claude Code can be driven from another app over a remote connection it calls the bridge. When that connection starts up, Claude Code can now tell the other side that it supports read receipts, meaning it will confirm when a message sent to it has been read.

Claude Code also now keeps track of incoming messages that get delivered a second time. It distinguishes these cases:

- a repeat that arrives while the first copy is still being handled

- a repeat that arrives after the first copy was finished

- a repeat that arrives after the session started

**Why**

The app on the other end can see that a message reached the session and was read. Claude Code can also recognise a duplicate and skip it instead of acting on the same message twice.

- Area: Sessions
- Tier: Under the hood
- Useful: 3/5
- Signal: 3/5

### Browser MCP server setup now runs a bundled Playwright script

Claude Code can build a browser MCP server that runs a bundled Playwright script with node and sets CLAUDE_TEST_PROJECT_DIR

**Unclear.** It is not clear what switches the browser server on or where it is used.

**What**

MCP servers are external tools Claude Code can connect to. Claude Code can now produce a server setup named `browser` that runs the script `skills/run/scripts/playwright-mcp.mjs` with node. It sets `CLAUDE_TEST_PROJECT_DIR` to your project folder.

Separately, the list of keys Claude Code recognises in a plugin's manifest (the file describing a plugin) now includes `channels`, `monitors`, `settings`, `userConfig` and `experimental`.

**Why**

This points to a bundled skill for running and controlling a browser.

- Area: MCP
- Tier: Under the hood
- Useful: 3/5
- Signal: 3/5

### Usage records gain a fallback_credit field

API usage records now carry an optional fallback_credit field, which reports the outcome of a fallback-credit token a request presented

**Unclear.** It is not clear how the fallback_credit value is used.

**What**

The usage information attached to each API response, which records things like how many tokens a request used, now has a `fallback_credit` field.

- `fallback_credit` is optional in the usage schema. It is described as the outcome of a fallback-credit token the request presented, or null.

- It defaults to null and is carried through when usage from several requests is combined.

**Why**

This is a data change that most people will not see directly. If you read the usage data Claude Code records or reports, expect a new `fallback_credit` field. It will be null unless a request presented a fallback-credit token.

- Area: Usage
- Tier: Under the hood
- Useful: 1/5
- Signal: 3/5

### New names for MCP connections and appending to a session

Three new names appear for connecting to MCP, appending to a session and a plain MCP server call, next to existing ones

**Unclear.** What uses these names and whether anything restricts them is not clear.

**What**

Three new names appear alongside existing ones:

- `mcp.connect`, next to `mcp.call`.

- `session.append`, next to `session.send`.

- A new MCP server event for a plain call, next to the existing one for a file call.

MCP (Model Context Protocol) is the way Claude Code connects to outside tools and services. The names look like new actions for controlling Claude Code from code and new usage-reporting names.

**Why**

They suggest new ways to connect to MCP and to add to a session from code.

- Area: MCP
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### The current_time tool is now handled separately when grouping connector tool calls

The current_time tool now joins a set of tools that are handled separately, and connector routing splits into claude.ai and widget cases

**Unclear.** It is not clear what a reader will see differently when current_time is called.

**What**

The current_time tool was added to a set of tools that Claude Code handles separately when it routes tool calls from connectors. A tool call is a single action Claude takes, such as reading a file or asking a tool for the time. Connector routing, which used to rely on one on/off check, is now split into two cases: one for claude.ai connectors and one for widgets.

**Why**

This affects how tool calls are grouped together when Claude Code shows them on screen.

- Area: Connectors
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### Code for handing off turns and connecting added MCP servers was reworked

The code that hands a turn to another host, and that reports on MCP servers added during a session, appears in reworked form

**Unclear.** This may be existing code that moved, and it is not clear whether any behaviour changed.

**What**

The code that hands a turn to another host appears in reworked form. When handoff is not allowed, it answers that turn handoff is disabled. Otherwise it reports the handoff as a duplicate, accepted or converted. A session can wait, parked, until a host picks it up. The code that writes messages when an MCP server added during a session connects or fails was reworked too. An MCP server is an outside program that gives Claude extra tools.

**Why**

This affects how remote sessions and sessions run through the SDK are handed around and controlled.

- Area: Sessions
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### Tool calls picked up after a remote restart now carry their original host

After a restart, Claude Code fills in the remote host for adopted tool calls that lack one, under certain conditions

**Unclear.** The conditions under which the host is filled in are not stated.

**What**

Claude Code can run tool calls on remote hosts and, after a restart, take over (adopt) calls that were still under way. It now looks up the adopted state first and, under certain conditions, adds the adopted host to the tool call when the call does not name one. It still refuses a call that would otherwise run on this machine. Before, it did its routing check first and never filled in the host.

**Why**

It changes where tool calls are sent after a remote restart.

- Area: Remote Tools
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### Remote session bridge reports read receipts and delivery

The connection to remote sessions can now report when incoming messages are read and delivered, and flush streamed output sooner

**Unclear.** What these new reporting options control for someone using a remote session is not clear.

**What**

The remote bridge is the link between Claude Code and a session running elsewhere. It can now:

- report read receipts for incoming messages, meaning it signals when a message has been received and read

- report message delivery

- send streamed output as soon as the first piece of text arrives

Separately, reporting worktree state over the bridge is still controlled by a remote switch, and is off unless it is switched on remotely.

**Why**

This gives remote sessions better tracking of whether messages actually arrived.

- Flag `tengu_ccr_handoff_metadata`: Off by default, switched on for this account (read for one account on one subscription tier against v2.1.285; this account: on, anonymous baseline: on, compiled default: off) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Sessions
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### New check for when organization policy blocks remote control

Claude Code now treats remote control as blocked by organization policy only when the denial is final and the policy disallows it with markers present

**Unclear.** What uses this check, what the markers are, and whether an oddly valued remote default nearby is related is not clear.

**What**

Claude Code now has a check that decides whether your organization's policy blocks remote control. It answers yes only when all of these hold:

- the policy's verdict is "denied"

- the denial is authoritative, meaning final

- the `allow_remote_control` policy does not allow remote control while the session carries certain markers, which the code calls taints

**Why**

This narrows when remote control counts as blocked by policy. It ties the block to these markers rather than to a denial alone.

- Flag `tengu_org_policy_denied`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: not a boolean we can read) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Remote Control
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### MCP tool calls made from task code can now connect to a server

The link that lets task code call MCP tools can now also connect to a named MCP server, and one callback's errors are logged and ignored

**Unclear.** How this new connect ability is exposed to users is not clear.

**What**

MCP servers are outside programs that give Claude extra tools. Claude Code has a link that lets code run by a task call tools on these servers. That link used to offer only a way to call a tool. It now also offers a way to connect to a named server.

Separately, when a task's background worker wakes up, Claude Code can report the outcome to a piece of code. If that code fails, the error is now logged and ignored rather than passed on.

**Why**

Task code can now ask Claude Code to connect to an MCP server instead of only calling tools on one that is already connected. A failure while reporting a worker's wake-up no longer interrupts the task.

- Flag `tengu_mcp_legacy_sse_fallback`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: MCP
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### Claude Code can now look up your computer's name

Claude Code can now read the computer name, using macOS's own tool, the Windows COMPUTERNAME value, or the hostname elsewhere

**Unclear.** Where the computer name is used is not clear.

**What**

Claude Code can now read your computer's name:

- On macOS it runs `/usr/sbin/scutil --get ComputerName`.

- On Windows it uses `COMPUTERNAME`.

- Elsewhere it uses the machine's hostname.

**Why**

This is probably for labelling your device in remote sessions.

- Area: Sessions
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### The list of core skills now comes from Anthropic's server

Claude Code now takes its list of core skills from a list sent by Anthropic's server, falling back to the last list it received

**Unclear.** What the checks that empty the list look at is not settled.

**What**

Skills are sets of instructions Claude can use for particular tasks. Claude Code keeps a list of core skills. It now takes that list from a policy sent by Anthropic's server, and uses the last list it received when none arrives. Before, it used a list built into Claude Code. When certain checks fail, the list is empty.

**Why**

Which skills count as core can now change without a new version of Claude Code.

- Area: Skills
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### Programs connecting to Claude Code can learn its capabilities right away

The reply to a program's opening connection can now list the capabilities already known at that point, so it need not wait for the first turn

**What**

Programs such as code editors can drive Claude Code through the SDK, a toolkit for connecting to it. When such a program first connects, Claude Code replies to the opening handshake. That reply can now include `capabilities`, listing the capabilities already settled at connect time. It is sent only when the list is not empty.

This list is a subset of the one sent later in the session's start-up message, so a capability missing from it may still arrive there.

**Why**

An editor or other host program can read what Claude Code supports as soon as it connects, before the first turn begins.

- Flag `tengu_ide_rc_auto_enable`: Off by default, switched on for this account (read for one account on one subscription tier against v2.1.285; this account: on, anonymous baseline: on, compiled default: off) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: SDK
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### New internal variable read once and then cleared from the environment

Claude Code now reads `CLAUDE_CODE_RESULT_NONCE` once at startup, keeps it, and removes it from the environment

**Unclear.** What sets this variable and what uses the stored value are not known.

**What**

Claude Code now reads the environment variable `CLAUDE_CODE_RESULT_NONCE` (a named setting a program receives at startup), keeps its value in memory, and immediately removes it from the environment. Programs Claude Code starts afterwards therefore do not see it.

**Why**

This is an internal handshake value, and clearing it keeps it away from anything Claude Code launches.

- Area: Environment Variables
- Names: `CLAUDE_CODE_RESULT_NONCE`
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### Repository-level settings can now be served from a frozen copy

When Claude Code loads settings, it can now reuse a frozen copy of a repository's settings instead of reading them again

**Unclear.** It is not clear when settings get frozen.

**What**

Claude Code reads settings from several places, including the repository you are working in. Before reading and checking each place, it now looks for a frozen copy of that place's settings. If one exists, it uses that copy, together with any errors saved with it.

**Why**

Repository-level settings may stay fixed for the length of a session.

- Area: Settings
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### Connecting an MCP server now fails cleanly if it leaves the session first

If an MCP server is removed before it finishes connecting, the connection attempt now reports a failure

**Unclear.** It is not clear which parts of Claude Code use these new connection steps.

**What**

An MCP server is an outside program that gives Claude extra tools. Claude Code gains new internal ways to look up, wait for and connect an MCP server within a session.

If the server is removed from the session before it finishes connecting, the connection attempt now fails with a message. The message says the server left the session before it connected.

**Why**

Parts of Claude Code, such as plugins or programs built on the SDK, can wait for an MCP server to finish connecting and get a clear result.

- Area: MCP
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### Remote session control recognises a plugin connection request

A list of remote-session request types now includes plugin_connect, and a broken check for tool_register was corrected

**Unclear.** It is not clear what this list of request types controls.

**What**

A remote session is one controlled from somewhere other than the terminal it runs in. Claude Code keeps a list of request types for these sessions that already included `claim_session` and `tool_register`. That list now also includes `plugin_connect`.

The `tool_register` entry was also corrected. It previously compared against a value that was never defined.

**Why**

The change concerns how Claude Code handles requests arriving in a remotely controlled session.

- Area: Sessions
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### Remote sessions hold settings steady while a device is attached

Settings served to a remote session are frozen while a device is attached, and calls are now logged with their outcome

**Unclear.** It is not clear whether this is active yet or what, if anything, a user will see.

**What**

A remote session is one controlled from a device other than the machine it runs on. While a device is attached, the settings served to it are now frozen, and any change in that time is recorded as held rather than applied.

If a call is cancelled before its command starts, anything held for an install is now released, and the message says "the call was stopped before the command started". Claude Code also logs each of these calls with its outcome and attestation details.

**Why**

It changes how settings behave mid-session in remote sessions and how those sessions are monitored.

- Area: Sessions
- Tier: Under the hood
- Useful: 2/5
- Signal: 3/5

### Some built-in skills can now be hidden by an extra filter

Claude Code gained another way to drop bundled skills, keeping only those on a kill switch's survivor list

**Unclear.** It is not clear what condition triggers this filter or what the name check tests.

**What**

Bundled skills are the skills that ship with Claude Code. The filter that decides which ones are available used to either keep them all or keep only those on a kill switch's survivor list. It now has a further case: when a certain condition holds, bundled skills are dropped unless they are on that survivor list or fail a check on their name. Claude Code can now also mark which bundled skills this applies to.

**Why**

In practice, some bundled skills may not be available in some sessions.

- Area: Skills
- Tier: Under the hood
- Useful: 1/5
- Signal: 3/5

### MCP discovery cache now limited to dynamic toolbox servers in cloud sessions

With `MCP_DISCOVERY_CACHE` on, only dynamic toolbox HTTP servers in cloud sessions that send two identifying headers can use the cache

**What**

Claude Code now checks each HTTP MCP server to decide whether it may use the discovery cache. MCP servers are outside programs that give Claude Code extra tools. A server qualifies only when all of these are true:

- `MCP_DISCOVERY_CACHE` is set to true

- the server is a dynamic toolbox server in a Claude Code cloud session

- the server sends both the `x-mcp-server-id` and `x-mcp-server-origin` headers

Any other server is treated as relying on ambient credentials, meaning sign-in details picked up from the surrounding environment, and does not qualify.

**Why**

This only matters in cloud sessions where `MCP_DISCOVERY_CACHE` is set. Everywhere else, the cache is not used for HTTP servers.

- Area: MCP
- Tier: Under the hood
- Useful: 1/5
- Signal: 3/5

### Workflows record whether a review was launched from an account

Workflow runs now carry a marker for reviews launched from an account, tied to `BUGHUNTER_RESULT_RELAY`

**Unclear.** What this marker changes for a user, and how `BUGHUNTER_RESULT_RELAY` is set, are both unclear.

**What**

The information Claude Code keeps about a running workflow now includes a marker for whether it is a review launched from an account, set according to `BUGHUNTER_RESULT_RELAY`.

**Why**

This points to a way of passing the results of an automated bug-hunting review back along to somewhere else.

- Area: Workflows
- Tier: Under the hood
- Useful: 1/5
- Signal: 3/5

### Conversation summaries record which file versions had been read, plus new status values

Compaction now records which artifact versions had been read, error results pass on the API error, and exit status can report ran_nothing

**Unclear.** It is not clear whether any of these changes are visible to someone using Claude Code.

**What**

Compaction is when Claude Code summarizes a long conversation to free up room. It now keeps a record of which versions of artifacts had been read before the summary, and one path clears that record. Several smaller changes came with it:

- Error results now pass along the underlying API error.

- The exit status can now report `ran_nothing`.

- Usage reporting gains a few new fields.

**Why**

These are small changes to reporting and to the messages Claude Code passes between its parts.

- Area: Compaction
- Tier: Under the hood
- Useful: 2/5
- Signal: 2/5

### Sandbox file storage gains directory listing and an optional sync-on-write

The sandbox's file storage on Linux, macOS and Windows can now list directories and optionally flush files to disk as they are created

**Unclear.** What turns the write-through option on is not clear.

**What**

The part of Claude Code that reads and writes files inside its sandbox (a restricted area that limits what commands can touch) has new abilities on Linux, macOS and Windows:

- It can list the contents of a directory.

- It reuses a directory it already has open instead of opening it again.

- It has an option, when creating a file, to write straight through to disk and force the data to be saved immediately.

The code that checks `.gitattributes` files and git directories was also reworked.

**Why**

The write-through option suggests a way to make sure synced files are safely stored on disk rather than held in memory.

- Area: Sandbox
- Tier: Under the hood
- Useful: 2/5
- Signal: 2/5

### Groundwork for registering git worktrees

Claude Code gained a handler that checks a repository and one to four worktree paths, with no known way to reach it yet

**Unclear.** How this handler is reached is not established.

**What**

A git worktree is an extra working copy of the same repository in another folder. Claude Code now has a handler that takes a repository location and one to four worktree paths, checks the repository, and reports a result for each path, such as whether it was kept. Anything else it receives is rejected as not a worktree registration request.

**Why**

This looks like a new way for another program to talk to Claude Code, but nothing you can use yet.

- Area: Worktrees
- Tier: Under the hood
- Useful: 2/5
- Signal: 2/5

### Cleanup now also clears a stored record of model access

Claude Code's cleanup step now clears a stored record about model access as well as the one it already handled

**Unclear.** It is not stated what the model-access file contains or when the cleanup runs.

**What**

Claude Code has a cleanup step that clears out stored files. It used to handle one target, a file of provider check results. It now also handles a second file that stores what Claude Code has learned about access to models. If clearing that file fails, the error log says so.

**Why**

The cleanup now covers more of what Claude Code keeps on disk.

- Area: Models
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Internal reporting on why parts of a request miss the prompt cache

Claude Code now measures and reports internally why the end of a conversation is left out of the prompt cache

**Unclear.** It is not clear where this reporting is sent or whether a switch controls it.

**What**

The prompt cache lets Claude Code reuse parts of a request it has already sent, instead of sending them again in full. When building a request, Claude Code now checks the most recent messages that the cache does not cover. It reports the reasons and an estimate of the tokens involved; a token is a small piece of text. This is internal reporting.

**Why**

It measures how often, and why, requests miss the cache.

- Area: Elsewhere
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Remote Control connections use renamed internal labels

Messages between Remote Control peers now label the local side "device" instead of "laptop", so mixed versions may not connect

**Unclear.** It is not clear whether the other side of the connection was updated to match.

**What**

Remote Control lets you control a Claude Code session from another device. When checking incoming messages, Claude Code now expects the local side to be labelled "device" instead of "laptop". The step that syncs files was also renamed, from pulling a synced folder to a file store worker.

**Why**

Because the label has changed, a newer and an older copy of Claude Code may not work together over Remote Control.

- Area: Remote Control
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Remote sessions record startup timing and artifact comment counts

Remote sessions now measure how long a startup step takes, and queued-message reports count artifact comments

**What**

When the `CLAUDE_CODE_REMOTE` environment variable is set, Claude Code now records how long its agent proxy takes to start. The usage report sent when a queued message is delivered now also counts the comments on artifacts.

**Why**

This is usage reporting only. Nothing you see or do in Claude Code changes.

- Area: Sessions
- Names: `CLAUDE_CODE_REMOTE`
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### AWS client identifies itself as AnthropicAws/JS and lists profile keys

Requests from the AWS client now carry the name AnthropicAws/JS, and it keeps a list of AWS profile sign-in keys

**Unclear.** How the list of profile setting names is used is not known.

**What**

The client Claude Code uses to reach Anthropic models through AWS now sends a user agent of `AnthropicAws/JS`. A user agent is the name a program attaches to each request to say what it is.

It also now holds a list of AWS profile setting names, including `sso_account_id`, `sso_role_name`, `sso_session`, `credential_process` and `web_identity_token_file`.

**Why**

If you read AWS request logs, requests from Claude Code will show up under this name.

- Area: Bedrock
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Usage data gains a fallback credit field and drops an offline dialog report

Usage records now include an empty fallback credit field, and reporting of an offline sync dialog was removed

**Unclear.** It is not clear whether the offline sync dialog itself was removed or what freezing remote settings does.

**What**

Usage records now include a fallback credit field, which is left empty. The list of things Claude Code reports gained an entry for freezing settings served remotely, and lost the entry for a dialog shown when remote sync is offline.

**Why**

These are changes to what Claude Code reports about its own use. They point toward a way of freezing remotely served settings and away from the offline sync dialog.

- Area: Usage
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Access check results are remembered with a status

Claude Code's saved result for one access check now stores a status, and a hit is logged as remembered instead of cached

**Unclear.** It is not clear what statuses other than accessible can be stored.

**What**

Claude Code saves the result of one access check so it does not have to repeat it. That saved result now holds a status rather than a simple yes. When a saved result is reused, the log says `accessible (remembered)` instead of `accessible (cached)`. This check relates to `CLAUDE_CODE_SKIP_MANTLE_AUTH`.

**Why**

The saved result can now record more than a plain success.

- Area: Auth
- Names: `CLAUDE_CODE_SKIP_MANTLE_AUTH`
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### A request can now list the built-in tools

One of Claude Code's requests now includes a list of built-in tools when one is provided

**Unclear.** It is not clear which request carries this list or what supplies it.

**What**

One of the requests Claude Code sends now includes a `builtin_tools` list whenever a list of built-in tools is supplied and not empty.

**Why**

This may let a caller declare or limit the built-in tools available in a session.

- Area: Cloud Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Internal additions for remote sessions

Claude Code gains internal pieces for remote sessions that have no visible effect yet

**Unclear.** How either new piece is used is not known.

**What**

Claude Code adds some internal plumbing for remote sessions, including a new point where content is appended to a session. Nothing visible changes.

**Why**

These look like preparation for how remote sessions are shown, but they do not change anything you can see or do today.

- Area: Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Some requests now name a gateway or API host

One kind of request now says whether it goes to `ccr-gateway` or `api`, depending on the kind of session

**Unclear.** The conditions that pick each host, and which users this reaches, are not known.

**What**

One kind of request Claude Code sends now names the host it is meant for: `ccr-gateway` or `api`, chosen by a check on the current session. Before, it named no host. The code that reads `CLAUDE_GATEWAY_ALLOW_LOOPBACK` also moved again.

**Why**

This may change where some requests go when Claude Code runs in a hosted session.

- Area: Gateway
- Names: `CLAUDE_GATEWAY_ALLOW_LOOPBACK`
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Plugin sync records whether your account's plugin list was refused

Each plugin sync now records whether your account's plugin list was returned or refused

**Unclear.** What uses this record, and whether you see any difference, is not known.

**What**

Claude Code can sync plugins, which are add-ons, from your account. Each sync now records whether the account's plugin list was returned or refused, and whether the latest round returned a list. This happens whether the sync was switched off, refused, found nothing to change or succeeded.

**Why**

Claude Code can now tell "you have no plugins" apart from "the list could not be fetched".

- Area: Plugins
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Cloud sessions check this computer's session records differently

A cloud session running without a window now checks this computer's session records only when a condition allows it

**Unclear.** What decides whether the check runs, and what it means for you, is not known.

**What**

For cloud sessions that run without a window, Claude Code no longer runs a directory-sync lookup. It runs a check of this computer's session records instead, and only when a condition allows it. If the check fails, the log reads "could not check this computer's session records".

**Why**

This appears to take away the way these sessions attached to a directory synced from your computer.

- Area: Cloud Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Turn limits and built-in tool lists are now passed along with session options

When Claude Code passes on session options, it now includes the turn limit and the built-in tool list when they are set

**Unclear.** Which part of Claude Code receives and uses these options is not stated.

**What**

When Claude Code packages up the options for a session to hand them on, it now includes two more when set:

- `max_turns`, the limit on how many turns Claude may take

- `builtin_tools`, the list of built-in tools allowed

Before, only the custom system prompt, spending limit, and allowed and disallowed tool lists were passed along.

**Why**

A turn limit or a built-in tool list you set can now reach the other side, instead of being dropped.

- Area: Cloud Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Cancelling also clears a pending attach that was on hold

Cancelling now also clears an attach that was being held, and a turn now waits for the session to settle before it starts

**Unclear.** It is not clear what the held attach is or which kinds of session this affects.

**What**

When you cancel, Claude Code now also clears an attach that was being held and had not finished yet. Messages from a turn are now added through a single append step. A turn is one round of you sending something and Claude answering. The session also waits for its state to settle around the start of each turn.

**Why**

This may prevent timing problems when a remote session is cancelled while it is still starting up.

- Area: Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Detection of sign-in forwarded over SSH now checks for a placeholder

Claude Code recognises SSH-forwarded sign-in when a socket is set and exactly one credential variable holds the value ssh-placeholder

**Unclear.** It is not clear which part of Claude Code acts on this check.

**What**

The check Claude Code uses to spot a sign-in forwarded over SSH has changed. SSH is a way of working on another computer remotely. It now treats the setup as forwarded when all of these are true:

- `ANTHROPIC_UNIX_SOCKET` is set.

- `ANTHROPIC_AUTH_TOKEN` is not set.

- Exactly one of `CLAUDE_CODE_OAUTH_TOKEN` or `ANTHROPIC_API_KEY` is set to `ssh-placeholder`.

**Why**

This suggests Claude Code, when run over SSH, can hand sign-in off to another machine, with the placeholder value standing in for a real key or token.

- Area: Elsewhere
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### File read and write permission checks gained an earlier check

Before its usual permission checks for reading and writing files, Claude Code now runs an extra check that can return a result early

**Unclear.** What the new check tests and when it applies to reads is not clear.

**What**

When Claude Code checks whether it may read or write a file, it now runs an extra check first. For writes the check always runs. For reads it runs only under a certain condition. If the check matches, Claude Code gives its answer at that point.

**Why**

This could change which file paths ask you for permission or are refused.

- Area: Permissions
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Foundry connections identify themselves with their own name

Requests Claude Code sends through its Foundry connection now identify themselves as `AnthropicFoundry/JS`

**What**

A user agent is the short name a program sends with each request to tell the server what it is. When Claude Code connects through Foundry, it now sends its own user agent, `AnthropicFoundry/JS`.

**Why**

Requests made through Foundry can now be told apart from other traffic, so their usage can be attributed to the Foundry connection.

- Area: Elsewhere
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Resuming after a worker restart now records whether task cleanup timed out

When Claude Code resumes an interrupted turn after a worker restart, cleanup of leftover background task notices is now timed and logged

**Unclear.** The new time limit for this step is not known.

**What**

When a worker restarts partway through a turn, Claude Code can pick that turn back up. A background task is work Claude started that runs on its own, and some can be left behind by the restart. Before continuing, Claude Code sends out the pending notices about those leftover tasks. That step now:

- Records whether it ran out of time.

- Writes a log line and records how long it took.

- Uses a set time limit instead of the previous fixed 20 seconds.

It also reads the lists of running, leftover and finished tasks correctly, where some of them were mixed up before. This path is tied to the `CLAUDE_CODE_RESUME_INTERRUPTED_TURN` environment variable.

**Why**

Problems after a remote worker restart are easier to trace, because the log now shows how long cleanup took and whether it gave up.

- Area: Background Tasks
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Startup telemetry notes early feature-setting fetches on a warm wake

Startup telemetry for waits on remote feature settings now records whether the fetch started early on a warm wake

**Unclear.** It is not clear what the tengu_cobalt_thicket gate itself controls.

**What**

The `tengu_startup_flag_fetch_wait` telemetry event records how long Claude Code waits for remote feature settings at startup. It gains a `warm_wake_early_fetch` field. The data Claude Code prepares at startup also now notes whether a settings fetch made while Claude Code relaunched had finished.

This is tied to a remote gate, `tengu_cobalt_thicket`, which the code treats as on when the server sends nothing. The flag server has returned off for this site's account and for an anonymous check, in readings taken before this release.

**Why**

This adds detail to the telemetry on the startup settings fetch. It does not change what you see.

- Flag `tengu_cobalt_thicket`: Off in both readings (read for one account on one subscription tier against v2.1.285; this account: off, anonymous baseline: off, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Startup
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Remote tool calls handle approvals that arrive after a stop more carefully

When Claude runs tools remotely, an approval that arrives after a stop is now recorded, and the end of the work waits for pending questions

**Unclear.** It is not clear whether this changes anything a user would notice.

**What**

When Claude Code runs tool calls remotely, it now handles stops and permission questions more carefully. A tool call is an action Claude takes, such as running a command. If an approval for a tool call arrives after the stop signal has already been sent, Claude Code now records that it happened. The final step that collects the results is also delayed so it lines up with any permission questions still waiting for an answer.

**Why**

This makes remote tool calls, such as those made in cloud sessions, less likely to go wrong when a stop and an approval cross paths.

- Area: Elsewhere
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Remote tunnel connections send a credential version and watch for lock changes

Remote tunnel connections gain a header carrying a credential version, and a lock check now notices when the lock file has changed

**Unclear.** It is not clear which feature uses the new header and lock check.

**What**

Claude Code now sends a new header, `x-claude-code-tunnel-credential-epoch`, on tunnel connections. A header is a small labelled piece of information sent with a network request, and a tunnel is a connection that links a session to Claude Code running elsewhere. A lock check also now reports that the lock changed when the lock file's last-modified time differs from the one it was watching.

**Why**

This affects how Claude Code handles one copy of a remote or tunnel session taking over from another.

- Area: Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Remote sessions can track when the last full sign-in check happened

Remote sessions gain bookkeeping for the time of the last full sign-in check before model requests, off unless a server value is set

**Unclear.** What uses the recorded time, beyond keeping track of it, is not known.

**What**

Claude Code now has code that records when the last full check of your sign-in happened before it sends requests to the model. It only runs when `CLAUDE_CODE_REMOTE` is set, which marks a session running remotely.

The interval comes from a server-side setting read as a number of seconds. A negative value or anything that is not a number turns it off, and when the server sends nothing the code falls back to off.

**Why**

This is groundwork for an interval the server can set. You will not notice anything unless the server supplies a value.

- Flag `tengu_cobalt_awning`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: not a boolean we can read) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Sessions
- Names: `CLAUDE_CODE_REMOTE`
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### A check for sessions started from claude.ai chat was revised

Claude Code checks for sessions whose `CLAUDE_CODE_SESSION_ORIGIN` is `claude_ai_chat` together with a second condition

**Unclear.** It is unclear what this check controls and what exactly changed in it.

**What**

A session is one running conversation with Claude Code. The `CLAUDE_CODE_SESSION_ORIGIN` environment variable records where a session was started. Claude Code has a check that is true when this variable is `claude_ai_chat` and a second condition also holds. That check was revised in this release.

**Why**

Sessions started from claude.ai chat may get different treatment when both conditions are met.

- Area: Sessions
- Names: `CLAUDE_CODE_SESSION_ORIGIN`
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Google Cloud requests identify themselves with their own user agent

Requests sent through a Google Cloud client now carry the user agent AnthropicGoogleCloud/JS followed by a version

**Unclear.** Which requests go through this Google Cloud client is not stated.

**What**

A user agent is a label sent with each network request that names the program making it. Requests made through a Google Cloud client now send a user agent of the form `AnthropicGoogleCloud/JS` followed by a version number.

**Why**

Traffic sent through Google Cloud, such as Vertex AI, can now be told apart from other traffic.

- Area: Vertex
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Workflow records note whether they came from a review session

Saved workflow references now record whether their session was a review or something else

**Unclear.** What this recorded origin is used for is not stated.

**What**

Saved references to workflow bundles now record the session's origin as either review or other.

**Why**

This is internal record-keeping with no visible change.

- Area: Workflows
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Remote sessions can report their connection status to the server

Remote sessions can now send their connection status to the server, not only a worker status

**Unclear.** It is not clear whether the server does anything with the connection status yet.

**What**

In a remote session, the machine doing the work regularly updates the server about its state. That update can now carry a connection status. Before, it carried only a work period number and, optionally, a worker status.

**Why**

The server can now be told whether a remote session is connected.

- Area: Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Remote sessions track resumes and background tasks

Remote sessions now note when a connection is a resume and report running background tasks

**Unclear.** Where each of these is used, and whether anything gates them, is not clear.

**What**

Several internal pieces of remote sessions (sessions that run Claude Code on another machine) have new fields:

- The connection now records whether it is resuming an earlier session.

- The worker's status snapshot now lists background tasks that are running and ones waiting to finish.

- The streaming settings gain an option to send the first piece of a response right away.

- A request to list a directory is now recognised.

**Why**

These are internal changes to how remote sessions work behind the scenes.

- Area: Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### The sandbox check for `disableNoSandbox` gains an extra condition

A sandbox check can now pass on a new condition before it looks at the `disableNoSandbox` setting

**Unclear.** What the new condition tests, and what passing this check allows, are not clear.

**What**

The sandbox is a restricted area Claude Code can run commands in. One of its checks used to start by looking at the `disableNoSandbox` setting and failing if it was not set. It now first tests a new condition and passes straight away if that condition holds. Only after that does it look at `disableNoSandbox`, the `IS_SANDBOX` environment variable and bubblewrap (a Linux tool used for sandboxing).

**Why**

This could change when Claude Code allows running without a sandbox.

- Area: Sandbox
- Names: `disableNoSandbox`, `IS_SANDBOX`
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Proxied cloud sessions change how they set up certificate trust

The agent proxy now logs where its certificate authority comes from and runs a reconcile step when it comes from the environment

**Unclear.** When the certificate comes from the environment rather than being fetched is not clear.

**What**

In cloud sessions that route traffic through the agent proxy, Claude Code needs a certificate authority (the certificate that lets it trust secure connections through the proxy). At startup it now logs where that certificate came from and records it in its usage data. When the certificate comes from the environment, it runs an extra step to reconcile it. The step that fetches the certificate no longer saves the certificate file itself; that now happens in the code that asked for it.

**Why**

This changes how trust for secure connections is set up in proxied cloud sessions. If it fails, Claude Code logs "[agent-proxy] CA reconcile crashed".

- Area: Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Bridge replies can now mark a resumed session

Replies Claude Code passes along through its bridge now say when the session was resumed

**Unclear.** Nothing yet shows what uses the two new names or whether the lists control what is allowed.

**What**

Claude Code's bridge passes messages between a session and another program. Replies it forwards to control requests now say `resumed: true` when the session was resumed. Separately, names for remote directory listing and for appending to a session were added to internal lists.

**Why**

These look like early groundwork for listing folders remotely and adding to a session from elsewhere.

- Area: Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Remote connection setup retries now use shared timing with random spread

When setting up a remote connection fails, the wait before retrying is now worked out by shared code with 25% random variation

**Unclear.** Whether the actual waits differ from before is not clear.

**What**

When Claude Code fails to set up its remote connection, it waits and tries again, waiting longer after each failure. That wait is now worked out by shared code that adds random variation of up to 25% either way. It is still capped by the maximum retry delay setting. Before, the wait was calculated separately in this one place.

**Why**

In practice this is a minor change to how long retries wait. Random variation spreads retries out so many clients do not all try again at the same moment.

- Area: Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Two startup waits are now timed and logged

Claude Code now logs and measures how long it waits at startup for the model list refresh and MCP policy settings

**What**

Claude Code now logs an event and records how long it waits at startup for two things:

- the refreshed list of available models

- policy settings for MCP servers, which are outside programs Claude Code connects to for extra tools

**Why**

This is for diagnostics only and changes nothing about how Claude Code behaves.

- Area: Startup
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Plugin manifests now explicitly list workflows as a component

The list of parts a plugin can contain now names workflows explicitly

**Unclear.** It is not clear whether workflows were already on the shared list, so plugins may have supported them before.

**What**

A plugin manifest is the file that describes what a plugin contains. The list of component types Claude Code reads from it now names `workflows` directly. Previously that part of the list was copied in from a shared list.

**Why**

Plugins may be able to include workflows.

- Area: Plugins
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Losing sign-in partway through a session counts as a temporary feature-flag failure

When sign-in is lost mid-session, fetching feature settings now treats it as a temporary failure rather than a lasting one

**Unclear.** It is unclear what a user would notice differently when sign-in is lost during a session.

**What**

Claude Code fetches feature flags from `https://api.anthropic.com/`. Feature flags are switches that turn parts of Claude Code on or off remotely. The address now comes from a small lookup step instead of being written in directly, but it is still the same address.

If your sign-in stops working partway through a session, Claude Code now records that and treats the failed flag fetch as a temporary problem rather than a lasting one.

**Why**

This is a small robustness change to how feature flags are fetched. It has no settings of its own and nothing for you to do.

- Area: Internals
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Startup wait for feature settings reorganised and now recorded

How Claude Code decides whether to wait for feature settings at startup was reorganised, and the wait is now recorded

**Unclear.** It is unclear whether how long startup waits has itself changed.

**What**

At startup Claude Code may wait for feature flags, remote switches that turn parts of it on or off. The decision to wait changed: it now comes from shared checks that consider the time available, whether settings are still pending, whether a saved copy is empty, and whether an early fetch was started. The old decision and the recheck for switched-off features remain, and the wait is now recorded in Claude Code's usage data.

**Why**

The main visible difference is in what gets recorded about the startup wait.

- Flag `tengu_auto_mode_config`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: not a boolean we can read) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Internals
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Skills sync reports more timing details

Claude Code's skills sync diagnostics now record how long listing skills takes and, at startup, how long before the first message can go

**What**

Skills are reusable instructions Claude Code can load, and it can sync them at startup. The diagnostic records it keeps about that sync now include how long listing the skills took. At startup they also record how long it took before your first message was allowed through.

**Why**

This changes nothing you see. It measures how much the skills sync delays your first message.

- Area: Skills
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Changed list of startup flags Claude Code singles out

Claude Code now keeps a set of startup flags, including `--print`, `--background` and `--version`, that it treats as a group

**Unclear.** How Claude Code uses this set of flags at startup is not shown.

**What**

Claude Code now defines a set of command-line flags (options you add after `claude` when you start it) that it treats as a group. The set replaces an older piece of code at the same place.

- `-p` and `--print`

- `--bg` and `--background`

- `--routine`

- `-h` and `--help`

- `-v`, `-V` and `--version`

**Why**

These flags start Claude Code without the usual interactive screen or make it print something and exit, so the set likely decides how Claude Code handles startup when one of them is given.

- Area: Startup
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Which attachments become reminders to the model is now decided by their role

Claude Code now uses each attachment's recorded role, not a fixed list, to decide which attachments become system reminders

**Unclear.** It is not clear which attachment types are handled differently now, or what the `accountMemoryWithheld` option does.

**What**

When Claude Code turns attachments into messages for the model, some are passed along as system reminders, short notes the model reads alongside the conversation. It used to leave out a fixed list of attachment types. It now decides using the role recorded on each attachment, and logs a report when that role is unknown or does not match what was expected.

The conversion also gained an `accountMemoryWithheld` option.

**Why**

How some attachments are presented to the model may change as a result.

- Area: Attachments
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Removed and discarded queued commands are tracked more precisely

When a queued command is removed, its log entry now includes an ID, and discarded commands pass through an extra step

**Unclear.** It is not clear what the extra step for discarded commands does.

**What**

Claude Code keeps a queue of commands waiting to run. When a command is removed from it, the log entry now carries an ID, taken from the attachment it came from when there is one. Discarded commands also go through an extra step before the discard is recorded.

**Why**

This makes queued attachments easier to trace.

- Area: Command Queue
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Hook prompts are grouped with other background prompts

Hook prompts are now handled like prompt suggestions and summaries, and a plan-session error message is shown in a different way

**Unclear.** It is not clear what that shared handling of background prompts controls.

**What**

A hook is a command you set up to run automatically at certain points. Prompts that come from hooks are now handled the same way as other background prompts, such as prompt suggestions and away or agent summaries.

Separately, the message "Could not start the session for this plan" is now added to the conversation as a message instead of being set as a status.

**Why**

Prompts from hooks now follow the same rules as Claude Code's other background prompts.

- Area: Hooks
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Results from tools that run side by side now update context after they all finish

When several tools run at the same time, their updates to the conversation context are now applied once all of them have finished

**Unclear.** It is not clear whether this changes anything you can see.

**What**

Some tools are safe to run side by side, at the same time. Claude Code now waits until every running tool has finished, then applies the updates those side-by-side tools made to the conversation's context, meaning the information Claude works from.

**Why**

This changes how results from tools run in parallel update what Claude works from.

- Area: Tools
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Usage data now records how long an API request takes to prepare

Claude Code's usage data now includes how long it took to prepare each request before sending it

**What**

The usage data Claude Code sends about each request to the model now includes how many milliseconds were spent preparing the request before it went out.

**Why**

This only adds a measurement. Nothing about how Claude Code behaves changes.

- Area: Telemetry
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### More detailed timing of session startup

Claude Code now measures how long each part of starting a session takes, for internal diagnostics

**Unclear.** Where these timings are sent is not known.

**What**

Claude Code now times named stages of starting up and running a turn, such as setting up the engine and waiting for MCP servers, the separate programs that add tools. It also adds timings for choosing a model and for waiting on hooks, which are your own commands that run at set points.

**Why**

This is internal measurement with no direct effect on how Claude Code behaves.

- Area: Startup
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Dropped permission answers now record why they were dropped

When a permission answer no longer matches a waiting request, Claude Code now records the reason it was dropped

**What**

Sometimes an answer to a permission prompt, where you allow or deny an action, arrives when no matching request is waiting. Claude Code drops these answers. Before, it did so silently. Now it records the reason, for example:

- `name_mismatch`

- `already_handled`

- `not_unresolved`

It also records when such an answer is accepted and queued.

**Why**

Nothing you see changes, but this helps track down permission answers that go missing in resumed or remote sessions.

- Area: Permissions
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Stricter directory listing on Linux

On Linux, a new directory listing refuses links, unusual paths and folders blocked by read rules, and caps how many entries it returns

**Unclear.** It is not known which feature uses this listing or whether it is switched on.

**What**

On Linux, Claude Code has a new way of listing a folder's contents that is careful about what it opens. It refuses to follow symbolic links, which are shortcuts pointing to another location, and reports a clear error when:

- a link appears in the path

- the path is not written in its standard form

- a read rule denies access to the folder

- the workspace has moved

Very large listings are capped and marked as cut short.

**Why**

Folder listings stay inside the rules you have set for what Claude Code may read.

- Area: Elsewhere
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Session-start hook messages are added to the conversation one at a time

Messages from hooks that run when a session starts are now inserted into the conversation individually instead of by rebuilding the whole list

**Unclear.** It is not clear whether anything looks different to a user.

**What**

A hook is a command you set up to run automatically at a set moment, such as when a session (one conversation with Claude Code) starts. Claude Code now places the messages from those start-up hooks into the conversation one at a time, and keeps track of which hook messages it is placing. Previously it rebuilt the whole conversation list with the hook messages put at the front.

**Why**

This is mostly internal, but it can change when hook messages appear in the conversation.

- Area: Hooks
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### An internal feature now follows a different server-side switch

A feature that followed one server-side switch now follows a differently named one, still on by default when the server sends nothing

**Unclear.** It is not clear what feature this switch controls.

**What**

A piece of Claude Code that used to follow the server-side switch `tengu_woolly_parsnip` now follows `tengu_humble_petal` instead. The old name no longer appears. As before, the feature falls back to on when the server sends nothing.

**Why**

Because the server decides the new switch separately, whether this feature is on for an account can differ from before.

- Flag `tengu_humble_petal`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Flag `tengu_woolly_parsnip`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: not a boolean we can read) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Internals
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Shorter schema description for the cloud session directory_sync field

The schema text for `directory_sync` now points to a separate document instead of explaining its states inline

**What**

The schema for cloud sessions, the formal description of what data a cloud session accepts, used to explain the `directory_sync` field and its states at length. It now refers readers to `docs/cloud-session-block.md` instead.

**Why**

This only affects the descriptions developers see when using the SDK (the toolkit for building on Claude Code). How cloud sessions behave is unchanged.

- Area: Cloud Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Failed domain blocklist checks now record the HTTP status

When the check of a web address against the blocklist fails, Claude Code now records the HTTP status code it got back

**What**

Before fetching a web page, Claude Code checks whether the web address is on a blocklist. When that check itself fails, Claude Code now records the HTTP status code returned, the number a web server sends back such as 404 or 500, along with the error.

**Why**

This makes it easier to diagnose why a web page fetch was blocked.

- Area: Web Fetch
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Clearer warning when a session record lookup fails

A logged warning about searching other project folders for a session's record now says plainly what could not be determined

**What**

When Claude Code fails to check whether another project folder holds the saved record of your current session, the warning it logs has been reworded. It now reads "[sessionRecord] could not tell whether another project folder holds this session's record" instead of "[dirSync] looking for this session's base elsewhere failed".

**Why**

Only the wording of the log message changed; what Claude Code does is the same.

- Area: Cloud Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Queued task notifications arrive together with other events, in time order

Waiting background-task notifications are now merged into the same batch as other checked-for events, sorted by time

**Unclear.** Under what conditions this merging applies is not clear.

**What**

Notifications about tasks that are waiting in the queue are now merged into the same batch as other events Claude Code checks for. They are sorted by time rather than delivered separately.

**Why**

Claude sees task notifications and other events in the order they happened, which can change the order it reacts to them.

- Area: Background Tasks
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Some endpoint environment variables are now treated differently by Claude Code

A check on environment variable names now excludes `ANTHROPIC_UNIX_SOCKET` and `AWS_ENDPOINT_URL` names, and includes `CLAUDE_CODE_API_BASE_URL` only for files

**Unclear.** What this check controls, for example whether it decides which variables are passed on or hidden, is not clear.

**What**

Claude Code has a check that sorts environment variables by name. It now works like this:

- `ANTHROPIC_UNIX_SOCKET` is always excluded.

- Any variable whose name starts with `AWS_ENDPOINT_URL` is always excluded.

- `CLAUDE_CODE_API_BASE_URL` is included only when the check is made for files.

**Why**

These variables point Claude Code or AWS tools at a different server address. If you set any of them, how Claude Code passes them on or handles them may have changed.

- Area: Environment Variables
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Write tool instructions drop a separate warning for files outside your project folder

The Write tool's instructions no longer carry a special warning about files outside the working directory and simply say overwriting an unread file fails

**Unclear.** It is not clear when the removed wording was shown, since the stock Write description captured under this release is unchanged from the previous one, and whether the tool itself behaves differently.

**What**

The Write tool is how Claude creates or replaces a file. Its instructions to Claude used to include a variant saying that overwriting an existing file outside the working directory (the folder Claude Code was started in) would fail if Claude had not read it first. That variant is gone. The instructions now always say that overwriting an existing file Claude has not read will fail, with no mention of where the file lives.

**Why**

The instructions Claude sees for writing files are simpler, with one rule instead of a separate case for files outside your project folder.

- Area: Elsewhere
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Access check now reports an outdated result as accessible

Claude Code's Mantle access check now records an "outdated" result as accessible in its usage data, not just an "accessible" one

**Unclear.** It is not clear what the Mantle probe checks or whether anything besides reporting changes.

**What**

Claude Code runs an access check called the Mantle probe. When it reports the outcome in its usage data, it used to mark access as available only when the result was "accessible". It now does the same when the result is "outdated".

**Why**

An "outdated" result is now counted as access being available in what gets reported. It may also affect what Claude Code does next.

- Area: Auth
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Auto mode records the total time spent waiting on a permission decision

Usage data for auto mode's permission decisions now includes the total wait time, from server wait to the check itself

**What**

Auto mode lets Claude Code decide some permission requests without asking you. The usage data it sends about each decision now includes two total wait times. Each adds together the time spent waiting on the server, the time queued, and the time the decision check took.

**Why**

This only affects usage reporting. Nothing changes in how Claude Code behaves.

- Area: Auto Mode
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Request timing data now includes more of Claude Code's own overhead

Usage data about each request to the model now records extra timing figures about Claude Code's own overhead

**What**

The usage data Claude Code records for each request to the model now includes two extra timing figures about its own overhead. It also reads a value from the server's response.

**Why**

This only affects usage reporting.

- Area: Telemetry
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### A turn limit is now passed along with a request when one is set

When a `maxTurns` turn limit is set, Claude Code now sends it along with a request instead of leaving it out

**Unclear.** Which request now carries the turn limit is not settled.

**What**

A turn is one round of Claude responding and acting. When a `maxTurns` limit on the number of turns is set, Claude Code now includes it in a request it sends. When no limit is set, nothing extra is sent.

**Why**

A turn limit you set is more likely to be respected by the work carried out on the other end of that request, which may include remote sessions.

- Area: Cloud Sessions
- Names: `maxTurns`
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Tool summaries marked as tool-free helper requests, and more detail on denied prompts

Requests that write short summaries of tool use are now marked as tool-free helpers, and usage reports on denials note unanswered prompts

**Unclear.** It is not clear whether marking the summary request as tool-free changes how that request runs, or only how it is labelled.

**What**

Two small internal changes, neither of which changes anything you see or do:

- Tool-use summaries: Claude Code sometimes writes a short summary of the tool calls it has made (a tool call is one action, such as reading a file or running a command). The background request that writes that summary is now labelled as a helper request that uses no tools itself.

- Denied permission prompts: when you are asked to allow a tool call and it ends up denied, the usage data Claude Code reports now records whether that prompt went unanswered.

**Why**

Both changes add detail to how Claude Code labels its own background requests and records denied permission prompts.

- Area: Telemetry
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Two kinds of background hints no longer hide each other

Background hints marked key-only are now de-duplicated separately, so both kinds can appear in one run

**Unclear.** It is not clear what a keyOnly hint shows in the interface.

**What**

When Claude Code gathers the items waiting in its queue, it keeps only one background hint of each kind. Before, a single check removed every background hint after the first. Hints marked `keyOnly` are now counted separately from the others.

**Why**

Both kinds of background hint can now show up in the same run instead of one hiding the other.

- Area: Command Queue
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Claude Code records why a web page fetch was denied or skipped

Claude Code now has named records for each reason a WebFetch source check can be denied, time out or be skipped

**Unclear.** It is not clear whether the web page source check is live.

**What**

WebFetch is the tool Claude uses to read a web page. Claude Code now has a set of named records for how a check on where a fetch comes from turned out. They cover these outcomes:

- Denied

- Timed out

- Skipped because of the current mode

- Skipped because a deny rule applies

- Skipped because the web address is too long

- No question was shown

- A retry was denied

Two other new records appear too: one for cleaning up task files in managed agents, and one that logs the result of looking up a remote session to attach to, along with where the lookup started.

**Why**

This suggests a new check or question about where a WebFetch request comes from.

- Area: Web Fetch
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Windows: Claude Code now looks at git's longpaths setting

On Windows, Claude Code adds a new way to list folders and now includes git's longpaths setting among the git settings it checks

**Unclear.** It is not clear what Claude Code does with the longpaths setting or the new folder-listing function.

**What**

Claude Code's list of git settings it pays attention to now includes `longpaths`, alongside `hookspath` and `untrackedcache`. On Windows, Claude Code can also call a Windows system function, `NtQueryDirectoryFile`, which reads the contents of a folder.

**Why**

On Windows, how Claude Code lists folders and handles very long file paths may change.

- Area: Windows
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Queued commands can now carry an ID in the session log

Records of queued commands in the session log can now include an ID for the command

**Unclear.** It is not clear which parts of Claude Code fill in the command ID.

**What**

When you type a command while Claude is busy, it waits in a queue. The records Claude Code writes about that queue can now include a `commandUuid` field, an ID for the command. The queue also signals a change when it is first marked.

**Why**

The session log, the saved record of a conversation, now holds more detail about queued commands.

- Area: Command Queue
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Claude Code can now record that a --max-turns limit may not be enforced

If the service does not confirm the `--max-turns` limit, Claude Code now marks the limit as lost and assumes none is enforced

**Unclear.** It is unclear in which runs this happens and where you would see it.

**What**

`--max-turns` caps how many turns a run can take. A turn is one round of Claude reading a message and replying.

Claude Code can now mark this option as lost. The reason it records is that the service did not confirm the turn limit, so it assumes no limit is being enforced.

**Why**

A run you started with `--max-turns` may not actually stop at that number. Don't rely on the limit alone when it hasn't been confirmed.

- Area: Headless Mode
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Usage reporting for pinned memory files sends less information

When a memory file is pinned, the usage report no longer reads the file or includes its pinned state

**What**

When a memory file is pinned, Claude Code sends a usage report. That report no longer reads the file. It also no longer includes two details: the file's pinned state and a second status flag.

**Why**

Pinning a memory file sends less detail in its usage data than before.

- Area: Telemetry
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### On WSL, Claude Code now checks whether a path is on a Windows drive

On WSL, Claude Code reads the system's mount list to tell whether a path sits on a Windows-side drive, and file checks compare link counts and file IDs

**Unclear.** It is not clear what Claude Code does differently once it decides a path is on a Windows-side drive.

**What**

WSL (Windows Subsystem for Linux) lets you run Linux on a Windows computer, and from inside it you can reach your Windows drives. Claude Code now works out whether a path lives on one of those Windows-side drives. It does this by reading `/proc/self/mountinfo`, the list Linux keeps of every attached drive and the kind of filesystem each one uses.

A path counts as Windows-side or shared when it sits on a filesystem type such as:

- drvfs, 9p and virtiofs, which WSL uses to share folders

- ntfs, ntfs3, fuseblk, vfat, exfat and msdos, which are Windows disk formats

- cifs, smb3, smbfs, nfs and nfs4, which are network shares

Path validation and file lookups also now compare each file's link count and its internal file ID number. They read these values at full precision, so very large numbers are not rounded off.

**Why**

This affects how Claude Code checks git paths before uploading them to the cloud when you work on WSL or on Windows drives. Files on Windows-side or network drives do not always behave like ordinary Linux files, so Claude Code now handles them as a separate case.

- Area: Windows
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Amazon Bedrock connections pass the API key differently

When connecting to Amazon Bedrock, Claude Code now passes a different API key value and explicitly sends no separate auth token

**Unclear.** It is not clear which setting the API key now comes from, or whether sign-in with `AWS_BEARER_TOKEN_BEDROCK` behaves differently.

**What**

Amazon Bedrock is Amazon's cloud service for running Claude models. When Claude Code sets up its connection to Bedrock, it now takes the API key from a different value, leaves it empty when there is none, and explicitly sets no separate auth token.

**Why**

This may change how Claude Code signs in to Bedrock when you use a bearer token, a key sent with each request.

- Area: Bedrock
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Home-directory recovery telemetry records whether it ran after an announced run

Usage data sent when the home-directory setup recovers now also records whether recovery came after an announced run

**What**

Telemetry is the usage data Claude Code sends back to Anthropic. The `tengu_home_seed_recovery` event, recorded when the setup of a fresh home directory recovers, now includes an extra field, `after_announced_run`.

**Why**

This is only extra telemetry, and nothing changes in how Claude Code behaves for you.

- Area: Telemetry
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Latency telemetry for non-interactive runs now measures each round

Speed data from non-interactive runs now records each round of model requests separately, not just one total per turn

**Unclear.** It is not clear whether this data is sent for every run or only for a sample.

**What**

Telemetry is the usage data Claude Code sends back to Anthropic. A headless run is one without the interactive screen, for example when a script drives Claude Code. Speed data from these runs used to record one overhead figure and one time-to-first-response per turn. It now also records figures for each round of requests within a turn, including:

- `query_round_count`, the number of rounds

- `query_overhead_total_ms`, the total overhead in milliseconds

- `time_to_first_response_first_round_ms`, how long the first round took to start answering

The event recorded after a successful model request also gains an overhead figure and a breakdown of time not covered elsewhere.

**Why**

This lets Anthropic measure delays in turns that make several requests to the model. It does not change how Claude Code behaves for you.

- Area: Telemetry
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### ALLUSERSPROFILE is allowed through, and the Opus 4 output limit table is gone

ALLUSERSPROFILE joins a list of allowed Windows variables, and a table fixing Opus 4 and 4.1 output at 8192 tokens was replaced

**Unclear.** What the variable list governs, and where the Opus 4 limits now come from, is not stated.

**What**

Two small changes:

- `ALLUSERSPROFILE`: this Windows environment variable (a named value the system provides to programs) joins a list of allowed variables that already had `HOMEDRIVE` and `PROGRAMDATA`.

- Opus 4 limits: a built-in table setting 8192 as the token limit for Claude Opus 4 and Opus 4.1 was replaced.

**Why**

The first affects which Windows variables Claude Code passes along. The second affects limits applied to older Opus models.

- Area: Windows
- Names: `ALLUSERSPROFILE`
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### SDK tidies its maxTurns value and tracks errors in turns without a model

In the SDK, the `maxTurns` value is now normalized before use, and errors from turns that end without the model are tracked

**Unclear.** It is not clear how `maxTurns` values are changed by normalizing, or how the tracked errors show up in SDK output.

**What**

The SDK is the library for running Claude Code from your own programs. The `maxTurns` option caps how many turns a run may take, and Claude Code now normalizes this value into a standard form before using it.

The SDK's output stream also now keeps track of two things:

- whether a turn ended without the model being called

- any error text that came before such turns

**Why**

This affects how errors are reported to programs that use the SDK.

- Area: SDK
- Names: `maxTurns`
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Login refused by sign-in provider now recorded apart from organization refusals

When login is refused because the sign-in provider is not allowed, Claude Code records that separately from refusals by the organization

**Unclear.** It is not clear what causes a login to be refused with `provider_not_allowed`.

**What**

When a login is rejected, Claude Code records an analytics event. If the reason given is `provider_not_allowed`, it now records a separate event for that case. Every other refusal is still recorded as the organization not being allowed, as before. Before this change, every refusal was recorded as an organization refusal.

**Why**

A login blocked because of the sign-in provider is now counted separately from one blocked by organization rules.

- Area: Telemetry
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Tool budget now records which shell tool is in use

Claude Code now records the name of the shell tool it is serving when it works out the tool budget

**Unclear.** It is not clear what the recorded shell tool name is used for.

**What**

When Claude Code works out the budget for its tools, it now also records the name of the shell tool being used, the tool that runs commands.

**Why**

This is a minor internal change with no visible effect described.

- Area: Tools
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Claude Code now times how long image resizing takes

Claude Code now measures how long it takes to resize an image and to shrink it to fit a size limit

**Unclear.** It is not clear where these timings are reported.

**What**

When Claude Code resizes an image, it now measures how long the resize takes. It also measures how long it takes to compress the image as a PNG or JPEG so that it fits within a size limit.

**Why**

This is for measurement only and does not change how images are handled.

- Area: Telemetry
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Remote session sync no longer reports a direction

Remote session sync status no longer includes a direction such as "through this computer"

**Unclear.** What displays or uses this direction is not clear.

**What**

Claude Code used to work out a direction for syncing with a remote session (a session running on another machine), including the value "through_this_computer". It now reports no direction in every case.

**Why**

A label in the remote session status may no longer appear.

- Area: Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Cloud file downloads now record why they fail and how long steps take

Downloading files in cloud sessions now records failure reasons and timings for image preparation, writing and hashing

**Unclear.** Where these totals are sent was not established.

**What**

When Claude Code downloads a file for a cloud session and the download fails, it now records a reason instead of failing silently:

- no token

- file too large

- an error

- the web server's status code

It also records how long each step takes when it prepares an image to include inline (resizing, reducing PNG colours, fitting a size budget), writes the file and computes its checksum. It notes when a PNG image is sent as a JPEG.

**Why**

This is usage and diagnostic data only and does not change what you see, but it shows attention on how slowly attachments load in cloud sessions.

- Area: Cloud Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Policy-limit checks record extra credential details

When Claude Code finds your organisation's policy limits unchanged, it now also keeps two credential-related details

**Unclear.** What these details are used for is not established.

**What**

When Claude Code checks your organisation's policy limits and the answer is that nothing has changed, it now also keeps a fingerprint of a credential it sent and a counter tied to tunnel credentials. A way to work out a narrowed list of what was served was also added.

**Why**

This suggests the stored policy limits are being tied to the credentials used to fetch them.

- Area: Managed Settings
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Sandbox keeps extra track of symbolic links

The sandbox now keeps two more lists about symbolic links, though what uses them is not yet visible

**Unclear.** What reads these lists, and so what they change in practice, is not established.

**What**

The sandbox, which limits what commands run by Claude can reach, now keeps two more lists about symbolic links (shortcuts that point to another file or folder): links that might be granted later, and the blocked locations they are checked against.

**Why**

This looks like groundwork for tighter handling of shortcuts that could lead outside what the sandbox allows.

- Area: Sandbox
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Usage data labels model restrictions as coming from an allowlist more often

A check in how Claude Code reports where a model restriction came from now always gives the same answer

**Unclear.** Whether this check is newly disabled in this release is not established.

**What**

When a model restriction is set, Claude Code records where it came from. One check that used to tell the cases apart now always gives the same answer, so the restriction is labelled as coming from an allowlist in more cases.

**Why**

This affects only the usage data Claude Code reports, not which models you can use.

- Area: Telemetry
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Changed rule for which failed downloads are counted

A failed download that was not a prefetch now always counts; a prefetch counts only if data arrived or it was too large

**Unclear.** What this check feeds into, including whether a counted failure means the download is not retried, is not clear.

**What**

Claude Code changed the rule it uses to decide whether a failed download counts. A prefetch is a download started ahead of time, before anything asked for it.

- Downloads that were not a prefetch: any failure now counts. Before, a failure counted only if some data had arrived, the file was too large, or the download stalled.

- Prefetch downloads: a failure counts only if some data had arrived or the file was too large. This is unchanged.

**Why**

Failed downloads that were started on demand are now treated more strictly than before, since every such failure counts rather than only certain kinds.

- Area: Attachments
- Tier: Under the hood
- Useful: 1/5
- Signal: 0/5

### Schema conversion library updated

The bundled zod library was updated, changing how some tool and MCP schemas are converted to and from JSON Schema

**What**

Claude Code includes a library called zod to describe the shape of data, such as the inputs a tool accepts. That library was updated. Converting to JSON Schema, a standard format for describing data, now merges combined schemas, simplifies choices between plain types, and escapes references. Converting from JSON Schema now handles lists with optional items, rules on property names and fixed leading items.

**Why**

The way tool and MCP server input formats are translated may change in small ways.

- Area: Schemas
- Tier: Under the hood
- Useful: 1/5
- Signal: 0/5

### Waking a resumed remote session for restored background work keeps working the same way

The two settings that decide whether a resumed remote session wakes for restored background agents and shells are still read, both falling back to on

**Unclear.** It is not clear whether this build changes how these settings behave at all.

**What**

Claude Code still reads the two remote settings `tengu_ccr_orphan_restore_wake` and `tengu_ccr_orphan_restore_wake_shells`. Both fall back to on unless they are switched off remotely. Only the code around them was reorganized.

**Why**

These settings decide whether a resumed remote session wakes up for background agents and shells that were restored with it. A background agent is a helper Claude runs separately from the main conversation.

- Flag `tengu_ccr_orphan_restore_wake`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Flag `tengu_ccr_orphan_restore_wake_shells`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: on) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Sessions
- Tier: Under the hood
- Useful: 1/5
- Signal: 0/5

### Invalid multipleOf values are reported instead of written into JSON Schema

A multipleOf divisor of zero or a non-finite number now produces an error instead of being written into a JSON Schema

**What**

JSON Schema is a standard format for describing what shape data must have, used for things like tool inputs and outputs. When Claude Code converts to it, a `multipleOf` rule (the value must be a multiple of a number) changed:

- A divisor of zero or a non-finite number is no longer written out; an error says it cannot be represented in JSON Schema.

- A valid divisor is written as its absolute value, so a negative number becomes positive.

Before, the value was written out whatever it was.

**Why**

It stops invalid schemas from being produced for tools and outputs.

- Area: Schemas
- Tier: Under the hood
- Useful: 1/5
- Signal: 0/5

### Sandbox package registry defaults now come from a shared list

The sandbox's default allowed package registries, such as registry.npmjs.org and pypi.org, now come from a shared list

**Unclear.** It is not clear which hosts the shared list contains.

**What**

The sandbox limits which websites commands run by Claude can reach. Its default allowance for package registries, such as `registry.npmjs.org`, `jsr.io`, `pypi.org` and `proxy.golang.org`, used to be written out in place. It now comes from a shared list.

**Why**

The hosts allowed by default may differ from before. If a package install inside the sandbox starts failing to connect, check which registries are allowed.

- Area: Sandbox
- Tier: Under the hood
- Useful: 1/5
- Signal: 0/5

### Handling of the --tools flag reorganized, with the same warnings

The code that reads `--tools` and warns about unknown tool names was moved into one place; the warning text is unchanged

**Unclear.** The typo warning may now be skipped for some names that appear in a particular list, which would be a small behaviour change.

**What**

The `--tools` flag lets you limit which built-in tools Claude can use, such as `"Bash,Edit,Read"`. The code that reads this flag and warns you when an entry matches no built-in tool has been reorganized. The warning messages read the same as before.

**Why**

This is most likely a tidy-up with no visible effect. If you pass `--tools`, you should see the same behaviour and the same warnings.

- Area: Elsewhere
- Names: `--tools`
- Tier: Under the hood
- Useful: 1/5
- Signal: 0/5

### Updated data validation library changes some schema checks

Claude Code ships a newer version of Zod, the library that checks data shapes, with small changes to validation and JSON Schema output

**What**

Zod is the library Claude Code uses to check that data, such as tool inputs and settings, has the expected shape. The copy bundled with Claude Code was updated. Changes include:

- support for objects whose keys are symbols

- skipping keys named `__proto__`

- different handling of optional fields that have default values

- a new way to fall back to a value when a check fails

- changes to JSON Schema output, including tuple limits, number steps, and the `hostname` and `credit_card` string formats

- a message that BigInt defaults cannot be represented in JSON Schema

**Why**

This library checks data throughout Claude Code, so validation can behave slightly differently. Data that was only just accepted or rejected before might now be treated the other way.

- Area: Schemas
- Tier: Under the hood
- Useful: 1/5
- Signal: 0/5

### Bundled validation library can check MAC addresses and credit card numbers

The library Claude Code uses to check data formats now recognises MAC addresses and credit card numbers

**What**

The library Claude Code bundles for checking that data has the right shape can now recognise two more text formats: MAC addresses (the hardware address of a network device) and credit card numbers. Its error messages in other languages gained matching labels, and it gained wording for the size of map-style data.

**Why**

This comes with a library update and has little direct effect on how you use Claude Code.

- Area: Schemas
- Tier: Under the hood
- Useful: 1/5
- Signal: 0/5

### Streaming checks for Anthropic, gateway and AWS providers are shared

Claude Code now handles streamed replies from Anthropic, gateways and Anthropic on AWS through one shared check, and the Bedrock guard is unchanged

**Unclear.** Some requests now also record a timestamp, and what it is used for is not known.

**What**

Claude Code receives Claude's replies as a stream, piece by piece. The checks it runs on those streams for Anthropic's own service, for gateways (a proxy between you and the model provider) and for Anthropic on AWS now go through one shared routine instead of being written out separately in each place.

The Amazon Bedrock check on a streamed reply's content type and the `CLAUDE_CODE_DISABLE_BEDROCK_CONTENT_TYPE_GUARD` variable that turns it off work as before.

**Why**

This can change how streamed replies behave for AWS and gateway setups.

- Area: Elsewhere
- Tier: Under the hood
- Useful: 1/5
- Signal: 0/5

### Current git branch is now read by its full name

Claude Code now reads the current branch by its full git name and strips the refs/heads/ prefix itself

**Unclear.** It is not confirmed why this was changed or whether any reader will see a different branch label.

**What**

Claude Code asks git for the name of the branch you are on. It used to ask for the short name. It now asks for the full name, such as `refs/heads/main`, and then removes the `refs/heads/` part itself before showing it.

**Why**

The full name always points to a branch. So a branch that has the same name as a tag should still be read as the branch.

- Area: Git
- Tier: Under the hood
- Useful: 1/5
- Signal: 0/5

### Internal change to how notices are added to the conversation

Notices such as the slow-worktree hint and the auto mode warning are added to the conversation in a new internal way, with no visible effect

**Unclear.** It is not clear whether the new conversation store is in use yet.

**What**

Claude Code has changed how it adds certain messages to the conversation, including notices, the hint shown when a worktree is slow and the auto mode warning. They now go through a new internal store for conversation messages. Nothing you see changes.

**Why**

This looks like groundwork for a new way of keeping the conversation.

- Area: Terminal UI
- Tier: Under the hood
- Useful: 1/5
- Signal: 0/5

### Bundled data validation library updated

The library Claude Code uses to check that data has the right shape was updated, with little visible effect

**What**

Claude Code includes zod, a library that checks data has the expected shape. The bundled copy was updated. It adds new checking functions, a looser date and time format, and changes to its helpers for IPv6 addresses and network ranges.

**Why**

This is an upgrade of a library Claude Code relies on, and its effect on what you see is minor.

- Area: Schemas
- Tier: Under the hood
- Useful: 1/5
- Signal: 0/5

## Removed

### SDK stream no longer reports progress from tools run inside the REPL tool

Progress updates for tool calls made inside the REPL tool are removed from the SDK stream, subagent activity and background sessions

**Unclear.** Whether the REPL tool itself still ships is not settled.

**What**

The SDK is the kit for building your own programs on top of Claude Code, and it sends a stream of messages as Claude works. Claude Code no longer sends progress events for tool calls made from inside the REPL tool: `tool_progress` messages no longer carry a `repl_call` field naming the inner tool. The same events are also gone from subagent activity tracking and from background sessions.

**Why**

Programs that read the SDK stream and used `repl_call` to show inner-tool progress will stop receiving it.

- Area: SDK
- Names: `repl_call`, `tool_progress`
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Starting a cloud session no longer offers to sync your folder

Launching with `--cloud` no longer runs the folder sync offer, local-change check or upload planning, and a new warning covers failed look-ups

**Unclear.** It is not clear whether the folder sync feature was removed or moved elsewhere in Claude Code.

**What**

Starting a cloud session with `--cloud` (or its deprecated alias `--remote`) no longer runs the preparation steps it used to:

- the offer to sync your local folder into the cloud session

- the check for how your local copy differs from the remote one

- the planning of which files to upload on top

The cloud session no longer receives any folder sync data either. Claude Code also shows a new warning when looking up the remote session returns nothing.

**Why**

If you relied on Claude Code offering to sync your folder when starting a cloud session, that offer does not appear on this path.

- Area: Cloud Sessions
- Names: `--remote`
- Tier: You'll notice
- Useful: 3/5
- Signal: 2/5

### Pasted audio is no longer handled specially, only images are

Claude Code's handling of pasted content no longer treats audio specially; only images keep their own handling

**Unclear.** Whether pasting audio was ever something a user could do is not clear.

**What**

Claude Code used to give pasted audio the same special treatment as pasted images, both when filtering pasted content and when recognising the placeholder that stands in for it in your prompt. The audio checks have been removed, and only images are treated this way now.

**Why**

This suggests audio pasting or voice attachments are being removed or reworked.

- Area: Input
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### The Edit tool lost an alternative description about files outside your folder

Claude Code no longer carries an alternative Edit tool description that told Claude to read files outside the working folder before editing them

**Unclear.** The standard Edit description did not change, so it is unclear which setups ever saw the wording that was removed.

**What**

The Edit tool is how Claude changes a file. Claude reads a description that explains how to use each tool. Claude Code used to carry an alternative version of the Edit tool's description, which told Claude to read a file outside the working folder before editing it. That alternative has been removed. The standard Edit description is unchanged.

**Why**

The Edit instructions are simpler, with one fewer variant.

- Flag `tengu_edit_minimalanchor_jrn`: Not enough to say (read for one account on one subscription tier against v2.1.285; this account: no value returned, anonymous baseline: no value returned, compiled default: off) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
- Area: Elsewhere
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Audio attachments are left out of the message attachment summary

The summary of a message's attachments now lists only images, where before it listed images and audio

**Unclear.** It is not clear what this summary is used for or whether audio is still handled somewhere else.

**What**

When Claude Code builds a summary of the files attached to a message, it now includes only images. Before, it included both images and audio.

A telemetry event for transcribing voice files was also removed.

**Why**

In practice, audio attachments may no longer appear in this summary.

- Area: Attachments
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5

### Audio placeholders are no longer recognised in prompts

Claude Code no longer treats `Audio #N` as a pasted-content placeholder; pasted text, image and truncated text placeholders remain

**Unclear.** It is not clear whether pasting audio was ever available to users.

**What**

When you paste something large into the prompt, Claude Code shows a short placeholder in its place. It no longer recognises `Audio #N` placeholders. It still recognises placeholders for pasted text, images and truncated text.

**Why**

Text that looks like an audio placeholder in your prompt is now left as ordinary text.

- Area: Input
- Tier: You'll notice
- Useful: 1/5
- Signal: 1/5
