Claude Code v2.1.267

366 entries read v2.1.266 → v2.1.267 Markdown Unofficial

This build carries 36 dormant additions, none of them switched on yet. The largest thread is around artifacts: a new asset store for uploading, listing, reading and deleting stored files, an "open" action to display an artifact without publishing it, and an "assets" capability now gated behind a cached per-account roster pulled from the server, alongside a rename of the artifact type catalog's override variable and internal flag. Subagents running in "auto" mode get a new SubagentHandback protocol for reporting back to their parent, but it stays behind an unread flag. Also waiting in the wings: a memory-context prefetch path gated by tengu_misty_anchor, a stable-address scheme for session IDs behind tengu_session_stable_address, a classifier check for plan-mode permissions, and an MCP passthrough-tool pipeline behind adoptMcpOverChannelSwitchOn.

Of 112 shipped changes, a few land as usable features today. The SubagentHandback tool referenced above is now live for delivering a subagent's final report to its parent, and hooks and plugins gain direct access to session usage stats plus the ability to read and write environment variables. A new scripting API, $.session.usage, exposes context, rate-limit and cost data, and the plugin API adds settings.read, env.get and env.set alongside renamed file actions. CLAUDE_CODE_MODEL_CAPABILITIES now lets you manually force model capability flags on or off, and the maxEffortLevel policy setting is enforced client-side, combining a global cap with per-model overrides across settings files.

Among 45 fixes, sending a message to a renamed session now correctly reports the rename instead of silently failing, and the availableModels setting validator no longer checks the wrong internal variables. Live-edit artifacts no longer automatically grant "version" permission alongside "sync," and artifact publish failures now surface directly in the publish panel with a reason. Policy checks for spawning agents and calling tools now restore fields a hook altered rather than just flagging them, and hook path-traversal validation now also covers a hook's "surface" file, not just its module file.

Reading as
Show only
Tier
Flag state
Names
Pick an entry · j / k steps through · rest on a row to peek
46 entries

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.

+New
Use it now
Useful5 Signal4
Group of 6 Subagents Notable

Subagents can hand results back to their parent via a new SubagentHandback tool#

A new SubagentHandback tool lets a subagent deliver its final report directly to the agent that spawned it, with delivery tracked end to end

Details 0 0 Feedback
SubagentHandback

What

  • A new tool, SubagentHandback, lets a subagent send its final report straight to the agent (or main thread) that spawned it, as its one and only last tool call. It isn't a progress-update channel — it can only be called once, requires a non-empty message, and only works when the agent has an active "handback contract" with a recorded recipient.
  • Long reports are compacted or summarized before delivery, and get safety-review framing (blocked/refused/unavailable) attached.
  • The subagent's completion result now carries a handback payload (and a handbackInterim variant), and the finalize step computes whether the handback was sent, flagged, or withheld, appending a message to the result accordingly.
  • Async subagents can now explicitly hand control back to a specific owning agent (tracked as handbackRecipient) rather than only running to completion or being polled.
  • For subagents running in "auto" mode, this mechanism is what actually counts as the final answer: plain trailing text is discarded unless delivered through SubagentHandback. The feature is off by default, controlled by the CLAUDE_CODE_SENDMESSAGE_HANDBACK environment variable or an internal rollout gate.
  • Depending on the handback outcome (send, flagged, or withheld), the step that classifies a sub-agent's final output is skipped or has its text discarded, so results aren't double-processed.

Why This gives subagents a reliable, explicit way to report back to whatever spawned them, instead of relying on trailing text that might get lost, mis-parsed, or double-classified — useful for orchestration flows where a parent agent needs a clean, single final report from a subagent it dispatched.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful5 Signal5
SDK Notable unclear

New process.env read/write primitive for tools#

New internal helpers let Claude read and set process environment variables

Unclear Whether this is already exposed as a usable tool, or is unreleased backing code, is not stated.

Details 0 0 Feedback
process.env
What

New internal functions read a process.env variable by name, validate a name/value pair before writing (rejecting names containing = or NUL bytes, and rejecting non-string values), and set or delete a process.env entry (deleting it when the value given is undefined). This looks like the backing implementation for a capability that lets Claude get or set environment variables for the current process.

Why

If exposed as a tool, this would let Claude inspect or change environment variables directly rather than only through shell commands, with basic validation to reject malformed names or values.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful4 Signal4
Group of 6 Plugin UI

Plugin/hook capability API expands: renamed fs actions, new env/settings/session capabilities, and a terminal UI surface system#

Plugins and hooks gain renamed filesystem actions, new capabilities for settings/env/session usage, stricter validation, and a new terminal UI system

Details 0 0 Feedback
surface

What

  • The plugin capability actions fs.readFile, fs.writeFile, and fs.listDir are renamed to fs.read, fs.write, and fs.list (including the underlying IPC event name).
  • Plugins and hooks gain four new capabilities: session.usage (read session usage stats), settings.read (read merged settings from a named source), and env.get/env.set (read and write environment variables) — all fully wired with permission checks and handlers.
  • New validation guards these and other hook APIs: a hook's on('event') matcher can't be a nested object matched against a primitive; next(e) handlers for env.get/env.set can only change the value's data, not other fields; and ui.message calls can't rewrite fields like surface, component, requestId, element, or module (only data may change), and are rejected if their serialized data is too deeply nested or too large.
  • A large new subsystem lets plugins mount custom terminal UI elements ("Clients") declared via a surface field in hooks.json. It handles rendering, mounting/unmounting, resizing, mouse and keyboard input, hover/focus state, a row-budget that can reject renders pushing a dialog over its row limit, and message dispatch between the plugin and its UI.

Why Together these give plugins and hooks a broader, more capable API — access to environment variables, settings, and session usage, plus the ability to draw real interactive terminal UI — while the renamed, more consistent action names and new validation keep that expanded surface from letting a plugin corrupt data it shouldn't touch or send oversized payloads.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful5 Signal3
Group of 4 Model Capabilities Notable

Model capability flags can now be explicitly forced on or off#

Claude Code's per-model capability checks now honor explicit true/false overrides, including via a new CLAUDE_CODE_MODEL_CAPABILITIES env var

Details 0 0 Feedback

What

  • The shared model-capability gate helper (dm, formerly Rm) now distinguishes an explicit false result from an undefined/unset one. Previously only a falsy or undefined answer fell through to the same "no answer" fallback; now an explicit false immediately disables the feature.
  • This affects checks such as mid_conv_system, adaptive_thinking, rejects_disabled_thinking, context_management, fast_mode, lean_prompt, thrifty_sonic, mid_conv_tool_change, and refusal_fallback, which now short-circuit to "off" as soon as the gate explicitly says false, instead of falling back to matching on model-name strings like opus-4-8 or claude-mythos-5.
  • The fable_5_mitigations gate similarly now respects an explicit false for the claude-mythos-5 model, where before mitigations were always applied for that model regardless of the gate value.
  • A new CLAUDE_CODE_MODEL_CAPABILITIES environment variable lets you override these capability flags directly, as a semicolon-separated list of rules in the form modelPattern=flag1,-flag2,..., with a trailing * wildcard supported when matching model IDs.

Why Makes model-specific behavior more predictable: capability gates can now definitively turn a feature off rather than silently falling back to guesswork based on the model's name, and the new env var gives a direct way to override these flags.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

In dev
Nothing to try yet
Useful3 Signal4
Group of 2 Artifacts

Artifact 'assets' capability now driven by a cached org roster#

Whether the artifact tool exposes an 'assets' action is now decided by a cached per-org capability roster fetched from the server

Feature flag
tengu_cobalt_plinth_fennel Off in both readings

The flag server returned off for the account this site reads and for the anonymous baseline. A reading of off cannot rule out a rollout these two readings sit outside of.

This account: off · anonymous baseline: off · compiled default in v2.1.267: off

Read once, for one account on one subscription tier, against v2.1.267. It isn't a statement about your account. What a flag value here can and cannot tell you

Details 0 0 Feedback

What

  • A new roster subsystem fetches and disk-caches a per-account/org capabilities roster, used to decide whether the artifact tool schema exposes the "assets" action. The CLAUDE_CODE_ARTIFACT_ASSETS environment variable overrides this entirely; otherwise it falls back to an internal flag (gated by tengu_cobalt_plinth_fennel, off by default), and finally to whatever the cached or live roster from the server reports.
  • After an account switch or login, Claude Code now automatically kicks off an async refresh of this artifact-capability roster.

Why

This keeps the artifact tool's available actions in sync with what an account or organization is actually entitled to, refreshing automatically after login rather than relying on stale cached data.

In dev
Nothing to try yet
Useful3 Signal4
Group of 2 Memory no docs found

Memory-context prefetch added, gated off by default#

A new background 'memory context' prefetch path exists but stays off unless enabled by feature gate or a new env var

Feature flag
tengu_misty_anchor Off in both readings

The flag server returned off for the account this site reads and for the anonymous baseline. A reading of off cannot rule out a rollout these two readings sit outside of.

This account: off · anonymous baseline: off · compiled default in v2.1.267: off

Read once, for one account on one subscription tier, against v2.1.267. It isn't a statement about your account. What a flag value here can and cannot tell you

Details 0 0 Feedback
SYSTEM_REMINDER_MEMORY_CONTEXT

What

  • A new memory-context prefetch/fetch path was added that fires performance timers (memory_context_fetch_ms, memory_context_boot_spillover_ms). It requires either CLAUDE_CODE_ENTRYPOINT being remote_cowork/remote_cowork_trigger, or a new SYSTEM_REMINDER_MEMORY_CONTEXT environment variable, plus an account/session check, plus the tengu_misty_anchor feature gate.
  • SYSTEM_REMINDER_MEMORY_CONTEXT was also added to the lists of environment variables that get passed through/preserved for sessions, and setting it can force-enable the memory-context fetch even when tengu_misty_anchor would otherwise be off.

Why The feature is built but gated off by default (tengu_misty_anchor), so most users won't see any behavior change yet; the env var provides a way to force it on for testing.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

In dev
Nothing to try yet
Useful5 Signal4
Artifacts Notable

Artifacts gain an asset store (upload/list/read/delete)#

Artifacts with an assets capability now support uploading, listing, reading, and deleting stored files

Details 0 0 Feedback
assets
What

The Artifact tool now documents four new actions for artifacts whose page declares an assets capability:

  • upload_asset — push a local file into the artifact's asset store
  • list_assets — enumerate what's stored
  • read_asset — pull a stored file back down to disk
  • delete_asset — remove a stored file
Why

This gives an artifact its own persistent file storage that Claude can manage directly, useful for artifacts that need to keep data, uploads, or generated files around between sessions rather than only living in the page itself.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful4 Signal3
Group of 2 Artifacts Notable

Artifact republish supports a 'deadline' to force old viewers to stop#

Republishing an artifact can set a deadline telling older open copies of it when to stop, plus a reserved preflight.js hook

Details 0 0 Feedback
deadline

What

  • Republishing an artifact now accepts an optional deadline value of now, 15m, 1h, 24h, 7d, or an ISO UTC timestamp, telling already-open older-version viewers of the artifact when they must stop. Published changes already reach open viewers automatically; this field is only for forcing old versions off. Multiple deadline declarations accumulate, and the earliest one wins.
  • The file name preflight.js at an artifact's root is now reserved: it runs against open pages when the artifact is published, and it must be an ES module of 8 KiB or less with a default-export function, or the publish is refused.

Why

This lets a publisher forcibly retire stale open copies of a republished artifact instead of leaving them running indefinitely, and it reserves a hook point (preflight.js) for publish-time checks.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful4 Signal3
Group of 2 Compaction no docs found

Compaction can now be intercepted and rewritten by a session.compact plugin hook#

A new session.compact hook lets plugins intercept and replace Claude Code's conversation-compaction output

Details 0 0 Feedback
session.compact

What Both live/reactive compaction and precomputed/background compaction now route through a shared step that runs the session.compact plugin hook before falling back to Claude Code's built-in compactor. A compaction hook must return either { messages } (replacement messages) or { skip: reason }. If a hook supplies replacement messages, compaction uses those directly instead of summarizing normally; if a hook rewrites content after a background compaction already ran, the stale precomputed result is discarded.

Why Gives plugins a supported way to control what happens when a conversation gets compacted (summarized to save space), instead of only being able to observe it, useful for plugins that want custom summarization logic or need to preserve specific content.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful4 Signal3
Group of 2 Self-Hosted Runner Notable

Self-hosted runners gain a git-proxy opt-in and git-routing flags#

Self-hosted runner CLI adds --use-anthropic-git-proxy plus git remote rewriting and drain-wait flags

Details 0 0 Feedback

What

  • A new --use-anthropic-git-proxy flag lets a self-hosted runner opt into having Anthropic manage git authentication server-side (using the session creator's GitHub OAuth token, or the org's GitHub App token for bot/agent sessions) instead of configuring git auth on the runner itself. Registration logs "Registering as opted in to Anthropic-managed git (--use-anthropic-git-proxy)"; if the server can't provide governed git for a session despite the flag, a warning explains the fallback to the legacy clone-URL proxy (deprecated).
  • New --git-ssh-rewrite <host> and --git-host-rewrite <f>=<t> flags let a runner rewrite git remote URLs, useful for SSH-only hosts or split-horizon DNS setups.
  • The SELF_HOSTED_RUNNER_DRAIN_WAIT_MS environment variable (default 0, meaning SIGTERM is sent immediately; max 86400) controls how long a runner waits before shutting down, with --drain-wait-bg-tasks-sec documented as a deprecated alias.

Why

This gives self-hosted runner operators more control over how git authentication and remote URLs are handled, and how long a runner waits for background tasks before terminating.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful4 Signal3
Group of 2 Internals Notable no docs found

New CCR_AGENT_PROXY_NO_PROXY_LOCAL_ONLY env var narrows proxy bypass for the agent proxy#

A new CCR_AGENT_PROXY_NO_PROXY_LOCAL_ONLY env var restricts proxy bypass to local addresses only

Details 0 0 Feedback
CCR_AGENT_PROXY_NO_PROXY_LOCAL_ONLY

What

  • A new environment variable, CCR_AGENT_PROXY_NO_PROXY_LOCAL_ONLY, is now read into the agent-proxy's initialization config.
  • When set, it selects a narrower noProxy list that bypasses the proxy only for local addresses, instead of the broader lists used previously, and it also affects whether the CA (certificate authority) bundle is considered to cover every host.
  • New no-proxy host-range lists were added near the agent-proxy activation code, including one covering link-local and cluster-local addresses only, though that particular list isn't yet referenced by the selection logic.

Why This gives more control over which hosts bypass the proxy when using the agent proxy, letting users restrict the bypass to local-only addresses in stricter network setups.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful4 Signal3
Group of 3 Effort Notable unclear

New maxEffortLevel setting caps reasoning effort#

Administrators can now cap the maximum reasoning-effort level, overall or per model, and Claude Code enforces it against any effort request

Unclear What secDefault itself configures is not stated in the finding.

Details 0 0 Feedback
maxEffortLevel

What

  • A new managed-settings key, maxEffortLevel, lets an administrator restrict the maximum reasoning-effort level allowed.
  • The effective cap is computed by combining a top-level maxEffortLevel with any per-model modelSettings.<model>.maxEffortLevel overrides across all loaded settings files, taking the lowest applicable value.
  • Any explicit effort request, from /effort, /model, the --effort flag, the CLAUDE_CODE_EFFORT_LEVEL environment variable, or a model's default, is clamped to this cap.
  • Effort-level resolution (whether effort, max_effort, or xhigh_effort apply for a given model) now checks this new setting first, before falling back to the older logic based on the model's id.

Why This lets organizations enforce a ceiling on how much reasoning effort, and therefore cost and latency, Claude Code can use, regardless of what an individual user or model requests.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
You'll notice
Useful4 Signal3
Group of 3 Plugins Security no docs found

New 'Security default' hooks module locks plugins out of org hook/settings/tool policy on managed orgs#

A built-in 'Security default' hooks module now keeps user-installed plugins from touching an org's classic hooks, settings, and tool policy

Details 0 0 Feedback
secDefaultenabledFromPolicyOnly

What

  • A new built-in, policy-only hooks module called "Security default" (secDefault) is now seated outermost in the hook chain on managed machines belonging to Team or Enterprise orgs, unless a managed policy explicitly sets secDefault: false.
  • It intercepts tool.register, tool.list, agent.offer/spawn, tool.describe/command.describe, and more, blocking non-core-tier plugins from reading policy settings or adding MCP servers outside the allowedMcpServers/managedMcpServers policy (with a deny message like "allowedMcpServers (managed): plugins outside policy may not add tools").
  • It's registered with enabledFromTrustedSettingsOnly and enabledFromPolicyOnly both set, and only activates when the outermost hook slot already includes a specific built-in id; plugin enablement in general now supports an enabledFromPolicyOnly mode read only from policy settings.

Why Keeps an organization's classic hooks, prompt content, settings, and tool policy safe from plugins that individual users install, without the module adding any policy of its own, important for managed/enterprise deployments where admins need assurance that installed plugins can't override central controls.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful4 Signal4
Hooks Notable no docs found unclear

Hooks engine gains session.compact, session.receive, ui.resolve event contracts#

The plugin hooks system adds validated event types for session compaction, session receive, and UI resolution

Unclear What a session.receive or ui.resolve hook actually lets a plugin do isn't detailed beyond the validation rules.

Details 0 0 Feedback
session.compactsession.receiveui.resolve
What

Claude Code's plugin hooks engine now validates three new kinds of hook events:

A hook for session.compact must now return either { messages } (a replacement set of messages) or { skip: reason } to opt out, and the shape of messages is checked. Separately, a provider field on the arguments passed to tool.describe, command.describe and agent.offer hooks is now fixed and can no longer be overridden by a hook.

Why

These changes give plugins defined, checked contracts for reacting to compaction and other events, and stop a hook from spoofing which provider a tool or command claims to come from.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful4 Signal4
Plugin UI

New in-process plugin UI "surface" runtime (Box/Text/Button/Input/Select/Link/Code)#

Plugins get a sandboxed UI toolkit with Box, Text, Button, Input, Select, Link, and Code elements

Details 0 0 Feedback
BoxTextButtonInputSelect
What

