agents-can-communicate 0.3.1 → 0.4.1

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 (161) hide show
  1. package/README.md +95 -52
  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 +77 -0
  16. package/docs/ADAPTER_AUTHORING.md +52 -8
  17. package/docs/ARCHITECTURE.md +64 -11
  18. package/docs/CAPABILITIES.md +41 -37
  19. package/docs/CLI.md +145 -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 +41 -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 +47 -13
  30. package/docs/TROUBLESHOOTING.md +102 -20
  31. package/docs/UPGRADING.md +154 -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 +122 -8
  68. package/node_modules/@agents-can-communicate/adapter-grok/src/adapter.mjs +5 -3
  69. package/node_modules/@agents-can-communicate/adapter-grok/src/hooks.mjs +9 -0
  70. package/node_modules/@agents-can-communicate/adapter-grok/src/install.mjs +2 -2
  71. package/node_modules/@agents-can-communicate/adapter-kimi/package.json +1 -1
  72. package/node_modules/@agents-can-communicate/adapter-kimi/plugin/skills/acc/SKILL.md +106 -5
  73. package/node_modules/@agents-can-communicate/adapter-kimi/src/hooks.mjs +1 -1
  74. package/node_modules/@agents-can-communicate/adapter-kimi/src/install.mjs +2 -2
  75. package/node_modules/@agents-can-communicate/adapter-sdk/package.json +1 -1
  76. package/node_modules/@agents-can-communicate/adapter-sdk/src/capabilities.mjs +5 -0
  77. package/node_modules/@agents-can-communicate/adapter-sdk/src/context-projector.mjs +26 -4
  78. package/node_modules/@agents-can-communicate/adapter-sdk/src/decision-text.mjs +19 -0
  79. package/node_modules/@agents-can-communicate/adapter-sdk/src/hook-shim.mjs +5 -3
  80. package/node_modules/@agents-can-communicate/adapter-sdk/src/index.mjs +1 -0
  81. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-delivery.mjs +9 -2
  82. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-vocabulary.mjs +2 -6
  83. package/node_modules/@agents-can-communicate/adapter-sdk/src/session-binding.mjs +29 -9
  84. package/node_modules/@agents-can-communicate/adapter-sdk/src/toml-block.mjs +8 -6
  85. package/node_modules/@agents-can-communicate/cli/package.json +4 -2
  86. package/node_modules/@agents-can-communicate/cli/src/args.mjs +49 -22
  87. package/node_modules/@agents-can-communicate/cli/src/doctor-command.mjs +11 -4
  88. package/node_modules/@agents-can-communicate/cli/src/git-probe.mjs +9 -3
  89. package/node_modules/@agents-can-communicate/cli/src/help.mjs +109 -14
  90. package/node_modules/@agents-can-communicate/cli/src/install-command.mjs +24 -5
  91. package/node_modules/@agents-can-communicate/cli/src/main.mjs +35 -12
  92. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/activation.mjs +110 -0
  93. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/command.mjs +64 -0
  94. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/download.mjs +71 -0
  95. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/entry.mjs +110 -0
  96. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/generation.mjs +167 -0
  97. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/install.mjs +78 -0
  98. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/launchers.mjs +60 -0
  99. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/leases.mjs +60 -0
  100. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/location.mjs +55 -0
  101. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/mutex.mjs +145 -0
  102. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/policy.mjs +4 -0
  103. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/refresh.mjs +40 -0
  104. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/schedule.mjs +21 -0
  105. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/state.mjs +123 -0
  106. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/worker.mjs +65 -0
  107. package/node_modules/@agents-can-communicate/cli/src/runtime-paths.mjs +1 -1
  108. package/node_modules/@agents-can-communicate/cli/src/session-owner.mjs +33 -108
  109. package/node_modules/@agents-can-communicate/cli/src/update-command.mjs +25 -7
  110. package/node_modules/@agents-can-communicate/core/package.json +1 -1
  111. package/node_modules/@agents-can-communicate/core/src/attention.mjs +3 -0
  112. package/node_modules/@agents-can-communicate/core/src/claims.mjs +13 -8
  113. package/node_modules/@agents-can-communicate/core/src/conversations.mjs +9 -25
  114. package/node_modules/@agents-can-communicate/core/src/decision-changes.mjs +36 -0
  115. package/node_modules/@agents-can-communicate/core/src/decision-state.mjs +42 -0
  116. package/node_modules/@agents-can-communicate/core/src/delivery-bindings.mjs +11 -4
  117. package/node_modules/@agents-can-communicate/core/src/inbox.mjs +48 -17
  118. package/node_modules/@agents-can-communicate/core/src/intents.mjs +35 -15
  119. package/node_modules/@agents-can-communicate/core/src/materialisation.mjs +7 -5
  120. package/node_modules/@agents-can-communicate/core/src/message-pages.mjs +75 -0
  121. package/node_modules/@agents-can-communicate/core/src/next-turn-delivery.mjs +31 -0
  122. package/node_modules/@agents-can-communicate/core/src/session-opening.mjs +128 -0
  123. package/node_modules/@agents-can-communicate/core/src/sessions.mjs +58 -132
  124. package/node_modules/@agents-can-communicate/core/src/sync.mjs +31 -2
  125. package/node_modules/@agents-can-communicate/delivery-router/package.json +1 -1
  126. package/node_modules/@agents-can-communicate/delivery-router/src/refresh-binding.mjs +38 -0
  127. package/node_modules/@agents-can-communicate/delivery-router/src/router.mjs +86 -10
  128. package/node_modules/@agents-can-communicate/hook-runner/package.json +1 -1
  129. package/node_modules/@agents-can-communicate/hook-runner/src/client-version.mjs +1 -0
  130. package/node_modules/@agents-can-communicate/hook-runner/src/native-binding.mjs +6 -4
  131. package/node_modules/@agents-can-communicate/hook-runner/src/native-retirement.mjs +48 -0
  132. package/node_modules/@agents-can-communicate/hook-runner/src/owner-context.mjs +30 -0
  133. package/node_modules/@agents-can-communicate/hook-runner/src/process-table.mjs +1 -1
  134. package/node_modules/@agents-can-communicate/hook-runner/src/runner.mjs +172 -67
  135. package/node_modules/@agents-can-communicate/hook-runner/src/session-lifecycle.mjs +13 -0
  136. package/node_modules/@agents-can-communicate/installer/package.json +1 -1
  137. package/node_modules/@agents-can-communicate/installer/src/apply.mjs +17 -2
  138. package/node_modules/@agents-can-communicate/installer/src/bootstrap-runtime.mjs +11 -5
  139. package/node_modules/@agents-can-communicate/installer/src/detect.mjs +1 -1
  140. package/node_modules/@agents-can-communicate/installer/src/index.mjs +1 -0
  141. package/node_modules/@agents-can-communicate/installer/src/live-policy.mjs +21 -0
  142. package/node_modules/@agents-can-communicate/installer/src/native-activation.mjs +20 -6
  143. package/node_modules/@agents-can-communicate/installer/src/ownership.mjs +10 -4
  144. package/node_modules/@agents-can-communicate/installer/src/plan.mjs +3 -3
  145. package/node_modules/@agents-can-communicate/mcp-server/package.json +1 -1
  146. package/node_modules/@agents-can-communicate/mcp-server/src/protocol.mjs +85 -0
  147. package/node_modules/@agents-can-communicate/mcp-server/src/resources.mjs +3 -2
  148. package/node_modules/@agents-can-communicate/mcp-server/src/server.mjs +59 -57
  149. package/node_modules/@agents-can-communicate/mcp-server/src/tools.mjs +47 -33
  150. package/node_modules/@agents-can-communicate/protocol/package.json +1 -1
  151. package/node_modules/@agents-can-communicate/protocol/src/conversations.mjs +3 -0
  152. package/node_modules/@agents-can-communicate/protocol/src/decision-changes.mjs +15 -0
  153. package/node_modules/@agents-can-communicate/protocol/src/index.mjs +3 -1
  154. package/node_modules/@agents-can-communicate/protocol/src/schema.mjs +14 -5
  155. package/node_modules/@agents-can-communicate/storage-filesystem/package.json +1 -1
  156. package/node_modules/@agents-can-communicate/storage-filesystem/src/atomic-json.mjs +5 -1
  157. package/node_modules/@agents-can-communicate/storage-filesystem/src/deadline.mjs +7 -0
  158. package/node_modules/@agents-can-communicate/storage-filesystem/src/index.mjs +2 -0
  159. package/node_modules/@agents-can-communicate/storage-filesystem/src/session-read.mjs +25 -0
  160. package/node_modules/@agents-can-communicate/storage-filesystem/src/store.mjs +28 -25
  161. package/package.json +2 -1
