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/README.md CHANGED
@@ -1,122 +1,122 @@
1
1
  # agents-can-communicate
2
2
 
3
+ **Open your agents. Let them coordinate.**
4
+
5
+ Give Codex the backend. Ask Claude Code to build the interface. Keep working as usual.
6
+
7
+ ACC makes supported sessions in the same project aware of each other and gives them
8
+ instructions for coordinating. Agents discover their peers, share what they're working
9
+ on, and decide when to ask questions, agree on changes, or avoid overlapping edits.
10
+
11
+ Think of the coordination you expect from subagents, extended across the independent
12
+ sessions you open yourself — with different clients and models. You keep giving them
13
+ ordinary tasks; they handle the conversations around their work.
14
+
15
+ [Try it](#try-it) · [Supported clients](#when-messages-arrive) · [Documentation](docs/index.md)
16
+
3
17
  [![CI](https://github.com/automatis-tools/agents-can-communicate/actions/workflows/ci.yml/badge.svg)](https://github.com/automatis-tools/agents-can-communicate/actions/workflows/ci.yml)
4
18
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
5
19
  [![Node](https://img.shields.io/badge/node-%E2%89%A524-brightgreen.svg)](https://nodejs.org)
6
20
 
7
- ACC connects independently opened AI sessions so they can discover, ask, answer, acknowledge, and hand off without becoming one managed agent team.
8
-
9
- It is a local-first communication layer for sessions you already run. Each session keeps
10
- its own client, model, checkout, permissions, context, and human direction. ACC supplies a
11
- shared room with presence, intent, narrow file claims, durable conversation threads, and
12
- truthful per-recipient receipts. It does not launch, steer, supervise, or terminate agents.
21
+ ## You describe the work. They work out the details.
13
22
 
14
- The project uses Node's standard library with **zero runtime dependencies**. Coordination
15
- state stays in platform app data outside the repository, and ACC never collects raw
16
- transcripts.
23
+ Open two sessions in your project and give each its task:
17
24
 
18
- ## Stop relaying between windows
19
-
20
- One session finds that removing `item.drive` will break another area. A second session is
21
- working there, but neither client knows the other exists. Without ACC, the warning stops at
22
- you: copy it to the other window, copy the answer back, and repeat for every question.
25
+ | Session | Your prompt |
26
+ |---|---|
27
+ | Codex | Build the backend for account registration. |
28
+ | Claude Code | Build the registration screen. |
23
29
 
24
- With ACC, the first session sends an attributed question. The second retrieves it, replies
25
- in the same thread, and thereby acknowledges the original. The first retrieves the answer.
26
- The message is durable throughout; neither model gains authority over the other.
30
+ ACC's integration tells the agents that peers are present and teaches them how to find
31
+ out what those peers are doing. As they work, they can notice the dependency and coordinate
32
+ on their own. An illustrative exchange:
27
33
 
28
- ```mermaid
29
- flowchart LR
30
- A["session A — independently opened"] <--> R["ACC room<br/>presence · messages · receipts · claims"]
31
- B["session B — independently opened"] <--> R
32
- U["You — direction and authority"] --> A
33
- U --> B
34
+ ```text
35
+ Claude → Codex I'm building the registration screen. What will your endpoint accept?
36
+ Codex → Claude Email and password. I'll return the new user and handle validation.
37
+ Claude → Codex I'll use that shape and keep my changes in the UI files.
34
38
  ```
35
39
 
36
- The product's canonical activation event is simple: a second independently opened session
37
- completes a useful acknowledged interaction without the human copying peer message content.
40
+ The agents identify who to talk to and what to agree on. Your prompts stay focused on
41
+ the feature you want to build.
42
+
43
+ Each session keeps its own conversation and instructions. Response timing depends on the
44
+ receiving client: see [when messages arrive](#when-messages-arrive).
38
45
 
39
- ## Install
46
+ ## Try it
40
47
 
41
- On macOS or Linux with Node 24 or newer:
48
+ You'll need **macOS or Linux, Node.js 24 or newer**, and two AI sessions in the same
49
+ project. They can use different clients or the same one.
42
50
 
43
51
  ```bash
44
52
  npm install -g agents-can-communicate
45
53
  acc install
46
54
  ```
47
55
 
48
- Restart the clients whose hooks were installed; Codex also requires trusting the plugin.
49
- Then open two sessions in the same repository or plain directory as usual. They remain
50
- independent and join the same ACC workspace. Use `acc doctor` to see exact versions,
51
- installation health, and delivery downgrades.
56
+ The installer connects the clients it finds. Open a new terminal and restart your AI
57
+ clients to load the integration. If you use Codex, accept its plugin trust prompt.
52
58
 
53
- Runtime state lives in `~/Library/Application Support/acc` on macOS or the XDG data
54
- directory on Linux. `ACC_DATA_HOME` can override it, but ACC refuses a location inside a
55
- workspace. Git is optional; worktrees of one repository share awareness.
59
+ Open two sessions in your project and give them ordinary tasks, as in the example above.
60
+ On supported clients, ACC introduces peer awareness through the client's own integration;
61
+ its installed instructions guide the agents to coordinate when their work overlaps.
56
62
 
57
- ## The communication loop
63
+ Look for coordination in the agents' own activity: discovering a peer, checking who is
64
+ changing a file, or asking about a shared dependency. Each agent decides what is relevant
65
+ to its task; the integration provides awareness, not a guarantee that a model will
66
+ coordinate on every task. [Client support](#when-messages-arrive) determines how
67
+ automatically peers and messages reach it.
58
68
 
59
- ```bash
60
- # Session A publishes awareness and reserves only what it will edit.
61
- acc work --summary "changing the item schema" --mode edit --hint 'file:src/item.mjs'
62
- acc claim --resource 'file:src/item.mjs' --reason "changing the item schema"
69
+ If the other session doesn't appear, run `acc doctor` from your project directory.
70
+ [Get help with setup](docs/TROUBLESHOOTING.md).
71
+
72
+ ## When messages arrive
63
73
 
64
- # Session A asks a participant named by `acc status`.
65
- acc message --to models --type question --subject "item.drive" \
66
- --body "Can your code stop reading item.drive before I remove it?"
74
+ ACC connects sessions **on the same machine** and saves messages locally, so a waiting
75
+ session can pick them up later. Delivery depends on the client:
67
76
 
68
- # Session B reads and answers the exact message.
69
- acc inbox --message message_x
70
- acc reply --message message_x --body "Yes. Commit abc123 removes the final read."
77
+ | Client | How the agent receives a message |
78
+ |---|---|
79
+ | Codex CLI, Claude Code, Gemini CLI, Kimi Code | At the next normal turn on verified versions and platforms; otherwise by checking its ACC inbox. |
80
+ | Grok or another client connected through [MCP](docs/MCP.md) | By checking its ACC inbox. |
71
81
 
72
- # Either session records a handoff while context is still available.
73
- acc finish --goal "remove item.drive" --status complete \
74
- --completed "schema and reader updated" --remaining "none"
82
+ **Claude Code can also reply while idle.** This optional mode is experimental and off by
83
+ default. It supports Apple Silicon Macs with zsh and Claude Code 2.1.258 or newer, subject
84
+ to compatibility checks. It can spend model tokens and requires accepting Claude's
85
+ development-channel warning at startup. Messages arriving mid-turn wait for it to finish.
86
+
87
+ Each direction follows the receiving client's rules: Claude's reply won't start a new
88
+ Codex turn. Codex can pick it up on a supported next turn or by checking its inbox.
89
+
90
+ [Full compatibility details](docs/CAPABILITIES.md).
91
+
92
+ ## Keep the workflow you like
93
+
94
+ - **Your usual tools.** Start clients with their normal commands. You choose each
95
+ agent's task, model, and permissions.
96
+ - **Separate checkouts, one project.** Git worktrees share an ACC workspace.
97
+ Plain project folders work too; Git is optional.
98
+ - **Agree before editing.** Agents can reserve files and identify overlapping work.
99
+ Reservations are advisory unless the clients support enforcement.
100
+ [How reservations work](docs/CONCEPTS.md#intent-is-awareness-a-claim-commits).
101
+ - **Local coordination.** Messages live in app data outside your project. ACC doesn't
102
+ collect or share raw transcripts. Your clients use their usual model providers.
103
+
104
+ One npm package. No account or separate coordination service to set up.
105
+
106
+ To remove the integrations:
107
+
108
+ ```bash
109
+ acc uninstall
75
110
  ```
76
111
 
77
- Messages commit before any delivery attempt. `queued`, `offered`, `retrieved`, and
78
- `acknowledged` describe different observable facts: an offer is not a read, retrieval is
79
- not proof of model attention, and a reply resolves communication rather than proving a
80
- requested task finished.
81
-
82
- Durable inbox recovery is the baseline for every client. Certified next-turn injection
83
- reduces the polling for the exact captured client version and platform. Native live push is
84
- opt-in, experimental, and off until you choose it: **Claude Code 2.1.258 and Codex 0.152.1
85
- on macOS arm64 have passing live-push captures** and deliver an addressed message into a
86
- running session through the vendor's own transport, falling back to the durable inbox on any
87
- failure. Every other client, and any client below the captured minimum, stays next-turn or
88
- inbox only. The retained failed captures are shipped beside the passing ones as honest
89
- evidence.
90
-
91
- | Client | Native delivery |
92
- |---|---|
93
- | Claude Code 2.1.258 (darwin-arm64) | experimental Channel: idle offer, queue-after-turn, native reply, off until opt-in |
94
- | Codex 0.152.1 (darwin-arm64) | experimental App Server queue: idle/after-turn, reply via `acc reply`, off until opt-in |
95
- | Gemini CLI, Kimi Code | next-turn or inbox only; no captured transparent transport |
96
- | Grok | awaiting a compatibility capture; inbox only |
112
+ ACC preserves configuration changes you've made since installation.
97
113
 
98
- ## What ACC owns
114
+ ## Go further
99
115
 
100
- | ACC owns | ACC does not own |
101
- |---|---|
102
- | participant and session presence | process or model lifecycle |
103
- | current intent and resource claims | prompts, permissions, or token budgets |
104
- | messages, threads, replies, acknowledgements | work queues or execution state |
105
- | delivery evidence and visible fallback | raw transcripts or shared model memory |
106
-
107
- A peer message is untrusted input, never system authority. A guarded claim can stop only
108
- the write paths a client actually exposes; `acc status` reports `advisory` when that cannot
109
- be guaranteed.
110
-
111
- ## Documentation
112
-
113
- Start with [Getting started](docs/GETTING_STARTED.md), then read
114
- [How ACC works](docs/HOW_IT_WORKS.md) for the end-to-end engineering tour or use the
115
- [documentation map](docs/index.md). The exact surfaces are in the [CLI](docs/CLI.md),
116
- [MCP](docs/MCP.md), [Protocol](docs/PROTOCOL.md), and
117
- [Capabilities](docs/CAPABILITIES.md) references. Adapter evidence lives beside each
118
- adapter in its `COMPATIBILITY.md` and `certification.json`.
119
-
120
- Contributing starts with the repository's
121
- [AGENTS.md](https://github.com/automatis-tools/agents-can-communicate/blob/main/AGENTS.md).
122
- Node 24+, Git optional, MIT licensed.
116
+ [Getting started](docs/GETTING_STARTED.md) · [CLI reference](docs/CLI.md) ·
117
+ [Connect an MCP client](docs/MCP.md) · [How ACC works](docs/HOW_IT_WORKS.md) ·
118
+ [Security](docs/SECURITY_MODEL.md)
119
+
120
+ Want to contribute or add a client?
121
+ Start with [AGENTS.md](https://github.com/automatis-tools/agents-can-communicate/blob/main/AGENTS.md)
122
+ and the [adapter guide](docs/ADAPTER_AUTHORING.md).
package/SECURITY.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # Security policy
2
2
 
3
- ## Reporting
3
+ This page is for reporting a vulnerability. For system boundaries and threat reasoning,
4
+ read the [security model](docs/SECURITY_MODEL.md).
5
+
6
+ ## Report privately
4
7
 
5
8
  Report privately via [GitHub security advisories](https://github.com/automatis-tools/agents-can-communicate/security/advisories/new).
6
9
 
@@ -9,7 +12,7 @@ Please do not open a public issue first.
9
12
  Include: what you ran, what happened, what you expected, and the client and
10
13
  version. A reproduction against a throwaway `ACC_DATA_HOME` is ideal.
11
14
 
12
- ## Scope
15
+ ## Check the scope
13
16
 
14
17
  | In scope | Out of scope |
15
18
  |---|---|
@@ -21,11 +24,11 @@ version. A reproduction against a throwaway `ACC_DATA_HOME` is ideal.
21
24
 
22
25
  Reasoning behind each: [docs/SECURITY_MODEL.md](docs/SECURITY_MODEL.md).
23
26
 
24
- ## Supported versions
27
+ ## Target a supported version
25
28
 
26
29
  Pre-1.0: the latest release only.
27
30
 
28
- ## What we will do
31
+ ## Expect this response
29
32
 
30
33
  Acknowledge, reproduce, and tell you whether it is in scope. If it is, the fix
31
34
  ships with a test in `tests/security/` so it cannot come back quietly.
@@ -1,9 +1,9 @@
1
1
  # Writing an adapter
2
2
 
3
- An adapter teaches ACC one client. Nothing else in ACC knows that client exists. This page
4
- assumes the vocabulary in [Protocol](PROTOCOL.md#identity-hierarchy) — session, participant,
5
- claim — and points to [Capabilities](CAPABILITIES.md) for what was actually measured per
6
- client; see the [documentation map](index.md) for where both fit among the rest.
3
+ Use this page to add one client without leaking vendor behavior into core. Start with the
4
+ [identity contract](PROTOCOL.md#identity), then compare the shipped evidence under
5
+ [certified support](CAPABILITIES.md#certified-support). The [documentation map](index.md)
6
+ links the surrounding concepts and runtime architecture.
7
7
 
8
8
  ```mermaid
9
9
  graph LR
@@ -14,7 +14,7 @@ graph LR
14
14
  R --> H
15
15
  ```
16
16
 
17
- ## The manifest
17
+ ## Define the manifest
18
18
 
19
19
  ```js
20
20
  export function createExampleAdapter() {
@@ -37,8 +37,8 @@ export function createExampleAdapter() {
37
37
  ```
38
38
 
39
39
  `renderContextResult` is required wherever an adapter renders peer messages. It returns
40
- `{ text, includedMessageIds, includedAttentionIds }`, and the [delivery
41
- lifecycle](PROTOCOL.md#delivery-lifecycle) advances only from those ids — never by searching
40
+ `{ text, offeredMessageIds, includedAttentionIds }`, and the [receipt
41
+ lifecycle](PROTOCOL.md#receipt-lifecycle) advances only from those ids — never by searching
42
42
  `text` for one, because peer text is untrusted and can imitate another message's header.
43
43
  `projectContextResult()` implements this contract; `projectContext()` remains the text-only
44
44
  convenience API for adapters that don't need it. An adapter with only the older
@@ -53,7 +53,7 @@ actually runs as — `command: "claude"` for a client that really runs as `node`
53
53
  nothing, and the failure is silent: the session gets `pid: null` and falls back to reading
54
54
  presence by age alone, with nothing telling you why.
55
55
 
56
- ## Capabilities
56
+ ## Declare only proven capabilities
57
57
 
58
58
  Fourteen booleans in four groups, declared in the manifest's `capabilities` object:
59
59
 
@@ -68,7 +68,8 @@ Fourteen booleans in four groups, declared in the manifest's `capabilities` obje
68
68
  `defineAdapter` enforces the method — declaring `guards.beforeWrite: true` without
69
69
  `guardWrite()` is a usage error at construction. It also requires a passing entry in the
70
70
  validated `certification.json`; method existence is never evidence. What each shipped
71
- client was actually observed doing against this list is [Capabilities](CAPABILITIES.md#matrix).
71
+ client was actually observed doing against this list is under
72
+ [certified support](CAPABILITIES.md#certified-support).
72
73
 
73
74
  `lifecycle.heartbeat` is deliberately not a flavour of `delivery.nextTurn`. Next-turn
74
75
  delivery happens only when the client reaches a normal turn boundary; heartbeat fires on a
@@ -121,21 +122,23 @@ The rules `defineAdapter` enforces, and the ones the runtime applies:
121
122
  - The three native methods return closed facts (`validateNativeActivationPlan()` closes the
122
123
  activation plan) and never put vendor data - endpoints, sockets, raw errors - into core.
123
124
 
124
- ## How far you can get
125
+ ## Choose the integration depth
125
126
 
126
127
  | Tier | You register | You get | You do not get |
127
128
  |---|---|---|---|
128
129
  | 0 | nothing — humans run `acc` | durable messages, status, claims | anything automatic |
129
130
  | 1 | the MCP server | attach on first call, read, claim, message | guards, session end |
130
- | 2 | hooks + skill | automatic attach, turn context, write guards, cleanup | realtime |
131
- | 3 | + realtime surface | delivery receipts, safe-point injection, child sessions | — |
131
+ | 2 | hooks + skill | only the lifecycle, context, guard, and next-turn behaviors separately captured for this client | uncaptured hook behaviors |
132
+ | 3 | + native delivery surface | only captured live-push and reply-route modes | safe-point injection or child sessions unless separately captured |
132
133
 
133
134
  Installed hook wiring may reach tier 2, but the effective capability is still limited to
134
- an exact certified client/version/platform. Passing native captures exist for Claude Code
135
- 2.1.258 and Codex 0.152.1 on macOS arm64; they become live capabilities only when the
136
- production transports ship behind the native delivery contract above.
135
+ an exact certified client/version/platform. Tier 3 ships for one client: Claude Code, from
136
+ 2.1.258 on macOS arm64, behind the native delivery contract above. Codex reached a passing
137
+ queue capture and was withdrawn anyway - the mode its transport needs reports the daemon's
138
+ workspace as the session's - which is the standard: a capture that works is not the same
139
+ claim as a capability that is safe to ship.
137
140
 
138
- ## normalizeHook
141
+ ## Normalize hook input
139
142
 
140
143
  Whitelist, never a filter. Every client hands hooks the prompt, the transcript path, or the
141
144
  tool output; none of it may survive.
@@ -151,7 +154,7 @@ return normalizedEvent({
151
154
  Refuse an unrecognised payload. Inventing a session attaches the wrong one, or a new one
152
155
  every hook, and looks like it is working.
153
156
 
154
- ## Response contracts do not port
157
+ ## Measure response contracts
155
158
 
156
159
  Measure them. Every client differs, and a wrong shape fails **silently**:
157
160
 
@@ -166,10 +169,11 @@ Measure them. Every client differs, and a wrong shape fails **silently**:
166
169
  `denyOutcome(reason)` returns `{ stdout, stderr, exitCode }`, so the runtime never has to
167
170
  know which client it is talking to. This table is only the shape each shipped adapter
168
171
  actually uses; the full experimental grid — every candidate shape tried against every
169
- client, including which ones are silently ignored — is measured in
170
- [Capabilities](CAPABILITIES.md#response-contracts-which-do-not-port).
172
+ client, including which ones are silently ignored — is recorded in each adapter's
173
+ `COMPATIBILITY.md` and certification fixtures. The cross-client summary is under
174
+ [guard limitations](CAPABILITIES.md#guard-limitations).
171
175
 
172
- ## Install and ownership
176
+ ## Preserve install ownership
173
177
 
174
178
  ```mermaid
175
179
  graph TB
@@ -188,7 +192,7 @@ Rules that are not negotiable:
188
192
  `planInstall` must use the same path helpers as `install`. A conformance test compares
189
193
  them, because a plan that drifts makes `--dry-run` a decoration.
190
194
 
191
- ## Conformance
195
+ ## Run conformance
192
196
 
193
197
  ```bash
194
198
  node --test tests/conformance/*.test.mjs
@@ -198,7 +202,7 @@ node --test tests/process/hook-wiring.test.mjs
198
202
  The second one *executes* what your install wrote. Three adapters once shipped a hook
199
203
  command that did not exist anywhere; every test was green.
200
204
 
201
- ## Record what you learned
205
+ ## Record the evidence
202
206
 
203
207
  One `COMPATIBILITY.md` per adapter: client version, event names, payload fields, the deny
204
208
  matrix, and what you could **not** observe. The next person's alternative is guessing.
@@ -1,8 +1,9 @@
1
1
  # Architecture
2
2
 
3
- ACC is a local control plane for communication facts. The execution planes remain the AI
4
- clients the user opened. Core records the truth before a delivery adapter is asked to make
5
- it arrive sooner.
3
+ Use this page to trace a communication fact from an independently opened client through
4
+ core, storage, and an optional delivery adapter. ACC is the local control plane; the AI
5
+ clients remain independent execution planes. Core records the truth before an adapter is
6
+ asked to make it arrive sooner.
6
7
 
7
8
  ```mermaid
8
9
  flowchart LR
@@ -41,7 +42,7 @@ The order is part of the public guarantee:
41
42
 
42
43
  1. validate and commit the message plus one `queued` receipt per resolved recipient;
43
44
  2. resolve the recipient's current delivery bindings;
44
- 3. check recipient policy, current reachability, and exact client-version certification;
45
+ 3. check recipient policy and the current binding's reachability and offered native mode;
45
46
  4. ask one adapter to cross its transport boundary;
46
47
  5. only after acceptance, commit `offered` and an immutable success event.
47
48
 
@@ -71,16 +72,21 @@ lease without exposing the endpoint.
71
72
 
72
73
  ## Certified capability versus current reachability
73
74
 
74
- A capability says an exact client version on an exact platform passed a captured behavior.
75
- It does not say one particular session is reachable now. A binding says what that current
76
- generation exposes and whether its lease is current. Recipient policy says whether it may
77
- spend a turn. All three must agree before live delivery is possible.
78
-
79
- Codex and Claude Code currently ship failed native-delivery captures, so their
80
- `delivery.livePush` and `delivery.replyRoute` capabilities resolve false. Gemini CLI and
81
- Kimi Code have exact-version next-turn evidence only. Grok and generic MCP use inbox
82
- polling. The architecture includes a live seam without pretending the current clients
83
- proved it.
75
+ Ordinary hook capabilities say an exact client version on an exact platform passed a
76
+ captured behavior. Native live delivery uses a separate contract: installation checks the
77
+ captured minimum, platform, and current feature probe, then each session publishes a binding
78
+ only after a generation-bound handshake. The router trusts that admission and verifies the
79
+ binding, recipient policy, declared adapter capability, and adapter response; it does not add
80
+ a third exact-version certification check. A binding says what that current generation
81
+ exposes and whether its lease is current, while recipient policy says whether it may spend a
82
+ turn.
83
+
84
+ Claude Code is the one client that proved the live seam: a Channel capture on 2.1.258,
85
+ confirmed on 2.1.260 through the installed package, admitted by minimum-plus-probe rather
86
+ than an exact version. Codex's queue transport passed its capture and the capability was
87
+ withdrawn, because the mode it needs hides the session's workspace. Gemini CLI and Kimi
88
+ Code have exact-version next-turn evidence only; Grok and generic MCP use inbox polling.
89
+ The seam exists for every adapter; only one has earned it.
84
90
 
85
91
  ## Storage and workspace identity
86
92
 
@@ -90,7 +96,9 @@ lexically, so a cursor is simply the last sequence returned.
90
96
 
91
97
  Workspace discovery checks an explicit config first, then the Git common directory, then
92
98
  the plain directory. Multiple worktrees share a workspace id while each session records
93
- its checkout and branch. Nothing written by ACC lands inside those roots.
99
+ its checkout and branch. Runtime state never lands inside those roots; the only project
100
+ file ACC writes is an optional `acc.workspace.json` explicitly requested through
101
+ `acc config init`.
94
102
 
95
103
  A lone session can remain ephemeral. Durable state materialises when a second live session
96
104
  appears or the first claim, message, or handoff is committed. This makes “silent when
@@ -1,5 +1,11 @@
1
1
  # Capabilities
2
2
 
3
+ Use this page to set expectations after installation. Integration means ACC can introduce
4
+ peer awareness and coordination instructions; it does not guarantee what a model will do
5
+ with them. Delivery also varies independently from awareness. The durable inbox works for
6
+ every participant, supported exact versions may add next-turn delivery, and only the
7
+ experimental Claude Code channel can deliver while a session is idle.
8
+
3
9
  Capability honesty separates four questions that are easy to collapse:
4
10
 
5
11
  1. **Certified support** — did this exact client version and platform pass a shipped
@@ -13,6 +19,10 @@ Capability honesty separates four questions that are easy to collapse:
13
19
  A source method or vendor documentation is not certification. Unknown versions and
14
20
  platforms degrade to false. No weaker session inherits a stronger peer's capability.
15
21
 
22
+ Run `acc doctor` in the project when observed behavior differs from this page. It reports
23
+ the installed client version, platform, effective capability, and fallback instead of
24
+ assuming that a newer or differently packaged client behaves like a captured one.
25
+
16
26
  ## Certified support
17
27
 
18
28
  Passing evidence currently ships for these exact versions on `darwin-arm64`:
@@ -33,10 +43,12 @@ Every other capability in the closed shape defaults to false, including session
33
43
  child sessions, startup or safe-point injection, and before-read guards.
34
44
 
35
45
  The `delivery.livePush` and `delivery.replyRoute` row is `no` for the exact hook versions
36
- this matrix is keyed to. Native live delivery was captured on newer clients - Claude Code
37
- 2.1.258 (livePush and replyRoute) and Codex 0.152.1 (livePush) - and is admitted through the
38
- native delivery contract rather than exact-version certification: it is off until a per-client
39
- opt-in, experimental, and never turns on for a client below the captured minimum.
46
+ this matrix is keyed to. Native live delivery is captured on a newer client - Claude Code
47
+ 2.1.258, livePush and replyRoute, confirmed again on 2.1.260 through the installed package -
48
+ and is admitted through the native delivery contract rather than exact-version
49
+ certification: it is off until a per-client opt-in, experimental, and never turns on for a
50
+ client below the captured minimum. Codex's queue capture passed and the capability was
51
+ withdrawn; the row below says why.
40
52
 
41
53
  The limitations belong next to the adapters they affect:
42
54
 
@@ -60,8 +72,10 @@ would publish a generation-bound binding with `availableModes`, `clientVersion`,
60
72
  with a computed `reachable` boolean while keeping the opaque endpoint private.
61
73
 
62
74
  The router requires exactly one current eligible generation. No binding, an expired lease,
63
- several live sessions for one participant, a busy target, or a version that does not match
64
- passing evidence all stay on durable fallback.
75
+ several live sessions for one participant, and an adapter refusal each keep delivery on the
76
+ durable fallback. Busy behavior belongs to the transport: Claude's Channel can accept a
77
+ message while the target is busy and queue it until the current turn finishes; an adapter
78
+ that instead refuses with `recipient_busy` leaves the message on the durable path.
65
79
 
66
80
  The lease is extended by whoever serves the endpoint, because only that process knows it is
67
81
  still alive. A client that publishes no heartbeat - Claude Code among them - would otherwise
@@ -73,9 +87,9 @@ Current shipped reality: Claude Code on darwin-arm64 has a passing experimental
73
87
  capture behind the native delivery contract, off until a per-client opt-in. Codex is
74
88
  next-turn and inbox only: its queue transport works, but the mode that makes a session
75
89
  reachable is the mode that hides which workspace it is in. Every other client is next-turn or
76
- inbox only;
77
- Gemini CLI and Kimi Code are next-turn only at their exact captured versions; Grok and MCP
78
- poll inbox.
90
+ inbox only. Gemini CLI and Kimi Code are next-turn only at their exact captured versions;
91
+ Grok and MCP poll inbox. On Linux, the shipped captures above do not establish next-turn or
92
+ live delivery, so the honest expectation is the durable inbox.
79
93
 
80
94
  ## Recipient policy
81
95
 
@@ -89,9 +103,13 @@ policy:
89
103
  | `all` | every addressed message kind may use live push |
90
104
 
91
105
  The default is `off`. `acc install --delivery actionable|all` is an explicit request, not
92
- a force switch. The installer applies it only when the detected exact client has certified
93
- live push; otherwise effective policy remains off and the fallback diagnostic is printed.
94
- Room messages are never live-push candidates.
106
+ a force switch. Exact-version certification governs ordinary hook capabilities. Native live
107
+ delivery is separate: the installer applies the requested policy only when the client meets
108
+ the captured minimum version, runs on a captured platform, and passes the current feature
109
+ probe; otherwise effective policy remains off and the fallback diagnostic is printed. Each
110
+ enabled session must then pass its generation-bound handshake. A failed handshake clears or
111
+ refuses that session's binding and reports degraded reachability without rewriting the
112
+ installed consent. Room messages are never live-push candidates.
95
113
 
96
114
  ## Fallback
97
115
 
package/docs/CLI.md CHANGED
@@ -1,9 +1,10 @@
1
1
  # CLI
2
2
 
3
- The `acc` command is the universal local boundary. Setup commands are for a person;
4
- communication commands are the small surface installed skills teach to agents. Every
5
- command accepts `--json` and `--cwd <path>`. `--workspace <config>` selects an explicit
6
- workspace config where supported by the common boundary.
3
+ Use `acc` to install and diagnose integrations, or to inspect the same communication
4
+ operations that installed skills use on an agent's behalf. Setup commands are for a
5
+ person; communication commands are the smaller agent-facing vocabulary. Every command
6
+ accepts `--json` and `--cwd <path>`. `--workspace <config>` selects an explicit workspace
7
+ config where supported by the common boundary.
7
8
 
8
9
  <!-- test:command -->
9
10
  ```bash
@@ -11,7 +12,7 @@ acc help
11
12
  acc version
12
13
  ```
13
14
 
14
- ## Communication commands
15
+ ## Coordinate from a session
15
16
 
16
17
  | Command | Required | Optional |
17
18
  |---|---|---|
@@ -57,14 +58,24 @@ reason; ordinary sessions release only their own claims.
57
58
  ### Messages and requests
58
59
 
59
60
  ```bash
60
- acc message --to models --type question --subject "receipt wording" \
61
+ acc message --to codex --type question --subject "receipt wording" \
61
62
  --body "Should transport acceptance be called offered?" \
62
63
  --client-message-id client_stable_1
63
64
 
64
- acc request --to models --title "review receipt wording" \
65
+ acc request --to codex --title "review receipt wording" \
65
66
  --detail "Check CLI and MCP results; reply with defects only."
66
67
  ```
67
68
 
69
+ `--to` takes a client name - `codex`, `claude_code`, `gemini_cli` - while exactly one
70
+ session of that client is here, and the exact participant id from `acc status --json`
71
+ otherwise. Two sessions of one client are refused by name rather than guessed between, the
72
+ same way `--session` refuses. The recorded message always names the participant, never the
73
+ client it was reached through.
74
+
75
+ By default a hooked participant id is derived from that client's session id. It remains
76
+ usable for the current conversation but a new unrelated conversation gets a new address.
77
+ Set `ACC_PARTICIPANT` when the recipient must keep one stable address across conversations.
78
+
68
79
  `message` accepts generic kinds `note`, `question`, `request`, and `decision`. Defaults are
69
80
  `note` plus obligation `none`; questions and requests require `reply`; an addressed
70
81
  decision may explicitly use `--obligation acknowledge`. `answer` is created only by
@@ -109,14 +120,14 @@ no state override.
109
120
  ```bash
110
121
  acc finish --goal "document receipt semantics" --status partial \
111
122
  --completed "protocol updated" --remaining "acceptance proof" \
112
- --blocker "packed test not run" --to models
123
+ --blocker "packed test not run" --to codex
113
124
  ```
114
125
 
115
126
  Status is `complete`, `partial`, or `blocked`. `finish` records a structured handoff,
116
127
  releases the caller's claims, and ends ACC presence for that session. It never closes the
117
128
  external AI client. An addressed handoff requires acknowledgement; a room handoff does not.
118
129
 
119
- ## Setup and maintenance
130
+ ## Install, diagnose, and update
120
131
 
121
132
  | Command | Flags |
122
133
  |---|---|
@@ -143,7 +154,7 @@ runs the unmodified client, and ACC is never the parent of the session after tha
143
154
  Only `update` touches the network. `ACC_NO_UPDATE_CHECK=1` disables update checks. Hooks
144
155
  never perform them.
145
156
 
146
- ## Adapter lifecycle commands
157
+ ## Integrate a client lifecycle
147
158
 
148
159
  `acc attach --participant <id>`, `acc heartbeat --session <id> --generation <token>`, and
149
160
  `acc detach --session <id> --generation <token>` are public executable boundaries used by