# Changelog

All notable changes to the `pi-intercom` extension will be documented in this file.

## [Unreleased]

## [0.9.43] - 2026-10-24

### Fixed

- Fixed `Intercom event relay failed (atomic:workflow-pending-stage-route): Intercom runtime no longer active` appearing in the session after a local workflow worker died and its child was replayed. Route updates that arrive while a run's previous route connection is still closing or opening, as they do when the run's route is replaced, no longer race each other: the newest route is registered over one connection and an update the replacement made obsolete ends quietly. A route connection abandoned because the session itself shut down is still reported ([#3887](https://github.com/bastani-inc/atomic/issues/3887))

## [0.9.43-alpha.1] - 2026-10-24

### Fixed

- Fixed `Intercom event relay failed (atomic:workflow-pending-stage-route): Intercom runtime no longer active` appearing in the session after a local workflow worker died and its child was replayed. Route updates that arrive while a run's previous route connection is still closing or opening, as they do when the run's route is replaced, no longer race each other: the newest route is registered over one connection and an update the replacement made obsolete ends quietly. A route connection abandoned because the session itself shut down is still reported ([#3887](https://github.com/bastani-inc/atomic/issues/3887))

## [0.9.42] - 2026-10-23

### Added

- `intercom({ action: "status" })` reports the broker's multi-node routing state, for example `Multi-node routing: on (adapter @bastani/atomic-storage-libsql, prefix none), 1 peer broker live (build-host)`, or why it is off or unavailable ([#3857](https://github.com/bastani-inc/atomic/issues/3857))
- The broker writes a positive line to `broker.log` when it starts: `Intercom multi-node routing is on (adapter <adapter>, prefix <prefix>)`, or `Intercom multi-node routing is off: <reason>`, also for an absent, in-memory, or domain-only selection, so a log without errors is no longer ambiguous ([#3856](https://github.com/bastani-inc/atomic/issues/3856), [#3857](https://github.com/bastani-inc/atomic/issues/3857))
- The broker answers status and shutdown requests from `atomic storage status`, `atomic intercom status`, and `atomic intercom restart`: its storage selection, sessions, multi-node state, and the other brokers live in the shared database. A restart lets connected sessions reconnect to a broker that reads the current storage selection, without closing them ([#3857](https://github.com/bastani-inc/atomic/issues/3857))

### Fixed

- Fixed Intercom remaining stuck on a broker that accepts connections but stops answering. New brokers monitor their own request handling and terminate after about a minute of failed health checks so clients can start one replacement. Timed-out client requests also check connection health before entering reconnect recovery, without restarting a responsive broker. Identical in-flight sends keep sharing one result through the health check. A bounded previous broker log and the latest watchdog diagnosis survive replacement ([#3862](https://github.com/bastani-inc/atomic/issues/3862)).
- Restarting an older broker on Windows no longer mistakes a lingering named pipe for a restarted broker after its process has exited ([#3857](https://github.com/bastani-inc/atomic/issues/3857))

## [0.9.42-alpha.1] - 2026-10-23

### Added

- `intercom({ action: "status" })` reports the broker's multi-node routing state, for example `Multi-node routing: on (adapter @bastani/atomic-storage-libsql, prefix none), 1 peer broker live (build-host)`, or why it is off or unavailable ([#3857](https://github.com/bastani-inc/atomic/issues/3857))
- The broker writes a positive line to `broker.log` when it starts: `Intercom multi-node routing is on (adapter <adapter>, prefix <prefix>)`, or `Intercom multi-node routing is off: <reason>`, also for an absent, in-memory, or domain-only selection, so a log without errors is no longer ambiguous ([#3856](https://github.com/bastani-inc/atomic/issues/3856), [#3857](https://github.com/bastani-inc/atomic/issues/3857))
- The broker answers status and shutdown requests from `atomic storage status`, `atomic intercom status`, and `atomic intercom restart`: its storage selection, sessions, multi-node state, and the other brokers live in the shared database. A restart lets connected sessions reconnect to a broker that reads the current storage selection, without closing them ([#3857](https://github.com/bastani-inc/atomic/issues/3857))

### Fixed

- Fixed Intercom remaining stuck on a broker that accepts connections but stops answering. New brokers monitor their own request handling and terminate after about a minute of failed health checks so clients can start one replacement. Timed-out client requests also check connection health before entering reconnect recovery, without restarting a responsive broker. Identical in-flight sends keep sharing one result through the health check. A bounded previous broker log and the latest watchdog diagnosis survive replacement ([#3862](https://github.com/bastani-inc/atomic/issues/3862)).
- Restarting an older broker on Windows no longer mistakes a lingering named pipe for a restarted broker after its process has exited ([#3857](https://github.com/bastani-inc/atomic/issues/3857))

## [0.9.41] - 2026-10-22

### Changed

- Workflow route updates cost the Intercom broker far less when many runs are active. The broker now acknowledges each route registration itself instead of the session listing the previous version requested after every update, and each run's route connection retries on its own backoff, with limited concurrency, instead of all of them reconnecting at once. A workflow stage that starts while its run's route connection is waiting to retry waits for that retry rather than failing, and a retry that fails is retried by the stage like any other connection timeout. Mixed versions keep working: with an older broker the session listing is still used, and older sessions work with the new broker.

### Fixed

- `intercom list` with a `group` that names a workflow invocation group you are not a member of no longer reports `No sessions or workflow stages in this group.` The group is visible only to its members, so the peek now says that and tells you to `intercom join` it to see its stages, instead of looking like a run whose stages had all disappeared.
- Fixed `Intercom event relay failed (atomic:workflow-pending-stage-route): Connection timeout` repeating for every route update when 50 or more workflows ran at once. A broker that is slow to answer a connection is now a recoverable condition that background relays retry quietly. A broker that stays unresponsive for a minute is reported once, and Intercom tool calls you make still report the failure.
- Fixed a single workflow run's route connection failing to connect and dropping the session's healthy Intercom connection, which re-created every run's connection at the same time.

## [0.9.41-alpha.1] - 2026-10-21

### Changed

- Workflow route updates cost the Intercom broker far less when many runs are active. The broker now acknowledges each route registration itself instead of the session listing the previous version requested after every update, and each run's route connection retries on its own backoff, with limited concurrency, instead of all of them reconnecting at once. A workflow stage that starts while its run's route connection is waiting to retry waits for that retry rather than failing, and a retry that fails is retried by the stage like any other connection timeout. Mixed versions keep working: with an older broker the session listing is still used, and older sessions work with the new broker.

### Fixed

- `intercom list` with a `group` that names a workflow invocation group you are not a member of no longer reports `No sessions or workflow stages in this group.` The group is visible only to its members, so the peek now says that and tells you to `intercom join` it to see its stages, instead of looking like a run whose stages had all disappeared.
- Fixed `Intercom event relay failed (atomic:workflow-pending-stage-route): Connection timeout` repeating for every route update when 50 or more workflows ran at once. A broker that is slow to answer a connection is now a recoverable condition that background relays retry quietly. A broker that stays unresponsive for a minute is reported once, and Intercom tool calls you make still report the failure.
- Fixed a single workflow run's route connection failing to connect and dropping the session's healthy Intercom connection, which re-created every run's connection at the same time.

## [0.9.40] - 2026-10-20

### Added

- Added multi-node routing: Intercom brokers on different machines that select the same shared `storage` (in settings, `ATOMIC_STORAGE`, or `--storage`) now deliver messages to each other through that database. A message to a session on another machine arrives exactly like a local one, with the same sender identity, replies and asks, group rules, supervisor routes and save-before-delivered receipts. A send to a session that is offline, including one that quit cleanly in the last 7 days, is reported as queued for an offline session and delivered when it reconnects on any broker. Brokers coordinate only through the shared database and a polled wake-up signal; there is no broker-to-broker network connection. Without a shared `storage` selection, Intercom behaves as before.

### Fixed

- On resume, Intercom messages interrupted by an exit are replayed only if their sender is connected again. Messages from a peer that is gone no longer start a hidden turn: they appear once as history in a visible notice that tells the agent the peer is gone. A resumed session that used Intercom re-registers right away. A resumed session or restored background subagent also keeps the Intercom session ID it had before the restart (unless a live session holds it), so peers can reach it by its name, by that ID, or by its Atomic session ID instead of getting `Session not found` ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
- Intercom now keeps an interrupted workflow run's targets with the restarted session that launched the run, so messages sent before `/workflow resume` are queued instead of failing with `Session not found`. If another session resumes the run, it takes over those targets, and the restarted session stops answering for the run ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
- A `send` or `ask` to a background subagent that its restarted owner has not restored yet now waits for it, whoever sends it: the session that owns it, a sibling subagent, a workflow stage, or another session in the subagent's group. This applies whether the message is addressed by the subagent's name, its Atomic session ID, or the Intercom session ID it had before the restart. The wait starts when the owning session starts, not only once its recovery has restored the subagent, and recovery takes the wait over without dropping or repeating a message. For the subagents of an interrupted workflow run's stages, the session that launched the run holds them while the run waits for `/workflow resume`, and the resumed stage takes the hold over, so a message sent in that interval is delivered once after the subagent reconnects. Waiting messages are delivered once each, in the order each sender sent them, as soon as the subagent registers again, and each sender gets its usual confirmation. A message still waiting after 20 seconds gets a "still being restored, try again" error; the owning session is told instead when the subagent was relaunched but has not reconnected. If the subagent did not survive the restart, waiting and later messages get an explicit "did not survive the restart and is gone" error instead of `Session not found`; senders other than the owner get it while the owning session stays connected to Intercom. If another Atomic session resumes the run, the messages waiting for its subagents get an error saying so. If the owning session disconnects, waiting messages get `Session not found`; a wait that nothing restores also ends after 60 seconds. Messages to a subagent while no Atomic process of its owner is running are not queued and get `Session not found` ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
- If Intercom cannot be reached when a session resumes, its interrupted Intercom messages are no longer discarded or attributed to peers that are gone. They stay pending without starting a turn, one notice says that Intercom was unreachable and the deliveries were deferred, and the next resume decides about them again. The same applies to messages from a background subagent that was relaunched but has not re-registered with Intercom yet: they are deferred, not dropped, and the subagent is not reported as gone ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
- Intercom messages that reach a busy session are no longer lost if that session is killed or crashes before it goes idle. The recipient saves each message to its session when it arrives, and the sender sees `delivered` only after that save. Resuming the session with `atomic --session <id>` or `/resume` shows every saved message it never showed or otherwise handled (a reply already returned to a waiting `ask` or a message it refused is not shown again), once each and in arrival order, after the transcript appears. Saved messages pass the same sender check as interrupted Intercom deliveries: only a message whose sender is connected again starts a turn; a message from a sender that is gone is added once, in full, to the session history without starting a turn, and the recovery notice says the sender is gone. A message whose sender cannot be checked is deferred until the session is opened again: Intercom was unreachable, or the sender is a relaunched subagent that has not reconnected yet. When the recipient does not confirm the save in time, the sender gets an explicit failure saying the outcome is uncertain instead of a false `delivered`, and a recipient that reconnects before confirming receives the message again without showing it twice, and its answer to an `ask` still reaches the waiting sender. Recipients from earlier Atomic versions keep the previous behavior, and so does an Intercom broker from an earlier version that is still running after an upgrade: upgraded sessions keep working with it and still save each message on arrival. Sessions started with `--no-session` are still not saved ([#3761](https://github.com/bastani-inc/atomic/issues/3761)).

## [0.9.40-alpha.1] - 2026-10-20

### Added

- Added multi-node routing: Intercom brokers on different machines that select the same shared `storage` (in settings, `ATOMIC_STORAGE`, or `--storage`) now deliver messages to each other through that database. A message to a session on another machine arrives exactly like a local one, with the same sender identity, replies and asks, group rules, supervisor routes and save-before-delivered receipts. A send to a session that is offline, including one that quit cleanly in the last 7 days, is reported as queued for an offline session and delivered when it reconnects on any broker. Brokers coordinate only through the shared database and a polled wake-up signal; there is no broker-to-broker network connection. Without a shared `storage` selection, Intercom behaves as before.

### Fixed

- On resume, Intercom messages interrupted by an exit are replayed only if their sender is connected again. Messages from a peer that is gone no longer start a hidden turn: they appear once as history in a visible notice that tells the agent the peer is gone. A resumed session that used Intercom re-registers right away. A resumed session or restored background subagent also keeps the Intercom session ID it had before the restart (unless a live session holds it), so peers can reach it by its name, by that ID, or by its Atomic session ID instead of getting `Session not found` ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
- Intercom now keeps an interrupted workflow run's targets with the restarted session that launched the run, so messages sent before `/workflow resume` are queued instead of failing with `Session not found`. If another session resumes the run, it takes over those targets, and the restarted session stops answering for the run ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
- A `send` or `ask` to a background subagent that its restarted owner has not restored yet now waits for it, whoever sends it: the session that owns it, a sibling subagent, a workflow stage, or another session in the subagent's group. This applies whether the message is addressed by the subagent's name, its Atomic session ID, or the Intercom session ID it had before the restart. The wait starts when the owning session starts, not only once its recovery has restored the subagent, and recovery takes the wait over without dropping or repeating a message. For the subagents of an interrupted workflow run's stages, the session that launched the run holds them while the run waits for `/workflow resume`, and the resumed stage takes the hold over, so a message sent in that interval is delivered once after the subagent reconnects. Waiting messages are delivered once each, in the order each sender sent them, as soon as the subagent registers again, and each sender gets its usual confirmation. A message still waiting after 20 seconds gets a "still being restored, try again" error; the owning session is told instead when the subagent was relaunched but has not reconnected. If the subagent did not survive the restart, waiting and later messages get an explicit "did not survive the restart and is gone" error instead of `Session not found`; senders other than the owner get it while the owning session stays connected to Intercom. If another Atomic session resumes the run, the messages waiting for its subagents get an error saying so. If the owning session disconnects, waiting messages get `Session not found`; a wait that nothing restores also ends after 60 seconds. Messages to a subagent while no Atomic process of its owner is running are not queued and get `Session not found` ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
- If Intercom cannot be reached when a session resumes, its interrupted Intercom messages are no longer discarded or attributed to peers that are gone. They stay pending without starting a turn, one notice says that Intercom was unreachable and the deliveries were deferred, and the next resume decides about them again. The same applies to messages from a background subagent that was relaunched but has not re-registered with Intercom yet: they are deferred, not dropped, and the subagent is not reported as gone ([#3760](https://github.com/bastani-inc/atomic/issues/3760)).
- Intercom messages that reach a busy session are no longer lost if that session is killed or crashes before it goes idle. The recipient saves each message to its session when it arrives, and the sender sees `delivered` only after that save. Resuming the session with `atomic --session <id>` or `/resume` shows every saved message it never showed or otherwise handled (a reply already returned to a waiting `ask` or a message it refused is not shown again), once each and in arrival order, after the transcript appears. Saved messages pass the same sender check as interrupted Intercom deliveries: only a message whose sender is connected again starts a turn; a message from a sender that is gone is added once, in full, to the session history without starting a turn, and the recovery notice says the sender is gone. A message whose sender cannot be checked is deferred until the session is opened again: Intercom was unreachable, or the sender is a relaunched subagent that has not reconnected yet. When the recipient does not confirm the save in time, the sender gets an explicit failure saying the outcome is uncertain instead of a false `delivered`, and a recipient that reconnects before confirming receives the message again without showing it twice, and its answer to an `ask` still reaches the waiting sender. Recipients from earlier Atomic versions keep the previous behavior, and so does an Intercom broker from an earlier version that is still running after an upgrade: upgraded sessions keep working with it and still save each message on arrival. Sessions started with `--no-session` are still not saved ([#3761](https://github.com/bastani-inc/atomic/issues/3761)).

## [0.9.39] - 2026-10-19

### Added

- A workflow stage whose session was released from memory when its run ended stays in the session list under its previous name, as `closed · reply: post-mortem only`, while the session that ran the workflow is open. An ask to it reopens the stage's saved conversation, runs one turn with the question, and returns that turn's answer, or a failure if the conversation cannot be reopened; a plain send reaches the session that ran the workflow ([#3622](https://github.com/bastani-inc/atomic/issues/3622) by [@vishnu363728](https://github.com/vishnu363728)).

## [0.9.39-alpha.1] - 2026-10-19

### Added

- A workflow stage whose session was released from memory when its run ended stays in the session list under its previous name, as `closed · reply: post-mortem only`, while the session that ran the workflow is open. An ask to it reopens the stage's saved conversation, runs one turn with the question, and returns that turn's answer, or a failure if the conversation cannot be reopened; a plain send reaches the session that ran the workflow ([#3622](https://github.com/bastani-inc/atomic/issues/3622) by [@vishnu363728](https://github.com/vishnu363728)).

## [0.9.38] - 2026-10-18

### Fixed

- Fixed queued workflow instructions being blocked by broker warm-up during model fallback. Stored instructions are admitted before connecting, including sticky messages for replacement sessions ([#3628](https://github.com/bastani-inc/atomic/issues/3628)).
- Intercom tools now await session records before reporting success or clearing pending replies. Failed commits reach the existing error handling, including local subagent relay diagnostics.
- Session-list and compose overlays now close when reload or shutdown begins instead of keeping their commands pending.
- Compose sends already in progress now finish delivery and save exactly one sent-message record even when reload or shutdown dismisses the overlay.
- Fixed retries of answered Intercom asks reopening pending reply routes and allowing a second distinct reply ([#3666](https://github.com/bastani-inc/atomic/issues/3666)).

## [0.9.38-alpha.6] - 2026-10-16

### Fixed

- Intercom tools now await session records before reporting success or clearing pending replies. Failed commits reach the existing error handling, including local subagent relay diagnostics.
- Session-list and compose overlays now close when reload or shutdown begins instead of keeping their commands pending.
- Compose sends already in progress now finish delivery and save exactly one sent-message record even when reload or shutdown dismisses the overlay.
- Fixed retries of answered Intercom asks reopening pending reply routes and allowing a second distinct reply ([#3666](https://github.com/bastani-inc/atomic/issues/3666)).

## [0.9.38-alpha.5] - 2026-10-16

### Fixed

- Fixed queued workflow instructions being blocked by broker warm-up during model fallback. Stored instructions are admitted before connecting, including sticky messages for replacement sessions ([#3628](https://github.com/bastani-inc/atomic/issues/3628)).

## [0.9.28] - 2026-10-08

### Fixed

- Fixed a slow-starting intercom broker taking over a live broker's socket, which left a connected session unreachable by `intercom list` and `send`, so messages to it were silently not delivered ([#3505](https://github.com/bastani-inc/atomic/issues/3505)).
- Fixed intercom occasionally reporting `Intercom not connected: connect ENOENT …/broker.sock` when a session connected just as an idle broker was shutting down.

## [0.9.28-alpha.5] - 2026-10-08

### Fixed

- Fixed a slow-starting intercom broker taking over a live broker's socket, which left a connected session unreachable by `intercom list` and `send`, so messages to it were silently not delivered ([#3505](https://github.com/bastani-inc/atomic/issues/3505)).

## [0.9.28-alpha.1] - 2026-10-05

### Fixed

- Fixed intercom occasionally reporting `Intercom not connected: connect ENOENT …/broker.sock` when a session connected just as an idle broker was shutting down.

## [0.9.27] - 2026-10-05

### Fixed

- Fixed joined workflow groups being lost when extensions reload, including when retiring cleanup fails ([#3425](https://github.com/bastani-inc/atomic/issues/3425)).

## [0.9.27-alpha.1] - 2026-10-04

### Fixed

- Fixed joined workflow groups being lost when extensions reload, including when retiring cleanup fails ([#3425](https://github.com/bastani-inc/atomic/issues/3425)).

## [0.9.26] - 2026-10-04

### Fixed

- Fixed sticky workflow messages disappearing during stage startup, and added per-stage delivery and skip results to `intercom list` so retained future-message counts cannot be mistaken for receipt by every stage ([#3406](https://github.com/bastani-inc/atomic/issues/3406)).

## [0.9.26-alpha.4] - 2026-10-02

### Fixed

- Fixed sticky workflow messages disappearing during stage startup, and added per-stage delivery and skip results to `intercom list` so retained future-message counts cannot be mistaken for receipt by every stage ([#3406](https://github.com/bastani-inc/atomic/issues/3406)).

## [0.9.20] - 2026-09-24

### Added

- Intercom session targets now accept a unique 8-character hexadecimal UUID prefix within the sender's authorized group scope; collisions report every matching full UUID instead of selecting a session by ordering ([#2603](https://github.com/bastani-inc/atomic/issues/2603)).

### Changed

- The `intercom` skill adds a peer-coordination pattern for subagents and workflow stages that share a group, covering connect, coordinate, learn, and debate exchanges alongside the existing supervisor-escalation patterns.

### Fixed

- Admitted subagent children now connect to Intercom when their session starts instead of on their own first Intercom call, so a working child launched from a workflow stage or main chat appears in `intercom list` and can be steered with `send`/`ask` from its supervisor and peers even if it never uses Intercom itself. A recoverable broker disconnect during that warm-up no longer aborts the child's launch; the child falls back to connecting lazily.
- Workflow-stage live route refusals now name the condition that failed — no registered workflow owner, capability mismatch, registrant outside the invocation group, non-agent stage key, or a genuine duplicate live owner — instead of reporting every case as `Live workflow-stage route is owned by another active session`. Each refusal carries a machine-readable `code` ([#3163](https://github.com/bastani-inc/atomic/issues/3163)).
- A stage that starts while its workflow owner is re-registering after a reconnect, or while the previous attempt's session is still being torn down, now recovers through the bounded warm-up retry instead of failing extension startup. Genuine duplicate live owners are still refused on every attempt; authority and configuration mismatches remain terminal ([#3163](https://github.com/bastani-inc/atomic/issues/3163)).
- A stage name reused by a later occurrence in the same run (for example `reviewer-a` in a second review round while the first round's completed session is still connected) no longer collides as a duplicate owner. The later stage registers under its stage id, and the ambiguous name keeps no live alias for either occurrence, so it routes through the workflow owner instead of reaching the earlier round ([#3163](https://github.com/bastani-inc/atomic/issues/3163)).
- The bundled `intercom` skill's optional cmux/tmux peer-launch examples now start `atomic` instead of `pi`, and the troubleshooting step refers to Atomic's bundled Intercom extension ([#3180](https://github.com/bastani-inc/atomic/issues/3180)).
- UUID-prefix targeting now keeps reply discovery within authorized relationships, resolves pending ask UUID prefixes before reply fallback, and accepts an isolated child's authorized supervisor prefix ([#2603](https://github.com/bastani-inc/atomic/issues/2603)).
- Explicit reply names and full session IDs keep their original identity through broker collision checks, unique UUID prefixes still canonicalize to the stored session ID, and hidden same-name collisions refuse regardless of letter case ([#2603](https://github.com/bastani-inc/atomic/issues/2603)).
- Canonicalized Intercom UUID-prefix sends revalidate the original selector against the broker's current authorized sessions, so a newly visible same-prefix UUID, exact name, or custom ID refuses instead of delivering to the previously unique identity ([#2603](https://github.com/bastani-inc/atomic/issues/2603)).
- Prefix ambiguity refusals no longer include unauthorized or hidden session names when a canonicalized UUID-prefix send is rejected ([#2603](https://github.com/bastani-inc/atomic/issues/2603)).
- Workflow children keep separate pending-ask lists from their parent stage and siblings. Stage replacement still preserves the stage's own pending asks ([#3105](https://github.com/bastani-inc/atomic/issues/3105)).
- Configuration, relay and disconnect diagnostics within SDK-owned work now use redacted session diagnostics instead of console output ([#3105](https://github.com/bastani-inc/atomic/issues/3105)).
- Supervisor progress updates show their original send timestamp and are labelled historical snapshots, so delayed hypotheses cannot be mistaken for current activity after a correction or final result ([#3039](https://github.com/bastani-inc/atomic/issues/3039)).

## [0.9.20-alpha.6] - 2026-09-22

### Fixed

- Admitted subagent children now connect to Intercom when their session starts instead of on their own first Intercom call, so a working child launched from a workflow stage or main chat appears in `intercom list` and can be steered with `send`/`ask` from its supervisor and peers even if it never uses Intercom itself. A recoverable broker disconnect during that warm-up no longer aborts the child's launch; the child falls back to connecting lazily.
- Workflow-stage live route refusals now name the condition that failed — no registered workflow owner, capability mismatch, registrant outside the invocation group, non-agent stage key, or a genuine duplicate live owner — instead of reporting every case as `Live workflow-stage route is owned by another active session`. Each refusal carries a machine-readable `code` ([#3163](https://github.com/bastani-inc/atomic/issues/3163)).
- A stage that starts while its workflow owner is re-registering after a reconnect, or while the previous attempt's session is still being torn down, now recovers through the bounded warm-up retry instead of failing extension startup. Genuine duplicate live owners are still refused on every attempt; authority and configuration mismatches remain terminal ([#3163](https://github.com/bastani-inc/atomic/issues/3163)).
- A stage name reused by a later occurrence in the same run (for example `reviewer-a` in a second review round while the first round's completed session is still connected) no longer collides as a duplicate owner. The later stage registers under its stage id, and the ambiguous name keeps no live alias for either occurrence, so it routes through the workflow owner instead of reaching the earlier round ([#3163](https://github.com/bastani-inc/atomic/issues/3163)).
- The bundled `intercom` skill's optional cmux/tmux peer-launch examples now start `atomic` instead of `pi`, and the troubleshooting step refers to Atomic's bundled Intercom extension ([#3180](https://github.com/bastani-inc/atomic/issues/3180)).

## [0.9.20-alpha.5] - 2026-09-20

### Changed

- The `intercom` skill adds a peer-coordination pattern for subagents and workflow stages that share a group, covering connect, coordinate, learn, and debate exchanges alongside the existing supervisor-escalation patterns.

## [0.9.20-alpha.4] - 2026-09-20

### Added

- Intercom session targets now accept a unique 8-character hexadecimal UUID prefix within the sender's authorized group scope; collisions report every matching full UUID instead of selecting a session by ordering ([#2603](https://github.com/bastani-inc/atomic/issues/2603)).

### Fixed

- UUID-prefix targeting now keeps reply discovery within authorized relationships, resolves pending ask UUID prefixes before reply fallback, and accepts an isolated child's authorized supervisor prefix ([#2603](https://github.com/bastani-inc/atomic/issues/2603)).

- Explicit reply names and full session IDs keep their original identity through broker collision checks, unique UUID prefixes still canonicalize to the stored session ID, and hidden same-name collisions refuse regardless of letter case ([#2603](https://github.com/bastani-inc/atomic/issues/2603)).

- Canonicalized Intercom UUID-prefix sends revalidate the original selector against the broker's current authorized sessions, so a newly visible same-prefix UUID, exact name, or custom ID refuses instead of delivering to the previously unique identity ([#2603](https://github.com/bastani-inc/atomic/issues/2603)).

- Prefix ambiguity refusals no longer include unauthorized or hidden session names when a canonicalized UUID-prefix send is rejected ([#2603](https://github.com/bastani-inc/atomic/issues/2603)).
- Workflow children keep separate pending-ask lists from their parent stage and siblings. Stage replacement still preserves the stage's own pending asks ([#3105](https://github.com/bastani-inc/atomic/issues/3105)).
- Configuration, relay and disconnect diagnostics within SDK-owned work now use redacted session diagnostics instead of console output ([#3105](https://github.com/bastani-inc/atomic/issues/3105)).

## [0.9.20-alpha.1] - 2026-09-14

### Fixed

- Supervisor progress updates show their original send timestamp and are labelled historical snapshots, so delayed hypotheses cannot be mistaken for current activity after a correction or final result ([#3039](https://github.com/bastani-inc/atomic/issues/3039)).

## [0.9.19] - 2026-09-13

Cumulative release of the `0.9.19-alpha.2` through `0.9.19-alpha.9` prereleases. Per-change details remain in the unchanged prerelease sections below.

### Breaking Changes

- Removed the model-facing `retryToken` parameter and result field. Intercom owns bounded reconnect retries; each new tool call remains a distinct operation, including identical messages.
- Explicit `replyTo` selectors reject stale, unknown, empty or sender-mismatched threads instead of falling back. Use `pending` to select the exact unresolved question.

### Changed

- Agent lists lead with copyable full session IDs and canonical workflow paths, followed by meaningful names, status, working directory and future queued counts. Live/terminal reply capability is separate from idle activity; closed workflow generations report post-mortem-only or unavailable routing.

### Fixed

- `send` and `ask` interrupt a working subagent or live workflow stage's current model call or cancellable tool and process messages in the same execution. Arrival order, persistence retries, duplicate suppression and exact reply correlation survive cancellation without replaying completed side effects.
- Targeted replies complete the requested ask even when an unrelated message is active. Cancelled turns without a reply retain the pending ask's context.
- Recoverable disconnects retry up to three times within one invocation with the same delivery identity. Cancellation stops retries; unresolved outcomes warn against automatic resending, and client retry state is released on exit.
- Broker refusals reject outstanding registered-client requests with the actual reason instead of timing out or reporting a generic disconnect. Lazy initialization, relay and cleanup diagnostics use the owning interactive session's notifications rather than raw console output.
- Recipient discovery excludes workflow routing/control connections and model-less prompt/tool nodes. Malformed purposes are rejected, legacy omitted purposes remain supported, and roster updates wait for broker processing. Same-name non-agent nodes do not hide genuine duplicate agents or invalidate connected aliases ([#2895](https://github.com/bastani-inc/atomic/pull/2895)).
- Terminal noninteractive children reject asks promptly, including socket-write races. Retained connected workflow stages preserve reply correlation after leaving the active roster; closed stages without post-mortem routing return lifecycle guidance.
- Busy noninteractive refusals return correlated delivery errors without starting another parent turn. Owner-bound completion waits for same-child messages in order, retries failed delivery, and never repeats task execution.
- Parallel child-to-parent requests use correlated replies without ending siblings, preserving empty questions, omitted decision notes and ordered attachments. Sends and progress remain nonblocking; single-child claimed handoffs are unchanged.

## [0.9.19-alpha.9] - 2026-09-12

### Breaking Changes

- Explicit `reply` selectors now fail closed: stale, unknown, empty, or sender-mismatched `replyTo` values no longer fall back to another active or pending thread. Use `pending` to select the exact unresolved question.

### Changed

- Agent-visible Intercom lists lead with copyable full session IDs and canonical workflow paths, keeping status, working directory, meaningful names, and future queued counts without redundant generated aliases.

### Fixed

- Targeted replies select the requested sender's pending ask even when an unrelated message triggered the current turn, so a delivered reply no longer leaves that ask waiting on the wrong thread.

## [0.9.19-alpha.6] - 2026-09-11

### Fixed

- A broker refusal received by an already-registered client now rejects that client's outstanding requests with the broker's own reason instead of being discarded. Previously the refusal was delivered to a listener that `connect()` removes after registration, so pipelined work — notably the session-directory barrier behind workflow route updates — waited out its five-second timer and surfaced `List sessions timeout` or a generic disconnect. Reasons such as `Pending-stage route is not authorized` now reach callers as non-recoverable errors, and the `disconnected` event carries the same cause. Pre-registration rejection, transport-disconnect classification, and explicit shutdown are unchanged.

## [0.9.19-alpha.4] - 2026-09-10

### Fixed

- Route lazy initialization, event-relay, and rejected-candidate cleanup diagnostics through the owning interactive session's notifications, including during shutdown, instead of leaking console output and stacks. Retryable initialization uses warning color; non-interactive console diagnostics (including RPC), original failures, acknowledgements, and retry behavior are preserved even when an error cannot be rendered.
- `send` and `ask` to a working subagent or live workflow stage are delivered as a priority interrupt: the recipient's active model call or cancellable tool is cancelled immediately and the message is processed in the same task instead of waiting for the next natural turn or being refused as busy. Completed side effects are not undone or replayed. Arrival order holds across persistence retries for both receiver kinds; duplicate suppression, exact reply correlation, terminal-child and closed-stage rejection, unrelated headless protection, and group restrictions are unchanged.
- A cancelled turn that produced no reply no longer consumes the pending ask's reply context, so replies to consecutive asks stay correlated with the right sender and message.

## [0.9.19-alpha.3] - 2026-09-09

### Fixed

- Session listings display host-provided live/terminal reply capability separately from idle activity. Closed workflow generations publish `closed` with post-mortem-only or unavailable reply routing rather than remaining misleadingly idle; group isolation and ask rejection rules are unchanged.
- Canonical workflow-path asks correlate replies from connected retained stages even after their active roster rows disappear. Closed stages without post-mortem routing reject asks with lifecycle guidance rather than attempting a model turn.

## [0.9.19-alpha.2] - 2026-09-08

### Breaking Changes

- Removed the model-facing `retryToken` parameter and result field. Callers must stop carrying tokens between calls; Intercom now owns bounded reconnect retries. Each new call remains a distinct operation, including identical messages.

### Fixed

- Reject asks to terminal noninteractive subagent children with an explicit error instead of waiting on retained idle registrations. Termination also settles exact pending asks, including socket-write races; live interactive idle asks, workflow post-mortem conversations, and send delivery remain unchanged.
- Excluded internal workflow route-owner/control connections, model-less `ctx.ui` prompts, and `ctx.tool` nodes from recipient discovery. Broker checks refuse known non-agent targets before delivery or queueing, including retained completed prompts. Genuine agents busy in tools or awaiting human input remain eligible, and connected aliases survive pending-capability changes and completion without same-name controls changing agent ambiguity diagnostics.
- Reject malformed session/roster recipient purposes while preserving omitted-purpose legacy agents. Workflow roster updates now wait for broker processing before reporting completion, preventing stale discovery across connections ([#2895](https://github.com/bastani-inc/atomic/pull/2895)).
- `send`, `ask`, and `reply` now retry recoverable disconnects inside one tool invocation, preserving delivery identity and reply correlation for up to three retries. Cancellation stops retries, unresolved outcomes warn against automatic resending, and client retry state is released on exit. Broker deduplication and durable acceptance safeguards remain unchanged.
- Busy non-interactive recipients now return correlated delivery errors instead of a stale "still working" auto-reply. Unclaimed refusals bypass the parent's idle queue as timestamped delivery feedback without starting another turn; waiting asks retain exact error correlation.
- Owner-bound subagent task completion now participates in same-child message ordering, preserving unrelated queued messages and retrying failed delivery without repeating task execution.
- Parallel child-to-parent requests now use correlated replies instead of terminal fresh-child handoffs, preserving accepted empty parent questions, omitted decision notes, and ordered attachments. Sends and progress updates remain nonblocking; single-child claimed handoffs are unchanged.

## [0.9.18] - 2026-09-05

Cumulative release of the `0.9.18-alpha.3` through `0.9.18-alpha.7` prereleases. Per-change details remain in the unchanged prerelease sections below.

### Breaking Changes

- Workflow-stage targets require root-anchored `workflow:<rootRunId>/<segment>[/<segment>...]` paths. Legacy `<runId>:<stageKey>` targets fail with a migration hint.

### Added

- Added literal, run-ID, and glob stage-path routing, sticky delivery to future matches, and `workflow:<rootRunId>/**` broadcasts to live and future descendants until root termination.
- `intercom list` shows persisted possible future targets and queued counts. Valid unknown paths queue with `notInKnownSet` warnings and produce terminal undeliverable notices only if never delivered. Tool guidance, skills, and docs teach path discovery and live-only asks.

### Fixed

- Fixed invocation control across isolated workflow subgroups, pending-stage roster discovery and delivery, correlated live replies, registration-based authorization, and sibling/cross-run isolation. Queued sends render as successful, not failed ([#2784](https://github.com/bastani-inc/atomic/issues/2784)).
- Background reconnects retry with bounded backoff after releasing ownership, restore stage visibility/routing, and close failed accepted connections instead of accumulating stale registrations. Host sessions retain their startup home group across joins and reconnects, preserving multi-workflow control without granting workers cross-invocation authority.
- Recoverable disconnects during lazy initialization, stage warm-up, advisory subagent authorization, or event relays no longer produce misleading stage/UI failures. Registered transport resets enter typed recovery; unrelated protocol, auth, configuration, and terminal errors remain actionable.
- Stage warm-up owns bounded retries. Exhaustion settles queued delivery with a stage-scoped terminal failure instead of hanging or printing into the host transcript. No model retry/fallback is spent, queued messages remain available, late drains are safe, and stages without queued messages still start.
- Brokers retire ended sockets before routing more traffic. Delivery waits for socket-write acknowledgement, so failed writes cannot claim success, open reply authority, poison retry identity, or inflate sticky-broadcast receipts.
- Recoverable disconnects on send/ask/reply return opaque `retryToken` values for explicit exact-operation retries. Tokenless identical calls remain distinct. Tokens allow three claimed attempts within the original 11-minute deadline, retain identity after inconclusive nondelivery, preserve implicit reply correlation, and reject invalid or mismatched claims before side effects. Capacity is reserved before new operations begin.
- Retry signatures survive reconnects while preserving caller-visible target and argument distinctions. Local subagent result relays reserve deduplication identity before delivery and fail closed on conflicts, capacity, and uncertain acceptance.
- Broker acceptance records use keyed SHA-256 HMACs rather than plaintext signatures, keeping message and attachment text out of SQLite/WAL/SHM. POSIX directories/files use owner-only modes; key/database mismatch and corruption fail closed. The 12-minute durability and 10,000-record/64 MiB limits remain enforced.
- Closed stages suppress late messages from their own cancelled subagents without dropping other stages' traffic; already-submitted sends preserve receipts and retry identities ([#2840](https://github.com/bastani-inc/atomic/issues/2840)).

## [0.9.18-alpha.7] - 2026-09-05

### Fixed

- Host sessions that join multiple workflow groups retain workflow broadcast and pending-stage routing after reconnecting. Registration now preserves the startup home group instead of treating the most recently joined group as the session's origin; workflow workers still cannot gain another invocation's control authority through joins or reconnects.

## [0.9.18-alpha.6] - 2026-09-04

### Breaking Changes

- Workflow-stage targets now accept only root-anchored `workflow:<rootRunId>/<segment>[/<segment>...]` paths. The legacy `<runId>:<stageKey>` form is refused with a canonical-path migration hint.

### Added

- Workflow-stage routing now supports literal, run-id, and glob path segments, sticky delivery to every future match, and `workflow:<rootRunId>/**` broadcast to live and future descendants until root termination.
- `intercom list` now surfaces persisted possible future literals, patterns, and child paths with queued counts. Valid targets outside the known set queue with a `notInKnownSet` warning and produce a terminal undeliverable notification only when never delivered.

### Changed

- Intercom tool guidance, the bundled skill, and workflow-stage discovery documentation now teach canonical path targets, globs, sticky broadcasts, speculative acceptance, terminal settlement, and live-only asks.

### Fixed

- A recoverable broker disconnect no longer surfaces as a workflow-stage failure. Most visibly, a subagent launch no longer aborts with `Client disconnected` as its entire result: the supervisor-authorization request is advisory, so a transient disconnect now lets the launch proceed with supervisor metadata omitted, exactly as a runtime with no provider already did. Eager stage warm-up during `session_start` no longer reports the disconnect through the host extension-error channel, and the background event relays no longer log `Intercom event relay failed …` into the stage output.
- A workflow-stage warm-up that loses the broker now has a retry owner. Previously nothing rescheduled it, so a stage holding queued pending messages could wait indefinitely for a delivery that never came. The wrapper now retries the warm-up on the same bounded reconnect backoff, and the next entry covers what happens when those attempts run out.
- An exhausted workflow-stage warm-up retry no longer writes `Intercom could not reconnect for workflow stage "…" after 5 attempts` into the host session's transcript, and no longer leaves that stage waiting forever. The bounded retry previously ended with a raw `console.error`, which the root session paints into the main chat area, and nothing settled the stage's pending delivery — so the stage stayed running on an untimed `pendingStageDelivery.ready()` with no owner and no signal. The wrapper now hands the delivery a typed `IntercomWarmUpExhaustedError` through the `fail(reason)` member of the `WorkflowPendingStageDelivery` contract, and the workflow side settles `ready()` exactly once with a stage-scoped `WorkflowPendingStageDeliveryFailedError` naming the run, stage id, and stage name, so the stage ends `failed` at its own lifecycle boundary and spends no model retry or fallback candidate on a delivery no candidate could have received. Transient reconnects stay silent and keep retrying, a late success still delivers queued messages in admission order before stage work, and shutdown still cancels the retry silently. Nothing is dropped: after the terminal signal the queue is left untouched rather than marked delivered to a stage that will not read it, a stage with nothing queued still starts normally, and a duplicate `fail()`, a `fail()` before the first `ready()`, and a late drain are all safe. A host whose `fail` implementation throws cannot turn its own contract violation into an uncaught exception or an unhandled rejection in the session, and still gets no transcript output.
- Recoverable-disconnect classification requires the typed error raised inside the broker client rather than message text or a copyable marker property, so protocol, authentication, configuration, non-recoverable initialization, terminal relay, exhausted-retry, user-initiated, and identically worded unrelated failures all stay visible and actionable.
- The broker no longer writes to a departing peer's ended socket. A session was retired only when its connection finally closed, so a peer that half-closed — or one the broker itself ended after refusing a registration — stayed in the routing table and every later broadcast wrote into a socket whose writable side was gone. Node destroys the socket synchronously for such a write, so one departure cascaded into further disconnects and filled the 8 KiB `broker.log` with `ERR_STREAM_WRITE_AFTER_END` traces, leaving no room for any other diagnostic. Sessions are now retired as soon as their socket stops accepting frames, and every broker write checks writability as part of the write itself.
- A session the broker ended is no longer advertised by `intercom list` and no longer acked as `delivered`. Previously a `send` to such a session was answered `delivered` while the peer received nothing, and the fabricated delivery record then refused the honest retry with `message_id_conflict`, leaving the message permanently undeliverable under its stable id. Delivery-producing sends now wait for the socket write callback, so an immediate asynchronous reset cannot be acknowledged before its failure arrives. A send that cannot be handed to its target fails with `Session not found`, keeps the message id retryable, and opens no reply authorization for a message that was never sent. Pending-stage routing and notifications fail the same way instead of stalling for their full acknowledgement timeout, and a sticky broadcast reports only the stages it actually reached.
- A transport reset on an already-registered broker connection now enters the bounded reconnect path instead of failing the caller. `ECONNRESET`, `EPIPE`, and their relatives were stored raw and rejected pending work with the raw error, which the recoverable-disconnect classifier does not recognize, so an ordinary broker restart bypassed recovery. Such a reset is now the typed recoverable disconnect with the original transport error preserved as `cause`; the raw error still reaches `error` listeners, a protocol error that is followed by a socket error keeps its own diagnosis, and pre-registration failures are unchanged.
- A recoverable `Client disconnected` result and both model-visible Intercom tool registrations now return/describe an opaque `retryToken` for the exact failed `send`, `ask`, or `reply`. Only an explicit matching claim reuses identity; a tokenless byte-identical call is always a distinct intentional operation. Concurrent failures receive separate process-local tokens, and invalid, expired, foreign-session, mismatched, concurrent, exhausted, or settled claims fail before sending. Omitted attachments and an explicit empty list remain distinct caller arguments, while attachment object member order is canonical. Each token allows at most three claimed attempts without extending the original 11-minute deadline.
- A claimed retry no longer releases its accepted identity on an intermediate resolved nondelivery. `delivered: false`, `Session not found`, durable-authority uncertainty/capacity refusal, and another typed disconnect preserve and visibly return the same token/ID for the remaining bounded attempts; delivered or queued success settles it. This prevents an accepted operation with a lost acknowledgement from minting a second ID after an inconclusive retry.
- Stable-message retries remain reconnect-safe: retry signatures use reconnect-stable sender/recipient authority and preserve the model-issued target verbatim while transport resolution changes independently. Canonical attachment object member order is ignored, while attachment omission, array order/duplicates, raw target aliases, whitespace, and reply fields remain significant.
- A retry token for an implicit `reply` now retains the originally resolved sender and question route. An exact retry validates its caller-visible arguments before consulting mutable reply state, so a later inbound ask cannot make it ambiguous or steal its correlation. Public implicit `reply` still prefers the recorded exact sender ID while it is live; only a departed ID uses the authorized name fallback, ambiguity fails closed with the still-valid token, and explicit `to`/`replyTo` stay verbatim.
- Retry-token capacity is now reserved before a fresh operation can consume an ID, open a confirmation prompt, resolve a target/reply route, or send. Live token claims still work at full capacity, settled tombstones are discarded, and releasing or expiring an in-flight/retained identity reopens capacity without evicting live authority.
- Local subagent result relay delivery now reserves its process-local deduplication identity before the chat side effect and accepts it before positive acknowledgement. The 10,001st live ID, conflicts, invalid state, and uncertain in-flight replays fail closed without delivery or success acknowledgement; a proven side-effect failure forgets only its exact reservation, while an acceptance failure remains uncertain so replay cannot duplicate it.
- Broker acceptance records now persist as fixed keyed SHA-256 HMAC authority rather than canonical plaintext signatures, so SQLite/WAL/SHM never contain message or attachment text and low-entropy payloads cannot be tested without the paired random key. The configurable Intercom directory and database/key artifacts are corrected to owner-only POSIX modes (`0700`/`0600`), while Windows permission semantics remain unchanged. Missing/malformed key-database pairs, corrupt records, capacity, and uncertain reservations fail closed; digest-based byte accounting, 12-minute restart durability, and 10,000-record/64 MiB bounds remain enforced.
- Closed workflow stages suppress late messages from the subagent runs they own, without dropping messages from other stages' children. Cancelled sends stop before transport when possible; already-submitted sends preserve their delivery receipts and disconnect retry identities ([#2840](https://github.com/bastani-inc/atomic/issues/2840)).

## [0.9.18-alpha.5] - 2026-09-01

### Fixed

- A failed background reconnect no longer strands a live Intercom session. The next attempt is now scheduled after reconnect ownership is released, so a session whose broker restarts recovers on its own with bounded backoff instead of staying invisible until the next explicit Intercom call. A failing explicit `intercom` or overlay connection now leaves the same background retry behind rather than cancelling the one already scheduled, and a connection attempt that fails before it suspends can no longer park a settled promise in the reconnect slot and block every later attempt.
- Running workflow stages regain `intercom list` visibility and live routing on both their `<runId>:<stageName>` and `<runId>:<stageId>` targets after broker churn, instead of returning `Session not found` until something forced the stage session to reconnect.
- A reconnect that fails *after* the broker accepted the connection now closes that connection before the next attempt is scheduled. Previously the failed client stayed registered, so each retry added another entry for the same session: `intercom list` showed duplicates, and a send addressed to one of the stale entries was reported as delivered while the session never received it.

## [0.9.18-alpha.3] - 2026-09-01

### Fixed

- Recoverable Intercom disconnects during lazy initialization no longer print a misleading error and stack trace in the interactive UI; later calls still retry initialization.
- Fixed workflow invocation control across isolated workflow-owned subgroups: canonical pending/running roster discovery, queued pending sends, immediate live send/ask with correlated replies, immutable registration-based directory authorization after mutable joins, directional sibling and cross-run isolation, and invocation-unique group names ([#2784](https://github.com/bastani-inc/atomic/issues/2784)).
- Durably queued pending-stage sends are now rendered as successful sends instead of failed sends ([#2784](https://github.com/bastani-inc/atomic/issues/2784)).

## [0.9.17] - 2026-08-29

Cumulative release of the `0.9.17-alpha.1` prerelease. The summary below covers the user-visible outcome of that work; the per-change detail remains in the prerelease section below.

### Fixed

- Idle brokers now exit after the 5-second shutdown window even when no session ever registered, including sockets that close before `register`. An evicted incumbent does not delete a successor's socket or pid file ([#2765](https://github.com/bastani-inc/atomic/issues/2765)).

## [0.9.17-alpha.1] - 2026-08-29

### Fixed

- Idle brokers now exit after the 5-second shutdown window even when no session ever registered, including sockets that close before `register`. An evicted incumbent does not delete a successor's socket or pid file ([#2765](https://github.com/bastani-inc/atomic/issues/2765)).

## [0.9.16] - 2026-08-29

Cumulative release of the `0.9.16-alpha.1` – `0.9.16-alpha.11` prereleases. The summary below covers the user-visible outcome of that work; the per-change detail remains in the prerelease sections below.

### Breaking Changes

- Parent-targeted blocking asks no longer pause a child for `subagent` resume. They end the child and return a fresh-subagent `[TASK_CONTEXT]` handoff; migrate supervisors to launch a new child with the answer ([#2604](https://github.com/bastani-inc/atomic/issues/2604)).

### Added

- Intercom sessions can now hold multiple group memberships. Runtime `join` is additive, targeted `leave` removes one membership, bare `leave` resets to the startup home group, and the new `groups` action discovers every available group with session counts and membership markers. `list` remains session discovery, `status` reports the complete membership set, legacy single-group clients retain their existing behavior, and `contact_supervisor` keeps its capability-based cross-group route.
- Extended ordinary `send` delivery to known workflow stages whose sessions have not initialized, with durable FIFO queueing, a distinct `queued` acknowledgment, same-group enforcement, bounded per-stage capacity, structured pre-start `ask` refusal, and delivery through the existing Intercom path before the stage's first model turn. ([#2717](https://github.com/bastani-inc/atomic/issues/2717))
- Concurrent blocking asks now use a correlation-keyed waiter registry, with configurable `maxPendingAsks` capacity, exact out-of-order reply and selective-disconnect settlement, and a structured refusal when full. Blocking supervisor decisions remain exclusive per child while coexisting with ordinary peer asks ([#2628](https://github.com/bastani-inc/atomic/issues/2628)).

### Changed

- Intercom can no longer be disabled with `enabled: false`; Atomic always loads and registers the lightweight ordinary `intercom` tool while keeping broker connection and heavy initialization lazy. `contact_supervisor` remains subagent-only.
- `contact_supervisor` decisions/interviews and child-to-parent `intercom.ask` now preserve the original question, ordered duplicate attachments, and agent identity in the fresh-start handoff before broker send or reply-waiter admission ([#2604](https://github.com/bastani-inc/atomic/issues/2604)).
- Session teardown rejects every pending reply waiter while preserving per-waiter reply, timeout, abort, cancel, and peer-disconnect settlement.

### Fixed

- Intercom skill and user docs now tell agents to discover a workflow stage's `workflow:<rootRunId>` invocation group with `groups` and join it before steering the stage.
- Blocking `ask` and `contact_supervisor` waits now fail promptly with the departed session's name when their target disconnects after delivery, instead of hanging until the 10-minute timeout ([#2627](https://github.com/bastani-inc/atomic/issues/2627)).
- Replying to an exact pending ask now removes its queued turn context, preventing the same ask from resurfacing and being answered twice ([#2628](https://github.com/bastani-inc/atomic/issues/2628)).

## [0.9.16-alpha.11] - 2026-08-28

### Changed

- Intercom can no longer be disabled with `enabled: false`; Atomic always loads and registers the lightweight ordinary `intercom` tool while keeping broker connection and heavy initialization lazy. `contact_supervisor` remains subagent-only.

## [0.9.16-alpha.10] - 2026-08-28

### Added

- Intercom sessions can now hold multiple group memberships. Runtime `join` is additive, targeted `leave` removes one membership, bare `leave` resets to the startup home group, and the new `groups` action discovers every available group with session counts and membership markers. `list` remains session discovery, `status` reports the complete membership set, legacy single-group clients retain their existing behavior, and `contact_supervisor` keeps its capability-based cross-group route.

### Fixed

- Intercom skill and user docs now tell agents to discover a workflow stage's `workflow:<rootRunId>` invocation group with `groups` and join it before steering the stage.

## [0.9.16-alpha.8] - 2026-08-27

### Added

- Extended ordinary `send` delivery to known workflow stages whose sessions have not initialized, with durable FIFO queueing, a distinct `queued` acknowledgment, same-group enforcement, bounded per-stage capacity, structured pre-start `ask` refusal, and delivery through the existing Intercom path before the stage's first model turn. ([#2717](https://github.com/bastani-inc/atomic/issues/2717))

## [0.9.16-alpha.5] - 2026-08-26

### Added

- Concurrent blocking asks now use a correlation-keyed waiter registry, with configurable `maxPendingAsks` capacity, exact out-of-order reply and selective-disconnect settlement, and a structured refusal when full. Blocking supervisor decisions remain exclusive per child while coexisting with ordinary peer asks ([#2628](https://github.com/bastani-inc/atomic/issues/2628)).

### Changed

- Session teardown rejects every pending reply waiter while preserving per-waiter reply, timeout, abort, cancel, and peer-disconnect settlement.

### Fixed

- Blocking `ask` and `contact_supervisor` waits now fail promptly with the departed session's name when their target disconnects after delivery, instead of hanging until the 10-minute timeout ([#2627](https://github.com/bastani-inc/atomic/issues/2627)).
- Replying to an exact pending ask now removes its queued turn context, preventing the same ask from resurfacing and being answered twice ([#2628](https://github.com/bastani-inc/atomic/issues/2628)).

## [0.9.16-alpha.1] - 2026-08-23

### Breaking Changes

- Parent-targeted blocking asks no longer pause a child for `subagent` resume. They end the child and return a fresh-subagent `[TASK_CONTEXT]` handoff; migrate supervisors to launch a new child with the answer ([#2604](https://github.com/bastani-inc/atomic/issues/2604)).

### Changed

- `contact_supervisor` decisions/interviews and child-to-parent `intercom.ask` now preserve the original question, ordered duplicate attachments, and agent identity in the fresh-start handoff before broker send or reply-waiter admission ([#2604](https://github.com/bastani-inc/atomic/issues/2604)).

## [0.9.13] - 2026-08-13

Cumulative release of the `0.9.13-alpha.1` – `0.9.13-alpha.3` prereleases. The summary below covers the user-visible outcome of that work; the per-change detail remains in the prerelease sections below.

### Breaking Changes

- Removed unique-ID-prefix targeting. `send`, `ask`, and `reply` now accept only an exact full session ID or an exact case-insensitive session name.

### Added

- Added the runtime `join` and `leave` actions for named group membership. Joining updates broker presence without changing the session ID, keeps `send`/`ask` group-isolated, lets later subagents inherit the joined group, and reports success only after broker acknowledgement. `default` remains explicit, while `true` and `auto` stay reserved for generated subagent groups ([#2334](https://github.com/bastani-inc/atomic/issues/2334)).

### Changed

- Intercom displays full session and message IDs everywhere: list rows, the session-list overlay, inbound message headers, reply-to lines, message-id result badges, and unnamed-session `subagent-chat-<id>` aliases.
- In-process child identities and supervisor capabilities arrive through typed admission policy and are captured on each `IntercomClient` at connect time instead of being read from environment for every message. A descendant cannot inherit a parent's supervisor grant through process environment; legacy Atomic/Pi bridge metadata remains available for older hosts ([#2188](https://github.com/bastani-inc/atomic/issues/2188)).
- Detached broker processes now receive `AI_AGENT=atomic` for generic child-process attribution.

### Fixed

- Fixed the broker failing to start on standalone-binary installs, where every `intercom` call and every `subagent` delegation failed with `Intercom not connected: Intercom broker exited before startup with code 1`. The detached broker never inherits the host extension loader's `@bastani/atomic` alias and release archives ship no physical copy of that optional peer, so group resolution now reads `ATOMIC_INTERCOM_GROUP` (and the legacy `PI_INTERCOM_GROUP`) locally instead of importing the host package ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).
- Broker startup is far faster on every platform, because dropping that import keeps the whole coding-agent module graph out of it: measured spawn-to-socket-connectable startup went from 1104 ms minimum / 1318 ms average to 85 ms / 96 ms on Node with tsx, and from 252 ms / 260 ms to 17 ms / 18 ms on Bun. Readiness now polls at 10 ms with bounded backoff up to the previous 100 ms interval, and the overall startup timeout is unchanged ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).
- Broker stderr is no longer discarded. It is captured to `broker.log` in the agent's intercom directory, and both the "exited before startup" error and the readiness-timeout error quote the log path and a bounded tail of that output. The log is capped at 8 KiB by the broker itself, installed by the entrypoint's first import so a dependency cannot write ahead of the cap, and the cap covers `process.stderr.write`, `console.error`/`console.warn`, and default fatal printing for uncaught exceptions and unhandled rejections ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).
- Fixed the session-list overlay clipping full session IDs at narrow terminal widths by wrapping IDs onto dim rows and marking unavoidable truncation with a visible ellipsis; inline sender and reply-to IDs now also signal overflow.
- Fixed relay and detach-handshake callbacks that finish after an extension reload turning a late delivery into an unhandled rejection. Stale event-bus emissions and subscription cleanup are best-effort, and stale-context detection uses the host's exported predicate instead of a duplicated error-message marker.

## [0.9.13-alpha.3] - 2026-08-13

### Breaking Changes

- Removed unique-ID-prefix targeting. `send`, `ask`, and `reply` now accept only an exact full session ID or an exact case-insensitive session name.

### Changed

- Intercom now displays full session and message IDs everywhere: list rows, the session-list overlay, inbound message headers, reply-to lines, message-id result badges, and unnamed-session `subagent-chat-<id>` aliases.

### Fixed

- Fixed the session-list overlay clipping full session IDs at narrow terminal widths by wrapping IDs onto dim rows and marking unavoidable truncation with a visible ellipsis; inline sender and reply-to IDs now also signal overflow.

## [0.9.13-alpha.2] - 2026-08-12

### Changed

- Detached intercom broker processes now receive `AI_AGENT=atomic` for generic child-process attribution.
- Added runtime `intercom` `join` and `leave` actions for named group membership. Joining updates broker presence without changing the session ID, keeps `send`/`ask` group-isolated, lets later subagents inherit the joined group, and reports success only after broker acknowledgement; `default` remains explicit while `true` and `auto` stay reserved for generated subagent groups ([#2334](https://github.com/bastani-inc/atomic/issues/2334)).

### Fixed
- Fixed Intercom relay and detach-handshake callbacks that finish after an extension reload. Stale event-bus emissions and subscription cleanup are now best-effort, so runtime replacement does not turn a late delivery into an unhandled rejection.
- Fixed late Intercom callbacks using a stale extension runtime by using the host's exported stale-context predicate instead of a duplicated error-message marker.

- Fixed the intercom broker failing to start on standalone-binary installs, where every `intercom` call and every `subagent` delegation failed with `Intercom not connected: Intercom broker exited before startup with code 1`. The broker is a detached subprocess, so it never inherits the host extension loader's `@bastani/atomic` alias, and release archives ship no physical copy of that optional peer; `group.ts` now reads `ATOMIC_INTERCOM_GROUP` (and the legacy `PI_INTERCOM_GROUP`) locally instead of importing the host package. A defined-but-empty `ATOMIC_INTERCOM_GROUP` still shadows the legacy name, exactly as before ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).
- Removing that import also keeps the entire coding-agent module graph out of broker startup on every platform, not only standalone installs: measured spawn-to-socket-connectable startup went from 1104 ms minimum / 1318 ms average to 85 ms / 96 ms on Node with tsx, and from 252 ms / 260 ms to 17 ms / 18 ms on Bun ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).
- Broker stderr is no longer discarded. It is captured to `broker.log` in the agent's intercom directory through an already-open file descriptor (not a pipe, which cannot outlive the parent that spawned the detached broker), and both the "exited before startup" error and the readiness-timeout error now quote the log path and a bounded tail of that output. The Windows hidden launcher appends the broker's own stderr to the same file ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).
- The startup log is capped at 8 KiB rather than growing without limit. The parent truncates it on every spawn, but the parent exits while the detached broker keeps running, so the broker applies the cap itself. External truncation would not work — a POSIX append descriptor writes at the new end of file, and the inherited Windows append handle has no truncate right ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).
- The cap is installed by the broker entrypoint's first import, before any other module of the broker evaluates. ESM runs a module's static dependencies ahead of the importer's own body, so installing from the entrypoint body left every dependency free to write first: an oversized write while a dependency initialized produced a 32,768-byte log, and a throw during initialization produced 34,372 bytes ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).
- The cap covers all three routes that reach the log, not only the stream: `process.stderr.write`, `console.error` / `console.warn`, and the default fatal printing for an uncaught exception or an unhandled rejection. Measured against an 8 KiB cap with only the stream patched, a Bun `console.error` left 32,769 bytes, a Bun uncaught error 33,228 bytes, a Bun unhandled rejection 33,326 bytes, and a Node unhandled rejection 33,620 bytes; all four now stay at or below the cap ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).
- Broker readiness now polls at 10 ms with bounded backoff up to the previous 100 ms interval instead of sleeping a flat 100 ms after every attempt, which had become the dominant cost of a startup that finishes in tens of milliseconds. The overall startup timeout is unchanged ([#2208](https://github.com/bastani-inc/atomic/issues/2208)).

## [0.9.13-alpha.1] - 2026-08-05

### Changed

- In-process child identities and supervisor capabilities now arrive through typed admission policy and are captured on each `IntercomClient` at connect time instead of being read from environment for every message. Descendants cannot inherit a parent's supervisor grant through process environment; legacy Atomic/Pi bridge metadata remains available for older hosts ([#2188](https://github.com/bastani-inc/atomic/issues/2188)).

## [0.9.12] - 2026-08-04

### Fixed

- Fixed bundled Intercom resources failing to load on Windows when shared modules used mixed `.ts` and `.js` import spellings.

## [0.9.12-alpha.1] - 2026-08-04

### Fixed

- Fixed bundled Intercom resources failing to load on Windows when shared modules used mixed `.ts` and `.js` import spellings.

## [0.9.11] - 2026-08-03

### Changed

- Released with Atomic 0.9.11. No functional intercom changes since 0.9.10; the extension now runs under the reworked isolated-engine and workflow-group behaviour shipped by the host.

## [0.9.11-alpha.1] - 2026-07-20

### Changed

- Published a synchronized Atomic 0.9.11-alpha.1 prerelease for the intercom extension; no functional intercom changes were made after 0.9.10.

## [0.9.10] - 2026-07-20

### Added

- Added intercom **groups** for broker-enforced session isolation. Every session belongs to exactly one group (implicitly `"default"` when unset), resolved with precedence `orchestrationContext.intercomGroup` (per-session workflow-stage injection) > env `ATOMIC_INTERCOM_GROUP` (legacy `PI_INTERCOM_GROUP`) > intercom `config.json` `"group"` > `"default"`. A session in group G can only message peers in G: cross-group sends are rejected at the broker (unresolvable by name via group-scoped candidate resolution, and rejected by an exact-id defense-in-depth check with reason "Target session is in a different intercom group"), not merely hidden from discovery. `session_joined`/`session_left`/`presence_update` broadcasts and `intercom list` are group-scoped, so a session never sees peers outside its group. The `intercom` tool gains an optional `group` parameter: read-only for `list`/`status` (peek who is in a named group and see your own group), while `send`/`ask` stay locked to your own group and error clearly on a differing group. The subagent-only `contact_supervisor` path uses a dedicated broker protocol plus a supervisor-issued child capability, and only an exact broker-recorded reverse reply may cross back, so isolated children retain their supervisor link without granting peer traffic a general bypass.

### Fixed

- Fixed busy workflow-stage messages being retained solely in Intercom's private wait-until-idle queue. Stage-targeted traffic is now admitted synchronously through the AgentSession generation boundary with stable message IDs, preserving native follow-up ordering and exactly-once delivery; close-winning late traffic is surfaced through the parent/main chat without mutating the terminal stage. Existing non-stage idle batching, terminal barriers, reply correlation, and shutdown generation cleanup are unchanged.
- Fixed closed workflow-stage Intercom routing to avoid source-side pre-admission, reserve destination dedupe entries until main-chat delivery succeeds, roll back reply context on failure, propagate asynchronous route rejection, and permit a failed stable-key delivery to retry without duplicate parent-chat messages. A final retry survives source-stage retirement, and hosts without batch admission now commit successful fallback members individually so a partial failure retries only the undelivered suffix.
- Fixed a cross-group isolation bypass where any registered raw client could forge `channel: "supervisor"` on an ordinary `send` frame. Ordinary sends now reject client-authored channel markers; the broker issues child-scoped supervisor capabilities, binds validated registrations to the issuing supervisor, derives the only authorized cross-group destination, and adds the trusted relay marker itself. Wrong targets/tokens, fabricated `replyTo` values, and ordinary peer sends remain isolated, while legitimate child requests and exact supervisor replies continue to cross groups. Parent-held capability state is restored after broker reconnects, the child uses the broker-confirmed current supervisor ID, and the lightweight wrapper lazy-loads the authorization provider before spawn. Claimed provider failures propagate; hosts without a provider omit supervisor metadata rather than launching a silently broken `contact_supervisor` channel.
- Fixed workflow stages freezing when their active foreground subagent sent Intercom traffic or blocking `contact_supervisor`. Busy open stages give the exact foreground owner probe/commit detach handshake first refusal before model-visible queue insertion; unclaimed traffic and owner loss between probe/commit fall back to normal insertion instead of dropping a broker-delivered message. A commit from one parallel child releases aggregate foreground supervision for all active siblings while their processes and eventual results remain owned.
- Fixed `intercom.ask` hanging when one workflow stage targeted a sibling stage that had already completed. Blocking late asks now retain their exact sender/thread correlation while the workflow runtime schedules the target's retained conversation for a post-mortem turn; only that target's correlated `intercom.reply` resolves the caller. The production workflow and Intercom listeners now preserve the first owner's completion promise regardless of registration order, preventing the lightweight Intercom relay or duplicate listeners from replacing or double-delivering a claimed revival. Missing, deleted, non-resumable, or failed-to-reopen targets return a bounded actionable tool error instead of waiting for the normal ask timeout, while ordinary late notifications retain their existing parent-chat route ([#1854](https://github.com/bastani-inc/atomic/issues/1854)).
- Fixed blocking `intercom.ask` delivery to a sibling workflow stage that is mid-turn. Busy targets now reserve the message synchronously in the open AgentSession generation before awaiting foreground-owner detach, then drain the eventual native queue insertion before terminal snapshot publication. Destination-side admission failures return an exact-thread actionable tool error instead of leaving the asker blocked for the 10-minute reply timeout.

## [0.9.10-alpha.1] - 2026-07-19

### Added

- Added intercom **groups** for broker-enforced session isolation. Every session belongs to exactly one group (implicitly `"default"` when unset), resolved with precedence `orchestrationContext.intercomGroup` (per-session workflow-stage injection) > env `ATOMIC_INTERCOM_GROUP` (legacy `PI_INTERCOM_GROUP`) > intercom `config.json` `"group"` > `"default"`. A session in group G can only message peers in G: cross-group sends are rejected at the broker (unresolvable by name via group-scoped candidate resolution, and rejected by an exact-id defense-in-depth check with reason "Target session is in a different intercom group"), not merely hidden from discovery. `session_joined`/`session_left`/`presence_update` broadcasts and `intercom list` are group-scoped, so a session never sees peers outside its group. The `intercom` tool gains an optional `group` parameter: read-only for `list`/`status` (peek who is in a named group and see your own group), while `send`/`ask` stay locked to your own group and error clearly on a differing group. The subagent-only `contact_supervisor` path uses a dedicated broker protocol plus a supervisor-issued child capability, and only an exact broker-recorded reverse reply may cross back, so isolated children retain their supervisor link without granting peer traffic a general bypass.

### Fixed

- Fixed busy workflow-stage messages being retained solely in Intercom's private wait-until-idle queue. Stage-targeted traffic is now admitted synchronously through the AgentSession generation boundary with stable message IDs, preserving native follow-up ordering and exactly-once delivery; close-winning late traffic is surfaced through the parent/main chat without mutating the terminal stage. Existing non-stage idle batching, terminal barriers, reply correlation, and shutdown generation cleanup are unchanged.
- Fixed closed workflow-stage Intercom routing to avoid source-side pre-admission, reserve destination dedupe entries until main-chat delivery succeeds, roll back reply context on failure, propagate asynchronous route rejection, and permit a failed stable-key delivery to retry without duplicate parent-chat messages. A final retry survives source-stage retirement, and hosts without batch admission now commit successful fallback members individually so a partial failure retries only the undelivered suffix.
- Fixed a cross-group isolation bypass where any registered raw client could forge `channel: "supervisor"` on an ordinary `send` frame. Ordinary sends now reject client-authored channel markers; the broker issues child-scoped supervisor capabilities, binds validated registrations to the issuing supervisor, derives the only authorized cross-group destination, and adds the trusted relay marker itself. Wrong targets/tokens, fabricated `replyTo` values, and ordinary peer sends remain isolated, while legitimate child requests and exact supervisor replies continue to cross groups. Parent-held capability state is restored after broker reconnects, the child uses the broker-confirmed current supervisor ID, and the lightweight wrapper lazy-loads the authorization provider before spawn. Claimed provider failures propagate; hosts without a provider omit supervisor metadata rather than launching a silently broken `contact_supervisor` channel.
- Fixed workflow stages freezing when their active foreground subagent sent Intercom traffic or blocking `contact_supervisor`. Busy open stages give the exact foreground owner probe/commit detach handshake first refusal before model-visible queue insertion; unclaimed traffic and owner loss between probe/commit fall back to normal insertion instead of dropping a broker-delivered message. A commit from one parallel child releases aggregate foreground supervision for all active siblings while their processes and eventual results remain owned.
- Fixed `intercom.ask` hanging when one workflow stage targeted a sibling stage that had already completed. Blocking late asks now retain their exact sender/thread correlation while the workflow runtime schedules the target's retained conversation for a post-mortem turn; only that target's correlated `intercom.reply` resolves the caller. The production workflow and Intercom listeners now preserve the first owner's completion promise regardless of registration order, preventing the lightweight Intercom relay or duplicate listeners from replacing or double-delivering a claimed revival. Missing, deleted, non-resumable, or failed-to-reopen targets return a bounded actionable tool error instead of waiting for the normal ask timeout, while ordinary late notifications retain their existing parent-chat route ([#1854](https://github.com/bastani-inc/atomic/issues/1854)).
- Fixed blocking `intercom.ask` delivery to a sibling workflow stage that is mid-turn. Busy targets now reserve the message synchronously in the open AgentSession generation before awaiting foreground-owner detach, then drain the eventual native queue insertion before terminal snapshot publication. Destination-side admission failures return an exact-thread actionable tool error instead of leaving the asker blocked for the 10-minute reply timeout.

## [0.9.9] - 2026-07-15

### Changed

- Aligned the intercom extension peer dependency with `@earendil-works/pi-tui` `^0.80.7` as part of the consolidated Pi v0.80.7 dependency update; no intercom source changes were needed.
- Updated the runtime `typebox` range to `^1.3.6`.

### Fixed

- Preserved per-child chronology between busy-parent Intercom messages and terminal async subagent notifications: paused, completed, and failed paths now claim pre-terminal ordinary messages from the exact child session/run in FIFO order and atomically admit the prelude plus terminal notice through the custom-message batch API. A process-local bridge complements extension-bus delivery for lazily activated companions; terminal identity deduplicates both paths even when the successful terminal dispatch has an empty prelude, while failed dispatches remain retryable and distinct resumed-run lifecycle terminals remain independent. Idle flushes use the same ordered batch admission, unrelated children remain independent, and ask/reply correlation is unchanged ([#1802](https://github.com/bastani-inc/atomic/issues/1802)).
- Made every short session ID printed by `intercom list` directly actionable in `send`, blocking `ask`, and targeted `reply`. Target resolution now preserves exact full IDs and exact case-insensitive names before accepting unique ID prefixes, reports colliding prefixes with the matching sessions instead of guessing, resolves blocking asks to the full sender ID so threaded replies correlate correctly, and rejects short-form self-targets at both tool and broker routing boundaries.

## [0.9.9-alpha.4] - 2026-07-15

### Changed

- Published a synchronized Atomic 0.9.9-alpha.4 prerelease for the intercom extension; no functional intercom changes were made after 0.9.9-alpha.3.

## [0.9.9-alpha.3] - 2026-07-14

### Fixed

- Preserved per-child chronology between busy-parent Intercom messages and terminal async subagent notifications: paused, completed, and failed paths now claim pre-terminal ordinary messages from the exact child session/run in FIFO order and atomically admit the prelude plus terminal notice through the custom-message batch API. A process-local bridge complements extension-bus delivery for lazily activated companions; terminal identity deduplicates both paths even when the successful terminal dispatch has an empty prelude, while failed dispatches remain retryable and distinct resumed-run lifecycle terminals remain independent. Idle flushes use the same ordered batch admission, unrelated children remain independent, and ask/reply correlation is unchanged ([#1802](https://github.com/bastani-inc/atomic/issues/1802)).
- Made every short session ID printed by `intercom list` directly actionable in `send`, blocking `ask`, and targeted `reply`. Target resolution now preserves exact full IDs and exact case-insensitive names before accepting unique ID prefixes, reports colliding prefixes with the matching sessions instead of guessing, resolves blocking asks to the full sender ID so threaded replies correlate correctly, and rejects short-form self-targets at both tool and broker routing boundaries.

## [0.9.9-alpha.2] - 2026-07-14

### Changed

- Aligned the intercom extension peer dependency with `@earendil-works/pi-tui` `^0.80.7` as part of the consolidated Pi v0.80.7 dependency update; no intercom source changes were needed.
- Updated the runtime `typebox` range to `^1.3.6`.

## [0.9.9-alpha.1] - 2026-07-14

### Changed

- Published a synchronized Atomic 0.9.9-alpha.1 prerelease for the intercom extension; no functional intercom changes were made after 0.9.8.

## [0.9.8] - 2026-07-12

### Changed

- Published the stable Atomic 0.9.8 release for the intercom extension; no functional intercom changes were made after 0.9.7.

## [0.9.8-alpha.1] - 2026-07-12

### Changed

- Published a synchronized Atomic 0.9.8-alpha.1 prerelease for the intercom extension; no functional intercom changes were made after 0.9.7.

## [0.9.7] - 2026-07-12

### Fixed

- Made blocking reply waits race-safe under concurrent tool calls. Waiter admission is now an atomic synchronous check-and-reserve shared by `intercom` `ask` and `contact_supervisor`: when several blocking requests race (parallel tool calls in one turn, same-tool or cross-tool), exactly one wins the reservation and every other call returns a normal structured "Already waiting for a reply" tool error. Previously the loser received an already-rejected promise that could sit unhandled while the winner's question was still being sent, crashing the whole agent process with an unhandled `Error: Already waiting for a reply` rejection.
- Scoped blocking-ask cleanup to the owning call: cancellation, send failures, and delivery errors now settle only that call's own reply waiter instead of rejecting whichever waiter happened to be pending, so a losing or failing concurrent request can no longer tear down another call's in-flight ask. The reply-wait timeout also rejects only its own waiter, threaded replies still resolve the exact winning request, and session shutdown/replacement and broker disconnects continue to reject the currently pending waiter.
- Made the pending reply-wait promise unhandled-rejection-proof: rejections that fire between the owner's awaits (for example a delivery failure racing dispatch) are pre-handled, so blocking coordination can never terminate the process.
- Initialized the lazy Intercom runtime from the most recent turn/tool/model lifecycle context when a subagent result or control relay arrives in a session that never emitted `session_start` to extensions (for example non-interactive in-process child sessions). Such sessions now deliver self-addressed subagent result announcements locally instead of failing every relay.
- Stopped recording misleading `intercom_result_error`/`intercom_control_error` "Intercom shutting down" entries when a relay fires while the runtime is uninitialized and the target is not the local session. The relay now acknowledges the message as undelivered (callers fall back to inline results) without attempting a broker connection that can only fail.

## [0.9.7-alpha.1] - 2026-07-12

### Fixed

- Made blocking reply waits race-safe under concurrent tool calls. Waiter admission is now an atomic synchronous check-and-reserve shared by `intercom` `ask` and `contact_supervisor`: when several blocking requests race (parallel tool calls in one turn, same-tool or cross-tool), exactly one wins the reservation and every other call returns a normal structured "Already waiting for a reply" tool error. Previously the loser received an already-rejected promise that could sit unhandled while the winner's question was still being sent, crashing the whole agent process with an unhandled `Error: Already waiting for a reply` rejection.
- Scoped blocking-ask cleanup to the owning call: cancellation, send failures, and delivery errors now settle only that call's own reply waiter instead of rejecting whichever waiter happened to be pending, so a losing or failing concurrent request can no longer tear down another call's in-flight ask. The reply-wait timeout also rejects only its own waiter, threaded replies still resolve the exact winning request, and session shutdown/replacement and broker disconnects continue to reject the currently pending waiter.
- Made the pending reply-wait promise unhandled-rejection-proof: rejections that fire between the owner's awaits (for example a delivery failure racing dispatch) are pre-handled, so blocking coordination can never terminate the process.
- Initialized the lazy Intercom runtime from the most recent turn/tool/model lifecycle context when a subagent result or control relay arrives in a session that never emitted `session_start` to extensions (for example non-interactive in-process child sessions). Such sessions now deliver self-addressed subagent result announcements locally instead of failing every relay.
- Stopped recording misleading `intercom_result_error`/`intercom_control_error` "Intercom shutting down" entries when a relay fires while the runtime is uninitialized and the target is not the local session. The relay now acknowledges the message as undelivered (callers fall back to inline results) without attempting a broker connection that can only fail.

## [0.9.6] - 2026-07-12

### Changed

- Restored fully tool-driven Intercom connections: parent and bridged child sessions no longer import or connect to the broker merely because a subagent starts. The runtime now connects only when the model or user invokes an Intercom tool, command, shortcut, or relay.

## [0.9.6-alpha.1] - 2026-07-12

### Changed

- Restored fully tool-driven Intercom connections: parent and bridged child sessions no longer import or connect to the broker merely because a subagent starts. The runtime now connects only when the model or user invokes an Intercom tool, command, shortcut, or relay.

## [0.9.5] - 2026-07-11

### Added

- Added preferred `atomic` package manifest metadata alongside the legacy `pi` manifest metadata so Atomic package discovery uses Atomic-branded metadata without breaking pi-compatible installs.

### Changed

- Aligned the intercom extension peer dependency with upstream `pi-tui` `^0.80.6` as part of the consolidated Pi sync; no intercom source behavior changed ([#1703](https://github.com/bastani-inc/atomic/issues/1703)).
- Updated intercom documentation to describe Atomic's `~/.atomic/agent/intercom/` primary config/runtime path and legacy `~/.pi/agent/intercom/` fallback.
- Updated the registered intercom tool description and prompt snippet to use Atomic/Pi-neutral local agent session wording instead of hard-coding Pi-branded session names in model-visible text.

### Fixed

- Made lazy Intercom lifecycle replay generation-safe, session-leased, and serialized with live lifecycle forwarding, so matching end events and newer model selections cannot be overtaken by a blocked stale replay. Shutdown waits for retired replay/initializer cleanup before replacement, calls spanning teardown reject, and failed or invalidated attempts cannot leak stale resources.
- Recover from rejected lazy and delegated-child background initialization and later-generation session replay; later callers retry before executing, and concurrent retries share one initialization or replay attempt while normal sessions remain lazy.
- Made acknowledged subagent result delivery idempotent end to end: lazy initialization failure and retired relay generations emit definitive negative acknowledgements, stable completion request IDs become broker message IDs, concurrent identical client sends coalesce onto one attempt, and a bounded TTL cache confirms identical successful retries without forwarding twice. Canonical target/payload/options signatures reject conflicting ID reuse even after success and across sender sessions, while transport attempt IDs and timestamps remain retry-insensitive. Brokers reject malformed present attempt IDs instead of unsafely downgrading them, and clients accept attempt-less legacy responses only for an ID's original active generation so a delayed legacy acknowledgement cannot settle a timeout/disconnect replacement.
- Fixed foreground `intercom.ask`, `intercom.send`, and supervisor coordination to use an exact-owner probe/reservation plus an acknowledged, generation-scoped detach commit before model-visible steering delivery. This breaks parent/child ask deadlocks, promptly releases supervision for fire-and-forget progress/send, preserves threaded decision replies, leaves unmatched/background messages queued until idle, and prevents orphaned, stale, or duplicate delivery after cancellation or replacement. Interactive parents now await lazy Intercom broker/inbound-handler initialization before a foreground child launches ([#1727](https://github.com/bastani-inc/atomic/issues/1727)).
- Register bridged foreground/background children with Intercom before agent work begins and gate interactive foreground launches on lazy parent broker readiness, while preserving single-flight heavy loading, replacement/shutdown cleanup, and no startup work for unused parents, disabled sessions, or definition/control-only subagent actions. Optional import/broker/connection failures diagnose and degrade without aborting parent or child launch, while later calls retain retry behavior. Adapted from `nicobailon/pi-intercom` commits `3cb5b9c`, `02a6897`, and `9f23b97` while retaining Atomic's lazy proxy and issue #1727 detach protocol.
- Fixed Atomic intercom broker runtime paths to derive from the active Atomic agent directory, so `ATOMIC_CODING_AGENT_DIR` moves the broker socket, PID, spawn lock, and Windows launcher together while the legacy `PI_CODING_AGENT_DIR` alias remains supported.
- Fixed raw TypeScript intercom imports to use the bundled `@earendil-works/pi-tui` package name, matching Atomic's runtime dependency while preserving the public intercom API.
- Hardened default intercom broker startup so the pi-compatible `npx --no-install tsx` sentinel launches through the current runtime (`process.execPath`): Node-based installs use a resolved `tsx` CLI with a bundled `jiti` fallback, Bun source-checkout runs use the current Bun executable directly, and standalone Atomic Bun binaries re-enter the split launcher through a narrow internal broker handoff instead of treating the Atomic executable as a generic Bun interpreter; explicit custom `brokerCommand`/`brokerArgs` configs remain pass-through overrides.

## [0.9.5-alpha.10] - 2026-07-11

### Changed

- Aligned the intercom extension peer dependency with upstream `pi-tui` `^0.80.6` as part of the consolidated Pi sync; no intercom source behavior changed ([#1703](https://github.com/bastani-inc/atomic/issues/1703)).

### Fixed

- Made lazy Intercom lifecycle replay generation-safe, session-leased, and serialized with live lifecycle forwarding, so matching end events and newer model selections cannot be overtaken by a blocked stale replay. Shutdown waits for retired replay/initializer cleanup before replacement, calls spanning teardown reject, and failed or invalidated attempts cannot leak stale resources.
- Recover from rejected lazy and delegated-child background initialization and later-generation session replay; later callers retry before executing, and concurrent retries share one initialization or replay attempt while normal sessions remain lazy.
- Made acknowledged subagent result delivery idempotent end to end: lazy initialization failure and retired relay generations emit definitive negative acknowledgements, stable completion request IDs become broker message IDs, concurrent identical client sends coalesce onto one attempt, and a bounded TTL cache confirms identical successful retries without forwarding twice. Canonical target/payload/options signatures reject conflicting ID reuse even after success and across sender sessions, while transport attempt IDs and timestamps remain retry-insensitive. Brokers reject malformed present attempt IDs instead of unsafely downgrading them, and clients accept attempt-less legacy responses only for an ID's original active generation so a delayed legacy acknowledgement cannot settle a timeout/disconnect replacement.
- Fixed foreground `intercom.ask`, `intercom.send`, and supervisor coordination to use an exact-owner probe/reservation plus an acknowledged, generation-scoped detach commit before model-visible steering delivery. This breaks parent/child ask deadlocks, promptly releases supervision for fire-and-forget progress/send, preserves threaded decision replies, leaves unmatched/background messages queued until idle, and prevents orphaned, stale, or duplicate delivery after cancellation or replacement. Interactive parents now await lazy Intercom broker/inbound-handler initialization before a foreground child launches ([#1727](https://github.com/bastani-inc/atomic/issues/1727)).
- Register bridged foreground/background children with Intercom before agent work begins and gate interactive foreground launches on lazy parent broker readiness, while preserving single-flight heavy loading, replacement/shutdown cleanup, and no startup work for unused parents, disabled sessions, or definition/control-only subagent actions. Optional import/broker/connection failures diagnose and degrade without aborting parent or child launch, while later calls retain retry behavior. Adapted from `nicobailon/pi-intercom` commits `3cb5b9c`, `02a6897`, and `9f23b97` while retaining Atomic's lazy proxy and issue #1727 detach protocol.

## [0.9.5-alpha.8] - 2026-07-08

### Added

- Added preferred `atomic` package manifest metadata alongside the legacy `pi` manifest metadata so Atomic package discovery uses Atomic-branded metadata without breaking pi-compatible installs.

### Changed

- Updated intercom documentation to describe Atomic's `~/.atomic/agent/intercom/` primary config/runtime path and legacy `~/.pi/agent/intercom/` fallback.
- Updated the registered intercom tool description and prompt snippet to use Atomic/Pi-neutral local agent session wording instead of hard-coding Pi-branded session names in model-visible text.

### Fixed

- Fixed Atomic intercom broker runtime paths to derive from the active Atomic agent directory, so `ATOMIC_CODING_AGENT_DIR` moves the broker socket, PID, spawn lock, and Windows launcher together while the legacy `PI_CODING_AGENT_DIR` alias remains supported.
- Fixed raw TypeScript intercom imports to use the bundled `@earendil-works/pi-tui` package name, matching Atomic's runtime dependency while preserving the public intercom API.
- Hardened default intercom broker startup so the pi-compatible `npx --no-install tsx` sentinel launches through the current runtime (`process.execPath`): Node-based installs use a resolved `tsx` CLI with a bundled `jiti` fallback, Bun source-checkout runs use the current Bun executable directly, and standalone Atomic Bun binaries re-enter the split launcher through a narrow internal broker handoff instead of treating the Atomic executable as a generic Bun interpreter; explicit custom `brokerCommand`/`brokerArgs` configs remain pass-through overrides.

## [0.9.4] - 2026-07-03

### Changed

- Published the stable Atomic 0.9.4 release for the intercom extension with its upstream pi TUI peer dependency aligned to `^0.80.3`; no intercom extension source changes were needed after 0.9.3.

## [0.9.4-alpha.6] - 2026-07-01

### Changed

- Aligned the intercom extension peer dependency with upstream pi TUI `^0.80.3`; no intercom extension source changes were needed for this metadata sync.

## [0.9.4-alpha.5] - 2026-07-01

### Changed

- Published a synchronized Atomic 0.9.4-alpha.5 prerelease for the intercom extension; no intercom extension changes were made after 0.9.4-alpha.1.

## [0.9.4-alpha.4] - 2026-06-30

### Changed

- Published a synchronized Atomic 0.9.4-alpha.4 prerelease for the intercom extension; no intercom extension changes were made after 0.9.4-alpha.1.

## [0.9.4-alpha.3] - 2026-06-30

### Changed

- Published a synchronized Atomic 0.9.4-alpha.3 prerelease for the intercom extension; no intercom extension changes were made after 0.9.4-alpha.1.

## [0.9.4-alpha.1] - 2026-06-29

### Changed

- Published a synchronized Atomic 0.9.4-alpha.1 prerelease for the intercom extension; no intercom extension changes were made after 0.9.3.

## [0.9.3] - 2026-06-29

### Changed

- Published the stable Atomic 0.9.3 release for the intercom extension with its upstream pi TUI peer dependency aligned to `^0.80.2`; no intercom extension source changes were needed after 0.9.2.

## [0.9.3-alpha.6] - 2026-06-29

### Changed

- Published a synchronized Atomic 0.9.3-alpha.6 prerelease for the intercom extension; no intercom extension changes were made after 0.9.3-alpha.5.

## [0.9.3-alpha.5] - 2026-06-28

### Changed

- Aligned the intercom extension peer dependency with upstream pi TUI `^0.80.2`; no intercom extension source changes were needed for this metadata sync.

## [0.9.3-alpha.4] - 2026-06-28

### Changed

- Published a synchronized Atomic 0.9.3-alpha.4 prerelease for the intercom extension; no intercom extension changes were made after 0.9.3-alpha.3.

## [0.9.3-alpha.3] - 2026-06-27

### Changed

- Published a synchronized Atomic 0.9.3-alpha.3 prerelease for the intercom extension; no intercom extension changes were made after 0.9.2.

## [0.9.2] - 2026-06-23

### Changed

- Published the stable Atomic 0.9.2 release with the intercom extension peer dependency aligned to upstream pi TUI `^0.79.10`; no intercom extension source changes were needed for this metadata sync.

## [0.9.2-alpha.1] - 2026-06-23

### Changed

- Aligned the intercom extension peer dependency with upstream pi TUI `^0.79.10`; no intercom extension source changes were needed for this metadata sync.

## [0.9.1] - 2026-06-23

### Changed

- Published the stable Atomic 0.9.1 release for the intercom extension; no functional intercom changes were made after 0.9.0.

## [0.9.1-alpha.1] - 2026-06-22

### Changed

- Published a synchronized Atomic 0.9.1-alpha.1 prerelease for the intercom extension; no functional intercom changes were made after 0.9.0.

## [0.9.0] - 2026-06-22

### Changed

- Published the stable Atomic 0.9.0 release with the intercom extension peer dependency aligned through upstream pi TUI `^0.79.9`, so coordination overlays and rendered message surfaces inherit the latest shared TUI compatibility fixes, including stabilized partial code-fence rendering during Markdown streaming.
- Changed contributor validation to include the monorepo-wide file-length gate for tracked TS/JS/Rust files in local `prek` hooks and PR CI, with only documented generated/vendored exclusions and no grandfathered baseline allowlist.
- No intercom extension source changes were needed after the 0.9.0 prerelease line.

## [0.9.0-alpha.2] - 2026-06-21

### Changed

- Aligned the intercom extension peer dependency with upstream pi TUI `^0.79.9` so coordination overlays and rendered message surfaces inherit the latest shared TUI compatibility fixes, including stabilized partial code-fence rendering during Markdown streaming; no intercom extension source changes were needed for this dependency-covered sync.

## [0.9.0-alpha.1] - 2026-06-20

### Changed

- Aligned the intercom extension peer dependency with upstream pi TUI `^0.79.7` so coordination UI surfaces consume the latest shared TUI color-scheme, Warp image capability, and compatibility fixes; no intercom extension code changes were made for this metadata sync ([#1413](https://github.com/bastani-inc/atomic/issues/1413)).
- Changed contributor validation to include the monorepo-wide file-length gate for tracked TS/JS/Rust files in local `prek` hooks and PR CI, with only documented generated/vendored exclusions and no grandfathered baseline allowlist ([#1445](https://github.com/bastani-inc/atomic/issues/1445)).

## [0.8.30] - 2026-06-17

### Changed

- Aligned the intercom extension peer dependency with upstream pi TUI `^0.79.4`; no intercom extension code changes were made.

## [0.8.29] - 2026-06-15

### Changed

- Published a synchronized Atomic 0.8.29 stable release with the upstream pi TUI dependency aligned to `^0.79.3`; no functional changes were made in the intercom extension.

## [0.8.28] - 2026-06-11

### Changed

- Published a synchronized Atomic 0.8.28 stable release; no functional changes were made in the intercom extension.

## [0.8.27] - 2026-06-08

### Changed

- Promoted the 0.8.27 prerelease package version to a stable release.

## [0.8.26] - 2026-06-08

### Changed

- Deferred broker client/spawn and overlay UI modules until intercom connects or the overlay opens, reducing default CLI startup cost ([#1223](https://github.com/bastani-inc/atomic/issues/1223)).

## [0.8.26-alpha.11] - 2026-06-08

### Changed

- Published a synchronized Atomic 0.8.26-alpha.11 prerelease alongside the subagent codebase-agent tool restriction changes; no functional changes were made in the intercom extension.

## [0.8.26-alpha.10] - 2026-06-08

### Changed

- Bumped package version for the Atomic 0.8.26-alpha.10 prerelease.

## [0.8.26-alpha.9] - 2026-06-07

### Changed

- Bumped package version for the Atomic 0.8.26-alpha.9 prerelease.

## [0.8.26-alpha.8] - 2026-06-07

### Changed

- Bumped package version for the Atomic 0.8.26-alpha.8 prerelease.

## [0.8.26-alpha.7] - 2026-06-07

### Changed

- Bumped package version for the Atomic 0.8.26-alpha.7 prerelease.

## [0.8.26-alpha.6] - 2026-06-06

### Changed

- Bumped package version for the Atomic 0.8.26-alpha.6 prerelease.

## [0.8.26-alpha.5] - 2026-06-06

### Changed

- Bumped package version for the Atomic 0.8.26-alpha.5 prerelease.

## [0.8.26-alpha.4] - 2026-06-05

### Changed

- Bumped package version for the Atomic 0.8.26-alpha.4 prerelease.

## [0.8.26-alpha.3] - 2026-06-05

### Changed

- Bumped package version for the Atomic 0.8.26-alpha.3 prerelease.

## [0.8.26-alpha.2] - 2026-06-05

### Changed

- Bumped package version for the Atomic 0.8.26-alpha.2 prerelease.

## [0.8.26-alpha.1] - 2026-06-05

### Changed

- Deferred broker client/spawn and overlay UI modules until intercom connects or the overlay opens, reducing default CLI startup cost ([#1223](https://github.com/bastani-inc/atomic/issues/1223)).

## [0.8.25] - 2026-06-04

### Changed

- Promoted the 0.8.25 prerelease package version to a stable release.

## [0.8.25-alpha.1] - 2026-06-04

### Changed

- Bumped package version for the Atomic 0.8.25-alpha.1 prerelease.

## [0.8.24] - 2026-06-04

### Changed

- Promoted the 0.8.24 prerelease package version to a stable release.

## [0.8.24-alpha.4] - 2026-06-04

### Changed

- Bumped package version for the Atomic 0.8.24-alpha.4 prerelease.

## [0.8.24-alpha.3] - 2026-06-03

### Changed

- Bumped package version for the Atomic 0.8.24-alpha.3 prerelease.

## [0.8.24-alpha.2] - 2026-06-03

### Changed

- Bumped package version for the Atomic 0.8.24-alpha.2 prerelease.

## [0.8.24-alpha.1] - 2026-06-02

### Changed

- Adopted the new `-alpha.N` prerelease version convention (revision starting at 1), replacing the legacy numeric `-N` prerelease suffix in the release tooling (bump script, CI publish validation, and changelog parsing).
- Dropped the leading `v` from release git tags and `release/`/`prerelease/` branch names; the Publish CI now triggers on and validates bare version tags such as `0.8.24` or `0.8.24-alpha.1`.

## [0.8.23] - 2026-06-02

### Changed

- Promoted the 0.8.23 prerelease package version to a stable release.

## [0.8.23-0] - 2026-06-02

### Changed

- Bumped package version for the Atomic 0.8.23 prerelease.

## [0.8.18] - 2026-05-27

### Changed
- Promoted the 0.8.18 prerelease package version to a stable release.

## [0.8.17] - 2026-05-26

### Changed
- Promoted the 0.8.17 prerelease package version to a stable release.

## [0.8.16] - 2026-05-26

### Changed
- Promoted the 0.8.16 prerelease package version to a stable release.

## [0.8.15] - 2026-05-26

### Changed
- Promoted the 0.8.15 prerelease package version to a stable release.

## [0.6.0] - 2026-05-03

### Added
- Added `brokerCommand` and `brokerArgs` config options for choosing the broker runtime command. Thanks to William Fligor for PR #12.

## [0.5.0] - 2026-05-03

### Changed
- Busy interactive sessions now queue inbound intercom messages until the receiver is idle instead of aborting the active turn.
- Sessions now publish automatic lifecycle status (`idle`, `thinking`, or `tool:<name>`) through intercom presence updates.
- Deferred startup connection, delayed inbound flushes, overlay work, reconnect attempts, and relay callbacks now guard against stale session contexts after shutdown or reload.
- `intercom` and `contact_supervisor` tool calls/results now use compact custom transcript renderers.

## [0.4.1] - 2026-05-02

### Added
- Added `contact_supervisor` `reason: "interview_request"` for child subagents to send structured supervisor interviews, wait for a reply, and receive parsed JSON replies in tool result details when available.

### Fixed
- Busy non-interactive sessions now auto-reply to top-level intercom messages instead of aborting and losing the message.

## [0.4.0] - 2026-05-02

### Added
- Added a `contact_supervisor` tool for `pi-subagents` child sessions so delegated agents can request supervisor decisions or send meaningful progress updates with run metadata.
- Documented subagent-to-supervisor escalation in the README and bundled `pi-intercom` skill.

### Fixed
- Made inline intercom message cards use the available terminal width instead of a narrow fixed width.
- Cleared supervisor ask waiters correctly after cancellation or delivery failure so subagents can ask again.

### Changed
- Stopped tracking `package-lock.json` and ignored local `progress.md` memory files.

## [0.3.0] - 2026-04-27

### Added
- Added `pi-subagents` grouped result relay support over `pi-intercom`, including delivery acknowledgments so parent runs can return compact receipts only after the orchestrator receives the result message.

## [0.2.1] - 2026-04-26

### Fixed
- Delivered `pi-subagents` needs-attention control events to the orchestrator over intercom.

## [0.2.0] - 2026-04-22

### Added
- Added receiver-side `reply` ergonomics for inbound asks. Agents can now use `intercom({ action: "reply", message })` in the triggered turn or later against a single pending ask, plus `intercom({ action: "pending" })` to inspect unresolved inbound asks.

### Fixed
- Migrated extension tool schemas from `@sinclair/typebox` to `typebox` 1.x so packaged installs follow Pi's current extension runtime contract.
- Included `reply-tracker.ts` in the published package so installed extensions can load the new reply-tracking helper at runtime.
- Updated the integration test harness to set `USERPROFILE` alongside `HOME`, keeping temp-home isolation reliable on Windows.

### Changed
- Moved TypeBox from `peerDependencies` to a real `dependencies` entry so `pi install` production installs keep the schema package available at runtime.
- Incoming ask reply hints now prefer `intercom({ action: "reply", ... })` instead of exposing raw `to` and `replyTo` identifiers.
- Updated the bundled `pi-intercom` skill and README examples to prefer `reply`/`pending` over manual reply threading.

## [0.1.11] - 2026-04-20

### Added
- Bundled `pi-intercom` skill with coordination patterns, error handling, constraints, and optional cmux/tmux peer-session spawning for visible multi-session workflows.
- `pi.skills` manifest in `package.json` so `pi install` loads the skill automatically.
- AGENTS.md snippet in README recommending a project-level coordination hint for agents.
- Attachments example to Quick Start section in README.

### Changed
- Incoming message reply hints now say "To reply, use the intercom tool:" instead of "— reply:" so agents are more likely to use the intercom tool instead of replying inline.
- `ask` action now documents the one-at-a-time constraint in the Tool Reference.
- `status` action now clarifies that the session count includes the current session.
- Broker startup no longer uses a non-null assertion for sender session lookup in the `send` handler — missing sessions now produce a `delivery_failed` response instead of a crash.
- Broker spawn lock error handling tightened to check `instanceof Error` before accessing `.code`.
- Broker PID parsing now guards against `NaN` from corrupt PID files.
- `isConnected()` readability cleanup in `IntercomClient`.
- README file structure updated to include `broker/paths.ts`, test files, and `skills/` directory.
- README runtime files section now clarifies that `broker.sock` is macOS/Linux only; Windows uses a named pipe.
- README mermaid diagram changed "Unix Socket" to "Local Socket/Pipe" for cross-platform accuracy.
- README broker limitation rephrased from "must be running" to "auto-spawns on first use and exits when idle."
- README Install section now mentions that the bundled skill is registered on startup.

## [0.1.10] - 2026-04-17

### Fixed
- Broker startup now works on Windows by launching the local `tsx` CLI through a hidden `wscript.exe` helper without treating the helper's expected early exit as a broker failure.

### Changed
- The broker now uses a Windows named pipe instead of a Unix socket on Windows, while keeping the existing Unix socket transport on macOS and Linux.

## [0.1.9] - 2026-04-17

### Fixed
- Declared the extension entry in `package.json` via `pi.extensions` so `pi install npm:pi-intercom` can discover and load the extension from the npm package.

### Changed
- Added `pi-package` package metadata plus peer dependency declarations for every Pi runtime package the extension imports, including `@mariozechner/pi-tui`.

## [0.1.8] - 2026-04-14

### Changed
- Intercom sessions now reconnect automatically after broker disconnects or sleep/wake interruptions instead of staying offline until reload or restart.
- Replaced raw runtime `console.error` intercom disconnect logging with silent recovery so transient broker churn no longer splashes stray text into the Pi TUI.

## [0.1.7] - 2026-04-13

### Changed
- Unnamed sessions now register a runtime-only `subagent-chat-<id>` intercom alias instead of persisting a generic session title into Pi session history, so `pi --resume` can keep showing transcript snippets while unnamed sessions remain reachable over intercom.
- Intercom presence updates now refresh the advertised session name during later turn/intercom activity, so renaming a session does not leave subagents and peers targeting a stale startup alias.

## [0.1.6] - 2026-04-13

### Changed
- Busy incoming intercom messages now try a graceful detach handshake with `pi-subagents` before falling back to interrupting the active turn.
- Reply follow-ups are deferred and re-delivered as follow-up wakeups so final confirmation messages stop causing unnecessary `Operation aborted` interruptions.
- Unnamed sessions now auto-register a stable `session-<id>` display name so orchestrators and delegated children can target each other reliably without a manual `/name`.

## [0.1.5] - 2026-04-13

### Changed
- Switched intercom send confirmation to opt-in. `send` now delivers immediately by default, and interactive confirmation only appears when `confirmSend: true` is set in `~/.pi/agent/intercom/config.json`.
- Replaced the old inverted `autoSend` config with `confirmSend` to make the behavior easier to understand.

## [0.1.4] - 2026-04-13

### Added
- Added an MIT `LICENSE` file and set `package.json` `license` to `MIT`.

### Changed
- Updated `README.md` to mention the `pi-subagents` integration and link to https://github.com/nicobailon/pi-subagents.

## [0.1.3] - 2026-04-10

### Changed
- **Clearer self vs peer identity** — `intercom({ action: "list" })` now shows `Current session` and `Other sessions`, includes short session IDs, and marks same-folder peers with `[same cwd]` so agents are less likely to mistake another session in the same repo for themselves.
- **Picker self anchor** — The session picker now shows the current session as a disabled `[self]` row at the top while keeping only peer sessions selectable.

## [0.1.2] - 2026-04-04

### Changed
- **Reply flows skip approval** — `send` calls that include `replyTo` now bypass the confirmation dialog so reply-hint conversations can continue without an extra approval step.
- **Overlay readability** — The session picker now shows session name/model on the first line and the cwd on a second line with middle truncation, making long paths much easier to distinguish.
- **Documentation clarity** — The README now explains which sessions appear in the picker, how sessions become intercom-connected, and the difference between user-facing `/intercom` usage and agent tool calls.

### Fixed
- **Compose overlay crash** — Replaced the invalid `tui.scheduleRender()` calls with `tui.requestRender()`, fixing the compose overlay crash while typing or sending.
- **Overlay panel chrome** — Restored bordered modal rendering for the session picker and compose overlay so they display as proper overlays instead of floating unboxed content.

## [0.1.1] - 2026-04-04

### Changed
- Added a `promptSnippet` for the `intercom` tool so Pi 0.59+ includes it in the default tool prompt section and improves session-to-session coordination discoverability.

### Changed
- **Pi compatibility refresh** — Updated the extension to match current Pi lifecycle and custom UI APIs, including `session_start` / `session_shutdown` and injected `ctx.ui.custom()` keybindings.
- **Overlay keybindings** — The session picker and compose overlay now use injected, namespaced Pi keybindings instead of reading editor-global bindings directly.
- **Session list correlation** — `list` / `sessions` now carry a `requestId`, so a delayed broker reply cannot be mistaken for a newer session-list request.
- **Reply sends skip approval** — `send` calls that include `replyTo` now bypass the confirmation dialog so reply-hint flows work without an extra approval step.
- **Documentation accuracy** — The README now matches the current implementation, including request correlation, persistence behavior, broker disconnect behavior, and the file layout.

### Fixed
- **Protocol state handling** — Broker and client now reject malformed, unknown, duplicate, and out-of-order protocol messages instead of silently accepting them.
- **Duplicate-name routing** — Sends to a duplicated session name now fail with an explicit error instead of routing to the first match.
- **Delivery failure visibility** — `delivery_failed.reason` now flows through the client, tool results, and compose overlay error UI.
- **Disconnect and startup errors** — Broker spawn failures, early broker exits, protocol failures, and disconnects now preserve the real error instead of collapsing to generic messages.
- **Disconnect-time writes** — Client operations now fail cleanly during disconnect instead of writing to a closing socket and triggering `write after end` errors.
- **Late-response handling** — Timed-out send/list requests no longer disconnect the client, and delayed list responses can no longer contaminate a later request with stale data.
- **Config validation** — Invalid intercom config values are now reported and ignored instead of silently producing a broken runtime config.

## [0.1.0] - 2026-03-12

### Added
- **`ask` action** — `intercom({ action: "ask", to, message })` now sends a message and blocks until the recipient replies, returning the reply as the tool result. Includes a 10-minute timeout, abort handling, disconnect handling, and shutdown cleanup.
- **Exact reply hints** — Incoming messages can now include a ready-to-run reply command that uses the sender's exact session ID as `to` and the original message ID as `replyTo`, making synchronous `ask`/reply flows reliable.
- **Attachment body rendering for incoming messages** — Incoming attachment contents are now appended to the agent-visible message body so recipients can read attached file/snippet/context content directly.
- **Planner/worker workflow documentation** — README now documents the intended planner-worker loop, including `send` vs `ask`, clarification patterns, and reply-hint behavior.

### Changed
- **Session target resolution** — `send` and `ask` now resolve a unique case-insensitive session name to its exact session ID before sending. Ambiguous names are rejected instead of guessed.
- **Duplicate-name presentation** — Session labels are now disambiguated consistently across `list`, the session picker, the compose overlay, and send notifications by appending a short session ID when names collide.
- **Send confirmation dialog** — Confirmation text now includes attachment content previews and `replyTo` metadata so outgoing messages are reviewed accurately before sending.
- **Inline message rendering** — The custom inline renderer now shows the fully rendered message body, optional reply command, attachment summaries, and reply metadata consistently with what the agent receives.

### Fixed
- **False `ask` completions from unrelated messages** — Reply matching now requires an exact `replyTo` match and the expected sender, preventing unrelated incoming messages from unblocking a waiting `ask`.
- **Self-targeted messages** — `send` and `ask` now reject attempts to message the current session instead of allowing loops or self-waits.
- **Undelivered `ask` cleanup** — If an `ask` message is not delivered, the waiting state is torn down cleanly instead of lingering.
- **Inline renderer/body mismatch** — The custom message renderer now matches the actual delivered message body for messages with attachments instead of showing a reduced view.
- **Duplicate-name ambiguity when self shares a name** — Duplicate-name detection now considers all connected sessions, so another session is still disambiguated when it shares a name with the current session.
- **`broker/client.ts` `sessions` switch scoping** — Braced the `sessions` case to avoid block-scoping hazards in the message handler.
