Claude Code 2.1.224 added cross-session messaging, self-hosted runners, and the removal of a 200-subagent-per-session spawn cap — three changes in one changelog entry dated August 7, 2026. Taken as three separate bullets they read like routine housekeeping. Taken together they change where Claude Code runs, who a running session can hear from, and how many agents one session is allowed to spawn. That is a different product shape than the one most teams have in their heads.
What makes the release worth more than a changelog skim is the second half of the same entry. Alongside the three capability changes sit two settings — crossSessionInbound and dialogExpiry — that exist for one reason: a message arriving into a session running with bypassed permissions is a real risk, not a hypothetical one. And a few lines further down, the same release fixed a sandbox filesystem deny rule that had been silently bypassable. Capability and counterweight, shipped on the same day.
This guide walks the release in order: what the changelog actually says and what it pointedly does not, how self-hosted environments are scoped, the mechanics of session-to-session messaging, the delivery matrix that decides whether a message is delivered, held, or refused, the one-day-later addendum in 2.1.225 that loosened cross-machine messaging, and the sandbox fix that should shape how you read the whole thing. Every version-specific claim below is anchored to the Claude Code changelog and the first-party docs.
- 01One release, three architectural changes.Self-hosted runners make your own machines an execution target; cross-session SendMessage and ListAgents let independent sessions find and message each other; the 200-subagent-per-session spawn cap is gone. The changelog entry carrying all three is dated August 7, 2026.
- 02Cross-session messaging is macOS and Linux only.The changelog names the two platforms explicitly. There is no Windows-native support in this entry, and nothing in the docs implies one is coming — treat Windows as unsupported until a changelog says otherwise.
- 03Self-hosted environments are Team and Enterprise, in public beta, off by default.An owner or admin has to enable them, the org needs Claude Code on the web turned on first, and organisations on Zero Data Retention cannot use them at all. This is not a Pro or Max feature.
- 04A message carries text and nothing else.No conversation history, no files, no permissions. An incoming message cannot approve an action, change a setting, or execute a slash command — a /compact inside message text arrives as plain text and stays that way.
- 05The safeguards are the story, not the headline.crossSessionInbound, a five-minute dialogExpiry default, per-session caps on held and unread messages, and isolatePeerMachines all exist because a message into a bypass-permissions session is the obvious failure mode. The docs treat it as such.
01 — What ShippedOne changelog entry, three capability changes.
Start with the primary text. The 2.1.224 entry describes self-hosted environments as: “Added self-hosted environments: claude self-hosted-runner turns your own machines or containers into a place Claude Code web, mobile, and desktop sessions can run, on Team and Enterprise plans.” Cross-session messaging: “Added cross-session SendMessage: Claude Code sessions can now message each other, on any of your machines, with ListAgents to discover them (macOS and Linux).” And the cap: “Removed the 200-subagent-per-session spawn cap; long-running sessions no longer refuse new agents (concurrency and depth limits still apply).”
Now the part changelog recaps routinely skip — what those lines do not say. They do not say self-hosted environments are generally available; the docs describe a public beta. They do not name any plan beyond Team and Enterprise, so Pro and Max are outside the entry. They do not mention Windows for messaging. And critically, the cap line states that concurrency and depth limits still apply without stating a single number for either. Anyone quoting a figure for the surviving limits is quoting something other than this changelog.
One dating note worth carrying through the rest of this piece. The announcement blog for self-hosted environments is dated August 6, 2026; the changelog entry that shipped the code is dated August 7; independent press coverage of cross-session messaging appeared August 8 — a one-day gap on either side. Nothing about the substance changes, but it means there is no single clean “ship date” for the three features as a group. Version-specific claims below are anchored to the changelog date.
| Capability | What it enables | Do not confuse it with | Safeguard in the same release |
|---|---|---|---|
| Execution moves — where a session runs | |||
| Self-hosted runners | claude self-hosted-runner makes your own machines or containers a place web, mobile and desktop sessions can run. Team and Enterprise, public beta. | Remote Control, which steers a session on your own always-on machine from a phone or browser and is available more widely. Different feature, different audience. | Off by default. An owner or admin must enable it, and the org needs Claude Code on the web enabled first. Unavailable under Zero Data Retention. |
| Coordination moves — who a session can hear from | |||
Cross-session SendMessage + ListAgents | Independent sessions you start yourself can discover each other and exchange plain text, on any of your machines. macOS and Linux. | Agent teams and in-session subagents. Same underlying SendMessage tool, but those are Claude-spawned and supervised inside one session. | crossSessionInbound and dialogExpiry. Messages into a bypass-permissions session are held for approval rather than delivered. |
| Uncapped subagent spawning | Long-running sessions no longer refuse new agents once the old 200-per-session ceiling is reached. | An unlimited fan-out budget. The entry says concurrency and depth limits still apply — it simply never says what they are. | The surviving concurrency and depth limits, unnamed in the changelog. Treat the number as unpublished, not as absent. |
| Containment moves — what a running command can see | |||
| Sandbox credential masking | extract and onExtractNoMatch for structured env values, decode: "jwt" with maskClaims, and awsPairs / sigv4 for AWS SigV4 re-signing. | A general secrets manager. This masks values on the way through the sandbox proxy; it is not a vault and not a complete isolation boundary. | Honored only from user, managed, or --settings settings — a checked-out repository cannot loosen its own masking. Requires network.tlsTerminate. |
Laid out that way, the release reads less like three features and more like one move: Claude Code acquiring the pieces a distributed system needs — execution targets, a discovery mechanism, a message channel, and a fan-out budget that no longer hard-stops. That framing is ours rather than Anthropic’s; the vendor shipped changelog bullets, not a manifesto. But they fit together too neatly to be coincidence.
02 — Self-Hosted EnvironmentsYour compute, Anthropic’s control plane.
The mental model that matters: self-hosted environments move execution, not inference. Repository checkouts, build artifacts, secrets, and any file a session creates or modifies stay on machines you provision. The conversation itself — prompts, responses, and tool results, which can include code Claude reads — is still sent to Anthropic for inference, and the transcript is stored so the session can be resumed from another surface. If your requirement is “no code ever reaches Anthropic,” this feature does not meet it.
The scoping is tight and worth reading before anyone builds a plan around it. Team and Enterprise plans only. Public beta. Off by default — an owner or admin has to turn on the self-hosted environments setting on the cloud environments admin page, which itself requires Claude Code on the web to be enabled for the org. Organisations using Zero Data Retention cannot use it. Repositories are checked out from GitHub only in the current beta. And model inference cannot be routed through Amazon Bedrock, Google Cloud’s Agent Platform, Microsoft Foundry, or an LLM gateway — sessions call the Anthropic API directly, authenticated with a session-scoped OAuth token the control plane issues.
Supported surfaces today are Claude Code on the web, the mobile app, the desktop app, scheduled routines, and the terminal via claude --cloud or a scripted --environment dispatch. Claude Tag, Claude Security, and Code Review sessions are not yet supported; the docs say support for those follows separately. That is a meaningful gap if your CI story runs through code review.
Fixed pool
You start a set of runners and leave them up. Simplest to operate and easiest to reason about; you pay for idle capacity and you size the pool by guesswork until you have real demand data.
Autoscaling orchestrator
A separate process you run starts runners as sessions queue and lets each one exit when its work finishes. Less idle spend, more moving parts — and the orchestrator itself is now something your platform team owns.
The isolation mechanism is worth stating precisely, because it is not what most people assume. A runner locks to one user’s account on its first claimed session and serves only that account until it drains. That is how two developers’ checked-out code is kept from mixing on shared infrastructure — account affinity, not a per-session container wipe. If your threat model assumed a fresh container per session, check that assumption against the runner lifecycle section of the docs before you design around it.
Network posture is the reassuring part. All traffic is outbound from your network; Anthropic never connects in. The runner polls the Anthropic API for work, and that poll doubles as its heartbeat. Control plane, git, and inference connections are all outbound HTTPS or SSE from the runner and its session processes, with no inbound path. For a platform team that has to justify this to a security review, that is a much easier conversation than a listening port.
“Self-hosted environments let us integrate Claude Code into our existing development workflows while maintaining our security and operational controls. This setup means Claude can generate PRs, help fix CI issues, and respond to developer workflow events, with compute that can scale based on demand. Claude understands our codebase, making it a strong fit for how our engineering teams build.”— George Jacob, Senior Engineering Manager, Faire
Anthropic’s own framing is unusually candid about who this is for, and it is not the default recommendation. The announcement says most enterprises should prefer the hosted offering for operational simplicity with no infrastructure to run or maintain, positions self-hosted environments for teams whose network, tooling, or compliance requirements call for keeping agent execution on infrastructure they control, and adds that teams going that route should plan to staff engineering to own setup and ongoing maintenance. Read that as a staffing line item, not a footnote. If you have already looked at running Claude in your own perimeter, our earlier write-up of production patterns for self-hosted Claude sandboxes covers the operational side in more depth.
03 — Cross-Session MessagingText moves. Nothing else does.
The single most important sentence in the cross-session messaging docs is the narrowest one: “A message is a piece of text one Claude writes to another, never conversation history or files.” To move a whole conversation or its context, you resume the session instead. Independent press coverage read the docs the same way — only text passes between sessions, not conversation history, files, or permissions.
That constraint is what keeps the feature comprehensible. ListAgents discovers sessions; SendMessage sends text to one. It is the same SendMessage tool Claude already uses for subagents and for agent-team teammates inside a single session — cross-session messaging is a new use of an existing tool, not a new tool. Which makes the disambiguation worth stating plainly: this article is about messaging between independent sessions you start and steer yourself, not about Claude-spawned agent teams or in-session subagents. If your interest is coordinating parallel workers rather than parallel humans, the producer-consumer patterns for coordinating parallel agents are the better starting point.
Unix domain socket
Two sessions on one machine talk over a per-session Unix domain socket on disk. Discovery works by reading registration files, which is exactly why a session inside a container and a session on the host cannot see each other.
Via Remote Control
Cross-machine messages travel through Anthropic servers and arrive over the receiving machine's Remote Control connection. Different transport, different trust boundary, and worth knowing before you assume messaging is purely local.
Cloud partner surfaces
Cross-session messaging is not available on Amazon Bedrock, Claude Platform on AWS, Google Cloud's Agent Platform, or Microsoft Foundry — the same first-party-only restriction pattern as self-hosted environments' inference routing.
/compact or any other slash command inside a message’s text arrives as plain text and is never executed by the receiving session.That instruction is a model-level behaviour rather than an enforcement boundary, and it is worth reading as such — it stops the obvious pattern of one session asking another to do the thing its own permission settings forbid, which is exactly the escalation path you would probe first. The hard boundaries live in the delivery logic below, not in the instruction.
04 — Delivery MatrixDelivered, held, or refused.
Delivery has three outcomes rather than two. Delivered means the message is passed to Claude. Held means it is set aside until you approve it, or until a settings or mode change allows it. Refused means it is dropped with no delivery. Which one applies depends first on the receiving session’s crossSessionInbound setting, and — when no explicit value applies — on the permission mode class of both sender and receiver. Bypass-permissions sessions form one class; everything else, including auto mode, forms the other.
The docs state the bypass case explicitly: “The receiving session bypasses permission prompts: Claude Code holds each message for your approval. It delivers one only when the sending session identifies itself as also bypassing.” The changelog puts the same logic more tersely — messages into a bypassed session are held for your approval, and messages to other sessions auto-deliver. Cross-multiplied into the four sender and receiver combinations a team running parallel sessions will actually hit, it looks like this.
| Sending session | Receiving session | Default outcome | What the receiver controls |
|---|---|---|---|
| Receiver prompts for permissions — the ordinary case | |||
| Prompts for permissions (includes auto mode) | Prompts for permissions | Delivered. Messages to sessions that are not bypassing auto-deliver. | An explicit crossSessionInbound value on the receiver overrides the default; crossSessionInbound: "refuse" drops inbound messages outright. |
| Bypasses permissions | Prompts for permissions | Delivered. The receiver is not the bypassing side, so the hold rule does not trigger. | Same override. Worth noting the asymmetry: the sender’s mode does not gate delivery into a prompting session. |
| Receiver bypasses permissions — the case the settings exist for | |||
| Prompts for permissions (includes auto mode) | Bypasses permissions | Held. Claude Code holds the message for your approval; it delivers only when the sender identifies itself as also bypassing. | dialogExpiry, default five minutes — an unanswered approval dialog auto-closes and the message is dropped, not silently delivered. |
| Bypasses permissions | Bypasses permissions | Delivered. The sending session identifies itself as also bypassing, which is the condition the docs name for delivery. | This is the combination to think hardest about. crossSessionInbound: "refuse" is the blunt instrument if you do not want it. |
The docs describe this logic in prose across two sections plus a smaller settings table; cross-multiplying it into the four combinations is our synthesis, not a table Anthropic publishes. The useful read is the asymmetry. The gate is on the receiving side, and it is the receiver bypassing permissions — not the sender — that triggers the hold. A carefully-sandboxed sender talking to a bypassing receiver is the dangerous direction, and it is precisely the one the default catches.
Per session, then oldest dropped
Held messages sit in a queue separate from normal delivery. Past 100 the oldest is dropped rather than the newest refused, so a flood degrades the front of the queue first.
Accepted but not yet read
Messages that were accepted and are waiting to be read are capped separately. Identical repeats arriving in a short window are dropped outright.
Default approval window
An unanswered held-message approval dialog auto-closes and the message is dropped. The fail state is loss, not delivery — the right direction for a safety default.
The docs frame those caps explicitly as throttling — the mechanism that stops a message loop between two sessions from running away on its own. That is a candid admission about the failure mode of any agent-to-agent channel: two enthusiastic agents will ping-pong forever unless something stops them, and it is better for that something to be a documented cap than an emergent one. There is one further control worth knowing: isolatePeerMachines forces your explicit approval before any reply leaves the machine, and it holds even in bypassPermissions mode, which otherwise skips ordinary permission prompts entirely. Cross-session messaging safeguards are among the short list of checks that bypassing does not remove.
If you need the feature gone entirely, an org admin can combine a managed-settings permission deny rule for SendMessage and ListAgents with crossSessionInbound: "refuse". One caveat the docs raise themselves: this leaves no visible trace in the session’s own /status or in other sessions’ listings, so an admin has to check the setting directly to confirm it is active. A control you cannot observe from the client is a control you will eventually wonder about.
05 — The Next Day2.1.225 loosened the cross-machine rule.
Anyone who read only the 2.1.224 entry has an incomplete picture, and the gap is exactly one day wide. As shipped in 2.1.224, cross-machine messaging was reply-only. The docs put it flatly: “Across machines, Claude can only reply. It can’t start the exchange.” A session could answer a message that arrived from one of your sessions on another machine or from Claude Code on the web, but it could not open the conversation.
2.1.225, dated August 8, 2026, partially lifted that. The entry: “SendMessage can now start a conversation with your Remote Control sessions on other machines by name (ListAgents shows them as name [ref]), instead of only replying after they message you first.” Note the scoping — Remote Control sessions specifically, addressed by name, discovered through ListAgents. It is a real loosening of the reply-only constraint, not a blanket removal of it.
claude agents matching the existing claude prompt. It also fixed a self-hosted-runner failure mode worth knowing about if you are deploying this week: the runner would register and then fail every session when --base-dir could not be created, and now exits at startup with a clear error instead. 2.1.226, also dated August 8, was bug fixes and reliability improvements only — no new features.One more 2.1.224 fix belongs in the same paragraph, because it affects whether you can trust what a session tells you: SendMessage had been reporting “Message sent” in cases where the write to a teammate’s inbox had actually failed. Failed deliveries are now reported as errors.
06 — Fan-OutThe cap is gone. The limits are not.
The entry is one sentence and every clause matters: “Removed the 200-subagent-per-session spawn cap; long-running sessions no longer refuse new agents (concurrency and depth limits still apply).” The problem it solves is specific — a session that runs long enough to spawn two hundred agents was hitting a wall and refusing to start new work, which is a poor failure mode for exactly the long-horizon autonomous runs the product is being pushed toward.
What the entry does not do is tell you what replaced it. The parenthetical confirms concurrency and depth limits survive; it names neither. That is an unusual amount of restraint for a changelog, and it is the single most likely place for a confident wrong number to enter circulation. We are not going to supply one. Claude Code’s concurrency and depth caps have moved more than once — we covered an earlier round of them when Claude Code put guardrails on its own agent fleets — so treat any figure you see quoted for the post-2.1.224 limits as unsourced until a changelog or docs page states it.
07 — CounterweightA sandbox is a config you must test, not a checkbox.
Buried in the same release is the line that should shape how you read everything above: “Fixed sandbox filesystem deny entries written with a trailing slash (e.g. denyRead: "~/.aws/") being silently bypassable on Linux and macOS.” Past tense. This was fixed in 2.1.224 and is not a live issue — but the shape of the bug is the lesson.
The sandbox’s filesystem layer defaults to allowing reads everywhere except explicitly denied paths, which includes credential files like ~/.aws/credentials and ~/.ssh/ unless you add them to denyRead or the dedicated credentials block. So a deny entry that silently failed to match did not produce an error, a warning, or a broken build. It produced a file that stayed readable while your config said it was denied. The failure was invisible from the side that mattered.
That is the argument for testing sandbox configuration rather than declaring it. Write the rule, then have something attempt the read and confirm it is refused. Every team that had a denyRead line with a trailing slash believed they were covered, and the config file agreed with them. We have written before about how sandbox escapes via worktrees and symlinks defeat rules that look airtight on paper, and the broader sandboxing and isolation patterns for coding agents piece covers the verification habit in more detail.
Violation details now visible
Sandbox violation details never appeared in Bash tool results before this release. Claude now sees which file or network access was denied and why — previously a denied command simply failed, opaquely, from the model's perspective.
Not self-overridable
The new extract, JWT-decode and AWS SigV4 masking options are honored only from user settings, managed settings, or the --settings flag. A repository's own .claude/settings.json cannot set them — a deliberate anti-self-escalation design.
tlsTerminate is experimental
Masking requires network.tlsTerminate because the proxy has to see and rewrite request contents. The docs describe TLS termination as experimental and note that by default the sandbox does not terminate or inspect TLS. Misconfiguration surfaces at startup rather than leaking silently.
One scope boundary before anyone treats the sandbox as the answer to distributed execution: sandboxing isolates Bash subprocesses only. Read, Edit, and Write use the permission system directly, and computer use runs on the actual desktop. The docs themselves say sandboxing reduces risk but is not a complete isolation boundary. macOS uses Apple’s Seatbelt; Linux and WSL2 use bubblewrap; native Windows is not supported, which is the same platform line that constrains cross-session messaging.
08 — Prior ArtNarrower than A2A, and honestly so.
“Agents can talk to each other” is a headline that invites a comparison to Google’s Agent2Agent protocol, and the comparison is worth making precisely because the two are different kinds of thing. The juxtaposition below is our framing — neither vendor draws it — but both halves are separately documented.
Claude Code cross-session
Your own sessions, on your own machines, under one account. No formal wire protocol, no capability-discovery document, no cross-organisation delegation. ListAgents enumerates what you already own. That is the whole scope, and it is a coherent one.
Google’s A2A protocol
An open wire protocol designed so agents built on different frameworks by different organisations can delegate tasks without ad-hoc integration code, with a machine-readable Agent Card for discovery. Google transferred the spec and SDKs to the Linux Foundation in June 2025.
The honest conclusion is that Claude Code did not ship a competitor to A2A and does not appear to have tried. It shipped a same-account primitive that solves a smaller, more immediate problem: you have four sessions open across two machines and you want one to tell another something. No capability negotiation is needed because you already know what your own sessions can do. The interesting question is whether the narrow primitive stays narrow — a discovery mechanism plus a message channel plus an identity notion is most of what a protocol needs, and the 2.1.225 addressing-by-name change is a step in that direction rather than away from it.
09 — AdoptionWhat to actually do with this.
The release lands a week before Claude Code’s permission defaults change, which is not a coincidence a team should ignore: from August 14, new sessions on Pro, Max and Team run in auto mode by default, which we cover in Claude Code’s permission-model default flip. Auto mode sits in the non-bypassing class for delivery purposes, so it does not change the hold behaviour — but a fleet whose default posture is shifting is a fleet worth auditing before you add a message channel to it. The parallel-execution story is also moving: the worktree-isolation pattern every agent CLI converged on is the other half of running several agents at once without them standing on each other.
Try messaging, skip the runners
Cross-session messaging is genuinely useful with two or three sessions open on one macOS or Linux box, and same-machine messages never leave the disk. Self-hosted environments are Team and Enterprise only, so they are not on the menu.
Set crossSessionInbound before you need it
If anyone on the team runs sessions with bypassed permissions, decide the inbound policy now rather than the first time an approval dialog appears mid-run. Remember dialogExpiry defaults to five minutes and an unanswered dialog drops the message.
Cost the staffing, not just the compute
Anthropic recommends its hosted offering for most enterprises and says self-hosted environments call for staffing engineering to own setup and ongoing maintenance. Add the autoscaling orchestrator to that estimate if you plan to run one, and confirm GitHub-only checkout and the ZDR exclusion fit your constraints.
Re-test your deny rules
The trailing-slash bug is fixed, but the habit it exposes is not. Write a deny rule, then have something attempt the access and confirm refusal. Sandbox violation details now reach Bash tool results, which makes that verification loop meaningfully easier than it was.
Looking forward, the thing to watch is not whether more sessions can talk to each other — that direction is now obvious. It is whether the observability catches up. A distributed system with an unpublished concurrency limit and a control that leaves no trace in /status is a system that will be operationally hard to reason about at scale. The safeguards Anthropic shipped are thoughtful; what is thin so far is the instrumentation that would let a platform team prove any of them are working. If you are formalising how agent fleets get governed inside your organisation, that gap is where the policy work goes, and it is the starting point for most of our AI and digital transformation engagements.
10 — ConclusionA single-session tool grows edges.
The capability line is the headline. The settings line is the story.
Read as a changelog, 2.1.224 is three capability bullets, two settings and a sandbox fix. Read as architecture, it is Claude Code acquiring the pieces a distributed system needs: execution targets on your own hardware, a discovery mechanism, a message channel between independent sessions, and a fan-out budget that no longer hard-stops at two hundred. Each piece is scoped more tightly than the headline suggests — Team and Enterprise, public beta, macOS and Linux, text only — and that tight scoping is a feature, not a limitation to work around.
The part worth carrying is the pairing. Cross-session messaging shipped with crossSessionInbound, a five-minute dialogExpiry default, per-session throttles, and an explicit statement that a message can never approve an action or execute a command. Those are not afterthoughts bolted on for a security review; they are the shape of a feature designed by people who had already imagined a message arriving in a session that would act on it without asking. Most agent-to-agent plumbing does not arrive that way.
And then the trailing-slash sandbox fix, in the same release, as the corrective. A deny rule that looked right, read right, and silently did nothing is the best available argument that safeguards are configuration you have to test rather than checkboxes you get to tick. The more places Claude Code runs, and the more sources a running session hears from, the more that argument matters. Write the rule, attempt the access, confirm the refusal — then wire the sessions together.