agents-can-communicate 0.2.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 (96) hide show
  1. package/README.md +91 -81
  2. package/SECURITY.md +7 -4
  3. package/bin/acc-bootstrap.mjs +56 -0
  4. package/bin/acc-claude-channel.mjs +177 -0
  5. package/bin/acc.mjs +7 -2
  6. package/docs/ADAPTER_AUTHORING.md +57 -21
  7. package/docs/ARCHITECTURE.md +23 -15
  8. package/docs/CAPABILITIES.md +51 -18
  9. package/docs/CLI.md +31 -13
  10. package/docs/CONCEPTS.md +91 -94
  11. package/docs/CONFIGURATION.md +33 -23
  12. package/docs/DESIGN_DECISIONS.md +8 -4
  13. package/docs/GETTING_STARTED.md +76 -100
  14. package/docs/GLOSSARY.md +4 -4
  15. package/docs/HOW_IT_WORKS.md +163 -0
  16. package/docs/MCP.md +8 -8
  17. package/docs/PROTOCOL.md +13 -8
  18. package/docs/RELEASING.md +112 -82
  19. package/docs/SECURITY_MODEL.md +13 -8
  20. package/docs/TROUBLESHOOTING.md +30 -12
  21. package/docs/WHY_ACC.md +18 -16
  22. package/docs/index.md +26 -16
  23. package/node_modules/@agents-can-communicate/adapter-claude-code/certification.json +196 -46
  24. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/certification-provenance.json +237 -45
  25. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/delivery/claude-code-2.1.252.json +3 -1
  26. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/delivery/claude-code-2.1.258.json +23 -0
  27. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/delivery/claude-code-2.1.260.json +23 -0
  28. package/node_modules/@agents-can-communicate/adapter-claude-code/package.json +5 -2
  29. package/node_modules/@agents-can-communicate/adapter-claude-code/plugin/.mcp.json +8 -0
  30. package/node_modules/@agents-can-communicate/adapter-claude-code/plugin/skills/acc/SKILL.md +10 -6
  31. package/node_modules/@agents-can-communicate/adapter-claude-code/src/adapter.mjs +34 -2
  32. package/node_modules/@agents-can-communicate/adapter-claude-code/src/channel.mjs +377 -0
  33. package/node_modules/@agents-can-communicate/adapter-claude-code/src/install.mjs +27 -7
  34. package/node_modules/@agents-can-communicate/adapter-claude-code/src/native-delivery.mjs +229 -0
  35. package/node_modules/@agents-can-communicate/adapter-codex/certification.json +38 -5
  36. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/certification-provenance.json +171 -38
  37. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.0.json +3 -1
  38. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-remote-workspace.json +25 -0
  39. package/node_modules/@agents-can-communicate/adapter-codex/package.json +4 -2
  40. package/node_modules/@agents-can-communicate/adapter-codex/plugin/skills/acc/SKILL.md +9 -5
  41. package/node_modules/@agents-can-communicate/adapter-codex/src/adapter.mjs +42 -7
  42. package/node_modules/@agents-can-communicate/adapter-codex/src/app-server-client.mjs +121 -0
  43. package/node_modules/@agents-can-communicate/adapter-codex/src/native-delivery.mjs +151 -0
  44. package/node_modules/@agents-can-communicate/adapter-codex/src/ws-json-rpc.mjs +192 -0
  45. package/node_modules/@agents-can-communicate/adapter-gemini-cli/certification.json +44 -28
  46. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/gemini-extension.json +1 -1
  47. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/skills/acc/SKILL.md +9 -5
  48. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/{BeforeAgent.json → BeforeAgent-0.57.0.json} +2 -2
  49. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/{BeforeTool.json → BeforeTool-0.57.0.json} +2 -2
  50. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/{BeforeTool-shell.json → BeforeTool-shell-0.57.0.json} +2 -2
  51. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/{SessionEnd.json → SessionEnd-0.57.0.json} +2 -2
  52. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/{SessionStart.json → SessionStart-0.57.0.json} +2 -2
  53. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/certification-provenance.json +266 -39
  54. package/node_modules/@agents-can-communicate/adapter-gemini-cli/package.json +6 -6
  55. package/node_modules/@agents-can-communicate/adapter-gemini-cli/src/adapter.mjs +25 -11
  56. package/node_modules/@agents-can-communicate/adapter-grok/package.json +1 -1
  57. package/node_modules/@agents-can-communicate/adapter-grok/plugin/skills/acc/SKILL.md +9 -5
  58. package/node_modules/@agents-can-communicate/adapter-grok/src/adapter.mjs +3 -1
  59. package/node_modules/@agents-can-communicate/adapter-kimi/package.json +1 -1
  60. package/node_modules/@agents-can-communicate/adapter-kimi/plugin/skills/acc/SKILL.md +9 -5
  61. package/node_modules/@agents-can-communicate/adapter-sdk/package.json +1 -1
  62. package/node_modules/@agents-can-communicate/adapter-sdk/src/capabilities.mjs +18 -0
  63. package/node_modules/@agents-can-communicate/adapter-sdk/src/hook-shim.mjs +2 -0
  64. package/node_modules/@agents-can-communicate/adapter-sdk/src/index.mjs +6 -2
  65. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-activation.mjs +76 -0
  66. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-delivery.mjs +202 -0
  67. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-vocabulary.mjs +101 -0
  68. package/node_modules/@agents-can-communicate/adapter-sdk/src/session-binding.mjs +17 -2
  69. package/node_modules/@agents-can-communicate/cli/package.json +1 -1
  70. package/node_modules/@agents-can-communicate/cli/src/args.mjs +2 -2
  71. package/node_modules/@agents-can-communicate/cli/src/doctor-command.mjs +67 -5
  72. package/node_modules/@agents-can-communicate/cli/src/install-command.mjs +133 -11
  73. package/node_modules/@agents-can-communicate/core/package.json +1 -1
  74. package/node_modules/@agents-can-communicate/core/src/conversations.mjs +41 -1
  75. package/node_modules/@agents-can-communicate/core/src/delivery-bindings.mjs +52 -2
  76. package/node_modules/@agents-can-communicate/core/src/service.mjs +10 -0
  77. package/node_modules/@agents-can-communicate/delivery-router/package.json +1 -1
  78. package/node_modules/@agents-can-communicate/delivery-router/src/router.mjs +26 -12
  79. package/node_modules/@agents-can-communicate/hook-runner/package.json +4 -2
  80. package/node_modules/@agents-can-communicate/hook-runner/src/native-binding.mjs +90 -0
  81. package/node_modules/@agents-can-communicate/hook-runner/src/runner.mjs +123 -90
  82. package/node_modules/@agents-can-communicate/installer/package.json +4 -2
  83. package/node_modules/@agents-can-communicate/installer/src/apply.mjs +48 -4
  84. package/node_modules/@agents-can-communicate/installer/src/bootstrap-runtime.mjs +144 -0
  85. package/node_modules/@agents-can-communicate/installer/src/detect.mjs +72 -3
  86. package/node_modules/@agents-can-communicate/installer/src/index.mjs +7 -0
  87. package/node_modules/@agents-can-communicate/installer/src/native-activation.mjs +161 -0
  88. package/node_modules/@agents-can-communicate/installer/src/ownership.mjs +6 -2
  89. package/node_modules/@agents-can-communicate/installer/src/plan.mjs +41 -6
  90. package/node_modules/@agents-can-communicate/installer/src/shell-bootstrap.mjs +210 -0
  91. package/node_modules/@agents-can-communicate/mcp-server/package.json +1 -1
  92. package/node_modules/@agents-can-communicate/protocol/package.json +1 -1
  93. package/node_modules/@agents-can-communicate/protocol/src/fields.mjs +17 -0
  94. package/node_modules/@agents-can-communicate/protocol/src/schema.mjs +18 -3
  95. package/node_modules/@agents-can-communicate/storage-filesystem/package.json +1 -1
  96. package/package.json +2 -1
