agents-can-communicate 0.3.0 → 0.3.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 (42) hide show
  1. package/README.md +92 -92
  2. package/SECURITY.md +7 -4
  3. package/docs/ADAPTER_AUTHORING.md +26 -22
  4. package/docs/ARCHITECTURE.md +23 -15
  5. package/docs/CAPABILITIES.md +30 -12
  6. package/docs/CLI.md +21 -10
  7. package/docs/CONCEPTS.md +91 -94
  8. package/docs/CONFIGURATION.md +30 -24
  9. package/docs/DESIGN_DECISIONS.md +8 -4
  10. package/docs/GETTING_STARTED.md +76 -100
  11. package/docs/GLOSSARY.md +4 -4
  12. package/docs/HOW_IT_WORKS.md +119 -233
  13. package/docs/MCP.md +8 -8
  14. package/docs/PROTOCOL.md +12 -7
  15. package/docs/RELEASING.md +111 -87
  16. package/docs/SECURITY_MODEL.md +13 -8
  17. package/docs/TROUBLESHOOTING.md +24 -12
  18. package/docs/WHY_ACC.md +18 -16
  19. package/docs/index.md +26 -18
  20. package/node_modules/@agents-can-communicate/adapter-claude-code/package.json +1 -1
  21. package/node_modules/@agents-can-communicate/adapter-claude-code/plugin/skills/acc/SKILL.md +6 -4
  22. package/node_modules/@agents-can-communicate/adapter-codex/package.json +1 -1
  23. package/node_modules/@agents-can-communicate/adapter-codex/plugin/skills/acc/SKILL.md +5 -3
  24. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/gemini-extension.json +1 -1
  25. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/skills/acc/SKILL.md +5 -3
  26. package/node_modules/@agents-can-communicate/adapter-gemini-cli/package.json +1 -1
  27. package/node_modules/@agents-can-communicate/adapter-grok/package.json +1 -1
  28. package/node_modules/@agents-can-communicate/adapter-grok/plugin/skills/acc/SKILL.md +5 -3
  29. package/node_modules/@agents-can-communicate/adapter-kimi/package.json +1 -1
  30. package/node_modules/@agents-can-communicate/adapter-kimi/plugin/skills/acc/SKILL.md +5 -3
  31. package/node_modules/@agents-can-communicate/adapter-sdk/package.json +1 -1
  32. package/node_modules/@agents-can-communicate/cli/package.json +1 -1
  33. package/node_modules/@agents-can-communicate/cli/src/install-command.mjs +44 -14
  34. package/node_modules/@agents-can-communicate/core/package.json +1 -1
  35. package/node_modules/@agents-can-communicate/core/src/conversations.mjs +41 -1
  36. package/node_modules/@agents-can-communicate/delivery-router/package.json +1 -1
  37. package/node_modules/@agents-can-communicate/hook-runner/package.json +1 -1
  38. package/node_modules/@agents-can-communicate/installer/package.json +4 -2
  39. package/node_modules/@agents-can-communicate/mcp-server/package.json +1 -1
  40. package/node_modules/@agents-can-communicate/protocol/package.json +1 -1
  41. package/node_modules/@agents-can-communicate/storage-filesystem/package.json +1 -1
  42. package/package.json +1 -1
package/docs/GLOSSARY.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Glossary
2
2
 
3
- - **Workspace** — one local coordination room; all worktrees of a Git repository share it.
4
- - **Participant** — the stable address that sends and receives messages.
5
- - **Session** — one independently opened client conversation participating in a workspace.
3
+ - **Workspace** — one same-machine, same-OS-user coordination room; all worktrees of a Git repository share it.
4
+ - **Participant** — the address that sends and receives messages; it survives unrelated conversations only when explicitly configured.
5
+ - **Session** — one independently opened client conversation participating in a workspace; its id supplies the default participant address.
6
6
  - **Generation** — the token proving a mutation belongs to the current opening of a session.
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.
@@ -16,7 +16,7 @@
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. No shipped adapter currently qualifies.
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.
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.
@@ -1,277 +1,163 @@
1
1
  # How ACC works
2
2
 
