agents-can-communicate 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/README.md +28 -7
  2. package/SECURITY.md +1 -1
  3. package/bin/acc-bootstrap.mjs +5 -54
  4. package/bin/acc-claude-channel.mjs +8 -175
  5. package/bin/acc-hook.mjs +4 -133
  6. package/bin/acc-mcp.mjs +4 -59
  7. package/bin/acc-update-worker.mjs +8 -0
  8. package/bin/acc.mjs +5 -39
  9. package/bin/entrypoints/acc-bootstrap.mjs +47 -0
  10. package/bin/entrypoints/acc-claude-channel.mjs +149 -0
  11. package/bin/entrypoints/acc-hook.mjs +58 -0
  12. package/bin/entrypoints/acc-mcp.mjs +70 -0
  13. package/bin/entrypoints/acc.mjs +51 -0
  14. package/bin/entrypoints/claude-channel-stdio.mjs +29 -0
  15. package/bin/entrypoints/hook-output.mjs +73 -0
  16. package/docs/ADAPTER_AUTHORING.md +41 -7
  17. package/docs/ARCHITECTURE.md +62 -11
  18. package/docs/CAPABILITIES.md +40 -36
  19. package/docs/CLI.md +143 -25
  20. package/docs/CONCEPTS.md +13 -6
  21. package/docs/CONFIGURATION.md +37 -22
  22. package/docs/DESIGN_DECISIONS.md +16 -11
  23. package/docs/GETTING_STARTED.md +37 -7
  24. package/docs/GLOSSARY.md +9 -3
  25. package/docs/HOW_IT_WORKS.md +32 -11
  26. package/docs/MCP.md +91 -24
  27. package/docs/PROTOCOL.md +69 -12
  28. package/docs/RELEASING.md +28 -10
  29. package/docs/SECURITY_MODEL.md +45 -13
  30. package/docs/TROUBLESHOOTING.md +76 -18
  31. package/docs/UPGRADING.md +119 -0
  32. package/docs/WHY_ACC.md +5 -4
  33. package/docs/index.md +8 -0
  34. package/node_modules/@agents-can-communicate/adapter-claude-code/package.json +1 -1
  35. package/node_modules/@agents-can-communicate/adapter-claude-code/plugin/skills/acc/SKILL.md +106 -5
  36. package/node_modules/@agents-can-communicate/adapter-claude-code/src/install.mjs +6 -6
  37. package/node_modules/@agents-can-communicate/adapter-claude-code/src/native-delivery.mjs +2 -1
  38. package/node_modules/@agents-can-communicate/adapter-codex/certification.json +38 -13
  39. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/certification-provenance.json +220 -0
  40. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-current-binding-product-evidence.json +1549 -0
  41. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-current-binding-product.json +27 -0
  42. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-product-evidence.json +1549 -0
  43. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-product.json +27 -0
  44. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-transport-evidence.json +259 -0
  45. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-transport.json +21 -0
  46. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-current-binding-product-evidence.json +1549 -0
  47. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-current-binding-product.json +27 -0
  48. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-product-evidence.json +1549 -0
  49. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-product.json +27 -0
  50. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-transport-evidence.json +259 -0
  51. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-transport.json +21 -0
  52. package/node_modules/@agents-can-communicate/adapter-codex/package.json +14 -2
  53. package/node_modules/@agents-can-communicate/adapter-codex/plugin/skills/acc/SKILL.md +106 -5
  54. package/node_modules/@agents-can-communicate/adapter-codex/src/adapter.mjs +26 -44
  55. package/node_modules/@agents-can-communicate/adapter-codex/src/app-server-client.mjs +70 -17
  56. package/node_modules/@agents-can-communicate/adapter-codex/src/config-block.mjs +231 -0
  57. package/node_modules/@agents-can-communicate/adapter-codex/src/hooks.mjs +1 -1
  58. package/node_modules/@agents-can-communicate/adapter-codex/src/install.mjs +71 -63
  59. package/node_modules/@agents-can-communicate/adapter-codex/src/native-delivery.mjs +107 -103
  60. package/node_modules/@agents-can-communicate/adapter-codex/src/native-endpoint.mjs +96 -0
  61. package/node_modules/@agents-can-communicate/adapter-codex/src/ws-json-rpc.mjs +3 -2
  62. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/gemini-extension.json +1 -1
  63. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/skills/acc/SKILL.md +106 -5
  64. package/node_modules/@agents-can-communicate/adapter-gemini-cli/package.json +1 -1
  65. package/node_modules/@agents-can-communicate/adapter-gemini-cli/src/install.mjs +2 -2
  66. package/node_modules/@agents-can-communicate/adapter-grok/package.json +1 -1
  67. package/node_modules/@agents-can-communicate/adapter-grok/plugin/skills/acc/SKILL.md +106 -5
  68. package/node_modules/@agents-can-communicate/adapter-grok/src/install.mjs +2 -2
  69. package/node_modules/@agents-can-communicate/adapter-kimi/package.json +1 -1
  70. package/node_modules/@agents-can-communicate/adapter-kimi/plugin/skills/acc/SKILL.md +106 -5
  71. package/node_modules/@agents-can-communicate/adapter-kimi/src/hooks.mjs +1 -1
  72. package/node_modules/@agents-can-communicate/adapter-kimi/src/install.mjs +2 -2
  73. package/node_modules/@agents-can-communicate/adapter-sdk/package.json +1 -1
  74. package/node_modules/@agents-can-communicate/adapter-sdk/src/capabilities.mjs +5 -0
  75. package/node_modules/@agents-can-communicate/adapter-sdk/src/context-projector.mjs +26 -4
  76. package/node_modules/@agents-can-communicate/adapter-sdk/src/decision-text.mjs +19 -0
  77. package/node_modules/@agents-can-communicate/adapter-sdk/src/hook-shim.mjs +5 -3
  78. package/node_modules/@agents-can-communicate/adapter-sdk/src/index.mjs +1 -0
  79. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-delivery.mjs +9 -2
  80. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-vocabulary.mjs +2 -6
  81. package/node_modules/@agents-can-communicate/adapter-sdk/src/session-binding.mjs +29 -9
  82. package/node_modules/@agents-can-communicate/adapter-sdk/src/toml-block.mjs +8 -6
  83. package/node_modules/@agents-can-communicate/cli/package.json +4 -2
  84. package/node_modules/@agents-can-communicate/cli/src/args.mjs +49 -22
  85. package/node_modules/@agents-can-communicate/cli/src/doctor-command.mjs +11 -4
  86. package/node_modules/@agents-can-communicate/cli/src/git-probe.mjs +9 -3
  87. package/node_modules/@agents-can-communicate/cli/src/help.mjs +109 -14
  88. package/node_modules/@agents-can-communicate/cli/src/install-command.mjs +22 -4
  89. package/node_modules/@agents-can-communicate/cli/src/main.mjs +35 -12
  90. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/activation.mjs +110 -0
  91. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/command.mjs +63 -0
  92. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/download.mjs +71 -0
  93. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/entry.mjs +110 -0
  94. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/generation.mjs +167 -0
  95. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/install.mjs +73 -0
  96. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/launchers.mjs +60 -0
  97. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/leases.mjs +60 -0
  98. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/location.mjs +55 -0
  99. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/mutex.mjs +145 -0
  100. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/policy.mjs +4 -0
  101. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/refresh.mjs +40 -0
  102. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/schedule.mjs +21 -0
  103. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/state.mjs +122 -0
  104. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/worker.mjs +65 -0
  105. package/node_modules/@agents-can-communicate/cli/src/session-owner.mjs +33 -108
  106. package/node_modules/@agents-can-communicate/cli/src/update-command.mjs +25 -7
  107. package/node_modules/@agents-can-communicate/core/package.json +1 -1
  108. package/node_modules/@agents-can-communicate/core/src/attention.mjs +3 -0
  109. package/node_modules/@agents-can-communicate/core/src/claims.mjs +13 -8
  110. package/node_modules/@agents-can-communicate/core/src/conversations.mjs +9 -25
  111. package/node_modules/@agents-can-communicate/core/src/decision-changes.mjs +36 -0
  112. package/node_modules/@agents-can-communicate/core/src/decision-state.mjs +42 -0
  113. package/node_modules/@agents-can-communicate/core/src/delivery-bindings.mjs +11 -4
  114. package/node_modules/@agents-can-communicate/core/src/inbox.mjs +48 -17
  115. package/node_modules/@agents-can-communicate/core/src/intents.mjs +35 -15
  116. package/node_modules/@agents-can-communicate/core/src/materialisation.mjs +7 -5
  117. package/node_modules/@agents-can-communicate/core/src/message-pages.mjs +75 -0
  118. package/node_modules/@agents-can-communicate/core/src/next-turn-delivery.mjs +31 -0
  119. package/node_modules/@agents-can-communicate/core/src/session-opening.mjs +128 -0
  120. package/node_modules/@agents-can-communicate/core/src/sessions.mjs +58 -132
  121. package/node_modules/@agents-can-communicate/core/src/sync.mjs +31 -2
  122. package/node_modules/@agents-can-communicate/delivery-router/package.json +1 -1
  123. package/node_modules/@agents-can-communicate/delivery-router/src/refresh-binding.mjs +38 -0
  124. package/node_modules/@agents-can-communicate/delivery-router/src/router.mjs +86 -10
  125. package/node_modules/@agents-can-communicate/hook-runner/package.json +1 -1
  126. package/node_modules/@agents-can-communicate/hook-runner/src/client-version.mjs +1 -0
  127. package/node_modules/@agents-can-communicate/hook-runner/src/native-binding.mjs +6 -4
  128. package/node_modules/@agents-can-communicate/hook-runner/src/native-retirement.mjs +48 -0
  129. package/node_modules/@agents-can-communicate/hook-runner/src/process-table.mjs +1 -1
  130. package/node_modules/@agents-can-communicate/hook-runner/src/runner.mjs +175 -67
  131. package/node_modules/@agents-can-communicate/hook-runner/src/session-lifecycle.mjs +13 -0
  132. package/node_modules/@agents-can-communicate/installer/package.json +1 -1
  133. package/node_modules/@agents-can-communicate/installer/src/apply.mjs +17 -2
  134. package/node_modules/@agents-can-communicate/installer/src/bootstrap-runtime.mjs +11 -5
  135. package/node_modules/@agents-can-communicate/installer/src/detect.mjs +1 -1
  136. package/node_modules/@agents-can-communicate/installer/src/index.mjs +1 -0
  137. package/node_modules/@agents-can-communicate/installer/src/live-policy.mjs +21 -0
  138. package/node_modules/@agents-can-communicate/installer/src/native-activation.mjs +20 -6
  139. package/node_modules/@agents-can-communicate/installer/src/ownership.mjs +10 -4
  140. package/node_modules/@agents-can-communicate/installer/src/plan.mjs +3 -3
  141. package/node_modules/@agents-can-communicate/mcp-server/package.json +1 -1
  142. package/node_modules/@agents-can-communicate/mcp-server/src/protocol.mjs +85 -0
  143. package/node_modules/@agents-can-communicate/mcp-server/src/resources.mjs +3 -2
  144. package/node_modules/@agents-can-communicate/mcp-server/src/server.mjs +59 -57
  145. package/node_modules/@agents-can-communicate/mcp-server/src/tools.mjs +47 -33
  146. package/node_modules/@agents-can-communicate/protocol/package.json +1 -1
  147. package/node_modules/@agents-can-communicate/protocol/src/conversations.mjs +3 -0
  148. package/node_modules/@agents-can-communicate/protocol/src/decision-changes.mjs +15 -0
  149. package/node_modules/@agents-can-communicate/protocol/src/index.mjs +3 -1
  150. package/node_modules/@agents-can-communicate/protocol/src/schema.mjs +14 -5
  151. package/node_modules/@agents-can-communicate/storage-filesystem/package.json +1 -1
  152. package/node_modules/@agents-can-communicate/storage-filesystem/src/atomic-json.mjs +5 -1
  153. package/node_modules/@agents-can-communicate/storage-filesystem/src/deadline.mjs +7 -0
  154. package/node_modules/@agents-can-communicate/storage-filesystem/src/index.mjs +2 -0
  155. package/node_modules/@agents-can-communicate/storage-filesystem/src/session-read.mjs +25 -0
  156. package/node_modules/@agents-can-communicate/storage-filesystem/src/store.mjs +28 -25
  157. package/package.json +2 -1