A new system lets plugins build interactive UI "surfaces" that run inside an isolated Node.js sandbox (a vm context, meaning the plugin's code runs separately from the main app for safety). It provides a fixed set of building blocks: Box, Text, Button, Input, Select, Link, and Code, along with state management, timers, and handlers for pointer and keyboard events. Whatever UI tree the plugin builds gets converted to plain JSON before it's sent to the host application, and is limited by strict budgets on node count, nesting depth, character length, and value size.

Why

This gives plugin developers a safe, constrained way to build rich interactive interfaces without letting plugin code run unchecked in the main application or send oversized data back to it.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful4 Signal4
Plugins unclear

New plugin execution environment kind: "native"#

Plugins gain a new "native" execution environment alongside the existing same-thread one

Unclear The finding doesn't say what kinds of plugins or use cases the native environment is meant to support.

Details 0 0 Feedback
nativeui.resolve
What

Claude Code plugins run inside an execution environment. Previously there was one kind, running on the same thread as the app. Now there's a second kind called native, which runs on a native host process instead. Alongside it, a new ui.resolve remote call lets code wait for an environment's UI element tables to finish resolving, with a timeout so it doesn't hang forever.

Why

This expands where and how plugin code can execute, likely to support plugins that need to run outside the main app thread. The ui.resolve addition builds on the existing ui.resolve hook point, which was previously noted as one of the events a plugin module may hook into.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful5 Signal3
Insights Notable

New /insights (or similar) command gated by allow_insights policy#

New /insights command, gated by an allow_insights policy, generates a report on your Claude Code usage

Details 0 0 Feedback
/insightsallow_insights
What

A new /insights command generates an HTML report analyzing your recent Claude Code sessions on this machine: which projects you work in, how you use Claude Code, where things go wrong, and features to try. It's controlled by a policy called allow_insights and is not available in cloud sessions.

Why

This gives users a way to review their own usage patterns and discover underused features, while administrators can control access to it via the allow_insights policy.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful5 Signal3
SDK Notable

New scriptable session-usage API ($.session.usage)#

A new scripting API, $.session.usage, exposes context, rate-limit, and cost data to plugins and scripts

Details 0 0 Feedback
What

A new function called $.session.usage is now available for scripting and plugin code. It returns details about the current session, including:

  • context-window usage (how many tokens are used, the size of the window, and the percentage full)
  • rate-limit windows (five_hour, seven_day, and spend_limit), each with a percent used and when it resets
  • the current session's cost in US dollars
Why

This lets plugins and other scripts built on top of Claude Code read the same usage and cost figures Claude Code itself tracks, instead of guessing or parsing them from elsewhere. That makes it possible to build custom status lines, dashboards, or automations that react to how close a session is to its context or rate limits.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful3 Signal3
Group of 4 Hooks

Managed settings gain prependPlugins/appendPlugins, admin-only plugin ordering#

Administrators can now force plugins to load first or last via managed prependPlugins/appendPlugins settings that users can't override

Details 0 0 Feedback

What

  • Two new managed-settings keys, prependPlugins and appendPlugins, let an administrator force certain plugins to always load first or last; malformed values fall back to an empty list.
  • Settings loaded from user-writable files (not managed/administrator settings) can no longer set secDefault, prependPlugins, or appendPlugins, and can no longer use enabledPlugins to enable a plugin or name a built-in plugin — these are stripped with a warning as administrator-only.
  • If a plugin is listed in both prependPlugins and appendPlugins, it's resolved by prepending it, with a warning; a warning is also shown when a user setting is overridden ("shadowed") by managed policy.
  • Each plugin's hooks module is now resolved to a "tier" (prepend, builtin, user, or append) based on these managed lists, and calls like next.to("<tier>") inside a plugin's hooks are validated against that tier, throwing if the plugin isn't managed or the named tier isn't actually next in the chain.

Why This gives organizations a way to guarantee that certain plugins, such as security or compliance hooks, always run first or last, and prevents individual users from overriding that ordering or granting themselves extra plugin access through local settings files.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

In dev
Nothing to try yet
Useful3 Signal4
Artifacts no docs found

Artifact feature: env var and gate renamed (artifact DB -> artifact type catalog)#

The artifact type catalog's override variable and internal flag were renamed

Feature flag
tengu_cobalt_plinth_larch Off in both readings

The flag server returned off for the account this site reads and for the anonymous baseline. A reading of off cannot rule out a rollout these two readings sit outside of.

This account: off · anonymous baseline: off · compiled default in v2.1.267: not a boolean we can read

tengu_umber_lattice On for this account, and not off by default

The flag server returned on for the one account this site reads, and nothing in this release compiles it off by default. The compiled default is shown below, and says which it is when we cannot read one: a fifth of gates compile in a string or a number rather than on or off, and most published releases have no gate table behind them at all. No client can see what the server returns for your account.

This account: on · anonymous baseline: on · compiled default in v2.1.267: not a boolean we can read

Read once, for one account on one subscription tier, against v2.1.267. It isn't a statement about your account. What a flag value here can and cannot tell you

Details 0 0 Feedback
CLAUDE_CODE_ARTIFACT_TYPE_CATALOG
What

An internal feature related to Artifacts (browsing published artifact types) had its override environment variable and internal feature flag renamed: CLAUDE_CODE_ARTIFACT_DB became CLAUDE_CODE_ARTIFACT_TYPE_CATALOG, and the underlying flag went from tengu_umber_lattice to tengu_cobalt_plinth_larch. Both still default to off unless a value is supplied.

Why

This is a naming cleanup for a feature that lets Claude browse and describe published artifact types to start new work from; the rename doesn't change whether the feature is on, only what it's called internally.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful3 Signal4
Hooks unclear

Hooks runtime dispatch generalized beyond same-thread execution#

Hooks runtime dispatch reworked to support more than same-thread execution

Unclear The finding shows the dispatch mechanism was generalized but does not say what new execution context or use case it now supports.

Details 0 0 Feedback
What

The internal function that builds the runtime interface for hook modules (custom code that runs at points in Claude Code) was changed from a single implementation built only for running in the same thread into a generic one. It now takes parameters for the kind of dispatch, how to copy and answer data, and how to create an environment, plus a new lookup surface and tracking of in-flight dispatches including their working directory and whether a turn is held.

Why

This generalizes how hooks are dispatched, laying groundwork for hooks to run in contexts other than the same thread, though the finding does not specify what new execution mode this enables.

+New
Use it now
Useful4 Signal2
Group of 4 Slash Commands Notable

New push offer to connect GitHub to claude.ai after a git push#

After pushing to GitHub, Claude Code can now offer to connect GitHub to claude.ai so you can keep working on the repo remotely

Details 0 0 Feedback
/web-setup

What

  • After a git push or pull-request creation, Claude Code can now show a prompt: "Pushed to GitHub. Connect GitHub to claude.ai so you can work on this repo even when this machine is offline?"
  • A new internal hook inspects the result of the git operation and decides whether to offer the connection, tracking dismissal state (whether you dismissed it forever, how many times it's been shown, and when) so it doesn't nag repeatedly.
  • A companion /web-setup banner appears above the prompt input, which runs the /web-setup slash command when accepted.
  • The banner area now coordinates with other UI elements, such as the feedback notice card, that may also want to occupy that space, so only one is shown at a time.
  • The whole feature is currently dark-launched, off by default behind an internal flag.

Why This nudges users toward setting up claude.ai's GitHub integration right after a relevant action (pushing code), so they can keep working on a repository from claude.ai even when their local machine is offline, without needing to discover the feature on their own.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful4 Signal3
Hooks

Function-hook execution now supports a per-hook .catch handler and 'fail closed' recovery#

Hooks can now supply a .catch handler to recover instead of failing closed

Details 0 0 Feedback
.catch
What

When a hook (custom code that runs at specific points in Claude Code) throws an error or times out, the dispatch system now checks whether the hook supplied its own .catch handler. If it did, a new recovery path runs that handler and can use the answer it returns as the hook's final result, rather than simply failing. This is logged as "hook failed closed: ... (its .catch answered)" and reported through telemetry with a reason and a flag for whether the hook overran its time limit. A new "caught" outcome is now recorded for hooks handled this way.

Why

This lets hook authors define custom recovery behavior for failures or timeouts instead of the hook simply failing closed, giving more control over how errors in custom hooks are handled.

+New
Use it now
Useful4 Signal3
Hooks unclear

Hooks plugin API gains a 'to' messaging primitive, 'surface' concept, and table resolution#

Hooks/plugin runtime gains a 'to' messaging function, a 'surface' concept, and table-resolution requests

Unclear What concrete new plugin/hook capabilities this enables, and what a 'surface' or 'table' represents here, isn't explained.

Details 0 0 Feedback
tosurface
What

Claude Code's hooks and plugin runtime API has been expanded in several related ways:

  • Hook manifests can now declare a surface, carried alongside each module's specification
  • The internal hook-call wrapper gains a to function and a caught handler, in addition to its existing call/signal/event/origin/trace parts
  • A new resolveTables/resolve message type lets a hooks worker request table resolution and get back a resolved or resolve_error response
  • Internal environment-state tracking gained new framing and resolving maps
  • Error text shown to plugin authors now references next.to always next.to(e, "<tier>")
Why

This extends what a hook or plugin can do at runtime, including sending messages via to and resolving tables, though the finding does not describe the specific new capabilities these enable for plugin authors.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful4 Signal3
MCP Notable no docs found unclear

MCP tool declarations gain hints and richer annotation limits (search_hint, always_load, max_result_size_chars, requires_user_interaction)#

MCP tools can now declare hints like search_hint, always_load, and a maximum result size, alongside existing annotations

Unclear What Claude Code does with each hint once declared isn't shown, only that the schema now accepts them.

Details 0 0 Feedback
search_hintalways_loadmax_result_size_charsrequires_user_interaction
What

Tools provided through MCP (Model Context Protocol, the standard Claude Code uses to talk to external tool servers) can now include a hints object when they declare themselves, with the fields:

  • search_hint
  • always_load
  • max_result_size_chars
  • requires_user_interaction

These sit alongside the existing annotations like title, readOnlyHint, destructiveHint and openWorldHint. Tool names must still contain a double underscore (__) and pass a name-validity check.

Why

These hints give an MCP server more ways to tell Claude Code how a tool should be surfaced and used, such as whether it should always be loaded or how large a result it's allowed to return.

+New
Use it now
Useful4 Signal3
SDK Notable no docs found

New agent.list-style listing of local agents and in-process teammates#

Internal listing of local agents and in-process teammates gains richer detail

Details 0 0 Feedback
agent.list
What

A new internal function enumerates every entry in the task registry (the internal bookkeeping list of running agents) and classifies each one as either a local_agent (with its id, type, and parent agent id) or an in_process_teammate (with its id and name). The resulting list also includes each entry's status, which agent spawned it, and a resolved display name. This appears to be the implementation behind an agent.list-style listing.

Why

This gives a more complete and structured view of what agents and teammates are currently active, which matters for anything that needs to inspect or manage multiple running agents at once.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful4 Signal3
Plugin UI Notable

New hover styling support for plugin-rendered Box/Text/Button UI#

Plugin-drawn boxes, text and buttons can now define hover styles, and a new Client element renders client-side modules

Details 0 0 Feedback
hoverClient
What

Plugins that draw their own UI using Box, Text and Button elements can now specify a hover style that swaps in different colors or layout while the element is hovered, restricted to an allow-list of properties specific to each element type (for example borderStyle and backgroundColor for a Box). Separately, a new Client element type lets a plugin render a client-side module with its own export name, props, width, height and flex-grow behavior.

Why

These give plugin authors more expressive, interactive UI, letting elements react to hovering and letting more complex client-rendered components appear inside a plugin's interface.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful4 Signal3
Compaction Notable no docs found

Plugins can now trigger manual conversation compaction#

Plugins can now trigger manual conversation compaction with custom instructions

Details 0 0 Feedback
compactConversation
What

A new compactConversation method lets a plugin ask Claude Code to compact (summarize and shrink) the current conversation, supplying its own custom instructions for how to do it. It's blocked for thin-client and remote sessions and while a turn is already in progress, and requests made this way are tagged with trigger: "plugin" for telemetry.

Why

This gives plugin authors a way to proactively manage conversation length instead of waiting for automatic compaction, while the guardrails and tagging keep it from interfering with active turns or unsupported session types.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

In dev
Nothing to try yet
Useful4 Signal3
Artifacts no docs found

New artifact tool action: "open"#

Artifacts tool gains an "open" action to display an existing artifact without publishing it

Details 0 0 Feedback
action: "open"
What

The artifacts tool now supports an action: "open", which shows the user an existing artifact by its url without creating or publishing anything new. This is gated behind a schema flag, and the tool's prompt now includes a paragraph explaining how to use it: pass action: "open" along with the artifact's url.

Why

This gives Claude a way to surface an existing artifact to the user on its own, separate from the act of publishing or editing one.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful3 Signal2
Group of 6 Artifacts no docs found

write_db batch writes support per-entry version pins (if_version)#

Batch writes to an artifact's database can now pin individual entries to expected versions, with clearer conflict errors

Details 0 0 Feedback
ifVersion

What

  • write_db batch operations can now include an if_version on each entry, individually pinning specific documents to an expected version so the whole batch fails if any pinned document changed since it was read.
  • A new delete db_op is added to write_db, working alongside set, update, str_replace, and it too can carry an if_version constraint.
  • If the number of entries in a batch changes after approval (entries added or removed), the write is now rejected with "this batch no longer lists the writes that were approved (entries were added or removed)".
  • Batches now track a version pin per entry (entryPins), not just one overall pin, and a server that doesn't support batch writes with version pins at all now gets its own explicit error.
  • Version-mismatch errors are clearer: when the document's current version is known, the error tells you the new version number to plan against; when it's unknown or deleted, it tells you to check whether the document still exists, and for deletes says there's nothing left to do while for other operations it suggests re-creating with a plain set. The error also names which specific write in the batch was stale.

Why This lets tools safely make several conditional writes at once instead of just one: if any pinned document was modified elsewhere since being read, none of the batch is applied, and the error message tells you exactly which write conflicted and what to do about it, instead of silently overwriting concurrent edits.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful3 Signal3
Hooks

Hooks engine: async hook handlers can now register a .catch(handler)#

Async hook handlers can now attach a .catch(handler) to react to a failed downstream call

Details 0 0 Feedback
What

The system plugins use to hook into Claude Code's behavior now lets an asynchronous hook registration chain a .catch(handler) onto itself, giving hook authors a way to respond when a downstream call times out or errors, instead of the failure simply being thrown.

Why

This gives plugin developers a way to gracefully handle a failure in their hook rather than crashing the operation it's attached to. Hooks created with engine.create are the exception: they have no grace budget, and .catch doesn't apply to them, since their failure always fails the load.

+New
Use it now
Useful3 Signal3
Hooks no docs found

Inbound message ingestion (bridge and CLI stdin) now runs through a session.receive plugin hook#

Incoming messages from both Remote Control and the CLI now pass through a session.receive plugin hook before being queued

Details 0 0 Feedback
session.receive
What

Both the Remote Control bridge's inbound-message path and the main CLI's stdin/user-message loop now run incoming messages through the session.receive plugin hook before turning them into a queued prompt. If the hook reports the message as consumed, it's dropped before being enqueued instead of being added to the conversation.

Why

This lets plugins intercept and act on incoming messages from either entry point, consistently, before they ever reach the conversation queue.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful3 Signal3
Plugins Security no docs found

Managed-settings-only secDefault flag controls seating of the bundled sec-default plugin#

A new managed-settings-only flag lets organizations put their bundled sec-default plugin ahead of user-installed plugin hooks

Details 0 0 Feedback
secDefault
What

A new settings field, honored only when set in managed settings (not user, project, local, or --settings), controls whether the organization's bundled "sec-default" plugin takes the outermost seat in the chain of plugin hooks, ahead of any plugins listed in prependPlugins.

Why

This keeps things like classic hooks, prompt content, managed settings, and tool policy protected from being overridden by plugins that users install themselves, since only an administrator setting managed settings can control this placement.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful3 Signal3
Plugin UI no docs found unclear

New "ui.message" event added to a second, larger capability/event list#

A broader UI/agent event list now includes a ui.message event

Unclear The finding does not say what consumes this event list or what user-visible behavior, if any, depends on it.

Details 0 0 Feedback
ui.message
What

A second, larger internal list of UI and agent events that Claude Code tracks now includes ui.message, joining ui.render, ui.resolve, ui.press, ui.input, and ui.select.

Why

This is internal plumbing that expands the set of events the app can recognize and react to. It does not by itself change what you see, but it lays groundwork for features that need to respond to message-related UI activity.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful3 Signal2
Group of 2 Plugin UI

New pointer-event handling for full-screen terminal UI panes#

Full-screen terminal panes gain hover, drag, press and release pointer events plus a shared press subscription

Details 0 0 Feedback

What

  • The terminal input handler now dispatches onPointerHover, onPointerDrag, onPointerPress and onPointerRelease callbacks, in addition to existing selection/click handling, and walks the UI's node tree to find and invoke a node's own pointer handler when in alt-screen (full-screen) mode.
  • The internal terminal app context gained a subscribePointerPresses subscription, alongside the existing subscribeLayout. The renderer implements it with a real listener set and a tellPressedNowhere() method that fires listeners with null; this is used by a consumer to deselect focus when a click lands elsewhere.

Why This lays groundwork for interactive full-screen (alt-screen) panes to handle mouse events like hovering, dragging and clicking directly, and lets UI components react when a click happens outside them, such as clearing focus.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful3 Signal3
Settings Notable no docs found unclear

New workflow keyword-trigger setting tracked via a settings change-log abstraction#

Settings toggles like verbose mode and a new keyword-trigger option now go through a unified change-log system

Unclear The finding doesn't say what ultracodeKeywordTrigger does or how a user would use it.

Details 0 0 Feedback
ultracodeKeywordTrigger
What

Several settings toggles, including verbose, permissionMode, Fast mode, Default view, and a new ultracodeKeywordTrigger setting, are now updated through one shared change-log object with record, toggle, and clear methods, instead of each being updated with its own separate code.

Why

This is mainly an internal cleanup that makes settings changes more consistent and easier to track, and it surfaces a new ultracodeKeywordTrigger setting related to triggering workflows by keyword.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful3 Signal2
Group of 3 Hooks

Turn events now include token usage data#

turn.step and turn.complete events, including plugin hooks, now carry token usage information

Details 0 0 Feedback
usage

What

  • The turn.complete event payload now includes a computed usage object when available, alongside the existing answer, durationMs, aborted, and turnId fields.
  • The turn.step and turn.complete telemetry event payloads now include a usage field whenever the underlying event carries usage data.
  • The plugin/hooks event-summary logger now includes token usage details (input tokens, output tokens, cache-read tokens, cache-creation tokens, and the model name) on turn.step and turn.complete events, pulled from the assistant message.

Why

Plugins, hooks, and telemetry consumers can now see how many tokens a turn used directly from the turn events, without needing a separate lookup, which helps with cost tracking and observability.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful3 Signal3
Plugins

hooks.json can now declare a surface module#

hooks.json can now declare a separate 'surface' module for drawing a hook module's UI elements

Details 0 0 Feedback
surface
What

A plugin's hooks.json configuration file can now include an optional surface field, naming a module (a code file separate from the main hooks module) whose job is to render the hooks module's Client UI elements onto a display surface. This field requires the modules field to also be present, and its format is checked by a new validation rule: it must be a path relative to the hooks.json file and cannot start with $.

Why

This gives plugin authors a way to separate the code that renders UI elements from the main hooks logic, which is useful for plugins that need to show their own interface elements.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful2 Signal2
Group of 3 Compaction no docs found unclear

Compaction and forked-agent queries can now skip inline cache markers#

New skipMessageCacheMarkers option lets compaction and forked-agent requests omit cache markers on messages

Unclear It's unclear what a cache marker on a message does or when skipping it would matter to a user.

Details 0 0 Feedback
skipMessageCacheMarkers

What

  • The internal forked-agent query runner gained a skipMessageCacheMarkers option, alongside the existing skipTranscript/skipCacheWrite options, threaded into the underlying streaming query call.
  • The core compaction/summarization call now accepts the same skipMessageCacheMarkers option (defaulting to false), passed through to the underlying compaction function.
  • When enabled, compaction requests omit cache markers on messages under certain conditions, gated by the tengu_groovy_eclipse feature flag.

Why Cache markers help Claude Code reuse previously-computed context, but they're not always needed; this gives compaction and forked-agent requests a way to skip them when appropriate.

+New
Use it now
Useful3 Signal2
Connectors no docs found

Connector suggestion (search/lookup) gated behind org policy#

Connector search and lookup suggestions now require an org policy to allow them

Details 0 0 Feedback
allow_connector_suggest
What

A new guard function blocks 'Connector search' and 'Connector lookup' operations (suggesting connectors, i.e. integrations with external services) unless an organization's allow_connector_suggest policy setting permits it. When blocked, it reports one of several specific denial reasons: policy_denied, policy_mirror_unregistered, policy_route_missing, or policy_cache_miss.

Why

This lets organizations control whether Claude Code is allowed to suggest connectors to users, with specific error reasons to help diagnose why a suggestion was blocked.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful3 Signal2
MCP

MCP tools can now declare a per-tool result-size cap via _meta#

MCP tools can now declare their own result-size cap and other behavior via metadata

Details 0 0 Feedback
_meta
What

An MCP (Model Context Protocol, the standard Claude Code uses to connect external tools) tool's manifest can now set several behaviors through _meta fields:

  • anthropic/maxResultSizeChars overrides the tool's default maximum result size, up to an internal ceiling
  • anthropic/requiresUserInteraction forces a permission prompt before the tool runs
  • anthropic/alwaysLoad forces the tool to always be loaded
  • anthropic/searchHint (or promptOverrides.search_hints) supplies a searchable hint string for the tool
Why

This gives MCP tool authors finer control over how their tools behave in Claude Code, such as allowing larger results when needed, requiring explicit confirmation, or improving discoverability, without relying only on Claude Code's built-in defaults.

+New
Use it now
Useful3 Signal2
Compliance no docs found

New compliance policy: allow_stats_transcript_scan#

A new policy can block the Usage stats view for HIPAA-regulated organizations

Details 0 0 Feedback
allow_stats_transcript_scan
What

A new compliance policy, allow_stats_transcript_scan, controls whether the "Usage stats" breakdown is shown. This view is built by scanning session transcripts (records of your conversations) saved locally. The policy joins two existing ones, allow_usage_transcript_scan and allow_skill_doctor_transcript_scan, and is blocked by default for organizations under HIPAA (healthcare privacy regulation).

Why

Scanning local transcripts to build usage statistics could expose sensitive information, so organizations subject to healthcare privacy rules now have this specific view disabled rather than left on by default.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful3 Signal2
Plugin UI

New pointer/mouse press event class for plugin UI#

Internal plugin UI code gained a class for tracking mouse/pointer press details

Details 0 0 Feedback
What

A new internal class captures details of a pointer or mouse press for use by plugin user-interface code: the press type, column and row position (both global and local to the element), which button was pressed, and whether shift, alt, or ctrl were held.

Why

This is internal plumbing that supports building interactive plugin UI elements that respond to mouse clicks; it isn't something a reader configures directly.

+New
Use it now
Useful3 Signal2
Compaction Notable

session.compact implementation gated by DISABLE_COMPACT#

session.compact now blocks itself while DISABLE_COMPACT is set or a turn is still running

Details 0 0 Feedback
DISABLE_COMPACT
What

The underlying implementation behind session.compact (used by /compact and by plugins) now explicitly refuses to run in two cases: when compaction has been switched off for the session via DISABLE_COMPACT, or when a turn is currently in progress, since compaction is only allowed to happen between turns.

Why

This prevents /compact and plugin-triggered compaction from running at an unsafe time or when it's been deliberately disabled, giving a clear error instead of unexpected behavior.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

+New
Use it now
Useful3 Signal1
Group of 3 Terminal UI Notable

New ways to resize terminal panes: keybindings and a mouse-draggable grip#

Panes can now be resized with ctrl+x plus arrow keys or by dragging a new resize grip on the plugin panel

Details 0 0 Feedback

What

  • New keybindings: ctrl+x with left/up now maps to a pane:grow action, and ctrl+x with right/down maps to a pane:shrink action, added to the list of recognized keybinding actions alongside existing pane navigation actions like pane:pageDown, pane:top, and pane:bottom.
  • The plugin panel (the "AbovePrompt" area) gained a mouse-draggable resize grip, sized via a new DOCK_GRIP_COLUMNS constant, for click-and-drag resizing, plus scroll-window logic and an "N more above/below" indicator for panel content that overflows the visible area.

Why Gives users more control over how much screen space panes and the plugin panel take up, either via keyboard shortcuts or by dragging with the mouse.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful2 Signal2
MCP Notable

MCP passthrough tool allowlist raised from 256 to 1024 entries; entries can carry annotations/hints#

MCP passthrough tool lists can now hold up to 1024 tools instead of 256, and can carry annotations/hints

Details 0 0 Feedback
What

Claude Code forwards its MCP (Model Context Protocol) tools to worker processes using an internal "passthrough" list. That list's limit was raised from 256 entries to 1024, so setups with a very large number of MCP tools no longer hit the old cap. Each entry in the list can also now carry optional annotations and hints fields.

Why

Users connecting many MCP servers with lots of tools were previously capped at 256 forwarded tools; the higher limit removes that ceiling for larger tool setups.

Were these the right ones to put at the top? 0 answered
Below the fold

Everything else

Smaller changes and internals, grouped as the pipeline found them. Nothing is dropped, it is only further down.

48 entries

Improvementsopen

Improved
You'll notice
Useful3 Signal3
Group of 5 Compliance

HIPAA org policy now 'latches': restricted features stay off for the rest of the session#

Once a HIPAA-regulated organization is detected, Claude Code disables Artifacts, Remote Control, and other gated features for the rest of the session, even after switching accounts

Details 0 0 Feedback

What

  • If Claude Code observes that you're signed into a HIPAA-regulated organization's policy during a session, that fact is now "latched" (remembered) even if the server later stops reporting it.
  • Features gated by this policy, including Artifacts and Remote Control, stay disabled for the rest of the session once latched, with a new user-facing message explaining why.
  • This is treated as a distinct "latched" state alongside the existing org_denied/unregistered/route_missing states in policy checks, and maps to the same policy_denied error code.
  • Switching to a non-HIPAA organization afterward does not lift the restriction; it only clears when Claude Code is restarted.

Why This prevents a session from briefly picking up looser settings by switching organizations after a HIPAA-regulated policy was already in effect, closing a potential gap where compliance-restricted features could be re-enabled mid-session.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful3 Signal3
Group of 3 Effort

Effort level can now be adjusted per turn based on permission layers#

Claude Code's effort level can now be influenced per turn, not just per session, via a new turnEffort value

Details 0 0 Feedback

What

  • A new turnEffort value, derived from the active permission layers, now feeds into the effort-resolution logic used across compaction, the /effort command's output, the ${CLAUDE_EFFORT} prompt template substitution, and agent session metadata, alongside the existing model default and any explicit override.
  • The effort-resolution function gained a turnEffort option that, when the model has a defined capability lookup, takes priority in choosing the effective effort level, and it now also affects the effort suffix text shown to users (e.g. "with X effort").
  • Subagent (Task) tool calls now pass their own turnEffort, computed from the subagent's permission layers, into the permission checks used for command-execution and model resolution.

Why Allows the effort level to vary within a session based on context, such as which permission layer is active for a given turn or subagent, rather than being fixed for the whole session.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful3 Signal3
Permissions

Session can now run with built-in tools entirely disabled, and plugins are blocked from adding tools in that mode#

Sessions can now run with all built-in tools disabled, and plugins are blocked from adding tools back in that mode

Details 0 0 Feedback
What

When --allowedTools is given but doesn't match any known built-in tool, Claude Code now recognizes this as a session with built-in tools entirely disabled, and passes that state through its permission logic. Plugins are explicitly blocked from registering any of their own tools in that case.

Why

This closes a gap where a session set up to disable all built-in tools (via --tools "") could still end up with tools available if a plugin added its own, ensuring the restriction is fully enforced.

Improved
You'll notice
Useful3 Signal2
Group of 5 Memory Sync

Memory sync now recognizes tombstones and won't silently resurrect deleted content#

Writing or syncing memory files that were deliberately deleted elsewhere now surfaces a clear tombstone conflict instead of silently recreating them

Details 0 0 Feedback

What

  • When a memory write conflicts because the target was recently deleted elsewhere (a "tombstone"), it's now detected and reported as a distinct tombstone_conflict reason rather than a generic conflict.
  • Multi-store (org/shared) memory sync checks for this on push: if a local copy predates the deletion and is old enough, it's silently deleted to match; otherwise the user is warned once per path instead of the file being endlessly re-pushed or silently recreated.
  • Writing identical content back to a path that was just tombstoned is now explicitly refused with a dedicated error rather than going through generic conflict handling.
  • The conflict-error type used for memory version conflicts now carries tombstone and deletedAtMs fields (with a matching deleted_at/conflicting_memory_id schema addition), including a fallback check for older messages that mark the conflict via a (tombstone_conflict) suffix.

Why Without this, deleting a shared memory entry on one machine could get silently undone when another machine's stale local copy synced back up. Now the conflict is detected and surfaced clearly, so a deletion actually sticks instead of being fought over by out-of-date copies.

Improved
You'll notice
Useful2 Signal2
Group of 2 Artifacts

Artifact publish responses can now report a dropped deadline#

Artifact publish/deploy responses now report deadlineDropped when a request's deadline was exceeded

Details 0 0 Feedback

What

  • The artifact-publish response now includes a deadlineDropped: true field when a request's deadline was exceeded.
  • The deploy/publish response path now passes a sent flag into error classification, and downstream field-inclusion logic takes into account whether a deadline was set.

Why This surfaces to callers when an artifact publish request was dropped for exceeding its deadline, rather than failing silently or ambiguously.

Improved
You'll notice
Useful2 Signal2
Group of 5 Internals no docs found

ANTHROPIC_UNIX_SOCKET / local tunnel sessions get special-cased auth, policy, and host reporting#

Sessions running over a local Unix socket or SSH tunnel now skip normal auth checks, policy-limit disk caching, and report a local host instead of the real API URL

Details 0 0 Feedback
claude ssh tunnel

What

  • When ANTHROPIC_UNIX_SOCKET is set, authentication checks now short-circuit: a session is considered authed just from CLAUDE_CODE_OAUTH_TOKEN or ANTHROPIC_API_KEY being present, skipping the usual base-url/API-key-helper/OAuth-scope checks, and the reported auth type is derived the same simple way instead of probing the keychain or WIF/OAuth state.
  • Policy-limits configuration can now be loaded lazily after startup if it wasn't already requested at boot, and loading is skipped entirely when there's no reason to fetch it, such as a first-party provider with no ANTHROPIC_UNIX_SOCKET override.
  • Policy-limits responses are no longer written to or deleted from the on-disk cache under ANTHROPIC_UNIX_SOCKET, and the "would fail closed" 24-hour staleness check no longer applies in this mode.
  • Status/host reporting now recognizes local SSH-tunnel sessions and reports a local endpoint ("local machine (via claude ssh tunnel)" or a localhost URL) instead of parsing or showing the real API host.

Why These sessions talk to Anthropic through a local socket or tunnel rather than the normal network path, so the usual credential probing, disk caching, and host-URL reporting don't apply or would be misleading; this makes auth, policy limits, and status reporting behave correctly for that setup.

Improved
You'll notice
Useful3 Signal2
Artifacts

Artifact publish gained expanded, per-reason-code error messages#

Artifact publish failures now show specific, tailored error messages for many more failure reasons

Details 0 0 Feedback
What

Artifact publishing (deploying) failures now come with much more specific error messages. A large new table of reason codes, covering cases like audience_conflict, capability_refused, contract_refused, not_owner, read_timeout, deadline_invalid, and live_path_cap, drives custom explanatory text instead of a small set of generic hardcoded checks. A new deadline_invalid case automatically retries the request with its deadline field removed, and errors about specific declared capabilities now get their own tailored messages.

Why

This makes it much clearer why a publish attempt failed, rather than showing a generic error for many different underlying problems.

Improved
You'll notice
Useful3 Signal2
Artifacts

Artifact republish now says it hot-updates open viewers#

Republishing an artifact now automatically updates any copies already open, keeping page state where possible

Details 0 0 Feedback
What

Artifacts (the standalone documents, apps, or games Claude can create and show alongside a conversation) can now be republished with updates that reach any viewers already open, without the reader having to reopen or refresh them.

Where possible, the update carries over the current state of the page, such as a game in progress, a queued action, or a reply that has been half-typed but not sent.

Why

This means updating an artifact no longer risks losing what someone was doing in it, so iterating on an open artifact is safer and less disruptive.

Improved
You'll notice
Useful3 Signal2
File Reading

File-encoding problem reporting for reads (UTF-16LE/UTF-8 detection + replacement-char and undecodable diagnostics)#

File reads now detect encoding problems and report exactly where a broken or undecodable character occurs

Details 0 0 Feedback
What

When Claude Code reads a file, new internal logic detects the file's text encoding (distinguishing UTF-16LE from UTF-8 by checking for a byte-order mark), then scans for the first replacement character (the symbol that appears when a byte sequence can't be properly decoded as text) or the first byte that can't be decoded at all. If either is found, the read now returns a structured result identifying the problem kind, the encoding, and the exact line and column where it occurs, instead of just returning garbled text.

Why

This gives clearer diagnostics when a file has encoding issues, pinpointing exactly where the problem is rather than leaving Claude (or the user) to guess why a file's contents look corrupted.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful3 Signal2
Artifacts unclear

Artifact comment forwarding now includes team-member comments, not just the owner's#

Artifact auto-react now forwards teammates' comments, not just the artifact owner's

Unclear What the flag controlling this behavior is called or how it's enabled isn't stated.

Details 0 0 Feedback
What

When Claude Code builds the list of comments to forward for an artifact's automatic reaction feature, it now also includes comments from team members (not just the artifact's owner), when a related setting is enabled. These team-member comments are tagged with source: "unattributed" and get a projectsRow marker plus extra fields. Owner comments are also now cross-checked against a lookup of earlier comments to reuse an earlier authored version and timestamp when appropriate.