@@ -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,11 +19,15 @@ 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`:
19
29
 
20
- | Capability | Codex 0.147.0 | Claude Code 2.1.233 | Gemini CLI 0.37.0 | Grok 1.0.13 | Kimi 0.36.1 |
30
+ | Capability | Codex 0.147.0 | Claude Code 2.1.233 | Gemini CLI 0.57.0 | Grok 1.0.13 | Kimi 0.36.1 |
21
31
  |---|---:|---:|---:|---:|---:|
22
32
  | `lifecycle.sessionStart` | yes | yes | yes | no | yes |
23
33
  | `lifecycle.sessionEnd` | yes | yes | yes | no | no |
@@ -32,15 +42,23 @@ Passing evidence currently ships for these exact versions on `darwin-arm64`:
32
42
  Every other capability in the closed shape defaults to false, including session resume,
33
43
  child sessions, startup or safe-point injection, and before-read guards.
34
44
 
45
+ The `delivery.livePush` and `delivery.replyRoute` row is `no` for the exact hook versions
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.
52
+
35
53
  The limitations belong next to the adapters they affect:
36
54
 
37
55
  | Adapter | Exact limitation and evidence |
38
56
  |---|---|
39
- | Codex | 0.147.0 next-turn stdout arrives as unwrapped developer-role context and requires plugin trust. The separate 0.152.0 native capture found no daemon control socket; ACC did not start one, so live push and reply routing remain false. |
40
- | Claude Code | 2.1.233 next-turn delivery waits for the next user prompt. The 2.1.252 channel capture stopped at the development-channel warning before the ACC MCP child started; native delivery branches are unobserved and false. |
41
- | Gemini CLI | Only 0.37.0 has package-shipped next-turn certification. Write and shell tools depend on approval mode; other versions and platforms retain inbox access but no effective delivery capability. |
42
- | Grok | Documentation-shaped payloads do not count as real captures. UserPromptSubmit context was observed discarded, and no deny was captured stopping a real write; all capabilities remain false. |
43
- | Kimi Code | 0.36.1 has next-turn and guard evidence, plus a 60-second heartbeat. Prompt-mode `SessionEnd` never fired, and its next-turn path does not interrupt an active turn. |
57
+ | Codex | 0.147.0 next-turn stdout arrives as unwrapped developer-role context and requires plugin trust. A 0.152.1 capture proved the App Server queue transport, but the release capture then measured that native delivery there requires `codex --remote unix://`, and in that mode the session runs inside the daemon: both the hook payload and the App Server's own thread record report the daemon's directory instead of the session's, so ACC cannot tell which workspace the session is in. Nothing ACC can reach carries the real one, and placing a session in the wrong workspace is worse than not placing it, so `delivery.livePush` is **not** claimed - the probe and the handshake both refuse with `workspace_identity_unavailable`. `replyRoute` stays false. |
58
+ | Claude Code | 2.1.233 next-turn delivery waits for the next user prompt. A 2.1.258 Channel capture proved idle offer, busy queue-after-turn, explicit reply, duplicate suppression, and durable fallback, so `delivery.livePush` and `delivery.replyRoute` are live capabilities behind the native contract (experimental, off until opted in; Claude's development-channel warning is vendor-owned and visible). |
59
+ | Gemini CLI | Only 0.57.0 has package-shipped next-turn certification. Its TUI has no captured external wake or queue interface and `--acp` changes launch ownership, so native delivery is fallback-only; live push and reply routing remain false. |
60
+ | Grok | Documentation-shaped payloads do not count as real captures. The public leader surface exposed no proven addressed injection into an ordinary TUI session, so native delivery is `awaiting_compatibility_capture`; all capabilities remain false. |
61
+ | Kimi Code | 0.36.1 has next-turn and guard evidence, plus a 60-second heartbeat. Its server/queue APIs do not prove a transparent binding to an independently opened session, so native delivery is fallback-only. |
44
62
  | Generic MCP | Tool polling is not next-turn injection, live push, or a native reply route. It has no write guard or client-lifecycle evidence. |
45
63
 
46
64
  `certification.json` beside each adapter is machine-readable. `COMPATIBILITY.md` records the
@@ -54,13 +72,24 @@ would publish a generation-bound binding with `availableModes`, `clientVersion`,
54
72
  with a computed `reachable` boolean while keeping the opaque endpoint private.
55
73
 
56
74
  The router requires exactly one current eligible generation. No binding, an expired lease,
57
- several live sessions for one participant, a busy target, or a version that does not match
58
- passing evidence all stay on durable fallback.
59
-
60
- Current shipped reality: no adapter publishes a native live binding, and no adapter has
61
- passing `livePush` certification. Codex and Claude Code are next-turn or inbox only;
62
- Gemini CLI and Kimi Code are next-turn only at their exact captured versions; Grok and MCP
63
- poll inbox.
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.
79
+
80
+ The lease is extended by whoever serves the endpoint, because only that process knows it is
81
+ still alive. A client that publishes no heartbeat - Claude Code among them - would otherwise
82
+ let the lease run out under an idle session, which is exactly when live delivery is worth
83
+ having. Giving a binding up is a separate, final fact rather than an expired lease, so a
84
+ channel that has not yet noticed cannot extend something the session already retired.
85
+
86
+ Current shipped reality: Claude Code on darwin-arm64 has a passing experimental `livePush`
87
+ capture behind the native delivery contract, off until a per-client opt-in. Codex is
88
+ next-turn and inbox only: its queue transport works, but the mode that makes a session
89
+ reachable is the mode that hides which workspace it is in. Every other client is next-turn or
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.
64
93
 
65
94
  ## Recipient policy
66
95
 
@@ -70,13 +99,17 @@ policy:
70
99
  | Policy | Meaning |
71
100
  |---|---|
72
101
  | `off` | normal next-turn and inbox only |
73
- | `actionable` | questions, requests, and addressed handoffs may use live push |
102
+ | `actionable` | questions, requests, answers, decisions, and addressed handoffs may use live push; notes wait for the next turn |
74
103
  | `all` | every addressed message kind may use live push |
75
104
 
76
105
  The default is `off`. `acc install --delivery actionable|all` is an explicit request, not
77
- a force switch. The installer applies it only when the detected exact client has certified
78
- live push; otherwise effective policy remains off and the fallback diagnostic is printed.
79
- 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.
80
113
 
81
114
  ## Fallback
82
115
 
@@ -84,7 +117,7 @@ Room messages are never live-push candidates.
84
117
  |---|---|
85
118
  | exact-certified Codex 0.147.0 | complete peer body at the next normal turn; `acc inbox` remains recoverable |
86
119
  | exact-certified Claude Code 2.1.233 | complete peer body at the next normal prompt; `acc inbox` remains recoverable |
87
- | exact-certified Gemini CLI 0.37.0 | complete peer body at the next normal turn; `acc inbox` remains recoverable |
120
+ | exact-certified Gemini CLI 0.57.0 | complete peer body at the next normal turn; `acc inbox` remains recoverable |
88
121
  | exact-certified Kimi Code 0.36.1 | complete peer body at the next normal turn; `acc inbox` remains recoverable |
89
122
  | Grok, generic MCP, unknown version, other platform | explicit `acc inbox` polling |
90
123
 
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
  |---|---|
@@ -129,14 +140,21 @@ external AI client. An addressed handoff requires acknowledgement; a room handof
129
140
  | `acc help` | — |
130
141
  | `acc version` | — |
131
142
 
132
- `--delivery` is a recipient policy request, not a capability switch. The default is
133
- `off`. If the detected exact client version lacks certified live push, installation keeps
134
- the effective policy off and prints the adapter's durable fallback.
143
+ `--delivery off|actionable|all` is a per-client recipient policy request, not a capability
144
+ switch, and the default is `off`. `--adapter` is repeatable to name several clients. An
145
+ explicit `--delivery` applies uniformly and never prompts; omitting it on an interactive
146
+ terminal asks one default-No question per eligible client, and on a non-interactive run or a
147
+ `--dry-run` it keeps fresh clients off. A recorded opt-in is kept on upgrade. If the detected
148
+ client cannot receive native delivery - unsupported, below the captured minimum, a
149
+ prerelease, known-bad, a wrong platform, or an unsupported shell - installation keeps the
150
+ effective policy off and prints the reason. A live install writes an owned zsh PATH block and
151
+ a per-command shim that keeps your command name and `exec`s the real client; `ACC_BYPASS=1`
152
+ runs the unmodified client, and ACC is never the parent of the session after that `exec`.
135
153
 
136
154
  Only `update` touches the network. `ACC_NO_UPDATE_CHECK=1` disables update checks. Hooks
137
155
  never perform them.
138
156
 
139
- ## Adapter lifecycle commands
157
+ ## Integrate a client lifecycle
140
158
 
141
159
  `acc attach --participant <id>`, `acc heartbeat --session <id> --generation <token>`, and
142
160
  `acc detach --session <id> --generation <token>` are public executable boundaries used by
package/docs/CONCEPTS.md CHANGED
@@ -1,134 +1,131 @@
1
1
  # Concepts
2
2
 
3
- ACC connects AI sessions that were independently opened by a user. It adds communication
4
- around those sessions; it does not turn them into one managed runtime. Each client keeps
5
- its own context, permissions, lifecycle, checkout, and human authority.
6
-
7
- ```mermaid
8
- graph LR
9
- A["independent session A"] --- ACC["ACC local room"]
10
- B["independent session B"] --- ACC
11
- C["independent session C"] --- ACC
12
- ```
3
+ You open the sessions and give each agent its own task. ACC makes those sessions aware of
4
+ one another and gives them a shared communication vocabulary. It does not combine their
5
+ contexts or turn them into workers owned by one controller.
6
+
7
+ Use this page when a guide or diagnostic names an ACC object. The examples assume Codex is
8
+ building a registration endpoint and Claude Code is building the screen that calls it.
13
9
 
14
10
  ## Peers, not workers
15
11
 
16
- Sessions in one workspace may use different models, clients, trust settings, or people.
17
- No participant is automatically in charge of another. A peer may ask, answer, reserve,
18
- acknowledge, or hand off; the receiver evaluates the message under its own instructions.
12
+ Codex and Claude Code are **peers**. They may use different models, permissions, trust
13
+ settings, clients, and checkouts. Neither is automatically in charge. Claude can ask Codex
14
+ for the endpoint shape; Codex can answer or decline under its own instructions.
19
15
 
20
- This is the middle layer between isolated terminals and a system that owns the agents.
21
- ACC owns durable coordination facts even when every model process is gone, but it never
22
- owns the process itself.
16
+ This resembles coordination among subagents, but the sessions were opened independently by
17
+ the user. ACC never launches, assigns, supervises, or closes them.
23
18
 
24
- ## Participant and session
19
+ ## Workspace, participant, and session
25
20
 
26
- A **participant** is the address used for communication. A stable participant id lets a
27
- new session recover messages addressed before restart. A **session** is one current client
28
- conversation with a generation token proving ownership of its mutations. Several sessions
29
- may belong to one participant; a live offer is ambiguous unless exactly one current
30
- generation is eligible.
21
+ A **workspace** is the local room where related sessions discover coordination facts. It is
22
+ scoped to one machine and operating-system user. Git worktrees of one repository resolve to
23
+ the same ACC workspace, but their checkout files remain separate. In a plain directory, the
24
+ directory supplies identity unless optional configuration says otherwise. Git is optional.
31
25
 
32
- A **workspace** is the local room. Git worktrees of one repository resolve to the same
33
- workspace while retaining their checkout and branch in presence. In a non-Git directory,
34
- the directory itself supplies identity. Git enriches the record but is never required.
26
+ A **participant** is the address for communication. A stable participant id can recover
27
+ messages sent before a restart. A **session** is one current opening of that participant,
28
+ with a generation token preventing an old process from changing its replacement's state.
35
29
 
36
- ## Intent is awareness; a claim commits
30
+ When exactly one Codex peer is eligible, another agent can address `codex`. When several
31
+ Codex sessions are live, that name is ambiguous and the sender uses an exact participant id
32
+ from the roster in `acc status --json`.
37
33
 
38
- An **intent** says what a session is doing and which resources may be affected. It
39
- authorises nothing. Publish it early because it is cheap:
34
+ ## Presence and intent
40
35
 
41
- ```bash
42
- acc work --summary "changing message rendering" --mode edit \
43
- --hint 'file:packages/cli/**'
44
- ```
36
+ **Presence** says which session generations are currently live or recently known. It is not
37
+ proof that a model is idle, attentive, or willing to act.
45
38
 
46
- A **claim** reserves a resource for a lease. It is narrow, explicit, and either
47
- `advisory` or `guarded`:
39
+ **Intent** is a short summary of what an agent is doing, plus optional resource hints. For
40
+ example, Codex might publish “adding the registration endpoint” with
41
+ `file:packages/api/**`. This lets Claude notice a dependency without exposing Codex's
42
+ conversation. Intent grants no authority and creates no reservation.
43
+
44
+ ## Intent is awareness; a claim commits
45
+
46
+ A **claim** is a leased reservation for a canonical resource. An agent that is about to edit
47
+ the API can make its intent actionable:
48
48
 
49
49
  ```bash
50
- acc claim --resource 'file:packages/cli/**' --reason "changing message rendering"
50
+ acc work --summary "adding the registration endpoint" --mode edit \
51
+ --hint 'file:packages/api/**'
52
+ acc claim --resource 'file:packages/api/**' \
53
+ --reason "adding the registration endpoint"
51
54
  ```
52
55
 
53
- `guarded` means every live session exposes a measured pre-write guard for the path ACC can
54
- recognise. It never means an unrelated process or a runtime-generated write is impossible.
55
- If any live participant cannot be stopped, workspace protection is reported as
56
- `advisory`.
56
+ An overlapping claim exits `5` and names the current holder. The peers can narrow their
57
+ resources, ask each other a question, or wait for a handoff. ACC does not arbitrate the
58
+ decision.
57
59
 
58
- File claims are repository-relative and canonical. `file:src/a.mjs` names a file;
59
- `file:src/**` names a directory tree. Ambiguous spellings such as `file:src/*` are refused
60
- instead of creating protection that covers nothing.
60
+ Claims are `advisory` unless every relevant live client exposes a certified pre-write guard
61
+ for that path. `guarded` still does not stop unrelated programs or client writes the adapter
62
+ cannot observe. File claims are repository-relative: `file:src/a.mjs` names one file and
63
+ `file:src/**` names a tree; ambiguous spellings such as `file:src/*` are rejected.
61
64
 
62
- ## Messages are durable untrusted data
65
+ ## Messages and obligations
63
66
 
64
- The message kinds are `note`, `question`, `request`, `answer`, `decision`, and `handoff`.
65
- The generic send command creates the first four except `answer`, which requires `reply`,
66
- and `handoff`, which requires `finish` so their thread and structured payloads cannot be
67
- omitted.
67
+ A **message** is explicit, durable, attributed peer input. It is never system authority.
68
+ Message kinds describe the conversation:
68
69
 
69
- An independent **obligation** says what the recipient owes:
70
+ | Kind | What it communicates | Default obligation |
71
+ |---|---|---|
72
+ | `note` | useful information | none |
73
+ | `question` | a focused question | reply |
74
+ | `request` | requested action and result | reply |
75
+ | `answer` | a reply created in an existing thread | none |
76
+ | `decision` | a decision peers should know | none, or acknowledge when addressed |
77
+ | `handoff` | completed, remaining, and blocked work | acknowledge when addressed |
70
78
 
71
- | Kind | Obligation |
72
- |---|---|
73
- | `note` | `none` |
74
- | `question` | `reply` |
75
- | `request` | `reply` |
76
- | `answer` | `none` |
77
- | `decision` | `none`, or `acknowledge` when addressed |
78
- | `handoff` | `acknowledge` when addressed, `none` as a room record |
79
+ An **obligation** is the communication response owed by a recipient. A request is not an
80
+ order, and a reply is not proof that work is complete.
79
81
 
80
- A request is not an order. It asks for action and a result in the thread, but ACC does not
81
- track execution state. Every body is attributed, escaped, and framed as peer input rather
82
- than system authority.
82
+ ## Threads keep the exchange together
83
83
 
84
- ## Threads have no hidden status
84
+ The first message is a **thread** root. A reply names the original message and stays in that
85
+ thread, so Claude's interface question and Codex's answer remain connected. There is no
86
+ hidden mutable thread status; pending attention is derived from obligations and each
87
+ recipient's receipt.
85
88
 
86
- The first message is the thread root and uses its own `messageId` as `threadId`. A reply
87
- keeps that thread id and names the original with `inReplyTo`. There is no mutable thread
88
- record. What still needs attention is derived from message obligations and per-recipient
89
- receipts.
90
-
91
- `clientMessageId` is the caller's retry key. Repeating equivalent content with the same
92
- key returns the same logical message; reusing it for different content is rejected.
89
+ `clientMessageId` is an optional retry key. Equivalent retries return the original message;
90
+ the same key with different content is rejected. The exact fields and validation rules are
91
+ in [Protocol](PROTOCOL.md).
93
92
 
94
93
  ## Delivery words are evidence
95
94
 
96
- Each recipient has an independent monotonic receipt:
95
+ Each recipient has its own monotonic **receipt**:
97
96
 
98
97
  ```text
99
98
  queued -> offered -> retrieved -> acknowledged
100
99
  ```
101
100
 
102
- - `queued`: message and receipt committed durably;
103
- - `offered`: bytes crossed ACC's transport boundary or a certified native client accepted
104
- the call;
105
- - `retrieved`: the participant explicitly read the message through inbox or equivalent
106
- certified evidence;
107
- - `acknowledged`: the participant acknowledged it or replied.
101
+ - `queued`: the durable message and receipt committed;
102
+ - `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;
104
+ - `acknowledged`: the participant acknowledged it or replied, not proof of task completion.
105
+
106
+ There is no `seen` receipt. A failed delivery attempt leaves the message queued and
107
+ recoverable rather than creating a terminal failure state.
108
108
 
109
- There is no `seen`: ACC cannot observe model attention. There is no terminal delivery
110
- failure: a failed acceleration leaves the durable message recoverable. Forward skips are
111
- legal when a stronger fact implies the weaker ones; backward transitions are rejected.
109
+ ## Durable first, faster delivery second
112
110
 
113
- ## Durable first, acceleration second
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.
114
116
 
115
- Every send records the message before attempting a transport. Inbox is the universal
116
- recovery path. Exact-version certified adapters may offer complete peer messages at the
117
- next normal turn. Native live push would additionally require passing certification, the
118
- recipient's opt-in policy, exactly one current reachable binding, and a safe recipient
119
- state.
117
+ ## Handoffs preserve explicit context
120
118
 
121
- No shipped adapter currently passes live-push certification. Codex 0.152.0 had no daemon
122
- control socket; Claude Code 2.1.252 stopped at the development-channel warning before its
123
- ACC child started. Those failures are shipped as evidence and result in visible fallback,
124
- not a stronger promise.
119
+ A **handoff** records what an agent says it completed, what remains, and any blockers before
120
+ the session ends. It can help a later session resume without copying a transcript. Like
121
+ every peer message, it is attributed data to verify, not an authoritative completion claim.
125
122
 
126
- ## Where state lives
123
+ ## Where data lives
127
124
 
128
- Presence, intents, claims, messages, receipts, events, and handoffs live in platform app
129
- data outside every repository. Raw transcripts remain in the client. A single session is
130
- silent; durable workspace state materialises when a second session or the first durable
131
- coordination object makes it necessary.
125
+ Presence, intent, claims, messages, receipts, events, and handoffs live in platform app data
126
+ outside every repository. ACC never collects or shares raw prompts, assistant responses, or
127
+ transcripts. Optional `acc.workspace.json` is user-requested workspace configuration, not
128
+ runtime state.
132
129
 
133
- Next: [Getting started](GETTING_STARTED.md) · [Protocol](PROTOCOL.md) ·
134
- [Capabilities](CAPABILITIES.md)
130
+ Next: [Getting started](GETTING_STARTED.md) · [How ACC works](HOW_IT_WORKS.md) ·
131
+ [Protocol](PROTOCOL.md) · [Capabilities](CAPABILITIES.md)