package/docs/CONCEPTS.md CHANGED
@@ -79,6 +79,12 @@ Message kinds describe the conversation:
79
79
  An **obligation** is the communication response owed by a recipient. A request is not an
80
80
  order, and a reply is not proof that work is complete.
81
81
 
82
+ A decision can explicitly replace or withdraw earlier decisions. The old records stay
83
+ attributed and recoverable, while current reads and reminders follow the recorded links.
84
+ Any peer may record a change; competing branches remain visible until explicitly joined.
85
+ A current decision is a recorded position, not agreement or authority. See
86
+ [decision lifecycle](PROTOCOL.md#decision-lifecycle).
87
+
82
88
  ## Threads keep the exchange together
83
89
 
84
90
  The first message is a **thread** root. A reply names the original message and stays in that
@@ -100,19 +106,20 @@ queued -> offered -> retrieved -> acknowledged
100
106
 
101
107
  - `queued`: the durable message and receipt committed;
102
108
  - `offered`: ACC or a certified client accepted the delivery bytes, not proof of reading;
103
- - `retrieved`: the participant fetched the message, not proof of model attention;
109
+ - `retrieved`: the participant fetched the body through its inbox, not proof of model attention;
104
110
  - `acknowledged`: the participant acknowledged it or replied, not proof of task completion.
105
111
 
112
+ Listing inbox headers and observing workspace history do not change receipts.
106
113
  There is no `seen` receipt. A failed delivery attempt leaves the message queued and
107
114
  recoverable rather than creating a terminal failure state.
108
115
 
109
116
  ## Durable first, faster delivery second
110
117
 
111
- The durable inbox is universal. Exact-version certified adapters may also offer messages at
112
- the next normal turn. That does not wake an idle client. Claude Code has the only shipped
113
- experimental live path, off by default and subject to recipient policy and current
114
- reachability; Codex live delivery is withdrawn. [Capabilities](CAPABILITIES.md) is the
115
- current adapter matrix.
118
+ The durable inbox is universal. Exact-version certified adapters may also offer
119
+ messages at the next normal turn. Codex LocalDaemon and Claude Code Channel add
120
+ experimental live delivery, off by default and subject to recipient policy and
121
+ current reachability. Codex can retain an eligible daemon thread after its terminal
122
+ exits. [Capabilities](CAPABILITIES.md) gives the current limits.
116
123
 
117
124
  ## Handoffs preserve explicit context
118
125
 
@@ -6,7 +6,7 @@ as the same operating-system user on the same machine and resolve that same loca
6
6
  workspace.
7
7
 
8
8
  Create `acc.workspace.json` only for stable workspace identity, roots, or shared
9
- claim/context policy. It is optional project configuration that `acc config init` may write
9
+ context budget. It is optional project configuration that `acc config init` may write
10
10
  at your request; runtime state remains in platform app data outside the repository. The
11
11
  file never defines agents, messages, execution state, or delivery endpoints. Project map:
12
12
  [README](index.md). Terms used below: [Glossary](GLOSSARY.md).
@@ -18,11 +18,8 @@ file never defines agents, messages, execution state, or delivery endpoints. Pro
18
18
  Matching ids never connect different machines or OS users.
19
19
  - **More than one root.** A monorepo whose apps live in separate directories, or a
20
20
  workspace that spans sibling checkouts.
21
- - **Shared policy.** Claim mode and context budget, agreed once and committed, rather than
22
- each person's machine deciding.
23
- - **Stated expectations.** `requiredAdapters` records which harnesses this project expects
24
- to be installed, so `acc doctor` can say what is missing rather than leaving a session
25
- silently uncoordinated.
21
+ - **Shared context budget.** Set the ceiling for supported injected turn context once for
22
+ the workspace.
26
23
 
27
24
  ### Define the file
28
25
 
@@ -39,10 +36,8 @@ link can point anywhere, including at a file the repository does not control.
39
36
  "displayName": "Example",
40
37
  "roots": ["."],
41
38
  "policy": {
42
- "claimMode": "advisory",
43
39
  "contextBudgetBytes": 6000
44
- },
45
- "requiredAdapters": []
40
+ }
46
41
  }