Why

Previously only the artifact owner's comments were considered, so Claude could miss feedback left by other team members on a shared artifact; now it can react to comments from the whole team.

Improved
You'll notice
Useful3 Signal2
Artifacts no docs found

Artifact write_db permission prompts now describe file provenance and version-pinned edits to others' artifacts#

Permission prompts for writing to artifacts now explain whose file it is and flag version-pinned edits

Details 0 0 Feedback
What

When Claude Code asks permission to write to an artifact's underlying storage (write_db), it now classifies the write as one of four cases: cowritten, from_type, someone_else, or unknown, based on who owns the file. The permission prompt can now be prepended with a description of the file, such as saving a file as a given name or saving a named file to a given location.

It also separately calls out a version-pinned write to someone else's artifact (an edit that targets a specific saved version rather than the latest one): this kind of write always asks for permission on its own, and approving it only covers that one write, until the current conversation has read that artifact's data.

Why

This makes permission prompts for artifact writes more informative about whose file is being changed, and adds an extra safeguard around version-pinned edits to other people's artifacts so approval doesn't inadvertently cover more than intended.

Improved
You'll notice
Useful3 Signal2
Checkpoints

Context/checkpoint diffing extended to cover file writes, not just artifacts#

Claude Code's checkpoint diffing now tracks file writes and edits, not just artifacts

Details 0 0 Feedback
What

The internal system that tracks changes across a conversation's checkpoints used to only follow artifact tool calls. It now also follows file write and edit tool calls, and reports a kind of either 'artifact' or 'file' for each tracked change. It also counts failed edits (an edit that tried to replace text that didn't match) in a new editsFailed counter, and returns a kept list showing which artifacts are still the final version at the point in the conversation being examined.

Why

This extends the diffing and checkpoint machinery so it can account for direct file edits alongside artifact publishing, which should make version tracking and rollback more accurate when a session mixes both kinds of changes.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful2 Signal2
Rate Limits unclear

Rate-limit tracking gains a locally-remembered-window fallback, on by default#

Claude Code can now show a rate-limit status from recently-remembered windows when a fresh server reading isn't available

Unclear The tengu_sharded_moonbeam gate controlling this hasn't been read for this site's account, so whether it's active here is unknown.

Feature flag
tengu_sharded_moonbeam Not enough to say

Nothing here resolved what this flag was doing on this version, so nothing here should be read as on or off.

This account: no value returned · anonymous baseline: no value returned · compiled default in v2.1.267: on

Read once, for one account on one subscription tier, against v2.1.267. It isn't a statement about your account. What a flag value here can and cannot tell you

Details 0 0 Feedback
What

Claude Code tracks how close you are to hitting rate limits (caps on how much you can use the service in a given period). It now also keeps a rolling local record of recently-seen rate-limit windows, and can use that record to fill in the displayed status when a fresh reading from the server isn't available at that moment.

Why

This should make the rate-limit indicator more reliable, avoiding gaps or blank states when a fresh server reading is momentarily missing.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful2 Signal2
Subagents

Sub-agent tool resolution now includes machine-level MCP tools#

Spawned subagents can now use machine-level MCP tools, not just app-state and agent-declared ones

Details 0 0 Feedback
What

When Claude Code figures out which tools a spawned subagent is allowed to use, it now also includes machine-level MCP (Model Context Protocol, a standard for connecting external tools) tools, in addition to the app-state MCP tools and the tools an agent explicitly declares. This applies both to subagent spawning generally and to the workflow SDK's agent tool-set resolution, and the machine-level tool list is now merged in when building skill tool sets as well.

Why

This broadens what tools a subagent can reach, so machine-wide MCP tool configurations are no longer left out when a subagent's tool set is computed.

Improved
You'll notice
Useful2 Signal2
Cloud Agents unclear

Forwarded-user-turns classifier prompt adds a new author category for messages written on a Claude Code Project's timeline#

A new message type lets a Claude Code Project owner speak as the session user on the project's timeline

Unclear The finding notes this is gated behind a parameter that defaults to false, so it's unclear whether or when it is actually active.

Details 0 0 Feedback
What

The internal prompt that interprets forwarded or human-authored messages for background and cloud agents now recognizes a new category: a message written by the owner of the Claude Code Project a session belongs to, posted on that project's timeline. When present, this message is treated as if the session's own user wrote it, and it can clear a SOFT BLOCK rule for the exact action it names.

This new behavior comes with limits:

  • it cannot answer a pending permission prompt
  • it cannot authorize changes to permission settings or to CLAUDE.md
  • a bare "yes" or "ok" clears nothing unless the block was already visible when the owner wrote the message
Why

This lets a project owner unblock a specific stuck action from the project's timeline without being logged in to the session directly, while still preventing that channel from being used to approve permissions or rewrite instructions it shouldn't be able to touch.

Improved
You'll notice
Useful2 Signal2
Plugins Security

Plugin repository must be recognized as trusted-org to get 'org' scope#

Plugin commands only get 'org' scope if their repository is in a trusted-org list

Details 0 0 Feedback
What

For commands and prompts that come from plugins, Claude Code now only labels them with 'org' scope when the plugin's source repository is found in a specific trusted set provided by the caller. Previously, plugin-sourced items were always mapped to 'org' scope, the same way items from 'managed' or 'synced' sources are. Now, if the repository isn't in that trusted set, the scope comes back undefined instead.

Why

This tightens how plugin commands get classified as organization-wide, preventing plugins from arbitrary or untrusted repositories from automatically being treated as coming from the organization.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful2 Signal2
Remote Control

New session-identity contest/impersonation warnings for send_message#

send_message now warns about possible impersonation or a restarted session before sending

Details 0 0 Feedback
What

Two new warnings appear when resolving a saved session reference for send_message:

  • another live session on the same machine currently claims the same identity as the target, which could mean impersonation or a duplicate open conversation
  • the target session has restarted since it was last reached (same session, but a new process)

Both warnings advise checking with the user before sending anything sensitive.

Why

These guard against sending a message to the wrong session when identities have become ambiguous, such as after a restart or when two sessions could plausibly claim the same identity, prompting extra caution before sharing sensitive content.

Improved
You'll notice
Useful2 Signal2
Terminal UI

Non-blocking stdout can now be enabled by a remote flag, not just an env var#

Non-blocking stdout writes can now be turned on remotely, not just via an environment variable

Feature flag
tengu_event_loop_stall Off in both readings

The flag server returned off for the account this site reads and for the anonymous baseline. A reading of off cannot rule out a rollout these two readings sit outside of.

This account: off · anonymous baseline: off · compiled default in v2.1.267: off

Read once, for one account on one subscription tier, against v2.1.267. It isn't a statement about your account. What a flag value here can and cannot tell you

Details 0 0 Feedback
CLAUDE_CODE_NONBLOCKING_STDOUT
What

CLAUDE_CODE_NONBLOCKING_STDOUT makes Claude Code write terminal output through a second, non-blocking channel so a stalled terminal (like a paused tmux pane or a frozen SSH connection) can't freeze the session. Previously this only applied when the environment variable was explicitly set. Now, if the environment variable isn't set, Claude Code also checks a remote server-controlled setting, tengu_event_loop_stall, as well as an internal first-party check, to decide whether to enable it.

Why

This lets Anthropic roll out the non-blocking stdout behavior to more users gradually via a remote setting, without requiring everyone to manually set the environment variable themselves.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful3 Signal1
Sandbox

Sandbox system prompt now tells Claude to use /copy when a clipboard tool fails inside the sandbox#

Claude is now told to suggest running /copy when clipboard commands fail inside the sandbox

Details 0 0 Feedback
/copy
What

When Claude Code runs commands in a sandbox (a restricted environment that limits what a command can access), clipboard tools like pbcopy, xclip, or wl-copy don't work because they can't reach the system clipboard from inside it. Claude's instructions now tell it that when this happens, it should put the text in a fenced code block and tell the user to run /copy themselves, rather than writing the text to a file for the user to copy manually.

The /copy command copies the last assistant response to the clipboard from outside the sandbox; when code blocks are present it shows an interactive picker so the user can select just the block they want, or press w to write the selection to a file instead, which is useful over SSH.

Why

This avoids Claude falling back to writing scratch files just to work around a clipboard command that can't run inside the sandbox, pointing the user instead to the built-in /copy workflow that already handles this case.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful2 Signal1
Group of 5 Plugins

Plugin/marketplace requests distinguish missing scope from not entitled#

Plugin and marketplace operations now report clearly when your claude.ai login lacks plugin-access scope instead of failing generically

Details 0 0 Feedback

What

  • Installing a plugin now fails with a clear message when your claude.ai login hasn't been granted plugin access yet: "The plugin archive was not downloaded: this claude.ai login has not been granted plugin access yet. Start Claude Code interactively once, then try again."
  • Listing plugins, and other plugin/marketplace metadata lookups, now recognize a distinct "no scope" condition (as opposed to being flatly not entitled) and degrade gracefully with a skipped result instead of throwing or reporting the wrong reason.
  • Plugin/marketplace sync now treats a non-interactive authentication failure as lacking the user:plugins scope, short-circuiting with "claude.ai login lacks the user:plugins scope in this session".
  • The background flow that silently re-requests an OAuth token with the extra user:plugins scope now skips itself when running in a non-interactive session (except inside the VS Code extension), instead of failing in a confusing way.

Why Previously these failures could look like generic errors or the wrong entitlement message. Now Claude Code tells you specifically that your login session needs to be granted plugin access, and points you to the fix (start Claude Code interactively once), rather than leaving plugin installs or syncs failing mysteriously in non-interactive environments.

Improved
You'll notice
Useful2 Signal1
Group of 3 Rate Limits

Rate-limit overage responses can now be scoped to a channel#

Usage-limit warnings can now say the limit applies to a channel, not just the whole organization

Details 0 0 Feedback

What

  • A new overageScope: "channel" field was added to rate-limit/overage status, read from the anthropic-ratelimit-unified-overage-scope response header when it equals channel, replacing a boolean overage flag derived from a single header.
  • The usage/spend-limit warning text now branches on this scope, showing "channel's monthly spend limit" or "channel's monthly usage limit" instead of the general org-wide message when the scope applies.

Why Lets Claude Code tell users precisely which quota is running low or exhausted, a shared channel's limit versus the whole organization's, so the warning is more actionable.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful2 Signal1
Group of 2 Artifacts

Artifact publish source-verification failures split into specific error messages#

Artifact publish now explains why a source file's approval couldn't be verified instead of one generic error

Details 0 0 Feedback

What The generic source_unverified failure shown when publishing an artifact has been replaced with a set of specific, retry-guidance-bearing error messages depending on why the source file's permission-check "pin" (its recorded approval) couldn't be verified:

  • source_pin_stale_build: the approval came from an older Claude Code version
  • source_pin_missing/unreadable: the approval is unmatched or missing
  • approval_replayed: the approval was replayed
  • source_pin_evicted: the approval was evicted from session state
  • source_pin_unobserved: the permission check was never recorded
  • source_check_failed: an internal check failed, for example the permission check crashed before it could record the file
  • source_redirected_on_resume: the source file was redirected, via a symlink or hardlink, by another process during a resumed approval
  • source_path_mismatch: the file's path changed after it was approved
  • invalid encoding or replacement-character content in the source file

Why When an artifact publish fails, the message now says specifically whether the problem is a stale approval, a tampered or moved file, a missed check, or something else, instead of one generic "unverified" message, making it clearer what to do next.

Improved
You'll notice
Useful2 Signal1
Group of 2 Sessions

Session export/import better preserves tool-use messages#

Exported and re-imported session transcripts now correctly preserve tool-use messages, including file writes

Details 0 0 Feedback

What

  • When rebuilding an assistant message during session export/import, stop_reason is no longer always set to end_turn; it is now set to tool_use when the message actually contains tool-use blocks.
  • When importing an assistant message, file-write tool calls are now reconstructed and re-added as tool_use blocks (with their file_path and content), in addition to the existing text-block handling.

Why Previously, exporting and re-importing a session could lose or mislabel tool-use information, such as file writes a session had made. This keeps transcripts more faithful when moved between sessions or environments.

Improved
You'll notice
Useful2 Signal1
Artifacts

Artifact comment context truncation reworked to preserve indentation and header lines#

Artifact comment truncation now preserves indentation and header lines instead of cutting text mid-line

Details 0 0 Feedback
What

When an artifact's comment thread is too large to include in full, Claude Code trims it down. Previously this was a flat character cutoff across the whole rendered comment. Now each comment's header line is kept separate from its body when trimming, and any trailing partial line that matches the quoted-line prefix is removed entirely rather than left cut off mid-line.

Why

This produces cleaner, more readable truncated comment threads, avoiding jagged cutoffs in the middle of a quoted line or a header.

Improved
You'll notice
Useful2 Signal1
Plugins

Plugin hooks.json now warned on unknown/malformed keys#

Claude Code now warns about unknown or malformed keys in a plugin's hooks.json

Details 0 0 Feedback
What

A plugin's hooks.json file (which defines hooks — scripts that run automatically at certain points, like before a tool runs) is now checked against an allow-list of valid keys. If it contains keys that aren't recognized, or if a hook entry is missing its required matcher or hooks fields, Claude Code now emits a warning listing the offending keys, summarizing with "... and N more" if there are many.

Why

This helps plugin authors catch typos or malformed configuration in their hooks.json files early, instead of having the mistake silently ignored.

Improved
You'll notice
Useful2 Signal1
Rate Limits

Rate/credit limit messaging distinguishes channel-level spend caps#

Hitting a channel's own spend cap now shows a distinct message from hitting the general monthly limit

Details 0 0 Feedback
What

The message shown when a spend cap is hit now distinguishes a channel-scoped cap from the general one. Hitting a channel's own monthly limit now shows "You've hit your channel's monthly spend limit," separate from the existing "You've hit your monthly spend limit" message.

Why

This makes it clear whether the limit that was hit applies to a specific channel or to the account as a whole, which matters for knowing who to ask about raising it.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful2 Signal1
Plugins

Plugin hook hot-reload now also fires on user-settings tier changes#

Plugin hooks now hot-reload when settings move between managed and user tiers, not just on managed-policy changes

Details 0 0 Feedback
What

Claude Code can reload a plugin's hooks (scripts that run automatically at certain points, like before a tool call) without restarting. Previously this hot-reload only triggered when the managed policy settings changed. It now also triggers when user settings change, if doing so moves a setting between the managed and user configuration tiers.

Why

This closes a gap where changing where a setting lives (for example, moving it from user-level to managed-level) could leave plugin hooks out of sync until a restart. Now that kind of change reloads the hooks automatically.

Improved
You'll notice
Useful2 Signal1
Hooks

Hooks-worker heartbeat watchdog now tolerates multiple missed beats#

The hooks worker watchdog now waits for several missed heartbeats before declaring it stuck, not just one

Details 0 0 Feedback
What

Claude Code runs hooks (custom scripts that run at certain points, like before or after a tool call) in a separate worker process. A background daemon checks that this worker is still alive by sending it periodic heartbeat pings and waiting for a response. Previously, a single unanswered ping (based on how much time had passed) was enough to declare the worker wedged. Now the daemon counts consecutive missed heartbeats and only declares the worker stuck once that count crosses a threshold.

Why

A hook that briefly spins without yielding could previously trip the watchdog on one slow beat and get flagged as wedged even though it was still working. Tolerating multiple missed beats reduces false positives while still catching a genuinely stuck hooks worker.

Improved
You'll notice
Useful2 Signal1
Terminal UI

AbovePrompt panel gets dedicated scroll keys instead of overloading up/down#

The panel above the prompt now uses dedicated scroll keys instead of sharing up/down with other navigation

Details 0 0 Feedback
What

The panel that appears above the prompt box had its keyboard shortcuts changed. Previously, the up and down arrow keys doubled as aliases for moving to the next or previous item in that panel. Now up, down, page up, page down, home, and end are bound instead to dedicated scrolling actions: scroll up, scroll down, page up, page down, jump to top, and jump to bottom. The description of this keybinding scope was also updated to refer to a 'panel' above the prompt rather than just a button.

Why

Giving the above-prompt panel its own dedicated scroll keys, instead of overloading up/down for item navigation, makes it possible to scroll through the panel's content directly rather than only jumping between items.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful2 Signal1
Artifacts

Batch-write messaging refined for version-pinned writes#

Error message for version-pinned batch writes now says the whole batch is refused, not applied piecemeal

Details 0 0 Feedback
What

When Claude Code explains why an unsupported batch write can't proceed, it now takes into account whether the batch is version-pinned. For a version-pinned batch, the message says it will only be applied all-or-nothing if the server supports batch writes; otherwise it's refused entirely, since 'a version-pinned batch is never applied one at a time'. This replaces the previous message, which described a one-at-a-time fallback.

Why

This corrects the explanation given to accurately reflect that a version-pinned batch can't be split apart and applied piece by piece, avoiding a misleading description of what happens when the write fails.

Improved
You'll notice
Useful2 Signal1
Artifacts

New responsive-design system guidance for Artifact page generation#

Artifact generation now gets more detailed instructions for making responsive web pages

Details 0 0 Feedback
What

When Claude Code builds web-page Artifacts, the prompt guiding the model now includes more detailed responsive-design instructions:

  • Keep the page usable at widths as small as roughly 400px
  • Keep 16px side margins using padding-block (never a padding shorthand that zeroes it out)
  • Use relative units instead of fixed pixel sizes
  • Let grids wrap or stack on narrow screens
  • Cap the width of images and elements with a fixed aspect ratio
  • Confine any horizontal scrolling to tables, diagrams, or code blocks, each in its own scrolling container, so the page body itself never scrolls sideways
Why

This should produce Artifacts that look right and stay usable on narrow screens and mobile-sized viewports, instead of overflowing or requiring awkward horizontal scrolling.

Improved
You'll notice
Useful2 Signal1
Compliance

Usage stats now hidden for HIPAA-regulated orgs#

Usage stats are now explicitly hidden for HIPAA-regulated organizations, with an explanation why

Details 0 0 Feedback
What

The 'Usage stats' feature now carries an explicit note that it is not shown for organizations under HIPAA regulation. The reason given is that these stats are built by scanning session transcripts saved locally on the machine.

Why

HIPAA-regulated organizations have restrictions on handling data drawn from stored conversation content, so this stops usage stats, which are computed from locally saved transcripts, from being shown to those organizations.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful2 Signal1
Plugin UI unclear

Button plugin UI component now supports hover state#

Plugin UI Button elements can now carry a hover state through to press handling

Unclear The finding doesn't say what visible effect the hover prop has once it reaches press handling.

Details 0 0 Feedback
What

The Button element type used in plugin user-interface code now conditionally passes along a hover property when handling a press, if one is set.

Why

This is internal plumbing for plugin UI buttons; it suggests buttons can now track and act on hover state, not just clicks, but the finding doesn't describe a specific visible effect.

Improved
You'll notice
Useful2 Signal1
MCP

New MCP-unavailable error message variant#

A new error message explains when an MCP server's tools can't be used this session

Details 0 0 Feedback
What

Claude Code now shows a distinct error message when a tool from an MCP server (a connector that lets Claude use external tools and data) isn't available for the current session: "[server]'s MCP tools are not available in this session right now; [tool] did not run." This is separate from the existing message that suggests the server may have disconnected.

Why

This gives a clearer, more specific explanation for a case where MCP tools simply aren't usable right now, rather than lumping it in with a message that implies a connection problem.

Improved
You'll notice
Useful2 Signal1
Model Catalog

Headless served-model-catalog fetch now backs off exponentially after failures#

Headless mode now backs off from re-fetching the model catalog after a recent failure instead of retrying every time

Details 0 0 Feedback
What

When Claude Code starts in headless (non-interactive, scripted) mode, it fetches a catalog of available models over the network. Now, before doing that fetch, it checks a saved marker recording whether a recent headless fetch failed. If a failure was recorded recently, it skips the network call entirely and falls back to the built-in model list, recording the reason as headless_held_off.

Success and failure are tracked in a new .headless-failed.json marker file, and repeated failures make Claude Code wait longer before trying again (exponential backoff).

Why

This avoids repeatedly hitting a failing network endpoint on every headless run, which previously could slow down or delay each invocation. If the model catalog can't be reached, headless runs now fail fast and fall back to a known-good default list instead of retrying every time.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful2 Signal1
Sessions

Peer-session send error now suggests the session's new name if it was renamed#

Sending a message to a renamed peer session now suggests its new name in the error

Details 0 0 Feedback
What

When Claude Code tries to send a message to another peer or agent session by name and can't find that name, the error message now checks whether that session was renamed, and if so, tells you its current name.

Why

This makes it easier to recover from a "session not found" error caused by a rename, since the message now points directly to the name to use instead.

Improved
You'll notice
Useful2 Signal1
Elsewhere unclear

Stats dialog now requires an "allowed" permission check#

The stats dialog now checks a permission flag before loading usage stats

Unclear The finding does not say under what conditions allowed would be false or what reasons might be shown.

Details 0 0 Feedback
What

The dialog that shows usage statistics (similar to the /stats command) now first checks whether it is allowed to load, using an allowed/reason pair from a store. If it isn't allowed, it shows the given reason text instead of fetching and displaying all-time and active-time usage figures.

Why

This lets Claude Code hold back the stats dialog for certain accounts or situations and show an explanation instead, rather than always loading usage data.

Improved
You'll notice
Useful2 Signal1
Transcript

Visual connector for consecutive labelled-reply messages#

Consecutive replies from the same labelled speaker now show a connecting line instead of repeating the label

Details 0 0 Feedback
What

In message lists where replies are shown under a speaker label (such as in bridged or teammate sessions), consecutive messages from the same labelled speaker are now tracked as "continuing" that reply. Instead of repeating the label for each one, Claude Code now draws a connector line down the left edge to visually link them.

Why

This makes a run of messages from the same speaker easier to read at a glance, without the label repeating unnecessarily.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
Under the hood
Useful1 Signal1
Group of 2 Artifacts

Artifact auto-reply handoff tracking is now bounded and swept for stale entries#

Pending artifact auto-reply handoffs are now capped, evicted, and swept for stale entries even when auto-reply is off

Details 0 0 Feedback

What

  • A new handOffs map tracks pending handoffs (used for artifact auto-reply) keyed by uuid, capped at 64 entries with LRU-style eviction, evicting the oldest entry that isn't among currently live sessions.
  • New sweep logic declines stale handoffs with reason auto_reply_off when auto-reply is turned off, and drops handoffs per-slug when the owning session no longer exists.
  • Artifact comment and db-read action handlers now call this sweep on every read, not just when auto-react/reply is enabled.

Why This prevents stale or orphaned handoff entries from accumulating unboundedly and ensures they get cleaned up consistently, regardless of whether auto-reply is currently turned on.

Improved
You'll notice
Useful1 Signal1
Elsewhere

Org-policy beta-block message reworded#

The message shown when an org policy blocks experimental beta headers was reworded

Details 0 0 Feedback
What

When an organization's compliance policy strips beta headers from ANTHROPIC_CUSTOM_HEADERS or ANTHROPIC_BETAS (environment variables used to opt into experimental Anthropic API features), the debug log message changed from "disabled by org compliance policy" to "disabled by your organization's policy."

Why

This is a wording change only, making the message read more directly to the person seeing it, with no change to the underlying blocking behavior.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful1 Signal1
Elsewhere

Org-policy denial text genericized, dropping explicit HIPAA callout#

The message shown when Projects is disabled by org policy no longer names HIPAA specifically

Details 0 0 Feedback
What

When an organization's policy disables Projects (uploading or reading project files to claude.ai), the message shown now just says the feature is 'disabled by your organization's policy.' Previously the message specifically called out 'compliance policy (e.g. HIPAA)' as an example reason.

Why

The underlying behavior (Projects being blocked) is unchanged; only the wording is more generic now, so the message applies cleanly to any policy reason, not just HIPAA-style compliance ones.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful1 Signal1
Terminal UI

New scrolling UI hint text for 'band' and 'scrollingButton' widgets#

New footer hint text explains keyboard controls for two scrolling UI widgets

Details 0 0 Feedback
What

Two new footer hint strings were added to the terminal UI:

  • a 'band' widget hint: arrows, page up, and page down scroll, tab moves, and escape returns to the prompt
  • a 'scrollingButton' widget hint: enter presses the button, and arrows scroll
Why

These hints tell the reader which keys control these scrolling UI elements, making them easier to use without guessing.

Improved
You'll notice
Useful1 Signal1
Plugins unclear

Wording change: plugin entry helper consent message#

Reworded error message for unapproved plugin entry helpers from remote-managed settings

Unclear The exact before/after wording isn't given, so the extent of the change is unclear.

Details 0 0 Feedback
What

The error message shown when a plugin entry helper, declared through remote-managed settings, hasn't yet been approved for the current session was reworded.

Why

This is a wording change only; it doesn't alter when the message appears or what approval is required.

Improved
You'll notice
Useful1 Signal1
Rate Limits unclear

Rate-limit banner drops short labels#

Rate-limit config drops the short "5h"/"7d" labels for the five-hour/seven-day thresholds

Unclear It's unclear what, if anything, in the visible interface actually used claimAbbrev, so the practical effect on what a user sees is not established.

Details 0 0 Feedback
What

The configuration for the five-hour and seven-day rate-limit thresholds no longer includes a claimAbbrev field, which previously held short labels like "5h" and "7d".

Why

Any part of the interface that relied on these short labels to display rate-limit information loses that source, which could mean a shortened label disappears or changes elsewhere in the product.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful1 Signal1
Compliance

"Compliance policy" wording replaced with "organization's policy" across several messages#