@@ -4,10 +4,17 @@ Install ACC, open the AI sessions you already use, and give them related work. S
4
4
  integrations make peers visible and teach each agent how to communicate. You do not need to
5
5
  carry messages between windows or add coordination instructions to your task prompts.
6
6
 
7
+ Active hooks supply each agent's own CLI arguments in coordination context; the installed
8
+ skill tells the agent to use them. This path was observed in Claude Code 2.1.263 and
9
+ Codex 0.153.4. Hooks must be enabled and trusted by the client. Without hook context, owner
10
+ operations require an explicit pair or session-bound ACC MCP tools. See [CLI ownership](CLI.md#coordinate-from-a-session).
11
+
7
12
  ## 1. Install once on this machine
8
13
 
9
14
  ACC requires macOS or Linux and Node.js 24 or newer.
10
15
 
16
+ Already using 0.3.1? Follow the [upgrade guide](UPGRADING.md) before mixing versions.
17
+
11
18
  ```bash
12
19
  npm install -g agents-can-communicate
13
20
  ```
@@ -17,9 +24,21 @@ npm install -g agents-can-communicate
17
24
  acc install
18
25
  ```
19
26
 
27
+ Installation also enables automatic updates. ACC downloads releases in the background and
28
+ refreshes its runtime and skills when active clients have left. Use `acc update` for an
29
+ immediate update, or `acc update --auto off` to disable background updates. See
30
+ [update controls](UPGRADING.md#automatic-updates-after-installation).
31
+
20
32
  The installer connects only the supported clients it finds. Open a new terminal and
21
- restart any running clients so they load their integrations. Codex asks you to trust its
22
- plugin once.
33
+ restart any running clients so they load their integrations. Follow the activation steps
34
+ printed by the installer. In Codex, use `/plugins` to check ACC is enabled, then `/hooks`
35
+ to review each ACC hook and enable/trust its current definition if needed. Restart the
36
+ session after that review; changed hook definitions may require trust again.
37
+
38
+ If the installer preserved your existing Codex sandbox settings, verify the named ACC
39
+ state directory is in `sandbox_workspace_write.writable_roots` in the config it identifies.
40
+ ACC keeps those user settings unchanged. Installed files alone do not establish that hooks
41
+ are active; `acc doctor` leaves current readiness unverified and directs you to Codex.
23
42
 
24
43
  If you opt into Claude Code's experimental idle delivery, Claude also shows its own
25
44
  development-channel warning at every startup. The feature is off by default, can spend
@@ -46,6 +65,16 @@ Same-client addresses can be ambiguous when several instances are live; agents u
46
65
  exact participant ids in the roster when needed. See [Concepts](CONCEPTS.md) for participant
47
66
  and session identity.
48
67
 
68
+ A second repeatable pattern is review and handoff. Ask the implementing agent to request
69
+ review of an identified revision (a commit when Git is available, or named files and
70
+ version otherwise) and wait for the verdict. Ask the reviewer to return blocking defects
71
+ or approval. If either session must stop, it can leave a durable handoff naming completed
72
+ work, remaining work, and blockers. A later session can recover it from history. The
73
+ underlying commands are [`acc request`](CLI.md#messages-and-requests), exact
74
+ [`acc inbox --message`](CLI.md#inbox-reply-and-acknowledgement),
75
+ [`acc reply`](CLI.md#inbox-reply-and-acknowledgement), and
76
+ [`acc finish`](CLI.md#handoff).
77
+
49
78
  ## 3. Watch for useful coordination
50
79
 
51
80
  Look for an agent discovering a peer, publishing the files it expects to change, noticing a
@@ -71,11 +100,12 @@ CLI, and Kimi Code can receive a message at the next normal turn. That does not
71
100
  session. Grok, generic MCP clients, unknown versions, and unsupported platforms use the
72
101
  durable inbox instead.
73
102
 
74
- Claude Code's optional native channel is the only shipped idle-delivery path. It is
75
- experimental, never interrupts a turn already in progress, and remains subject to current
76
- reachability and recipient policy. Codex native live delivery is withdrawn; Codex uses its
77
- certified next-turn path or inbox. Read [Capabilities](CAPABILITIES.md) for exact versions,
78
- platforms, and limitations.
103
+ Codex LocalDaemon and Claude Code Channel offer optional native delivery on
104
+ Apple Silicon macOS. They are experimental, can spend tokens, and queue messages
105
+ until a running turn finishes. Codex requires 0.152.1 or newer, an already-running
106
+ LocalDaemon, recorded opt-in and a verified session; start it with your normal
107
+ command. A loaded daemon thread can receive messages after its terminal exits.
108
+ [Capabilities](CAPABILITIES.md) explains policy, versions and fallback.
79
109
 
80
110
  Delivery evidence is deliberately narrow: `queued -> offered -> retrieved -> acknowledged`.
81
111
  An offer is not proof that the model read anything, retrieval is not proof of attention, and
package/docs/GLOSSARY.md CHANGED
@@ -7,7 +7,7 @@
7
7
  - **Presence** — `online`, `stale`, or `offline`, based only on observed heartbeat and pid facts.
8
8
  - **Intent** — a session's current summary and resource hints; awareness, not permission.
9
9
  - **Claim** — a leased reservation for a canonical resource such as `file:src/**`.
10
- - **Advisory / guarded** — a claim peers must respect versus one ACC can stop on measured client write paths; neither stops unrelated local processes.
10
+ - **Advisory / guarded** — CLI claims default to advisory. Explicit guarded enforcement also requires certified guards from every live participant; neither mode stops unrelated local processes.
11
11
  - **Message** — an attributed untrusted `note`, `question`, `request`, `answer`, `decision`, or `handoff`.
12
12
  - **Thread** — a root message plus linked answers sharing one immutable `threadId`.
13
13
  - **Obligation** — `none`, `reply`, or `acknowledge`; what communication the recipient owes.
@@ -16,11 +16,17 @@
16
16
  - **Retrieved** — the participant received the body; not proof of model attention.
17
17
  - **Acknowledged** — that participant explicitly acknowledged or replied; a reply is not proof requested work finished.
18
18
  - **Next-turn delivery** — certified projection at the client's next normal turn; it never interrupts an active turn.
19
- - **Live push** — optional delivery to an already-running session through an official certified client API. Claude Code 2.1.258+ on macOS arm64 qualifies, behind an opt-in; it waits for a turn in progress rather than interrupting it.
19
+ - **Live push** — optional delivery through Claude Code Channel or Codex LocalDaemon to an already-running session, behind recipient opt-in. Both wait for an active turn to finish; [Capabilities](CAPABILITIES.md) gives the measured eligibility and limits.
20
20
  - **Recipient policy** — `off`, `actionable`, or `all`; opt-in permission to spend a turn, not a capability.
21
21
  - **Delivery binding** — ephemeral, generation-bound reachability data owned by an adapter.
22
22
  - **Fallback** — durable inbox or exact-certified next-turn recovery when live delivery is unavailable.
23
23
  - **Managed / manual lifecycle** — whether hooks report ACC presence automatically; never ownership of the external client process.
24
- - **MCP participation** — polling access to durable communication without native lifecycle, context, guards, or push.
24
+ - **MCP participation** — manual incoming polling without native lifecycle, context, guards, or receive wake; outgoing messages can use an eligible recipient's opted-in native route.
25
+ - **Bounded discovery** — inbox/history summary pages with limits and cursors; bodies require selection.
26
+ - **Exact recovery** — read one addressed inbox body, or one history record; history reads do not advance receipts.
27
+ - **Decision change** — an immutable decision explicitly supersedes or withdraws prior decisions; old records remain.
28
+ - **Current decision** — a terminal recorded position or withdrawal, not proven truth; competing branches stay visible.
29
+ - **Managed runtime** — ACC's staged installation generations and automatic-update controls, distinct from managed/manual session presence.
30
+ - **Activation hold** — an ACC process lease or native binding that postpones runtime refresh; observed lifecycle cleanup can release a native hold without stopping a vendor daemon.
25
31
 
26
32
  See [Concepts](CONCEPTS.md) for relationships and [Protocol](PROTOCOL.md) for exact rules.
@@ -32,7 +32,8 @@ ACC workspace. The native integration also gives the agent a small skill describ
32
32
  discovery, messages, replies, claims, and handoffs.
33
33
 
34
34
  A generic MCP client instead joins through `acc-mcp`, which resolves its configured
35
- participant and workspace when tools or resources are called. It exposes the coordination
35
+ participant and workspace on tool calls or inbox resource reads. Snapshot and roster
36
+ resource reads do not need that owner resolution. It exposes the coordination
36
37
  tools but does not install the native clients' skill. See its
37
38
  [manual MCP boundary](MCP.md#account-for-the-manual-boundary).
38
39
 
@@ -95,8 +96,9 @@ receipts. [Protocol](PROTOCOL.md) defines these rules precisely.
95
96
 
96
97
  All recipients have the same durable record, but adapters expose different acceleration:
97
98
 
98
- - **Durable inbox:** universal recovery. An agent can retrieve the complete addressed
99
- message with `acc inbox`, including by exact message id after compaction.
99
+ - **Durable inbox:** universal recovery. `acc inbox` discovers bounded message headers;
100
+ `acc inbox --message <id>` retrieves one complete addressed message after selection
101
+ or compaction.
100
102
  - **Next normal turn:** exact captured versions of Codex, Claude Code, Gemini CLI, and Kimi
101
103
  Code can receive complete attributed peer context when the user next prompts that client.
102
104
  This does not wake an idle session.
@@ -105,9 +107,15 @@ All recipients have the same durable record, but adapters expose different accel
105
107
  default, can spend tokens, never interrupts a running turn, and requires the vendor's
106
108
  visible development-channel warning.
107
109
 
108
- Codex native live delivery is withdrawn because the required remote mode hides the
109
- session's real workspace. Grok, generic MCP, unknown versions, and uncaptured platforms use
110
- inbox polling. [Capabilities](CAPABILITIES.md) lists the evidence and exact fallbacks.
110
+ - **Optional Codex LocalDaemon delivery:** on Apple Silicon macOS, a captured
111
+ minimum of 0.152.1 plus a current probe and exact session checks allow delivery
112
+ to an independently opened thread. It is experimental, off by default, and can
113
+ spend tokens. Messages wait for a running turn to finish; a daemon-retained
114
+ thread can receive them after its terminal exits. ACC adds no launch arguments
115
+ and does not manage the vendor daemon.
116
+
117
+ Grok, generic MCP, unsupported versions and uncaptured platforms use inbox polling.
118
+ [Capabilities](CAPABILITIES.md) lists evidence and fallback.
111
119
 
112
120
  When a complete projected body cannot fit the configured byte budget, ACC keeps the message
113
121
  id and exact inbox recovery command rather than silently truncating the peer's words.
@@ -141,13 +149,26 @@ Before changing files, an agent can publish intent and claim a narrow resource s
141
149
  `file:packages/api/**`. Another live session attempting an overlapping claim receives exit
142
150
  code `5` with the holder, giving the peers a chance to narrow or sequence their work.
143
151
 
144
- Claims are not operating-system locks. A claim is `guarded` only when every relevant live
145
- client exposes a captured pre-write guard for the path ACC can recognize. Otherwise it is
146
- `advisory`. Even a guarded claim cannot stop an unrelated program or a write path the client
147
- does not expose. [Concepts](CONCEPTS.md#intent-is-awareness-a-claim-commits) explains the
152
+ Claims are not operating-system locks. CLI claims default to `advisory`. Explicit
153
+ `--enforcement guarded` also requires every relevant live client to expose a captured
154
+ pre-write guard for the path ACC can recognize; otherwise workspace protection is advisory.
155
+ Even a guarded claim cannot stop an unrelated program or a write path the client does not
156
+ expose. [Concepts](CONCEPTS.md#intent-is-awareness-a-claim-commits) explains the
148
157
  user-facing distinction.
149
158
 
150
- ## 8. The boundaries remain visible
159
+ ## 8. Peers recover history and explicit decision changes
160
+
161
+ Inbox and history listings expose bounded summaries. After compaction or a new conversation,
162
+ a peer selects exact records to recover full decisions or handoffs; a new participant does
163
+ not inherit an old participant's inbox. History reads preserve receipt state.
164
+
165
+ A peer can explicitly supersede or withdraw an earlier decision. Prior records remain,
166
+ and current-decision discovery shows terminal positions, withdrawals, and competing
167
+ branches. This reports peers' recorded positions, not verified current truth. See
168
+ [historical recovery](CLI.md#historical-recovery) and
169
+ [decision lifecycle](PROTOCOL.md#decision-lifecycle). No full history is automatically injected.
170
+
171
+ ## 9. The boundaries remain visible
151
172
 
152
173
  ACC stores only coordination data an agent explicitly publishes: identity, presence,
153
174
  one-line intent, claims, messages, replies, handoffs, receipts, and events. It never collects
package/docs/MCP.md CHANGED
@@ -1,9 +1,11 @@
1
1
  # MCP
2
2
 
3
3
  Use `acc-mcp` when a client can call MCP tools but has no native ACC adapter. The server
4
- exposes durable messages, threads, receipts, intent, claims, and handoffs over stdio. It is
5
- a manual polling integration: it cannot infer the client's lifecycle, intercept writes,
6
- inject a normal turn, or push a message.
4
+ exposes durable messages, threads, receipts, intent, claims, and handoffs over stdio.
5
+ Receiving through MCP requires manual polling: it cannot infer the client's lifecycle,
6
+ intercept writes, inject a normal turn, or wake the MCP client for incoming messages.
7
+ Outgoing messages commit first and may then be offered through an eligible recipient's
8
+ native adapter when that recipient's delivery policy permits it.
7
9
 
8
10
  ```mermaid
9
11
  graph LR
@@ -29,22 +31,30 @@ identity for this server. It comes from user-owned launch configuration, never f
29
31
  server uses its launch directory, which may be a different workspace from the other
30
32
  sessions.
31
33
 
32
- The server implements MCP protocol revision `2026-07-28` over newline-delimited JSON-RPC
33
- stdio. Tool input schemas are closed: unknown fields and invalid conditional shapes are
34
- rejected before a session is resolved.
34
+ The server supports initialized MCP clients using `2025-06-18` or `2025-11-25`, and
35
+ the per-request metadata interface in `2026-07-28`, over newline-delimited JSON-RPC stdio.
36
+ Initialized clients send `initialize`, accept the negotiated revision, then send
37
+ `notifications/initialized` before calling tools. Unknown initialization revisions receive
38
+ `2025-11-25`; the client decides whether it supports that revision. Transport initialization
39
+ does not create an ACC participant: a tool call or inbox resource read resolves it.
40
+
41
+ Tool input schemas are closed: unknown fields and invalid conditional shapes are
42
+ rejected before a session is resolved. Approve the ACC tools through your client's normal
43
+ permission controls. A headless client configured to reject approval requests can connect
44
+ successfully yet refuse tool calls; that is distinct from a protocol handshake failure.
35
45
 
36
46
  ## Call the durable tools
37
47
 
38
48
  | Tool | Required input | Optional input |
39
49
  |---|---|---|
40
50
  | `acc_status` | — | — |
41
- | `acc_sync` | — | `cursor`, `scope: delta|full`, `limit: 1..500` |
51
+ | `acc_sync` | — | `cursor`, `scope: delta|full|history`, `limit: 1..500`, `kind`, `messageId`, `current` |
42
52
  | `acc_work` | `summary` and `mode`, or `clear: true` | `state`, `resourceHints` |
43
53
  | `acc_claim` | `action`; `resource` for acquire, `claimId` for renew | `mode`, `reason`, `leaseSeconds` where valid |
44
54
  | `acc_release` | `claimId` | — |
45
- | `acc_message` | `to`, `subject`, `body` | `kind`, `obligation`, `clientMessageId` |
55
+ | `acc_message` | `to`, `subject`, `body` | `kind`, `obligation`, `clientMessageId`, `supersedes`, `withdraws` |
46
56
  | `acc_request` | `toParticipantId`, `title` | `detail`, `clientMessageId` |
47
- | `acc_inbox` | — | `messageId` |
57
+ | `acc_inbox` | — | `messageId`, `cursor`, `limit: 1..500` |
48
58
  | `acc_reply` | `messageId`, `body` | `subject`, `clientMessageId` |
49
59
  | `acc_ack` | `messageId` | — |
50
60
  | `acc_finish` | `goal` | `status`, `completed`, `remaining`, `blockers`, `toParticipantId`, `clientMessageId` |
@@ -53,15 +63,46 @@ All tool names above are the complete model-facing surface. There are no executi
53
63
  client-control tools.
54
64
 
55
65
  Send-like tools return a raw structured object with `{ message, delivery }`; their text
56
- content is the JSON serialization of the same value. `acc_inbox` returns message/receipt
57
- pairs and advances only this participant's receipts to `retrieved`. `acc_reply` writes an
58
- `answer` and acknowledges the original atomically. `acc_ack` exposes no receipt-state
59
- parameter.
66
+ content is the JSON serialization of the same value. Default `acc_inbox` returns
67
+ `{items, nextCursor}`: read-only pending message summaries paired with receipts, newest
68
+ first. It never retrieves bodies. Pages default to 20 items, at most 12,000 bytes of
69
+ formatted page JSON before MCP framing. `cursor` is the complete message id from
70
+ `nextCursor`; omit it on a new poll to see arrivals. Reading or acknowledging the anchor
71
+ between pages does not shift continuation. The summary field allowlist, byte limit,
72
+ and live-page semantics are described in [CLI](CLI.md#inbox-reply-and-acknowledgement).
73
+
74
+ With an exact `messageId`, `acc_inbox` returns a one-item array with the complete
75
+ message/receipt pair and advances only that participant's receipt to `retrieved` when
76
+ needed. Exact acknowledged inspection preserves receipt state, timestamp, and event
77
+ history. Do not combine `messageId` with cursor or limit. Resolved mail stays out of lists.
78
+ `acc_reply` writes an `answer` and acknowledges the original atomically. It additionally
79
+ returns `receipt` for that original message; `message` and `delivery` describe the outgoing
80
+ answer. `acc_ack` exposes no receipt-state parameter.
81
+
82
+ For initialized 2025 clients, array results such as exact `acc_inbox` reads are JSON in text content,
83
+ with `structuredContent` omitted because those revisions require an object there.
84
+ Object results retain both representations. The 2026 interface also returns raw arrays
85
+ in `structuredContent` and uses the `resultType: "complete"` envelope.
60
86
 
61
87
  Resources are `acc://snapshot`, `acc://roster`, and `acc://inbox`. Reading `acc://inbox`
62
- resolves the configured MCP participant and advances only the returned receipts to
63
- `retrieved`, just like the inbox tool. Snapshot and roster reads do not advance receipts.
64
- A full snapshot is for explicit workspace forensics.
88
+ resolves the configured MCP participant and returns the same read-only summary page as
89
+ `acc_inbox {}`. Continue via the tool using `cursor`; retrieve a body with `messageId`.
90
+ Snapshot and roster reads do not advance receipts either. `acc://snapshot` and sync with
91
+ `scope: "full"` remain unbounded, for explicit workspace forensics.
92
+
93
+ `acc_sync {scope: "history", kind: "handoff"}` returns
94
+ `{scope: "history", view: "summary", items, nextCursor}` using the same message summary
95
+ fields and page limits. The optional kind filter applies before paging. Continue with
96
+ the complete `nextCursor` message id and the same filter. Then use
97
+ `acc_sync {scope: "history", messageId: "message_x"}` to receive one complete historical
98
+ message in `items`, with `view: "message"` and no receipt change. Exact reads reject
99
+ cursor, limit, and kind. `kind` and `messageId` require history scope; delta/full retain
100
+ 16-digit event cursors. History exposes recorded peer claims, not their current validity.
101
+
102
+ An addressed handoff requires a participant already known to the workspace. For a future
103
+ session that has not joined, omit `toParticipantId` to leave a workspace handoff. A later
104
+ session can recover that historical handoff through the history list and exact read;
105
+ its addressed inbox will not contain past workspace broadcasts.
65
106
 
66
107
  ## Account for the manual boundary
67
108
 
@@ -79,16 +120,42 @@ An MCP participant therefore reports `advisory` enforcement and `manual` lifecyc
79
120
  workspace protection is the weakest live participant's real guarantee, one MCP session
80
121
  makes guarded claims advisory for the room.
81
122
 
82
- ## Poll without overstating delivery
123
+ ## Decision changes
124
+
125
+ `acc_message` with `kind: "decision"` accepts either `supersedes: ["message_x"]`
126
+ or `withdraws: ["message_x"]`: 1..16 unique existing decision IDs. Supply `to: []`
127
+ to inherit target authors and recipients, including offline participants, or add
128
+ recipients explicitly. Body states the new position or reason for withdrawal.
129
+ Any owned peer may record a change; competing branches are visible, not resolved by time.
83
130
 
84
- Every outgoing message commits first. `acc_message`, `acc_request`, `acc_reply`, and
85
- `acc_finish` cannot promise push; delivery results remain queued with a durable diagnostic.
86
- The recipient calls `acc_inbox` to retrieve the body. Being returned by a tool is
87
- `retrieved`, not proof that a model attended to or obeyed it. A reply or explicit ack is
88
- `acknowledged`.
131
+ `acc_sync {scope: "history", kind: "decision", current: true}` lists terminal
132
+ positions and withdrawals with bounded `decisionStatus` metadata. Exact history
133
+ reads include the same status and preserve receipts. `current` cannot accompany
134
+ an exact ID or other scopes/kinds. Replaced decisions leave ordinary inbox/attention;
135
+ they remain available by exact ID without an automatic acknowledgement.
136
+ See [decision lifecycle](PROTOCOL.md#decision-lifecycle).
137
+
138
+ ## Poll without overstating delivery
89
139
 
90
- MCP is therefore a complete communication participant with higher latency, not a fake
91
- native adapter. Use it when a client can call tools but exposes no measured hook boundary.
140
+ `acc_message`, `acc_request`, `acc_reply`, and `acc_finish` record their outgoing message
141
+ before attempting delivery. The installed server uses the delivery router and recipient
142
+ policy to offer addressed messages through eligible, opted-in native adapters. If no
143
+ eligible route accepts a pending message, it remains queued for durable retrieval.
144
+ Inspect the returned `delivery` outcomes; sending through MCP does not guarantee a native
145
+ offer, model attention, or a reply. These outgoing routes add no receiving capability to MCP.
146
+
147
+ Poll `acc_inbox`, `acc_status`, or `acc_sync` to observe changes. Never repeat a mutation
148
+ merely to poll. For an intentional send retry, reuse the same `clientMessageId` and payload.
149
+ Supply the key on the first call if you need it available after a lost response; an omitted
150
+ key is generated and returned in `message`.
151
+
152
+ An MCP recipient retrieves a body with `acc_inbox` and its exact `messageId`. That read
153
+ advances the receipt to `retrieved` when needed, without proving model attention. A reply
154
+ or explicit ack records `acknowledged`; that state alone proves neither a separate retrieval
155
+ nor a native reply. Inspect the answer message separately when a response is required.
156
+
157
+ Use MCP when a client can call tools but exposes no measured hook boundary, and allow for
158
+ the polling latency of incoming messages.
92
159
 
93
160
  Next: [Protocol](PROTOCOL.md) · [Capabilities](CAPABILITIES.md) ·
94
161
  [Security model](SECURITY_MODEL.md)
package/docs/PROTOCOL.md CHANGED
@@ -74,11 +74,57 @@ inside the message so an uncertain caller can retry explicitly.
74
74
 
75
75
  An empty `toParticipantIds` creates a room record. At commit time, core resolves every
76
76
  known peer participant with an open session and creates a receipt for each. Participants
77
- that arrive later can inspect room history through a full sync but do not receive
77
+ that arrive later can inspect room records through history sync but do not receive
78
78
  retroactive receipts. Those already-present recipients get the normal inbox and certified
79
79
  next-turn path; a successful next-turn write advances their room receipt to `offered`.
80
80
  Room records are never eligible for native live push.
81
81
 
82
+ ## Decision lifecycle
83
+
84
+ A decision may additionally carry `decisionChange` with exactly two fields:
85
+ `action` (`replace` or `withdraw`) and `messageIds` (1..16 unique portable IDs of
86
+ existing decisions in the same workspace). Generic send inputs use `supersedes`
87
+ or `withdraws`; the durable payload is built after transactional validation.
88
+ The sorted target set participates in idempotency. The author may be any owned
89
+ participant; attribution does not confer system authority.
90
+
91
+ Targets and their receipts are immutable. Changes inherit target receipt recipients
92
+ and target authors, excluding the changing author from inherited recipients. Extra
93
+ explicit recipients are merged, sorted, and persisted in `toParticipantIds` before
94
+ recording. This also notifies offline readers and makes live routing use the same set.
95
+ No old receipt is acknowledged, deleted, or advanced by a lifecycle change.
96
+
97
+ Explicit links form a graph. Within a connected group, terminal records are heads;
98
+ multiple heads mean a conflict, even if their prose looks similar. A change may target
99
+ an already replaced decision, creating a competing branch. Resolve branches by
100
+ explicitly linking a new change to all their current heads. A withdrawal is itself
101
+ a terminal record; superseding it explicitly records a new decision.
102
+
103
+ Decision summaries and exact read copies expose `decisionStatus`:
104
+
105
+ | Field | Meaning |
106
+ |---|---|
107
+ | `state` | `current` for a terminal choice; `withdrawn` for a terminal cancellation or history with only cancelled heads; otherwise `superseded` |
108
+ | `isHead` | no recorded successor links to this record |
109
+ | `conflicted` / `headCount` | whether the group has multiple terminal positions and their count |
110
+ | `currentMessageId` | sole current head, or null if there is no unique head |
111
+ | `groupId` | derived representative root ID for finding related heads; may change when groups are joined |
112
+
113
+ This metadata is never persisted. `history` + kind `decision` + `current: true`
114
+ lists heads, including withdrawals and conflicts, using the same summary budget.
115
+ Ordinary inbox, bulk reads, automatic delivery and attention omit non-head decisions;
116
+ exact inbox/history retain them. Timestamps and acknowledgements never choose a winner.
117
+ A decision without an explicit successor may still be factually stale.
118
+
119
+ Next-turn context and each native offer use a lifecycle snapshot; text already shown
120
+ or in flight cannot be recalled. Changes get their own delivery receipts. Native
121
+ transport carries the change/status inside its existing untrusted text envelope.
122
+
123
+ The optional field preserves reading of existing schema-3 records by this build.
124
+ Older ACC builds cannot interpret these semantics and may reject new records with
125
+ unknown fields. Upgrade participating ACC installations together; this is not a
126
+ forward-compatible promise or an automatic state migration.
127
+
82
128
  ## Kinds and obligations
83
129
 
84
130
  | Kind | Valid obligation | Addressing |
@@ -155,13 +201,19 @@ leaves the receipt queued.
155
201
 
156
202
  ## Inbox, reply, and acknowledgement
157
203
 
158
- `inbox` returns unresolved messages owned by the calling participant and advances only
159
- that participant's receipt to `retrieved`. An exact message id is the recovery path after
160
- compaction or an over-budget projection.
204
+ Without an id, public `inbox` lists bounded summary pages for unresolved messages owned
205
+ by the calling participant, without changing receipts. An exact read returns the complete
206
+ message and advances only that participant's receipt to `retrieved`. It is the narrow
207
+ recovery and inspection path, including after compaction or acknowledgement. Reading an
208
+ acknowledged message preserves its receipt, timestamp, and event history; it does not put
209
+ the message back into the unresolved inbox. Ownership and current-generation checks still
210
+ apply to every read.
161
211
 
162
212
  `reply` verifies that ownership, records an `answer` in the original thread, and advances
163
213
  the original receipt to `acknowledged` in one transaction. Only after that durable commit
164
214
  may the answer be offered to the original author. A transport error cannot roll back it.
215
+ CLI and MCP reply results expose both facts: `message` and `delivery` describe the outgoing
216
+ answer, while `receipt` describes the caller's acknowledgement of the original message.
165
217
 
166
218
  `ack` advances the caller's receipt without creating a reply. It exposes no state override;
167
219
  callers cannot claim that a transport offered or a participant retrieved a message.
@@ -188,17 +240,22 @@ The recipient owns `livePolicy` because native push may start a model turn:
188
240
  - `actionable`: questions, requests, answers, decisions, and addressed handoffs may use live push;
189
241
  - `all`: every addressed kind may use live push.
190
242
 
191
- Default is `off`. Policy never creates a capability. The router still requires a current
192
- reachable binding, one unambiguous recipient generation, supported client evidence, and
193
- adapter acceptance. Claude Code live delivery on macOS arm64 uses a captured 2.1.258
194
- minimum plus a current feature probe and per-session protocol handshake; it was confirmed
195
- again on 2.1.260. Codex's queue transport was captured but withdrawn because its required
196
- mode hides the session workspace. Every unavailable or refused route falls back durably.
243
+ Default is `off`. Policy never creates a capability. The router requires one
244
+ current eligible recipient generation, supported client evidence, a verified
245
+ binding and adapter acceptance. Claude Code Channel uses a captured 2.1.258
246
+ minimum, confirmed on 2.1.260. Codex LocalDaemon uses a 0.152.1 minimum, confirmed
247
+ through installed-product captures on 0.152.1 and 0.153.4; recorded consent and
248
+ exact thread, cwd, process, version and protocol verification govern every session.
249
+ Unavailable or refused routes fall back durably. Codex replies use the ACC CLI;
250
+ its native reply route remains false.
197
251
 
198
252
  ## Attention and sync
199
253
 
200
- Bounded sync returns events after a cursor plus explicit attention. Full sync is a
201
- forensic workspace snapshot, not the normal way to recover one message. Attention is
254
+ Default sync returns a bounded event page after a 16-digit cursor plus explicit attention.
255
+ History sync returns read-only message summaries (20 items by default, at most 12,000
256
+ formatted JSON bytes) and complete-message-id cursors, or one exact full message. Neither
257
+ history mode changes receipts. Full sync adds an unbounded forensic workspace snapshot.
258
+ Message discovery and exact-read contracts are in [CLI](CLI.md) and [MCP](MCP.md). Attention is
202
259
  limited to six explicit rules: `reply_required`, `acknowledgement_required`,
203
260
  `recipient_unavailable`, `claim_conflict`, `claim_contended`, and `claim_expired`.
204
261
 
package/docs/RELEASING.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Releasing
2
2
 
3
3
  Use this procedure to build one auditable npm artifact, verify that exact tarball, and keep
4
- its evidence tied to the commit that supplied its bytes. The package is currently `0.3.1`;
4
+ its evidence tied to the commit that supplied its bytes. The package is currently `0.4.0`;
5
5
  the commands derive the version from `package.json` so the filename cannot drift.
6
6
 
7
7
  ```mermaid
@@ -18,8 +18,9 @@ graph LR
18
18
 
19
19
  ## Prepare candidate commit A
20
20
 
21
- Commit A must contain every file npm will pack and every release gate. Start from a clean,
22
- dedicated release worktree, update the version and candidate files, then run:
21
+ Commit A must contain every file npm will pack and every release gate. Use a clean,
22
+ dedicated release worktree; an existing clean isolated worktree is fine. Update the version
23
+ and candidate files, then run:
23
24
 
24
25
  ```bash
25
26
  release_cache="$(mktemp -d "${TMPDIR:-/tmp}/acc-npm-cache.XXXXXX")"
@@ -62,7 +63,23 @@ env npm_config_cache="$release_cache" node scripts/verify-package.mjs "$tarball"
62
63
  symlinks, then exercises doctor, a non-Git workspace, client install/uninstall, bundled
63
64
  workspaces, certification evidence, and packed documentation links. It rejects tests,
64
65
  development probes, sockets, transcript-shaped data, runtime state, and unreferenced
65
- fixtures.
66
+ fixtures. Keep `ACC_NO_UPDATE_CHECK=1` set for release checks so installing an integration
67
+ cannot schedule a real registry update. The managed-update acceptance tests explicitly
68
+ enable networking only against their isolated local registry and npm cache.
69
+
70
+ The managed-update checks exercise actual installed archives: automatic enrollment and
71
+ activation, a persistent MCP process holding the old version, integrity rejection, recovery
72
+ from a failed integration refresh, and stable launchers after the initial package is gone.
73
+ Run them before recording the candidate:
74
+
75
+ ```bash
76
+ env npm_config_cache="$release_cache" node --test tests/acceptance/managed-*-packed.test.mjs
77
+ ```
78
+
79
+ Repeat the published-version upgrade preflight with this exact tarball and isolated home,
80
+ data, and project directories. Retain the source/archive/installed file comparison with the
81
+ preflight evidence. Local-registry checks and direct process checks do not establish native
82
+ client activation; capture that separately on supported real clients.
66
83
 
67
84
  When passed an existing tarball, the verifier intentionally prints `revision unknown`:
68
85
  the current checkout cannot prove which commit produced arbitrary supplied bytes. Record
@@ -100,12 +117,13 @@ work belongs under `Unreleased` and gets a new candidate record.
100
117
 
101
118
  ## Capture only capabilities you observed
102
119
 
103
- Run native real-client checks only on the versions and platforms where retained fixtures
104
- prove that boundary. Exact-version evidence governs normal-turn and guard behavior. Claude
105
- Code live delivery instead uses its captured macOS arm64 minimum plus a current feature
106
- probe and per-session handshake, and its vendor development-channel warning remains part
107
- of startup. Codex's queue capture passed but live delivery was withdrawn because the
108
- required mode hides session workspace identity.
120
+ Run native real-client checks on the exact versions and platforms recorded in
121
+ retained fixtures. Exact-version evidence governs normal-turn and guard behavior.
122
+ Claude Code Channel uses its captured macOS arm64 minimum plus a current probe and
123
+ per-session handshake; its vendor warning remains part of startup. Codex LocalDaemon
124
+ uses a separate 0.152.1 minimum with installed-product captures on 0.152.1 and
125
+ 0.153.4. Its passing capture must ship the hashed complete product matrix and
126
+ historical evidence references. Direct queue success alone cannot certify that route.
109
127
 
110
128
  Record failed and unavailable paths as such, then exercise the packed next-turn or inbox
111
129
  fallback. An unsupported platform is an explicit skip, never a passing capture. See
@@ -42,7 +42,11 @@ own instruction hierarchy are the mitigation; ACC is not a model sandbox.
42
42
  ## Identity and ownership
43
43
 
44
44
  - Participant identity is the address; session identity is one current client opening.
45
- - Mutating calls prove their owner with the session generation.
45
+ - Mutating CLI calls and inbox reads require an explicitly supplied session/generation
46
+ pair. The CLI never obtains a generation from a public ID, checkout, sole peer binding,
47
+ or inherited native environment value.
48
+ - `ACC_SESSION`/`ACC_GENERATION` are operator-supplied credentials. They do not authenticate
49
+ a process or protect against intentional sharing under the same local OS account.
46
50
  - A stale process cannot renew or release records owned by a newer generation.
47
51
  - Inbox, reply, and acknowledgement validate the recipient's participant id.
48
52
  - One participant cannot advance another participant's receipt.
@@ -66,18 +70,20 @@ There is no model-attention claim and no public state override. Failed accelerat
66
70
  the message queued and records only a closed safe error code. Diagnostics and offer events
67
71
  never copy the peer body.
68
72
 
69
- A live adapter must match its declared evidence contract, one unexpired generation-bound
70
- binding, and the recipient's opt-in policy. Opaque endpoint references remain inside the
71
- adapter and outside repositories. Claude Code live delivery is currently supported on
72
- macOS arm64 from the captured 2.1.258 minimum when a current feature probe and per-session
73
- handshake pass; it remains experimental and off by default. Codex's queue capture passed,
74
- but the capability was withdrawn because the required mode hides session workspace
75
- identity.
73
+ A live adapter must match its declared evidence contract, one current
74
+ generation-bound binding and recipient opt-in. Opaque endpoints remain private
75
+ and outside repositories. Claude Code Channel and Codex LocalDaemon delivery are
76
+ experimental and off by default. Codex verifies the exact receiver thread,
77
+ canonical cwd, live process, stable version and protocol, and rereads recorded
78
+ consent before offers. A loaded daemon thread can receive messages after its TUI
79
+ exits. Delivery off and uninstall prevent new Codex submissions; a submission
80
+ already accepted by the vendor queue cannot be withdrawn.
76
81
 
77
82
  ## Claims
78
83
 
79
- Claims are advisory unless every live participant exposes a certified guard for the
80
- relevant mutation path. Even guarded claims do not stop unrelated processes, runtime-built
84
+ CLI claims default to advisory. Guarded enforcement must be requested explicitly and
85
+ requires every live participant to expose a certified guard for the relevant mutation path.
86
+ MCP claims remain advisory. Even guarded claims do not stop unrelated processes, runtime-built
81
87
  paths, or tool calls the client never presents to the hook. Force release requires explicit
82
88
  authority and records actor and reason.
83
89
 
@@ -93,14 +99,40 @@ from operating merely because its own state is unavailable.
93
99
  - Corrupt or incompatible store versions fail closed before mutation.
94
100
  - Client installers preserve unrelated settings and record content hashes.
95
101
  - Uninstall removes only bytes still matching what ACC wrote.
96
- - Tokens, credentials, and environment contents are never copied into ACC or project config.
102
+ - Runtime credentials and private endpoints stay outside project config. Adapters do not
103
+ automatically collect client secrets or environment contents into peer messages.
104
+
105
+ ## Managed automatic updates
106
+
107
+ A normal managed installation enables automatic updates. The latency-sensitive hook path
108
+ does no network download; it may schedule a detached worker. That worker uses the configured
109
+ npm registry/network and local npm executable, checks stable package identity/version and
110
+ sha512 integrity against registry metadata, installs with lifecycle scripts disabled, and
111
+ validates the staged runtime before activation. These checks retain the registry and package
112
+ author as a software-supply trust boundary; they do not establish that package code is safe.
113
+
114
+ ACC process leases hold activation until confirmed exit. Native bindings hold until observed
115
+ SessionEnd cleanup or confirmed process death; unknown PIDs remain conservative holds.
116
+ `acc finish`, presence TTL, and delivery off do not establish native lifecycle end. ACC does
117
+ not manage the vendor daemon.
118
+
119
+ A failed download leaves the active runtime available. A partial integration refresh retains
120
+ the old active pointer but fences normal workspace admission in `activating`; it does not
121
+ leave the previous runtime available for normal work. Fix the reported problem and run
122
+ `acc update` to repair forward. Hooks continue to fail open while coordination is unavailable.
123
+
124
+ `acc update --auto off` disables background updates; `--pin <version>` holds an exact stable
125
+ version. `ACC_NO_UPDATE_CHECK=1` disables update networking and scheduling while allowing
126
+ manual recovery of an already verified pending update. See [Upgrading](UPGRADING.md).
97
127
 
98
128
  ## Data collected
99
129
 
100
130
  ACC stores participant/session identity, presence, one-line intent, explicit claims,
101
131
  explicit messages and structured handoffs, per-recipient receipts, artifact references,
102
- and coordination events. It excludes complete prompts, assistant responses, raw
103
- transcripts, secrets, environment variables, and unrelated files.
132
+ and coordination events. ACC does not automatically collect raw transcripts, full prompts
133
+ or assistant responses, secrets, environment contents, or unrelated files. Explicit message
134
+ bodies are caller-provided and preserved: ACC does not scan or scrub secrets from text a
135
+ caller chooses to send. The sender remains responsible for that content.
104
136
 
105
137
  ## Threat scenarios
106
138