47
42
  ```
48
43
 
@@ -52,11 +47,16 @@ link can point anywhere, including at a file the repository does not control.
52
47
  | `workspaceId` | Stable identity, portable id | required |
53
48
  | `displayName` | What peers see in a roster | the directory name |
54
49
  | `roots` | Directories in this workspace, relative to the config | `["."]` |
55
- | `policy.claimMode` | `advisory` or `guarded` | `advisory` |
50
+ | `policy.claimMode` | Validated compatibility metadata (`advisory` or `guarded`); does not select claim enforcement | `advisory` |
56
51
  | `policy.contextBudgetBytes` | Ceiling on injected turn context, 1–64000 | `6000` |
57
- | `requiredAdapters` | Harnesses this project expects | `[]` |
52
+ | `requiredAdapters` | Validated compatibility metadata; does not affect `acc doctor` diagnostics | `[]` |
58
53
  | `extensions` | Anything else, namespaced by whoever wrote it | `{}` |
59
54
 
55
+ `policy.claimMode` and `requiredAdapters` are stored but have no claim or doctor effect in
56
+ 0.4. CLI claims default to advisory; request `--enforcement guarded` on each claim when
57
+ appropriate, subject to every live participant's certified guard. MCP claims remain
58
+ advisory. Do not use these metadata fields to configure protection or missing-client checks.
59
+
60
60
  Roots are refused if they are absolute or escape the workspace. An absolute root is one
61
61
  machine's layout committed to a shared repository, and `packages/../../elsewhere` reaches
62
62
  outside the boundary the workspace is supposed to be. The check counts path segments, so an
@@ -98,17 +98,25 @@ Close them, or pass `--force` if you mean it — and restart them afterwards.
98
98
  <!-- test:illustration asks a person to confirm; there is nobody to ask in a test -->
99
99
  ```bash