Messages that mentioned "compliance policy" now say "organization's policy" instead

Details 0 0 Feedback
What

Several messages shown to users or written to logs have been reworded to replace references to "compliance" or "org compliance policy" with "organization's policy". This includes the message shown when model-chosen URL access is blocked, the message logged when CLAUDE_CODE_EXTRA_BODY content is dropped, and the message logged when SDK betas are dropped.

Why

This is a wording change only, making the messages more consistent and describing the source of the restriction as the organization's policy rather than a specific compliance mechanism.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful1 Signal1
Effort

Effort-cap message now credits local settings, not just org#

Effort-cap message now says your own settings can lower the cap, not just your organization

Details 0 0 Feedback
What

When a requested effort level (a setting that controls how much reasoning Claude puts into a task) exceeds the allowed maximum, the warning message now says the cap can come from "your settings or organization", rather than blaming the organization alone.

Why

This makes the message more accurate: if you've capped effort yourself through your own settings, the message no longer wrongly points to your organization as the cause.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful1 Signal1
Effort

Effort-level restriction message reworded#

The message about capped reasoning-effort levels was reworded to be more accurate

Details 0 0 Feedback
What

When a higher reasoning-effort level (how much the model "thinks" before answering) isn't available to you, Claude Code now says "Higher effort levels are capped by your settings or organization" instead of a version that placed the blame solely on your organization.

Why

The cap can come from your own settings as well as an organization-wide policy, so the new wording avoids incorrectly pointing the finger at your organization when the restriction is actually something you set yourself.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Improved
You'll notice
Useful1 Signal1
Artifacts

Artifact tool: 'label' hint text simplified#

Artifact tool's error message for an overlong 'label' field dropped the word 'version'

Details 0 0 Feedback
What

When the artifact tool rejects a label field that is too long, the message it shows now just says label is a short name (max 60 characters), instead of describing it as a short version name.

Why

It's a small wording tweak to the guidance shown when a label is too long, telling you to move any longer text into the page content instead.

41 entries

Bug Fixesopen

Fixed
You'll notice
Useful3 Signal2
Group of 2 Remote Control

Session pin resolution now detects renamed sessions and reports contested identity#

Sending messages to another Claude Code session now detects if it was renamed, and telemetry reports pin-resolution issues

Details 0 0 Feedback

What

  • The cross-session messaging telemetry event (uds, used when sending messages to other Claude Code sessions) gains two new boolean fields: whether the target session restarted since it was pinned, and whether its identity was contested (ambiguous) when resolving the pin.
  • New logic detects when a session referenced by an earlier send_message pin has since been renamed on the same machine (matched via socket identity and former names), and surfaces a renamedTo hint.
  • When a session can't be reached, the error message now appends a note like "A session now named '' reports it as a former name (renamed)" instead of just failing outright, and pin resolution can follow a rename using identity-contested/pin-id reconciliation.

Why Previously, sending a message to a session that had since been renamed could silently fail. Now Claude Code detects the rename, reports the ambiguity, and gives a clearer error pointing to the session's new name.

Fixed
You'll notice
Useful3 Signal2
Group of 3 Remote Control unclear

Remote Control bridge now recovers from 401s during background polling, not just 404s#

Remote Control's background session poller now treats an expired credential (401) as a reason to re-register, with clearer error messages

Unclear Whether either of the two related gates, tengu_bridge_env_reregister and tengu_bridge_fatal_error, is active has not been read for this account.

Details 0 0 Feedback
claude remote-control

What

  • The bridge's background polling loop, used for Remote Control/cloud sessions, now treats a 401 (unauthorized) response as a trigger to re-register the environment, in addition to the existing 404 (not found) case, provided the same gates hold.
  • The re-registration function now takes a trigger argument distinguishing 401 from 404, logs the correct status code, and records which trigger fired in telemetry. A 401 uses its own backoff floor (reregister401BackoffFloorMs) and logs a message about a renewed Remote Control credential rather than a re-registered environment.
  • If repeated 401s exhaust re-registration attempts, or the server issues a replaced environment instead, the bridge now logs a distinct, user-facing fatal error telling the user to restart claude remote-control.

Why Previously only a 404 triggered recovery, so an expired or renewed credential (401) could leave a Remote Control session stuck polling without a clear path forward. Now it's handled automatically where possible, with a clearer error message when it can't be.

Fixed
You'll notice
Useful3 Signal2
Model Settings

Bug fix: availableModels validator was reading from the wrong variables#

Fixed a bug where the availableModels setting validator checked the wrong internal variables

Details 0 0 Feedback
availableModels
What

The validation logic for the availableModels setting, which restricts which models people can pick, had a bug: it was reading from and writing to internal variables that didn't match its own inputs, so it wasn't actually validating the list it was given. This has been fixed so it correctly checks the input array and only keeps valid string entries.

Why

This fixes a case where availableModels validation could behave incorrectly, for example failing to catch or properly report a non-string entry in the list. Anyone using this setting to restrict model selection should see it validated correctly now.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Fixed
You'll notice
Useful2 Signal2
Artifacts

Sync/live-edit artifact permission "version" no longer auto-granted with liveEditOn#

Live-edit artifacts no longer automatically get "version" permission alongside "sync"

Details 0 0 Feedback
What

When computing which actions are allowed for an artifact with live editing turned on (liveEditOn), Claude Code now only grants the "sync" action. It previously also granted "version" automatically in this case.

Why

This narrows the automatic permissions given to live-editing artifacts, meaning "version" is no longer assumed to be allowed just because live editing is on.

Fixed
You'll notice
Useful2 Signal2
Permissions

Policy checks for agent.spawn and tool.call gain argument restoration#

Policy checks for spawning agents and calling tools now restore pinned fields a hook altered, not just flag them

Details 0 0 Feedback
What

The policy checks that run on agent.spawn and tool.call events now actively restore certain pinned fields if a hook rewrite changed them: the parent agent ID and related fields for agent.spawn, and the agent ID for tool.call. Previously these checks only flagged a mismatch rather than fixing it.

Why

This stops a hook from being able to alter security-relevant identifiers like the parent agent ID, restoring them to their correct values automatically rather than merely reporting that they were changed.

Fixed
You'll notice
Useful3 Signal1
Artifacts

Artifact publish failures now surfaced directly in the publish UI#

Artifact publish failures are now shown directly in the publish panel with the reason

Details 0 0 Feedback
What

When publishing an artifact's files fails, Claude Code's publish status panel now shows a red "Couldn't publish its files" message along with the specific reason, instead of failing silently or less visibly. Session state also now tracks crashedPublishChecks and frozenHotUpdate.

Why

This makes publish failures visible where you're already looking, so you know immediately that publishing didn't succeed and why, rather than only discovering it later.

Fixed
You'll notice
Useful1 Signal2
Elsewhere

Hooks path-traversal validation extended to a hook's 'surface' file#

Hook path-traversal checks now also cover a hook's 'surface' file, not just its module file

Details 0 0 Feedback
What

When Claude Code validates a plugin's hook configuration, it already checked the hook's module path for path traversal (an attempt to reference files outside the intended directory, e.g. using ../) and existence. It now performs the same checks on the hook's surfacePath as well, returning a path-traversal or path-not-found error if it fails.

Why

This closes a gap where a hook's surface file could point outside its intended directory without being caught, tightening the security checks around plugin hooks.

Fixed
You'll notice
Useful2 Signal1
Artifacts

Artifact publish retries once on a fresh connection after a mid-upload connection death#

Artifact publishing now automatically retries once if the upload connection dies mid-transfer

Details 0 0 Feedback
What

When publishing or deploying an artifact and the upload connection drops partway through sending the request body, Claude Code now detects this using byte-tracking data and automatically resends the request once over a fresh connection. It logs a warning when this happens, along with a deploy_resent telemetry event recording the outcome of the retry.

Why

This makes publishing more resilient to flaky network connections, recovering automatically from a dropped connection instead of failing the whole publish attempt.

Fixed
You'll notice
Useful2 Signal1
Plugins

New diagnostics for malformed plugin hook matchers and hook re-entry#

New warnings catch malformed plugin hook matchers and hook re-entry

Details 0 0 Feedback
What

Claude Code now detects when a plugin's hook matcher (the on() condition that decides when a hook runs) is structurally wrong, such as using an object matcher against a value that can only be a scalar, and logs a one-time warning per file path explaining the mismatch, capped at 32 warnings per module and event to avoid log spam.

It also now logs when a hooks module's own hook is skipped, or has some of its registrations left out, because that module is already being dispatched (re-entry protection), naming the chain of nested hook calls that led there.

Why

These diagnostics help plugin authors notice when a hook matcher is written incorrectly and will never fire, and understand why a hook was skipped due to re-entry, instead of the failure passing silently.

Fixed
You'll notice
Useful2 Signal1
Artifacts

Artifact file uploads now reject replacement-character/unpaired-surrogate text#

Artifact text file uploads are now rejected if they contain the Unicode replacement character or an unpaired surrogate

Details 0 0 Feedback
What

