| MDM key | Type | Description |
diff --git a/content/claude/third-party/claude-desktop/configuration.md b/content/claude/third-party/claude-desktop/configuration.md
index b34295fa0..18d7b9da2 100644
--- a/content/claude/third-party/claude-desktop/configuration.md
+++ b/content/claude/third-party/claude-desktop/configuration.md
@@ -262,7 +262,7 @@ The reference below is generated from the configuration schema and grouped to ma
**Extended context** (`supports1m`) is a capability assertion you make about your deployment; only set it for models you've confirmed support the 1M-token window:
- ```json theme={null} theme={null}
+ ```json theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null}
[{"name": "claude-sonnet-5", "supports1m": true}, "claude-opus-4-8"]
```
@@ -270,13 +270,13 @@ The reference below is generated from the configuration schema and grouped to ma
**Display label** (`labelOverride`) is for IDs the picker can't derive a friendly name from (Bedrock ARNs, gateway routing aliases). Display-only; `name` is still what the app sends:
- ```json theme={null} theme={null}
+ ```json theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null}
[{"name": "arn:aws:bedrock:us-east-1:123:application-inference-profile/abc", "labelOverride": "Claude Opus (Prod)"}]
```
**Tier mapping** (`anthropicFamilyTier`) tells the app which Claude tier (`haiku`/`sonnet`/`opus`/`fable`/`mythos`) an entry stands in for, so bare tier aliases (e.g. in Code sessions) resolve to your model. `isFamilyDefault: true` picks the winner when several entries share a tier:
- ```json theme={null} theme={null}
+ ```json theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null}
[{"name": "us.anthropic.claude-opus-4-8", "anthropicFamilyTier": "opus"}]
```
@@ -301,7 +301,7 @@ The reference below is generated from the configuration schema and grouped to ma
Each row replaces Anthropic list price for one model in the Usage page's estimate, in USD per million tokens (`inputPerMtok`, `outputPerMtok`, `cacheReadPerMtok`, `cacheWritePerMtok`, all four required; `cacheWritePerMtok` prices both 5-minute and 1-hour cache writes); rows apply only while `inferenceModelPricingEnabled` is `true` and do not turn the estimate on by themselves. Mirrors Claude Code's managed `modelPricing.overrides`, and `name` is matched the same way: a built-in Claude model ID (e.g. `claude-sonnet-4-6`, or its Bedrock, Vertex, or Foundry ID) covers every dated and provider spelling of that model; any other value (a gateway alias, an inference-profile ARN) matches that exact ID only (case-insensitive) and wins over a built-in row. An ID Claude Code cannot map to a Claude model at all gets no estimate until a row here prices it. `inferenceModelPricingMultiplier` still applies on top of a row.
- ```json theme={null} theme={null}
+ ```json theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null}
{"inferenceModelPricingEnabled": true, "inferenceModelPricingMultiplier": 0.9, "inferenceModelPricing": [{"name": "claude-sonnet-4-6", "inputPerMtok": 2.4, "outputPerMtok": 12, "cacheReadPerMtok": 0.24, "cacheWritePerMtok": 3}]}
```
@@ -853,7 +853,7 @@ The reference below is generated from the configuration schema and grouped to ma
Locks per-tool permissions on MCP servers that arrive via the org-plugins directory — one entry per server name:
- ```json theme={null} theme={null}
+ ```json theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null}
[{"serverName": "internal-search", "tools": [{"toolName": "delete_document", "permission": "blocked"}]}]
```
@@ -958,7 +958,7 @@ The profiles below are illustrative examples rather than built-in presets, and t
- For air-gapped or maximally restricted environments. **The only traffic leaving the device goes to your inference endpoint and OTLP collector.** With this profile, Anthropic receives no telemetry or logs from the app and does not deliver updates, so your team owns log collection and update distribution. On Microsoft Foundry, the Claude models behind your inference endpoint run in an Anthropic-operated service, so conversation content still reaches Anthropic-operated infrastructure under this profile, as described under [Data handling by provider](/docs/third-party/claude-desktop/overview#data-handling-by-provider).
+ For air-gapped or maximally restricted environments. **The only traffic leaving the device goes to your inference endpoint and OTLP collector**, plus `downloads.claude.ai` for the VM bundle and Claude CLI binary at session start unless you deploy the [offline installer](/docs/third-party/claude-desktop/installation#offline-installation). With this profile, Anthropic receives no telemetry or logs from the app and does not deliver updates, so your team owns log collection and update distribution. On Microsoft Foundry, the Claude models behind your inference endpoint run in an Anthropic-operated service, so conversation content still reaches Anthropic-operated infrastructure under this profile, as described under [Data handling by provider](/docs/third-party/claude-desktop/overview#data-handling-by-provider).
| Key | Value |
| --------------------------------------------------------------- | --------------------------------- |
diff --git a/content/claude/third-party/claude-desktop/connectors-m365.md b/content/claude/third-party/claude-desktop/connectors-m365.md
index ee5bbba02..9cc01ad15 100644
--- a/content/claude/third-party/claude-desktop/connectors-m365.md
+++ b/content/claude/third-party/claude-desktop/connectors-m365.md
@@ -14,7 +14,7 @@ When Claude Desktop is deployed on third-party inference, Claude can read your o
## Choose a connector
-Both connectors provide the same read and search tools; they differ in data path and authentication. Write actions (sending mail, managing drafts and calendar events, and working with files) are available on the local connector when you grant [write scopes](#grant-write-scopes). For write actions on the remote connector, contact your Anthropic representative. Use this table to pick one, then follow that connector's section below.
+Both connectors provide the same read and search tools; they differ in data path and authentication. Write actions (sending mail, managing drafts and calendar events, working with files, and sending Teams messages) are available on the local connector when you grant [write scopes](#grant-write-scopes). For write actions on the remote connector, contact your Anthropic representative. Use this table to pick one, then follow that connector's section below.
| | Remote connector | Local connector |
| ------------------------------- | ------------------------------------------------------------------------ | --------------------------------------------------------------------- |
@@ -237,13 +237,15 @@ With no `scope` field, the connector requests the standard read set at sign-in:
To request a different set, list scopes in the entry's `scope` field. The connector then requests exactly that list (plus `User.Read` and `offline_access`, which are always included). Use the list to narrow the read surface, to add the optional read scopes below, or to add [write scopes](#grant-write-scopes). Whatever you list must also be consented on the app registration from step 1; keep the two lists in sync.
-Three optional read scopes are not in the standard set:
+Six optional read scopes are not in the standard set:
* `ChannelMessage.Read.All` adds Teams channel messages to chat search results. Requires tenant-admin consent.
* `OnlineMeetingTranscript.Read.All` enables reading meeting transcripts. Requires tenant-admin consent.
* `MailboxSettings.Read` enables reading mail filters and automatic-reply settings.
+* `People.Read` enables people search (`search_people`), which resolves a name to a user before starting a Teams chat.
+* `Team.ReadBasic.All` and `Channel.ReadBasic.All` let Claude list the user's teams and their channels (`teams_list_teams`, `teams_list_channels`), which Claude uses to find the team and channel IDs that the channel-message tools take.
-Until the first two are granted, chat search omits channel results and transcript requests return a permission error.
+Until `ChannelMessage.Read.All` and `OnlineMeetingTranscript.Read.All` are granted, chat search omits channel results and transcript requests return a permission error. The `search_people`, `teams_list_teams`, and `teams_list_channels` tools require Claude Desktop version 1.32885.1 or later.
The `scope` field accepts only scopes the connector can use. An entry containing an unrecognized scope name is rejected as a whole at configuration load, with an error in the app's main log listing the valid names, and the connector does not appear.
@@ -253,20 +255,24 @@ The `scope` field accepts only scopes the connector can use. An entry containing
The connector provides these read and search tools:
-| Tool | What it does |
-| ----------------------------------------------- | ---------------------------------------------------------------------------------- |
-| `outlook_email_search` | Search Outlook mail |
-| `outlook_calendar_search` | Search calendar events |
-| `find_meeting_availability` | Find free meeting times |
-| `chat_message_search` | Search Teams chat (1:1 and group; channel messages need `ChannelMessage.Read.All`) |
-| `sharepoint_search`, `sharepoint_folder_search` | Search SharePoint and OneDrive |
-| `read_resource` | Fetch a specific item, such as a message, event, or file |
+| Tool | What it does |
+| ----------------------------------------------- | --------------------------------------------------------------------------------------------------- |
+| `outlook_email_search` | Search Outlook mail |
+| `outlook_calendar_search` | Search calendar events |
+| `find_meeting_availability` | Find free meeting times |
+| `chat_message_search` | Search Teams chat (1:1 and group; channel messages need `ChannelMessage.Read.All`) |
+| `sharepoint_search`, `sharepoint_folder_search` | Search SharePoint and OneDrive |
+| `read_resource` | Fetch a specific item, such as a message, event, or file |
+| `teams_list_chats` | List the user's Teams chats and their members, to find a chat to read or post in |
+| `get_me` | Return the signed-in user's own profile |
+| `search_people` | Search for people by name or email address (needs `People.Read`) |
+| `teams_list_teams`, `teams_list_channels` | List the user's teams and a team's channels (need `Team.ReadBasic.All` and `Channel.ReadBasic.All`) |
Granting write scopes enables write tools; see [Grant write scopes](#grant-write-scopes).
### Grant write scopes
-With only read scopes granted, the connector is read-only. To let Claude take actions in Microsoft 365 (sending mail, managing drafts, labels, filters, and calendar events, and working with files in OneDrive and SharePoint), grant write scopes: add them to the entry's `scope` field and consent them on the app registration from step 1, the same as any other scope. Each write tool appears only when its scope is in the entry's list, so granting a subset of the write scopes exposes a matching subset of the tools, and removing the write scopes from the list returns the connector to read-only. Write tools require Claude Desktop version 1.19367.0 or later.
+With only read scopes granted, the connector is read-only. To let Claude take actions in Microsoft 365 (sending mail, managing drafts, labels, filters, and calendar events, working with files in OneDrive and SharePoint, and sending Teams chat and channel messages), grant write scopes: add them to the entry's `scope` field and consent them on the app registration from step 1, the same as any other scope. Each write tool appears only when its scope is in the entry's list, so granting a subset of the write scopes exposes a matching subset of the tools, and removing the write scopes from the list returns the connector to read-only. Write tools require Claude Desktop version 1.19367.0 or later, and the Teams write tools require version 1.24012.0 or later.
| Scope | What it enables |
| --------------------------- | ------------------------------------------------------------------------------------------------------------- |
@@ -275,10 +281,13 @@ With only read scopes granted, the connector is read-only. To let Claude take ac
| `Calendars.ReadWrite` | Create, update, delete, and respond to calendar events |
| `Files.ReadWrite.All` | Create, update, rename, move, copy, and delete files and folders the user can edit in OneDrive and SharePoint |
| `MailboxSettings.ReadWrite` | Manage labels, mail filters, and automatic replies |
+| `ChatMessage.Send` | Post messages in existing Teams chats |
+| `ChannelMessage.Send` | Post and reply to messages in Teams channels |
+| `Chat.Create` | Start 1:1 and group Teams chats |
Sending drafts and forwarding mail also require a mail read scope (one of `Mail.Read`, `Mail.ReadWrite`, or `Mail.Read.Shared`) for the pre-send checks; the standard read set already includes one.
-Every write tool requires user approval on each call by default. Administrators can change a tool's approval state with [`toolPolicy`](/docs/third-party/claude-desktop/configuration#managedmcpservers), except for the send tools (`outlook_send_mail`, `outlook_send_draft`, `outlook_forward_mail`, `outlook_create_event`, `outlook_update_event`): an `allow` setting for them resolves to `ask`, so they always require approval on each call.
+Every write tool requires user approval on each call by default. Administrators can change a tool's approval state with [`toolPolicy`](/docs/third-party/claude-desktop/configuration#managedmcpservers), except for the send tools (`outlook_send_mail`, `outlook_send_draft`, `outlook_forward_mail`, `outlook_create_event`, `outlook_update_event`, `teams_send_chat_message`, `teams_send_channel_message`, `teams_reply_channel_message`): an `allow` setting for them resolves to `ask`, so they always require approval on each call.
### How users sign in
diff --git a/content/claude/third-party/claude-desktop/data-storage.md b/content/claude/third-party/claude-desktop/data-storage.md
index 99194064b..47aa1aef1 100644
--- a/content/claude/third-party/claude-desktop/data-storage.md
+++ b/content/claude/third-party/claude-desktop/data-storage.md
@@ -65,7 +65,7 @@ Each [project](/docs/cowork/guide/projects) also keeps its own memory under `loc
For the questions security reviews most often ask about Chat:
* **Memory is read-only and applies only inside projects.** A Chat conversation inside a project can read that project's memory unless memory was paused when the conversation started, but cannot add to or change it. Chat conversations outside a project do not read or update memory.
-* **Past chats are not searchable.** There is no index of conversation content, server-side or local (history exists only as the per-session files above), and a Chat conversation has no tools for listing or reading other sessions' transcripts. Each conversation is isolated to its own directory.
+* **Claude cannot search past chats.** Users can search their own conversations in the app, which scans the per-session files on the device on demand, but there is no index of conversation content, server-side or local (history exists only as the per-session files above), and a Chat conversation has no tools for listing or reading other sessions' transcripts. Each conversation is isolated to its own directory.
* **The advanced file analysis sandbox writes only inside the session directory.** When [advanced file analysis](/docs/third-party/claude-desktop/chat#advanced-file-analysis) is enabled, code runs in a local sandbox with no network access. The sandbox writes only to the conversation's `outputs/` directory, and reads its `uploads/` directory plus, for a conversation inside a project, that project's memory.
Deleting a conversation's session state file and working directory removes all of this; there is no other copy.
diff --git a/content/claude/third-party/claude-desktop/extensions.md b/content/claude/third-party/claude-desktop/extensions.md
index 14f9f3e8e..b3522d896 100644
--- a/content/claude/third-party/claude-desktop/extensions.md
+++ b/content/claude/third-party/claude-desktop/extensions.md
@@ -101,7 +101,7 @@ For short-lived header credentials, configure the helper per server:
The helper follows the [`inferenceCredentialHelper`](/docs/third-party/claude-desktop/credential-helper) execution model, with three differences: a 30-second time limit, no `CLAUDE_HELPER_CONTEXT`, and no prompting for input. The helper applies only to servers provisioned through managed configuration and never replaces the `Authorization` header on `oauth` entries.
-While the connection is open, only the TTL schedule triggers renewal; a failed request never re-runs the helper. A failed run does not interrupt the connection; Claude Desktop keeps the current headers and retries. A failure while the server is connecting shows the server as needing authentication.
+While the connection is open, the TTL schedule triggers renewal, and a request that the server rejects with HTTP 401 or 403 also re-runs the helper and, when it returns new headers, is retried once with them (Claude Desktop 1.46388.1 or later). A failed helper run does not interrupt the connection; Claude Desktop keeps the current headers and retries on its schedule. A failure while the server is connecting shows the server as needing authentication.
Mid-session renewal requires Claude Desktop 1.21459.0 or later. Earlier versions run the helper only when the server connects.
@@ -378,6 +378,8 @@ To roll out a new version of a plugin:
2. Bump the `version` string in `version.json`
3. Users pick up the change on their next app launch
+To withdraw a plugin, remove its folder from `org-plugins/`. On Claude Desktop 1.46388.1 or later, each user's installed copy is unregistered the next time the app syncs organization plugins (at launch or when a session starts); earlier versions leave the copy installed.
+
## User extensions
Unless restricted by an admin, end users can add their own extensions through the in-app UI:
diff --git a/content/claude/third-party/claude-desktop/gateway.md b/content/claude/third-party/claude-desktop/gateway.md
index 12468eb62..e48b7ca54 100644
--- a/content/claude/third-party/claude-desktop/gateway.md
+++ b/content/claude/third-party/claude-desktop/gateway.md
@@ -13,6 +13,8 @@ The gateway must implement the Anthropic [Messages API](https://docs.claude.com/
* `POST /v1/messages` with [streaming](https://docs.claude.com/en/api/streaming) and [tool use](https://docs.claude.com/en/docs/tool-use) is required.
* `GET /v1/models` is optional. If the gateway implements it, Claude Desktop on 3P auto-discovers available models; if not, set `inferenceModels` explicitly.
+The gateway should also preserve [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching). Cowork and Code sessions send `cache_control` breakpoints with each turn so that the provider can reuse the tool definitions, system prompt, and earlier turns of the conversation instead of reprocessing them. A gateway that forwards these fields, or translates them for its upstream provider, keeps that behavior. A gateway that strips `cache_control`, or that changes the system prompt or tool list from one request to the next, makes the provider reprocess the whole conversation on every turn at full input-token cost and higher latency. To verify, check the [usage fields](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#tracking-cache-performance) your gateway returns or logs for Claude Desktop traffic: after the first request of a session, `cache_read_input_tokens` should be well above zero on most requests. If it is zero on every request, review the gateway's request transformation and caching settings for the route that serves Claude models.
+
## Choose an authentication approach
| Scenario | Use | Notes |
diff --git a/content/claude/third-party/claude-desktop/network-proxy.md b/content/claude/third-party/claude-desktop/network-proxy.md
index 1619abe93..c12618b9d 100644
--- a/content/claude/third-party/claude-desktop/network-proxy.md
+++ b/content/claude/third-party/claude-desktop/network-proxy.md
@@ -31,7 +31,7 @@ A few limits apply to the agent regardless of how the proxy is chosen:
## Pin a proxy from managed configuration
- Pinning requires a Claude Desktop release that includes the `egressProxyUrl` and `egressProxyPacUrl` keys. The [configuration changelog](/docs/third-party/claude-desktop/configuration-changelog) lists the first release that carries each key. Earlier releases ignore both keys and keep following the OS proxy settings.
+ Pinning requires Claude Desktop 1.44121.1 or later. Earlier releases ignore the `egressProxyUrl` and `egressProxyPacUrl` keys and keep following the OS proxy settings.
If you want the app, the agent, and (on macOS and Windows) Cowork's sandboxed shell to use a specific proxy regardless of what the device's OS settings say, set one of two managed configuration keys:
@@ -115,7 +115,7 @@ The inverse edge case: if your PAC script returns `DIRECT` for the inference end
## Interaction with Claude Code managed settings
- The precedence described here requires the same Claude Desktop release as the pinned-proxy keys above. See the [configuration changelog](/docs/third-party/claude-desktop/configuration-changelog).
+ The precedence described here requires Claude Desktop 1.44121.1 or later, the same release as the pinned-proxy keys above.
If you deploy Claude Code [managed settings](https://code.claude.com/docs/en/settings#settings-files) on the device (a `managed-settings.json` file or an OS-level Claude Code policy) and its `env` block sets `HTTPS_PROXY`, `HTTP_PROXY`, or `NO_PROXY`, those values apply to the agent in Chat, Cowork, and Code sessions alike and take precedence over what the app would have supplied. Precedence is per variable: a managed `HTTPS_PROXY` replaces the app's proxy while the app's loopback `NO_PROXY` entries stay in place, and a managed `NO_PROXY` replaces the app's list (the loopback entries are appended for you when the app is also supplying the proxy). See Claude Code's [network configuration](https://code.claude.com/docs/en/network-config) page for the variables themselves.
diff --git a/content/claude/third-party/claude-desktop/ssh-remote-sessions.md b/content/claude/third-party/claude-desktop/ssh-remote-sessions.md
index bb10a6be9..2275d60ef 100644
--- a/content/claude/third-party/claude-desktop/ssh-remote-sessions.md
+++ b/content/claude/third-party/claude-desktop/ssh-remote-sessions.md
@@ -14,10 +14,10 @@ An SSH remote session is a [Code](/docs/third-party/claude-desktop/code) session
## How a remote session works
-1. **Connect.** The user picks an SSH host from the environment picker in the Code tab, or adds one by entering its address, port, and an identity file. Claude Desktop connects with its built-in SSH client, applies the host's entry from the device's `~/.ssh/config` (see [SSH configuration on the device](#ssh-configuration-on-the-device)), and prompts in the app if the host asks for a password or a one-time code.
+1. **Connect.** The user picks an SSH host from the environment picker in Code, or adds one by entering its address, port, and an identity file. Claude Desktop connects with its built-in SSH client, applies the host's entry from the device's `~/.ssh/config` (see [SSH configuration on the device](#ssh-configuration-on-the-device)), and prompts in the app if the host asks for a password or a one-time code.
2. **Deploy.** Claude Desktop places a remote server and the Claude Code engine under `~/.claude/remote/` in the SSH user's home directory on the host ([Host requirements](#host-requirements) lists every path) and reuses them on later connections.
3. **Run.** The remote server starts the engine on the host with the inference credential and policy from your managed configuration. Every file read, edit, shell command, and git operation runs on the host, in the working directory the user chose there. Claude Desktop connects to [managed MCP servers](/docs/third-party/claude-desktop/extensions#managed-mcp-servers-admin) from the device and exposes them to the engine as tools.
-4. **Stream.** Claude's responses and tool output stream back to Claude Desktop. Permission prompts appear in the Code tab, and the engine waits on the host until the user answers.
+4. **Stream.** Claude's responses and tool output stream back to Claude Desktop. Permission prompts appear in Claude Desktop, and the engine waits on the host until the user answers.
The engine keeps running on the host through a dropped SSH link, device sleep, or the user quitting Claude Desktop. It finishes the current turn, or stops at a permission prompt, then idles until the user reopens the session. Reopening starts a fresh engine from the transcript stored on the host, so a turn that finished while the app was closed is shown in full; a turn still running at that moment is cut short and not continued automatically. While Claude Desktop is closed, no new turns run and the inference credential is not refreshed, so a turn that outlives the credential fails with an authentication error.
@@ -114,7 +114,7 @@ The host needs the following.
* `git` on the path, for git features.
* Up to about 700 MB of disk space in the SSH user's home directory, for the three Claude Code versions the app keeps.
-The Claude Code engine is a standalone executable with no runtime dependencies. The device needs the OpenSSH client (`ssh` and `ssh-keygen`).
+The Claude Code engine is a standalone executable with no runtime dependencies. The device needs the OpenSSH client (`ssh` and `ssh-keygen`). Claude Desktop runs the first `ssh` on the user's `PATH`; to pin a specific OpenSSH installation instead, set [`sshClientPath`](/docs/third-party/claude-desktop/configuration#sshclientpath) (beta, Claude Desktop 1.46388.1 or later) to the program's absolute path, and `ssh-keygen` is then taken from the same directory when present. If the pinned program is missing or cannot be run, SSH connections fail with an error that shows the configured path, rather than falling back to another `ssh`.
Claude Desktop writes the following into the SSH user's home directory on the host. Each user who connects gets their own copy.
@@ -129,7 +129,7 @@ Claude Desktop writes the following into the SSH user's home directory on the ho
Each side of a remote session needs its own network access.
-* Devices installed with the regular installer must reach `downloads.claude.ai`: Claude Desktop downloads the remote server there and uploads it to the host over SFTP. Devices installed with the [offline installer](/docs/third-party/claude-desktop/installation#offline-installation) don't: it bundles the remote server and the Claude Code engine for Linux x64 and arm64 hosts, and Claude Desktop uploads both over SFTP. Hosts on other platforms still need the download, and on an offline install the session fails with a message saying the installer doesn't include remote components for that platform.
+* Devices installed with the regular installer must reach `downloads.claude.ai`: Claude Desktop downloads the remote server there and uploads it to the host over SFTP. Devices installed with the [offline installer](/docs/third-party/claude-desktop/installation#offline-installation) don't: it bundles the remote server and the Claude Code engine for Linux x64 and arm64 hosts, and Claude Desktop uploads both over SFTP. Hosts on other platforms still need the download, so an offline-installed device that cannot reach `downloads.claude.ai` fails the session with a message saying the installer doesn't include remote components for that platform.
* The host must reach your inference endpoint and, if configured, your OTLP collector, plus whatever the user's own work needs. With the regular installer, it downloads the Claude Code engine from `downloads.claude.ai` when it can; when that fails, Claude Desktop downloads the engine on the device and uploads it over SFTP. Unless you disabled telemetry, the engine on the host also reports to the same Anthropic hosts as a local Code session (see [Telemetry and egress](/docs/third-party/claude-desktop/telemetry)). Blocking them does not affect the session.
### SSH configuration on the device
diff --git a/content/claude/third-party/claude-desktop/telemetry.md b/content/claude/third-party/claude-desktop/telemetry.md
index d4e02b7e5..8645a3314 100644
--- a/content/claude/third-party/claude-desktop/telemetry.md
+++ b/content/claude/third-party/claude-desktop/telemetry.md
@@ -90,10 +90,10 @@ These attributes are attached only to the OpenTelemetry export; the Anthropic-bo
The `otlpProtocol` key selects the transport for the telemetry export to your collector: `http/protobuf` (the default), `http/json`, or `grpc`. The protocol applies per session type:
* [Code](/docs/third-party/claude-desktop/code) sessions export over the protocol as configured, including `grpc`.
-* Cowork sessions do not support gRPC export. When `otlpProtocol` is set to `grpc`, Cowork sessions export over `http/protobuf` instead; other protocol values apply as configured.
+* Cowork and [Chat](/docs/third-party/claude-desktop/chat) sessions export over the protocol as configured, except that when `otlpProtocol` is `grpc` they export over `http/protobuf` instead on Windows, and on other platforms whenever the Claude Code engine is given an HTTP proxy (from the operating system's proxy settings, a [pinned proxy](/docs/third-party/claude-desktop/network-proxy#pin-a-proxy-from-managed-configuration), or `HTTPS_PROXY`/`HTTP_PROXY` in a Claude Code settings file).
* The desktop application's own event stream (`claude-desktop`) always exports over `http/json`, whatever `otlpProtocol` is set to.
-The fallback changes the protocol only, not the endpoint. When `otlpProtocol` is `grpc`, the Cowork and desktop-application exports go to the same `otlpEndpoint` over HTTP; if that address is your collector's OTLP/gRPC receiver (conventionally port 4317), that telemetry never reaches the collector. To receive all three streams with one collector, set `otlpProtocol` to `http/protobuf` and point `otlpEndpoint` at the collector's OTLP/HTTP receiver (conventionally port 4318).
+These substitutions change the protocol only, not the endpoint. A stream that exports over HTTP while `otlpProtocol` is `grpc` still goes to the same `otlpEndpoint`; if that address is your collector's OTLP/gRPC receiver (conventionally port 4317), that telemetry never reaches the collector. To receive all three streams with one collector, set `otlpProtocol` to `http/protobuf` and point `otlpEndpoint` at the collector's OTLP/HTTP receiver (conventionally port 4318).
### Content capture
@@ -101,7 +101,7 @@ To include content in the export, set `otlpContentCapture` to an array of catego
| Category | Captures |
| -------------------- | --------------------------------------------------------------- |
-| `userPrompts` | User message text |
+| `userPrompts` | User message text and conversation titles |
| `assistantResponses` | Model response text |
| `toolDetails` | Tool input arguments (for example, the web-search query string) |
| `toolContent` | Tool output content |
@@ -109,13 +109,15 @@ To include content in the export, set `otlpContentCapture` to an array of catego
On Claude Desktop version 1.17377 or later, enabling `userPrompts` also captures model responses, even if `assistantResponses` is not listed. On those versions, no `otlpContentCapture` configuration captures user prompts without model responses.
+Conversation titles arrive on the desktop application's own stream (`claude-desktop`) as a `desktop_session_title_set` event that carries each Cowork and Code session's title and the Claude Code `session.id` to join on. The event is exported only when [`otlpDesktopLogLevel`](/docs/third-party/claude-desktop/configuration#otlpdesktoploglevel) is `info` or `debug`, and the title text is included only when `otlpContentCapture` includes `userPrompts`. Requires Claude Desktop 1.44121.1 or later.
+
Content is exported only to your configured `otlpEndpoint`. Anthropic does not receive it.
### Traces (beta)
The export carries logs (events) and metrics; it does not include traces unless you enable them. To export OpenTelemetry traces as well, set `otlpTracesEnabled` to `true`. Cowork and Code sessions then record a trace for each user interaction, with spans for model requests and tool executions, and every event emitted during a span carries that span's `trace_id` and `span_id`. This lets your backend correlate a prompt's events end-to-end natively, with no transformation on ingest.
-Traces use the same `otlpEndpoint` and `otlpProtocol` as the rest of the export, including the Cowork gRPC fallback described in [Exporter protocol](#exporter-protocol). Span and span-event content is gated by the same `otlpContentCapture` categories as events: with no categories enabled, traces carry metadata only (timing, tool names, durations, token counts). Captured content appears primarily on events; spans stay close to metadata.
+Traces use the same `otlpEndpoint` and `otlpProtocol` as the rest of the export, including the gRPC fallbacks described in [Exporter protocol](#exporter-protocol). Span and span-event content is gated by the same `otlpContentCapture` categories as events: with no categories enabled, traces carry metadata only (timing, tool names, durations, token counts). Captured content appears primarily on events; spans stay close to metadata.
Two scope notes:
@@ -161,12 +163,12 @@ The host(s) for your configured provider. These carry conversation content.
- | Host | Purpose |
- | ------------------------------------------------------------------ | -------------------------------------------------------------------------- |
- | `bedrock-runtime..amazonaws.com` | Model inference. Replaced by the host of `inferenceBedrockBaseUrl` if set. |
- | `bedrock..amazonaws.com` | Control plane (model discovery) |
- | `sts.amazonaws.com`, `sts..amazonaws.com` | STS token exchange (profile auth only) |
- | `portal.sso..amazonaws.com`, `oidc..amazonaws.com` | AWS SSO (profile auth only) |
+ | Host | Purpose |
+ | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+ | `bedrock-runtime..amazonaws.com` | Model inference. Replaced by the host of `inferenceBedrockBaseUrl` if set. |
+ | `bedrock..amazonaws.com` | Control plane (model discovery) |
+ | `sts.amazonaws.com`, `sts..amazonaws.com` | STS token exchange (profile auth only) |
+ | `portal.sso..amazonaws.com`, `oidc..amazonaws.com` | IAM Identity Center sign-in and token refresh, for [in-app AWS sign-in](/docs/third-party/claude-desktop/bedrock#in-app-aws-sign-in) and for named profiles that use IAM Identity Center. `` is `inferenceBedrockSsoRegion` (or the profile's `sso_region`) and can differ from the inference region. |
With `inferenceBedrockBearerToken` set, the runtime and control-plane hosts are required.
@@ -253,19 +255,20 @@ The `sentry.io` apex is listed alongside the wildcards because some firewalls do
### Optional features
-| Host | Required when |
-| ----------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Host of `otlpEndpoint` | OpenTelemetry export is configured |
-| `github.com`, `objects.githubusercontent.com`, `pypi.org`, `files.pythonhosted.org` | Python-based desktop extensions are enabled |
-| Hosts of each entry in `managedMcpServers` (server URL, plus `oauth.authorizationServer` and `login.microsoftonline.com` if configured) | Managed MCP servers are configured |
-| Search provider host of a built-in `websearch` server (`api.search.brave.com`, `api.tavily.com`, `api.exa.ai`, or the host of your `customUrl`) | [Built-in web search](/docs/third-party/claude-desktop/web-tools#built-in-web-search) is configured |
-| Hosts in `coworkEgressAllowedHosts` | Sandbox web access is configured |
-| `api.anthropic.com` | [Code](/docs/third-party/claude-desktop/code) sessions can use Web Fetch and [`skipWebFetchPreflight`](/docs/third-party/claude-desktop/configuration#skipwebfetchpreflight) is not `true` (Claude Code's Web Fetch [domain check](/docs/third-party/claude-desktop/web-tools#web-fetch)) |
-| `downloads.claude.ai` | [SSH remote sessions](/docs/third-party/claude-desktop/ssh-remote-sessions) are enabled (`sshHostAllowlist` set), including on devices installed with the offline installer |
+| Host | Required when |
+| ----------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Host of `otlpEndpoint` | OpenTelemetry export is configured |
+| `github.com`, `objects.githubusercontent.com`, `pypi.org`, `files.pythonhosted.org` | Python-based desktop extensions are enabled |
+| Hosts of each entry in `managedMcpServers` (server URL, plus `oauth.authorizationServer` and `login.microsoftonline.com` if configured) | Managed MCP servers are configured |
+| Search provider host of a built-in `websearch` server (`api.search.brave.com`, `api.tavily.com`, `api.exa.ai`, or the host of your `customUrl`) | [Built-in web search](/docs/third-party/claude-desktop/web-tools#built-in-web-search) is configured |
+| Hosts in `coworkEgressAllowedHosts` | Sandbox web access is configured |
+| `api.anthropic.com` | [Code](/docs/third-party/claude-desktop/code) sessions can use Web Fetch and [`skipWebFetchPreflight`](/docs/third-party/claude-desktop/configuration#skipwebfetchpreflight) is not `true` (Claude Code's Web Fetch [domain check](/docs/third-party/claude-desktop/web-tools#web-fetch)) |
+| `claude.ai`, `api.anthropic.com`, `storage.googleapis.com` | [Import from claude.ai](/docs/third-party/claude-desktop/import) is enabled (`claudeAiImport` with `enabled` set to `true`). Used only while a user signs in to claude.ai and fetches an export in the import wizard; importing a downloaded export file needs none of them |
+| `downloads.claude.ai` | [SSH remote sessions](/docs/third-party/claude-desktop/ssh-remote-sessions) are enabled (`sshHostAllowlist` set). With the offline installer, needed only for connections to hosts other than Linux x64 and arm64, because that installer bundles the remote components for those hosts (see [Host requirements](/docs/third-party/claude-desktop/ssh-remote-sessions#host-requirements)) |
## Disabling all Anthropic-bound connections
-With `disableEssentialTelemetry`, `disableNonessentialTelemetry`, `disableNonessentialServices`, and `disableAutoUpdates` all set to `true`, the desktop application makes **no outbound connections to Anthropic-operated hosts at runtime**. If Code sessions can use Web Fetch, also set [`skipWebFetchPreflight`](/docs/third-party/claude-desktop/configuration#skipwebfetchpreflight) to `true` (or add `WebFetch` to `disabledBuiltinTools`), because Claude Code in [Code](/docs/third-party/claude-desktop/code) sessions otherwise checks each fetched domain with `api.anthropic.com`. The only required egress is `downloads.claude.ai` (for the VM bundle at session start) and your inference provider. With the [offline installer variant](/docs/third-party/claude-desktop/installation#offline-installation), `downloads.claude.ai` is not needed either, and your inference provider is the only required egress. Enabling [SSH remote sessions](/docs/third-party/claude-desktop/ssh-remote-sessions) adds `downloads.claude.ai` back for every device, because the offline installer does not include the remote-session components.
+With `disableEssentialTelemetry`, `disableNonessentialTelemetry`, `disableNonessentialServices`, and `disableAutoUpdates` all set to `true`, the desktop application makes **no outbound connections to Anthropic-operated hosts at runtime**. If Code sessions can use Web Fetch, also set [`skipWebFetchPreflight`](/docs/third-party/claude-desktop/configuration#skipwebfetchpreflight) to `true` (or add `WebFetch` to `disabledBuiltinTools`), because Claude Code in [Code](/docs/third-party/claude-desktop/code) sessions otherwise checks each fetched domain with `api.anthropic.com`. The only required egress is `downloads.claude.ai` (for the VM bundle at session start) and your inference provider. With the [offline installer variant](/docs/third-party/claude-desktop/installation#offline-installation), `downloads.claude.ai` is not needed either, and your inference provider is the only required egress. Enabling [SSH remote sessions](/docs/third-party/claude-desktop/ssh-remote-sessions) adds `downloads.claude.ai` back, except on devices installed with the offline installer that connect only to Linux x64 or arm64 hosts: that installer bundles the remote-session components for those hosts, and connections to hosts on other platforms still download them. Enabling [import from claude.ai](/docs/third-party/claude-desktop/import) likewise lets the app reach `claude.ai` and `api.anthropic.com` (and `storage.googleapis.com` for the export download), but only while a user runs a sign-in import from the wizard.
These settings control only the application's telemetry, update, and non-essential service connections. They do not change how your inference provider handles conversation content at the endpoint. On Microsoft Foundry, the Claude models behind your inference endpoint run in an Anthropic-operated service, so conversation content reaches Anthropic-operated infrastructure regardless of these settings. See [Data handling by provider](/docs/third-party/claude-desktop/overview#data-handling-by-provider) on the Overview page.
diff --git a/content/claude/third-party/claude-desktop/web-tools.md b/content/claude/third-party/claude-desktop/web-tools.md
index 543cb7f7f..381d8f561 100644
--- a/content/claude/third-party/claude-desktop/web-tools.md
+++ b/content/claude/third-party/claude-desktop/web-tools.md
@@ -124,7 +124,7 @@ Connect a search MCP server as a remote `managedMcpServers` entry: either one yo
#### Data handling
-Search queries go to whichever backend you configure. In every option, the query is also visible to your inference provider as part of the conversation, because the model emits the search call. Anthropic does not receive search queries in any third-party configuration. To keep queries entirely inside your network, use `provider: "custom"` (or a self-hosted MCP) pointed at a search index that itself runs inside your boundary.
+Search queries go to whichever backend you configure. In every option, the query is also visible to your inference provider as part of the conversation, because the model emits the search call. For Google Cloud's Agent Platform and Amazon Bedrock, Anthropic does not receive search queries in any of these options. For Microsoft Foundry, the Anthropic API, or a gateway, the query is part of the conversation content covered under [Data handling by provider](/docs/third-party/claude-desktop/overview#data-handling-by-provider). To keep the search backend itself inside your network, use `provider: "custom"` (or a self-hosted MCP) pointed at a search index that runs inside your boundary.
For audit, each search the model runs is recorded in the Cowork or Code session telemetry sent to your [OTLP collector](/docs/third-party/claude-desktop/telemetry#sending-telemetry-to-your-own-collector) as a `tool_result` event, whichever option you choose (a `WebSearch` event for provider-side or gateway-side search, an MCP tool event for the built-in or a remote search server). Add `toolDetails` to [`otlpContentCapture`](/docs/third-party/claude-desktop/telemetry#content-capture) to include the tool input, which carries the query text (long values are truncated). The built-in `websearch` server also emits a `builtin_websearch_call` event on the desktop application's own stream with the search provider, query length, result count, duration, and status, never the query text. The app exports that event only when [`otlpDesktopLogLevel`](/docs/third-party/claude-desktop/configuration#otlpdesktoploglevel) is `info` or `debug`, not at the default `error` level.
diff --git a/content/en/build-with-claude/preserved-thinking.md b/content/en/build-with-claude/preserved-thinking.md
index 5c26d4be2..777c1cbf7 100644
--- a/content/en/build-with-claude/preserved-thinking.md
+++ b/content/en/build-with-claude/preserved-thinking.md
@@ -1,89 +1,664 @@
---
title: Preserved thinking
url: https://platform.claude.com/docs/en/build-with-claude/preserved-thinking
-description: Modifying a conversation now results in an error or a dropped block; how to check whether your integration does that and how to migrate.
+description: Preserved thinking lets a model use a thinking block from an earlier turn only if that model or an earlier one produced it and nothing before the block has changed.
---
-On Claude Fable 5.1, changing prior turns in the conversation (the `system` prompt, the `tools`, or any earlier message) affects the API response. By default, it makes the API reject the request with an error, unless you opt to have the affected thinking blocks dropped from what the model sees instead (`prefix_mismatch_behavior: "drop_block"`). The check is enforced by default for new accounts created on or after August 31, 2026, 00:00 UTC. There are more details in *[How it works](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#how-it-works)* and *[Who is affected](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#who-is-affected).*
+Preserved thinking is a property of newer Claude models that guards against distillation. It decides whether the model can use a thinking block that you send back from an earlier turn. Starting with Claude Fable 5.1, when a `thinking` or `redacted_thinking` block comes back in a request, the API checks the block's `signature` for two things:
-When you send a block back, the API uses its `signature` to check that the prior conversation is unchanged and that the current model can read the block. The check exists so that reasoning produced under one set of instructions can't be replayed under another, potentially adversarial set of instructions.
+* **The model is the one that produced the block, or a newer one.** A model reads its own thinking blocks and those of earlier models. Claude Fable 5.1 reads blocks from Claude Opus 5, but Claude Opus 5 can't read blocks from Claude Fable 5.1. If the current model can't read a block, the API drops it from that request without an error. See [Switching models mid-conversation](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#switching-models).
+* **Nothing before the thinking block has changed.** The top-level `system` prompt, `tools`, and `messages` before the block are its prefix. If the prefix differs from what you sent when the block was produced, that block and every later thinking block are invalid, and the API rejects the request with a 400 error or drops the invalid blocks, whichever you choose. See [Keeping the prefix unchanged](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#prefix-check).
-The API provides first-class alternatives to modify a conversation as it progresses, covering most use cases for transcript edits: [mid-conversation system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) for new instructions, [turn-scoped system messages](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#per-turn-reminders) for per-turn reminders, [mid-conversation tool changes](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#mid-conversation-tool-changes) for adding and removing tools, and [per-message effort](https://platform.claude.com/docs/en/build-with-claude/effort#change-effort-mid-conversation-beta) to adjust depth of thinking per turn. The rest of this page covers how to tell whether your integration is affected and how to migrate common harness patterns to these features. As an added benefit, keeping everything before each thinking block byte-for-byte unchanged also keeps the prefix stable for [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching).
+The model check applies to every account. The API enforces the prefix check by default for accounts created on or after August 31, 2026, 00:00 UTC. On older accounts, it enforces the prefix check only on requests that set `thinking.block_binding.prefix_mismatch_behavior`. **Later models will enforce the prefix check for all accounts**, so make your integration append-only now.
-Whether you need to do anything depends on what manages your conversation history:
+## Switching models mid-conversation
-* **You use an official Claude product or SDK:** Claude Code, claude.ai, [Claude Managed Agents](https://platform.claude.com/docs/en/managed-agents/overview), or the [Claude Agent SDK](https://code.claude.com/docs/en/agent-sdk/overview). These keep the prefix intact for you.
+Claude Fable 5.1 and Claude Mythos 5.1 read thinking blocks produced by each other and by earlier Claude models. No earlier model reads thinking blocks from Claude Fable 5.1 or Claude Mythos 5.1.
-* **You call the Messages API directly**, from your own agent loop or any other setting. You should check your code and ensure that the `messages` array is treated as append-only. These common patterns edit the prefix and invalidate the thinking after the edit:
+* **A conversation that moves up to Claude Fable 5.1 keeps its reasoning.** The earlier model's thinking blocks stay readable, so the model thinks as usual from the first turn after the switch.
+* **A conversation that moves down to an earlier model loses Claude Fable 5.1's reasoning for that request.** This happens when a router sends a turn to a cheaper model, after a [classifier refusal fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback), or during a [server-side fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#server-side-fallback). The API removes the unreadable blocks before the prompt reaches the model. They aren't billed and don't count toward `input_tokens`.
- * Trimming or dropping older turns
- * Summarizing older turns on the client and keeping recent ones
- * Injecting a reminder into an earlier turn and removing it on the next request
- * Rebuilding the `system` prompt each request (current time, token budget, mode flags)
- * Adding or removing entries in `tools` mid-session
+Keep sending the full history on every request, thinking blocks included, and let the API drop what the current model can't read. The API never edits your `messages` array, so the dropped blocks stay in your history. When the same history goes back to Claude Fable 5.1, its blocks are readable again, along with the earlier model's thinking. The reasoning is lost for good only if your client removes the blocks itself, for example a harness that strips thinking on a model switch or rebuilds the history from what each model used.
-## How it works
+
-For new requests the API checks:
+With the `thinking-binding-controls-2026-08-01` [beta header](https://platform.claude.com/docs/en/api/beta-headers), the response lists each dropped block in a top-level `input_transformations` array with `reason: "model_binding_mismatch"`:
-* **The model is the same or newer.** A block is readable by the model that produced it and by later models, not by earlier ones. A conversation that moves to a newer model keeps its reasoning. A conversation that moves to an older model fails the model check for those blocks, and the API drops them for that request. See [Preserved thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-for-model) for the exact per-model list.
-* **Nothing before the block has changed.** The top-level `system` prompt, the set of tools in `tools`, and every message before the block. With server-side compaction the checked prefix starts at the most recent [compaction block](https://platform.claude.com/docs/en/build-with-claude/compaction).
-* **The chain of earlier thinking blocks is unbroken.** Earlier `thinking` and `redacted_thinking` blocks aren't part of the prefix, but each thinking block records the one before it, across turns. You can remove thinking blocks from the front of the history. Removing one from the middle invalidates every thinking block after it.
+```json
+{
+ "input_transformations": [
+ {
+ "type": "thinking_dropped",
+ "path": "messages.3.content.0",
+ "reason": "model_binding_mismatch"
+ }
+ ]
+}
+```
-A block that fails the model check is always dropped. For a prefix mismatch you choose what happens with `thinking.block_binding.prefix_mismatch_behavior`, which requires the `thinking-binding-controls-2026-08-01` [beta header](https://platform.claude.com/docs/en/api/beta-headers):
+Without the header, the drop is silent. This entry isn't a bug in your integration, and `prefix_mismatch_behavior` has no effect on it: a block the current model can't read is always dropped.
-* `"drop_block"`: the API removes the block and every thinking block after it in the conversation, and the request succeeds. Dropped blocks aren't billed. The response lists them in a top-level `input_transformations` array (on the `message_start` event when streaming).
-* `"error"`: the API rejects the request with a 400 `invalid_request_error` that names the first failing block.
+## Keeping the prefix unchanged
-The default is `"error"`. The header lets you set the field and adds `input_transformations` to responses.
+On Claude Fable 5.1, a thinking block stays valid only while everything you sent before it is unchanged on later requests. The checked prefix has three parts:
-## Who is affected
+* The top-level `system` prompt
+* The set of `tools`
+* Every `message` before the block
-Claude Fable 5.1. See [Preserved thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-thinking) for the model list.
+Note: With server-side [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction), the checked prefix starts at the most recent compaction block.
-On Claude Fable 5.1, the API enforces the check for new accounts. A new account is one created on or after August 31, 2026, 00:00 UTC. The same definition applies on the Claude API and on cloud platforms. Later models will enforce the check for all users.
+Request parameters outside those three fields, such as `effort`, `max_tokens`, `output_config`, `tool_choice`, and `metadata`, aren't part of the prefix check, and neither are `cache_control` markers. [What counts as an edit](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#what-counts-as-an-edit) has the full list.
-A request that sets `prefix_mismatch_behavior` opts into enforcement regardless of account age, which is how you test from an older account. To check whether your account is enforced by default, send a request that edits history without the beta header: a 400 that names the header means enforced.
+Earlier thinking blocks aren't in the prefix, but each thinking block records which thinking block came before it, across turns. You can remove thinking blocks from the front of the history, oldest first. Removing one from the middle invalidates thinking blocks after it.
-
- If you maintain a tool or framework that people run with their own API key, your users on new accounts hit the check before you do: your own key is likely on an older account. Test with `prefix_mismatch_behavior` set so you see what they'll see.
-
+Keep `system` and `tools` fixed for the session and treat `messages` as append-only. The same discipline keeps the prefix stable for [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching): the edits that invalidate thinking are the edits that restart the cache.
+
+### What the API does with an invalid block
+
+You choose with `thinking.block_binding.prefix_mismatch_behavior`:
+
+* **`"error"` (the default):** the API rejects the request with a 400 `invalid_request_error` that names the first failing block.
+* **`"drop_block"`:** the API drops each failing block and every thinking block after it, and the request succeeds. Dropped blocks aren't billed. The model answers that turn without using reasoning from dropped blocks, and the prompt cache restarts at the edit. The response lists each dropped block in `input_transformations` (on the `message_start` event when streaming) with `reason: "prefix_binding_mismatch"`.
+
+Both the field and the `input_transformations` array require the `thinking-binding-controls-2026-08-01` [beta header](https://platform.claude.com/docs/en/api/beta-headers). [Set the mismatch behavior and read `input_transformations`](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#preserved-thinking-controls) shows the request in each SDK.
+
+The 400 message begins:
+
+```text wrap
+messages.1.content.0: Invalid `signature` in `thinking` block. The block is bound to a different conversation. Remove the block, or set `thinking.block_binding.prefix_mismatch_behavior` to "drop_block".
+```
+
+If the request didn't send the beta header, the message continues:
+
+```text wrap
+That setting requires the `thinking-binding-controls-2026-08-01` value in the `anthropic-beta` header.
+```
+
+It usually ends with a sentence naming what changed, for example that the `system` prompt or the `tools` list differs from when the block was created. See [Troubleshooting thinking](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#error-thinking-block-signature) for every variant of this error.
+
+If you hit this 400 in production, retrying the same body fails the same way. Retry with the beta header and `prefix_mismatch_behavior: "drop_block"` and keep sending it for the rest of the session, or strip every `thinking` and `redacted_thinking` block from the history yourself and retry once. Then fix the edit that caused the mismatch. In the Message Batches API, an item that leaves the field unset drops failing blocks instead of erroring, so set `"error"` explicitly there if you want batch items to fail.
+
+A tampered or undecryptable signature is a different failure. It always returns a 400 (``Invalid `signature` in `thinking` block`` with no sentence about the conversation), and `prefix_mismatch_behavior` doesn't apply to it.
-## How to tell whether your integration is impacted
+### Set the mismatch behavior and read `input_transformations`
-Capture the exact request bodies your integration sends over a few normal turns, including a compaction or a tool change if your product does those. For each pair of consecutive requests, compare `system`, `tools`, and the shared part of `messages`. They should be byte-identical up to the newly appended turns.
+The `thinking-binding-controls-2026-08-01` [beta header](https://platform.claude.com/docs/en/api/beta-headers) adds:
-Then confirm against the API. With the `thinking-binding-controls-2026-08-01` [beta header](https://platform.claude.com/docs/en/api/beta-headers) and `claude-fable-5-1`, set `thinking.block_binding.prefix_mismatch_behavior` to `"drop_block"` and run a normal multi-turn session through your integration. This request is the second turn of such a session, sending back the first response's assistant turn exactly as received:
+* A top-level `input_transformations` array on every response
+* A `block_binding` object on the `thinking` configuration, whose one field is `prefix_mismatch_behavior`
-```bash
-curl https://api.anthropic.com/v1/messages \
- -H "content-type: application/json" \
- -H "x-api-key: $ANTHROPIC_API_KEY" \
- -H "anthropic-version: 2023-06-01" \
- -H "anthropic-beta: thinking-binding-controls-2026-08-01" \
- -d '{
- "model": "claude-fable-5-1",
- "max_tokens": 16000,
- "thinking": {
- "type": "adaptive",
- "block_binding": { "prefix_mismatch_behavior": "drop_block" }
+`block_binding` is accepted alongside `thinking.type: "adaptive"` and `thinking.type: "enabled"`. Sending it without the beta header returns a 400 error. Models that don't run the prefix check accept the object and report only model-check drops, so one request body works across models.
+
+The following request opts into dropping rather than rejecting. On a first turn there's nothing to replay, so `input_transformations` comes back empty:
+
+
+ ```bash cURL
+ curl https://api.anthropic.com/v1/messages \
+ -H "x-api-key: $ANTHROPIC_API_KEY" \
+ -H "anthropic-version: 2023-06-01" \
+ -H "anthropic-beta: thinking-binding-controls-2026-08-01" \
+ -H "content-type: application/json" \
+ -d '{
+ "model": "claude-fable-5-1",
+ "max_tokens": 16000,
+ "thinking": {
+ "type": "adaptive",
+ "block_binding": {
+ "prefix_mismatch_behavior": "drop_block"
+ }
+ },
+ "messages": [
+ {
+ "role": "user",
+ "content": "What is the greatest common divisor of 1071 and 462?"
+ }
+ ]
+ }'
+ ```
+
+ ```bash CLI
+ ant beta:messages create --beta thinking-binding-controls-2026-08-01 \
+ --transform '{content.#(type=="text")#.text,input_transformations}' \
+ --format yaml <<'YAML'
+ model: claude-fable-5-1
+ max_tokens: 16000
+ thinking:
+ type: adaptive
+ block_binding:
+ prefix_mismatch_behavior: drop_block
+ messages:
+ - role: user
+ content: What is the greatest common divisor of 1071 and 462?
+ YAML
+ ```
+
+ ```python Python
+ client = anthropic.Anthropic()
+
+ response = client.beta.messages.create(
+ model="claude-fable-5-1",
+ max_tokens=16000,
+ thinking={
+ "type": "adaptive",
+ "block_binding": {"prefix_mismatch_behavior": "drop_block"},
+ },
+ messages=[
+ {
+ "role": "user",
+ "content": "What is the greatest common divisor of 1071 and 462?",
+ }
+ ],
+ betas=["thinking-binding-controls-2026-08-01"],
+ )
+
+ for block in response.content:
+ if block.type == "text":
+ print(block.text)
+
+ print(f"Input transformations: {len(response.input_transformations or [])}")
+ ```
+
+ ```typescript TypeScript
+ const client = new Anthropic();
+
+ const response = await client.beta.messages.create({
+ model: "claude-fable-5-1",
+ max_tokens: 16000,
+ thinking: {
+ type: "adaptive",
+ block_binding: { prefix_mismatch_behavior: "drop_block" }
},
- "system": "You are a coding agent.",
- "messages": [
- { "role": "user", "content": "Fix the failing test." },
+ messages: [
+ { role: "user", content: "What is the greatest common divisor of 1071 and 462?" }
+ ],
+ betas: ["thinking-binding-controls-2026-08-01"]
+ });
+
+ for (const block of response.content) {
+ if (block.type === "text") {
+ console.log(block.text);
+ }
+ }
+ console.log(`Input transformations: ${response.input_transformations?.length ?? 0}`);
+ ```
+
+ ```csharp C#
+ AnthropicClient client = new();
+
+ var response = await client.Beta.Messages.Create(
+ new()
{
- "role": "assistant",
- "content": [
- { "type": "thinking", "thinking": "", "signature": "EqQBCkYIBxgCKkD..." },
- { "type": "text", "text": "I need to see the test first. Which file is it in?" }
- ]
+ Model = "claude-fable-5-1",
+ MaxTokens = 16000,
+ Thinking = new BetaThinkingConfigAdaptive
+ {
+ BlockBinding = new()
+ {
+ PrefixMismatchBehavior = BetaThinkingPrefixMismatchBehavior.DropBlock,
+ },
+ },
+ Messages =
+ [
+ new()
+ {
+ Role = Role.User,
+ Content = "What is the greatest common divisor of 1071 and 462?",
+ },
+ ],
+ Betas = [AnthropicBeta.ThinkingBindingControls2026_08_01],
+ }
+ );
+
+ foreach (var block in response.Content)
+ {
+ if (block.TryPickText(out var textBlock))
+ {
+ Console.WriteLine(textBlock.Text);
+ }
+ }
+
+ Console.WriteLine($"Input transformations: {response.InputTransformations?.Count ?? 0}");
+ ```
+
+ ```go Go
+ client := anthropic.NewClient()
+
+ response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
+ Model: "claude-fable-5-1",
+ MaxTokens: 16000,
+ Thinking: anthropic.BetaThinkingConfigParamUnion{
+ OfAdaptive: &anthropic.BetaThinkingConfigAdaptiveParam{
+ BlockBinding: anthropic.BetaThinkingBlockBindingParam{
+ PrefixMismatchBehavior: anthropic.BetaThinkingPrefixMismatchBehaviorDropBlock,
+ },
+ },
+ },
+ Messages: []anthropic.BetaMessageParam{
+ anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("What is the greatest common divisor of 1071 and 462?")),
+ },
+ Betas: []anthropic.AnthropicBeta{anthropic.AnthropicBetaThinkingBindingControls2026_08_01},
+ })
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ for _, block := range response.Content {
+ if textBlock, ok := block.AsAny().(anthropic.BetaTextBlock); ok {
+ fmt.Println(textBlock.Text)
+ }
+ }
+ fmt.Printf("Input transformations: %d\n", len(response.InputTransformations))
+ ```
+
+ ```java Java
+ import com.anthropic.models.beta.AnthropicBeta;
+ import com.anthropic.models.beta.messages.BetaMessage;
+ import com.anthropic.models.beta.messages.BetaThinkingBlockBinding;
+ import com.anthropic.models.beta.messages.BetaThinkingConfigAdaptive;
+ import com.anthropic.models.beta.messages.BetaThinkingPrefixMismatchBehavior;
+ import com.anthropic.models.beta.messages.MessageCreateParams;
+
+ void main() {
+ AnthropicClient client = AnthropicOkHttpClient.fromEnv();
+
+ MessageCreateParams params = MessageCreateParams.builder()
+ .model("claude-fable-5-1")
+ .maxTokens(16000L)
+ .addBeta(AnthropicBeta.THINKING_BINDING_CONTROLS_2026_08_01)
+ .thinking(BetaThinkingConfigAdaptive.builder()
+ .blockBinding(BetaThinkingBlockBinding.builder()
+ .prefixMismatchBehavior(BetaThinkingPrefixMismatchBehavior.DROP_BLOCK)
+ .build())
+ .build())
+ .addUserMessage("What is the greatest common divisor of 1071 and 462?")
+ .build();
+
+ BetaMessage response = client.beta().messages().create(params);
+
+ response.content().stream()
+ .flatMap(block -> block.text().stream())
+ .forEach(textBlock -> IO.println(textBlock.text()));
+ IO.println("Input transformations: "
+ + response.inputTransformations().map(List::size).orElse(0));
+ }
+ ```
+
+ ```php PHP
+ use Anthropic\Beta\AnthropicBeta;
+ use Anthropic\Beta\Messages\BetaThinkingBlockBinding;
+ use Anthropic\Beta\Messages\BetaThinkingConfigAdaptive;
+ use Anthropic\Beta\Messages\BetaThinkingPrefixMismatchBehavior;
+ use Anthropic\Client;
+
+ $client = new Client();
+
+ $response = $client->beta->messages->create(
+ model: 'claude-fable-5-1',
+ maxTokens: 16000,
+ thinking: BetaThinkingConfigAdaptive::with(
+ blockBinding: BetaThinkingBlockBinding::with(
+ prefixMismatchBehavior: BetaThinkingPrefixMismatchBehavior::DROP_BLOCK,
+ ),
+ ),
+ messages: [
+ ['role' => 'user', 'content' => 'What is the greatest common divisor of 1071 and 462?'],
+ ],
+ betas: [AnthropicBeta::THINKING_BINDING_CONTROLS_2026_08_01],
+ );
+
+ foreach ($response->content as $block) {
+ if ($block->type === 'text') {
+ echo $block->text, PHP_EOL;
+ }
+ }
+
+ echo 'Input transformations: ', count($response->inputTransformations ?? []), PHP_EOL;
+ ```
+
+ ```ruby Ruby
+ client = Anthropic::Client.new
+
+ response = client.beta.messages.create(
+ model: "claude-fable-5-1",
+ max_tokens: 16_000,
+ thinking: {
+ type: "adaptive",
+ block_binding: {prefix_mismatch_behavior: "drop_block"}
+ },
+ messages: [
+ {role: "user", content: "What is the greatest common divisor of 1071 and 462?"}
+ ],
+ betas: [Anthropic::AnthropicBeta::THINKING_BINDING_CONTROLS_2026_08_01]
+ )
+
+ response.content.each do |block|
+ puts block.text if block.type == :text
+ end
+
+ puts "Input transformations: #{response.input_transformations&.length || 0}"
+ ```
+
+
+```text Output wrap
+The greatest common divisor of 1071 and 462 is 21.
+Input transformations: 0
+```
+
+Under the beta header, every response from a thinking-capable model carries `input_transformations`. It's empty when nothing was dropped. Each entry has `type: "thinking_dropped"`, the `path` of the dropped block (for example `messages.1.content.0`), and a `reason` of `prefix_binding_mismatch` or `model_binding_mismatch` (see [Switching models mid-conversation](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#switching-models)). Ignore entries whose `type` or `reason` you don't recognize, because later checks add values.
+
+When [streaming](https://platform.claude.com/docs/en/build-with-claude/streaming), the array arrives on the `message` object in the `message_start` event. After a mid-stream server-side fallback, the final `message_delta` event carries it again with the serving model's entries. In a [message batch](https://platform.claude.com/docs/en/build-with-claude/batch-processing), an item whose block fails the prefix check under an explicit `"error"` resolves as `errored`, and an item that leaves the field unset drops the failing blocks instead. The [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) endpoint runs the same prefix check and returns the same 400.
+
+### When the API enforces the check
+
+The prefix check runs on Claude Fable 5.1 for new accounts.
+
+* **Accounts created on or after August 31, 2026, 00:00 UTC:** the API checks Claude Fable 5.1 requests and applies `"error"` unless you set `"drop_block"`. The same definition of a new account applies to the Claude API and to cloud platforms.
+* **Older accounts:** the API checks requests that set `prefix_mismatch_behavior`. This parameter opts a request in, so you can see what a new account sees without creating one.
+* **Later models:** every account, on every request.
+
+To find out which group your account is in, take a Claude Fable 5.1 conversation that contains a thinking block, change something before that block, and send it to Claude Fable 5.1 without the beta header or the `block_binding` field. A 400 response that names the header means your account is enforced by default.
+
+
+ If you maintain a tool or framework that people run with their own API key, your users on new accounts hit the check before you do, because your own key is likely on an older account. Test with `prefix_mismatch_behavior` set so you see what they see.
+
+
+### What counts as an edit
+
+Each row compares two consecutive requests:
+
+| Change between requests | Later thinking blocks |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------- |
+| Append messages at the end | Valid |
+| Add a tool with `defer_loading: true` that nothing has referenced yet | Valid |
+| Remove `thinking` blocks from the start of the history | Valid |
+| Change any request parameter outside `system`, `tools`, and `messages` (`effort`, `max_tokens`, `output_config`, `tool_choice`, `metadata`, and so on) | Valid |
+| Add, move, or remove `cache_control` markers | Valid |
+| A rotating signed URL that returns the same bytes | Valid |
+| Server-side compaction or context editing removes or replaces content | Valid (the check compares what you sent, not the server's edited copy) |
+| A cleared [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#per-turn-reminders) left in place | Valid |
+| Edit, reorder, or delete any earlier `user`, `assistant`, or `system` message | Invalid |
+| Add a text block to an earlier user turn, or remove one you added last time | Invalid |
+| Change the top-level `system` string or blocks | Invalid |
+| Add, remove, rename, or edit a tool in `tools` | Invalid |
+| Remove a `thinking` block from the middle of the history and keep later ones | Invalid for every later thinking block |
+| An image or document URL that returns different bytes on the next request | Invalid |
+| The same turn-scoped message deleted or reworded on a later request | Invalid |
+
+### Check whether your code edits the prefix
+
+First, diff what you send. Capture the request bodies your integration sends over a few normal turns, including a compaction or a tool change. For each pair of consecutive requests, compare `system`, `tools`, and the `messages` they share. They should be identical up to the newly appended turns.
+
+Then confirm against the API. Add the `thinking-binding-controls-2026-08-01` beta header, set `prefix_mismatch_behavior` to `"drop_block"`, and run a normal multi-turn session through your integration on claude-fable-5-1. The following example runs two turns the way your integration should: `messages` only grows, each assistant turn goes back exactly as the API returned it, `thinking` blocks included, and `block_binding` is set on every request. It prints the number of dropped blocks after each turn:
+
+
+ ```bash cURL
+ FIRST=$(curl -s https://api.anthropic.com/v1/messages \
+ -H "content-type: application/json" \
+ -H "x-api-key: $ANTHROPIC_API_KEY" \
+ -H "anthropic-version: 2023-06-01" \
+ -H "anthropic-beta: thinking-binding-controls-2026-08-01" \
+ -d '{
+ "model": "claude-fable-5-1",
+ "max_tokens": 16000,
+ "thinking": {
+ "type": "adaptive",
+ "block_binding": { "prefix_mismatch_behavior": "drop_block" }
},
- { "role": "user", "content": "tests/test_auth.py" }
- ]
- }'
+ "messages": [{ "role": "user", "content": "What is 27 * 453?" }]
+ }')
+ echo "$FIRST" | jq '.input_transformations | length'
+
+ # Turn 2: the assistant turn goes back exactly as returned, then the next user message
+ MESSAGES=$(jq -n --argjson first "$FIRST" '[
+ { role: "user", content: "What is 27 * 453?" },
+ { role: "assistant", content: $first.content },
+ { role: "user", content: "Now divide that result by 3." }
+ ]')
+
+ jq -n --argjson messages "$MESSAGES" '{
+ model: "claude-fable-5-1",
+ max_tokens: 16000,
+ thinking: {
+ type: "adaptive",
+ block_binding: { prefix_mismatch_behavior: "drop_block" }
+ },
+ messages: $messages
+ }' | curl -s https://api.anthropic.com/v1/messages \
+ -H "content-type: application/json" \
+ -H "x-api-key: $ANTHROPIC_API_KEY" \
+ -H "anthropic-version: 2023-06-01" \
+ -H "anthropic-beta: thinking-binding-controls-2026-08-01" \
+ -d @- | jq '.input_transformations | length'
+ ```
+
+ ```bash CLI
+ FIRST=$(ant beta:messages create --beta thinking-binding-controls-2026-08-01 \
+ --transform content --format json <<'YAML'
+ model: claude-fable-5-1
+ max_tokens: 16000
+ thinking:
+ type: adaptive
+ block_binding:
+ prefix_mismatch_behavior: drop_block
+ messages:
+ - role: user
+ content: What is 27 * 453?
+ YAML
+ )
+
+ # Turn 2: the assistant turn goes back exactly as returned, then the next user message
+ ant beta:messages create --beta thinking-binding-controls-2026-08-01 \
+ --transform input_transformations --format json < messages = [];
+ foreach (var userTurn in new[] { "What is 27 * 453?", "Now divide that result by 3." })
+ {
+ messages.Add(new() { Role = Role.User, Content = userTurn });
+ var response = await client.Beta.Messages.Create(
+ new()
+ {
+ Model = "claude-fable-5-1",
+ MaxTokens = 16000,
+ Thinking = new BetaThinkingConfigAdaptive
+ {
+ BlockBinding = new()
+ {
+ PrefixMismatchBehavior = BetaThinkingPrefixMismatchBehavior.DropBlock,
+ },
+ },
+ Messages = messages,
+ Betas = [AnthropicBeta.ThinkingBindingControls2026_08_01],
+ }
+ );
+ messages.Add(new()
+ {
+ Role = Role.Assistant,
+ Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(),
+ });
+ Console.WriteLine(response.InputTransformations?.Count ?? 0);
+ }
+ ```
+
+ ```go Go
+ client := anthropic.NewClient()
+
+ // messages grows across turns: each assistant turn goes back exactly as returned
+ messages := []anthropic.BetaMessageParam{}
+ for _, userTurn := range []string{"What is 27 * 453?", "Now divide that result by 3."} {
+ messages = append(messages, anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock(userTurn)))
+ response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
+ Model: "claude-fable-5-1",
+ MaxTokens: 16000,
+ Thinking: anthropic.BetaThinkingConfigParamUnion{
+ OfAdaptive: &anthropic.BetaThinkingConfigAdaptiveParam{
+ BlockBinding: anthropic.BetaThinkingBlockBindingParam{
+ PrefixMismatchBehavior: anthropic.BetaThinkingPrefixMismatchBehaviorDropBlock,
+ },
+ },
+ },
+ Messages: messages,
+ Betas: []anthropic.AnthropicBeta{anthropic.AnthropicBetaThinkingBindingControls2026_08_01},
+ })
+ if err != nil {
+ log.Fatal(err)
+ }
+ messages = append(messages, response.ToParam())
+ fmt.Println(len(response.InputTransformations))
+ }
+ ```
+
+ ```java Java
+ import com.anthropic.models.beta.AnthropicBeta;
+ import com.anthropic.models.beta.messages.BetaMessage;
+ import com.anthropic.models.beta.messages.BetaThinkingBlockBinding;
+ import com.anthropic.models.beta.messages.BetaThinkingConfigAdaptive;
+ import com.anthropic.models.beta.messages.BetaThinkingPrefixMismatchBehavior;
+ import com.anthropic.models.beta.messages.MessageCreateParams;
+
+ void main() {
+ AnthropicClient client = AnthropicOkHttpClient.fromEnv();
+
+ // The builder's message list grows across turns: each assistant turn goes back exactly as returned
+ MessageCreateParams.Builder conversation = MessageCreateParams.builder()
+ .model("claude-fable-5-1")
+ .maxTokens(16000L)
+ .thinking(BetaThinkingConfigAdaptive.builder()
+ .blockBinding(BetaThinkingBlockBinding.builder()
+ .prefixMismatchBehavior(BetaThinkingPrefixMismatchBehavior.DROP_BLOCK)
+ .build())
+ .build())
+ .addBeta(AnthropicBeta.THINKING_BINDING_CONTROLS_2026_08_01);
+
+ for (String userTurn : List.of("What is 27 * 453?", "Now divide that result by 3.")) {
+ conversation.addUserMessage(userTurn);
+ BetaMessage response = client.beta().messages().create(conversation.build());
+ conversation.addMessage(response);
+ IO.println(response.inputTransformations().map(List::size).orElse(0));
+ }
+ }
+ ```
+
+ ```php PHP
+ use Anthropic\Beta\AnthropicBeta;
+ use Anthropic\Beta\Messages\BetaThinkingBlockBinding;
+ use Anthropic\Beta\Messages\BetaThinkingConfigAdaptive;
+ use Anthropic\Beta\Messages\BetaThinkingPrefixMismatchBehavior;
+ use Anthropic\Client;
+
+ $client = new Client();
+
+ // $messages grows across turns: each assistant turn goes back exactly as returned
+ $messages = [];
+ foreach (['What is 27 * 453?', 'Now divide that result by 3.'] as $userTurn) {
+ $messages[] = ['role' => 'user', 'content' => $userTurn];
+ $response = $client->beta->messages->create(
+ model: 'claude-fable-5-1',
+ maxTokens: 16000,
+ thinking: BetaThinkingConfigAdaptive::with(
+ blockBinding: BetaThinkingBlockBinding::with(
+ prefixMismatchBehavior: BetaThinkingPrefixMismatchBehavior::DROP_BLOCK,
+ ),
+ ),
+ messages: $messages,
+ betas: [AnthropicBeta::THINKING_BINDING_CONTROLS_2026_08_01],
+ );
+ $messages[] = ['role' => 'assistant', 'content' => $response->content];
+ echo count($response->inputTransformations ?? []), PHP_EOL;
+ }
+ ```
+
+ ```ruby Ruby
+ client = Anthropic::Client.new
+
+ # messages grows across turns: each assistant turn goes back exactly as returned
+ messages = []
+ ["What is 27 * 453?", "Now divide that result by 3."].each do |user_turn|
+ messages << {role: "user", content: user_turn}
+ response = client.beta.messages.create(
+ model: "claude-fable-5-1",
+ max_tokens: 16_000,
+ thinking: {
+ type: "adaptive",
+ block_binding: {prefix_mismatch_behavior: "drop_block"}
+ },
+ messages: messages,
+ betas: [Anthropic::AnthropicBeta::THINKING_BINDING_CONTROLS_2026_08_01]
+ )
+ messages << {role: "assistant", content: response.content}
+ puts (response.input_transformations || []).length
+ end
+ ```
+
+
+```text Output wrap
+0
+0
```
-Every response then carries a top-level `input_transformations` array. Log it on each turn:
+Both turns print `0` because nothing earlier changed. Log `input_transformations` on every turn of your own integration. When the API drops a block, the entry looks like the following:
```json
{
@@ -97,53 +672,38 @@ Every response then carries a top-level `input_transformations` array. Log it on
}
```
-* **Empty on every turn:** your integration keeps history intact.
-* **`reason: "prefix_binding_mismatch"`:** something before the block at `path` changed between this request and the previous one. Diff `system`, `tools`, and `messages` up to that turn to find it.
-* **`reason: "model_binding_mismatch"`:** the conversation moved to a model that can't read the earlier model's blocks (a router, a fallback). Not a bug in your integration. Keep sending the blocks and let the API drop what the current model can't read.
-
-This works from any account, because setting the field opts the request into enforcement. To fail loudly in CI instead, set `"error"`. The 400 begins:
-
-```text wrap
-messages.1.content.0: Invalid `signature` in `thinking` block. The block is bound to a different conversation. Remove the block, or set `thinking.block_binding.prefix_mismatch_behavior` to "drop_block".
-```
-
-Without the beta header on the request, the message continues: ``That setting requires the `thinking-binding-controls-2026-08-01` value in the `anthropic-beta` header.`` The message usually ends with a sentence naming what changed, for example that the `system` prompt or the `tools` list differs from when the block was created.
+* **Empty on every turn:** your integration keeps the prefix intact.
+* **`reason: "prefix_binding_mismatch"`:** something before the block at `path` changed since the previous request. Diff `system`, `tools`, and `messages` up to that turn to find it, then find the matching replacement in [Make changes without editing the prefix](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#replace-prefix-edits).
+* **`reason: "model_binding_mismatch"`:** the conversation moved to a model that can't read the earlier model's blocks. This isn't a prefix edit. See [Switching models mid-conversation](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#switching-models).
-See [Troubleshooting thinking](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#error-thinking-block-signature) for every variant of this error.
+To fail loudly in CI instead, set `"error"` and treat the 400 described in [What the API does with an invalid block](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#mismatch-behavior) as a test failure.
-## What counts as an edit
+## Make changes without editing the prefix
-Between two consecutive requests:
+Each common prefix edit has a replacement that gives the model the same information and leaves earlier bytes unchanged, so later thinking stays valid. Find the edit your code makes today in the first column:
-| Change between requests | Later thinking blocks |
-| ------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
-| Append messages at the end | Valid |
-| Add a tool with `defer_loading: true` that nothing has referenced yet | Valid |
-| Remove `thinking` blocks from the start of the history (every thinking block before some point) | Valid |
-| Change any request parameter outside `system`, `tools`, and `messages` (`max_tokens`, `output_config`, `tool_choice`, `metadata`, and so on) | Valid |
-| Add, move, or remove `cache_control` markers | Valid |
-| A rotating signed URL that returns the same bytes | Valid |
-| Server-side compaction or context editing removes or replaces content | Valid (the check compares what you sent, not the server's edited copy) |
-| A cleared [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#per-turn-reminders) left in place | Valid |
-| Edit, reorder, or delete any earlier `user`, `assistant`, or `system` message | Invalid |
-| Add a text block to an earlier user turn, or remove one you added last time | Invalid |
-| Change the top-level `system` string or blocks | Invalid |
-| Add, remove, rename, or edit a tool in `tools` | Invalid |
-| Remove a `thinking` block from the middle of the history and keep later ones | Invalid for every later thinking block |
-| An image or document URL that returns different bytes on the next request | Invalid |
-| The same turn-scoped message deleted or reworded on a later request | Invalid |
+| Instead of | Use | Beta header |
+| --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
+| Rebuilding the top-level `system` prompt | A [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#new-instructions) | None |
+| Injecting a reminder and deleting it on the next request | A [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#per-turn-reminders) (`clear_at: "next_user_message"`) | `mid-conversation-system-clear-at-2026-08-21` |
+| Adding or removing entries in `tools` | [`tool_addition` and `tool_removal` blocks](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#tool-changes) | `mid-conversation-tool-changes-2026-07-01` |
+| Changing top-level `output_config.effort` (restarts the cache, doesn't affect thinking) | A [per-message `output_config`](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#effort-changes) | `mid-conversation-output-config-2026-07-01` |
+| Dropping or summarizing old turns on the client | Server-side [compaction or context editing](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#server-side-trimming), or [client-side compaction](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#custom-compaction-on-the-client) that keeps no stale thinking | `compact-2026-01-12` or `context-management-2025-06-27` |
+| An image or document URL whose bytes change between requests | A [`file_id` from the Files API](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#files-by-id), or base64 | None |
-## Update your integration
+All of these assume you [send assistant turns back exactly as returned](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#append-assistant-turns-exactly-as-returned). To use several betas in one request, combine the values in one `anthropic-beta` header. The same names apply on Amazon Bedrock and Google Cloud (see [Beta headers](https://platform.claude.com/docs/en/api/beta-headers)):
-Each pattern replaces one kind of history edit with an API feature that has the same effect on the model without changing earlier bytes.
+```text wrap
+anthropic-beta: thinking-binding-controls-2026-08-01,mid-conversation-system-clear-at-2026-08-21,mid-conversation-tool-changes-2026-07-01
+```
-### Append assistant turns exactly as returned
+### Send assistant turns back exactly as returned
-Store the `content` array from each response and send it back unchanged as the assistant turn, every block type in the order received, including `thinking` blocks whose `thinking` field is empty. Don't reserialize through an intermediate type that drops unknown block types or empty fields.
+Store the `content` array from each response and send it back unchanged as the assistant turn: every block type, in the order received, including `thinking` blocks whose `thinking` field is empty. A serializer that drops unknown block types, drops empty fields, or reorders blocks edits the prefix for every later turn.
-### Add instructions with a mid-conversation system message, not by editing `system`
+### Add instructions with a mid-conversation system message
-If your code rebuilds the top-level `system` prompt each request (current time, token budget, mode flag, newly discovered project context), every thinking block in the conversation fails the check. Freeze `system` at session start, and when something changes append a [`role: "system"` message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) at the point in `messages` where it becomes true:
+Some harnesses rebuild the top-level `system` prompt on each request to carry the current time, a token budget, a mode flag, or newly discovered project context. That invalidates every thinking block in the conversation. Instead, freeze `system` at session start. When something changes, append a [`role: "system"` message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) at the point in `messages` where the change becomes true:
```json
{
@@ -152,13 +712,11 @@ If your code rebuilds the top-level `system` prompt each request (current time,
}
```
-The model treats it with system-prompt authority, and everything before it is unchanged. No beta header is needed on Claude Fable 5.1. In a tool loop, place it after the `tool_result` user message, never between an assistant `tool_use` and its `tool_result` (see [Limitations](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#limitations)).
+The model treats this message with system-prompt authority, and everything before it stays unchanged. In a tool loop, place the message after the `tool_result` user message, never between an assistant `tool_use` and its `tool_result` (see [Limitations](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#limitations)). Once sent, the message is part of the prefix for later thinking: leave it in place on later requests.
### Send per-turn reminders as turn-scoped system messages
-The most common history edit is the per-turn nudge: a line appended after each batch of tool results ("request independent reads together", "you haven't updated the user in a while") and removed on the next request so reminders don't pile up. Removing it is the edit.
-
-Instead, send the nudge as a [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) with `clear_at: "next_user_message"` after the `tool_result` user message (beta header `mid-conversation-system-clear-at-2026-08-21`). This `messages` array is the request after two tool rounds. `messages[3]` is the previous request's nudge, left in place, and `messages[6]` is this request's copy:
+The most common prefix edit is the per-turn nudge: a line such as "request independent reads together" or "you haven't updated the user in a while" that your code appends after each batch of tool results. To keep reminders from piling up, send each nudge as a [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) with `clear_at: "next_user_message"`, placed after the `tool_result` user message. `clear_at` requires the beta header `mid-conversation-system-clear-at-2026-08-21`. The following `messages` array is the request after two tool calls and their results. `messages[3]` is the previous request's nudge, left in place, and `messages[6]` is this request's copy:
```json
[
@@ -208,13 +766,11 @@ Instead, send the nudge as a [mid-conversation system message](https://platform.
]
```
-A `tool_result`-only user message counts as the "next user message", so `messages[3]` is already cleared: it renders nothing and costs no input tokens, but it's still in the array, so the thinking in `messages[4]` stays valid. `messages[6]` is what the model sees this turn. On later requests keep both where they are and append the next copy after the next `tool_result` message. Turn-scoped messages carry `text` only and take no `cache_control`. Put the cache breakpoint on the preceding user turn. See [Turn-scoped system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages).
+A user message that contains only `tool_result` blocks counts as the "next user message", so `messages[3]` is already cleared. It adds nothing to what the model sees and costs no input tokens, but because it's still in the array, the thinking in `messages[4]` stays valid. `messages[6]` is the copy the model sees this turn. On later requests, keep both where they are and append a fresh copy after the next `tool_result` message.
-Without the beta, append the nudge as a `text` block after the `tool_result` blocks in the same user message, and leave earlier copies in place. The model acts on the newest one.
+### Add or remove tools with `tool_addition` and `tool_removal`
-### Change tools with `tool_addition` and `tool_removal`, not by editing `tools`
-
-If the set of tools changes mid-session (a tool unlocks after authentication, a dangerous tool is withdrawn after a mode switch), don't edit `tools`. Declare the full set at session start and use [mid-conversation tool changes](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#mid-conversation-tool-changes) to offer or withdraw a tool from that point on (beta header `mid-conversation-tool-changes-2026-07-01`). A tool that isn't available yet gets `defer_loading: true` and a later `tool_addition` block, same shape as this `tool_removal`:
+Editing the `tools` array mid-session invalidates preserved thinking blocks. Instead, declare every tool the session might need in `tools` on the first request and never change the array. To change which tools the model can use from some point on, append a `role: "system"` message that carries a `tool_removal` or `tool_addition` block. These are [mid-conversation tool changes](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#mid-conversation-tool-changes) and need the beta header `mid-conversation-tool-changes-2026-07-01`. For example, to withdraw a dangerous tool after a mode switch:
```json
{
@@ -226,111 +782,318 @@ If the set of tools changes mid-session (a tool unlocks after authentication, a
}
```
-A tool whose schema you learn mid-session (an MCP server discovered at runtime) can be appended to `tools` with `defer_loading: true` and offered with `tool_addition`. An unreferenced deferred tool isn't part of the prefix, so appending it is safe. Appending a regular tool isn't.
+To offer a tool later instead, declare it in `tools` with `defer_loading: true` so the model doesn't see it at first. When it becomes available, append a `tool_addition` block:
+
+```json
+{
+ "role": "system",
+ "content": [
+ { "type": "tool_addition", "tool": { "type": "tool_reference", "name": "deploy" } },
+ { "type": "text", "text": "Authentication succeeded. Deployment is now available." }
+ ]
+}
+```
-### Trim context on the server where you can
+Sometimes you can't declare a tool up front because you don't know its schema yet. An MCP server discovered at runtime is the common case. Append that tool to `tools` with `defer_loading: true`, then offer it with a `tool_addition` block. Adding a deferred tool is safe: the prefix check ignores a deferred tool until a `tool_addition` block references it, so earlier thinking stays valid. Adding a tool without `defer_loading: true` changes the prefix and invalidates earlier thinking.
-Client-side truncation and summarization are the second most common edit: drop or summarize the oldest turns and keep the recent ones verbatim. The recent turns' thinking blocks were produced while the history you removed was still in place, so they fail the check. The server-side equivalents don't count as edits, because the check compares the conversation as you sent it:
+The `role: "system"` messages that carry these blocks join the prefix for later thinking. Leave them in place on later requests.
-* [Compaction](https://platform.claude.com/docs/en/build-with-claude/compaction) summarizes older turns into a compaction block when the context approaches a threshold you set, and the checked prefix restarts from that block. Its [`instructions` parameter](https://platform.claude.com/docs/en/build-with-claude/compaction#custom-summarization-instructions) takes your own summarization prompt ("preserve every ticker, position size, and stated assumption").
-* [Context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) clears old tool results (`clear_tool_uses_20250919`) or old thinking blocks oldest-first (`clear_thinking_20251015`) by rule.
+### Change effort with a per-message `output_config`
-### Custom compaction on the client
+Changing top-level `output_config.effort` between requests doesn't invalidate thinking, because effort isn't part of the prefix. Changing top-level effort does restart the prompt cache. On Claude Fable 5.1, use [per-message effort](https://platform.claude.com/docs/en/build-with-claude/effort#change-effort-mid-conversation-beta) instead: append a `role: "system"` message with empty `content` and the new level. It needs the beta header `mid-conversation-output-config-2026-07-01`.
-This check doesn't prohibit client-side compaction. The rule is narrower: **don't keep a thinking block behind a prefix you've rewritten.**
+```json
+{ "role": "system", "content": [], "output_config": { "effort": "low" } }
+```
-**Simple compaction** is the recommended shape and needs no changes. When the conversation grows too long, summarize it into one message and start the next request with that summary plus the new user turn, replaying no earlier turns or thinking blocks: `messages` becomes `[{"role": "user", "content": "\n\n"}]`. No earlier thinking remains, so nothing fails, and the model thinks afresh on the compacted conversation. Claude models are trained on long-horizon tasks with this scheme, and it performs comparably to more elaborate ones for most workloads. It resets the prompt cache at the compaction point, as any compaction does.
+The new level takes effect from the next `user` turn. Once sent, the message is part of `messages` and therefore part of the prefix for later thinking: leave it in place on later requests, and append another one to change effort again.
-Two other common shapes fail as written and need one change each:
+### Trim context on the server
-* **Keep-tail compaction** summarizes older turns and keeps the most recent turns verbatim. The kept turns' thinking blocks were produced against the full history, so they fail behind the summary. Fix: strip `thinking` and `redacted_thinking` from every assistant turn you carry across, keeping `text` and `tool_use`, or send `prefix_mismatch_behavior: "drop_block"` and let the API strip them.
-* **Background compaction** builds the summary off the critical path and swaps it in while the conversation continues, so every turn produced in the meantime has thinking that predates the swap. Fix: send `"drop_block"` on every request that still carries thinking blocks produced before the swap (or strip those blocks yourself; `input_transformations` on the first response after the swap lists exactly which ones), or compact synchronously.
+The second most common prefix edit is client-side trimming: dropping or summarizing the oldest turns and keeping the recent ones verbatim. The kept turns' thinking blocks were produced while the removed history was still in place, so they fail the check. The server-side equivalents don't count as edits, because the check compares the conversation as you sent it:
-Snipping individual turns out of the middle of the transcript invalidates everything after them, and no client-side shape avoids that. Use a mid-conversation system message for the instruction change you were making, or server-side [context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) for selective removal.
+* [Compaction](https://platform.claude.com/docs/en/build-with-claude/compaction) summarizes older turns into a compaction block when the context approaches a threshold you set, and the checked prefix restarts from that block. Its [`instructions` parameter](https://platform.claude.com/docs/en/build-with-claude/compaction#custom-summarization-instructions) takes your own summarization prompt, such as "preserve every ticker, position size, and stated assumption".
+* [Context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) clears old tool results or old thinking blocks by rule, oldest first. The strategies are `clear_tool_uses_20250919` and `clear_thinking_20251015`.
-Don't compact in the middle of a tool round: an assistant turn whose `tool_use` is still waiting on a `tool_result` should go back with its thinking intact, so the model finishes the round with its reasoning (see [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks)).
+### Compact on the client
-### Reference files by ID, not by URL that changes content
+You can still compact on the client. Once you rewrite anything earlier in the conversation, don't send back a thinking block that was produced before the rewrite.
-For an `image` or `document` block with a `url` source, the fetched bytes are part of the checked prefix and the URL string isn't. A "latest screenshot" endpoint or an edited document invalidates later thinking. A rotating signed URL for the same file doesn't. For content you reference across turns, upload it once with the [Files API](https://platform.claude.com/docs/en/build-with-claude/files) and use the `file_id`, or send base64.
+#### Simple compaction (recommended)
-### Decide what happens on a mismatch
+When the conversation grows too long, summarize the whole session into one user message and send only that message plus the next instruction. Nothing earlier is replayed, so there's no thinking left to fail the check, and the model reasons afresh from the summary.
-Once your integration is append-only, choose a `prefix_mismatch_behavior` for production. It governs only prefix mismatches. A block the current model can't read (after a router switch or [server-side fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#server-side-fallback)) is always dropped, and reported in `input_transformations` when the beta header is sent.
+
-* **`"error"`** (the default) if a prefix mismatch can only mean a bug in your code. You find out from a 400 in testing rather than from silently dropped blocks. In the Message Batches API, the unset default drops failing blocks instead of failing the batch item; set `"error"` explicitly if you want items to error.
-* **`"drop_block"`** if you'd rather drop the affected blocks than fail. Log `input_transformations`.
+```json
+[
+ {
+ "role": "user",
+ "content": "\n\n"
+ }
+]
+```
-If you catch the 400 in production, retrying the same request won't clear it. Retry with `prefix_mismatch_behavior: "drop_block"` (and the beta header), which removes exactly the blocks that fail, including any in an assistant turn whose `tool_use` is still waiting on its `tool_result`. The drop applies to that request only, so keep sending `"drop_block"` (and the beta header) for the rest of the session. Without the beta, strip every `thinking` and `redacted_thinking` block from the history, leaving each turn's `text` and `tool_use` blocks in place, and retry once. Then fix the edit that caused it.
+Claude models are trained on long-horizon tasks with this scheme and for most workloads it performs well.
-## API features used on this page
+#### Keep-tail compaction
-| Feature | What it replaces | Status | Header |
-| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ------ | --------------------------------------------- |
-| [Controls for blocks that aren't preserved](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-thinking-controls) (`thinking.block_binding.prefix_mismatch_behavior`, `input_transformations`) | Choose reject or drop on a prefix mismatch, and see what was dropped | Beta | `thinking-binding-controls-2026-08-01` |
-| [Mid-conversation system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) (`role: "system"` in `messages`) | Rebuilding the top-level `system` prompt | Stable | None |
-| [Turn-scoped system messages](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#per-turn-reminders) (`clear_at: "next_user_message"`) | Injecting a reminder and deleting it next request | Beta | `mid-conversation-system-clear-at-2026-08-21` |
-| [Mid-conversation tool changes](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#mid-conversation-tool-changes) (`tool_addition`, `tool_removal`) | Editing the `tools` array | Beta | `mid-conversation-tool-changes-2026-07-01` |
-| [Compaction](https://platform.claude.com/docs/en/build-with-claude/compaction) (`instructions` for a custom summary prompt) | Client-side summarization of old turns | Beta | `compact-2026-01-12` |
-| [Context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) (`clear_tool_uses_20250919`, `clear_thinking_20251015`) | Client-side deletion of old tool results or thinking | Beta | `context-management-2025-06-27` |
-| [Files API](https://platform.claude.com/docs/en/build-with-claude/files) (`file_id` sources) | URLs whose content changes between requests | Stable | None |
-| [Per-message effort](https://platform.claude.com/docs/en/build-with-claude/effort#change-effort-mid-conversation-beta) (`output_config.effort` on a `role: "system"` message) | Changing top-level effort between requests (protects the prompt cache, not thinking: effort isn't part of the prefix) | Beta | `mid-conversation-output-config-2026-07-01` |
+Keep-tail compaction summarizes the older turns and keeps the most recent turns verbatim, so the model still sees the last few exchanges word for word. As usually written it breaks the rule: the kept assistant turns still carry thinking blocks that were produced when the original turns, not the summary, came before them. Those blocks fail.
-To combine headers in one request:
+
-```text wrap
-anthropic-beta: thinking-binding-controls-2026-08-01,mid-conversation-system-clear-at-2026-08-21,mid-conversation-tool-changes-2026-07-01
+Fix: keep the turns exactly as they are and send `prefix_mismatch_behavior: "drop_block"`. The API drops the stale thinking blocks, the model reads the kept turns' `text` and `tool_use` blocks, and the request succeeds.
+
+Pass the compacted history as `messages` and set `block_binding` on the `thinking` configuration. In the following example, `compacted_messages` is the array your compaction step produced: the summary message followed by the kept turns exactly as the API returned them, `thinking` blocks included:
+
+
+ ```bash cURL
+ curl https://api.anthropic.com/v1/messages \
+ -H "content-type: application/json" \
+ -H "x-api-key: $ANTHROPIC_API_KEY" \
+ -H "anthropic-version: 2023-06-01" \
+ -H "anthropic-beta: thinking-binding-controls-2026-08-01" \
+ -d "{
+ \"model\": \"claude-fable-5-1\",
+ \"max_tokens\": 16000,
+ \"thinking\": {
+ \"type\": \"adaptive\",
+ \"block_binding\": { \"prefix_mismatch_behavior\": \"drop_block\" }
+ },
+ \"messages\": $COMPACTED_MESSAGES
+ }"
+ ```
+
+ ```bash CLI
+ ant beta:messages create --beta thinking-binding-controls-2026-08-01 <beta->messages->create(
+ model: 'claude-fable-5-1',
+ maxTokens: 16000,
+ thinking: BetaThinkingConfigAdaptive::with(
+ blockBinding: BetaThinkingBlockBinding::with(
+ prefixMismatchBehavior: BetaThinkingPrefixMismatchBehavior::DROP_BLOCK,
+ ),
+ ),
+ messages: $compactedMessages,
+ betas: [AnthropicBeta::THINKING_BINDING_CONTROLS_2026_08_01],
+ );
+
+ var_dump($response->inputTransformations);
+ ```
+
+ ```ruby Ruby
+ client = Anthropic::Client.new
+
+ # compacted_messages: the summary message, then the kept turns as returned
+ response = client.beta.messages.create(
+ model: "claude-fable-5-1",
+ max_tokens: 16_000,
+ thinking: {
+ type: "adaptive",
+ block_binding: {prefix_mismatch_behavior: "drop_block"}
+ },
+ messages: compacted_messages,
+ betas: [Anthropic::AnthropicBeta::THINKING_BINDING_CONTROLS_2026_08_01]
+ )
+
+ puts response.input_transformations
+ ```
+
+
+The response carries the new assistant turn as usual, plus one `input_transformations` entry per dropped block. For the history in the diagram, that's the thinking on assistant turns 3 and 4:
+
+```json
+{
+ "input_transformations": [
+ {
+ "type": "thinking_dropped",
+ "path": "messages.2.content.0",
+ "reason": "prefix_binding_mismatch"
+ },
+ {
+ "type": "thinking_dropped",
+ "path": "messages.4.content.0",
+ "reason": "prefix_binding_mismatch"
+ }
+ ]
+}
```
-The same beta names apply on Amazon Bedrock and Google Cloud. See [Beta headers](https://platform.claude.com/docs/en/api/beta-headers) for how to send them with each SDK.
+Keep sending `"drop_block"` on later requests for as long as those two turns stay in the history. Thinking the model produces from this request onward follows the summary and stays valid. If you'd rather not depend on the beta header, the alternative is to strip the `thinking` and `redacted_thinking` blocks from the kept assistant turns yourself when you build the compacted history.
+
+#### Patterns that don't work with preserved thinking
-## Checklist
+* **Background compaction.** Building the summary off the critical path and swapping it in a few requests later breaks the rule the same way keep-tail does, with a delay: every assistant turn produced while the summary was being built carries thinking that predates the swap, and it all fails the moment the summary lands. If you need it, treat the swap like keep-tail and send `"drop_block"` from the swap onward. Otherwise compact synchronously.
+* **Cutting turns out of the middle.** Removing individual turns invalidates every thinking block after them, and no compaction scheme avoids that. If you were cutting a turn to change an instruction, append a [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#new-instructions) instead. To remove old tool results or old thinking selectively, use server-side [context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing).
+* **Compacting in the middle of a tool round.** Don't compact between an assistant turn's `tool_use` and the `tool_result` that answers it. Send that assistant turn back with its thinking intact so the model finishes the round with its reasoning. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks).
-* If an official Claude product or SDK (Claude Code, claude.ai, Claude Managed Agents, the Claude Agent SDK) manages your conversation history, stop here.
-* Consecutive request bodies are byte-identical in `system`, `tools`, and the shared `messages` prefix.
-* A full session under `prefix_mismatch_behavior: "drop_block"` logs no `prefix_binding_mismatch` entries.
-* Assistant turns go back byte-for-byte as returned, all block types included.
-* Top-level `system` and `tools` are fixed for the session. Changes go in `role: "system"` messages and `tool_addition` / `tool_removal` blocks.
-* Per-turn reminders are turn-scoped system messages (or trailing text blocks) that are appended fresh and never removed.
-* Context is trimmed by compaction or context editing, or by a client-side compaction that leaves no thinking blocks behind the rewritten prefix and never splits a tool round.
-* Cross-turn files are `file_id` or base64, not mutable URLs.
-* A production `prefix_mismatch_behavior` is set and its 400s or dropped entries are monitored.
+### Reference files by ID, not by a URL whose content changes
+
+For an `image` or `document` block with a `url` source, the check covers the fetched bytes, not the URL string. A URL whose content changes invalidates later thinking: a "latest screenshot" endpoint, or a document someone edits between turns. A rotating signed URL for the same file doesn't. For content you reference across turns, upload it once with the [Files API](https://platform.claude.com/docs/en/build-with-claude/files) and use the `file_id`, or send base64.
## FAQ
-
- No. Send the `thinking-binding-controls-2026-08-01` beta header and set `thinking.block_binding.prefix_mismatch_behavior`. Setting the field opts that request into enforcement regardless of account age: `"error"` rejects an edited history with the same 400 a new account gets, and `"drop_block"` lets the request through and lists what was dropped in `input_transformations`. See [How to tell whether your integration is impacted](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#how-to-tell-whether-your-integration-is-impacted).
+
+ No. Send the `thinking-binding-controls-2026-08-01` beta header and set `thinking.block_binding.prefix_mismatch_behavior`. Setting the field opts that request into enforcement regardless of account age. `"error"` rejects an edited history with the same 400 a new account gets, and `"drop_block"` lets the request through and lists what was dropped in `input_transformations`. See [Check whether your code edits the prefix](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#how-to-tell-whether-your-integration-is-impacted).
- No. What fails is the thinking already in the history after the point you changed, and you choose what happens to it. With `prefix_mismatch_behavior: "drop_block"` the API drops those blocks and the request succeeds: the model answers that turn without that reasoning, and the prompt cache restarts at the edit. With the default `"error"` the API rejects the request with a 400 until you undo the edit or resend with `"drop_block"`; see [Decide what happens on a mismatch](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#decide-what-happens-on-a-mismatch). [What counts as an edit](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#what-counts-as-an-edit) lists which changes matter.
+ No. What fails is the thinking already in the history after the point you changed, and you choose what happens to it. With `prefix_mismatch_behavior: "drop_block"`, the API drops those blocks and the request succeeds: the model answers that turn without that reasoning, and the prompt cache restarts at the edit. With the default `"error"`, the API rejects the request with a 400 until you undo the edit or resend with `"drop_block"`. See [What the API does with an invalid block](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#mismatch-behavior). [What counts as an edit](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#what-counts-as-an-edit) lists which changes matter.
- No. `output_config.effort`, `max_tokens`, and the `thinking` configuration aren't part of the checked prefix, which covers only `system`, `tools`, and `messages`. A top-level effort change still invalidates most of the prompt cache; on Claude Fable 5.1, a [per-message effort](https://platform.claude.com/docs/en/build-with-claude/effort#change-effort-mid-conversation-beta) change keeps it. Once sent, that effort message is part of the history: leave it in place on later requests.
+ No. `output_config.effort`, `max_tokens`, and the `thinking` configuration aren't part of the checked prefix, which covers only `system`, `tools`, and `messages`. A top-level effort change invalidates most of the prompt cache. On Claude Fable 5.1, a [per-message effort](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#effort-changes) change keeps the prompt cache and is used as the new effort level until changed again.
- Don't edit `tools`: declare the full set at session start, mark tools that aren't available yet `defer_loading: true`, and offer or withdraw them with `tool_addition` and `tool_removal` blocks. A tool whose schema you learn only mid-session, such as one from an MCP server discovered at runtime, can still be appended to `tools` with `defer_loading: true` and offered the same way, because an unreferenced deferred tool isn't part of the prefix. The `role: "system"` messages that carry these blocks join the prefix for later thinking, so don't move, reword, or delete them afterward. See [Change tools with `tool_addition` and `tool_removal`](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#change-tools-with-tool-addition-and-tool-removal-not-by-editing-tools).
+ Don't edit `tools`. Declare the full set at session start, mark tools that aren't available yet with `defer_loading: true`, and offer or withdraw them with `tool_addition` and `tool_removal` blocks. If you learn a tool's schema only mid-session, such as from an MCP server discovered at runtime, you can still append it to `tools` with `defer_loading: true` and offer it the same way. That's safe because an unreferenced deferred tool isn't part of the prefix. The `role: "system"` messages that carry these blocks join the prefix for later thinking, so don't move, reword, or delete them afterward. See [Add or remove tools with `tool_addition` and `tool_removal`](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#tool-changes).
- Not if the kept turns still carry their thinking: those blocks were produced against the history you replaced, so they fail the check. Strip `thinking` and `redacted_thinking` from the turns you carry across (their `text` and `tool_use` blocks stay), or send `prefix_mismatch_behavior: "drop_block"` and let the API drop them. Simple compaction (one summary message plus the next user turn, no earlier turns replayed) leaves no thinking behind to fail and is the recommended shape. Server-side [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction) and [context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) don't count as edits. See [Custom compaction on the client](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#custom-compaction-on-the-client).
+ Not if the kept turns still carry their thinking: those blocks were produced against the history you replaced, so they fail the check. Strip `thinking` and `redacted_thinking` blocks from the turns you carry across and keep their `text` and `tool_use` blocks, or send `prefix_mismatch_behavior: "drop_block"` and let the API drop them. Simple compaction leaves no thinking behind to fail and is the recommended approach: one summary message plus the next user turn, with no earlier turns replayed. Server-side [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction) and [context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) don't count as edits. See [Compact on the client](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#custom-compaction-on-the-client).
- Load them once at session start and keep the top-level `system` prompt and `tools` fixed. When a file changes, append the new version at that point in `messages` instead of editing the original: a [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) for instructions that come from you as the operator, or content in the next `user` turn for file text you treat as untrusted, which shouldn't carry system-prompt authority. See [Add instructions with a mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#add-instructions-with-a-mid-conversation-system-message-not-by-editing-system) and [Limitations](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#limitations).
+ Load them once at session start and keep the top-level `system` prompt and `tools` fixed. When a file changes, append the new version at that point in `messages` instead of editing the original. Use a [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) for instructions that come from you as the operator. For file text you treat as untrusted, which shouldn't carry system-prompt authority, put the content in the next `user` turn instead. See [Add instructions with a mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#new-instructions) and [Limitations](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#limitations).
- Yes. A resumed session is an ordinary follow-up request: `system`, `tools`, and the earlier `messages` must match what you last sent byte-for-byte. Persist what you sent and received (the rendered system prompt, the tool definitions, each assistant turn as returned) and replay that, rather than re-rendering from inputs that might have changed since, such as the date, an updated instruction file, or a new tool version. Anything new goes in an appended message. See [Append assistant turns exactly as returned](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#append-assistant-turns-exactly-as-returned).
-
-
-
- Keep sending the full history and let the API decide on each request. An older model can't read Claude Fable 5.1's thinking blocks, so the API leaves them out of what that model sees for that one request (no error, not billed, and reported as `model_binding_mismatch` in `input_transformations` when you send the beta header); it never edits your `messages` array, so the blocks stay in your history. When the same history goes back to Claude Fable 5.1, those blocks are readable again, along with the older model's thinking. The reasoning is lost only if your client removes the blocks itself, for example a harness that strips thinking on a model switch or rebuilds the history from what each model used. See [Only for the model that produced it, or a newer one](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-for-model) for which models read which blocks.
-
- 
+ Yes. A resumed session is an ordinary follow-up request: `system`, `tools`, and the earlier `messages` must match what you last sent byte-for-byte. Persist exactly what you sent and received, and replay that: the rendered system prompt, the tool definitions, and each assistant turn as returned. Don't re-render from inputs that might have changed since, such as the date, an updated instruction file, or a new tool version. Anything new goes in an appended message. See [Send assistant turns back exactly as returned](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#append-assistant-turns-exactly-as-returned).
@@ -338,7 +1101,7 @@ The same beta names apply on Amazon Bedrock and Google Cloud. See [Beta headers]
- Not into a different conversation. A thinking block is usable only behind the exact `system`, `tools`, and `messages` it was produced from, so a branch that replays that history unchanged up to the fork point keeps its thinking, and a conversation that starts from anything else can't use it. Start that one from a summary of the task state (the goal, decisions made, files and results so far, and the next step), as in [simple compaction](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#custom-compaction-on-the-client).
+ Not into a different conversation. A thinking block is usable only when it follows the exact `system`, `tools`, and `messages` it was produced from. A branch that replays that history unchanged up to the fork point keeps its thinking. A conversation that starts from anything else can't use it, so start that conversation from a summary of the task state, as in [simple compaction](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#custom-compaction-on-the-client): the goal, decisions made, files and results so far, and the next step.
diff --git a/content/en/build-with-claude/thinking.md b/content/en/build-with-claude/thinking.md
index 6651d6d97..93e689daf 100644
--- a/content/en/build-with-claude/thinking.md
+++ b/content/en/build-with-claude/thinking.md
@@ -1006,354 +1006,19 @@ The tradeoff is context usage: long conversations consume more context space on
## Preserved thinking
-Claude preserves a thinking block, keeping it usable on later turns, only under the conditions it was created in. Starting with Claude Fable 5.1 and Claude Mythos 5.1, a `thinking` or `redacted_thinking` block is preserved only:
+[Preserved thinking](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking) decides whether the model can use a thinking block that you send back from an earlier turn. Starting with Claude Fable 5.1, the API checks the `signature` of every `thinking` or `redacted_thinking` block in a request for two things:
-* **For the model that produced it, or a newer one.** An earlier model can't use the block, and the API drops it from that request. See [Only for the model that produced it, or a newer one](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-for-model).
-* **In the conversation that produced it (Claude Fable 5.1 only).** If the `system` prompt, the `tools`, or any earlier message changes, the block is no longer valid, and the API rejects the request or drops the block. See [Only in the conversation that produced it](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-in-conversation).
+* **The model that produced it.** A model reads its own thinking blocks and those of earlier models, never those of a newer model. Claude Fable 5.1 reads blocks from Claude Opus 5, but Claude Opus 5 can't read blocks from Claude Fable 5.1. The API drops a block the current model can't read, without an error and without billing it. See [Switching models mid-conversation](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#switching-models).
+* **Everything sent before it.** A block stays valid only while the top-level `system` prompt, the `tools`, and the messages before it are unchanged. If any of them changes, that block and every later thinking block are invalid, and the API rejects the request with a 400 error or drops the invalid blocks, whichever you choose. See [Keeping the prefix unchanged](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#prefix-check).
-The block's `signature` records both conditions on both models. The API checks it whenever the block comes back in a later request, including a request to a different model; Claude Mythos 5.1 checks only the model condition.
+The model check applies to every account. The API enforces the prefix check by default for accounts created on or after August 31, 2026, 00:00 UTC. On older accounts it enforces the check only on requests that set `thinking.block_binding.prefix_mismatch_behavior`. Later models will enforce it for all accounts, so make your integration append-only now.
-**Pass blocks back unchanged.** Send every assistant turn exactly as you received it, thinking blocks included, and let the API decide which blocks the model can use.
+To keep thinking valid, send every assistant turn back exactly as you received it and add new messages only at the end of `messages`. If your code builds the `messages` array itself, the Preserved thinking page covers:
-### Only for the model that produced it, or a newer one
-
-This condition is one-way: Claude Fable 5.1 and Claude Mythos 5.1 read earlier models' thinking blocks, and no earlier model reads theirs.
-
-* **A conversation that moves onto Claude Fable 5.1 or Claude Mythos 5.1 keeps its reasoning.** The earlier model's thinking blocks stay readable, so the model thinks as usual from the first turn after the switch.
-* **A conversation that moves from them to any earlier model loses it.** The earlier model can't read their blocks, the API drops them for that request, and the earlier model reasons again from the visible messages. If the conversation later returns to Claude Fable 5.1 with the same history, its own blocks are readable again.
-
-In full, Claude Fable 5.1 and Claude Mythos 5.1 read thinking blocks produced by each other, by Claude Opus 5, Claude Fable 5, and Claude Mythos 5, and by Claude Opus 4.8 and earlier Opus models, Claude Sonnet models, and Claude Haiku 4.5. No model other than these two can read a block produced by Claude Fable 5.1 or Claude Mythos 5.1.
-
-**A block the receiving model can't read is dropped.** The API removes it before the prompt reaches the model. It doesn't count toward `input_tokens` and isn't billed. When you fall back from Claude Fable 5.1 to an older model mid-conversation, for example after a [classifier refusal fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback), the older model reasons again from the visible conversation. With the [controls beta header](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-thinking-controls) the drop is reported in `input_transformations` as `model_binding_mismatch`. Without it the drop is silent. A [server-side fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#server-side-fallback) drops unreadable blocks the same way.
-
-### Only in the conversation that produced it
-
-A thinking block from Claude Fable 5.1 is preserved only while the conversation prefix it was produced from stays unchanged. Its `signature` covers the `system` prompt, the `tools`, and the messages that preceded the block. Claude Mythos 5.1 records the same `signature` but doesn't run this check.
-
-This check is enforced for new accounts created on or after August 31, 2026. For accounts created earlier, the API records the condition in the signature but doesn't act on a mismatch unless the request sets [`thinking.block_binding.prefix_mismatch_behavior`](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-thinking-controls), which opts into enforcement. Anthropic plans to enforce this condition for every organization on future models. If your account was created earlier, make your application compatible now: the same append-only patterns keep the [prompt cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) warm, and you can test against the check by sending `prefix_mismatch_behavior: "error"`. If you ship a tool or framework that people run with their own API key, test that way: your users on new accounts are enforced before you are. [Preserved thinking](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking) has the integration checklist: how to tell whether your code edits history, and the API feature that replaces each kind of edit.
-
-Where the check is enforced, a request that replays a block against a changed prefix is rejected with a 400 `invalid_request_error`:
-
-```text wrap
-messages.5.content.0: Invalid `signature` in `thinking` block. The block is bound to a different conversation. Remove the block, or set `thinking.block_binding.prefix_mismatch_behavior` to "drop_block". That setting requires the `thinking-binding-controls-2026-08-01` value in the `anthropic-beta` header.
-```
-
-The last sentence appears only when the request didn't send the beta header. The message can end with one more sentence naming the first message that changed. Retrying the same request body fails the same way. To continue without the invalidated reasoning instead, send the `thinking-binding-controls-2026-08-01` beta header and set `prefix_mismatch_behavior` to `"drop_block"`. The API then drops the failing block and every thinking block after it in the conversation, and reports each one in `input_transformations` as `prefix_binding_mismatch`. The [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) endpoint runs the same check and returns the same 400.
-
-What invalidates later thinking blocks:
-
-* Editing, reordering, or removing an earlier message, including removing a per-turn reminder you injected into an earlier user turn.
-* Changing the content of the top-level `system` prompt, or adding, removing, or editing a tool in the `tools` array, between requests.
-* Client-side compaction or truncation that keeps recent assistant turns verbatim, thinking included, while rewriting the turns before them.
-* An image or document URL in an earlier turn that serves different bytes on a later request. The check covers the bytes, not the URL string, so a rotating signed URL for the same file is fine. For content you reference across turns, upload it once with the [Files API](https://platform.claude.com/docs/en/build-with-claude/files) and send the `file_id`, or send base64.
-
-What doesn't:
-
-* Removing a leading run of thinking blocks, oldest first: the first thinking block in the conversation (or the first one after the most recent compaction block), then the next, and so on. Removing a thinking block from anywhere else invalidates every thinking block after it, in that turn and in every later turn.
-* Changing `output_config.effort`, `max_tokens`, or other sampling settings between requests.
-* `cache_control` markers, wherever you place or move them.
-* Server-side [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction) and [context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing): they don't count as edits, because the check compares the conversation as you sent it, not the server's edited copy. After a compaction, the checked prefix starts from the compaction block.
-
-Patterns that keep thinking blocks valid:
-
-* **Append only.** Add new messages at the end of `messages` and leave earlier turns byte-for-byte unchanged.
-* **Use [mid-conversation system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages)** and mid-conversation tool changes to add instructions or change tool availability partway through, instead of editing the top-level `system` field or `tools` array. For a reminder that should apply to one turn only, send it as a [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages) and leave it in the history rather than deleting it later. This also preserves the prompt cache.
-* **Use server-side context management** rather than trimming history yourself.
-* **If a request is rejected for a prefix mismatch and you can't repair the history,** resend it with the beta header and `prefix_mismatch_behavior: "drop_block"`, or strip every `thinking` and `redacted_thinking` block from the history and retry once.
-
-When earlier thinking is dropped, the model answers that turn without those blocks. A client that repeatedly invalidates its own history restarts the prompt cache each time, which raises cost.
-
-**Client-side compaction.** This check doesn't rule out compacting on the client. The rule is narrower: don't keep a thinking block behind a prefix you've rewritten. Server-side [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction) is the simplest way to satisfy it. If you compact on the client, use one of these shapes:
-
-* **Simple compaction (recommended):** summarize the conversation into one message and start the next request with that summary plus the new user turn, replaying no earlier turns and no earlier thinking blocks. No earlier thinking remains, so nothing fails, and the model thinks afresh on the compacted conversation. Claude models are trained on long-horizon tasks with this scheme, and it performs comparably to more elaborate ones for most workloads. It resets the prompt cache, as any compaction does.
-* **Keep-tail compaction:** summarize older turns and keep the most recent turns verbatim. The kept turns' thinking blocks were produced against the full history and fail behind the summary. Strip `thinking` and `redacted_thinking` from every turn you carry across (their text and tool calls can stay), or set `prefix_mismatch_behavior: "drop_block"` and let the API discard them.
-* **Background compaction:** build the summary off the critical path and swap it in while the conversation continues. Every turn produced in the meantime has thinking that predates the swap. Send `"drop_block"` on every request that still carries thinking blocks produced before the swap (or strip those blocks yourself; `input_transformations` on the first response after the swap lists exactly which ones), or compact synchronously.
-
-Snipping individual turns out of the middle of the transcript invalidates every thinking block after them, and no client-side shape avoids that. Use a mid-conversation system message for the instruction change you were making, or server-side [context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) for selective removal.
-
-### Controls for blocks that aren't preserved (beta)
-
-Send the [beta header](https://platform.claude.com/docs/en/api/beta-headers) `thinking-binding-controls-2026-08-01` to get two things: an `input_transformations` array on every response that lists any thinking blocks the API dropped, and a `block_binding` object on the thinking configuration with one field.
-
-| Field | Type | Default | Description |
-| -------------------------- | --------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `prefix_mismatch_behavior` | `"error"` or `"drop_block"` | `"error"` | What the API does with a thinking block that fails the [conversation check](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-in-conversation). `"error"` rejects the request with a 400 error. `"drop_block"` removes the block and every later thinking block in the conversation, reports each in `input_transformations`, and continues. Neither value changes the model check, which always drops. |
-
-`block_binding` is accepted alongside `thinking.type: "adaptive"` and `thinking.type: "enabled"`. Sending it without the beta header returns a 400 error. Models that don't run the conversation check accept the object and report only model-check drops, so one request body works across models. On Amazon Bedrock and Google Cloud, pass beta names as described in [Beta headers](https://platform.claude.com/docs/en/api/beta-headers).
-
-The following request opts into dropping rather than rejecting. On a first turn there is nothing to replay, so `input_transformations` comes back empty:
-
-
- ```bash cURL
- curl https://api.anthropic.com/v1/messages \
- -H "x-api-key: $ANTHROPIC_API_KEY" \
- -H "anthropic-version: 2023-06-01" \
- -H "anthropic-beta: thinking-binding-controls-2026-08-01" \
- -H "content-type: application/json" \
- -d '{
- "model": "claude-fable-5-1",
- "max_tokens": 16000,
- "thinking": {
- "type": "adaptive",
- "block_binding": {
- "prefix_mismatch_behavior": "drop_block"
- }
- },
- "messages": [
- {
- "role": "user",
- "content": "What is the greatest common divisor of 1071 and 462?"
- }
- ]
- }'
- ```
-
- ```bash CLI
- ant beta:messages create --beta thinking-binding-controls-2026-08-01 \
- --transform '{content.#(type=="text")#.text,input_transformations}' \
- --format yaml <<'YAML'
- model: claude-fable-5-1
- max_tokens: 16000
- thinking:
- type: adaptive
- block_binding:
- prefix_mismatch_behavior: drop_block
- messages:
- - role: user
- content: What is the greatest common divisor of 1071 and 462?
- YAML
- ```
-
- ```python Python
- client = anthropic.Anthropic()
-
- response = client.beta.messages.create(
- model="claude-fable-5-1",
- max_tokens=16000,
- thinking={
- "type": "adaptive",
- "block_binding": {"prefix_mismatch_behavior": "drop_block"},
- },
- messages=[
- {
- "role": "user",
- "content": "What is the greatest common divisor of 1071 and 462?",
- }
- ],
- betas=["thinking-binding-controls-2026-08-01"],
- )
-
- for block in response.content:
- if block.type == "text":
- print(block.text)
-
- print(f"Input transformations: {len(response.input_transformations or [])}")
- ```
-
- ```typescript TypeScript
- const client = new Anthropic();
-
- const response = await client.beta.messages.create({
- model: "claude-fable-5-1",
- max_tokens: 16000,
- thinking: {
- type: "adaptive",
- block_binding: { prefix_mismatch_behavior: "drop_block" }
- },
- messages: [
- { role: "user", content: "What is the greatest common divisor of 1071 and 462?" }
- ],
- betas: ["thinking-binding-controls-2026-08-01"]
- });
-
- for (const block of response.content) {
- if (block.type === "text") {
- console.log(block.text);
- }
- }
- console.log(`Input transformations: ${response.input_transformations?.length ?? 0}`);
- ```
-
- ```csharp C#
-
- AnthropicClient client = new();
-
- var response = await client.Beta.Messages.Create(
- new()
- {
- Model = "claude-fable-5-1",
- MaxTokens = 16000,
- Thinking = new BetaThinkingConfigAdaptive
- {
- BlockBinding = new()
- {
- PrefixMismatchBehavior = BetaThinkingPrefixMismatchBehavior.DropBlock,
- },
- },
- Messages =
- [
- new()
- {
- Role = Role.User,
- Content = "What is the greatest common divisor of 1071 and 462?",
- },
- ],
- Betas = [AnthropicBeta.ThinkingBindingControls2026_08_01],
- }
- );
-
- foreach (var block in response.Content)
- {
- if (block.TryPickText(out var textBlock))
- {
- Console.WriteLine(textBlock.Text);
- }
- }
-
- Console.WriteLine($"Input transformations: {response.InputTransformations?.Count ?? 0}");
- ```
-
- ```go Go
- client := anthropic.NewClient()
-
- response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
- Model: "claude-fable-5-1",
- MaxTokens: 16000,
- Thinking: anthropic.BetaThinkingConfigParamUnion{
- OfAdaptive: &anthropic.BetaThinkingConfigAdaptiveParam{
- BlockBinding: anthropic.BetaThinkingBlockBindingParam{
- PrefixMismatchBehavior: anthropic.BetaThinkingPrefixMismatchBehaviorDropBlock,
- },
- },
- },
- Messages: []anthropic.BetaMessageParam{
- anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("What is the greatest common divisor of 1071 and 462?")),
- },
- Betas: []anthropic.AnthropicBeta{anthropic.AnthropicBetaThinkingBindingControls2026_08_01},
- })
- if err != nil {
- log.Fatal(err)
- }
-
- for _, block := range response.Content {
- if textBlock, ok := block.AsAny().(anthropic.BetaTextBlock); ok {
- fmt.Println(textBlock.Text)
- }
- }
- fmt.Printf("Input transformations: %d\n", len(response.InputTransformations))
- ```
-
- ```java Java
- import com.anthropic.models.beta.AnthropicBeta;
- import com.anthropic.models.beta.messages.BetaMessage;
- import com.anthropic.models.beta.messages.BetaThinkingBlockBinding;
- import com.anthropic.models.beta.messages.BetaThinkingConfigAdaptive;
- import com.anthropic.models.beta.messages.BetaThinkingPrefixMismatchBehavior;
- import com.anthropic.models.beta.messages.MessageCreateParams;
-
- void main() {
- AnthropicClient client = AnthropicOkHttpClient.fromEnv();
-
- MessageCreateParams params = MessageCreateParams.builder()
- .model("claude-fable-5-1")
- .maxTokens(16000L)
- .addBeta(AnthropicBeta.THINKING_BINDING_CONTROLS_2026_08_01)
- .thinking(BetaThinkingConfigAdaptive.builder()
- .blockBinding(BetaThinkingBlockBinding.builder()
- .prefixMismatchBehavior(BetaThinkingPrefixMismatchBehavior.DROP_BLOCK)
- .build())
- .build())
- .addUserMessage("What is the greatest common divisor of 1071 and 462?")
- .build();
-
- BetaMessage response = client.beta().messages().create(params);
-
- response.content().stream()
- .flatMap(block -> block.text().stream())
- .forEach(textBlock -> IO.println(textBlock.text()));
- IO.println("Input transformations: "
- + response.inputTransformations().map(List::size).orElse(0));
- }
- ```
-
- ```php PHP
- use Anthropic\Beta\AnthropicBeta;
- use Anthropic\Beta\Messages\BetaThinkingBlockBinding;
- use Anthropic\Beta\Messages\BetaThinkingConfigAdaptive;
- use Anthropic\Beta\Messages\BetaThinkingPrefixMismatchBehavior;
- use Anthropic\Client;
-
- $client = new Client();
-
- $response = $client->beta->messages->create(
- model: 'claude-fable-5-1',
- maxTokens: 16000,
- thinking: BetaThinkingConfigAdaptive::with(
- blockBinding: BetaThinkingBlockBinding::with(
- prefixMismatchBehavior: BetaThinkingPrefixMismatchBehavior::DROP_BLOCK,
- ),
- ),
- messages: [
- ['role' => 'user', 'content' => 'What is the greatest common divisor of 1071 and 462?'],
- ],
- betas: [AnthropicBeta::THINKING_BINDING_CONTROLS_2026_08_01],
- );
-
- foreach ($response->content as $block) {
- if ($block->type === 'text') {
- echo $block->text, PHP_EOL;
- }
- }
-
- echo 'Input transformations: ', count($response->inputTransformations ?? []), PHP_EOL;
- ```
-
- ```ruby Ruby
- client = Anthropic::Client.new
-
- response = client.beta.messages.create(
- model: "claude-fable-5-1",
- max_tokens: 16_000,
- thinking: {
- type: "adaptive",
- block_binding: {prefix_mismatch_behavior: "drop_block"}
- },
- messages: [
- {role: "user", content: "What is the greatest common divisor of 1071 and 462?"}
- ],
- betas: [Anthropic::AnthropicBeta::THINKING_BINDING_CONTROLS_2026_08_01]
- )
-
- response.content.each do |block|
- puts block.text if block.type == :text
- end
-
- puts "Input transformations: #{response.input_transformations&.length || 0}"
- ```
-
-
-```text Output wrap
-The greatest common divisor of 1071 and 462 is 21.
-Input transformations: 0
-```
-
-**Dropped blocks are reported in `input_transformations`.** Under the beta header, every response from a thinking-capable model carries this top-level array. It's empty when nothing was dropped and never `null`. Each entry names the position of a dropped block and the check it failed:
-
-```json
-{
- "input_transformations": [
- {
- "type": "thinking_dropped",
- "path": "messages.1.content.0",
- "reason": "model_binding_mismatch"
- }
- ]
-}
-```
-
-The `reason` field is `model_binding_mismatch` or `prefix_binding_mismatch`. Ignore entries whose `type` or `reason` you don't recognize, because later checks add values. When [streaming](https://platform.claude.com/docs/en/build-with-claude/streaming), `input_transformations` arrives on the `message` object in the `message_start` event. After a mid-stream server-side fallback, the final `message_delta` event carries the array again with the serving model's entries. Without the beta header the field is absent.
-
-A tampered or undecryptable signature is a different failure: it always returns a 400 (``Invalid `signature` in `thinking` block``, with no reason clause) and `prefix_mismatch_behavior` doesn't apply to it. In a [message batch](https://platform.claude.com/docs/en/build-with-claude/batch-processing), an item whose block fails the conversation check under `"error"` resolves as `errored`.
+* [What counts as an edit](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#what-counts-as-an-edit), and [how to check whether your code makes one](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#how-to-tell-whether-your-integration-is-impacted).
+* [The API feature that replaces each common edit](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#replace-prefix-edits): mid-conversation system messages for new instructions and per-turn reminders, `tool_addition` and `tool_removal` blocks for tool changes, per-message `output_config` for effort changes, and server-side compaction and context editing for trimming.
+* [Client-side compaction](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#custom-compaction-on-the-client): which patterns keep thinking valid and which don't.
+* [The `thinking-binding-controls-2026-08-01` beta header](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#preserved-thinking-controls). It adds an `input_transformations` array to every response that lists the blocks the API dropped, and a `block_binding.prefix_mismatch_behavior` field on the thinking configuration that accepts `"error"` or `"drop_block"`.
## Thinking and prompt caching
diff --git a/content/en/docs/claude-code/agent-sdk/migration-guide.md b/content/en/docs/claude-code/agent-sdk/migration-guide.md
index f1c309697..0d5c234cd 100644
--- a/content/en/docs/claude-code/agent-sdk/migration-guide.md
+++ b/content/en/docs/claude-code/agent-sdk/migration-guide.md
@@ -10,6 +10,8 @@
The Claude Code SDK has been renamed to the **Claude Agent SDK** and its documentation has been reorganized. This change reflects the SDK's broader capabilities for building AI agents beyond just coding tasks.
+Migrating from the OpenAI Agents SDK instead? The [OpenAI Agents SDK migration recipe](https://platform.claude.com/cookbook/claude-agent-sdk-04-migrating-from-openai-agents-sdk) maps each primitive onto the Claude Agent SDK through a single worked example.
+
## What's Changed
| Aspect | Old | New |
diff --git a/content/en/docs/claude-code/agent-sdk/overview.md b/content/en/docs/claude-code/agent-sdk/overview.md
index 6581ea813..82968c01a 100644
--- a/content/en/docs/claude-code/agent-sdk/overview.md
+++ b/content/en/docs/claude-code/agent-sdk/overview.md
@@ -84,6 +84,7 @@ Use of the Claude Agent SDK is governed by [Anthropic's Commercial Terms of Serv
These resources cover deeper technical detail and example projects for building with the Agent SDK.
* [Quickstart](/docs/en/agent-sdk/quickstart): build your first agent that finds and fixes bugs
+* [Migration guide](/docs/en/agent-sdk/migration-guide): migrate from the Claude Code SDK packages to the Agent SDK
* [Agent loop](/docs/en/agent-sdk/agent-loop): how Claude plans, calls tools, and decides when a task is done
* [Example agents](https://github.com/anthropics/claude-agent-sdk-demos): demo apps for local development
* [TypeScript SDK](/docs/en/agent-sdk/typescript): full TypeScript API reference and examples
diff --git a/content/en/docs/claude-code/auto-mode-config.md b/content/en/docs/claude-code/auto-mode-config.md
index c8f85f123..9da0c25bf 100644
--- a/content/en/docs/claude-code/auto-mode-config.md
+++ b/content/en/docs/claude-code/auto-mode-config.md
@@ -85,7 +85,7 @@ For most organizations, `autoMode.environment` is the only field you need to set
As of Claude Code v2.1.198, `claude auto-mode defaults` prints three kinds of environment entry. Versions before v2.1.195 print only the first five trust slots.
-* **Context slots**: describe your organization, stack, and security posture so the classifier reads the other rules in your context. Unlike the other two kinds, context slots have no rules of their own that target them. Each defaults to `None configured` or to the conservative assumption named next to it:
+* **Context slots**: describe your organization, stack, and security posture so the classifier reads the other rules in your context. Each defaults to `None configured` or to the conservative assumption named next to it:
* **Organization**
* **Primary use of Claude Code**: defaults to software development
* **Cloud provider(s)**
@@ -95,6 +95,7 @@ As of Claude Code v2.1.198, `claude auto-mode defaults` prints three kinds of en
* **Secrets management**
* **CI/CD deploy targets**
* **Network posture**
+ * **Host containment**: defaults to an ordinary developer machine or CI runner with open internet. If Claude Code runs in a container, VM, or pod with an egress allow-list or neighbors it must not touch, name the allowed hosts, whether the cloud metadata endpoint should be reachable, and which cloud project, cluster, or registry the task uses and under what identity. Until this entry names that identity, the classifier [blocks](/docs/en/permission-modes#what-the-classifier-blocks-by-default) requests for the host's own credentials. Requires Claude Code v2.1.257 or later
* **Protected deployment namespaces / environments**: falls back to the Sensitive remote targets heuristic until you name them
* **Data retention / declassification**
* **Trust slots**: name what the classifier treats as inside your boundary. The slots are Trusted repo, Source control, Trusted internal domains, Trusted cloud buckets, Key internal services, and Internal package registry. The repo and source-control entries default to the working repository and its configured remotes. Every other trust slot defaults to `None configured`, so nothing else is trusted until you add it. A repository's visibility scopes only confidential material: a private repository is an acceptable destination for confidential material, but making a repository private never clears secrets or personal or entrusted data into it, and the classifier treats content ported, repointed, or first read from outside the working repository as not that repository's own work. This scoping requires Claude Code v2.1.203 or later.
diff --git a/content/en/docs/claude-code/commands.md b/content/en/docs/claude-code/commands.md
index 67921094d..694ebd0fb 100644
--- a/content/en/docs/claude-code/commands.md
+++ b/content/en/docs/claude-code/commands.md
@@ -79,7 +79,7 @@ In the table below, `` indicates a required argument and `[arg]` indicates
| `/design-login` | Authorize design-system access for `/design-sync` with your claude.ai account |
| `/design-sync [hint]` | **[Skill](/docs/en/skills#bundled-skills).** Convert your repo's React design system and upload it to [Claude Design](https://claude.ai/design), so designs it produces use your real components. Optionally name the design system, for example `/design-sync Acme DS`. A first-time sync verifies every component and can take a few hours on a large repo. Available on the Anthropic API; on Amazon Bedrock, Google Cloud's Agent Platform, Microsoft Foundry, and Claude Platform on AWS the underlying tool can't reach claude.ai, so the command is unavailable |
| `/desktop` | Continue the current session in the Claude Code Desktop app. Requires macOS or x64 Windows and a Claude subscription. Alias: `/app` |
-| `/diff` | Open an interactive diff viewer showing uncommitted changes and per-turn diffs. Use left/right arrows to switch between the current git diff and individual Claude turns, and up/down to browse files. Press Enter to open the selected file's diff, scroll it with up/down or PageUp/PageDown, and press Esc to return to the file list. Claude Code computes these diffs from raw git blob content, so diff drivers and `textconv` filters configured in `.gitattributes` or git config don't apply. Before v2.1.222, workspace-configured drivers and filters could rewrite the viewer's output. The open viewer also refreshes automatically when the repository's git state changes outside the session, such as a branch switch or commit in another terminal; the auto-refresh requires Claude Code v2.1.198 or later |
+| `/diff` | Review the changes in your working tree, including the edits Claude has made so far. See [Review changes with /diff](/docs/en/interactive-mode#review-changes-with-%2Fdiff) |
| `/doctor` | **[Skill](/docs/en/skills#bundled-skills).** Run a setup checkup that diagnoses issues and can fix them. Checks installation health, including duplicate or leftover installs, `PATH` problems, and unparseable settings files. Finds unused skills, MCP servers, and plugins versus their context cost, flags slow [hooks](/docs/en/hooks), and checks for a newer version on your [release channel](/docs/en/setup#configure-release-channel). Deduplicates local `CLAUDE.md` files against checked-in ones, trims checked-in [`CLAUDE.md`](/docs/en/memory#my-claude-md-is-too-large) files by cutting content Claude could derive from the codebase, and migrates the always-loaded guidance that remains into [skills](/docs/en/skills) and nested `CLAUDE.md` files that load on demand. Also offers to make [auto mode](/docs/en/permissions#permission-modes) your default and to [pre-approve](/docs/en/permissions) frequently denied read-only commands. Reports findings first and asks for confirmation before changing anything. From the terminal, `claude doctor` prints read-only installation diagnostics without starting a session. Alias: `/checkup`. The `CLAUDE.md` trim check requires Claude Code v2.1.206 or later. Before v2.1.205, `/doctor` opened a read-only diagnostics screen and pressing `f` sent the report to Claude |
| `/effort [level\|auto\|status]` | Set the [effort level](/docs/en/model-config#adjust-effort-level): `low` to `xhigh`, `max`, [`ultracode`](/docs/en/workflows#let-claude-decide-with-ultracode), or `auto`; `status` prints it. `max` and `ultracode` are session-only; the [`ultracode`](/docs/en/settings-reference#ultracode) key persists. Run it while Claude is responding and, once you confirm the [cache warning](/docs/en/prompt-caching#changing-effort-level), if Claude Code shows one, Claude Code applies the new level to the next request in that turn. Before v2.1.242, Claude Code decided from a feature flag it fetched from Anthropic whether to run the command mid-turn or queue it until the turn finished, and always queued it in a session that doesn't [fetch feature flags](/docs/en/env-vars#features-that-need-feature-flag-fetching), such as on a [third-party provider](/docs/en/third-party-integrations). Works in `-p` outside the [effort hold](/docs/en/model-config#adjust-effort-level) |
| `/exit` | Exit the CLI. In an attached [background session](/docs/en/agent-view#attach-to-a-session), this detaches and the session keeps running. Alias: `/quit` |
diff --git a/content/en/docs/claude-code/errors.md b/content/en/docs/claude-code/errors.md
index e8b7210fb..dc4a84ddf 100644
--- a/content/en/docs/claude-code/errors.md
+++ b/content/en/docs/claude-code/errors.md
@@ -191,6 +191,7 @@ Match the message you see to a section below.
| `Refusing to write : its parent-directory symlink resolution changed after permission was checked` / `Refusing to write : it is a symbolic link. Write to the link's target path instead` | [Tool errors](#refusing-after-a-symlink-changed) |
| `Refusing to search : a path one of its Read deny rules is written through changed while the search was being prepared` / `Refusing to search : it could not be opened` | [Tool errors](#refusing-after-a-symlink-changed) |
| `its permission check expired before it ran (too many concurrent file operations)` / `ripgrep was found only by name on PATH` | [Tool errors](#refusing-after-a-symlink-changed) |
+| `task output swap refused (tasks dir moved or linked)` | [Tool errors](#task-output-swap-refused) |
| `Can't open MCP settings while no terminal is attached to this background session` | [Background session errors](#commands-refused-in-a-background-session) |
| `Can't open MCP settings in a background session` | [Background session errors](#commands-refused-in-a-background-session) |
| `blocked because the path is spelled in a form that cannot be safely resolved` | [Background session errors](#write-or-command-blocked-because-the-path-cannot-be-safely-resolved) |
@@ -2490,7 +2491,7 @@ Before v2.1.246, `claude plugin install` didn't report this failure.
## Tool errors
-These errors come from Claude's built-in tools. Claude corrects most tool errors on its own; the first two below need a change from you, because they come from a subagent definition or a permission rule you control.
+These errors come from Claude's built-in tools. Claude corrects most tool errors on its own. When one needs a change from you, that error's **What to do** list says what to change.
### Agent would be spawned with zero tools
@@ -2698,6 +2699,22 @@ The text after the path names the reason:
Before v2.1.251, Claude Code re-checked a path's resolution only for file writes, so a link replaced after the permission check could redirect a read or search to a different location without a message. Of these refusals, only the parent-directory write refusal appears on earlier versions.
+
+ Task output swap refused
+
+
+Claude Code saves each Bash command's output to a file under its temp directory. This message means a directory on that file's path is a symbolic link or has been moved, so Claude Code refused to run the command rather than write its output through that path. The message appears in the Bash tool result:
+
+```text wrap theme={null}
+task output swap refused (tasks dir moved or linked): /private/tmp/claude-501/-Users-you-my-project/1f0e62dc-4b0a-4f5e-9c2d-8a7b6c5d4e3f/tasks/b7k2f9m3q.output. To recover: restart Claude Code with CLAUDE_CODE_TMPDIR set to a fresh directory; or, if /private/tmp/claude-501/-Users-you-my-project is a stray directory or a symbolic link that should not be there, remove that entry itself (not what it points to) and restart.
+```
+
+**What to do:**
+
+* Upgrade to v2.1.260 or later. Earlier versions sometimes showed this message when no link or moved directory was present
+* Restart Claude Code with [`CLAUDE_CODE_TMPDIR`](/docs/en/env-vars) set to a fresh directory
+* Or check your project's directory under the Claude Code temp directory, `/private/tmp/claude-501/-Users-you-my-project` in the example message. If that path is a symbolic link, or a directory that shouldn't be there, remove the link or directory itself rather than the link's target, and restart Claude Code
+
## Background session errors
[Background sessions](/docs/en/agent-view) run without an interactive terminal of their own, so commands that need one behave differently there. These messages appear in the transcript of a background session, in the terminal that attaches to one, in the session or shell you dispatch from, or, for the [worktree-guard entries](#write-or-command-blocked-because-the-path-cannot-be-safely-resolved) below, in any session isolated in a worktree or running a worktree-isolated subagent; where a message is specific to one surface, its entry says so.
diff --git a/content/en/docs/claude-code/fullscreen.md b/content/en/docs/claude-code/fullscreen.md
index 5d318e9f5..05fe65661 100644
--- a/content/en/docs/claude-code/fullscreen.md
+++ b/content/en/docs/claude-code/fullscreen.md
@@ -200,11 +200,17 @@ Your terminal's `Cmd+f` and tmux search don't see the conversation because it li
* **`[`**: writes the full conversation into your terminal's native scrollback buffer, with all tool output expanded. The conversation is now ordinary text in your terminal, so `Cmd+f`, tmux copy mode, and any other native tool can search or select it. Long sessions may pause for a moment while this happens. This lasts until you exit transcript mode with `Esc` or `q`, which returns you to fullscreen rendering. The next `Ctrl+o` starts fresh.
* **`v`**: writes the conversation to a temporary file and opens it in `$VISUAL` or `$EDITOR`.
+## Watch your changes in the diff panel
+
+In fullscreen rendering, [`/diff`](/docs/en/interactive-mode#review-changes-with-%2Fdiff) opens a panel beside the conversation rather than a viewer you have to close, so you can watch the changes accumulate while Claude works. In a wide terminal the panel can also open on its own once Claude starts editing files. [Diff panel](/docs/en/interactive-mode#diff-panel) covers what it shows, how to keep it closed, and how to change what it compares against.
+
## Clear the conversation
-Run `/clear` to start a new conversation. Pressing `Ctrl+L` or `Cmd+K` doesn't clear the conversation; Claude Code redraws the screen and keeps it. Before v2.1.238, Claude Code ran `/clear` when you pressed `Ctrl+L` or `Cmd+K` twice within two seconds.
+Run `/clear` to start a new conversation.
+
+To clear the screen and keep the conversation, press `Ctrl+L`. The earlier messages scroll up out of view, and you can scroll back with `PgUp` or the mouse wheel to read them again. Before v2.1.260, `Ctrl+L` redrew the screen without clearing it. Before v2.1.238, pressing it twice within two seconds ran `/clear`.
-On iTerm2 and Terminal.app, your terminal handles `Cmd+K` itself and clears its own screen without telling Claude Code. Claude Code detects the cleared screen and repaints the conversation.
+`Cmd+K` does the same as `Ctrl+L` when your terminal passes it through to Claude Code. iTerm2 and Terminal.app handle `Cmd+K` themselves, and Claude Code redraws the conversation instead of clearing it, so press `Ctrl+L` on those terminals.
## Use with tmux
diff --git a/content/en/docs/claude-code/interactive-mode.md b/content/en/docs/claude-code/interactive-mode.md
index 9981fb0f9..86bdc4fc1 100644
--- a/content/en/docs/claude-code/interactive-mode.md
+++ b/content/en/docs/claude-code/interactive-mode.md
@@ -22,7 +22,7 @@
| `Ctrl+X Ctrl+K` | Stop all running [background subagents](/docs/en/sub-agents#run-subagents-in-foreground-or-background) in this session, and turn off [artifact auto-replies](/docs/en/artifacts#let-claude-reply-to-comments-on-its-own) for the rest of it. Press twice within 3 seconds to confirm | Subagent control |
| `Ctrl+D` | Exit Claude Code session | The first press shows a confirmation hint and a second press within 800ms exits. When the prompt has text, `Ctrl+D` deletes the character after the cursor instead |
| `Ctrl+G` or `Ctrl+X Ctrl+E` | Open in default text editor | Edit your prompt or custom response in your default text editor. `Ctrl+X Ctrl+E` is the readline-native binding. Turn on **Show last response in external editor** in `/config` to prepend Claude's previous reply as `#`-commented context above your prompt; Claude Code strips the comment block when you save |
-| `Ctrl+L` | Redraw screen | Forces a full terminal redraw, keeping input and conversation history. Use this to recover if the display becomes garbled or partially blank |
+| `Ctrl+L` | Redraw or clear the screen | Forces a full terminal redraw, keeping input and conversation history. Use this to recover if the display becomes garbled or partially blank. In [fullscreen rendering](/docs/en/fullscreen#clear-the-conversation), it also clears the screen, and you can scroll up to see the earlier messages |
| `Ctrl+O` | Toggle transcript viewer | Shows detailed tool usage and execution, with a timestamp and the model used on each assistant message. Also expands lines that collapse by default, such as MCP calls, shown as a single `Called slack 3 times` line, and [messages from your other sessions](/docs/en/cross-session-messaging#what-a-message-looks-like), shown as a one-line `Message from @` preview |
| `Ctrl+R` | Reverse search command history | Search through previous commands interactively |
| `Ctrl+V` or `Cmd+V` (iTerm2) or `Alt+V` (Windows and WSL) | Paste image from clipboard | Inserts an `[Image #N]` chip at the cursor so you can reference it positionally in your prompt. On WSL, both `Ctrl+V` and `Alt+V` are bound; use `Alt+V` if your terminal intercepts `Ctrl+V` |
@@ -508,6 +508,49 @@ Claude Code underlines nothing when it can't keep a checker running:
To find out which of these happened, start `claude --debug` with spell checking on and type a word. Then look for the `[spellcheck]` lines in the debug log at `~/.claude/debug/.txt`. One line names the program Claude Code started, or lists the ones it looked for and didn't find. Later lines say why it stopped. A missing-dictionary error there means the checker has no dictionary for your `language` value, or no default one when `language` is unset. Install one, or set `language` to a dictionary you have.
+## Review changes with /diff
+
+Run `/diff` to look over the changes in your working tree without leaving Claude Code. You see the edits Claude has made so far alongside anything else you haven't committed.
+
+In [fullscreen rendering](/docs/en/fullscreen), `/diff` opens the [diff panel](#diff-panel) beside the conversation, which stays open and updates while you keep working. In the classic renderer, `/diff` opens the [diff viewer](#diff-viewer) in place of the prompt, and you close it when you're done reading.
+
+### Diff panel
+
+The diff panel lists the changed files with their added and removed line counts, and shows each file's diff under the list. Claude Code refreshes it each time Claude edits a file or runs a shell command. To close it, run `/diff` again or click the `✕` in its header.
+
+To use the panel you need:
+
+* [Fullscreen rendering](/docs/en/fullscreen)
+* A git repository
+* A terminal at least 110 columns wide
+* Claude Code v2.1.260 or later
+
+When the panel can't open, `/diff` opens the diff viewer instead or tells you why.
+
+The panel also opens on its own once Claude starts editing files, if your terminal is at least 144 columns wide. After you've opened it yourself with `/diff`, later sessions open it as soon as Claude edits a file in any terminal wide enough to fit it. Close the panel and it stays closed, in this session and later ones, until you run `/diff` again.
+
+While the panel is open, you can:
+
+* **Jump to a file**: click its row in the list. Scroll the panel with the mouse wheel. When the file list itself is too long to fit, scroll it with `Alt+Up` and `Alt+Down`, or `Ctrl+Up` and `Ctrl+Down`.
+* **Ask Claude about specific lines**: select them in the panel with the mouse. Claude Code attaches the selection to your next prompt and shows a line count next to the input until you send it.
+* **Show the files the panel leaves out**: the list skips test files and generated files, and collapses changes from before this session into one line at the bottom. Click either count line to expand it.
+* **Change what the panel compares against**: press `Ctrl+X B` to cycle from this session's changes, to your uncommitted changes as one list, to everything since your branch split from the default branch. Claude Code remembers the choice for each project.
+
+To bind keys to these actions, see [Diff panel actions](/docs/en/keybindings#diff-panel-actions).
+
+### Diff viewer
+
+The diff viewer takes the place of the prompt until you close it. Its **Current** view shows your uncommitted changes from git, or, when there are none, what your branch adds on top of the default branch. The viewer also has a turn view for each prompt after which Claude edited files, showing just those edits. Claude Code builds the turn views from Claude's file edits rather than from git, so a change Claude makes through a shell command appears only under Current.
+
+Use these keys in the viewer:
+
+* **Left and Right**: move between Current and the turn views.
+* **Up and Down**: select a file.
+* **Enter**: open the selected file's diff. Scroll it with Up and Down, or PageUp and PageDown.
+* **Esc**: return from a file's diff to the list, or close the viewer from the list.
+
+To rebind these keys, see [Diff actions](/docs/en/keybindings#diff-actions).
+
## Side questions with /btw
Use `/btw` to ask a question about your current work without adding to the conversation history.
diff --git a/content/en/docs/claude-code/keybindings.md b/content/en/docs/claude-code/keybindings.md
index a7ca51350..fba09632c 100644
--- a/content/en/docs/claude-code/keybindings.md
+++ b/content/en/docs/claude-code/keybindings.md
@@ -59,6 +59,7 @@ Each binding block specifies a **context** where the bindings apply:
| `Footer` | Footer indicator navigation (tasks, teams, diff, artifacts) |
| `MessageSelector` | Rewind and summarize dialog message selection |
| `DiffDialog` | Diff viewer navigation |
+| `DiffPanel` | The [diff panel](/docs/en/interactive-mode#diff-panel) is open |
| `ModelPicker` | Model picker effort level |
| `Select` | Generic select/list components |
| `Plugin` | Plugin dialog (browse, discover, manage) |
@@ -99,8 +100,8 @@ Actions available in the `Chat` context:
| Action | Default | Description |
| :-------------------- | :-------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `chat:cancel` | Escape | Cancel current input |
-| `chat:clearInput` | Ctrl+L | Force a full screen redraw, preserving input and conversation |
-| `chat:clearScreen` | Cmd+K | Force a full screen redraw, preserving input and conversation. See [Clear the conversation](/docs/en/fullscreen#clear-the-conversation) for how Cmd+K behaves on iTerm2 and Terminal.app |
+| `chat:clearInput` | Ctrl+L | Force a full screen redraw, preserving input and conversation. In [fullscreen rendering](/docs/en/fullscreen#clear-the-conversation), also clear the screen |
+| `chat:clearScreen` | Cmd+K | Same as `chat:clearInput`. See [Clear the conversation](/docs/en/fullscreen#clear-the-conversation) for how Cmd+K behaves on iTerm2 and Terminal.app |
| `chat:killAgents` | Ctrl+X Ctrl+K | Stop all running [background subagents](/docs/en/sub-agents#run-subagents-in-foreground-or-background) in this session and turn off [artifact auto-replies](/docs/en/artifacts#let-claude-reply-to-comments-on-its-own) for the rest of it |
| `chat:cycleMode` | Shift+Tab\* | Cycle permission modes |
| `chat:modelPicker` | Meta+P | Open model picker |
@@ -274,6 +275,19 @@ The diff detail view also binds pager-style keys to the standard [scroll actions
| `scroll:top` | G, Home | Jump to the top |
| `scroll:bottom` | Shift+G, End | Jump to the bottom |
+### Diff panel actions
+
+Actions for the [diff panel](/docs/en/interactive-mode#diff-panel) that `/diff` opens in fullscreen rendering. `app:cycleDiffBase` is in the `DiffPanel` context, which is active while the panel is open; the others are `Global`. The panel requires Claude Code v2.1.260 or later.
+
+| Action | Default | Description |
+| :-------------------------- | :------------------- | :------------------------------------------------------------------------ |
+| `app:toggleReplTab` | (unbound) | Open or close the diff panel, the same as running `/diff` |
+| `app:cycleDiffBase` | Ctrl+X B | Cycle the panel's comparison base: this session, uncommitted, then branch |
+| `app:diffFileListUp` | Ctrl+Up, Meta+Up | Scroll the panel's file list up when it overflows |
+| `app:diffFileListDown` | Ctrl+Down, Meta+Down | Scroll the panel's file list down when it overflows |
+| `app:toggleDiffNoiseFilter` | (unbound) | Show or hide test and generated files in the panel |
+| `app:toggleDiffPreSession` | (unbound) | Expand or collapse the changes from before this session |
+
### Model picker actions
Actions available in the `ModelPicker` context:
@@ -431,7 +445,7 @@ Set an action to `null` to unbind a default shortcut:
This also works for chord bindings. Unbinding every chord that shares a prefix frees that prefix for use as a single-key binding. A chord in any active context keeps its prefix reserved, so you must unbind each chord in the context that defines it.
-Claude Code binds these default chords on the `ctrl+x` prefix: `ctrl+x ctrl+k`, `ctrl+x ctrl+e`, and `ctrl+x enter` in `Chat`, and `ctrl+x ctrl+b` in `Task`. The `ctrl+x enter` chord requires v2.1.247 or later. To reclaim `ctrl+x` itself as a single-key binding, unbind all of them:
+Claude Code binds these default chords on the `ctrl+x` prefix: `ctrl+x ctrl+k`, `ctrl+x ctrl+e`, and `ctrl+x enter` in `Chat`, `ctrl+x ctrl+b` in `Task`, and `ctrl+x b` in `DiffPanel`. The `ctrl+x enter` chord requires v2.1.247 or later, and `ctrl+x b` requires v2.1.260 or later. To reclaim `ctrl+x` itself as a single-key binding, unbind all of them:
```json theme={null}
{
@@ -442,6 +456,12 @@ Claude Code binds these default chords on the `ctrl+x` prefix: `ctrl+x ctrl+k`,
"ctrl+x ctrl+b": null
}
},
+ {
+ "context": "DiffPanel",
+ "bindings": {
+ "ctrl+x b": null
+ }
+ },
{
"context": "Chat",
"bindings": {
diff --git a/content/en/docs/claude-code/model-config.md b/content/en/docs/claude-code/model-config.md
index 38c4468cc..567e341b4 100644
--- a/content/en/docs/claude-code/model-config.md
+++ b/content/en/docs/claude-code/model-config.md
@@ -84,7 +84,7 @@ To get the most from Fable:
Fable 5.1 requires Claude Code v2.1.255 or later. If a request for it from an older version fails, see [Claude Code does not support this model](/docs/en/errors#claude-code-does-not-support-this-model). Fable 5 requires v2.1.170 or later. Run `claude update` to upgrade. For availability under zero data retention, see [Model availability under ZDR](/docs/en/zero-data-retention#model-availability-under-zdr).
-On the Anthropic API, the `/model` picker lists a Fable model only after the server reports it available for your organization. When you type `/model fable` or a Fable model ID, Claude Code checks availability with the server directly, so the selection can succeed before the picker lists the entry.
+On the Anthropic API, the `/model` picker lists a Fable model only after the server reports it available for your organization. When you type `/model fable` or a Fable model ID, Claude Code checks availability with the server directly, so a typed selection can succeed even when the picker doesn't list the entry.
#### Fable and usage credits
diff --git a/content/en/docs/claude-code/permission-modes.md b/content/en/docs/claude-code/permission-modes.md
index 1dfa4020e..887fe8b14 100644
--- a/content/en/docs/claude-code/permission-modes.md
+++ b/content/en/docs/claude-code/permission-modes.md
@@ -374,6 +374,15 @@ Claude Code v2.1.205 and later also block these by default:
* Writing to Claude Code session transcripts, the `.jsonl` history files under `~/.claude/projects/` or your configured config directory, whether directly or through a shell command. The rule also covers the metadata lines Claude Code appends to each transcript entry for its own checks. Reading a transcript isn't blocked
* A recursive forced delete such as `rm -rf "$VAR"` or `Remove-Item -Recurse -Force $dir` whose target is a shell variable, or a glob rooted at one, that isn't assigned anywhere in the conversation the classifier sees. The value came only from earlier command output, which the classifier never receives, so the classifier can't verify the deletion target against the other deletion rules. The block clears when you name the exact path being deleted, or when Claude re-runs the delete with the resolved literal path written into the command. Deletes whose target the classifier can resolve aren't affected. `Remove-Item` targets that are a bare `*` or end in `/*` or `\*` never reach the classifier: Claude Code [denies them outright](#remove-item-in-powershell)
+Claude Code v2.1.257 and later also block these by default:
+
+* Requesting credentials from the cloud instance-metadata endpoint, such as `169.254.169.254`, or explicitly authenticating a cloud, cluster, or registry call with the machine's own service-account or node identity
+* Reaching a public host by a route other than a direct request, such as a tunnel, a reverse shell, or a resolver or proxy configuration rewritten to point outside
+* Reading credentials that belong to the host rather than to your task, such as node certificates or the node's container-registry auth
+* Connecting to or scanning sibling containers, pods, or VMs that Claude didn't start, or the node beneath the container
+
+If Claude Code runs somewhere that is meant to allow one of these, describe that setup in a [Host containment entry](/docs/en/auto-mode-config#define-trusted-infrastructure) in `autoMode.environment`.
+
**Allowed by default**:
* Local file operations in your working directory
diff --git a/content/en/release-notes/overview.md b/content/en/release-notes/overview.md
index 8567ff29a..349dc8701 100644
--- a/content/en/release-notes/overview.md
+++ b/content/en/release-notes/overview.md
@@ -12,6 +12,10 @@ The Claude Platform release notes list changes to the Claude API, the client SDK
For updates to Claude Code, see the [complete CHANGELOG.md](https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md) in the `claude-code` repository.
+### September 3, 2026
+
+* Version 1.30.0 of the `ant` CLI adds `ant apply`, which creates and updates agents, environments, skills, memory stores, and deployments from files in your repository. Describe each resource in a file, run `ant apply`, and approve the plan it prints. Commit the `claude-lock.json` lockfile it writes so that later runs, on your machine or in CI, update the same resources instead of creating new ones. See [Manage resources as code with ant apply](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/apply).
+
### September 1, 2026
* We've launched **Claude Fable 5.1** (`claude-fable-5-1`), the successor to Claude Fable 5 for long-running agentic coding, knowledge work, and research, alongside **Claude Mythos 5.1** (`claude-mythos-5-1`) for Project Glasswing participants. Both models support a [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) by default, 128k max output tokens, and always-on [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking), at $10 / $50 USD per MTok, the same as Claude Fable 5, with cache reads cut to $0.25 per MTok. Claude Fable 5.1 is available on the Claude API, [Claude in Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock), [Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws), [Claude on Google Cloud](https://platform.claude.com/docs/en/build-with-claude/claude-on-vertex-ai), and [Claude in Microsoft Foundry](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry). See [What's new in Claude Fable 5.1](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1) for capabilities, API changes, and migration guidance.
diff --git a/content/support/10310342-how-do-i-log-out-of-all-active-sessions.md b/content/support/10310342-how-do-i-log-out-of-all-active-sessions.md
index d3fbb6b76..256274cf2 100644
--- a/content/support/10310342-how-do-i-log-out-of-all-active-sessions.md
+++ b/content/support/10310342-how-do-i-log-out-of-all-active-sessions.md
@@ -38,7 +38,7 @@ To regain access to your account on any device, you'll need to authenticate agai
If you used your Claude account to authenticate into Claude Code, you can manage your authorization tokens by navigating to **[Settings > Claude Code](https://claude.ai/settings/claude-code)**. To remove a token and log out of Claude Code, click the trash can icon.
-
+
## Unable to access your account?
diff --git a/content/support/10366376-how-can-i-delete-my-claude-console-account.md b/content/support/10366376-how-can-i-delete-my-claude-console-account.md
index d6d37e2fc..72b60cf0f 100644
--- a/content/support/10366376-how-can-i-delete-my-claude-console-account.md
+++ b/content/support/10366376-how-can-i-delete-my-claude-console-account.md
@@ -36,7 +36,7 @@ If you followed the steps above to delete your Console organization but want to
If you have an outstanding balance, you will see a message during the deletion flow that prompts you to pay the balance first by routing you to [Settings > Billing](https://platform.claude.com/settings/billing).
-
+
You must pay this outstanding balance before you’re able to move forward with the deletion process.
@@ -44,6 +44,6 @@ You must pay this outstanding balance before you’re able to move forward with
There are some scenarios where you will need to contact our team to delete your account. If this is the case, it will be noted when you try to delete your organization:
-
+
If you are seeing this message, this indicates that your Console organization cannot be deleted via the self-service pathway.
\ No newline at end of file
diff --git a/content/support/10504844-manage-user-feedback-settings-on-team-and-enterprise-plans.md b/content/support/10504844-manage-user-feedback-settings-on-team-and-enterprise-plans.md
index cbe4c7aa0..8905e4f44 100644
--- a/content/support/10504844-manage-user-feedback-settings-on-team-and-enterprise-plans.md
+++ b/content/support/10504844-manage-user-feedback-settings-on-team-and-enterprise-plans.md
@@ -6,6 +6,6 @@ As a Primary Owner or Owner of a Team or Enterprise plan, you can manage the abi
2. Use the toggle to change the **Rate chats** setting for your organization:
-
+
More information on how Anthropic collects, uses, and stores feedback data can be found in our Privacy Center: **[How long do you store my organization’s data?](https://privacy.claude.com/en/articles/7996866-how-long-do-you-store-my-organization-s-data)**
\ No newline at end of file
diff --git a/content/support/10504853-manage-user-feedback-settings-on-claude-console.md b/content/support/10504853-manage-user-feedback-settings-on-claude-console.md
index a0c255340..4a2367e45 100644
--- a/content/support/10504853-manage-user-feedback-settings-on-claude-console.md
+++ b/content/support/10504853-manage-user-feedback-settings-on-claude-console.md
@@ -8,6 +8,6 @@ To manage feedback for your Console organization:
2. Toggle the feedback switch on or off.
-
+
More information on how Anthropic collects, uses, and stores feedback data can be found in our Privacy Center: [How long do you store my organization’s data?](https://privacy.claude.com/en/articles/7996866-how-long-do-you-store-my-organization-s-data)
\ No newline at end of file
diff --git a/content/support/10593882-share-and-unshare-chats.md b/content/support/10593882-share-and-unshare-chats.md
index e4fac3c77..e9347e988 100644
--- a/content/support/10593882-share-and-unshare-chats.md
+++ b/content/support/10593882-share-and-unshare-chats.md
@@ -38,12 +38,12 @@ To unshare a chat:
Users on free, Pro, or Max plans can review a log of shared chats by navigating to **[Settings > Privacy](https://claude.ai/settings/data-privacy-controls)**. Find the **Privacy settings** section and click “Manage” next to **Shared chats:**
-
+
This will open a **Shared chats** modal listing the title, date shared, and link to each chat, allowing you to easily review and access all your previously-shared content. From here, you also have the option to click “Unshare” next to each listed chat to revoke access to the last snapshot you shared:
-
+
If you don’t have any shared chat snapshots, the **Shared chats** modal will show “No shared content found”:
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/content/support/10949351-getting-started-with-local-mcp-servers-on-claude-desktop.md b/content/support/10949351-getting-started-with-local-mcp-servers-on-claude-desktop.md
index a030d4c5a..86bfd65cd 100644
--- a/content/support/10949351-getting-started-with-local-mcp-servers-on-claude-desktop.md
+++ b/content/support/10949351-getting-started-with-local-mcp-servers-on-claude-desktop.md
@@ -48,7 +48,7 @@ for specific instructions.
Custom desktop extensions uploads allow Team and Enterprise plans to leverage organization-specific workflows that aren’t available in the public directory. After creating a custom desktop extension, Owners and Primary Owners can navigate to Settings > Extensions within Claude Desktop and click “Advanced settings” to access the **Extension Developer** section:
-
+
Click “Install Extension…” and select the .mcpb file. Follow the prompts to install and configure your custom desktop extension. For more in-depth information, please refer to our [desktop extension developer documentation](https://github.com/anthropics/mcpb).
diff --git a/content/support/11101966-use-voice-mode.md b/content/support/11101966-use-voice-mode.md
index f5e797aa6..f362e7d68 100644
--- a/content/support/11101966-use-voice-mode.md
+++ b/content/support/11101966-use-voice-mode.md
@@ -24,7 +24,7 @@ Voice mode transforms how you interact with Claude by:
2. Tap the sound wave symbol in the lower right corner of the chat window to activate voice mode:
-
+
3. Start talking and see your prompt automatically populate in the chat input.
@@ -32,7 +32,7 @@ Voice mode transforms how you interact with Claude by:
5. Claude will remain in voice mode until you click the “Stop” button in the lower right corner of the chat window:
-
+
### On mobile (iOS and Android)
@@ -40,7 +40,7 @@ Voice mode transforms how you interact with Claude by:
2. Tap the voice mode icon (sound wave symbol next to the microphone icon) in the text input field:
-
+
3. Choose a voice to personalize your experience.
@@ -78,7 +78,7 @@ To change the voice later:
- **On mobile:** Click the settings button in the bottom left corner while chatting with Claude in voice mode, then tap your preferred voice and pace:
-
+
## Choose a model
diff --git a/content/support/11725453-set-up-the-claude-lti-in-canvas-by-instructure.md b/content/support/11725453-set-up-the-claude-lti-in-canvas-by-instructure.md
index 20bf08310..311731ff6 100644
--- a/content/support/11725453-set-up-the-claude-lti-in-canvas-by-instructure.md
+++ b/content/support/11725453-set-up-the-claude-lti-in-canvas-by-instructure.md
@@ -44,7 +44,7 @@ This article provides information on how to enable the Claude LTI integration in
5. Click "Install" and refresh the course page.
-
+
## Turn on the Claude LTI Integration in Claude for Education organization settings
diff --git a/content/support/11817273-use-claude-s-chat-search-and-memory-to-build-on-previous-context.md b/content/support/11817273-use-claude-s-chat-search-and-memory-to-build-on-previous-context.md
index 58a9af835..badc441e4 100644
--- a/content/support/11817273-use-claude-s-chat-search-and-memory-to-build-on-previous-context.md
+++ b/content/support/11817273-use-claude-s-chat-search-and-memory-to-build-on-previous-context.md
@@ -40,7 +40,7 @@ When Claude searches your previous chats, you will see this reflected in your cu
Yes, navigate to **[Settings > Memory](https://claude.ai/new#settings/customize-memory)** and switch the toggle next to "Search and reference chats" off:
-
+
## Can I exclude a specific past chat from searches?
@@ -84,7 +84,7 @@ What Claude remembers from your chats is available when you hand it a task in Co
You can toggle Claude’s memory on by navigating to **[Settings > Memory](https://claude.ai/new#settings/customize-memory)** and turning on **Generate memory from chats**:
-
+
If you want to disable Claude’s memory, click the toggle and you'll see two options:
@@ -239,7 +239,7 @@ When Claude searches your previous chats, you will see this reflected in your cu
Yes, navigate to **[Settings > Capabilities](https://claude.ai/settings/capabilities)** and find the **Preferences** section. Switch the toggle next to “Search and reference chats” off:
-
+
### Can I exclude a specific past chat from searches?
@@ -247,7 +247,7 @@ Incognito chats are available to all Claude users (free, Pro, Max, Team, and Ent
When starting a new chat with Claude outside of a project, you'll see a ghost icon in the upper right corner of your screen:
-
+
Clicking the ghost icon will open an incognito chat, creating a temporary conversation that isn’t saved to your chat history. Claude won’t pull information from incognito chats when searching previous conversations.
@@ -279,7 +279,7 @@ Each project has its own separate memory space and dedicated project summary, so
You can toggle Claude’s memory on by navigating to **[Settings > Capabilities](https://claude.ai/settings/capabilities)**:
-
+
If you want to disable Claude’s memory, click the toggle to see two options:
diff --git a/content/support/11818288-why-am-i-being-asked-to-verify-my-payment-method.md b/content/support/11818288-why-am-i-being-asked-to-verify-my-payment-method.md
index b64eff633..1886ec8a9 100644
--- a/content/support/11818288-why-am-i-being-asked-to-verify-my-payment-method.md
+++ b/content/support/11818288-why-am-i-being-asked-to-verify-my-payment-method.md
@@ -2,7 +2,7 @@
If you see the following pop-up when you log in to your Claude account, you’ll need to click the “Verify now” button to verify your payment method:
-
+
## What happens if I click “Remind me later?”
diff --git a/content/support/11869629-use-claude-with-android-apps.md b/content/support/11869629-use-claude-with-android-apps.md
index 350e43c37..2cf65d4f1 100644
--- a/content/support/11869629-use-claude-with-android-apps.md
+++ b/content/support/11869629-use-claude-with-android-apps.md
@@ -222,7 +222,7 @@ Permission requirements vary by feature:
For features requiring permissions (like location or calendar access), Claude will request permission contextually with clear explanations of why the access is needed. You’ll be prompted to approve the action with three options: Allow once, Always allow, or Don't allow.
-
+
These permissions can be managed at any time in your device settings by going to Settings > Apps > Claude > Permissions. Click into each permission listed under **Allowed** and **Not allowed** to make changes. You can toggle between “Allow only while using the app” or “Ask every time” to change Claude’s access, or remove permissions by choosing “Don’t allow.” Claude will only request permissions if needed for specific features, and you can always choose to decline while still using other capabilities.
diff --git a/content/support/12005970-manage-usage-credits-for-team-and-seat-based-enterprise-plans.md b/content/support/12005970-manage-usage-credits-for-team-and-seat-based-enterprise-plans.md
index 4c10769df..942296ed2 100644
--- a/content/support/12005970-manage-usage-credits-for-team-and-seat-based-enterprise-plans.md
+++ b/content/support/12005970-manage-usage-credits-for-team-and-seat-based-enterprise-plans.md
@@ -70,7 +70,7 @@ After navigating to **[Organization settings > Usage](https://claude.ai/admin-se
The **Usage and spend limits** section will show the current limit (if any) or **Unlimited**. Clicking on "Adjust limit" opens a modal where you can either input an amount and click "Set spend limit," or click "Set to unlimited" to remove the organization-wide monthly spend limit.
-
+
Changes to your organization’s overall spend limit go into effect immediately.
@@ -78,11 +78,11 @@ Changes to your organization’s overall spend limit go into effect immediately.
Owners and Primary Owners on **seat-based Enterprise plans only** can set spend limits that apply to all users within a specific seat tier.
-
+
Select the "By group" tab to see **Standard seats** and **Premium seats** groups. Click the "..." icon next to the current limit, then "Edit limit." This opens a modal where you can either select "Set dollar amount" and input an amount, or click "Unlimited" to remove the limit for that seat type. Click "Set limit" to save your changes.
-
+
---
@@ -90,11 +90,11 @@ Select the "By group" tab to see **Standard seats** and **Premium seats** groups
Owners and Primary Owners can also set individual monthly spend limits for each member by finding **Spend limits by user** and clicking the "..." button next to the user, then "Edit limit."
-
+
Enter the amount and click "Set limit." Alternatively, selecting "Set to unlimited" will remove that member's monthly spend limit (they will still be subject to any organization or seat-level spend limits).
-
+
This allows owners fine control over usage credits, so you can set limits for different members based on their roles or individual needs. Once a user reaches their defined spend limit, this will automatically pause their usage credits until the end of the month. They will need to wait for their usage limits to reset before using Claude again.
diff --git a/content/support/12012173-get-started-with-claude-in-chrome.md b/content/support/12012173-get-started-with-claude-in-chrome.md
index df4b412f4..9889ba40b 100644
--- a/content/support/12012173-get-started-with-claude-in-chrome.md
+++ b/content/support/12012173-get-started-with-claude-in-chrome.md
@@ -38,7 +38,7 @@ Follow these steps to connect Claude in Chrome in your desktop app:
4. Toggle the connector on, then download and install the extension if you haven’t already.
-
+
Completing these steps will add Claude in Chrome to the “Connectors” drop-down on your chats with Claude. This is disabled by default, so you’ll need to enable it manually for each conversation.
diff --git a/content/support/12111783-create-and-edit-files-with-claude.md b/content/support/12111783-create-and-edit-files-with-claude.md
index 1fe4946c4..ddaa1b0d8 100644
--- a/content/support/12111783-create-and-edit-files-with-claude.md
+++ b/content/support/12111783-create-and-edit-files-with-claude.md
@@ -48,7 +48,7 @@ These capabilities make it easy to produce professional documents by simply chat
To give Claude access to external data sources, toggle **Allow network egress** on:
-
+
### Enabling on Claude Mobile
@@ -66,11 +66,11 @@ Team and Enterprise organization owners can control network access settings in *
- **Allow network egress to package managers and specific domains:** Claude can access package managers plus additional domains you specify. Add domains individually to whitelist specific resources your organization needs:
-
+
**All domains:** Claude has full internet access except for domains on Anthropic's legal blocklist. While this provides maximum flexibility for file creation and analysis tasks, it’s also the riskiest option. Please review the **[security considerations below](#h_0ee9d698a1)** before enabling “All domains”:
-
+
---
diff --git a/content/support/12157520-claude-code-usage-analytics.md b/content/support/12157520-claude-code-usage-analytics.md
index 5c865a1da..b7e8bbb63 100644
--- a/content/support/12157520-claude-code-usage-analytics.md
+++ b/content/support/12157520-claude-code-usage-analytics.md
@@ -50,7 +50,7 @@ The **Usage** tab displays the following metrics for your organization. Data on
- **Top commands**: The Claude Code commands used most often across your organization.
-
+
### User-level metrics
diff --git a/content/support/12260368-use-incognito-chats.md b/content/support/12260368-use-incognito-chats.md
index 657d56b9c..c3270b835 100644
--- a/content/support/12260368-use-incognito-chats.md
+++ b/content/support/12260368-use-incognito-chats.md
@@ -30,7 +30,7 @@ Incognito chats are temporary conversations that aren't saved to your chat histo
When starting a new chat with Claude outside of a project, you'll see a ghost icon in the upper right corner of your screen:
-
+
1. Click the ghost icon to enable incognito mode.
diff --git a/content/support/12293051-use-claude-in-xcode.md b/content/support/12293051-use-claude-in-xcode.md
index 828103edb..ff101b27d 100644
--- a/content/support/12293051-use-claude-in-xcode.md
+++ b/content/support/12293051-use-claude-in-xcode.md
@@ -34,7 +34,7 @@ To start using Claude in Xcode:
3. Log in with your Claude account.
-
+
## Usage limits
diff --git a/content/support/12429409-manage-usage-credits-for-paid-claude-plans.md b/content/support/12429409-manage-usage-credits-for-paid-claude-plans.md
index 0078d2acc..8b58be281 100644
--- a/content/support/12429409-manage-usage-credits-for-paid-claude-plans.md
+++ b/content/support/12429409-manage-usage-credits-for-paid-claude-plans.md
@@ -46,7 +46,7 @@ To enable usage credits on your paid Claude plan:
8. You can also enable auto-reload to automatically make a purchase when your balance falls below a threshold you set:
-
+
**Note:** There is a daily redemption limit of $2000.
diff --git a/content/support/12466728-troubleshoot-claude-error-messages.md b/content/support/12466728-troubleshoot-claude-error-messages.md
index 3529a4c9f..1d2f59955 100644
--- a/content/support/12466728-troubleshoot-claude-error-messages.md
+++ b/content/support/12466728-troubleshoot-claude-error-messages.md
@@ -58,4 +58,4 @@ Capacity issues will not appear on our status page because they represent normal
Service incidents are disruptions where Claude is unavailable or significantly degraded for all or most users. These represent actual technical problems with our systems. To check for confirmed incidents, visit status.claude.com, where you'll find real-time updates on scope, impact, and resolution progress for any active incidents.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/content/support/12542951-set-up-the-microsoft-365-connector.md b/content/support/12542951-set-up-the-microsoft-365-connector.md
index c5450fd23..ceac76355 100644
--- a/content/support/12542951-set-up-the-microsoft-365-connector.md
+++ b/content/support/12542951-set-up-the-microsoft-365-connector.md
@@ -120,7 +120,7 @@ Both components need to be restricted to the same set of authorized people.
To limit which types of resources the integration can access, selectively revoke permissions from the default set of authorized scopes. This requires Microsoft Entra admin access.
-1. As a Microsoft Entra admin, go to entra.admin.com.
+1. As a Microsoft Entra admin, go to entra.microsoft.com.
2. Select “Enterprise Applications.”
@@ -144,27 +144,27 @@ To restore a revoked permission, follow the steps to grant admin consent describ
## Enable write tools
-Write tools let Claude send email, manage drafts and calendar events, update mailbox settings, and create and update files in OneDrive and SharePoint. Read and search tools work the same whether or not write tools are enabled.
+Write tools let Claude send email, manage drafts and calendar events, update mailbox settings, and create and update files in OneDrive and SharePoint, and send messages in Microsoft Teams. Read and search tools work the same whether or not write tools are enabled.
**1. Re-consent to the updated permissions**
-The connector's permission set now includes additional Microsoft Graph scopes to support write tools. If your tenant consented before write tools launched, a Microsoft Entra Global Administrator needs to review and approve the updated permission set before write tools activate. Review and approve the updated permissions for the connector in your tenant's **Enterprise Applications** consent flow. This is a one-time action per tenant.
+The connector's permission set now includes additional Microsoft Graph scopes to support write tools. If your tenant consented before write tools or the Teams write tools launched, a Microsoft Entra Global Administrator needs to review and approve the updated permission set before write tools activate. Review and approve the updated permissions for the connector in your tenant's **Enterprise Applications** consent flow.
**2. Enable write tools for your organization**
-If your organization was using the connector before write tools launched, they will be blocked by default. Enable them for everyone by going to **[Organization settings > Connectors](https://claude.ai/admin-settings/connectors)**, finding “Microsoft 365,” and setting the appropriate permissions. Enterprise plans can enable them for a subset of users through **[custom roles](https://support.claude.com/en/articles/13930452-manage-custom-roles-on-enterprise-plans#h_979e558d00)**.
+If your organization was using the connector before write tools launched, they will be blocked by default. Enable them for everyone by going to **[Organization settings > Connectors](https://claude.ai/admin-settings/connectors)**, finding “Microsoft 365,” and setting the appropriate permissions. Enterprise plans can enable them for a subset of users through **[custom roles](https://support.claude.com/en/articles/13930452-manage-custom-roles-on-enterprise-plans#h_979e558d00)**. For Microsoft Teams specifically, set each Teams write tool individually: the send, post, and reply tools can be set to Ask or Blocked (members confirm each send), and starting a new chat can also be set to Allow. The connector-wide "all tools" permission on its own doesn't turn these on.
**3. Verify**
Once enabled, ask Claude to perform a low-risk write action, such as "Draft an email to myself, but don't send it," to confirm write tools are active.
-**Note:** Emails Claude sends include an attribution header identifying them as agent-initiated. File and calendar writes aren't currently tagged. Attachments aren’t supported in write tools, so sending, forwarding, and drafting all reject messages with attachments. Write tools are also subject to per-user limits on writes, sends, and recipients.
+**Note:** Emails Claude sends include an attribution header identifying them as agent-initiated. File writes, calendar writes, and Teams messages aren't currently tagged. Attachments aren’t supported in write tools, so sending, forwarding, and drafting all reject messages with attachments. Write tools are also subject to per-user limits on writes, sends, and recipients.
---
## Permissions reference
-The Microsoft 365 connector uses **delegated permissions**, meaning Claude acts on behalf of each individual user and can only access data that user already has permission to view in Microsoft 365. Permissions are read-only—Claude can't modify, delete, or create content in your tenant.
+The Microsoft 365 connector uses **delegated permissions**, meaning Claude acts on behalf of each individual user and can only access data that user already has permission to view in Microsoft 365. Permissions are read-only by default. Claude can only send, create, or update content if you enable write tools.
During authentication, the integration requests the following permissions:
@@ -254,6 +254,12 @@ The following permissions support write tools and are included in the updated co
- `MailboxSettings.ReadWrite`: Manage categories, inbox rules, and automatic replies
+- `ChatMessage.Send`: Send a Teams chat message on the user's behalf
+
+- `ChannelMessage.Send`**:** Post or reply in a Teams channel
+
+- `Chat.Create`: Start a new chat on the user’s behalf
+
**User directory**
- `User.ReadBasic.All`: Read basic profile information for all users in the organization (used for finding meeting availability)
@@ -364,4 +370,4 @@ Claude reads Word, Excel, PowerPoint (including older .doc, .xls, and .ppt files
### Can the integration modify Microsoft 365 data?
-Only after an Entra admin grants write scopes. With write tools on, Claude can send email, manage drafts and calendar events, update mailbox settings, and create and update files in OneDrive and SharePoint, always within each member's existing Microsoft 365 permissions. Without them, the integration is read-only. Claude can't post Teams messages or change Teams settings or permissions in either case, since there are no tools allowing this.
\ No newline at end of file
+Only after an Entra admin grants write scopes. With write tools on, Claude can send email, manage drafts and calendar events, update mailbox settings, create and update files in OneDrive and SharePoint, and send messages in Microsoft Teams (post/reply in a channel, send a chat message, or start a new chat on the user's behalf), always within each member's existing Microsoft 365 permissions. Without them, the integration is read-only. Claude still can't change Teams settings or permissions, only send messages.
\ No newline at end of file
diff --git a/content/support/12592343-enabling-and-using-the-desktop-extension-allowlist.md b/content/support/12592343-enabling-and-using-the-desktop-extension-allowlist.md
index 5f992c388..ee582a3db 100644
--- a/content/support/12592343-enabling-and-using-the-desktop-extension-allowlist.md
+++ b/content/support/12592343-enabling-and-using-the-desktop-extension-allowlist.md
@@ -20,11 +20,11 @@ The desktop extension allowlist is disabled by default, so an organization Owner
4. Switch to the "Desktop" tab:
-
+
5. Toggle **Allowlist** on:
-
+
## What happens after enabling the allowlist?
@@ -42,7 +42,7 @@ Consider completing the allowlist setup during off-hours to minimize disruption
**Important:** The allowlist requires Claude Desktop version 0.13.91 or higher, so users should update the desktop app by clicking “Claude”, then either “Check for updates” or “Restart to update to Claude 0.13.91”:
-
+
## Managing allowed extensions
@@ -60,7 +60,7 @@ After enabling the allowlist, you can choose which extensions to allow:
If you want to remove an extension from the allowlist, click the “...” button and “Remove from allowlist.”
-
+
## Uploading custom extensions
diff --git a/content/support/12618689-claude-code-on-the-web.md b/content/support/12618689-claude-code-on-the-web.md
index 54f779963..bf53b9604 100644
--- a/content/support/12618689-claude-code-on-the-web.md
+++ b/content/support/12618689-claude-code-on-the-web.md
@@ -10,7 +10,7 @@ This feature works with repositories you may not have on your local machine. You
Claude Code for web enables asynchronous development workflows. With Claude Code in your terminal or editor, you typically work synchronously: you make a request, wait for Claude to respond, review the changes, then make another request. Synchronous work like this gives you fine-grained control but requires your attention throughout the process. Claude Code on the web handles this differently: you can assign a larger task, let Claude work independently, and return later to review the completed work.
-
+
You can also run multiple tasks in parallel. Since each task runs in its own isolated environment, you can have Claude working on several different issues or repositories simultaneously. Each task proceeds independently and creates its own pull request when complete. More than one task can work on the same repository at the same time.
@@ -18,13 +18,13 @@ You can also run multiple tasks in parallel. Since each task runs in its own iso
When you start a task, Claude Code on the web creates an isolated virtual machine for your work. Your GitHub repository is cloned into this environment, which comes pre-configured with common development tools and language ecosystems.
-
+
Claude prepares the environment by running any setup commands you've defined in your repository's configuration. This includes installing dependencies, setting up databases, or running other initialization steps your project needs. If your task requires network access, maybe to install packages or fetch data, you can configure the level of internet access the environment has.
Once the environment is ready, Claude begins working on your task. Claude reads your code, makes changes, writes tests, and runs commands to verify the work. You can monitor progress and provide guidance through the web interface if needed.
-
+
When Claude completes the task, it pushes the changes to a new branch in your GitHub repository. You receive a notification and can review the changes, then create a pull request directly from the interface. The pull request includes all of Claude's work, ready for your review and any additional changes you want to make.
diff --git a/content/support/12626668-use-quick-entry-with-claude-desktop-on-mac.md b/content/support/12626668-use-quick-entry-with-claude-desktop-on-mac.md
index 6b67f45e4..19695d6a1 100644
--- a/content/support/12626668-use-quick-entry-with-claude-desktop-on-mac.md
+++ b/content/support/12626668-use-quick-entry-with-claude-desktop-on-mac.md
@@ -40,7 +40,7 @@ When you first open the updated version of Claude Desktop, you'll see a prompt t
Once enabled, double-tapping Option will open a text box where you can type your message and start a new chat. You can also click "New chat" to see your five most recent conversations.
-
+
### Enable the voice shortcut (optional)
diff --git a/content/support/12883420-view-usage-analytics-for-team-and-enterprise-plans.md b/content/support/12883420-view-usage-analytics-for-team-and-enterprise-plans.md
index a6a28b89b..c676d535a 100644
--- a/content/support/12883420-view-usage-analytics-for-team-and-enterprise-plans.md
+++ b/content/support/12883420-view-usage-analytics-for-team-and-enterprise-plans.md
@@ -22,7 +22,7 @@ This page includes the following analytics:
- Sessions in Cowork
-
+
### Who’s using Claude?
@@ -34,7 +34,7 @@ This page includes the following analytics:
Use the dropdown on the **Active members and assigned seats** chart to filter by product, including Claude Design.
-
+
### How are they using Claude?
@@ -48,9 +48,9 @@ Use the dropdown on the **Active members and assigned seats** chart to filter by
- How agentic is their work? (beta)
-
+
-
+
### What are the results?
@@ -66,7 +66,7 @@ Use the dropdown on the **Active members and assigned seats** chart to filter by
- Estimated time saved
-
+
### How much is Claude costing?
@@ -82,9 +82,9 @@ This section includes the following analytics:
- Spend by model (month-to-date, quarter-to-date, year-to-date, 1 year)
-
+
-
+
## Export a spend report
@@ -160,7 +160,7 @@ Navigate to **[Analytics > Claude Chat](https://claude.ai/analytics/usage)** to
- Top members by chats
-
+
### Projects
@@ -172,7 +172,7 @@ Navigate to **[Analytics > Claude Chat](https://claude.ai/analytics/usage)** to
- Top members by project usage
-
+
### Artifacts
@@ -182,7 +182,7 @@ Navigate to **[Analytics > Claude Chat](https://claude.ai/analytics/usage)** to
- Top 10 users by artifacts generated (month-to-date, quarter-to-date, year-to-date, 1 year)
-
+
---
@@ -278,7 +278,7 @@ Navigate to **[Analytics > Cowork](https://claude.ai/analytics/cowork)** to view
- Daily, weekly, and monthly active Cowork users
-
+
**Note:** Cowork analytics are available alongside Chat and Claude Code data in the **[Analytics API](https://platform.claude.com/docs/en/manage-claude/analytics-api)**.
@@ -294,7 +294,7 @@ Navigate to **[Analytics > Surveys](https://claude.ai/analytics/surveys)** to as
On Enterprise plans with usage-based billing, when your admin turns on individual usage analytics, any member of the organization can see their own usage broken down by product, model, and skill, along with where they stand against any spend limits set for them. Individual usage analytics are available in **[Settings > Usage](https://claude.ai/settings/usage)**.
-
+
---
diff --git a/content/support/12902446-claude-in-chrome-permissions-guide.md b/content/support/12902446-claude-in-chrome-permissions-guide.md
index fde667de9..19452deed 100644
--- a/content/support/12902446-claude-in-chrome-permissions-guide.md
+++ b/content/support/12902446-claude-in-chrome-permissions-guide.md
@@ -28,7 +28,7 @@ In "Manually approve," Claude checks with you before it acts. What that looks li
Claude creates a plan from your prompt, which you can approve before Claude starts. The plan specifies which websites you're allowing Claude to access, as well as the approach it will follow:
-
+
Note that Claude will only use the websites listed in the plan, so you’ll need to manually approve any additional access requests.
@@ -62,7 +62,7 @@ When you choose "Skip all approvals," Claude doesn't pause to ask, and nothing c
There are some websites on which Claude requires approval for every action. If you navigate to one of these sites, a **New permissions required** prompt will appear in the extension side panel, Claude Cowork, or Claude Code where Claude will ask for permission before accessing the page or taking any action.
-
+
### Permission options
diff --git a/content/support/13119606-provision-and-manage-skills-for-your-organization.md b/content/support/13119606-provision-and-manage-skills-for-your-organization.md
index fef22624e..45259b39f 100644
--- a/content/support/13119606-provision-and-manage-skills-for-your-organization.md
+++ b/content/support/13119606-provision-and-manage-skills-for-your-organization.md
@@ -95,9 +95,9 @@ Once these settings are on, users can begin sharing skills with groups.
### Monitor sharing activity
-Skill sharing events are captured in the audit log and Compliance API as `role_assignment` events. You can see who shared a skill, with whom, and whether it was peer-to-peer, organization-wide, or group.
+Skill sharing events are captured in the audit log and Compliance API as `role_assignment` events. You can see who shared a skill or plugin, with whom, and whether it was peer-to-peer, a group, or (skills only) organization-wide.
-The audit log doesn't capture the contents of shared skills—only the share event itself. There's no admin dashboard to browse or inspect the contents of skills shared between users.
+The audit log doesn't capture the contents of shared skills or plugins—only the share event itself. There's no admin dashboard to browse or inspect the contents of skills shared between users.
---
diff --git a/content/support/13132885-set-up-single-sign-on-sso.md b/content/support/13132885-set-up-single-sign-on-sso.md
index 5ff12dc12..9d0295d70 100644
--- a/content/support/13132885-set-up-single-sign-on-sso.md
+++ b/content/support/13132885-set-up-single-sign-on-sso.md
@@ -42,7 +42,7 @@ You can verify multiple domains for a single organization, but all domains must
3. Enter the domain(s) you want to verify in the **Update organization email domains** modal and click the “+” button:
-
+
4. Click “Save” when you’re finished adding domains.
@@ -50,7 +50,7 @@ You can verify multiple domains for a single organization, but all domains must
6. Enter your domain in the text box and click “Continue”:
-
+
7. The setup screen displays a TXT record. **Copy the full Value using the copy button**—it begins with `anthropic-domain-verification-` and is longer than what's visible in the box. In your DNS provider, add a TXT record to your domain and **Value** set to the copied string. The domain must match exactly what you entered in the previous step, including any subdomains. Add it alongside any existing TXT records; don't replace them. The value is case-sensitive, so paste it exactly. Please refer to your DNS provider's documentation on this topic.
@@ -76,7 +76,7 @@ Clicking "Refresh" re-checks your DNS; it won't show Verified until the publishe
If the record is correct and propagated but the status still shows Pending, contact Support.
-
+
**Note:** Once your domain is verified, you'll see a **Restrict organization creation** toggle under **Security** on the Organization and access organization settings page. Enable this if you want to prevent users from creating new Claude or Console organizations—including personal accounts—using your verified domains.
@@ -116,7 +116,7 @@ For IdP-specific setup instructions, see:
You can now choose to toggle on **Require SSO for Console** and/or **Require SSO for Claude,** on the **Organization and access** page, under the **Authentication** section:
-
+
When SSO is required, users must use the “Continue with SSO” option to log in to their Claude/Console accounts. When SSO is not required, they will have the option to choose “Continue with SSO” or “Continue with email.”
diff --git a/content/support/13133195-set-up-jit-or-scim-provisioning.md b/content/support/13133195-set-up-jit-or-scim-provisioning.md
index a49607c7b..df97d78cf 100644
--- a/content/support/13133195-set-up-jit-or-scim-provisioning.md
+++ b/content/support/13133195-set-up-jit-or-scim-provisioning.md
@@ -36,7 +36,7 @@ Use this table to help decide which provisioning mode is right for your organiza
Both JIT and SCIM can be combined with **Enable group mappings** to control role or seat tier assignment based on IdP group membership. If you select either of these options for your provisioning mode, **Enable group mappings** will appear within the **User provisioning** section:
-
+
**Important:** Group mappings set a user’s role type and seat tier only. Users with the Custom role get their permissions from groups in Claude, and those groups sync from your IdP only when your provisioning mode is SCIM directory sync. With JIT, you need to create groups and add users to them manually in **[Organization settings > Groups](https://claude.ai/admin-settings/groups)**. If you map an IdP group to the Custom role under JIT without doing this, those users have no permissions when they log in. Learn more about **[managing groups on Enterprise plans](https://support.claude.com/en/articles/13799932)**.
@@ -122,7 +122,7 @@ Once your IdP is connected, continue to Step 3.
4. Toggle **Enable group mappings** on (if it’s not already):
- 
+ 
5. In the **Enable group mappings** section, click “Add” next to each role and select the corresponding group from your IdP in the dropdown.
@@ -174,7 +174,7 @@ Verify you have enough seats purchased and available to add members to your org.
4. **For SCIM:** Click "Sync" to prompt an immediate sync, or wait for the automatic sync cycle:
- 
+ 
### Users mapped to the Custom role can't access anything after logging in
diff --git a/content/support/13163631-configuring-session-security-settings.md b/content/support/13163631-configuring-session-security-settings.md
index 2d6a0be08..58501029a 100644
--- a/content/support/13163631-configuring-session-security-settings.md
+++ b/content/support/13163631-configuring-session-security-settings.md
@@ -18,7 +18,7 @@ Session duration controls allow Enterprise and Console Admins to set a maximum s
5. Confirm your selection by clicking “Enable.”
-
+
### For Console Admins
@@ -32,7 +32,7 @@ Session duration controls allow Enterprise and Console Admins to set a maximum s
5. Confirm your selection by clicking “Enable.”
-
+
### What happens after enabling shortened session length?
@@ -50,7 +50,7 @@ You can change the session duration at any time by selecting a new value from th
- Sessions scheduled to expire beyond the new duration will have their expiration shortened accordingly.
-
+
## Disabling session length settings
diff --git a/content/support/13189465-log-in-to-your-claude-account.md b/content/support/13189465-log-in-to-your-claude-account.md
index 67b7a2b53..a5284654f 100644
--- a/content/support/13189465-log-in-to-your-claude-account.md
+++ b/content/support/13189465-log-in-to-your-claude-account.md
@@ -2,7 +2,7 @@
When you open Claude on a web browser ([claude.ai](http://claude.ai)), the desktop app, or a mobile app, you will see two different options for logging in to your Claude account.
-
+
## Continue with Google
diff --git a/content/support/13325567-account-management-faqs.md b/content/support/13325567-account-management-faqs.md
index 8cf5697ea..e87127801 100644
--- a/content/support/13325567-account-management-faqs.md
+++ b/content/support/13325567-account-management-faqs.md
@@ -44,6 +44,6 @@ The email domain that was used to create your Team or Enterprise plan organizati
Owners can remove domains by opening up the same modal and clicking the trash can icon to the right of the domain:
-
+
While the account creator must use a business email address, you can add public domains like @gmail.com, @yahoo.com, and @hotmail.com as allowed domains for other members of your organization.
\ No newline at end of file
diff --git a/content/support/13345190-get-started-with-claude-cowork.md b/content/support/13345190-get-started-with-claude-cowork.md
index c0316c3bc..7fc47138c 100644
--- a/content/support/13345190-get-started-with-claude-cowork.md
+++ b/content/support/13345190-get-started-with-claude-cowork.md
@@ -178,7 +178,7 @@ To set global instructions:
3. Type your instructions in the text box and click "Save":
-
+
### Folder instructions
diff --git a/content/support/13346458-customizing-your-console-appearance-settings.md b/content/support/13346458-customizing-your-console-appearance-settings.md
index d55d2c3d2..5d19119d4 100644
--- a/content/support/13346458-customizing-your-console-appearance-settings.md
+++ b/content/support/13346458-customizing-your-console-appearance-settings.md
@@ -8,4 +8,4 @@
3. Select from Light, System, or Dark under **Color mode**.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/content/support/13371040-log-in-to-your-console-account.md b/content/support/13371040-log-in-to-your-console-account.md
index 90ae5ed54..1d388986c 100644
--- a/content/support/13371040-log-in-to-your-console-account.md
+++ b/content/support/13371040-log-in-to-your-console-account.md
@@ -2,7 +2,7 @@
When you navigate to the **[Claude Console](https://platform.claude.com)**, you will see two different options for logging in to your Console account.
-
+
## Continue with Google
diff --git a/content/support/13641943-visual-and-interactive-content.md b/content/support/13641943-visual-and-interactive-content.md
index 9f7369d9d..df69af0b9 100644
--- a/content/support/13641943-visual-and-interactive-content.md
+++ b/content/support/13641943-visual-and-interactive-content.md
@@ -18,7 +18,7 @@ Claude can show current weather conditions and forecasts when you ask about the
Claude automatically displays temperatures in Fahrenheit for US locations and Celsius for everywhere else.
-
+
Weather is powered by Google Maps ().
@@ -28,7 +28,7 @@ When you ask about recipes, Claude can display formatted recipe cards that are e
**Note:** Visual recipe cards are available on web and desktop only. On mobile, Claude provides recipe information as text in the conversation.
-
+
### Custom visuals
@@ -76,7 +76,7 @@ For example, if you ask Claude to help you plan a trip, it might ask you to:
This content appears at the bottom of the chat. You can still type a response if you prefer.
-
+
---
diff --git a/content/support/13756069-public-sector-faqs.md b/content/support/13756069-public-sector-faqs.md
index e63456abf..30bc39d03 100644
--- a/content/support/13756069-public-sector-faqs.md
+++ b/content/support/13756069-public-sector-faqs.md
@@ -6,7 +6,7 @@
Select your product based on both your technical/functional requirements, and also your compliance/security/deployment environment requirements. Here is a list of options:
-
+
### What is Claude for Government (C4G)?
diff --git a/content/support/13837440-use-plugins-in-claude.md b/content/support/13837440-use-plugins-in-claude.md
index 2eb38682d..e39aa0234 100644
--- a/content/support/13837440-use-plugins-in-claude.md
+++ b/content/support/13837440-use-plugins-in-claude.md
@@ -40,7 +40,7 @@ In Cowork, open the "Cowork" tab first, then open **Customize**.
You can also upload a custom plugin file if you built one yourself or received one from a colleague. On Claude Desktop and in Cowork, plugins you add yourself are saved locally to your computer.
-
+
If you're on the Enterprise plan and your organization has skill scanning turned on, plugins are checked for malicious content when they're installed or updated. A plugin with malicious content is blocked, and one that may carry risk shows a caution banner. Learn more about **[skill and plugin scanning](https://support.claude.com/en/articles/15927065)**.
@@ -50,7 +50,7 @@ If you're on the Enterprise plan and your organization has skill scanning turned
Each plugin you install adds skills you can use while working with Claude. Type "/" or click the "+" button to see the available skills from your installed plugins, in chat and in Cowork. Click any skill to see its details.
-
+
---
diff --git a/content/support/13854387-schedule-recurring-tasks-in-claude-cowork.md b/content/support/13854387-schedule-recurring-tasks-in-claude-cowork.md
index 628fd9351..8ffa930ab 100644
--- a/content/support/13854387-schedule-recurring-tasks-in-claude-cowork.md
+++ b/content/support/13854387-schedule-recurring-tasks-in-claude-cowork.md
@@ -52,7 +52,7 @@ There are two ways to create a scheduled task:
6. You can explicitly confirm you want to schedule the task when prompted by Claude by clicking “Schedule":
-
+
7. Claude will create and schedule your task, and it will be added to the **Scheduled tasks** page.
diff --git a/content/support/13947068-assign-tasks-from-anywhere-in-claude-cowork.md b/content/support/13947068-assign-tasks-from-anywhere-in-claude-cowork.md
index 05f0b60a3..713e4f919 100644
--- a/content/support/13947068-assign-tasks-from-anywhere-in-claude-cowork.md
+++ b/content/support/13947068-assign-tasks-from-anywhere-in-claude-cowork.md
@@ -48,11 +48,11 @@ Follow these steps to get started:
5. You’ll land on a page describing the functionality. Click “Get started”:
-
+
6. On the next screen, you can give Claude access to your files and keep your computer awake by toggling those on:
-
+
7. Click “Finish setup.”
diff --git a/content/support/14499648-how-scim-sync-works-for-enterprise-organizations.md b/content/support/14499648-how-scim-sync-works-for-enterprise-organizations.md
index be55e0991..83cd966ae 100644
--- a/content/support/14499648-how-scim-sync-works-for-enterprise-organizations.md
+++ b/content/support/14499648-how-scim-sync-works-for-enterprise-organizations.md
@@ -50,7 +50,7 @@ You can trigger a manual sync from two places in your admin settings.
2. Click "Check for updates" under **SCIM sync**:
-
+
3. Select whether to sync members, groups, or both.
@@ -62,7 +62,7 @@ You can trigger a manual sync from two places in your admin settings.
3. Select whether to sync members, groups, or both:
-
+
**Note:** If you trigger a manual sync while background changes are processing, your organization takes the most recent change for each member or group. If multiple changes are queued for the same member or group, you may need to resync again to make sure everything applies correctly.
diff --git a/content/support/14503613-sso-login.md b/content/support/14503613-sso-login.md
index ed7274b67..cef449724 100644
--- a/content/support/14503613-sso-login.md
+++ b/content/support/14503613-sso-login.md
@@ -47,9 +47,9 @@ Before configuring your Identity Provider (IdP), you must verify ownership of yo
3. Wait for the DNS propagation. Once the platform detects the record, the domain status will update to “**Verified**.”
-
+
-
+
**Important:** Each domain can only have one identity provider. If multiple organizations share a single login domain, IT administrators from both organizations will be able to modify login settings. Contact **[Anthropic Support](https://claude.fedstart.com/support)** for assistance with multi-organization setups. For more details about multi-organization setups, see our **[SCIM provisioning guide](https://support.claude.com/en/articles/14503643-set-up-scim-in-claude-for-government)**.
@@ -77,7 +77,7 @@ Once your SAML application is set up in your IdP, provide Anthropic with the det
- Claims Information — Attribute mappings for user name and email.
-
+
**Tip:** Using a metadata XML file: Most IdPs let you download a metadata.xml file. Upload it on the identity settings page to auto-fill the Signing Certificate, IdP Entity ID, and SSO URL. Some IdPs (like Entra ID) also include claims information in the metadata file; if present, the system will suggest field mappings automatically.
diff --git a/content/support/14503643-set-up-scim-in-claude-for-government.md b/content/support/14503643-set-up-scim-in-claude-for-government.md
index 1dfb10b1e..47045b4f0 100644
--- a/content/support/14503643-set-up-scim-in-claude-for-government.md
+++ b/content/support/14503643-set-up-scim-in-claude-for-government.md
@@ -41,7 +41,7 @@ With SCIM, login and provisioning are separate. Your IdP tells Anthropic who sho
**Important**: Store this key securely. It cannot be retrieved after you leave the page.
-
+
### Step 2: Configure SCIM in your Identity Provider
@@ -67,7 +67,7 @@ After enabling the integration in your IdP:
**Warning**: When you fully enable SCIM provisioning, any users who were **not** synced via SCIM will be removed from the organization. Confirm that all expected users appear in the sync before proceeding.
-
+
### Step 4: Map groups to roles and seat tiers
@@ -83,7 +83,7 @@ SCIM provisioning uses IdP groups to assign roles and seat tiers within Claude f
3. Save your mappings.
-
+
If you manage multiple organizations under a single parent (see below), each organization maintains its own role and seat tier mappings. Switch between organizations using the organization selector in the bottom-left corner of the page.
diff --git a/content/support/14503775-mcp-web-search.md b/content/support/14503775-mcp-web-search.md
index a91d0c07a..da5438642 100644
--- a/content/support/14503775-mcp-web-search.md
+++ b/content/support/14503775-mcp-web-search.md
@@ -4,7 +4,7 @@ The Web Search connector gives Claude the ability to search the public internet
For questions about web search in commercial Claude, see **[Enabling and using web search](https://support.claude.com/en/articles/10684626-enabling-and-using-web-search)**.
-
+
## How Web Search differs for Claude for Government
diff --git a/content/support/14604397-set-up-your-design-system-in-claude-design.md b/content/support/14604397-set-up-your-design-system-in-claude-design.md
index 4cc988636..edfa64247 100644
--- a/content/support/14604397-set-up-your-design-system-in-claude-design.md
+++ b/content/support/14604397-set-up-your-design-system-in-claude-design.md
@@ -72,7 +72,7 @@ To validate your design system, create a test project and see if the output matc
Once you’re satisfied with the design system quality, make sure the “Published” toggle is switched on. After publishing, any projects created from the Claude Design homescreen while in your organization will use your design system instead of the default.
-
+
---
diff --git a/content/support/14604406-claude-design-admin-guide-for-team-and-enterprise-plans.md b/content/support/14604406-claude-design-admin-guide-for-team-and-enterprise-plans.md
index 2c4789849..7d091fe23 100644
--- a/content/support/14604406-claude-design-admin-guide-for-team-and-enterprise-plans.md
+++ b/content/support/14604406-claude-design-admin-guide-for-team-and-enterprise-plans.md
@@ -18,7 +18,7 @@ Team and Enterprise plan admins can enable this organization-wide by following t
2. Find the **Claude Design** toggle under **Anthropic Labs** and switch it on.
-
+
---
diff --git a/content/support/14604416-get-started-with-claude-design.md b/content/support/14604416-get-started-with-claude-design.md
index f6f7291b7..e8f0e8a4a 100644
--- a/content/support/14604416-get-started-with-claude-design.md
+++ b/content/support/14604416-get-started-with-claude-design.md
@@ -153,7 +153,7 @@ Use the “Export” button in the upper right corner when viewing your project
- Send to Claude Code Web
-
+
You can also share projects within your organization using a shareable link. Sharing options include view-only, comment, and edit access.
diff --git a/content/support/15330088-set-a-default-model-for-your-organization.md b/content/support/15330088-set-a-default-model-for-your-organization.md
index 0184eb8bf..d67e01a9b 100644
--- a/content/support/15330088-set-a-default-model-for-your-organization.md
+++ b/content/support/15330088-set-a-default-model-for-your-organization.md
@@ -50,7 +50,7 @@ The organization default applies to every member. To set it:
4. Click “Save changes.”
-
+
---
diff --git a/content/support/15694740-manage-model-access-for-your-organization.md b/content/support/15694740-manage-model-access-for-your-organization.md
index adfb6cb0d..b0dd7cef0 100644
--- a/content/support/15694740-manage-model-access-for-your-organization.md
+++ b/content/support/15694740-manage-model-access-for-your-organization.md
@@ -42,9 +42,9 @@ The organization setting is the ceiling. A role can't grant access to a model th
If any custom role uses the model you’re disabling as its default, you’ll be prompted to change that role’s default before the change can be saved.
-
+
-
+
---
@@ -78,7 +78,7 @@ If any custom role has an effort cap higher than the new organization cap for th
Only models the role grants access to can be selected as that role’s default model.
-
+
---
@@ -96,7 +96,7 @@ Effort limits determine how much computation members on a role can apply per res
5. Click "Save" to save your changes.
-
+
Members on the role see only effort levels at or below the cap in their model menu. Note that available effort levels differ depending on the model, and some models don’t support effort level settings at all. For an explanation of each level, see **[Change the model, effort, and thinking settings](https://support.claude.com/en/articles/8664678)**.
diff --git a/content/support/15936181-get-started-with-1password-for-claude.md b/content/support/15936181-get-started-with-1password-for-claude.md
index 9f35c363b..c826c39b7 100644
--- a/content/support/15936181-get-started-with-1password-for-claude.md
+++ b/content/support/15936181-get-started-with-1password-for-claude.md
@@ -52,7 +52,7 @@ Once the requirements are in place, you can set up 1Password from a few places i
4. Toggle on **Password managers**:
-
+
Once enabled, eligible users will see the discovery options above. Users still need to install and set up the required apps and extensions themselves.
diff --git a/content/support/16607638-understanding-your-pro-or-max-plan-invoices.md b/content/support/16607638-understanding-your-pro-or-max-plan-invoices.md
index 0508722da..559b6d882 100644
--- a/content/support/16607638-understanding-your-pro-or-max-plan-invoices.md
+++ b/content/support/16607638-understanding-your-pro-or-max-plan-invoices.md
@@ -40,7 +40,7 @@ You can also open any invoice from your account:
**Amount due.** The invoice total minus any applied balance. This is what your payment method was charged.
-
+
## Billing details on your invoice
diff --git a/content/support/16762437-public-links-for-shared-chats.md b/content/support/16762437-public-links-for-shared-chats.md
new file mode 100644
index 000000000..a7997e9b1
--- /dev/null
+++ b/content/support/16762437-public-links-for-shared-chats.md
@@ -0,0 +1,53 @@
+# Public links for shared chats
+
+When you share a chat with a public link, anyone who has the link can view a snapshot of that chat. This article covers who can see it, what's included, and how public links interact with search engines like Google.
+
+Public links are available on Free, Pro, and Max plans. Team and Enterprise members can only share chats inside their organization. For how to share and unshare, see **[Share and unshare chats](https://support.claude.com/en/articles/10593882)**.
+
+## What a public link does
+
+- It shares a snapshot of the chat as of the moment you shared it. Messages you send afterward stay private unless you update the snapshot.
+
+- Anyone with the link can open it. No Claude account is required.
+
+- It's view only. Viewers can't continue the chat.
+
+- Files you attached to the chat are not included.
+
+- You can turn it off at any time from the "Share" menu, or from **[Settings > Privacy](https://claude.ai/settings/data-privacy-controls)** under **Shared chats**. Once it's off, the link stops working.
+
+## Can Google or other search engines index my shared chat?
+
+We ask them not to. Every shared chat page carries a "noindex" instruction, which is the standard way to tell Google and other search engines not to show a page in search results. We also don't publish a directory or sitemap of shared chats, and each link is a long random string that can't be guessed.
+
+There are things we can't control:
+
+- **Where the link gets posted.** If you (or someone you sent it to) post the link on a public site like a forum, social feed, or blog, anyone who finds it there can open it.
+
+- **Copies.** Anyone who can view the page can copy, screenshot, or repost what's in it. Third-party archive and scraping services may save their own copy, and those copies aren't governed by our noindex instruction.
+
+- **Every search engine.** Major search engines honor noindex. We can't guarantee every crawler on the internet does.
+
+The simple rule: treat a public link as public. If you wouldn't post the contents on the open web, don't put them behind a public link.
+
+## Frequently asked questions
+
+### Does someone need a Claude account to open a public link?
+
+No. Anyone with the link can view the snapshot.
+
+### I only sent the link to one person. Is it still public?
+
+Yes. A link sent privately won't land in search results on its own, but whoever has it can forward or post it, and there's no way to limit a public link to specific people.
+
+### One of my shared chats showed up in search results. What should I do?
+
+Turn off sharing for that chat (Share menu > set to Private, or Settings > Privacy > Shared chats). The link stops working immediately, so nobody can click through and read it. Search engines drop dead and noindexed pages on their own recrawl schedule, which can take some time. For Google, you can speed this up with their **[Remove outdated content](https://support.google.com/websearch/answer/6349986)** tool. If a third-party site saved a copy, you'll need to contact that site directly.
+
+### If I turn off a public link, are copies deleted too?
+
+No. Turning it off disables the link on claude.ai. It can't remove copies, screenshots, or archives someone else already made.
+
+### Can Team or Enterprise members create public links?
+
+No. On Team and Enterprise plans, shared chats are only visible to signed-in members of the same organization.
\ No newline at end of file
diff --git a/content/support/16762496-share-a-chat-with-specific-people.md b/content/support/16762496-share-a-chat-with-specific-people.md
new file mode 100644
index 000000000..b952ab010
--- /dev/null
+++ b/content/support/16762496-share-a-chat-with-specific-people.md
@@ -0,0 +1,103 @@
+# Share a chat with specific people
+
+You can share a chat with specific people by inviting them by email. This is the default way to share a chat and keeps it private to the people you choose. Invited people can view a snapshot of the chat but can't reply, copy it into their own account, or continue the conversation.
+
+Sharing with specific people is available on all plans (Free, Pro, Max, Team, and Enterprise) on claude.ai. If you want anyone with the link to be able to view a chat instead, see **[Public links for shared chats](https://support.claude.com/en/articles/16762437)**.
+
+## Invite people to a chat
+
+1. Open the chat and click the "Share" button in the upper right corner.
+
+2. Under **People with access**, enter one or more email addresses.
+
+3. Click "Send."
+
+Each person gets an email with your name and the chat title and a link to open the chat. The invite only works for the email address you entered. If someone forwards the email, the link won't open for anyone else.
+
+**Note:** There's a limit on how many people you can invite in a day. If you hit it, you'll see a message in the share dialog and can try again later.
+
+## What invited people can see
+
+Sharing creates a snapshot of the chat at the moment you share it. People you invite see:
+
+- All messages in the chat up to that point, including artifacts
+
+- Your name as the person who shared it
+
+They don't see:
+
+- Messages you send after sharing (unless you update the shared chat, see below)
+
+- Files you attached to the chat (unless sharing was done within your organization)
+
+- Raw data from connectors or MCP tool calls, only Claude's final responses
+
+Shared chats are view only. Recipients can't continue the chat, copy it to their account, or download files from it.
+
+## If the person doesn't have a Claude account
+
+You can invite any email address. If the person doesn't have a Claude account yet, the invite email takes them to sign up with that email already filled in. A free account is enough to view the chat. Once they finish signing up, they land on the chat you shared.
+
+A few things to know:
+
+- The invite shows as **Pending** in your share dialog until they open it. You can remove a pending invite at any time.
+
+- Pending invites expire after 30 days if they aren't opened.
+
+- The person needs to sign up with the exact email you invited. If they sign in with Google or Apple using a different email, they'll see "You need access."
+
+## Change who has access or stop sharing
+
+To remove someone:
+
+1. Click "Share" on the chat.
+
+2. Under **People with access**, find the person and remove them.
+
+To stop sharing the chat entirely, click "Turn off" in the share dialog. The link stops working for everyone right away.
+
+You can also review everything you've shared from **[Settings > Privacy](https://claude.ai/settings/data-privacy-controls)** under **Shared chats**. This lists each shared chat with the date and who has access, and lets you turn off sharing per chat.
+
+## Update a shared chat
+
+People you invite see the chat as it was when you shared it. If you keep chatting and want them to see the new messages, open the share dialog and click "Update shared chat." This replaces the old snapshot with the current one for everyone who has access.
+
+## Sharing on Team and Enterprise plans
+
+On Team and Enterprise plans, sharing stays inside your organization:
+
+- You can invite people with an email address on your organization's domain. Emails outside your organization can't be invited.
+
+- Under **General access**, you can choose "Anyone at [your organization]" so any signed-in member with the link can view the chat.
+
+- Public links aren't available.
+
+- If you invite a coworker who doesn't have a Claude seat yet, they'll be asked to sign in. Depending on how your organization is set up, they'll either get access automatically or see a message to ask their admin.
+
+- Admins can turn off chat sharing for the organization, see and revoke shared chats, and view sharing activity in the audit log.
+
+## Open a chat someone shared with you
+
+Click the link in the invite email and sign in with the email address the invite was sent to. If you see "You need access," check which account you're signed into. The page shows your current account so you can switch if needed.
+
+## Frequently asked questions
+
+### Can people I invite forward the chat to someone else?
+
+No. The link only opens for the invited email. They'd need to ask you to add the other person.
+
+### Can I give someone edit access or let them continue the chat?
+
+No. Shared chats are view only.
+
+### Does the person I invite know I checked whether they have an account?
+
+We never tell you whether an email has a Claude account. Every invite looks the same on your end until it's opened.
+
+### What happens if I delete the chat?
+
+The shared snapshot is removed and the link stops working.
+
+### Can I share from the mobile app?
+
+Not yet. Sharing with specific people is available on claude.ai on the web. You can open a chat shared with you on any device.
\ No newline at end of file
diff --git a/content/support/16764810-assign-a-program-to-workspaces-in-claude-console.md b/content/support/16764810-assign-a-program-to-workspaces-in-claude-console.md
index 724bbad5c..93ad64740 100644
--- a/content/support/16764810-assign-a-program-to-workspaces-in-claude-console.md
+++ b/content/support/16764810-assign-a-program-to-workspaces-in-claude-console.md
@@ -20,27 +20,27 @@ In the Console, programs are issued to your organization and apply to workspaces
1. **[Sign in to the Console](https://platform.claude.com/)** as an organization Admin. Go to **[Organization settings > Programs](https://platform.claude.com/settings/organization/programs)**. The program card shows whether it applies automatically or needs workspaces assigned.
- 
+ 
2. Select the program to open its page. The **Workspaces** table shows each workspace's status. A workspace marked with an issue does not meet a requirement yet.
- 
+ 
Hover over the issue to see which requirement is not met.
- 
+ 
3. To give a workspace access, make it meet the requirements. Open the workspace, select "Manage," then "Programs," and check the **Qualifications** panel.
- 
+ 
4. Fix the requirement. For the Cyber Verification Program, turn on data retention under Manage, then Privacy controls. Then select "Rerun."
- 
+ 
5. The program shows **Active** for the workspace.
- 
+ 
## Troubleshooting
diff --git a/content/support/7996906-report-block-and-remove-content-from-claude.md b/content/support/7996906-report-block-and-remove-content-from-claude.md
index 16be3d79b..8d066f7d9 100644
--- a/content/support/7996906-report-block-and-remove-content-from-claude.md
+++ b/content/support/7996906-report-block-and-remove-content-from-claude.md
@@ -8,10 +8,6 @@ Please note, we reserve the right to suspend users who frequently provide manife
We welcome reports concerning safety issues so that we can enhance the safety and harmlessness of our models. We would also like to hear from you if you identify our safety mechanisms causing any user experience issues. Please report such issues to with enough detail for us to replicate the issue.
-### Help us improve AI safety by reporting universal jailbreaks
-
-This [form](https://docs.google.com/forms/d/1bjD-H30kVJAbIHnFXKzFcSjkUNjE-mwRHSF7R2uSjYM/edit) allows you to submit universal jailbreaks for ASL-3 uses of concern (meaning elicit information related to biological threats) that you've identified. Universal jailbreaks are techniques that allow users to consistently bypass safety measures across multiple harmful queries. Thank you very much for helping us to keep Anthropic safe.
-
## How to block or remove content
### Block or remove websites from Claude web search
diff --git a/content/support/8114491-get-started-with-claude.md b/content/support/8114491-get-started-with-claude.md
index 32b5717c6..a56c478c2 100644
--- a/content/support/8114491-get-started-with-claude.md
+++ b/content/support/8114491-get-started-with-claude.md
@@ -36,7 +36,7 @@ You use **prompts** to communicate with Claude. The best approach is to speak to
Type your prompt into the chat interface and click the submit button to start a conversation with Claude. You can click the "+" button in the lower left or type "/" to view additional options and commands:
-
+
---
diff --git a/content/support/8230524-delete-or-rename-a-conversation.md b/content/support/8230524-delete-or-rename-a-conversation.md
index 7f496acab..0b9e99710 100644
--- a/content/support/8230524-delete-or-rename-a-conversation.md
+++ b/content/support/8230524-delete-or-rename-a-conversation.md
@@ -44,15 +44,15 @@ These steps apply to Claude for iOS, listed on the App Store as Claude by Anthro
4. If deleting, tap "Delete" again in the confirmation prompt.
-
+
-
+
You can also delete the conversation you have open: tap the "⋯" button in the top right corner, tap "Delete," then confirm.
-
+
-
+
## Delete or rename a conversation on Claude for Android
@@ -66,9 +66,9 @@ These steps apply to the Claude for Android, listed on Google Play as Claude by
3. If deleting, tap "Delete" again in the confirmation prompt.
-
+
-
+
**To delete multiple conversations at once:**
@@ -78,9 +78,9 @@ These steps apply to the Claude for Android, listed on Google Play as Claude by
3. Tap the trash icon, then tap "Delete" in the confirmation prompt.
-
+
-
+
## What happens when you delete a conversation
diff --git a/content/support/8325618-paid-plan-billing-faqs.md b/content/support/8325618-paid-plan-billing-faqs.md
index d4715de88..198c8ffe6 100644
--- a/content/support/8325618-paid-plan-billing-faqs.md
+++ b/content/support/8325618-paid-plan-billing-faqs.md
@@ -50,7 +50,7 @@ There's no separate option to remove a card, and updating to a new card replaces
If you want to use a name other than the one tied to your payment method, check the "Use a different name on invoices" box when adding or updating your payment method in **[Settings > Billing](https://claude.ai/settings/billing)**.
-
+
## How can I edit a paid invoice?
diff --git a/content/support/8887527-customizing-your-appearance-settings.md b/content/support/8887527-customizing-your-appearance-settings.md
index 4e6bdc128..472b3f253 100644
--- a/content/support/8887527-customizing-your-appearance-settings.md
+++ b/content/support/8887527-customizing-your-appearance-settings.md
@@ -8,7 +8,7 @@
3. Select from Light, Match System, and Dark under **Color mode**.
-
+
## How to change your font
@@ -16,10 +16,10 @@
2. Select from Default, Match System, and Dyslexic Friendly.
-
+
## Can I disable the sidebar?
It's not currently possible to completely disable the sidebar. You can click the button on the top right of the sidebar to open or close it.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/content/support/9267400-move-your-personal-claude-account-to-a-team-or-enterprise-organization.md b/content/support/9267400-move-your-personal-claude-account-to-a-team-or-enterprise-organization.md
index e334ac90f..79e3b14e6 100644
--- a/content/support/9267400-move-your-personal-claude-account-to-a-team-or-enterprise-organization.md
+++ b/content/support/9267400-move-your-personal-claude-account-to-a-team-or-enterprise-organization.md
@@ -126,7 +126,7 @@ For the full walkthrough of your options, deadlines, and what happens to your su
You may have both a personal account and an organization account tied to the same email address. You can switch between them by clicking your initials or name in the lower left corner of the screen.
-
+
A blue checkmark shows which account you're currently using. Click the other account to switch to it and access its separate conversations and projects.
diff --git a/content/support/9519189-manage-project-visibility-and-sharing.md b/content/support/9519189-manage-project-visibility-and-sharing.md
index e21198d36..4f7b079b3 100644
--- a/content/support/9519189-manage-project-visibility-and-sharing.md
+++ b/content/support/9519189-manage-project-visibility-and-sharing.md
@@ -12,7 +12,7 @@ When creating a project on a Team or Enterprise plan, you can choose between two
- **Private:** Only invited members can view and use the project.
-
+
## What are public projects?
@@ -22,11 +22,11 @@ If you choose to share a project with the rest of your organization upon creatio
Yes, you can switch the visibility of a project you created as public to private at any time by opening the project and clicking the “Share” button to the right of the project name:
-
+
Click “Everyone at [your organization]” under **General access** and select “Only people invited” to change the project from public to private:
-
+
## What are private projects?
@@ -36,11 +36,11 @@ Choosing “Only people invited” keeps your project private so that you are th
Yes, you can switch the visibility of a project you created as private to public at any time by opening the project and clicking the “Share” button to the right of the project name:
-
+
Click “Only people invited” under General access and select “Everyone at [your organization]” to change the project from private to public:
-
+
## Add and remove access to private projects
diff --git a/content/support/9534590-cost-and-usage-reporting-in-the-claude-console.md b/content/support/9534590-cost-and-usage-reporting-in-the-claude-console.md
index d84779616..8165c0595 100644
--- a/content/support/9534590-cost-and-usage-reporting-in-the-claude-console.md
+++ b/content/support/9534590-cost-and-usage-reporting-in-the-claude-console.md
@@ -8,7 +8,7 @@ The Claude Console provides detailed cost and usage reporting to help you effect
Users with access to these reports can click into them on the left navigation menu on the Console:
-
+
---
@@ -46,9 +46,9 @@ The [Usage page](https://platform.claude.com/usage) offers a detailed breakdown
6. Use the export button to download a CSV of the displayed data.
-
+
-
+
### Rate Limit Use
@@ -88,6 +88,6 @@ The [Cost page](https://platform.claude.com/cost) helps you understand your spen
5. Use the export button to download a CSV of the cost data.
-
+
**Note**: Currently, it's not possible to break down usage or cost by individual users.
\ No newline at end of file
diff --git a/content/support/9547008-publish-and-share-artifacts.md b/content/support/9547008-publish-and-share-artifacts.md
index a9492f09e..9c5d21844 100644
--- a/content/support/9547008-publish-and-share-artifacts.md
+++ b/content/support/9547008-publish-and-share-artifacts.md
@@ -56,11 +56,11 @@ Publishing also adds the artifact to the **[Artifacts](https://claude.ai/artifac
After publishing, you'll see a “Get embed code” button.
-
+
Click it to open a modal with automatically generated code you can copy and paste to embed your artifact on another website.
-
+
You must specify which websites can embed your artifact by entering URLs in the **Allowed domains** field, separated by commas.
@@ -116,7 +116,7 @@ Artifacts created on Team or Enterprise accounts can only be shared within your
4. Click “Share & copy link” to make this version shareable.
-
+
### Who can access shared artifacts
@@ -138,7 +138,7 @@ When you share an artifact, viewers also gain access to any attachments and file
2. In the **Artifact shared** modal, click “Unshare.”
-
+
---
diff --git a/content/support/9927533-disable-public-projects-for-your-organization.md b/content/support/9927533-disable-public-projects-for-your-organization.md
index 8dc45bb87..55b517982 100644
--- a/content/support/9927533-disable-public-projects-for-your-organization.md
+++ b/content/support/9927533-disable-public-projects-for-your-organization.md
@@ -10,7 +10,7 @@ Follow these steps:
2. Find **Public projects** and toggle it off
-
+
## How does disabling public projects work?
diff --git a/discovery.json b/discovery.json
index c2b4eac0f..1101f541e 100644
--- a/discovery.json
+++ b/discovery.json
@@ -110,6 +110,7 @@
"anthropics/defending-code-reference-harness",
"anthropics/devcontainer-features",
"anthropics/evals",
+ "anthropics/fermats-last-theorem",
"anthropics/financial-services",
"anthropics/formal-math",
"anthropics/github-mcp-server",