100
100
  acc config init # preview, then write after you agree
101
- acc config validate # read-only; reports what applies
101
+ acc config validate # read-only; checks acc.workspace.json in the selected directory
102
102
  ```
103
103
 
104
+ `init` and `validate` operate only on `acc.workspace.json` directly inside the selected
105
+ `--cwd` directory (the current directory when omitted). Unlike ordinary workspace discovery,
106
+ they do not walk upward. Pass `--cwd` with the directory containing the config you intend
107
+ to inspect or create. A nested `init` can create a new config that shadows an ancestor;
108
+ check the ancestor first.
109
+
104
110
  `init` shows the exact file it would write and waits. In a non-interactive run — a pipe, a
105
111
  CI job, an agent — there is nobody to ask, so it refuses unless you pass `--yes`. It never
106
112
  overwrites an existing config: a committed identity is shared by everyone on the project,
107
113
  and replacing it on a mistyped command would split one workspace into two.
108
114
 
109
- `validate` only reads. A command someone runs to find out what is wrong must not change the
110
- thing it is inspecting. With no config present it reports the defaults rather than failing,
111
- because not having one is a valid state.
115
+ `validate` only reads. If that selected directory has no config, it reports
116
+ `no acc.workspace.json in selected directory; ancestors not checked`.
117
+ The JSON result returns default config metadata for that missing local file. Ordinary
118
+ commands may still discover an ancestor config; this is not an effective-policy report.
119
+ Run validation with `--cwd` set to that ancestor directory to check its file.
112
120
 
113
121
  ## Keep delivery consent user-owned
114
122
 
@@ -129,6 +137,13 @@ reports next-turn or inbox fallback. Each later session must also pass its own
129
137
  generation-bound handshake. A failed session handshake clears or refuses that binding and
130
138
  reports degraded reachability; it does not rewrite the installed consent.
131
139
 
140
+ Codex LocalDaemon delivery separately requires macOS arm64, Codex 0.152.1 or newer, a
141
+ current feature probe, and exact thread, canonical cwd, process, version and protocol
142
+ checks. Its daemon must already be running; ACC never starts or stops it. Codex reads
143
+ consent from the installation record, not a shell-shim variable. Unavailable or ineligible
144
+ sessions retain durable inbox fallback. Use `acc install --adapter codex --delivery off`
145
+ to stop new native offers; bypassing a shim does not disable that recorded opt-in.
146
+
132
147
  ## Override local paths and identity
133
148
 
134
149
  Nothing in `acc.workspace.json` says where state is stored, and nothing there can — that is
@@ -137,17 +152,17 @@ that resolves inside a workspace.
137
152
 
138
153
  | Variable | Purpose |
139
154
  |---|---|
140
- | `ACC_DATA_HOME` | Where session, claim, and message state is kept, instead of the platform default (`~/Library/Application Support/acc` on macOS; `~/.local/share/acc` on Linux, or wherever `XDG_DATA_HOME` points) |
141
- | `ACC_CONFIG_HOME` | The same override, for configuration state the platform would otherwise keep alongside `ACC_DATA_HOME` |
142
- | `ACC_CACHE_HOME` | The same override, for cache data the platform would otherwise keep under its own cache location |
155
+ | `ACC_DATA_HOME` | Base directory under which ACC creates `acc/` for runtime and coordination state. Defaults: `~/Library/Application Support` on macOS; `~/.local/share` on Linux, or `XDG_DATA_HOME` |
156
+ | `ACC_CONFIG_HOME` | Parsed and validated path override; no current configuration-storage consumer |
157
+ | `ACC_CACHE_HOME` | Parsed and validated path override; no current cache-storage consumer |
143
158
  | `ACC_PARTICIPANT` | Which participant a session belongs to, when the client does not say |
144
159
  | `ACC_WORKSPACE_ROOT` | The project to work in, instead of discovering one from the working directory. Absolute, or it is refused |
145
- | `ACC_SESSION` · `ACC_GENERATION` | Which session a command acts as when it is not worked out automatically. A supplied generation proves the exact opening; with only a session id the CLI resolves the current generation and refuses ambiguity |
160
+ | `ACC_SESSION` · `ACC_GENERATION` | Explicit CLI owner credentials, supplied together by the operator for this session. Hooks do not set them. A public session ID alone never resolves a generation; see [CLI ownership](CLI.md#coordinate-from-a-session) |
146
161
  | `ACC_MCP_PARTICIPANT` | Who `acc-mcp` takes part as. `mcp` by default |
147
162
  | `ACC_MCP_WORKSPACE` | The project `acc-mcp` joins. Without it the server takes the directory the client launched it in, which is rarely the project |
148
- | `ACC_NO_UPDATE_CHECK=1` | Never ask npm whether a newer ACC exists. `acc update` then says it is off, which is a different answer from "nothing is newer" |
163
+ | `ACC_NO_UPDATE_CHECK=1` | Disables update networking and background scheduling; manual recovery of an already downloaded update remains available |
149
164
  | `ACC_PROBE_TIMEOUT_MS` | How long to wait for a client to print its version. Three seconds by default: generous on an idle machine, and not always enough on a busy one, where a client that overruns it is reported as not installed |
150
- | `ACC_NATIVE_DELIVERY_POLICY` | Set only by an ACC-owned shell shim to the consented live policy (`off`, `actionable`, or `all`) before it `exec`s the real client, so the session's hook knows a native transport was activated. Not for a person to set: an ordinary or `ACC_BYPASS=1` launch leaves it unset, and the hook treats missing or invalid values as `off` |
151
- | `ACC_BYPASS=1` | Runs the unmodified client through an ACC shim: no launch-time check, no native flags, and the reserved policy variable is unset. The escape hatch when you want the vendor command exactly as it was |
165
+ | `ACC_NATIVE_DELIVERY_POLICY` | Owned shell-bootstrap consent, currently used by Claude Code. The shim sets `off`, `actionable`, or `all`; missing/invalid values mean off for that route. Codex instead reads recorded installation consent, even when this variable is absent |
166
+ | `ACC_BYPASS=1` | Bypasses owned shell activation, currently Claude Code: no bootstrap check/native flags, and shim policy is unset. It does not disable Codex recorded opt-in; use `acc install --adapter codex --delivery off` for new Codex offers |
152
167
  | `ACC_BOOTSTRAP_DEBUG=1` | Lets the internal `acc-bootstrap` check write one safe diagnostic line to stderr. Off, it is silent, and it never writes to stdout |
153
168
  | `CODEX_HOME` | Codex's own home, honoured when locating the Codex App Server daemon's control socket for native delivery. Codex sets it; ACC only reads it |
@@ -18,12 +18,15 @@ boundaries exist.
18
18
  | Runtime state outside the repository | A checkout can be deleted, cloned, or synced; presence and locks must not travel with it. |
19
19
  | Project config optional and runtime-free | A committed file is editable by anyone with a PR, so it may carry policy — never sessions or tokens. |
20
20
  | Durable state is authoritative | Next-turn or live delivery may accelerate an interaction; neither becomes the source of truth. |
21
+ | Bounded discovery, explicit history recovery | Automatic context stays small; peers select exact messages or historical records when they need full bodies. |
22
+ | Immutable explicit decision links | Replacements and withdrawals preserve prior records and expose competing branches without choosing by timestamp. |
23
+ | Fence managed runtime activation | Refresh all integrations before switching the active generation; partial refresh stays fenced until forward recovery completes. |
21
24
  | No heartbeat helper in v1 | An idle session is honestly reported `stale`. A sidecar process to fake liveness is worse than the truth. |
22
25
  | Presence reads the process, never writes the record | A pid answers "gone" at once; an age floor covers what a pid cannot, including its own reuse. Nothing is written back — no session has authority to edit another's record. This checks a process already there, not one beating on a session's behalf like the heartbeat helper above. |
23
- | No process launching | ACC attaches to sessions you already own. Owning them is a different product. |
26
+ | No AI client or session launching | ACC attaches to sessions you already own; its separate update worker manages ACC packages, not those sessions. |
24
27
  | One publishable package | One version and one release rather than twelve coordinated ones. |
25
28
  | MIT | Widest reuse, least friction. |
26
- | Node 24 (current production LTS) | Uses `node:test`, modern `fs` promises, and no transpiler. |
29
+ | Node 24 or newer required | Uses `node:test`, modern `fs` promises, and no transpiler. |
27
30
  | MCP session from launch config | Never from `initialize` or `clientInfo` — those are attacker-controllable. See the threat scenarios in [SECURITY_MODEL.md](SECURITY_MODEL.md) (scenario 8). |
28
31
 
29
32
  ## Avoid these rejected designs
@@ -32,7 +35,7 @@ boundaries exist.
32
35
  |---|---|
33
36
  | A file in each repo that agents poll | No guard, no identity, no atomicity — and it ends up committed. |
34
37
  | A permanent global lead session | Turns peers into workers and makes one crash fatal. |
35
- | Treating MCP as a lifecycle guarantee | MCP is a tool surface. It cannot attach, guard, or wake anything. |
38
+ | Treating MCP as an external-client lifecycle guarantee | Tool calls resolve MCP's own participant, but cannot infer the client's lifecycle, intercept writes, or wake its receiver. |
36
39
  | Requiring Git, tmux, PostgreSQL, or a service | Every requirement is a reason the tool is not installed. |
37
40
  | Collecting or sharing raw transcripts | Raw transcripts are never collected or shared. Explicit peer messages are bounded records the sender chose to address. |
38
41
  | Reporting queued messages as delivered | A delivery state that overstates itself is worse than no state. |
@@ -47,16 +50,18 @@ perturbed the record instead of removing it — a hook whose recorded hash no
47
50
  longer matched was still observed running, so absence was never actually
48
51
  tested.
49
52
 
50
- Absence is the whole mechanism. With no record, the client runs no hook at
51
- all, prints `hook: SessionStart Completed` while executing nothing, and ACC's
52
- write guard goes silently off — while `acc doctor` and `codex plugin list`
53
- both report it enabled. On a real machine, a shell write walked through a
53
+ Absence was sufficient to disable the hooks in that historical capture. With no
54
+ record, that client ran no hook, printed `hook: SessionStart Completed` while
55
+ executing nothing, and ACC's write guard went silently off — while `acc doctor`
56
+ and `codex plugin list` both reported it enabled. A shell write walked through a
54
57
  guarded claim; writing the exact same hashes back (captured before deletion,
55
58
  from an ACC three releases older) revived the guard immediately.
56
59
 
57
- That is why removal is never ACC's to do: the record is granted once by a
58
- person, survives ACC upgrades, and nothing ACC writes can restore it.
59
- Tidiness is not worth a permission only a human can re-grant.
60
+ That is why removal is never ACC's to do: it preserves the client's trust decision.
61
+ The historical observation above does not establish trust across arbitrary upgrades.
62
+ Codex 0.153.4 compares each current definition's hash and reports changed definitions
63
+ as modified; a trusted hook can also be disabled. ACC preserves the records but leaves
64
+ current readiness unverified, directing the user to `/hooks` in Codex.
60
65
 
61
66
  **The generalisation, since this cost a release:** to learn whether state is
62
67
  load-bearing, take it away. Changing it tests something else.
@@ -81,7 +86,7 @@ where a guard stops behaves better than one that believes it absolute.
81
86
  1. **Storage backend.** The hardened filesystem store ships first. A transactional backend
82
87
  can go behind the same interface later — but not merely to avoid a dependency.
83
88
  2. **Remote coordination.** v2, or a separate product.
84
- 3. **Process launching.** Possibly never; possibly an external integration.
89
+ 3. **AI client/session launching.** Possibly never; possibly an external integration.
85
90
  4. **Multi-root discovery rules** beyond the current `roots` list.
86
91
  5. **Default claim lease length** for hook-only adapters. A hook-only session cannot sustain
87
92
  a short renewal cadence, so lease policy must not assume one.
@@ -4,10 +4,20 @@ 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 can supply each agent's own CLI arguments; the installed skill tells the
8
+ agent how to use them. This path was observed in Claude Code 2.1.263, Codex 0.153.4, and
9
+ Grok 1.0.24. Grok receives its own header after a terminal result, so its skill runs public
10
+ status first; peer messages still require explicit inbox reads. Hooks must be enabled and
11
+ trusted by the client. Without that owner context, owned operations require an explicit
12
+ pair or session-bound ACC MCP tools. See [CLI ownership](CLI.md#coordinate-from-a-session).
13
+
7
14
  ## 1. Install once on this machine
8
15
 
9
16
  ACC requires macOS or Linux and Node.js 24 or newer.
10
17
 
18
+ Already using ACC? Follow the [upgrade guide](UPGRADING.md) for the 0.4.0 → 0.4.1
19
+ update or the data-format boundary when upgrading from 0.3.1.
20
+
11
21
  ```bash