When a text-type file is validated for publishing to an Artifact, content containing the Unicode replacement character (U+FFFD, the symbol that appears when text can't be decoded properly) or an unpaired surrogate (a broken piece of a multi-part character) is now rejected with a specific error. For HTML files, the error also explains that the character should be escaped as &#xFFFD; instead.

Why

This catches text corruption before it's published, rather than letting broken or unreadable characters make it into a live artifact.

Fixed
You'll notice
Useful2 Signal1
MCP

New MCP tool wrapper explicitly refuses cross-machine session-channel tools#

Trying to call another machine's session-owned MCP tool locally now fails with a clear error instead of silently misbehaving

Details 0 0 Feedback
What

When multiple machines are connected in a shared session and one machine owns a particular MCP tool (a tool exposed by a Model Context Protocol server), a new wrapper now catches attempts to run that tool from a different machine and throws a clear error explaining that the tool belongs to that other session and can't run locally.

Why

Previously such a call could fail silently or behave unpredictably; now the failure is explicit, making it obvious what went wrong instead of leaving the cause a mystery.

Fixed
You'll notice
Useful2 Signal1
Remote Control

Bug fix: variable mismatch in remote-control policy check#

Bug fix: remote-control permission check was reading the wrong variable

Details 0 0 Feedback
What

The check for the allow_remote_control policy was rewritten as a switch statement over the correct, properly-scoped variable, replacing a reference to a different, apparently mistakenly-named variable that looks like it was a leftover typo or scoping bug.

Why

This fixes a bug that could have caused the remote-control permission check to evaluate against the wrong value, potentially misjudging whether remote control should be allowed.

Fixed
You'll notice
Useful2 Signal1
Elsewhere

Retry logic now treats stream_idle_timeout like other transient errors#

Retries now treat stream_idle_timeout the same as other transient network errors

Details 0 0 Feedback
What

The logic that decides whether to log and retry an error after a failed request used to recognize connection_error, server_overload, api_timeout, and rate_limit. It now also recognizes stream_idle_timeout, logging "API {type} after retries" and treating it the same way as those other transient errors.

Why

A connection that goes idle mid-stream is now handled like other temporary network hiccups, so it can be retried instead of surfacing immediately as a failure.

Fixed
You'll notice
Useful2 Signal1
Artifacts

Artifact title label distinguishes 'File' vs 'Artifact'#

Artifact headers now correctly say 'File' for files and 'Artifact' for artifacts

Details 0 0 Feedback
What

The label shown above an artifact now reads "File: " when the item is a file, and "Artifact: " otherwise. Previously it always said "Artifact" regardless of kind, and the underlying code referenced an undefined variable, meaning the distinction never actually worked.

Why

This fixes a bug so that files and artifacts are now labeled correctly and distinguishably in their headers.

Fixed
You'll notice
Useful2 Signal1
Credentials

Revoked-credentials cleanup now degrades gracefully on failure instead of dropping results#

Revoked-credentials cleanup now returns a fallback result instead of nothing when it fails

Details 0 0 Feedback
What

When the cleanup process for revoked credentials fails, it used to return nothing at all, leaving callers with no information. Now, on failure, it returns a synthesized result that marks every credential name as revoked with a fixed cause code, giving callers something usable instead of an empty result.

Why

This means that if the cleanup process errors out, the rest of the system still gets a sensible, if pessimistic, answer to work with, rather than crashing or silently getting nothing back.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Fixed
You'll notice
Useful2 Signal1
Artifacts

Artifact preview now validates text encoding before rendering#

Artifact preview now checks text encoding before trying to render a file

Details 0 0 Feedback
What

When previewing an artifact (an HTML or text file), Claude Code now runs the underlying bytes through a decoder that detects encoding problems before rendering. If the bytes can't be decoded, or decoding required inserting replacement characters, the preview now fails with a specific error (preview_source_encoding or preview_source_replacement_char) instead of blindly converting the bytes to text and possibly rendering garbled or misleading content.

Why

This prevents artifact previews from silently showing corrupted or mangled text when a file isn't valid UTF-8, surfacing a clear error instead.

Fixed
You'll notice
Useful2 Signal1
Diff Viewer

Diff-viewer 'show more files' toggle actually toggles now#

The diff viewer's 'show more files' toggle is fixed so it can now be collapsed again, not just expanded

Details 0 0 Feedback
What

In the diff/checkpoint viewer, the toggle that expands a collapsed list of changed files to "show more" previously always forced the list open no matter its current state, because the underlying handler always returned true. It now correctly returns the opposite of the current state, so clicking it again collapses the list back.

Why

This fixes a bug where the file list could only ever be expanded, never collapsed back down, once you'd clicked "show more."

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Fixed
You'll notice
Useful2 Signal1
Elsewhere

Turn-interruption handling now recognizes 'caveat' messages to avoid duplicate placeholders#

Interrupted-turn handling now recognizes trailing 'caveat' messages to avoid duplicate placeholders

Details 0 0 Feedback
What

When Claude Code detects that a turn was interrupted, it used to insert a placeholder marking the turn as incomplete. New logic now checks for a run of trailing "caveat" user messages, and if one is present, it either skips inserting that placeholder or treats the turn as already complete.

Why

This avoids showing a redundant or incorrect "interrupted" marker in the conversation when a caveat message already indicates how the turn ended.

Fixed
You'll notice
Useful2 Signal1
Artifacts

Artifact publish preflight now recognizes a distinct "content_pending" refusal and auto-retries#

Artifact publishing now auto-retries on a specific 'content_pending' server refusal, not just unrecognized errors

Details 0 0 Feedback
What

When publishing an artifact (a generated file or document Claude Code creates and sends to a server), the server can reject the request with an HTTP 422 error. The retry logic that double-checks and resends after such a rejection now specifically recognizes a content_pending error code from the server, using a new step that extracts the status code from the response. Previously it only had a generic fallback for 422 responses it didn't recognize.

Why

This makes automatic retries more reliable when the server reports the artifact's content simply isn't ready yet, rather than treating that case as just another unrecognized failure.

Fixed
You'll notice
Useful2 Signal1
MCP

Session-channel MCP tools now stub-error instead of silently misrouting#

Calling a remote session's own MCP tools directly now fails with a clear error instead of misrouting

Details 0 0 Feedback
What

When working in a remote session, tools that belong to that session's own MCP servers (external tool connections tied to a specific machine) are now represented by a placeholder. If something tries to call one of these tools directly instead of properly routing the call to the right machine, it now throws a specific error instead of silently running incorrectly on the wrong machine.

Why

This turns a silent misrouting problem into a clear, catchable error, making it easier to notice and fix cases where a remote session's tools were being called the wrong way.

Fixed
You'll notice
Useful1 Signal1
Group of 2 Elsewhere

New guard prevents spoofing internal artifact keys#

Claude Code now blocks tool calls that fake internal __artifact-prefixed argument keys, except for tools allowed to set them

Details 0 0 Feedback

What

  • Tool calls whose arguments include a key beginning with __artifact are now denied unless the tool is recognized as one that legitimately mints such keys, with the message "Nothing was done. The arguments carry a key that only Claude Code sets."
  • This relies on a new mintsArtifactKeys() capability check, which is also used to suppress certain artifact-related event logging for contexts that mint their own artifact keys.

Why

This prevents a model or malicious input from spoofing internal artifact bookkeeping keys that only Claude Code itself is meant to set.

Fixed
You'll notice
Useful1 Signal1
Elsewhere

CLAUDE_CODE_EXTRA_BODY can no longer inject the 'afk-mode' anthropic-beta#

CLAUDE_CODE_EXTRA_BODY can no longer be used to inject the afk-mode beta header; only auto mode itself can send it

Details 0 0 Feedback
CLAUDE_CODE_EXTRA_BODY
What

Claude Code now strips any afk-mode value out of the beta-feature list in a custom CLAUDE_CODE_EXTRA_BODY (an environment variable that merges extra fields into every API request). If you had set that beta yourself, it's now removed automatically with a warning, because only Claude Code's own auto mode is allowed to send it.

Why

This stops a custom request body from turning on behavior meant only for auto mode, which sends its own afk-mode beta header through the normal request path rather than through CLAUDE_CODE_EXTRA_BODY.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Fixed
You'll notice
Useful1 Signal1
Plugins Security

Marketplace directory entries walked with lstat when realpath is unreliable, instead of being refused outright#

Marketplace plugin directories with unresolvable paths can now still be scanned safely, instead of being rejected

Details 0 0 Feedback
What

If a plugin marketplace directory's path can't be reliably resolved to its real location (for example, because it contains a backslash on a non-Windows system), Claude Code no longer simply refuses to read it. Instead, it walks the directory tree one component at a time, checking each step to make sure it's a plain directory and not a symlink. Where the path can be resolved normally, entries are still checked by comparing their filesystem identity against the marketplace root, as before.

Why

This lets marketplaces with unusual but legitimate paths still work, while keeping the same protection against symlinks being used to escape the marketplace directory.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Fixed
Under the hood
Useful1 Signal1
Plugins

Plugin hooks module hot-reload now confirms the environment host survived before swapping in#

Plugin hook hot-reload now checks the environment host survived before applying the new modules

Details 0 0 Feedback
What

When Claude Code hot-reloads plugin hook modules (updating them without a full restart), it now waits for the reload to finish and then checks whether the environment host process died partway through. If it did, the reload is aborted with an error instead of being committed.

Why

This prevents Claude Code from swapping in a set of reloaded hook modules against an environment that no longer exists, which could otherwise leave plugins in a broken or inconsistent state after a crash during reload.

Fixed
You'll notice
Useful1 Signal1
Artifacts unclear

Artifact tool_result files_error no longer marked is_error#

Artifact files_error results no longer flagged as errors

Unclear It is not stated what, if anything, now signals this failure to the model instead of is_error.

Details 0 0 Feedback
What

When an artifact operation fails with a files_error, the tool result returned to the model no longer carries the is_error flag that previously marked it as an error result.

Why

This changes how the model perceives a files_error case; without the flag, it may no longer be treated as a hard failure in the same way, though the finding does not say what replaces that signal.

Fixed
You'll notice
Useful1 Signal1
Artifacts

Artifact create-from-type now also rejects a deadline field#

Creating an Artifact from a type_url now also rejects a stray deadline field

Details 0 0 Feedback
What

When an Artifact is created from a type_url (a type-based template), Claude Code already stripped out several fields that don't belong on that kind of creation, such as url, pr_review, capabilities, contract, lang, and force. Now deadline is rejected the same way.

Why

A type-based Artifact always gets its settings from its type, so a deadline value supplied alongside it would be meaningless or conflicting. Rejecting it keeps creation requests consistent and catches a mistake early instead of silently ignoring it.

Fixed
You'll notice
Useful1 Signal1
Auto Mode

New auto-mode verdict message for tool calls truncated by the server#

Auto-mode now explains when a tool permission check is missing because the model's reply was cut off

Details 0 0 Feedback
What

When Claude Code's automatic permission system (which decides whether a tool call needs to ask you first) can't get a verdict, it now shows a specific message when the cause was the model's response being truncated (cut off) mid tool-call, rather than a generic error. Several other distinct "no verdict" error codes were also merged into one shared code, server_unavailable_error.

Why

This gives a clearer explanation when a permission decision couldn't be made because the response was cut short, instead of a vague or misleading error.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Fixed
You'll notice
Useful1 Signal1
Elsewhere

Demo builds no longer show ant-only (internal) announcement banners#

Demo builds of Claude Code no longer show Anthropic-internal-only announcement banners

Details 0 0 Feedback
What

Claude Code can show announcement banners in its status area, some of which are marked internal-only ('ant-only') and meant only for Anthropic staff. Demo builds of the app now always get an empty list for those internal-only announcements, so they're never shown.

Why

This prevents internal-only banners meant for Anthropic employees from leaking into demo instances shown to others.

Fixed
You'll notice
Useful1 Signal1
Plugins Security

Marketplace entry-path validation now flags backslash-containing paths#

Marketplace path validation now also rejects paths containing backslashes

Details 0 0 Feedback
What

When a plugin marketplace entry's file path fails Claude Code's containment check, the explanation now also flags paths containing backslashes as invalid, in addition to the previously flagged absolute paths, paths that climb out of their directory, network-shaped paths, and paths that traverse symlinks.

Why

This closes a gap where a backslash-containing path could otherwise slip past validation meant to keep marketplace entries confined to their intended directory.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Fixed
You'll notice
Useful1 Signal1
Terminal UI

Pointer capture released when alt-screen is torn down or handed off#

Mouse click capture is now cleaned up when the terminal's alternate screen is torn down or handed off

Details 0 0 Feedback
What

Claude Code's terminal renderer uses an "alt screen" (a separate full-screen display terminals use for interactive apps). When that alt screen is handed off (handoffAltScreen()) or deactivated, Claude Code now calls endPointerCapture() and tellPressedNowhere() before resetting terminal modes and repainting.

Why

This cleans up any stuck mouse-press or pointer-capture state left over from the alt screen, preventing leftover mouse interaction state from carrying over incorrectly after the screen is torn down or handed off.

Fixed
You'll notice
Useful1 Signal1
MCP

Bug fix: SIGINT cleanup guard flag was setting the wrong variable#

Fixed a bug where Ctrl-C cleanup for MCP servers checked one variable but set a different one

Details 0 0 Feedback
What

When Claude Code handles Ctrl-C (SIGINT) to shut down MCP servers, the cleanup code used a guard flag to prevent the cleanup from running twice. Due to a bug, it checked one variable but set a different, unrelated one, so the guard never actually took effect. It now correctly sets the same flag it checks.

Why

This fixes a bug that could have allowed MCP server cleanup on Ctrl-C to run more than once instead of being properly guarded against double execution.

Fixed
You'll notice
Useful1 Signal1
Elsewhere

Skill verification bug fix: correct variable used in has() check#

Bug fix: skill verification was checking the wrong variable's set

Details 0 0 Feedback
What

A short-circuit check used during skill verification now checks the set that was actually just built for that check, instead of mistakenly checking a different, out-of-scope variable.

Why

This fixes a bug where the verification step could have skipped or misjudged skills incorrectly because it was looking at the wrong data.

Fixed
You'll notice
Useful1 Signal1
Transcript

Speaker-label merging now walks back over multiple consecutive labelled replies#

Speaker-label grouping in transcripts now walks back over several consecutive labelled replies, not just one

Details 0 0 Feedback
What

When Claude Code figures out where a block of speaker-labelled messages begins in the transcript, it now keeps stepping backward through as many consecutive 'labelled reply' messages as there are, using a new helper. Before, it would only ever step back a single position.

Why

This fixes grouping so that a run of several consecutive labelled replies is treated as one connected block instead of only the last two being linked, giving more accurate speaker-label boundaries in longer transcripts.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Fixed
You'll notice
Useful1 Signal1
Permissions

Windows-style backslash path segments now flagged as suspicious on non-Windows platforms#

Paths containing backslashes are now flagged as suspicious on non-Windows systems

Details 0 0 Feedback
What

A path-safety check now also treats a path as unsafe if it contains a backslash (\) while running on an operating system other than Windows, in addition to its existing checks.

Why

Backslashes are normal path separators on Windows but not on other systems, so seeing one outside Windows can indicate a path is being spoofed or manipulated; flagging it helps catch that kind of attack.

Fixed
You'll notice
Useful1 Signal1
Permissions

File-read permission pre-check for bash-tool args now aggregates all failures instead of stopping at first mismatch#

Bash command permission checks now report every problematic file argument, not just the first one found

Details 0 0 Feedback
What

When Claude Code checks whether a bash command's file arguments are covered by your allowed read paths, it used to stop and report as soon as it hit the first argument that failed the check. It now keeps checking every argument and reports the first problem found only after examining them all. It also now skips paths that already match an allowed pattern before falling back to checking whether the file actually exists on disk.

Why

This makes the permission check more thorough and consistent, so it doesn't miss other problematic arguments in the same command just because it stopped early, while still avoiding unnecessary filesystem checks for paths already known to be allowed.

Fixed
Under the hood
Useful1 Signal1
Elsewhere

Relaunch/spawn paths now explicitly uninstall a stdout write hook before exec/kill#

Relaunch and suspend/resume paths now explicitly remove a stdout write hook first

Details 0 0 Feedback
What

Before relaunching the CLI as a child process, and before resuming after the process is suspended and continued (SIGTSTP/SIGCONT), Claude Code now explicitly calls a helper to uninstall a previously-installed hook that intercepts writes to standard output. Previously these paths either skipped this step or used a different, non-equivalent function.

Why

This avoids leaving the stdout interceptor installed across a relaunch or a suspend/resume cycle, which could otherwise interfere with output in the new process or after resuming.

Fixed
Under the hood
Useful1 Signal1
Telemetry

tengu_sdk_session_crash telemetry now logs the actual caught error#

SDK session crash telemetry now logs the actual error that caused the crash

Details 0 0 Feedback
What

The tengu_sdk_session_crash telemetry event now serializes and logs the exception that was actually caught, instead of an apparently unrelated variable that was being logged before.

Why

This fixes the crash telemetry so it captures the real error, making it more useful for diagnosing why an SDK session crashed.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Fixed
You'll notice
Useful1 Signal1
Elsewhere

Connector registry errors no longer double-wrapped#

Connector registry errors are no longer stripped of their original message when re-thrown

Details 0 0 Feedback
What

When looking up or searching connectors (integrations Claude Code can use, such as external tools registered with it) fails, the error handling now checks whether the error is already the registry's own error type. If it is, that original error is passed through as-is. Previously, it would always be caught and wrapped in a brand-new generic error, which lost the original error's message and type. The classes and logger involved were also renamed internally.

Why

This means that when something goes wrong with connector lookups, the actual underlying error message is preserved instead of being replaced with a generic "Connector registry is unavailable right now" message, making the real cause easier to see.

Fixed
You'll notice
Useful1 Signal1
Policy Limits

refresh() now always clears the on-disk cache, even when ineligible#

Policy-limits cache file is now deleted on every refresh, even for accounts not eligible for limits

Details 0 0 Feedback
What

When Claude Code refreshes its internal policy-limits data, it now always clears the on-disk cache file and drops any unconfirmed session cache, no matter whether the account currently qualifies for policy limits. Previously, if the eligibility check failed, the whole refresh step was skipped and the old cache file was left in place. Now only the reload-and-log step that follows is skipped for ineligible accounts; the cache deletion always happens.

Why

This prevents a stale cache file from lingering on disk when an account's eligibility status changes, so a later refresh cannot accidentally read outdated policy-limits data.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

19 entries

In Developmentopen

In dev
Nothing to try yet
Useful3 Signal3
Group of 3 MCP no docs found

MCP tools can now be 'adopted' as passthrough tools instead of routed through the device bridge#

Remote worker sessions can now adopt a machine's MCP tools directly under policy, tracked via new passthrough_adopted/declined telemetry

Details 0 0 Feedback
adoptMcpOverChannelSwitchOn

What

  • A reworked remote-tools setup pipeline, gated by adoptMcpOverChannelSwitchOn, computes a machineMcpToolsPolicy (allowed/denied/pending/unavailable) for each MCP server and decides whether its tools are "adopted" as passthrough tools, used directly by a remote worker, instead of being routed through the device bridge. Adoption requires remote tool forwarding to be enabled, the channel switch to be on, policy to allow it, and the tool not to be disabled.
  • The remote-tools announce handler now computes passthrough_adopted and passthrough_declined (with reasons policy, pending, or unavailable) outcomes and reports them in telemetry.
  • The remote_tools_announce acknowledgement schema was extended with passthrough_adopted (count of MCP tools kept) and passthrough_declined fields, and ignored_tools now documents more reasons, including tools beyond the cap that the worker keeps.

Why Routing every MCP tool call through the device bridge adds overhead; letting a remote worker adopt and call MCP tools directly, when policy allows, should make those calls faster while keeping visibility into which tools were adopted versus declined and why.

In dev
Nothing to try yet
Useful3 Signal3
Group of 2 Plan Mode no docs found unclear

Plan mode now gated behind a classifier flag#

Plan mode's eligibility for classifier-based permission checks is now controlled by a tengu_violin_plan_classifier gate

Unclear Nothing has been read yet about whether the tengu_violin_plan_classifier flag that controls this is on or off by default.

Details 0 0 Feedback

What A new helper, Ro(), decides whether "plan" is a valid, selectable permission mode and whether the auto-mode/classifier-based permission-check path (used for deciding tool permissions) applies to a given session mode. For plan mode specifically, this now first checks a feature gate, tengu_violin_plan_classifier (enabled by default, evaluated with a tri-state check), before the classifier-based path is allowed to apply.

Why This lets Claude Code control, and if needed roll back, classifier-based permission checks for plan mode independently of other modes, without requiring a code change.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

In dev
Nothing to try yet
Useful3 Signal3
Group of 5 Remote Control

New 'safeguards' capability family for permissions and remote control#

A new 'safeguards' capability, alongside remoteTools/hooks/plugins, now gates safety-classification data and remote-control settings changes

Details 0 0 Feedback

What

  • The permission-context capability record used throughout Claude Code gains a fourth flag, safeguards, alongside the existing remoteTools, hooks, and plugins flags. It gates whether the model's safety/safeguards classification data is attached to a payload.
  • Remote Control's device-attestation and settings-diffing machinery gains a matching safeguards family, used to police apply_flag_settings requests from a paired bridge client that try to weaken safeguards-related settings, and to strip forwarded plugin-marketplace or safeguard settings unless the connection's capabilities explicitly allow them. A new default-capabilities object turns remoteTools, hooks, plugins, and safeguards off by default.
  • The remote transport's flag-settings trust object also gained a safeguards trust category, deciding whether an untrusted or unverified peer may disable safeguards via apply_flag_settings; any below-floor change that can't be verified is dropped and logged rather than applied.
  • A new no-op event-filter hook now runs on every incoming bridge session frame before existing verification logic; it currently does nothing but is now part of the frame-handling pipeline.

Why This lays the groundwork for treating "safeguards" (the model's safety classification data) as its own protected capability, matching how remote tools, hooks, and plugins are already gated, so a remote/bridge connection can't silently weaken or disable safety-related settings unless explicitly trusted to. The actual checklist of settings this protects is currently empty, so the gate exists but doesn't yet block anything in this build.

In dev
Nothing to try yet
Useful3 Signal3
Group of 3 Artifacts unclear

Artifact hot-update mechanism gets its own flag and deadline/seq schema fields#

Artifact hot-update/live-doc syncing now has its own feature flag and new deadline, seq, and unchanged fields

Unclear The finding does not say what the deadline value controls in practice or when deadlineDropped would be set.

Details 0 0 Feedback
deadline

What

  • The artifact hot-update (live-reload) check now uses its own CLAUDE_CODE_ARTIFACT_HOT environment variable and tengu_copper_hinge_wren gate, instead of incorrectly sharing the CLAUDE_CODE_ARTIFACT_TYPES variable and tengu_cobalt_plinth_larch gate used by the separate artifact-types feature.
  • Artifact publish requests can now pass a deadline field, which is forwarded to the create/update/live-doc publish calls; the publish response can echo back deadline plus a deadlineDropped flag, along with new seq and unchanged fields.
  • The artifact/live-doc read response schema gains seq and unchanged fields, and (only when a feature gate is on) deadline/deadlineDropped fields, supporting a long-poll style read.

Why

Separating the hot-update flag from the unrelated artifact-types flag means each can be turned on or off independently without accidental interference. The new deadline/seq/unchanged fields lay the groundwork for telling older open copies of a published artifact when to stop and for tracking whether a read actually changed.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

In dev
Nothing to try yet
Useful2 Signal3
Group of 2 Cloud Agents unclear

Agent-intent forwarding gains owner-only mode and credit tracking#

Forwarded agent intents can now be restricted to owner turns with credit tracking, and the feature can be fully disabled

Unclear It's not clear what user-facing feature or workflow this owner-crediting configuration is meant to support.

Details 0 0 Feedback

What

  • The function that forwards queued commands as "agent intent" now takes a configuration object with credited, readResults, ownerOnly, and creditOwner settings.
  • By default this forwarding is disabled unless a config is explicitly passed in.
  • When enabled, it can mark which forwarded turns came from the "owner" and restrict forwarding to owner-only turns.
  • Telemetry for each forwarded turn now includes ownerTurns and ownerOnly fields, and per-attachment data includes forwardedIntent.

Why This lets Claude Code track and credit which user (the "owner") issued a forwarded command, and gives more control over when agent-intent forwarding happens, including turning it off entirely.

In dev
Nothing to try yet
Useful2 Signal3
Group of 2 Model Catalog unclear

Model-catalog shadow-compare fetch changes: network gating and caching#

The background check that compares the served model catalog now handles network access and caching differently, with a bounded wait

Unclear Whether this gate is enabled for any given account isn't known; nothing has been read yet about the tengu_delegated_quail or tengu_model_catalog_compare gates.

Details 0 0 Feedback

What

  • The background "shadow compare" fetch that checks the served/published model catalog now unconditionally allows network access for its own fetch path (a related sibling call still gates access based on whether Claude Code is running headless). The shadow-compare fetch only runs at all if an internal mode check doesn't disable it (covering environment overrides, bare mode, non-first-party or non-claude.ai auth, missing organization, or policy).
  • The shadow-compare check now first looks at a local cache entry and checks whether it is stale before deciding whether to make a network fetch, then writes the fresh (or errored) result back to the cache.
  • If the fetch does not finish within a fixed time budget, it no longer blocks; instead it schedules a background check to finish later and logs a new model_catalog_late_fetch event.

Why These changes make the background catalog comparison less likely to block or make unnecessary repeated network requests, while keeping the feature itself gated off unless explicitly enabled.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

In dev
Nothing to try yet
Useful2 Signal3
Group of 2 Settings

Symlinked-settings-write fallback is dead code#

A new fallback meant to retry settings writes through symlinked paths never actually runs

Details 0 0 Feedback

What

A new helper (lr) wraps settings-file writes so that, on a permission-type write failure, it checks a new Lo() function and, if Lo() returns true, retries the write with allowSymlink: true (and checkParentDir: false), logging "Writing settings through symlinked path". However, Lo() is a stub that unconditionally returns false, so the retry branch and its log message can never run.

Why

Anyone whose settings file lives behind a symlink and hits this permission error still sees the original failure; the intended fallback to write through the symlinked path does not actually work yet.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

In dev
Nothing to try yet
Useful2 Signal3
Group of 2 Models no docs found unclear

New tengu_fizzy_bonbon gate affects tool-permission resolution#

A new tengu_fizzy_bonbon gate, off by default, branches how tool permission is resolved in fast-mode and auto-mode paths

Unclear Nothing has been read about the tengu_fizzy_bonbon gate, so what the alternate permission-resolution logic actually changes is unclear.

Details 0 0 Feedback
tengu_fizzy_bonbon

What

  • A new gate, tengu_fizzy_bonbon, defaulting to off, was added to the tool-permission resolution flow.
  • In the fast-mode permission path, it switches between alternate ways of resolving tool permission.
  • In the auto-mode streaming path, it picks between two ways of establishing tool permission context/consent: a more direct path, or the existing getToolPermissionContext() await path.

Why This is an internal gated change to how Claude Code resolves whether a tool call is permitted; while off, behavior is unchanged, but it lays groundwork for a different permission-resolution approach.

In dev
Nothing to try yet
Useful3 Signal3
SDK

SDK/headless sessions get an explicit rejection for compact()#

Calling compact() in headless SDK sessions now returns a clear rejection instead of silently doing nothing

Details 0 0 Feedback
What

Headless sessions, meaning ones run with -p or through the SDK without the interactive terminal interface, now expose a compact() method, but calling it currently always fails with an explanatory error. That's because compaction in headless mode currently only happens inside a turn, triggered by a /compact prompt, not through a separate method call.

Why

This gives headless and SDK users a clear, catchable error explaining that compact() isn't available yet in that mode, instead of it failing silently or behaving unpredictably, so they know to work around it for now.

In dev
Nothing to try yet
Useful3 Signal3
Sessions no docs found unclear

Session ID derivation can now use a stable address scheme, behind tengu_session_stable_address#

A new stable-address scheme for session IDs is gated behind tengu_session_stable_address

Unclear The finding doesn't say what a stable address scheme changes about session behavior for users, and the tengu_session_stable_address gate is unread so its default/rollout state can't be reported.

Details 0 0 Feedback
tengu_session_stable_address
What

A new internal check reads the tengu_session_stable_address setting and uses it in several places that determine session IDs and derived secrets, such as choosing whether to hash a value or generate random bytes, and whether a 'derived' source should still be treated as valid.

Why

This lays groundwork for an alternate, more stable way of deriving session identifiers, without yet describing what changes for users when it's active.

In dev
Nothing to try yet
Useful3 Signal3
Artifacts no docs found unclear

New "heli" artifact template kind#

Artifacts gain a new 'heli' template kind alongside existing ones like pr_review and whiteboard

Unclear What 'Heli' is and what the 'heli' template kind produces or is used for isn't explained in the finding.

Details 0 0 Feedback
heli
What

When publishing an artifact, Claude Code can now resolve a template kind called heli, joining the existing kinds pr_review, workshop, whiteboard, prototype, and plain. A new capability object checks whether the page or slug being published is bound to Heli, and if so, a noteHeliPublish call records the publish event.

Why

This adds support for a new artifact template type, though the finding doesn't explain what Heli is or what this template kind is used for.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

In dev
Nothing to try yet
Useful2 Signal3
Telemetry unclear

projectsOwnerRowsForwarding: owner-row credit forwarding gated behind NPt()/vsr()#

A new owner-row credit-forwarding feature for auto mode is gated behind conditions and disabled in nested or teammate sessions

Unclear The finding does not say what the forwarded credit is used for or who receives it.

Details 0 0 Feedback
CLAUDE_CODE_CHILD_SESSION
What

A new internal feature, referred to as "projects owner rows forwarding," forwards credit for rows that come from queued commands or attachments authored by an "owner," tagged with the telemetry label auto_mode_projects_owner_rows. It only runs when two internal conditions are both true, and it's automatically disabled when the session has an agent ID, a teammate context, a certain session-state result, or the CLAUDE_CODE_CHILD_SESSION environment variable set (which marks a session as a subprocess Claude Code itself spawned).

Why

Disabling this forwarding in nested, teammate, or child sessions keeps credit attribution from being duplicated or misapplied when a command runs somewhere other than the top-level session that queued it.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

In dev
Nothing to try yet
Useful2 Signal3
Sessions unclear

Own-endpoint-shadowed detection for /list-agents, gated by tengu_session_stable_address#

/list-agents can now detect when another process is already using this session's own address

Unclear Nothing has been read yet about whether the tengu_session_stable_address flag that controls this is on or off by default.

Details 0 0 Feedback
/list-agents/peers
What

A new check detects when another live process on the same machine is already listening on the socket that represents this session's "stable address" (its identity), even though it's a different process. When that happens, the /list-agents (also /peers) output changes which address token it displays for this session's own entry, to reflect that its usual address is shadowed by the other process.

Why

Without this, a session could display an address for itself that's actually claimed by a different, unrelated process, making it confusing or unreliable for another session to message it correctly.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

In dev
Nothing to try yet
Useful2 Signal3
MCP

Session-served ('bridge') MCP tool routing gains a 'not yet presentable' refusal path#

MCP tools served through a session bridge can now be refused as 'not yet presentable' instead of silently falling through

Feature flag
tengu_violin_wood Off in both readings

The flag server returned off for the account this site reads and for the anonymous baseline. A reading of off cannot rule out a rollout these two readings sit outside of.

This account: off · anonymous baseline: off · compiled default in v2.1.267: off

Read once, for one account on one subscription tier, against v2.1.267. It isn't a statement about your account. What a flag value here can and cannot tell you

Details 0 0 Feedback
What

When Claude Code routes a call to an MCP tool (a tool provided by an external MCP server) served through a session bridge, it now checks a per-session record of that tool's state. If the tool is registered but its provider reports it isn't ready to be shown yet, the call now returns a not_served error directly, rather than falling through to try local or remote dispatch as it did before.

Why

This should prevent Claude Code from attempting to use a bridge-served tool before it's actually ready, giving a clearer error instead of an unpredictable fallback attempt.

In dev
Nothing to try yet
Useful3 Signal2
Artifacts

New "deadline" parameter for artifact republishes (hot mode)#

Artifact republishes can now set a "deadline" to force older running copies to stop

Details 0 0 Feedback
deadline
What

When republishing an artifact (an update to something already published, sometimes called "hot" mode), the artifact tool's prompt now documents an optional deadline field. It accepts values like "now", "15m", "1h", "24h", "7d", or a specific ISO timestamp, and forces older running copies of the artifact to stop by that time. This is gated behind a schema flag (hotOn), and the field only applies to republishes, not ordinary edits, where it should be omitted.

Why

This gives control over how long an outdated running copy of a republished artifact is allowed to keep running before it's shut down, rather than leaving that unbounded.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

In dev
Nothing to try yet
Useful1 Signal2
Group of 3 Telemetry

CCR event uploads gain hold/drain telemetry#

Claude Code Remote (cloud runner) event uploads now report hold and drain metadata behind a new gate

Feature flag
tengu_ccr_upload_hold_marker Not enough to say

Nothing here resolved what this flag was doing on this version, so nothing here should be read as on or off.

This account: no value returned · anonymous baseline: no value returned · compiled default in v2.1.267: off

Read once, for one account on one subscription tier, against v2.1.267. It isn't a statement about your account. What a flag value here can and cannot tell you

Details 0 0 Feedback

What

  • A new uploadHoldMarker setting (gate tengu_ccr_upload_hold_marker, off by default) controls whether the upload-hold telemetry below is included at all.
  • When enabled, worker event uploads sent to /worker/events and /worker/internal-events attach an upload_hold object with details such as held, flush_reason, held_count, hold_age_ms, inflight_retry_count, hold_rule, and post_index.
  • The upload queue now tracks per-lane counters (posts, rows, max rows per post, failed posts, dropped rows, and more), and fires a new ccr_upload_drain telemetry event with lane, trigger, held events/time, posts, rows, failed posts, dropped rows, and drain duration whenever a batch finishes draining.

Why

This gives better visibility into how CCR (Claude Code Remote, the cloud runner) batches and delays event uploads, which helps diagnose upload backlogs or data loss, without changing behavior while the gate stays off.

In dev
Under the hood
Useful1 Signal2
Elsewhere no docs found

New feature gates: tengu_groovy_eclipse and tengu_lucky_quill#

Two new internal feature gates were added: tengu_groovy_eclipse and tengu_lucky_quill

Feature flag
tengu_groovy_eclipse Off by default, switched on for this account

The shipped code defaults this off, and the flag server returned on for the one account this site reads on this version. That is the reading that makes the entry above worth a second look, and it still says nothing about your account.

This account: on · anonymous baseline: on · compiled default in v2.1.267: off

tengu_lucky_quill Not enough to say

Nothing here resolved what this flag was doing on this version, so nothing here should be read as on or off.

This account: no value returned · anonymous baseline: no value returned · compiled default in v2.1.267: on

Read once, for one account on one subscription tier, against v2.1.267. It isn't a statement about your account. What a flag value here can and cannot tell you

Details 0 0 Feedback
tengu_groovy_eclipsetengu_lucky_quill

**What

In dev
Under the hood
Useful1 Signal2
Diff Viewer

Diff panel visibility gains a currently-dead build flag#

Diff panel visibility check gains a new condition that currently has no effect

Details 0 0 Feedback
What

The logic deciding whether to show the diff panel in the terminal's status/footer area now also checks a new function, but that function is hardcoded to always return false, so the new condition is always satisfied and changes nothing yet.

Why

This appears to be groundwork for a future change to diff panel visibility that isn't active in this build.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

In dev
Under the hood
Useful1 Signal2
Remote Tools unclear

CLAUDE_CODE_REMOTE_TOOLS_SERVE env var read but the function reading it has no in-bundle caller#

An unused function still reads the CLAUDE_CODE_REMOTE_TOOLS_SERVE environment variable

Unclear Whether this is dead leftover code or a function awaiting a caller that will be added later is not stated.

Details 0 0 Feedback
What

A function that checks the environment variable CLAUDE_CODE_REMOTE_TOOLS_SERVE (treating it as true if it's unset) exists in the code, but nothing else in the current build actually calls that function.

Why

This has no visible effect right now since the function is never invoked. It may be leftover from removed functionality or preparation for something not yet wired up.

116 entries

Internal Changesopen

·Internal
Under the hood
Useful3 Signal3
Group of 2 Sessions unclear

New "hermetic remote session" restriction reason#

Claude Code now recognizes hermetic remote sessions as a distinct reason certain features are unavailable

Unclear The finding doesn't describe what a hermetic remote session is or which features it restricts.

Details 0 0 Feedback

What

  • A new unavailability reason, "hermetic remote session", was added alongside existing reasons like sandboxed_entrypoint and unpinned_gateway.
  • The eligibility check for a background/remote-settings feature now returns ineligible with reason hermetic_remote_session when running under CLAUDE_CODE_REMOTE combined with CLAUDE_CODE_REMOTE_HERMETIC_MODE, checked before the existing gateway/first-party checks.

Why This lets Claude Code report the correct, specific reason a feature is unavailable when running in a hermetic remote session, instead of falling through to a generic or misleading reason.

·Internal
Under the hood
Useful2 Signal3
Group of 2 Sessions unclear

Conversations and sessions now track whether they originated locally or remotely#

Session state now tracks whether the current conversation originated locally or remotely

Unclear What behavior differs based on this origin tracking, beyond restoring frame/artifact state, isn't detailed.

Details 0 0 Feedback

What

  • SessionController gained conversationOrigin and preClearOrigin state; resetting a conversation now records the prior origin and resets conversationOrigin back to "local".
  • A new markConversationRemote callback was wired into the query-event context and threaded through the main session-loop context object.
  • A Stop-hook path calls markConversationRemote to set the session's conversationOrigin to "remote".

Why This lets Claude Code distinguish conversations that originated remotely from local ones, which other logic (such as artifact-state reconstruction) can use to handle them differently.

·Internal
Under the hood
Useful3 Signal3
Plugin UI

New sandboxed renderer lets plugin UI components (Button/Input/Select) safely rewire closures, plus a reworked hook-chaining framework with call-count throttling#

Plugin UI components like Button, Input and Select now run in a sandboxed renderer that safely reattaches event handlers

Details 0 0 Feedback
What

Plugins that render their own UI (using components like Button, Input and Select) now go through a new sandboxed renderer. When a plugin's UI tree is built, its event handlers (like onPress on a Button, or onInput/onSubmit on an Input) get frozen and passed across a sandbox boundary, then safely reattached ("rewired") afterward so they still work.

Alongside this, the underlying system that lets plugins chain together hooks (functions that run in response to events, using an on(event).catch() style registration) was reworked. Each hook now has a call-count limit, and once a hook is called too many times it is throttled, with a one-time warning logged.

Why

This lets plugin-authored UI safely run in a restricted sandbox without losing the ability to respond to clicks, typing, and submissions, while the call-count throttling guards against a misbehaving hook being invoked in a runaway loop.

·Internal
Under the hood
Useful2 Signal3
Subagents unclear

New sub-agent 'veto under prompt' tracking#

Subagent telemetry now tracks when a subagent is 'vetoed' under a specific prompt

Unclear What triggers a veto and how it affects a subagent's behavior isn't specified in the finding.

Details 0 0 Feedback
What

Claude Code's subagent tracking now includes a recordVeto method and an isVetoedUnder check, backed by a new map that records whether a given subagent was vetoed under a particular prompt. This data is cleared along with the rest of a subagent's telemetry when it's cleaned up.

Why

This lets Claude Code keep track of veto decisions tied to specific prompts for subagents, though the finding doesn't specify what triggers a veto or how it affects subagent behavior.

·Internal
Under the hood
Useful2 Signal3
Model Safety no docs found

thinking_disabled_effort_cap follows the same gate-precedence rework#

The thinking_disabled_effort_cap flag can now override the claude-opus-5 hardcoded default in either direction

Details 0 0 Feedback
What

A helper that decides whether an extra-high reasoning effort cap applies to a model previously required the thinking_disabled_effort_cap flag to be exactly true, or the model to literally be claude-opus-5. Now, any explicit value returned by the flag (true or false) is used first, and the claude-opus-5 hardcoded default only applies when the flag has no value at all.

Why

This mirrors a similar change to another flag in this release, letting the server control this cap explicitly instead of it always being forced on for claude-opus-5.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful2 Signal3
Transcript no docs found unclear

TranscriptSegmenter native module wired in#

A transcript-processing function now uses a dedicated TranscriptSegmenter component

Unclear It's not clear what feature relies on the TranscriptSegmenter or what changes for the user as a result.

Details 0 0 Feedback
What

A function that previously built a generic placeholder object now creates an instance of a TranscriptSegmenter class instead, which appears to be a dedicated, bundled component for breaking up conversation transcripts.

Why

This is internal groundwork; it suggests transcript segmentation is being handled by dedicated logic rather than a generic stand-in, but the finding doesn't specify what user-facing behavior depends on it.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful2 Signal2
Group of 5 Error Handling

New 'cloud_credential_error' classification for Google Cloud credential failures#

Google Cloud credential failures are now classified and reported separately from AWS credential errors and generic auth failures

Details 0 0 Feedback

What

  • A new error category, cloud_credential_error, is added for Google Cloud credential failures, alongside the existing AWS-specific wif_credential_error.
  • A new check inspects an error and reports which cloud provider, AWS or Google Cloud, a credential failure came from, setting an isCloudCredentialError flag on API-error objects when it fires.
  • The generic API error classifier now returns cloud_credential_error for these cases, separate from the existing rate_limit, authentication_failed, and server_error buckets, and treats it as non-fatal like other similar categories.
  • A new account-blocking state maps to this case with the message "cloud credentials unavailable — check or refresh them", and cloud_credential_error is also recognized as an abort/error reason throughout the relevant classification and error-code mapping logic.
  • Documentation describing this error handling was widened from "AWS credential-expiry error" to "AWS / Google Cloud credential failure".

Why Previously a Google Cloud credential problem might have been lumped in with generic authentication failures, making it harder to tell what actually went wrong. Now it's classified distinctly so error messages and handling can point specifically at cloud credential issues.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful2 Signal2
Group of 2 Plugins

Marketplace telemetry no longer sends raw marketplace names by default#

tengu_marketplace_removed and tengu_marketplace_updated events now redact marketplace names unless it's an official marketplace

Details 0 0 Feedback

What

  • The tengu_marketplace_removed and tengu_marketplace_updated telemetry events now send a redacted marketplace_name: the real name only if it's a recognized official marketplace, otherwise the literal string 'third-party'.
  • The raw marketplace name is still sent, but now under a separate field, _PROTO_marketplace_name.
  • A new is_official_marketplace boolean field is also attached to these events.

Why This reduces the amount of potentially identifying third-party marketplace name data sent in telemetry by default, while still distinguishing official marketplaces from others.

·Internal
Under the hood
Useful2 Signal2
Terminal UI

Terminal renderer adds a pointer-capture model for mouse press/drag/release/hover#

Claude Code's terminal display now tracks mouse pointer presses, drags, releases and hovers with a capture model

Details 0 0 Feedback
What

The engine that draws Claude Code's terminal interface now explicitly handles mouse pointer presses, drags, releases and hovering, and can "capture" the pointer to a specific on-screen element for the duration of a drag. While an element holds the pointer captured, mouse wheel scrolling is suppressed.

Why

This is groundwork for more precise mouse interaction in the terminal UI, such as dragging something without the screen also scrolling underneath it at the same time.

·Internal
Under the hood
Useful1 Signal2
Group of 2 Sessions

Transcript hydration now tracks message origin for artifact-state reconstruction#

Session and transcript hydration now track whether messages came from a remote source, changing how artifact state gets rebuilt

Details 0 0 Feedback

What

  • Transcript user/assistant messages can now be tagged remoteSourced: true, and the function that rebuilds artifact state from history now tracks which tool calls came from a remote source and skips local-only reconciliation for those.
  • A new check decides whether to rebuild artifact state from local history at all, based on whether a message's origin is "local" and it is seedEligible.
  • The call that seeds/reconciles initial transcript state now passes an origin (defaulting to "local") and a seedEligible flag, threaded through a new initialMessagesOrigin prop on the session engine constructor.

Why This distinguishes messages that came from a remote source (such as headless or remote sessions) from local ones, so artifact-state reconstruction only reconciles local history instead of double-processing remote-sourced tool calls.

·Internal
Under the hood
Useful2 Signal2
Compaction

Precomputed compaction gains a veto mechanism to avoid repeat attempts#

Precomputed compaction now remembers when a plugin hook rejected it, to avoid retrying the same attempt

Details 0 0 Feedback
What

When Claude Code tries to arm a precomputed (background) compaction, it now checks whether that attempt has already been vetoed. If a session.compact plugin hook previously rejected the compaction, the attempt is skipped, and a veto is recorded whenever a hook-driven compact is skipped this way.

Why

This stops Claude Code from repeatedly trying to precompute the same compaction that a plugin hook keeps rejecting, avoiding wasted work.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful2 Signal2
Elsewhere

New startup step: 'artifact roster' cache is refreshed and awaited during CLI setup#

Startup now refreshes an 'artifact roster' cache and can wait for it before continuing

Details 0 0 Feedback
What

Claude Code's startup sequence now conditionally kicks off a refresh of an 'artifact roster' cache early on, based on checks of whether it's needed and whether identity is already known. If that refresh was started, startup later waits for it to finish, up to a timeout, before continuing — the same pattern already used for refreshing policy limits at startup.

Why

This keeps the artifact roster (Claude Code's record of available artifacts) up to date at the start of a session without indefinitely blocking startup if the refresh is slow, since it only waits up to a capped timeout.

·Internal
Under the hood
Useful2 Signal2
MCP

MCP remote-tool registry now tracks passthrough tools and a generation counter#

MCP remote-tool registry now tracks individual passthrough tools and a change counter

Details 0 0 Feedback
What

The internal registry that tracks tools announced by remote MCP (Model Context Protocol) servers now keeps its list of "passthrough" tools (tools forwarded through rather than wrapped) as a full map instead of just a count. It also now:

  • reports passthroughAdopted in the results when tools are announced
  • exposes a passthroughTools map of tool name to local name via hostsForTable()
  • adds a generation() counter that increases every time something meaningful changes, such as a tool being accepted, cleared, or its status changing
Why

Tracking individual passthrough tools and a generation counter, rather than just a count, lets other parts of Claude Code detect exactly what changed and when, which matters for keeping remote tool state in sync.

·Internal
Under the hood
Useful1 Signal2
Group of 3 Caching unclear

Prompt-cache diagnostics track a 'prefix-break hash' across sessions and forks#

Claude Code now tracks a prefix-break hash to diagnose prompt-cache-busting changes, including across restored sessions and forked agents

Unclear What user-visible effect this has, if any, isn't stated in the finding.

Details 0 0 Feedback

What

  • The per-request cache-state tracker now computes and stores a prefixBreakHash (when hash-sample messages are available), used alongside existing message-hash tracking to help detect changes that break prompt caching. It also tracks a summaryForks map recording parent/child cache state around session summarization and forking (capped at a limit), and reports cache-break telemetry (cacheBroke, changeKinds).
  • When restoring cached session state from disk, entries now compute a hydratedHashRows value from a stored prefixBreakHash when its salt is recognized, and reset callCount/cacheDeletionsPending on restore.
  • The cache-diagnostics tracker also accepts a baselineAgentId, and when a forked agent has no prior baseline of its own, it seeds its baseline from its parent's cache state (forkAgentId/parentKey) instead of starting cold, recording where the baseline came from (baselineHashSource: memory, disk, or none).

Why

This gives better diagnostics for why prompt caching breaks, and it means forked or restored sessions no longer lose their cache-diagnostic history, reducing false alarms about the cache having broken.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful2 Signal2
Terminal UI unclear

TUI: new pointer-press subscription and frame pacing internals#

Internal groundwork was added for mouse clicks and smoother frame timing in the terminal UI

Unclear The finding shows only internal state and method names, not what user-facing behavior, if any, is wired up to them yet.

Details 0 0 Feedback
What

The terminal renderer (the part of Claude Code that draws its text-based interface) gained internal plumbing for two things: a way for parts of the interface to subscribe to pointer (mouse) press events, including a way to notify them when a press lands nowhere in particular, and new internal state for pacing how often frames are redrawn.

Why

This is internal scaffolding rather than a user-facing feature by itself. It lays groundwork that could support mouse-click interaction and smoother screen updates in the terminal interface.

·Internal
Under the hood
Useful2 Signal2
Transcript no docs found unclear

New "recap fold" transcript message type#

A new "recap fold" message type appears in transcripts, styled like other non-animated summary messages

Unclear What content triggers a recap_fold message or what it displays isn't stated.

Details 0 0 Feedback
What

Claude Code's transcript renderer now supports a new message kind called "recap_fold", shown using a new RecapFoldMessage component. It's treated the same way as existing speaker_label/work_segment messages for metadata headers and animation: it never animates in and never appears as a top-level metadata message.

Why

This adds a new way for Claude Code to fold a recap or summary into the transcript display, presented consistently with similar existing message types.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful2 Signal2
Error Handling

New tool_schema_invalid error classification for 400s referencing tools.N.input_schema#

API 400 errors about an invalid tool input schema now get their own error type instead of being generic

Details 0 0 Feedback
What

When Claude Code calls the API and gets back a 400 error whose message references tools.*.input_schema (or the custom-tool variant tools.*.custom.input_schema), it's now recognized and labeled as a tool_schema_invalid error, rather than being treated as a generic, unclassified 400 error.

Why

Giving this specific error its own classification makes it easier to identify that a tool's input schema is the actual problem, rather than having to dig through a generic error message to figure out what went wrong.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful2 Signal2
Plugin UI unclear

Plugin UI press handling can be overridden per plugin/handle, plus a plugin 'tier' concept#

Plugin button presses can now be intercepted by a runner override, and plugins gain a 'core' tier label

Unclear What consumes the tier field or the runner override, and what other tier values exist besides 'core', is not stated.

Details 0 0 Feedback
What

When a plugin UI button or press is handled, Claude Code now first checks for a runner-level override before falling back to the plugin's own press handler. Separately, plugin descriptors and loaded module listings now carry a tier field, with 'core' as one observed value.

Why

The override mechanism suggests something outside a plugin's own code can now intervene in how its button presses are handled, and the new tier field suggests plugins are now categorized, for example distinguishing built-in 'core' plugins from others, though the finding doesn't say what uses this distinction.

·Internal
Under the hood
Useful2 Signal2
MCP

IDE MCP server identified via x-mcp-server-id header and fixed UUID#

Claude Code now recognizes its own IDE MCP server via a header and fixed ID, driving tool auto-allow

Details 0 0 Feedback
What

Claude Code can now tell when an MCP (Model Context Protocol) server connection is actually its own IDE integration by reading an x-mcp-server-id header from the server's configuration and comparing it against a fixed, known value. This recognition feeds into decisions like automatically allowing the mcp__ide__executeCode tool and detecting servers that are set up dynamically.

Why

By positively identifying the IDE's own server instead of guessing, Claude Code can safely grant it default permissions (like running code) without prompting, while still treating unrecognized MCP servers cautiously.

·Internal
Under the hood
Useful2 Signal2
Plugins

Plugin hooks now report a tier (core/prepend/user)#

Plugin hooks now report a tier of core, prepend, or user

Details 0 0 Feedback
What

When Claude Code looks up plugin hooks (scripts that run automatically at certain points), the result now includes a tier field, computed as "core", "prepend", or otherwise "user". Plugin hook metadata now carries {plugin, tier, hook, generation} instead of just {plugin, hook, generation}.

Why

This lets Claude Code distinguish hooks that are built-in ("core"), inserted ahead of others ("prepend"), or defined by the user, which likely matters for how hooks are ordered or prioritized when several apply.

·Internal
Under the hood
Useful2 Signal2
Terminal UI

Terminal/desktop component allowlist tightened, "Client" component added#

Terminal and desktop UI component allowlists drop raw HTML tags; terminal gains a "Client" component

Details 0 0 Feedback
What

The list of components allowed to render in the terminal interface no longer includes the raw HTML-like tags "div", "span", and "b"; the desktop list also drops these. The terminal list gains a new "Client" component.

Why

This tightens what can be rendered in these interfaces, likely closing off generic HTML-style tags in favor of a more controlled, named set of components such as the new "Client" one.

·Internal
Under the hood
Useful2 Signal2
Artifacts unclear

Published artifacts/session-context can carry a deadline field#

Artifacts and session-context data can now carry an optional deadline field

Unclear It's unclear what feature or UI actually uses this deadline field once set.

Details 0 0 Feedback
What

The internal option builders for artifacts and session context (data Claude Code uses to track what's happening in a session) can now include a deadline field when one is set. The schema helper for session context was also updated to accept a deadline alongside the existing label field.

Why

This lays groundwork for artifacts or session context to carry timing information, though the finding does not say what feature consumes it yet.

·Internal
Under the hood
Useful2 Signal2
Elsewhere

Attribution source can now be 'owner' in addition to typed/relay#

Message attribution now recognizes 'owner' as a source, alongside typed and relay

Details 0 0 Feedback
What

The code that determines who or what sent a message previously recognized typed and relay as attribution sources, collapsing anything else to "unattributed." It now also recognizes an owner source value and passes it through instead of discarding it, with corresponding new cases added to related switch statements.

Why

Messages attributed to an owner are now tracked distinctly instead of being lumped in as unattributed, giving more accurate accounting of where a message came from.

·Internal
Under the hood
Useful2 Signal2
MCP

Deferred-tool 'kept' bookkeeping reworked around a unified strict/eager schema builder#

Deferred MCP tool tracking was reworked around a unified schema-building helper

Feature flag
tengu_plucky_orchard Gate removed from the code

This release deleted the gate from the code while it was still reading on for the account this site reads, so the code path no longer asks a flag before running.

This account: on · anonymous baseline: on · compiled default in v2.1.267: not a boolean we can read

Read once, for one account on one subscription tier, against v2.1.267. It isn't a statement about your account. What a flag value here can and cannot tell you

Details 0 0 Feedback
What

Claude Code keeps track of "deferred" tools from MCP servers, meaning tools that are temporarily set aside when a server disconnects and restored if it reconnects. The logic for rebuilding these tools' definitions was reworked to go through one consistent helper function everywhere, instead of each call site handling the strict and eager_input_streaming settings on its own. Whether a tool is treated as "eager" is now computed fresh each time rather than checked once against a static list.

Why

This is an internal consistency fix that should make deferred tool handling behave the same way everywhere it's used, reducing the chance of one call site treating a tool's schema differently from another.

·Internal
Under the hood
Useful2 Signal2
Auto Mode

Auto-mode safety classifier now explicitly blocks when it's unavailable or the transcript is too long, but only for large output schemas#

Auto mode now explicitly blocks large tool outputs when its safety classifier can't run

Details 0 0 Feedback
What

When Claude Code runs in auto mode (which can act on tool results without asking first), it uses a classifier to help decide whether output is safe to proceed with. That decision logic now has a new "blocked" outcome, separate from the existing "unavailable," "refused," and "allowed" outcomes. It triggers when the classifier is unavailable or the conversation transcript is too long to classify, but only when the tool's output schema is large. The reason given is either "classifier context exceeded; output schema too large to pass unreviewed" or "classifier unavailable; output schema too large to pass unreviewed," and the result now also includes an unreviewed true/false flag.

Why

This closes a gap where a large, unreviewable tool output could otherwise slip through auto mode simply because the safety classifier couldn't run; now it's explicitly blocked instead.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful2 Signal2
Elsewhere unclear

New system-reminder template constant#

A new reusable template for building system-reminder messages was added internally

Unclear What specific content this template is used to prefix, or when it fires, is not stated.

Details 0 0 Feedback
What

A new internal template string was added that wraps content in a <system-reminder> tag. System reminders are short notes Claude Code injects into the conversation to give the model extra context it wouldn't otherwise have. This looks like a reusable building block for constructing one, rather than a new reminder itself.

Why

This is small internal refactoring-style plumbing; it doesn't change what reminders say, just how one gets assembled.

·Internal
Under the hood
Useful2 Signal2
MCP unclear

MCP remote tool dispatch reworked for session-sourced hosts and presentability#

MCP tool call routing was reworked to better track per-session remote tool hosts and report a new 'not served' error

Unclear The finding does not say what user-visible situations now trigger not_served versus the previous behavior.

Details 0 0 Feedback
What

The internal logic that decides whether a tool call runs locally or is sent to a remote MCP (external tool provider) host was substantially reworked. It now tracks which "machine" handles each tool individually, checks whether a host is presentable, and distinguishes hosts whose source is the current session from other kinds of hosts. In more cases than before, a call can now fail with a new not_served error, even when the remote-tools capability check itself doesn't fail.

Why

This changes how Claude Code routes tool calls to remote MCP hosts, particularly for session-based hosts, and gives clearer feedback (not_served) when a tool call can't be routed to any host, instead of failing for less specific reasons.

·Internal
Under the hood
Useful2 Signal2
Elsewhere

Large expansion of protected/reserved paths under Claude's config directory#

Claude Code's config directory reserves dozens more file and folder names as internal

Details 0 0 Feedback
What

Claude Code keeps a list of special file and folder names inside its own configuration directory (where it stores settings, sessions, logs and so on) that it treats differently from ordinary project files. That list has grown substantially, adding dozens of new reserved names covering things like usage data, caches, telemetry, task state, remote settings, and skill storage.

A related new function reads a per-skill claim file to determine skill ownership, capped at a size limit; if that file is too large, unreadable, or missing, it falls back to treating everything as claimed.

Why

Reserving these names prevents Claude Code's own internal bookkeeping files from colliding with anything a user or project might otherwise place in that directory, and supports newer features (like skills, daemons, and remote settings) that need their own protected storage.

·Internal
Under the hood
Useful2 Signal2
Cloud Agents

New 'owner timeline' relay for background/spawned agents, with a killswitch#

Spawned background agents can now be given a relayed summary of the project owner's recent 'timeline' posts

Feature flag
tengu_worker_owner_rows_killswitch Not enough to say

Nothing here resolved what this flag was doing on this version, so nothing here should be read as on or off.

This account: no value returned · anonymous baseline: no value returned · compiled default in v2.1.267: off

Read once, for one account on one subscription tier, against v2.1.267. It isn't a statement about your account. What a flag value here can and cannot tell you

Details 0 0 Feedback
What

New code assembles what the project owner recently wrote on "its timeline" and passes it into the context given to a spawned background agent when it starts, with a preface explaining that this is context only, not an instruction to follow. A killswitch can anonymize the attribution so it shows as "unattributed" instead of naming the owner.

Why

This gives background agents visibility into recent owner activity as background context, while the disclaimer guards against the agent mistaking that context for a command, and the killswitch offers a way to strip owner identity from it if needed.

·Internal
Under the hood
Useful2 Signal2
MCP

MCP tool schema normalization/validation consolidated into a single verdict function#

MCP tool schema validation logic consolidated into one shared function with clearer reasons

Details 0 0 Feedback
What

The logic that normalizes an MCP (Model Context Protocol) tool's input schema and checks whether the Anthropic API will accept it — previously duplicated in two places — is now a single shared function. It returns a structured result of either send or drop, with a cause of schema_unsupported, normalize_gated, or api_invalid when dropping.

Why

This is an internal cleanup that removes duplicated logic and gives clearer, consistent reasons when a tool schema is rejected, without changing what gets accepted or dropped.

·Internal
Under the hood
Useful2 Signal2
Transcript no docs found unclear

New 'result_from' content block type for tool results tied to host classifier context#

Assistant transcripts can now include a result_from block linking a tool result to host classifier context

Unclear What practical effect this has for users, or what a 'host' refers to here, is not stated.

Details 0 0 Feedback
result_from
What

When Claude Code reconstructs the assistant's transcript, it can now include a new kind of content block called result_from, alongside the existing outcome and host_context blocks. It is built from a new internal lookup of tool host result lines and associates a specific tool call with a host.

Why

This is an internal transcript-format addition, so it doesn't change what you see directly, but it lays groundwork for tracking which host produced a given tool result.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful2 Signal2
Plugin UI unclear

Plugin/UI environment dispatch gains resolveTables for terminal/desktop surfaces#

Plugin/desktop UI dispatcher gains a resolveTables method for resolving requests per surface

Unclear What user-visible effect resolveTables and the new tier/nextTo/framing plumbing has, beyond the internal mechanism described.

Details 0 0 Feedback
What

The internal dispatcher that manages UI environments (such as terminal and desktop plugin surfaces) gained a new resolveTables method, which resolves a batch of requests against per-surface "core" contexts and passes the answers back through the environment's storeResolved. The load() step now also threads through a tier and a nextTo set for each environment, and the dispatch and callInterface logic gained additional "framing" and "leftOut"/"floors" plumbing.

Why

This is internal plumbing for how plugin UI surfaces resolve and route data; the finding doesn't specify what user-facing capability it enables.

·Internal
Under the hood
Useful1 Signal2
Memory Sync

Team/personal memory sync: org-memory connected mode gains an active picker mount check#

Memory sync now also checks whether another process already owns the local memory endpoint before reporting the org-memory picker as ready

Details 0 0 Feedback
What

When CLAUDE_MEMORY_STORES isn't set, Claude Code's memory-store watcher now runs an extra check before firing the event that marks the org-memory picker as mounted, replacing a differently-named check it used before. Alongside store discovery, a new asynchronous check also runs to detect whether another process already owns the local memory endpoint, reported as ownEndpointShadowed.

Why

This helps Claude Code avoid telling the interface the org-memory picker is ready when it isn't, and lets it notice when a different process is already using the local memory endpoint it would otherwise rely on.

·Internal
Under the hood
Useful1 Signal2
Elsewhere unclear

ANTHROPIC_BETAS values now filtered through a new exclusion list before being applied#

ANTHROPIC_BETAS entries are now filtered against a new exclusion list before being applied

Unclear The finding doesn't say which beta names are on the new exclusion list or why they're excluded.

Details 0 0 Feedback
ANTHROPIC_BETAS
What

When Claude Code builds its list of beta headers from the ANTHROPIC_BETAS environment variable (used to opt into experimental Anthropic API features), each entry is now also checked against a new exclusion list. Entries that match are dropped, on top of the existing trimming of blank entries.

Why

Some beta names can now be blocked outright from being applied via ANTHROPIC_BETAS, regardless of what the user sets, beyond the earlier org-compliance-based blocking of the whole variable.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal2
Effort

Max-effort-level resolution now also considers a session/local override, not just the API-name-based table#

The maximum allowed effort level now also considers a local session override, not just the model's fixed table

Details 0 0 Feedback
What

The logic that resolves the maximum effort level a turn can use now combines a locally-resolved value with the existing table lookup based on the model's API name, and uses whichever is lower. If the resolved value comes out to "max," it's now treated as no cap at all rather than as a specific ceiling.

Why

This lets a session or local setting further restrict the maximum effort level below what the model's built-in table would otherwise allow.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal2
Compaction

Prompt-cache-break diagnostics reworked, with a new bypass path for one source#

Internal prompt-cache-break diagnostics were restructured, with a new bypass for one message source and for disk-seeded cache state

Details 0 0 Feedback
What

Claude Code's internal logic for detecting "prompt cache breaks" (when a cached prompt prefix stops being reusable) was reorganized: the threshold logic for deciding when a break occurred now lives in a shared helper. A new branch handles the case where a specific message source reports no session state, logging a diagnostic event with request ID and cache token counts instead of just returning early. There's also a new early exit that skips break diagnosis entirely when the cache state was seeded from disk.

Why

This is internal diagnostic plumbing rather than a user-facing feature; it should make prompt-cache-break issues easier to trace by giving certain edge cases (missing session state, disk-seeded cache) their own explicit handling instead of falling through to generic logic.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal2
Auto Mode unclear

Auto-mode classifier now factors in owner-sourced permission rules#

Auto model/effort selection now knows whether an active permission rule came from the account owner

Unclear The finding doesn't say how the owner-source flag actually changes the classifier's model or effort decision.

Details 0 0 Feedback
What

The internal classifier that automatically decides which model and effort level to use for a message now also receives a flag indicating whether any of the currently active permission rules were set by an 'owner' source.

Why

This lets the automatic model/effort decision take account-owner-set permissions into consideration, though the finding doesn't say exactly how that factors into the choice.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal2
Transcript unclear

Transcript preview store now threads a transcriptV2 flag#

Message list rendering now passes a new transcriptV2 flag into the transcript preview component

Unclear It's unclear what behavior transcriptV2 actually enables or changes for the reader.

Details 0 0 Feedback
What

The part of Claude Code that renders the message list now passes a new transcriptV2 flag into the transcript preview component, alongside the existing stream.previewStore setting.

Why

The finding doesn't say what this flag controls in practice; it appears to be plumbing for a transcript rendering path.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal2
MCP

Automode remote-tool classifier now special-cases passthrough tools#

Permission classifier now short-circuits for passthrough remote tools

Details 0 0 Feedback
What

The internal classifier that decides whether a remote tool call needs a permission check now specifically detects passthrough tools (tools forwarded directly rather than wrapped). If a tool is flagged as a possible passthrough tool and its input already carries certain reserved keys, the classifier skips its normal logic and returns "no_verdict" immediately. It also tags the classifier's internal record of the call with a reason noting that the tool is a passthrough tool.

Why

This avoids running the full permission classifier on tool calls that are already known to be passthrough, keeping their handling separate and consistent with the rest of the passthrough tool system.

·Internal
Under the hood
Useful1 Signal2
Artifacts unclear

Artifact input-schema log line gains an assets_source flag and drops an endpoints-specific killswitch check#

Artifact schema debug log gains an assets_source flag; an endpoints killswitch check was removed

Unclear The finding does not explain what the removed endpoints exclusion controlled in practice or what effect its removal has.

Details 0 0 Feedback
What

The debug log line generated when Claude Code builds the input schema for the Artifact tool now includes an assets_source value, and a frozenHotUpdate value is now also captured. Separately, the check for the "endpoints" capability flag no longer excludes the case where the endpoints feature flag is set; that exclusion clause was removed.

Why

The added logging gives more visibility into how the Artifact tool's schema is built, while removing the endpoints exclusion changes when the endpoints capability is considered active.

·Internal
Under the hood
Useful1 Signal2
Plugins

Function-hooks loader adds a per-tier 'user tier held' gate#

Plugin hooks loader can now hold an entire 'user tier' of hooks after a prior failure

Details 0 0 Feedback
What

The loader for plugin function-hooks (custom code plugins can run at certain points) now checks each module's tier field. If a previous failure has marked a tier as "held," any module still loading with a "user" tier is skipped entirely rather than going through the normal load process, and it is logged as "not loaded: the user tier is held."

Why

This stops an entire tier of user-level plugin hooks from continuing to load after something in that tier has already failed, rather than letting each module fail individually.

·Internal
Under the hood
Useful1 Signal2
Elsewhere no docs found

Turn-updates and sibling prompt-nudge flags consolidated behind a shared gate helper#

Internal cleanup: turn-update prompt instructions now check their enablement through a shared helper alongside three related flags

Details 0 0 Feedback
CLAUDE_CODE_TURN_UPDATES
What

The internal logic that decides whether Claude's system prompt includes instructions for progress updates during a turn (the "Communicating with the user" section) now shares a common check function with three related settings: bash_output_audience_note, silent_turn_reminder, and thinking_display_updates. The environment variable CLAUDE_CODE_TURN_UPDATES still overrides everything else when set; otherwise the check falls through to a remote configuration lookup and then a per-client capability setting.

Why

This is a behind-the-scenes consolidation of how several related prompt behaviors are turned on or off, making them consistent with each other rather than changing what turn updates look like for users.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal2
MCP

Remote-tools announce flow now tracks passthrough adoption and 'announced' vs 'displaced' state#

Remote-tools connection tracking now records passthrough adoption and distinguishes 'announced' from 'displaced' tool states

Details 0 0 Feedback
What

The internal system that manages tools shared over a remote connection now tracks a passthrough_adopted value as part of its telemetry when tools are announced, and formally distinguishes between a tool being newly 'announced' versus being 'displaced' (replaced by another). This replaces what was previously just a console log message about passthrough tool counts.

Why

This is internal bookkeeping that gives clearer, more structured visibility into how remote tools are being adopted and replaced, rather than changing what users see or can do.

·Internal
Under the hood
Useful1 Signal2
MCP unclear

New sets of tool names for detecting dynamic web-search-capable MCP config#

New internal tool-name lists help detect web-search-capable dynamic MCP server configs

Unclear The finding does not say what user-facing behavior uses these new tool-name lists and helper function.

Details 0 0 Feedback
What

Claude Code gained two new internal lists of tool names: one covering search and lookup tools like image_search, web_search, web_search_fast, web_fetch, and several display-card tools, and another covering tools like image_annotation, generate_image, conversation_search, and recent_chats. A new helper function checks whether any dynamically configured HTTP MCP (Model Context Protocol, a way of connecting external tool servers) server matches a given tool name and scope or type.

Why

This is internal infrastructure for recognizing when a dynamically configured MCP server provides web-search-like capabilities, though the finding doesn't say what feature consumes this detection.

·Internal
Under the hood
Useful1 Signal2
Plugins unclear

Builtin plugin registration now runs unconditionally, plus again for non-local-agent entrypoints#

Built-in plugins now register unconditionally at startup, in addition to existing conditional registration

Unclear What practical difference this makes for a user, beyond registration now happening unconditionally as well as conditionally, is not stated.

Details 0 0 Feedback
What

Claude Code's built-in plugins are now registered once unconditionally as part of its startup check, in addition to the existing registration that happens when CLAUDE_CODE_ENTRYPOINT is not set to local-agent.

Why

This is internal startup plumbing. The finding doesn't specify a user-visible effect, but it suggests built-in plugins are now registered more consistently regardless of entrypoint.

·Internal
Under the hood
Useful1 Signal2
Compaction unclear

Precomputed compaction results#

Conversation compaction can now apply precomputed summaries, with a dedicated error if one fails to settle

Unclear The finding doesn't explain what triggers precomputing a summary ahead of time or what a reader would notice differently during compaction.

Details 0 0 Feedback
What

When Claude Code compacts a conversation (compressing older history to save space), the result of applying a compaction swap now carries additional tracking data: a key, a flag indicating whether it was a replacement, and a precomputedAtUuid identifying when the summary was precomputed. There's also a new dedicated error type for when a precomputed summary fails to settle properly.

Why

This points to compaction summaries now being computed ahead of time in some cases rather than only on demand, with better error handling and traceability if a precomputed summary doesn't finish correctly.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal2
Sessions unclear

Conversation replace-all now marks session as remote-originated#

Replacing all messages in a conversation now marks the session as remote-originated and transforms messages before storing them

Unclear The finding doesn't say what the Coe() transform does to the messages, so its exact effect on stored data is unclear.

Details 0 0 Feedback
What

When Claude Code replaces the entire set of messages in a conversation, it now marks the conversation as remote-originated (via markConversationRemote) and runs the messages through an additional transform step before saving them, rather than storing the raw list as before.

Why

This helps Claude Code correctly track which conversations came from a remote source (such as a synced or delegated session), which matters for features that behave differently depending on where a conversation originated.

·Internal
Under the hood
Useful1 Signal2
Remote Tools

New "unavailable" passthrough-declined reason#

Session protocol adds a new "unavailable" reason for declined passthrough

Details 0 0 Feedback
What

The passthrough_declined value used in some worker/session protocol messages now supports a third reason, unavailable, alongside the existing policy and pending reasons.

Why

This lets Claude Code's internal messaging distinguish a passthrough request that's declined because the feature is unavailable from one declined by policy or one that's still pending.

·Internal
Under the hood
Useful1 Signal2
Sessions unclear

"snooze"-like entries (name/until) now scoped by sessionId#

Snooze-style entries (name/until) can now be scoped to a specific session

Unclear What feature actually creates or reads these session-scoped snooze entries is not stated.

Details 0 0 Feedback
What

Internal "snooze" entries, which pair a name with an until time, can now also carry an optional sessionId. Both the validator that checks these entries and the code that redacts them before logging now accept and pass through this field.

Why

Scoping these entries by session means the same name/until pattern can apply differently depending on which session it belongs to, rather than being treated as global.

·Internal
Under the hood
Useful1 Signal2
Elsewhere unclear

Numbered-list detector on the first message, no in-bundle caller found#

A new check detects numbered lists at the start of a conversation, though nothing yet appears to call it

Unclear No call site was found that actually invokes this numbered-list check, so it's unclear whether or how it currently affects behavior.

Details 0 0 Feedback
What

Claude Code now has a regular expression and function that check whether the very first message in a conversation starts a line with a numbered-list marker, like "1." or "1)". No place in the code that actually calls this specific check with a message list could be found; other similarly-named functions in the code take a different kind of argument (a callback) and are unrelated.

Why

This likely exists to decide whether to suppress a formatting nudge that normally discourages Claude from using numbered lists, based on whether the user's own first message already used one. Since no caller was found, it may not be active yet.

·Internal
Under the hood
Useful1 Signal2
Sessions unclear

New helper bce() gates an unspecified capability on interactive, non-VSCode, non-childSession context#

New internal helper combines interactive/non-child-session/non-VSCode checks into one condition

Unclear It is not established which capability this new helper actually gates.

Details 0 0 Feedback
What

A new helper function combines three existing checks — whether the session is interactive, whether it is not a child session (and not itself a nested claudecode session), and whether it is not the VS Code extension — into a single true/false result.

Why

The finding does not say what feature this gate controls, only that it bundles the same conditions used by the nearby OAuth plugin-scope refresh change, so it likely governs a similar capability.

·Internal
Under the hood
Useful1 Signal2
MCP

Remote-tools-announce worker now reports the dynamic bridge MCP server#

Remote tools announcements now report the status of the dynamic bridge MCP server

Details 0 0 Feedback
What

The handler that responds to remote_tools_announce requests now includes a bridgeServer callback among its dependencies. This callback looks up the app's MCP client that has scope === "dynamic" and reports its name, configuration, and whether it's disabled.

Why

This lets the remote-tools-announce process include information about the dynamic bridge MCP server, giving a more complete picture of active MCP connections when tools are announced remotely.

·Internal
Under the hood
Useful2 Signal1
Artifacts

Artifact/file title-to-filename logic reworked to distinguish 'file' vs artifact kinds#

Artifact filename and extension logic reworked to better distinguish plain files from other artifact kinds

Details 0 0 Feedback
What

Claude Code's logic for turning an artifact's title into a filename has been reworked with new helpers: one splits a filename into its stem and extension, one maps an artifact's content type and language to the right file extension (using an expanded language-to-extension map), and one derives a clean filename from an artifact's title. This replaces and extends the older extension-derivation code, and adds a set of extensions considered "plain."

Why

This should make filenames generated for artifacts (including plain files, distinct from other artifact kinds like diagrams) more accurate and consistent, particularly for content types and languages that weren't well handled before.

·Internal
Under the hood
Useful2 Signal1
Terminal UI

Terminal renderer gets input-priority frame pacing#

Claude Code's terminal display now redraws faster right after you type

Details 0 0 Feedback
What

Claude Code's terminal interface normally redraws itself on a steady timer (about every 16 milliseconds). Now, for a brief 50-millisecond window right after keyboard input arrives, it switches to a much faster redraw rate (about every 4 milliseconds).

Why

This makes typing feel snappier and more immediately responsive, since the display catches up to your keystrokes faster instead of waiting for the next regular redraw tick.

·Internal
Under the hood
Useful1 Signal1
Group of 2 Compaction unclear

Reactive compaction telemetry gains error-kind and cache-cold fields#

Reactive compaction now reports a structured error kind and whether the prompt cache was cold when it ran

Unclear The tengu_reactive_compact_failed gate hasn't been read for this site's account, so nothing can be said about whether it's active here.

Details 0 0 Feedback

What

  • Reactive-compaction failure results now include a structured errorKind field (thrown, no_assistant_message, empty_summary, or the API's own error tag) alongside the existing free-text detail.
  • The reactive-compaction telemetry event now also reports cacheCold (whether the prompt cache was cold) and a status field, threaded through as a new cacheCold option.

Why

This makes it easier to tell why an automatic (reactive) compaction attempt failed and whether a cold prompt cache played a role, improving diagnosis of compaction issues.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Group of 2 Internals unclear

Per-site/per-key severity threshold now skips two feature-gate checks#

Severity threshold lookups no longer require two feature checks to pass before consulting per-site severity config

Unclear The finding does not say what user-visible effect, if any, this has since the explicit off case is still respected.

Details 0 0 Feedback

What The function that computes per-key/per-site severity thresholds (referred to as t1/t2, also dht) used to require both an internal _1() and On() check to pass before it would consult the severityBySite config, otherwise falling back to a default. That early gate has been removed: the function now reads the site's severity config unconditionally (still honoring an explicit "off"), regardless of those two checks.

Why Means severity thresholds configured per site now always take effect rather than being silently skipped when the two gate checks didn't both pass.

·Internal
Under the hood
Useful1 Signal1
Artifacts

Artifact publish-check crash tracking added (Bv/Hv wrapper)#

Claude Code now records tool calls whose permission check crashed, before the error is thrown further up

Details 0 0 Feedback
What

A new small tracking module records the ID of any tool call whose permission check crashed with an unexpected error, rather than a normal halt, keeping a capped list of the most recent crashes and dropping the oldest once the limit is reached. The permission-check function is now wrapped so it records a crash before re-throwing the error.

Why

This gives Claude Code an internal record of tool calls that failed their permission check abnormally, which can help track down why a particular tool call didn't go through as expected.

·Internal
Under the hood
Useful1 Signal1
Auto Mode

Auto-mode safety classifier gets hard size/node budgets on output schemas#

Auto mode's safety classifier now enforces separate hard limits on a tool schema's size and nesting depth

Details 0 0 Feedback
What

When Claude Code's auto mode decides whether a tool call needs your approval, it feeds the tool's output schema to a safety classifier. That schema is now checked against two separate hard limits, one on how many nodes it can expand into and one on its total byte size, each raising its own error when exceeded, instead of a single overall length check.

Why

This makes the safety classifier used in auto mode harder to overwhelm with an unusually large or deeply nested tool schema, since either limit alone can now stop an oversized schema before it reaches the classifier.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Telemetry

tengu_feature_bad / tengu_feature_sad now sanitize the error_code field before sending#

Feature-bad/feature-sad telemetry now sanitizes the error_code field before sending it

Details 0 0 Feedback
What

The internal telemetry events tengu_feature_bad and tengu_feature_sad now validate the error_code value they record. If the value doesn't match an expected pattern, it gets replaced with a placeholder value of nonconforming before being sent.

Why

This keeps malformed or unexpected error codes from being recorded verbatim in telemetry, making the data more consistent and predictable to analyze.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Telemetry

tengu_input_prompt's effort_level now also factors in active permission layers#

The effort_level recorded with tengu_input_prompt now also accounts for active permission layers

Details 0 0 Feedback
What

The effort_level value logged with the tengu_input_prompt telemetry event is now calculated using the session's active permission layers (the rules that govern what Claude Code is allowed to do), in addition to the model and input options it already considered.

Why

This makes the recorded effort level reflect permission context as well as model and input settings, giving a more complete picture in telemetry of how a given turn's effort was determined.

·Internal
Under the hood
Useful1 Signal1
Artifacts

New upload-wire telemetry: byte-flush/response timing and socket reuse tracked per publish request#

New internal telemetry tracks upload connection timing and socket reuse during artifact publishing

Details 0 0 Feedback
What

Claude Code now instruments its network layer to record detailed information about publish/deploy uploads: whether the network connection (socket) was reused from a previous request, how long it sat idle before reuse, whether a response started coming back, how many bytes actually made it onto the wire compared to the total body size, and which local IP address family was used.

Why

This data feeds the new retry-on-dropped-connection logic and related telemetry, giving better visibility into why an upload might have failed or been slow.

·Internal
Under the hood
Useful1 Signal1
Plugin UI

Box key props are validated for uniqueness and stripped before final render#

Terminal UI Box components now validate key props for uniqueness and strip them before rendering

Details 0 0 Feedback
What

In the terminal interface's internal layout system, Box elements can carry a key prop, similar to how React list items use keys. Claude Code now checks that each key is a short string (between 1 and a fixed maximum length) with no control characters, and warns if the same key is used twice under the same parent. If it is duplicated, only the first instance is treated as a valid hover target. After the key has been used to wire up hover behavior, it's now removed from the internal tree before final rendering.

Why

This is internal plumbing that guards against subtle rendering bugs from malformed or duplicate keys in the terminal UI, and keeps the key prop from leaking into what actually gets drawn on screen.

·Internal
Under the hood
Useful1 Signal1
Sessions

Session cache no longer read from disk for thin/adopted sessions#

Session cache no longer reads from disk for thin or adopted sessions

Details 0 0 Feedback
What

When fetching cached session data or checking how old a cache file is, Claude Code now skips reading from disk entirely in cases where disk-based session adoption has been suppressed or an alternate session source is active instead.

Why

This avoids unnecessary or incorrect disk reads for session types, like thin clients or adopted sessions, that shouldn't be relying on the local disk cache in the first place.

·Internal
Under the hood
Useful1 Signal1
Plugin UI

Plugin UI client rendering gets a bounded per-request row budget#

Plugin UI rendering now enforces a cap on terminal rows used per request, with older requests evicted

Details 0 0 Feedback
What

Claude Code now tracks how many terminal rows each plugin's UI client contributes to a given render, keyed by the request, plugin, and client. There's a cap on the total rows allowed, and older tracked requests are evicted once that cap is reached.

Why

This keeps a single plugin's UI output from consuming an unbounded amount of terminal space, and the eviction keeps the tracking data itself from growing without limit.

·Internal
Under the hood
Useful1 Signal1
Remote Control unclear

Remote-control client_initialize gains an extra internal callback#

Remote Control's client-initialize handler now runs an extra internal callback

Unclear The finding doesn't say what the new function (Po()) actually does when a Remote Control client initializes.

Details 0 0 Feedback
What

When a Remote Control client connects and sends client_initialize, Claude Code's handler now calls an additional internal function alongside the existing force-reinitialize step it already ran.

Why

The finding doesn't say what the new function does, so its practical effect on Remote Control connections isn't clear.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Plugin UI

UI element-tree validator (used to check what gets rendered around dialogs) gained hover-scope and Box-key checks#

Internal UI validator adds hover and layout checks and clearer error messages for dialog rendering

Details 0 0 Feedback
What

Claude Code's internal check that validates what can be drawn on screen (used when rendering dialogs and overlays) now tracks additional context called 'hoverScope' and 'siblingBoxKeys', and rejects a Box component's hover.display setting when it's placed around a dialog. It also gives a clearer error message when a Button's properties are misused, and a friendlier error for an unrecognized UI element that now lists the valid element names.

Why

These are internal correctness checks for how Claude Code's own interface is built, but the improved error messages mean any related bug shows up as a much more useful message rather than a cryptic one.

·Internal
Under the hood
Useful1 Signal1
Artifacts

Artifact write-through-store now excludes MCP-fronted types from the store-write path#

Artifacts no longer route MCP-backed data types through the store's write-through path

Details 0 0 Feedback
What

Artifacts (documents Claude Code can create and update, like code files or data files) can be backed by different storage types. The logic that decides which types get written straight through to the data store previously included MCP-fronted (Model Context Protocol) types alongside plain "data" and "write_db" types. That MCP case has been removed, so only "data" and "write_db" types now use this write-through path.

Why

This narrows which artifact types are treated as directly writable to storage, likely because MCP-backed artifacts need different handling than locally stored ones.

·Internal
Under the hood
Useful1 Signal1
Artifacts

Artifact URL inputs are now classified for telemetry on write/publish errors#

Malformed Artifact URLs passed to publish or link actions are now classified and reported in telemetry

Details 0 0 Feedback
What

When a publish or link action receives an artifact URL that's malformed or unexpected, a new classifier now categorizes what's wrong with it, using labels such as chat_artifact_link, viewer_path_bad_id, bare_id, missing_scheme, loopback_host, and same_artifact. This classification is sent via telemetry whenever a specific error code is hit.

Why

Categorizing the specific way a URL is malformed makes it easier to spot patterns in what's going wrong with artifact links, rather than lumping every bad-URL error together.

·Internal
Under the hood
Useful1 Signal1
Elsewhere

Scheduled/cron worker now awaits policy-limits cold start before running#

Scheduled cron tasks and claude mcp serve now wait for policy limits to finish loading before starting

Details 0 0 Feedback
What

The worker that runs scheduled (cron) tasks now waits for awaitPolicyLimitsColdStart to complete before it starts dispatching any scheduled tasks, and registers a stopPolicyLimits cleanup step if the operation is aborted partway through. The claude mcp serve command does the same: it now waits for policy limits to finish loading before running its usual setup, sandbox check, and server startup.

Why

Waiting for policy limits to be ready before running scheduled tasks or starting an MCP server should prevent those tasks from running briefly without the correct limits in place.

·Internal
Under the hood
Useful1 Signal1
Telemetry

Session-name telemetry now classifies theme into a fixed set, defaulting unknown themes to 'custom'#

Startup telemetry now reports theme as one of a known set of names, labeling anything else 'custom'

Details 0 0 Feedback
What

When Claude Code sends startup telemetry, the theme field used to report whatever value was set for the theme, verbatim. It now checks that value against a fixed list of known theme names and sends custom instead if the configured theme isn't on that list.

Why

This keeps theme telemetry data consistent and easier to analyze, by grouping any non-standard or custom theme configurations under a single label rather than sending arbitrary values.

·Internal
Under the hood
Useful1 Signal1
Elsewhere unclear

Recap component supports a trailing element#

The recap UI row can now render an extra trailing element after its content

Unclear The finding doesn't say what, if anything, currently makes use of the new trailer element.

Details 0 0 Feedback
What

The UI component used for "recap:" rows now accepts an optional trailer element, which is displayed after the recap's main content, alongside its existing content and margin options.

Why

This is a small building-block change that lets recap rows show additional trailing information, though the finding doesn't specify what content now uses it.

·Internal
Under the hood
Useful1 Signal1
Plugins

Plugin marketplace UI validates every entry with a shared allowlist-sanitizing helper#

Plugin marketplace settings now validate each allowlist entry and blank the list if every entry is bad

Details 0 0 Feedback
What

A new shared helper validates array-based settings such as plugin marketplace allowlists entry by entry. Any entry that fails validation gets reported individually rather than silently dropped. If every single entry turns out invalid, the whole list is forced to empty with a warning, instead of Claude Code quietly keeping a partially broken list around.

Why

This avoids a settings file ending up in a half-valid state that behaves unpredictably; if a list is completely broken, it's cleared with a clear warning instead of causing confusing partial behavior.

·Internal
Under the hood
Useful1 Signal1
Elsewhere

Gateway skips retry-eligible-status marking for 429s tied to forwarded user identity#

Gateway no longer treats per-user 429 rate limits as generic retryable errors when forwarding user identity

Details 0 0 Feedback
What

Claude Code's model gateway (the component that routes requests to an upstream AI provider) can be configured to forward a user's identity to the upstream. When a request made this way, using the 'raw' upstream kind with forwardUserIdentity and a resolvable user email, comes back with a 429 (rate limited) response, the gateway no longer marks it as a generic retryable error status.

Why

A 429 tied to a specific forwarded user's identity reflects that user's own rate limit rather than a generic gateway problem, so it no longer gets bucketed with other retryable gateway errors.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Terminal UI unclear

Nonblocking stdout install failures get richer, deduplicated telemetry#

Failures installing the fast, non-blocking stdout writer now log more detail and report telemetry once per reason

Unclear The finding does not say what effect, if any, this has on the reader beyond diagnostics; behavior when the fast path fails to install is otherwise unspecified.

Details 0 0 Feedback
What

Claude Code uses a fast, non-blocking way of writing to the terminal's standard output when possible. When that setup fails to install, the log message now includes the specific system error code (errno) instead of a generic message. A new 'skipped' telemetry event is also sent, but only once per distinct failure reason (duplicates are filtered out), alongside the existing 'installed' event that already reported successes.

Why

This makes it easier to diagnose why the faster output path isn't being used on a given system, without flooding telemetry with repeated identical failure reports.

·Internal
Under the hood
Useful1 Signal1
Elsewhere

@mention rendering/redaction helper#

A new helper renders @mention placeholders in text as @Claude, @you, or a truncated viewer name

Details 0 0 Feedback
What

A new internal function replaces <mention:ID> placeholders found in text with a readable form: '@Claude' for a mention of Claude, '@you' when the mention refers to the person viewing it, or a truncated '@viewer' name with an ID prefix for anyone else. Placeholders with IDs it doesn't recognize are left as-is.

Why

This lets text containing raw mention placeholders display as readable @-mentions instead of internal ID strings, similar to how @-mentions appear in chat apps.

·Internal
Under the hood
Useful1 Signal1
Remote Tools

New telemetry recorded when remote tools are switched off#

Turning off remote tools now logs a 'gate_off' telemetry event with the prior tool registry

Details 0 0 Feedback
What

When remote tools get switched off, whether because of a channel_off or switch_off condition, Claude Code now records a gate_off telemetry event that captures a snapshot of the tool registry as it existed right before clearing it.

Why

This gives better visibility into when and why remote tools got disabled, which can help diagnose unexpected loss of remote tool access.

·Internal
Under the hood
Useful1 Signal1
Permissions unclear

URL trust check simplified — 'reserved name' special case removed#

URL trust checks simplified, dropping a separate 'reserved name' special case

Unclear The finding doesn't say what the removed 'reserved name' case covered or whether its behavior is now fully absorbed by the remaining checks.

Details 0 0 Feedback
What

The internal check for whether a URL points to a trusted internal link is now a single combined check: it verifies the protocol is https:, runs a link-eligibility check, and confirms the path matches an allowed list of prefixes. A previous special case that separately handled certain 'reserved name' paths through its own dedicated function has been removed.

Why

This simplifies the trust logic for internal links into one consistent rule, removing a separate carve-out that existed before.

·Internal
Under the hood
Useful1 Signal1
Transcript no docs found unclear

New "recap_fold" transcript segment type#

Transcripts gain a new 'recap_fold' segment type, handled like speaker labels

Unclear The finding doesn't say what a 'recap_fold' segment actually contains or when it gets created.

Details 0 0 Feedback
What

Claude Code's transcript display can now include a new kind of segment called recap_fold. It's handled the same way as the existing speaker_label segment type in several places that control whether a message is shown, whether it counts toward live status, and how messages get folded together in the view. Like system and attachment messages, recap_fold segments are skipped when counting messages, and like speaker_label segments, they never match when searching the transcript.

Why

This lets the transcript view represent a new kind of grouped or summarized content without breaking existing search, counting, or display logic.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Telemetry

Login telemetry adds via_unix_socket field#

Login telemetry now records whether authentication happened over a unix socket

Details 0 0 Feedback
What

The base telemetry data sent with login events now includes a via_unix_socket field, recording whether the authentication request went over a unix socket (a local file-based connection method, as opposed to a network connection).

Why

This gives Anthropic more detail about how authentication is happening, which can help diagnose login issues tied to the connection method.

·Internal
Under the hood
Useful1 Signal1
Elsewhere

Redaction now scrubs req_ request IDs from logs#

Log scrubbing now also masks req_ request IDs

Details 0 0 Feedback
What

Claude Code's log-redaction process, which already strips things like UUIDs, hex strings, base64 data, and IP addresses from logs, now also matches and replaces request IDs in the form req_XXXXXXXXXXXX with <id>.

Why

This keeps request identifiers out of stored or shared logs, reducing the amount of potentially sensitive or traceable data that gets logged.

·Internal
Under the hood
Useful1 Signal1
Error Handling unclear

'server_unavailable_timeout' removed from timeout-suffix list#

server_unavailable_timeout no longer gets a '(timed out)' suffix on its error message

Unclear Why server_unavailable_timeout specifically was removed from the list is not stated.

Details 0 0 Feedback
What

A helper that appends " (timed out)" to certain error messages used to do so for server_unavailable_timeout along with wall_clock_timeout, connection_timeout, and server_call_unavailable_timeout. It no longer includes server_unavailable_timeout in that list; the other three still get the suffix.

Why

This changes the wording of error messages shown for that specific timeout case, though the finding does not say why it was singled out.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Telemetry

Version-string classifier regex extended with more distribution-channel suffixes#

Telemetry now recognizes engine, byoc, gateway, and ccs as version-string distribution tags

Details 0 0 Feedback
What

The pattern used to classify version strings for telemetry sanitization now recognizes four new pre-release or distribution-channel tags: engine, byoc, gateway, and ccs, in addition to the existing dev, alpha, beta, rc, test, and nightly tags.

Why

This lets telemetry correctly categorize version strings coming from these additional distribution channels instead of treating them as unrecognized.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Credentials

Credential-storage backend telemetry now distinguishes fallback chains#

Credential storage telemetry now reports which backend or fallback chain was actually used

Details 0 0 Feedback
What

Telemetry sent when OAuth login tokens are saved (or fail to save) now tags the storage backend more precisely. It recognizes keychain, plaintext, and windows-credman, as well as composite fallback chains like "<x>-with-<y>-fallback", and reports anything else as other.

Why

This gives more detail on which credential storage method was actually used, including cases where the system fell back from one backend to another, which helps diagnose storage issues across different platforms.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Elsewhere

Bash command classification set consolidated (search/read/list)#

Bash command classification for search/read/list commands was consolidated into one combined set

Details 0 0 Feedback
What

Claude Code's logic for recognizing whether a bash command counts as a "search," "read," or "list" command (used for permission decisions) now draws from a single combined set built out of several smaller ones. One of those smaller sets specifically lists ls, tree, and du as list-type commands.

Why

Consolidating these lists makes the classification used for permission checks more consistent, since commands like ls, tree, and du are now explicitly grouped as list operations alongside the existing search and read categories.

·Internal
Under the hood
Useful1 Signal1
Plugin UI unclear

Render tree now handles a 'Client' component type#

Plugin UI rendering adds support for a new 'Client' component type

Unclear What a 'Client' component type represents or looks like in a plugin's UI is not stated.

Details 0 0 Feedback
What

The function that walks a plugin's UI render tree (used for both rendering and permission checks) now has a dedicated branch for a component of type Client, handling it before falling through to the generic children-recursion or the existing Button/Input/Select handling.

Why

This adds support for a new kind of UI component in plugin interfaces, though what a Client component represents or renders as isn't stated.

·Internal
Under the hood
Useful1 Signal1
Plugins

Plugin event-clause dispatch now excludes already-registered clauses#

Plugin event dispatch can now skip clauses that have already been registered

Details 0 0 Feedback
What

The function that matches an incoming event against a plugin's declared clauses (conditions that trigger a plugin handler) and builds the resulting handlers now accepts a list of clause indexes to skip, and passes along a registration value to each per-clause handler. Clauses whose index is in the skip list are no longer matched again.

Why

This avoids re-registering or re-triggering a plugin clause that's already been registered, preventing duplicate handler invocations for the same event clause.

·Internal
Under the hood
Useful1 Signal1
Plugins unclear

New consolidated 'plugins effectively enabled' check svr#

A new internal check consolidates several conditions that decide whether plugins count as effectively enabled

Unclear The finding does not say what M7e() checks or what visible effect the consolidation has for users.

Details 0 0 Feedback
What

Claude Code now uses a single combined check to decide whether plugins are effectively enabled, folding together several existing conditions: an internal capability check, whether everything is disabled, whether hooks (automated scripts that run on events) are disabled, and whether the setup is management-only. This feeds into the existing security-default calculation.

Why

This is an internal consolidation of logic that previously existed as separate checks. It should not change behavior on its own, but it centralizes how Claude Code decides when plugin-related security defaults apply.

·Internal
Under the hood
Useful1 Signal1
MCP

New URL/endpoint redaction helpers for MCP server telemetry and logs#

MCP server addresses are now redacted before being logged or sent in telemetry

Details 0 0 Feedback
What

Claude Code can connect to MCP servers (external tool providers) over various endpoints and commands. New internal helper functions now parse an MCP server's endpoint before it's reported in logs or telemetry, and redact anything sensitive: they mask template placeholders, strip credentials and file paths from URLs down to just the origin or host, and replace sensitive substrings with x characters or ${...} placeholders.

Why

This prevents credentials, file paths, or other sensitive details embedded in an MCP server's connection string from leaking into logs or telemetry data.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Self-Hosted Runner

Self-hosted runner host-config snapshot now skips skills already synced from org, plus daemon/agent-memory dirs#

Self-hosted runners now skip re-copying already-synced skills into session containers, and exclude daemon/agent-memory folders

Details 0 0 Feedback
What

When a self-hosted runner prepares a session container, it copies over a snapshot of the host's ~/.claude configuration directory. That snapshot now leaves out dotfiles in general, plus any paths starting with daemon or agent-memory, and checks a new bookkeeping file to avoid re-copying skills that were already synced in from an organization.

If that bookkeeping file can't be read or is malformed, the runner seeds no skills into the session at all, and logs a warning telling the operator to delete the stale file.

Why

This avoids duplicating skills that are already managed centrally by an organization, and keeps daemon and memory state out of session snapshots where it doesn't belong. The warning matters because a corrupted bookkeeping file silently disables all skill seeding until it's cleaned up.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Terminal UI

Pane component gains a 'suggestion' top-border highlight state#

Panes in Claude Code's terminal UI can now be highlighted with a distinct 'suggestion' top border

Details 0 0 Feedback
What

The Pane component used to draw boxed sections in Claude Code's terminal interface now accepts new lit and resize properties. When lit is set, the pane's top border is drawn in a distinct highlighted color instead of the normal dim border.

Why

This gives Claude Code a visual way to call attention to a specific pane, such as one being suggested to the user, without changing the rest of its styling.

·Internal
Under the hood
Useful1 Signal1
MCP

MCP tool-listing pipeline refactored to a shared metadata object plus overrides#

Internal rework of how Claude Code builds MCP tool listings, with no user-facing behavior change described

Details 0 0 Feedback
What

The internal code that builds the list of tools exposed by MCP (Model Context Protocol, a standard for connecting external tools to Claude) servers was restructured. Shared metadata for a server, such as its name, scope, prompt overrides, and telemetry info, is now built once per server, and each individual tool merges in its own overrides (such as Claude-in-Chrome or SDK server overrides) through a shared builder function, instead of each tool being assembled inline from scratch.

Why

This is a code organization change to how MCP tool metadata is assembled internally; it does not describe a change in what tools do or how they behave.

·Internal
Under the hood
Useful1 Signal1
Elsewhere

Ambient-credential detection for MCP servers now operates on the URL rather than full config object#

Claude Code's ambient-credential check for MCP servers now looks only at the server URL

Details 0 0 Feedback
What

Claude Code flags an HTTP or SSE-based MCP server as using an 'ambient credential' when it appears to pick up authentication automatically rather than through an explicit credential you provided. That check now looks only at the server's URL instead of the entire server configuration object, and a new helper combines it with checks for static auth headers and CLI-owned servers.

Why

Narrowing the check to just the URL makes the ambient-credential detection more targeted, reducing the chance that unrelated configuration fields affect whether a server gets flagged.

·Internal
Under the hood
Useful1 Signal1
Compaction unclear

Compaction buffer builder similarly reworked for assistant/runLink lineage#

Companion buffer-compaction routine also reworked to follow assistant/run-link message lineage

Unclear The finding does not say what practical effect this has beyond matching the loader's new approach.

Details 0 0 Feedback
What

A related low-level routine that trims a transcript buffer down to the working set of messages was also rewritten, now walking assistant-message lineage through ancestor-following helper functions instead of a simpler linked-offset walk.

Why

This pairs with the transcript pass-2 loader rework, changing how Claude Code decides which parts of a long conversation to keep in the working buffer during compaction.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Artifacts

Comment-thread handoff responses now carry a handOff field through#

Comment-thread handoff responses now pass through a handOff field

Details 0 0 Feedback
What

When Claude Code explains why it didn't automatically reply to or edit a comment thread (for example, because the artifact is generated from a source file), the response now includes a handOff field carried through from the input, in addition to the existing summary and detail text.

Why

This makes the handoff information available alongside the explanation, though the finding doesn't specify what consumes this added field.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Elsewhere unclear

New daemon/background-launcher failure-reason categorizer#

Claude Code now explains more clearly why a background process failed to start

Unclear The finding does not say where this categorized reason is surfaced to the user, only that it is computed.

Details 0 0 Feedback
What

A new internal function reads the error text (stderr) produced when a background launcher or daemon process fails to start, and works out a reason for the failure: an exit code, a signal name, a generic launcher failure marked with a <daemon-stderr> tag, an error that mentions a file path, or a fallback 'other' reason when none of those match.

Why

This makes failures of background processes easier to diagnose, since the underlying error is categorized into a specific reason instead of being reported generically.

·Internal
Under the hood
Useful1 Signal1
Elsewhere

System-attachment inclusion in context summary now capped by byte/size budget#

Conversation summaries now cap system attachments by total size, not just by count

Details 0 0 Feedback
What

When Claude Code builds a shortened view of the conversation for internal use, it already limited how many system attachments (files or data folded into the conversation) it could include by count. It now also tracks a running total of their size in bytes and stops adding them once that budget is reached, in addition to the existing count limit. The underlying data is also now read through a function that can explicitly signal when there is no more data.

Why

This prevents a conversation summary from growing too large just because it contains many small system attachments that individually stay under the count limit, keeping the summarized context bounded by actual size.

·Internal
Under the hood
Useful1 Signal1
Hooks

Hook-failure reporting split into separate log and emit steps#

Hook-failure handling now logs and reports failures as two separate steps

Details 0 0 Feedback
What

When a hook (a user-configured script that runs at certain points in Claude Code) fails, the code that handles this now performs two separate steps built from a shared failure report, instead of one combined step. This applies consistently both when a hook fails during normal use and during the startup/bootstrap process.

Why

Splitting logging from reporting makes the failure-handling path clearer and more consistent between the two places it runs, though the finding does not indicate any visible change in behavior to the user.

·Internal
Under the hood
Useful1 Signal1
Telemetry

Background-agent telemetry no longer includes agent template name#

Background-agent telemetry no longer records which agent template was used

Details 0 0 Feedback
What

The tengu_bg_agent_action telemetry event, sent for "respawn" and "reply" actions on background agents, no longer includes the name of the agent template that was involved.

Why

This is an internal telemetry change; it does not affect what Claude Code does, only what gets recorded about background agent actions.

·Internal
Under the hood
Useful1 Signal1
Policy Limits

Policy-limits fetch now uses an AbortController and reports cycle_aborted#

Policy-limits fetches can now be cleanly aborted, logged as 'cycle_aborted'

Details 0 0 Feedback
What

The component that fetches policy limits now uses an AbortController to cancel in-flight network requests. Its abort signal is passed into the fetch call and gets recreated whenever the fetcher is stopped. If a fetch is aborted, or if the session generation changes mid-flight, the outcome is now logged as cycle_aborted, and the fetchAndLoad function checks for this aborted state in addition to its previous check for a changed session generation.

Why

This makes policy-limits fetching more robust by properly canceling requests that are no longer needed and giving clearer diagnostic information when a fetch is interrupted, rather than letting stale or interrupted requests run to completion silently.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Diff Viewer

Diff panel read-deny check now considers two root candidates instead of one#

The git diff panel now checks two possible root paths when deciding if a changed file is hidden from view

Details 0 0 Feedback

**What

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Artifacts

New MIME type for structured artifact-publish refusal responses#

Artifact requests now also accept a new 'frame-refusal' response format from the server

Details 0 0 Feedback
What

Requests related to publishing artifacts (generated files or documents Claude Code sends to a server) now include a new content type, application/vnd.ant.frame-refusal+json, in their Accept header alongside the existing application/json.

Why

This lets the server respond with a distinct, structured format specifically for refusals when it can't fulfill an artifact request, rather than only plain JSON.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Terminal UI unclear

Stats view (ctrl+s copy) component — internal recompile, one call-site argument order looks changed#

Internal rework of the stats screen's ctrl+s copy handler, possible but unconfirmed argument change

Unclear Whether the changed argument reflects an actual behavior change to what ctrl+s copies, or is purely a side effect of renaming.

Details 0 0 Feedback
What

The part of the terminal interface that handles pressing ctrl+s to copy stats had its internal code reorganized, including renamed variables and functions. One of the arguments passed to the copy-to-clipboard helper differs from before, which might reflect an actual change in what gets copied, though this could not be confirmed against the underlying function.

Why

If this is just a rename, nothing changes for users of ctrl+s to copy stats; but it's called out in case the copied content behaves differently.

·Internal
Under the hood
Useful1 Signal1
MCP unclear

Tool-entry dedup logic loosened in schema-change tracking#

Tool-entry dedup when tracking schema changes now only checks against already-kept entries, not a separate reference set

Unclear What visible effect this has for users, since the finding only describes the internal dedup condition, not its downstream consequence.

Details 0 0 Feedback
What

In the internal logic that tracks which tool entries are kept, stripped, or removed when a tool's schema changes, an entry is no longer excluded from the "kept" list just because a tool of the same normalized name exists in a separate reference set. Now, an entry is only blocked from being added if it's already in the kept list itself.

Why

This loosens the deduplication rule, which likely means fewer tool entries get incorrectly dropped from the kept list during schema-change tracking, though the finding doesn't specify the exact downstream effect.

·Internal
Under the hood
Useful1 Signal1
Elsewhere

Command-queue dispatch loop internals reworked (drainCommandQueue)#

Internal rework of the command-queue dispatch loop, no new behavior found

Details 0 0 Feedback
What

The internal loop that dequeues and dispatches commands within a session was substantially restructured, with helper functions renamed and refactored. It still handles the same things as before: prioritizing orphaned permission requests, redelivering poll events on reconnect, and waiting on MCP (Model Context Protocol) connections before dispatching commands.

Why

This appears to be an internal refactor with no new externally visible behavior identified.

·Internal
Under the hood
Useful1 Signal1
Compaction

Compaction path records whether it was 'replaced by hook' vs core-run#

Compaction now records when a hook fully replaced Claude Code's own summarization logic

Details 0 0 Feedback
What

When Claude Code compacts a conversation (shrinking old messages into a summary to save space), it now builds a marker recording whether the built-in compaction process actually ran, or whether a session.compact hook replaced it entirely. This is reported along with token counts through a new telemetry event, tengu_compact_replaced_by_hook.

Why

This gives Claude Code (and whoever reviews this telemetry) visibility into whether a custom hook is taking over compaction instead of the default logic, which matters for diagnosing unexpected compaction behavior.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal1
Remote Tools

Remote-tools 'announced' telemetry gains passthrough_adopted counter#

Remote-tools telemetry adds a passthrough_adopted counter and drops an old console log

Details 0 0 Feedback
What

The telemetry Claude Code's remote-tools worker sends when announcing tool status now includes a new passthrough_adopted count, alongside the existing passthrough counters, plus a companion log entry for displaced/announced tools. A console log line that used to report the count of MCP tools not taken over has been removed.

Why

This is internal telemetry bookkeeping for how remote tool handoffs are tracked; it doesn't change what a user sees or does.

·Internal
Under the hood
Useful1 Signal0
Elsewhere

Version bump and build metadata (housekeeping)#

Routine version bump to 2.1.267 with no independent behavior changes

Details 0 0 Feedback
What

This release's build metadata, including the version string, build time, and git commit identifier, was updated to 2.1.267.

Why

This is routine housekeeping tied to the release process and doesn't reflect a behavior change on its own.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal0
Compliance unclear

Compliance-taint restriction check consolidated behind a helper, semantics likely unchanged#

Compliance-taint restriction check refactored to use a shared helper function

Unclear Whether the consolidation changes behavior in any edge case is not confirmed.

Details 0 0 Feedback
What

The check that determines whether a compliance taint denies a given restriction now calls a single shared helper function instead of iterating directly over an internal lookup map. The finding indicates this is a code cleanup rather than a behavior change.

Why

This is an internal restructuring that consolidates logic into one place; it is not expected to change what gets restricted or allowed.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal0
Credentials

"HAS OAuth token save" failure warning text#

The "Failed to save OAuth tokens" warning text was moved into a shared constant

Details 0 0 Feedback
What

The warning message "Failed to save OAuth tokens," shown when Claude Code can't save an OAuth authentication token, is now defined once as a shared constant instead of being written inline. It's still combined with the specific error detail when logged.

Why

This is a small internal cleanup with no change to what you see when a token save fails.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal0
MCP

Large MCP/session control-handler hunks are pure symbol renames#

Large-looking diffs in two control-handler code sections turn out to be pure variable renames

Details 0 0 Feedback
What

Two sizeable code sections, one handling MCP tool-call, toggle, and auth control requests, and another handling artifact verify, upload_asset, list_files, read_file, read, and delete actions, show large diffs, but on inspection every changed line is just a minifier renaming internal variables (for example Cn to In, Ze to nt). No logic was added, removed, or changed.

Why

This is a cosmetic change from the build process with no effect on behavior; it's noted here only to explain why these sections appear heavily modified.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

·Internal
Under the hood
Useful1 Signal0
SDK

SDK control-protocol handler (mcp_set_servers/reload_plugins/reload_skills/mcp_call etc.) — no discernible functional change#

Internal cleanup of the SDK control-message handlers, no functional change found

Feature flag
tengu_ptc_enabled Not enough to say

Nothing here resolved what this flag was doing on this version, so nothing here should be read as on or off.

This account: no value returned · anonymous baseline: no value returned · compiled default in v2.1.267: on

Read once, for one account on one subscription tier, against v2.1.267. It isn't a statement about your account. What a flag value here can and cannot tell you

Details 0 0 Feedback
What

The internal code handling SDK (software development kit) control messages, such as mcp_set_servers, reload_plugins, reload_skills, reload_output_styles, mcp_reconnect, and mcp_call, was reorganized with renamed internal variables. The same validation rules, including the check that sdkMcpServers and webSearchIsolationExemptMcpServers must be arrays of strings, and the same underlying settings appear unchanged.

Why

This looks like housekeeping rather than a behavior change; nothing here should affect how these commands work.

·Internal
Under the hood
Useful1 Signal0
Artifacts

Artifact asset/db/page-data tool actions: no functional change identified#

Internal rename-only cleanup of artifact asset, database, and page-data tool code, no functional change found

Details 0 0 Feedback
What

The code handling several artifact tool actions, listing, reading, and deleting assets, syncing and versioning, reading page data, and saving database reads to disk, was reorganized with renamed internal variables. The same underlying error conditions, such as asset_bad_url, asset_target_changed, and read_page_data_schema_unavailable, remain in place.

Why

This looks like internal housekeeping with no behavior change for users of artifact asset, database, or page-data actions.

·Internal
Under the hood
Useful1 Signal0
Plugins

Plugin MCP sync/install internals renamed, no behavior change found#

Internal plugin sync and MCP relay functions were renamed with no behavior change

Details 0 0 Feedback
What

A handful of internal helper functions used when Claude Code syncs plugins and connects to MCP servers (a protocol that lets Claude Code talk to external tools) were renamed. The telemetry events tied to these functions, tengu_plugins_sync_mcp_relay_wait, tengu_sync_plugin_install_timeout, and tengu_plugins_sync_wait_timeout, are unchanged.

Why

This is an internal cleanup with no effect on behavior. Nothing changes for anyone using Claude Code.

Related

Other releases about the same thing. Found by shared names or similar wording; neither means one caused the other.

Verbatim
Official · Anthropic

Anthropic’s official release notes

Published verbatim by Anthropic for v2.1.267. Text is unmodified from the upstream changelog. Everything else on this page came out of the bundle instead, which is why the two lists don't match.

Of these 53 bullets, 6 name something an entry on this page also names, 15 name something no entry here does, and 32 name nothing specific enough to line up either way. The pairings are made on names both sides wrote down, a flag or a setting or a slash command, so read one as probably the same thing rather than as a fact, and read the middle number as candidates rather than as a miss count.

  • Added maxEffortLevel setting (top-level or per model under modelSettings): caps the effort level on every provider, including Bedrock, Vertex and Foundry; users can still pick a lower level Probably per-model-maxeffortlevel-cap-now-enforced-client-side-acro, new-policy-setting-maxeffortlevel
  • Added --system-prompt-snapshot off to render the system prompt fresh on every request instead of reusing the conversation's recorded prompt (for iterating on prompt text) No entry names this
  • Fixed Cowork scheduled tasks in the cloud failing at startup for organizations whose managed settings require sandboxing Nothing to match on
  • Fixed /context and other local command output rendering blank on mobile clients No entry names this
  • Fixed shift+enter and option+backspace not working after reconnecting to a tmux or ssh session inside an agent view Nothing to match on
  • Fixed the dim last-prompt header not appearing at the top of the conversation when scrolling up in fullscreen mode Nothing to match on
  • Fixed Workflow agent() calls with large output schemas being refused in auto mode instead of being checked by the safety classifier No entry names this
  • Fixed a case where a marketplace entry path containing a backslash could bypass the containment check for fetched marketplaces on macOS and Linux Nothing to match on
  • Fixed expired AWS or Google Cloud credentials under a host app such as Claude Desktop retrying ten times with a generic "request failed" before the re-authenticate error appeared No entry names this
  • Fixed resuming a session after /compact or another slash command ran via -p --resume: a spurious "Continue from where you left off." turn is no longer inserted Probably sdkheadless-sessions-get-an-explicit-rejection-for-compact, sessioncompact-implementation-gated-by-disable-compact
  • Fixed resuming a large session (transcript over 5 MB): parallel tool calls and their hook output are no longer dropped from the reloaded conversation Nothing to match on
  • Fixed managed allowedHttpHookUrls, httpHookAllowedEnvVars and allowedChannelPlugins to admit nothing, not everything, when unreadable No entry names this
  • Fixed /login on machines whose managed settings require Claude apps gateway sign-in: Esc now closes the dialog instead of doing nothing No entry names this
  • Fixed artifact publishes cut off by a dropped connection mid-upload: they now retry once when Claude Code can tell the upload never completed, instead of reporting an unknown outcome Nothing to match on
  • Fixed effort: frontmatter on custom commands, skills, and subagents being ignored on models whose default effort is still pinned (Opus 4.7, Opus 4.8, Fable 5) Nothing to match on
  • Fixed artifact publish failing with an unhelpful error when the page file isn't valid UTF-8 or contains a replacement character (U+FFFD); the error now names the line and column to fix Nothing to match on
  • Fixed claude agents @ directory menu not listing repositories created after the session started No entry names this
  • Fixed Remote Control clients that join a Claude Desktop or VS Code session showing a stale permission mode until it was changed again Nothing to match on
  • Fixed claude remote-control exiting and dropping every attached session when its server credential expires (about 30 days after start); the host now re-registers and keeps going Probably bridge-remote-control-now-surfaces-a-distinct-fatal-error
  • Fixed the usage-limit warning flickering on and off during a session when requests for different models or modes report different limit windows Nothing to match on
  • Fixed earlier reasoning being dropped when an MCP server re-sends, or a built-in tool re-renders, a tool the model already loaded Nothing to match on
  • Fixed a tool that disappears mid-conversation, from a disconnected MCP server or an upgrade, rewriting the tool list and discarding earlier thinking Nothing to match on
  • Fixed a background worker forked from a conversation adding EnterWorktree to the conversation's tool block mid-session, which broke prompt-cache reuse Nothing to match on
  • Fixed mid-session MCP and plugin tools being added to the tool list in sessions without ToolSearch, which broke prompt-cache reuse; supported models now receive them as deferred definitions Nothing to match on
  • Fixed switching models with /model re-sending every tool definition (a prompt-cache miss); commit and PR attribution text now arrives as a conversation note that updates on model changes Probably per-model-maxeffortlevel-cap-now-enforced-client-side-acro
  • Fixed resumed sessions rewriting the inline tool set when an MCP connector reconnects at a different moment than before Nothing to match on
  • Fixed resumed sessions re-rendering tool descriptions instead of replaying the recorded ones when the first turn ran a tool Nothing to match on
  • Fixed prompt-cache misses and dropped extended thinking when a claude.ai connector's tools change between a session and its resume Nothing to match on
  • Fixed resumed sessions rewriting earlier MCP tool announcements (and dropping extended thinking) before their connectors reconnect Nothing to match on
  • Fixed a prompt-cache break when a print-mode (-p) conversation is resumed interactively: the system prompt prefix no longer changes Nothing to match on
  • Improved the /diff panel: it no longer flashes "0 files changed" and a spinner before settling, and its empty state is centered in the panel No entry names this
  • Improved the Bash tool's description guidance so Claude describes what a command does in plain words instead of echoing the command Nothing to match on
  • Improved sandbox guidance so Claude suggests /copy when clipboard commands such as pbcopy fail inside the sandbox Probably sandbox-system-prompt-now-tells-claude-to-use-copy-when-a-c
  • Improved --resume first-render time for sessions with many Bash tool calls No entry names this
  • Improved prompt input responsiveness: keystrokes no longer occasionally wait a frame behind spinner or streaming repaints Nothing to match on
  • Improved prompt-cache stability: subagents and sessions started with --system-prompt or --append-system-prompt now record the system prompt and tool definitions once instead of re-rendering them No entry names this
  • Improved Artifact tool publish errors: when a publish is refused, the message now says why and what to do about it Nothing to match on
  • Self-hosted runner: Changed --use-anthropic-git-proxy to be reported to the server at registration and to print a warning for each session that still clones through the legacy git proxy Probably new-use-anthropic-git-proxy-runner-opt-in, self-hosted-runner-cli-gains-git-routing-and-drain-wait-flag
  • Gateway: Changed forward_user_identity upstreams to return a 429 as-is to a developer whose email was forwarded, instead of failing over to the next upstream, so the proxy's per-user limits hold No entry names this
  • [VSCode] Fixed the extension host hanging at 100% CPU when forking, editing an earlier message, or rewinding in a conversation whose saved transcript contains a cyclic parent link Nothing to match on
  • [VSCode] Fixed pasting a screenshot on WSL2/WSLg inserting raw image bytes into the chat input; the image is now attached when the clipboard provides it, otherwise the paste is ignored Nothing to match on
  • [VSCode] Fixed chat diff blocks always rendering with a dark editor theme; they now follow the active VS Code color theme, including high contrast Nothing to match on
  • [VSCode] Fixed mixed right-to-left and English text rendering in the wrong order while typing in the message input Nothing to match on
  • [VSCode] Fixed accepting an edit in the diff view on a file with Windows (CRLF) line endings failing with "String not found in file" No entry names this
  • [VSCode] Fixed @-mentions dropping files whose paths contain spaces Nothing to match on
  • [VSCode] Fixed the sessions list view failing to load in windows connected over Remote-SSH when the workspace folder exists only on the remote host Nothing to match on
  • [VSCode] Fixed runaway ripgrep processes when viewing files in large or symlink-heavy workspaces Nothing to match on
  • [Claude Code on the web] Fixed GitHub Enterprise Server sessions showing your GitHub account as disconnected once its token expired; PR and issue operations now refresh it automatically Nothing to match on
  • [Claude Code on the web] Fixed gh and GitHub API calls failing in organizations without the Claude GitHub App; they now use your connected GitHub account and say so when none is connected Nothing to match on
  • [Claude Tag] Added a "Use a custom connector" link to the preset connection forms in Claude Tag admin settings, so you can switch to a custom connection without starting over No entry names this
  • [Claude Tag] Fixed Claude replying "The API rejected the request as invalid" when the organization has run out of usage credits; the reply now says so and explains how to add more No entry names this
  • [Claude Tag] Fixed thread requests to edit or delete a message Claude posted at the channel's top level being answered with a correction instead of reaching the session that posted it Nothing to match on
  • [Claude Tag] Fixed Connect on Tool access requests under Admin settings > Review requests failing with "Authorization failed" or showing the requested access bundle as deleted No entry names this
System prompt

1 of 26 tool schemas changed.

Claude Code, interactive mode

Documentation

What the docs did around this release

279 documentation changes were recorded within 24 hours either side of this release, nearest first. The closest 12 are below. They're here because they happened near this release in time. That's not a claim that this release caused the edit, or that the page documents anything in it.

Every time above is when this site's poller recorded the change, which is up to half an hour after the edit on an ordinary read and up to a day after it on a full sweep. Upstream's own edit time is used instead wherever a capture carries one. None of these do.

Switches

Every name in this release

The 61 literal strings found in the bundle, with the number of entries that name each one. Picking one searches for it. A name is here because this build's code mentions it, which is not the same as it working or being finished.

Slash commands

Environment variables

Settings and names in the code