3
- ACC is a local communication layer around AI sessions that the user opened independently.
4
- It gives those sessions a shared set of coordination facts without giving ACC ownership of
5
- their prompts, permissions, processes, or work.
3
+ Suppose Codex is adding an account-registration endpoint while Claude Code builds the
4
+ registration screen. You gave each session an ordinary task. ACC supplies the awareness
5
+ and communication layer around their work; the agents decide whether and how to use it.
6
6
 
7
- This page follows one interaction from client startup to an acknowledged answer. It is the
8
- engineering tour; [Protocol](PROTOCOL.md) is the normative record contract and
9
- [Architecture](ARCHITECTURE.md) is the package-level reference.
10
-
11
- ## The whole system in one picture
7
+ This page follows the dependency from discovery to an acknowledged answer. For exact record
8
+ shapes and state rules, use [Protocol](PROTOCOL.md). For package boundaries, storage, and
9
+ recovery, use [Architecture](ARCHITECTURE.md).
12
10
 
13
11
  ```mermaid
14
- flowchart LR
15
- U["human direction and authority"] --> A["independent session A"]
16
- U --> B["independent session B"]
17
- A --> X["CLI, MCP, or adapter hook"]
18
- X --> C["vendor-neutral core"]
19
- C <--> S[("filesystem store outside the repository")]
20
- C --> Y["B adapter hook or acc inbox"]
21
- Y --> B
22
- C --> R["optional live-delivery router"]
23
- R -.-> B
24
- B --> Z["CLI, MCP, or adapter hook"]
25
- Z --> C
12
+ sequenceDiagram
13
+ participant U as User
14
+ participant C as Codex
15
+ participant ACC
16
+ participant A as Claude Code
17
+ U->>C: Add the registration endpoint
18
+ U->>A: Build the registration screen
19
+ ACC-->>C: Claude Code is a peer
20
+ ACC-->>A: Codex is a peer
21
+ A->>ACC: Ask Codex for the endpoint contract
22
+ ACC-->>C: Offer the question or keep it in inbox
23
+ C->>ACC: Reply with the contract
24
+ ACC-->>A: Offer the answer or keep it in inbox
26
25
  ```
27
26
 
28
- There is no required ACC daemon and no coordinator model. CLI commands and native hooks
29
- are short-lived local processes that open the same workspace store when needed. An MCP
30
- client may keep its own `acc-mcp` stdio child running, but that child is a tool boundary for
31
- one participant, not a scheduler or owner of the room.
32
-
33
- ## 1. A client session joins a workspace
27
+ ## 1. The integrations introduce the peers
34
28
 
35
- For a native client, an installed startup hook sends the client event to `acc-hook`. The
36
- vendor adapter normalizes that event, then the hook runner:
29
+ `acc install` adds supported hooks, plugins, or extensions to native clients it finds. At
30
+ session startup, such a client calls `acc-hook`, which registers the session in the local
31
+ ACC workspace. The native integration also gives the agent a small skill describing peer
32
+ discovery, messages, replies, claims, and handoffs.
37
33
 