12
22
  npm install -g agents-can-communicate
13
23
  ```
@@ -17,9 +27,22 @@ npm install -g agents-can-communicate
17
27
  acc install
18
28
  ```
19
29
 
30
+ Initial installation also enables automatic updates; reinstalling keeps an explicit opt-out.
31
+ ACC downloads releases in the background and
32
+ refreshes its runtime and skills when active clients have left. Use `acc update` for an
33
+ immediate update, or `acc update --auto off` to disable background updates. See
34
+ [update controls](UPGRADING.md#automatic-updates-after-installation).
35
+
20
36
  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.
37
+ restart any running clients so they load their integrations. Follow the activation steps
38
+ printed by the installer. In Codex, use `/plugins` to check ACC is enabled, then `/hooks`
39
+ to review each ACC hook and enable/trust its current definition if needed. Restart the
40
+ session after that review; changed hook definitions may require trust again.
41
+
42
+ If the installer preserved your existing Codex sandbox settings, verify the named ACC
43
+ state directory is in `sandbox_workspace_write.writable_roots` in the config it identifies.
44
+ ACC keeps those user settings unchanged. Installed files alone do not establish that hooks
45
+ are active; `acc doctor` leaves current readiness unverified and directs you to Codex.
23
46
 
24
47
  If you opt into Claude Code's experimental idle delivery, Claude also shows its own
25
48
  development-channel warning at every startup. The feature is off by default, can spend
@@ -46,6 +69,16 @@ Same-client addresses can be ambiguous when several instances are live; agents u
46
69
  exact participant ids in the roster when needed. See [Concepts](CONCEPTS.md) for participant
47
70
  and session identity.
48
71
 
72
+ A second repeatable pattern is review and handoff. Ask the implementing agent to request
73
+ review of an identified revision (a commit when Git is available, or named files and
74
+ version otherwise) and wait for the verdict. Ask the reviewer to return blocking defects
75
+ or approval. If either session must stop, it can leave a durable handoff naming completed
76
+ work, remaining work, and blockers. A later session can recover it from history. The
77
+ underlying commands are [`acc request`](CLI.md#messages-and-requests), exact
78
+ [`acc inbox --message`](CLI.md#inbox-reply-and-acknowledgement),
79
+ [`acc reply`](CLI.md#inbox-reply-and-acknowledgement), and
80
+ [`acc finish`](CLI.md#handoff).
81
+
49
82
  ## 3. Watch for useful coordination
50
83
 
51
84
  Look for an agent discovering a peer, publishing the files it expects to change, noticing a
@@ -71,11 +104,12 @@ CLI, and Kimi Code can receive a message at the next normal turn. That does not
71
104
  session. Grok, generic MCP clients, unknown versions, and unsupported platforms use the
72
105
  durable inbox instead.
73
106
 
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.
107
+ Codex LocalDaemon and Claude Code Channel offer optional native delivery on
108
+ Apple Silicon macOS. They are experimental, can spend tokens, and queue messages
109
+ until a running turn finishes. Codex requires 0.152.1 or newer, an already-running
110
+ LocalDaemon, recorded opt-in and a verified session; start it with your normal
111
+ command. A loaded daemon thread can receive messages after its terminal exits.
112
+ [Capabilities](CAPABILITIES.md) explains policy, versions and fallback.
79
113
 
80
114
  Delivery evidence is deliberately narrow: `queued -> offered -> retrieved -> acknowledged`.
81
115
  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)