38
- 1. discovers the workspace;
39
- 2. opens its filesystem store;
40
- 3. resolves the exact client version and its certified capabilities;
41
- 4. opens or resumes one ACC session generation; and
42
- 5. stores a small binding from the client's session id to that ACC generation.
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
36
+ tools but does not install the native clients' skill. See its
37
+ [manual MCP boundary](MCP.md#account-for-the-manual-boundary).
43
38
 
44
- Workspace discovery uses an explicit `acc.workspace.json` first, the Git common directory
45
- second, and the canonical plain directory otherwise. Git worktrees therefore share one
46
- room but keep separate checkout and branch facts. Git itself is optional.
39
+ ACC does not add instructions to the user's task prompt, create a team, or choose work. The
40
+ agent still operates under its own conversation, permissions, and client policy.
47
41
 
48
- A participant is the address messages target. A session is one current opening of that
49
- participant, and its unguessable generation token prevents an old process from mutating a
50
- replacement session. The default participant name is derived from the client session. Set
51
- `ACC_PARTICIPANT` in the client launch environment when an address must survive a client
52
- restart and recover messages sent while it was away.
42
+ Sessions meet only when they resolve to the same local workspace. Git worktrees of one
43
+ repository share a workspace through the Git common directory, while retaining separate
44
+ checkout and branch facts. A plain directory uses its canonical path unless optional
45
+ workspace configuration supplies a stable id or additional roots. Git is not required.
53
46
 
54
- Attaching one session does not create durable workspace history. Its presence and intent
55
- can remain ephemeral until a second live session appears or someone creates the first
56
- claim, message, or handoff. This is how ACC stays silent when a session is alone without
57
- making discovery unreliable when a peer arrives.
47
+ A workspace is local to one machine and operating-system user. ACC is not a remote sync
48
+ service, even if project files are synchronized elsewhere.
58
49
 
59
- ## 2. Sessions publish awareness, not assignments
50
+ ## 2. Each agent shares a small amount of work context
60
51
 
61
- An intent records a short summary, mode, and resource hints. A claim adds a leased
62
- reservation for a canonical resource such as `file:src/item.mjs` or `file:src/**`.
63
- Neither creates a task or grants one session authority over another.
52
+ The Codex session may publish “adding the registration endpoint” with a hint for its API
53
+ files. Claude may publish “building the registration screen” with a UI hint. This intent is
54
+ short, explicit coordination data, not a copy of either conversation.
64
55
 
65
- A claim is `guarded` only when every live client path involved has a captured pre-write
66
- guard. Otherwise it is `advisory`: visible coordination that peers should respect, but not
67
- an operating-system lock. Even a guarded claim cannot stop unrelated programs or a write
68
- path the client never exposes to its adapter.
56
+ When peers are available, the integration can project their identity, intent, relevant
57
+ claims, and pending messages into a supported normal turn. The agent can then notice that
58
+ its work depends on a peer. ACC does not run a hidden classifier and does not guarantee the
59
+ model will coordinate; relevance remains the agent's decision.
69
60
 
70
- ## 3. Sending commits the durable truth first
61
+ Presence and intent can stay ephemeral while a session is alone. Durable workspace history
62
+ materializes when a second session appears or an agent creates the first durable message,
63
+ claim, or handoff. Runtime state lives in platform app data outside the repository.
71
64
 
72
- When session A sends an addressed question, the CLI or MCP boundary validates the closed
73
- protocol shape and resolves A's current session generation. Core then performs one
74
- filesystem transaction that creates:
65
+ ## 3. A dependency becomes a direct question
75
66
 
76
- - the immutable logical message, including sender, recipients, kind, obligation, thread,
77
- and explicit body;
78
- - one `queued` receipt for each recipient; and
79
- - a `message.recorded` event.
67
+ Claude needs the endpoint contract, so it looks up the peer and sends an addressed
68
+ `question`. A client name such as `codex` resolves when exactly one peer session of that
69
+ client is eligible. If several Codex sessions are live, the agent uses the exact participant
70
+ id from `acc status --json`.
80
71
 
81
- The first message in a thread uses its own `messageId` as `threadId`. A caller-supplied
82
- `clientMessageId` is a retry key: identical retries return the original message, while the
83
- same key with different content is rejected.
72
+ The sender is not granting itself authority over the recipient. Messages are attributed,
73
+ untrusted peer input. A `request` asks for action and a result, but it is not an order; the
74
+ receiving agent evaluates it under its own instructions and permissions.
84
75
 
85
- For a room message, recipients are the known peer participants with open sessions at
86
- commit time. Participants arriving later can find the room record through full forensic
87
- sync, but they do not receive retroactive receipts.
76
+ ## 4. ACC records before it tries delivery
88
77
 
89
- Only after the transaction commits may ACC try to make the message arrive sooner. Thus a
90
- crashed, unsupported, or unreachable adapter cannot erase a successfully recorded
91
- question.
78
+ Sending the question commits the message and one `queued` receipt for each recipient in a
79
+ single filesystem transaction. Only then does ACC attempt to make it arrive sooner. If a
80
+ hook, client, or experimental transport is unavailable, the recorded question remains in
81
+ the recipient's durable inbox.
92
82
 
93
- ## 4. Delivery has three paths
83
+ That order is the central reliability guarantee:
94
84
 
95
- The paths share one durable record but prove different facts.
85
+ ```text
86
+ agent sends -> durable message and queued receipt -> optional delivery attempt
87
+ ```
96
88
 
97
- ### Durable inbox
89
+ The first message is also the root of its thread. Retries can carry a `clientMessageId` so
90
+ equivalent repeats return the original record while conflicting reuse is rejected. Room
91
+ messages resolve their recipients at commit time; later arrivals do not gain retroactive
92
+ receipts. [Protocol](PROTOCOL.md) defines these rules precisely.
98
93
 
99
- `acc inbox` is the universal recovery path. It returns only messages addressed to the
100
- calling participant and atomically advances that participant's receipt to `retrieved`.
101
- An exact `acc inbox --message message_x` remains usable after context compaction or when a
102
- message was too large to project safely.
94
+ ## 5. The receiving client chooses the delivery path
103
95
 
104
- ### Certified next-turn projection
96
+ All recipients have the same durable record, but adapters expose different acceleration:
105
97
 
106
- On an exact client version and platform with passing evidence, a before-turn hook asks core
107
- for queued messages just before the client's next normal turn. The adapter projects each
108
- complete body inside an attributed `untrusted peer message` frame. If the complete frame
109
- does not fit the configured byte budget, the hook keeps the message id and the exact inbox
110
- recovery command instead of silently truncating peer text.
98
+ - **Durable inbox:** universal recovery. An agent can retrieve the complete addressed
99
+ message with `acc inbox`, including by exact message id after compaction.
100
+ - **Next normal turn:** exact captured versions of Codex, Claude Code, Gemini CLI, and Kimi
101
+ Code can receive complete attributed peer context when the user next prompts that client.
102
+ This does not wake an idle session.
103
+ - **Optional Claude Code channel:** supported Claude Code versions on Apple Silicon macOS
104
+ may receive an addressed actionable message while idle. This is experimental, off by
105
+ default, can spend tokens, never interrupts a running turn, and requires the vendor's
106
+ visible development-channel warning.
111
107
 
112
- The hook entry point records `offered` only after its stdout transport reports that the
113
- bytes crossed the boundary. The state is not `retrieved`: ACC still has no observation
114
- that the model attended to those bytes.
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.
115
111
 
116
- ### Native live push
112
+ When a complete projected body cannot fit the configured byte budget, ACC keeps the message
113
+ id and exact inbox recovery command rather than silently truncating the peer's words.
117
114
 
118
- The delivery router offers an actionable message to an already-running session when all of
119
- these hold at once:
115
+ ## 6. The reply stays in the same thread
120
116
 
121
- - exactly one live generation for the recipient;
122
- - an unexpired generation-bound delivery binding published by that session's own start;
123
- - a recorded policy permitting this message kind (`actionable` covers question, request,
124
- answer, decision, and handoff; `all` adds note; room messages are never live);
125
- - an adapter that declares `delivery.livePush` and a native contract; and
126
- - adapter acceptance of the bytes.
117
+ Codex replies with the request and response fields. The reply operation creates an `answer`
118
+ for Claude in the original thread and acknowledges Codex's receipt for the question in one
119
+ transaction. For a message that requires acknowledgement but no answer, the recipient uses
120
+ `ack` instead.
127
121
 
128
- Any missing condition leaves the receipt `queued` and returns a safe fallback reason. Two
129
- adapters ship a native transport, both experimental and off until a per-client opt-in:
122
+ Receipts describe evidence, not assumptions:
130
123
 
131
124
  ```text
132
- sender -> durable ACC record -> exact live binding -> vendor transport -> receiver
133
- \-> queued inbox on every failure
125
+ queued -> offered -> retrieved -> acknowledged
134
126
  ```
135
127
 
136
- - **Claude Code 2.1.258** uses a vendor Channel: an ACC-owned MCP child, started only when
137
- the user's ordinary `claude` launch carries the captured development-channel flag, offers
138
- the message as a native notification and routes the model's explicit `acc_reply` back as a
139
- real ACC answer. Claude's development-channel warning is vendor-owned and stays visible.
140
- - **Codex 0.152.1** adds the message to the App Server thread queue over the vendor daemon's
141
- control socket; it is presented on the idle thread or after the current turn. Codex answers
142
- through the ordinary `acc reply` command, so its reply route is not native.
143
-
144
- Compatibility is decided at the launch-time bootstrap and again by a per-session handshake
145
- bound to the exact client process; there is no maximum client version, but a newer stable
146
- release must pass a current probe and handshake for the captured protocol, and an older,
147
- prerelease, known-bad, or uncaptured client stays durable-only. ACC is never the parent of
148
- a model session after the shell `exec`, and `ACC_BYPASS=1` starts the unmodified client.
149
-
150
- ## 5. Reply closes the communication obligation
151
-
152
- The complete question-and-answer path is:
128
+ - `queued` means the message and receipt are durable;
129
+ - `offered` means bytes crossed ACC's transport boundary or a certified client accepted
130
+ them, not that the model read them;
131
+ - `retrieved` means the participant explicitly fetched the message, not that a model paid
132
+ attention; and
133
+ - `acknowledged` means the participant acknowledged or replied, not that requested work is
134
+ complete.
153
135
 
154
- ```mermaid
155
- sequenceDiagram
156
- participant A as Session A
157
- participant Core
158
- participant Store
159
- participant B as Session B
160
- A->>Core: addressed question for B
161
- Core->>Store: message + queued receipt + event
162
- Store-->>Core: transaction committed
163
- Core-->>A: recorded with delivery outcome
164
- alt certified next-turn
165
- B->>Core: normal turn hook
166
- Core-->>B: attributed untrusted envelope
167
- Core->>Store: receipt offered after transport accepts bytes
168
- else durable inbox
169
- B->>Core: acc inbox for the message
170
- Core->>Store: advance B receipt to retrieved
171
- Core-->>B: attributed message and receipt
172
- end
173
- B->>Core: reply to the question id
174
- Core->>Store: answer + A receipt + acknowledge B receipt
175
- Core-->>A: answer through next-turn or inbox
176
- ```
136
+ There is no `seen` receipt and no ACC task state such as accepted, running, or done.
177
137
 
178
- `reply` verifies that B owns the original receipt, writes an `answer` in the same thread,
179
- creates the answer's receipt for A, and advances B's original receipt to `acknowledged` in
180
- one transaction. A transport failure after that cannot undo the reply. `ack` performs the
181
- last transition without creating an answer when the obligation only asks for
182
- acknowledgement.
138
+ ## 7. Claims warn before edits overlap
183
139
 
184
- Receipts are per recipient and monotonic:
140
+ Before changing files, an agent can publish intent and claim a narrow resource such as
141
+ `file:packages/api/**`. Another live session attempting an overlapping claim receives exit
142
+ code `5` with the holder, giving the peers a chance to narrow or sequence their work.
185
143
 
186
- ```text
187
- queued -> offered -> retrieved -> acknowledged
188
- ```
189
-
190
- `recorded` is the successful send boundary, not a receipt state. `offered` does not mean
191
- read, `retrieved` does not prove model attention, and `acknowledged` resolves communication
192
- only. A reply saying “I will do it” is not evidence that the requested work finished; ACC
193
- does not have accepted, running, or done task states.
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
148
+ user-facing distinction.
194
149
 
195
- ## 6. The filesystem is the control plane
150
+ ## 8. The boundaries remain visible
196
151
 
197
- Each workspace lives below the platform data home, conceptually:
152
+ ACC stores only coordination data an agent explicitly publishes: identity, presence,
153
+ one-line intent, claims, messages, replies, handoffs, receipts, and events. It never collects
154
+ or shares raw prompts, assistant responses, or transcripts. Peer bodies are framed as
155
+ untrusted data and remain subject to the receiving session's permissions.
198
156
 
199
- ```text
200
- <platform data home>/acc/workspaces/workspace_x/
201
- ├── protocol.json store version and workspace identity
202
- ├── state/<kind>/<id>.json materialised current records
203
- ├── events/<sequence>.json immutable semantic history
204
- ├── journal/ crash-recovery authority
205
- ├── locks/ one cross-process writer mutex
206
- ├── ephemeral/ non-durable presence, intent, and delivery bindings
207
- ├── bindings/ client-session to ACC-generation mappings
208
- ├── retained/ logical deletion and retired evidence
209
- └── tmp/ staged atomic publications
210
- ```
157
+ Hooks have a short time limit and fail open. A coordination failure may remove awareness or
158
+ force inbox fallback, but ACC must not be the reason a client action stops. Unknown versions
159
+ and platforms inherit no capability; `acc doctor` reports the downgrade and next action.
211
160
 
212
- This layout is diagnostic, not a public mutation API. Clients write through the protocol
213
- and core rather than editing these files.
214
-
215
- On macOS the platform data home is `~/Library/Application Support`; on Linux it is
216
- `$XDG_DATA_HOME` or `~/.local/share`. `ACC_DATA_HOME` replaces that base. Runtime paths are
217
- checked against workspace roots so ACC state cannot be placed inside the project.
218
-
219
- Every durable mutation holds the same writer mutex, loads only its declared record kinds,
220
- checks state generations, stages the full result, and writes a recovery journal before
221
- publishing. Events are immutable no-replace files; current state is a materialised view
222
- replaced atomically. While publication is incomplete, the active journal bounds event
223
- cursors below the transaction's first sequence; the next store opener rolls a decided
224
- transaction forward before serving a read. The store prefers a recoverable duplicate offer
225
- after a crash to an unearned delivery claim.
226
-
227
- Paths are opened with containment and no-follow checks. Corrupt records, a foreign
228
- workspace identity, and unknown store versions fail before mutation rather than being
229
- guessed into a compatible shape.
230
-
231
- ## 7. Adapters translate evidence, not product semantics
232
-
233
- The vendor-neutral layers know nothing about Codex, Claude Code, Gemini CLI, Grok, or Kimi
234
- Code. `protocol` owns record shapes and state transitions; `core` owns coordination rules;
235
- `storage-filesystem` owns persistence. Vendor adapters own hook payloads, installation,
236
- client-specific response shapes, and captured capability evidence. `hook-runner` applies
237
- the common bounded fail-open lifecycle, while `delivery-router` evaluates optional live
238
- delivery.
239
-
240
- Unknown client versions and platforms inherit no capability. A method in an adapter or a
241
- vendor documentation example is not enough: every `true` capability needs a retained
242
- real-client fixture. This is why the same product can degrade visibly from next-turn
243
- projection to inbox polling without changing its message or receipt semantics.
244
-
245
- ## 8. What crosses the trust boundary
246
-
247
- ACC stores only explicit coordination data: identity, presence, one-line intent, claims,
248
- messages the sender chose to send, structured handoffs, receipts, artifacts, and events.
249
- It does not collect raw prompts, assistant responses, transcripts, environment variables,
250
- credentials, or permission approvals.
251
-
252
- Peer bodies remain untrusted data. The projector attributes the sender, escapes framing
253
- and terminal control sequences, and never promotes peer text to system authority. The
254
- receiving session still evaluates it under its own instructions and permissions.
255
-
256
- Every native hook has a five-second ceiling and fails open: if ACC cannot read the store or
257
- decide safely, the client's action continues. Coordination may become less effective, but
258
- ACC itself must not stop a session from working.
259
-
260
- ## Trace the implementation
261
-
262
- The shortest source-code path is:
263
-
264
- 1. `packages/hook-runner/src/runner.mjs` — attach, before-turn projection, guards, and the
265
- fail-open boundary;
266
- 2. `packages/core/src/conversations.mjs` — record-first messages, threads, receipts, and
267
- handoffs;
268
- 3. `packages/core/src/inbox.mjs` — recipient-owned retrieval, reply, and acknowledgement;
269
- 4. `packages/delivery-router/src/router.mjs` — policy, reachability, certification, and live
270
- fallback;
271
- 5. `packages/storage-filesystem/src/store.mjs` — transactions, snapshots, ephemeral state,
272
- and recovery; and
273
- 6. `packages/adapter-sdk/src/context-projector.mjs` — bounded untrusted peer framing.
274
-
275
- Continue with [Capabilities](CAPABILITIES.md) for what each shipped client actually proves,
276
- [Security model](SECURITY_MODEL.md) for trust boundaries and attack tests, and
277
- [Adapter authoring](ADAPTER_AUTHORING.md) for the integration contract.
161
+ Continue with [Capabilities](CAPABILITIES.md) for client-specific behavior,
162
+ [Security model](SECURITY_MODEL.md) for trust boundaries, or
163
+ [Architecture](ARCHITECTURE.md) to trace these steps through the packages.
package/docs/MCP.md CHANGED
@@ -1,9 +1,9 @@
1
1
  # MCP
2
2
 
3
- `acc-mcp` lets a client with no native ACC adapter participate over stdio. It exposes the
4
- same durable messages, threads, receipts, intent, claims, and handoffs, but it cannot infer
5
- the client's lifecycle, intercept writes, inject a normal turn, or push a message. The
6
- client polls tools under its own control.
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.
7
7
 
8
8
  ```mermaid
9
9
  graph LR
@@ -11,7 +11,7 @@ graph LR
11
11
  M --> S[("ACC durable store")]
12
12
  ```
13
13
 
14
- ## Register
14
+ ## Configure the server
15
15
 
16
16
  ```json
17
17
  {
@@ -33,7 +33,7 @@ The server implements MCP protocol revision `2026-07-28` over newline-delimited
33
33
  stdio. Tool input schemas are closed: unknown fields and invalid conditional shapes are
34
34
  rejected before a session is resolved.
35
35
 
36
- ## Tools
36
+ ## Call the durable tools
37
37
 
38
38
  | Tool | Required input | Optional input |
39
39
  |---|---|---|
@@ -63,7 +63,7 @@ resolves the configured MCP participant and advances only the returned receipts
63
63
  `retrieved`, just like the inbox tool. Snapshot and roster reads do not advance receipts.
64
64
  A full snapshot is for explicit workspace forensics.
65
65
 
66
- ## Capability floor
66
+ ## Account for the manual boundary
67
67
 
68
68
  The generic MCP capability declaration is all false:
69
69
 
@@ -79,7 +79,7 @@ An MCP participant therefore reports `advisory` enforcement and `manual` lifecyc
79
79
  workspace protection is the weakest live participant's real guarantee, one MCP session
80
80
  makes guarded claims advisory for the room.
81
81
 
82
- ## Durable polling semantics
82
+ ## Poll without overstating delivery
83
83
 
84
84
  Every outgoing message commits first. `acc_message`, `acc_request`, `acc_reply`, and
85
85
  `acc_finish` cannot promise push; delivery results remain queued with a durable diagnostic.
package/docs/PROTOCOL.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # Protocol
2
2
 
3
- The protocol is the vendor-neutral contract shared by core, CLI, MCP, storage, and every
4
- adapter. Version 0.2 uses store schema version `3` and deliberately rejects v0.1 state.
5
- There is no compatibility reader, conversion, archive path, or automatic deletion.
3
+ Use this page when implementing or checking a boundary shared by core, CLI, MCP, storage,
4
+ and adapters. Protocol version 0.2 uses store schema version `3` and deliberately rejects
5
+ v0.1 state. There is no compatibility reader, conversion, archive path, or automatic
6
+ deletion.
6
7
 
7
8
  ## Durable records
8
9
 
@@ -24,7 +25,9 @@ Workspace
24
25
  ```
25
26
 
26
27
  - A workspace is one local coordination room.
27
- - A participant is the stable recipient of a message.
28
+ - A participant is the recipient address for a message. A hooked session gets a default
29
+ address derived from its client session id; only an explicitly supplied participant id
30
+ is stable across unrelated client conversations.
28
31
  - A session is one client conversation. Its unguessable generation token proves that a
29
32
  later mutation still belongs to the current opening.
30
33
 
@@ -186,9 +189,11 @@ The recipient owns `livePolicy` because native push may start a model turn:
186
189
  - `all`: every addressed kind may use live push.
187
190
 
188
191
  Default is `off`. Policy never creates a capability. The router still requires a current
189
- reachable binding, one unambiguous recipient generation, a passing exact-version
190
- certification, and adapter acceptance. The current Codex and Claude captures do not meet
191
- those requirements; all shipped native live routes therefore fall back durably.
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.
192
197
 
193
198
  ## Attention and sync
194
199