agents-can-communicate 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/README.md +28 -7
  2. package/SECURITY.md +1 -1
  3. package/bin/acc-bootstrap.mjs +5 -54
  4. package/bin/acc-claude-channel.mjs +8 -175
  5. package/bin/acc-hook.mjs +4 -133
  6. package/bin/acc-mcp.mjs +4 -59
  7. package/bin/acc-update-worker.mjs +8 -0
  8. package/bin/acc.mjs +5 -39
  9. package/bin/entrypoints/acc-bootstrap.mjs +47 -0
  10. package/bin/entrypoints/acc-claude-channel.mjs +149 -0
  11. package/bin/entrypoints/acc-hook.mjs +58 -0
  12. package/bin/entrypoints/acc-mcp.mjs +70 -0
  13. package/bin/entrypoints/acc.mjs +51 -0
  14. package/bin/entrypoints/claude-channel-stdio.mjs +29 -0
  15. package/bin/entrypoints/hook-output.mjs +73 -0
  16. package/docs/ADAPTER_AUTHORING.md +41 -7
  17. package/docs/ARCHITECTURE.md +62 -11
  18. package/docs/CAPABILITIES.md +40 -36
  19. package/docs/CLI.md +143 -25
  20. package/docs/CONCEPTS.md +13 -6
  21. package/docs/CONFIGURATION.md +37 -22
  22. package/docs/DESIGN_DECISIONS.md +16 -11
  23. package/docs/GETTING_STARTED.md +37 -7
  24. package/docs/GLOSSARY.md +9 -3
  25. package/docs/HOW_IT_WORKS.md +32 -11
  26. package/docs/MCP.md +91 -24
  27. package/docs/PROTOCOL.md +69 -12
  28. package/docs/RELEASING.md +28 -10
  29. package/docs/SECURITY_MODEL.md +45 -13
  30. package/docs/TROUBLESHOOTING.md +76 -18
  31. package/docs/UPGRADING.md +119 -0
  32. package/docs/WHY_ACC.md +5 -4
  33. package/docs/index.md +8 -0
  34. package/node_modules/@agents-can-communicate/adapter-claude-code/package.json +1 -1
  35. package/node_modules/@agents-can-communicate/adapter-claude-code/plugin/skills/acc/SKILL.md +106 -5
  36. package/node_modules/@agents-can-communicate/adapter-claude-code/src/install.mjs +6 -6
  37. package/node_modules/@agents-can-communicate/adapter-claude-code/src/native-delivery.mjs +2 -1
  38. package/node_modules/@agents-can-communicate/adapter-codex/certification.json +38 -13
  39. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/certification-provenance.json +220 -0
  40. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-current-binding-product-evidence.json +1549 -0
  41. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-current-binding-product.json +27 -0
  42. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-product-evidence.json +1549 -0
  43. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-product.json +27 -0
  44. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-transport-evidence.json +259 -0
  45. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-transport.json +21 -0
  46. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-current-binding-product-evidence.json +1549 -0
  47. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-current-binding-product.json +27 -0
  48. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-product-evidence.json +1549 -0
  49. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-product.json +27 -0
  50. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-transport-evidence.json +259 -0
  51. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-transport.json +21 -0
  52. package/node_modules/@agents-can-communicate/adapter-codex/package.json +14 -2
  53. package/node_modules/@agents-can-communicate/adapter-codex/plugin/skills/acc/SKILL.md +106 -5
  54. package/node_modules/@agents-can-communicate/adapter-codex/src/adapter.mjs +26 -44
  55. package/node_modules/@agents-can-communicate/adapter-codex/src/app-server-client.mjs +70 -17
  56. package/node_modules/@agents-can-communicate/adapter-codex/src/config-block.mjs +231 -0
  57. package/node_modules/@agents-can-communicate/adapter-codex/src/hooks.mjs +1 -1
  58. package/node_modules/@agents-can-communicate/adapter-codex/src/install.mjs +71 -63
  59. package/node_modules/@agents-can-communicate/adapter-codex/src/native-delivery.mjs +107 -103
  60. package/node_modules/@agents-can-communicate/adapter-codex/src/native-endpoint.mjs +96 -0
  61. package/node_modules/@agents-can-communicate/adapter-codex/src/ws-json-rpc.mjs +3 -2
  62. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/gemini-extension.json +1 -1
  63. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/skills/acc/SKILL.md +106 -5
  64. package/node_modules/@agents-can-communicate/adapter-gemini-cli/package.json +1 -1
  65. package/node_modules/@agents-can-communicate/adapter-gemini-cli/src/install.mjs +2 -2
  66. package/node_modules/@agents-can-communicate/adapter-grok/package.json +1 -1
  67. package/node_modules/@agents-can-communicate/adapter-grok/plugin/skills/acc/SKILL.md +106 -5
  68. package/node_modules/@agents-can-communicate/adapter-grok/src/install.mjs +2 -2
  69. package/node_modules/@agents-can-communicate/adapter-kimi/package.json +1 -1
  70. package/node_modules/@agents-can-communicate/adapter-kimi/plugin/skills/acc/SKILL.md +106 -5
  71. package/node_modules/@agents-can-communicate/adapter-kimi/src/hooks.mjs +1 -1
  72. package/node_modules/@agents-can-communicate/adapter-kimi/src/install.mjs +2 -2
  73. package/node_modules/@agents-can-communicate/adapter-sdk/package.json +1 -1
  74. package/node_modules/@agents-can-communicate/adapter-sdk/src/capabilities.mjs +5 -0
  75. package/node_modules/@agents-can-communicate/adapter-sdk/src/context-projector.mjs +26 -4
  76. package/node_modules/@agents-can-communicate/adapter-sdk/src/decision-text.mjs +19 -0
  77. package/node_modules/@agents-can-communicate/adapter-sdk/src/hook-shim.mjs +5 -3
  78. package/node_modules/@agents-can-communicate/adapter-sdk/src/index.mjs +1 -0
  79. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-delivery.mjs +9 -2
  80. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-vocabulary.mjs +2 -6
  81. package/node_modules/@agents-can-communicate/adapter-sdk/src/session-binding.mjs +29 -9
  82. package/node_modules/@agents-can-communicate/adapter-sdk/src/toml-block.mjs +8 -6
  83. package/node_modules/@agents-can-communicate/cli/package.json +4 -2
  84. package/node_modules/@agents-can-communicate/cli/src/args.mjs +49 -22
  85. package/node_modules/@agents-can-communicate/cli/src/doctor-command.mjs +11 -4
  86. package/node_modules/@agents-can-communicate/cli/src/git-probe.mjs +9 -3
  87. package/node_modules/@agents-can-communicate/cli/src/help.mjs +109 -14
  88. package/node_modules/@agents-can-communicate/cli/src/install-command.mjs +22 -4
  89. package/node_modules/@agents-can-communicate/cli/src/main.mjs +35 -12
  90. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/activation.mjs +110 -0
  91. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/command.mjs +63 -0
  92. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/download.mjs +71 -0
  93. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/entry.mjs +110 -0
  94. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/generation.mjs +167 -0
  95. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/install.mjs +73 -0
  96. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/launchers.mjs +60 -0
  97. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/leases.mjs +60 -0
  98. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/location.mjs +55 -0
  99. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/mutex.mjs +145 -0
  100. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/policy.mjs +4 -0
  101. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/refresh.mjs +40 -0
  102. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/schedule.mjs +21 -0
  103. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/state.mjs +122 -0
  104. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/worker.mjs +65 -0
  105. package/node_modules/@agents-can-communicate/cli/src/session-owner.mjs +33 -108
  106. package/node_modules/@agents-can-communicate/cli/src/update-command.mjs +25 -7
  107. package/node_modules/@agents-can-communicate/core/package.json +1 -1
  108. package/node_modules/@agents-can-communicate/core/src/attention.mjs +3 -0
  109. package/node_modules/@agents-can-communicate/core/src/claims.mjs +13 -8
  110. package/node_modules/@agents-can-communicate/core/src/conversations.mjs +9 -25
  111. package/node_modules/@agents-can-communicate/core/src/decision-changes.mjs +36 -0
  112. package/node_modules/@agents-can-communicate/core/src/decision-state.mjs +42 -0
  113. package/node_modules/@agents-can-communicate/core/src/delivery-bindings.mjs +11 -4
  114. package/node_modules/@agents-can-communicate/core/src/inbox.mjs +48 -17
  115. package/node_modules/@agents-can-communicate/core/src/intents.mjs +35 -15
  116. package/node_modules/@agents-can-communicate/core/src/materialisation.mjs +7 -5
  117. package/node_modules/@agents-can-communicate/core/src/message-pages.mjs +75 -0
  118. package/node_modules/@agents-can-communicate/core/src/next-turn-delivery.mjs +31 -0
  119. package/node_modules/@agents-can-communicate/core/src/session-opening.mjs +128 -0
  120. package/node_modules/@agents-can-communicate/core/src/sessions.mjs +58 -132
  121. package/node_modules/@agents-can-communicate/core/src/sync.mjs +31 -2
  122. package/node_modules/@agents-can-communicate/delivery-router/package.json +1 -1
  123. package/node_modules/@agents-can-communicate/delivery-router/src/refresh-binding.mjs +38 -0
  124. package/node_modules/@agents-can-communicate/delivery-router/src/router.mjs +86 -10
  125. package/node_modules/@agents-can-communicate/hook-runner/package.json +1 -1
  126. package/node_modules/@agents-can-communicate/hook-runner/src/client-version.mjs +1 -0
  127. package/node_modules/@agents-can-communicate/hook-runner/src/native-binding.mjs +6 -4
  128. package/node_modules/@agents-can-communicate/hook-runner/src/native-retirement.mjs +48 -0
  129. package/node_modules/@agents-can-communicate/hook-runner/src/process-table.mjs +1 -1
  130. package/node_modules/@agents-can-communicate/hook-runner/src/runner.mjs +175 -67
  131. package/node_modules/@agents-can-communicate/hook-runner/src/session-lifecycle.mjs +13 -0
  132. package/node_modules/@agents-can-communicate/installer/package.json +1 -1
  133. package/node_modules/@agents-can-communicate/installer/src/apply.mjs +17 -2
  134. package/node_modules/@agents-can-communicate/installer/src/bootstrap-runtime.mjs +11 -5
  135. package/node_modules/@agents-can-communicate/installer/src/detect.mjs +1 -1
  136. package/node_modules/@agents-can-communicate/installer/src/index.mjs +1 -0
  137. package/node_modules/@agents-can-communicate/installer/src/live-policy.mjs +21 -0
  138. package/node_modules/@agents-can-communicate/installer/src/native-activation.mjs +20 -6
  139. package/node_modules/@agents-can-communicate/installer/src/ownership.mjs +10 -4
  140. package/node_modules/@agents-can-communicate/installer/src/plan.mjs +3 -3
  141. package/node_modules/@agents-can-communicate/mcp-server/package.json +1 -1
  142. package/node_modules/@agents-can-communicate/mcp-server/src/protocol.mjs +85 -0
  143. package/node_modules/@agents-can-communicate/mcp-server/src/resources.mjs +3 -2
  144. package/node_modules/@agents-can-communicate/mcp-server/src/server.mjs +59 -57
  145. package/node_modules/@agents-can-communicate/mcp-server/src/tools.mjs +47 -33
  146. package/node_modules/@agents-can-communicate/protocol/package.json +1 -1
  147. package/node_modules/@agents-can-communicate/protocol/src/conversations.mjs +3 -0
  148. package/node_modules/@agents-can-communicate/protocol/src/decision-changes.mjs +15 -0
  149. package/node_modules/@agents-can-communicate/protocol/src/index.mjs +3 -1
  150. package/node_modules/@agents-can-communicate/protocol/src/schema.mjs +14 -5
  151. package/node_modules/@agents-can-communicate/storage-filesystem/package.json +1 -1
  152. package/node_modules/@agents-can-communicate/storage-filesystem/src/atomic-json.mjs +5 -1
  153. package/node_modules/@agents-can-communicate/storage-filesystem/src/deadline.mjs +7 -0
  154. package/node_modules/@agents-can-communicate/storage-filesystem/src/index.mjs +2 -0
  155. package/node_modules/@agents-can-communicate/storage-filesystem/src/session-read.mjs +25 -0
  156. package/node_modules/@agents-can-communicate/storage-filesystem/src/store.mjs +28 -25
  157. package/package.json +2 -1
@@ -3,8 +3,8 @@
3
3
  Use this page to set expectations after installation. Integration means ACC can introduce
4
4
  peer awareness and coordination instructions; it does not guarantee what a model will do
5
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.
6
+ every participant, supported exact versions may add next-turn delivery, and the
7
+ experimental Codex LocalDaemon and Claude Code Channel paths can deliver while a session is idle.
8
8
 
9
9
  Capability honesty separates four questions that are easy to collapse:
10
10
 
@@ -16,8 +16,8 @@ Capability honesty separates four questions that are easy to collapse:
16
16
  kind?
17
17
  4. **Fallback** — what durable path remains when any earlier answer is no?
18
18
 
19
- A source method or vendor documentation is not certification. Unknown versions and
20
- platforms degrade to false. No weaker session inherits a stronger peer's capability.
19
+ A source method or vendor documentation is not certification. Uncaptured hook versions and
20
+ unsupported platforms degrade to false. Native minimum-based eligibility is separate. No weaker session inherits a stronger peer's capability.
21
21
 
22
22
  Run `acc doctor` in the project when observed behavior differs from this page. It reports
23
23
  the installed client version, platform, effective capability, and fallback instead of
@@ -42,24 +42,23 @@ Passing evidence currently ships for these exact versions on `darwin-arm64`:
42
42
  Every other capability in the closed shape defaults to false, including session resume,
43
43
  child sessions, startup or safe-point injection, and before-read guards.
44
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.
45
+ The native rows remain `no` for the older exact hook versions in this matrix.
46
+ Separate installed-client captures establish Codex `livePush` on 0.152.1 and
47
+ 0.153.4, and Claude Code `livePush` plus `replyRoute` on 2.1.258 and 2.1.260.
48
+ Native eligibility uses the captured platform minimum, a current feature probe,
49
+ and an exact per-session handshake. It is experimental and requires recipient
50
+ opt-in. Codex replies through `acc reply`; its native `replyRoute` remains false.
52
51
 
53
52
  The limitations belong next to the adapters they affect:
54
53
 
55
54
  | Adapter | Exact limitation and evidence |
56
55
  |---|---|
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. |
56
+ | Codex | Exact 0.147.0 next-turn context requires plugin trust. The observed stock 0.153.4 upgrade from ACC 0.3.1 to 0.4 required fresh review of five modified hook definitions; a subsequent restart retained all five active (activation evidence, not new event certification). LocalDaemon native delivery was captured through the installed package on 0.152.1 and 0.153.4, darwin-arm64; minimum 0.152.1, recorded opt-in, current feature probe and exact thread/cwd/process/version/protocol checks are required. Ordinary launch preserves the receiver workspace without ACC arguments or daemon ownership. Embedded or unreachable sessions keep their inbox. Native `replyRoute` remains false. |
58
57
  | 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
58
  | 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
59
  | 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
60
  | 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. |
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. |
61
+ | Generic MCP | As a receiver, tool polling is not next-turn injection, live push, or a native reply route. It has no write guard or client-lifecycle evidence. Outgoing messages may use an eligible recipient's opted-in native adapter. |
63
62
 
64
63
  `certification.json` beside each adapter is machine-readable. `COMPATIBILITY.md` records the
65
64
  captured client behavior, including what could not be observed.
@@ -71,25 +70,28 @@ would publish a generation-bound binding with `availableModes`, `clientVersion`,
71
70
  `livePolicy`, and `leaseUntil`. `acc status --json` reports these as `deliveryBindings`
72
71
  with a computed `reachable` boolean while keeping the opaque endpoint private.
73
72
 
74
- The router requires exactly one current eligible generation. No binding, an expired lease,
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
73
+ The router requires exactly one current eligible generation. No binding, several live
74
+ sessions for one participant, and an adapter refusal keep delivery on the durable
75
+ fallback. An expired lease may be revalidated by an adapter's optional refresh method;
76
+ failure leaves the message queued. Busy behavior belongs to the transport: Claude's Channel can accept a
77
77
  message while the target is busy and queue it until the current turn finishes; an adapter
78
78
  that instead refuses with `recipient_busy` leaves the message on the durable path.
79
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.
80
+ An endpoint may renew its lease, or an adapter may revalidate that exact endpoint on
81
+ demand without a client heartbeat. Retirement is final: neither route may revive a
82
+ retired binding, a closed session or an old generation. Delivery lease refresh does
83
+ not renew participant presence.
85
84
 
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.
85
+ On darwin-arm64, Codex LocalDaemon and Claude Code Channel have captured
86
+ experimental live delivery. Other adapters retain their separately certified
87
+ next-turn paths or inbox polling. Linux and other uncaptured platforms retain
88
+ the durable inbox; these captures establish no new hook capabilities there.
89
+
90
+ Codex's 120-second delivery lease can refresh on demand for the same live endpoint;
91
+ it does not extend the 24-hour participant presence limit. A TUI exit can leave its
92
+ daemon thread loaded and able to execute opted-in messages. Actual thread teardown,
93
+ including explicit archive, runs `SessionEnd` and retires the binding. Turning ACC
94
+ delivery off prevents new offers even while that thread remains loaded.
93
95
 
94
96
  ## Recipient policy
95
97
 
@@ -102,14 +104,16 @@ policy:
102
104
  | `actionable` | questions, requests, answers, decisions, and addressed handoffs may use live push; notes wait for the next turn |
103
105
  | `all` | every addressed message kind may use live push |
104
106
 
105
- The default is `off`. `acc install --delivery actionable|all` is an explicit request, not
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.
107
+ The default is `off`. `acc install --delivery actionable|all` records recipient consent.
108
+ Current activation remains off when the platform, captured minimum or feature probe
109
+ does not qualify; that temporary failure does not erase the requested policy. Each
110
+ session must pass its own generation-bound handshake. An adapter using the installation
111
+ record rereads consent at hooks and before offers, so a long-running vendor process
112
+ cannot retain permission through an old environment value or binding snapshot.
113
+
114
+ For an adapter using recorded consent, `--delivery off` and uninstall prevent new
115
+ native offers. They cannot withdraw a submission already accepted by the vendor queue. Ordinary hook capabilities still
116
+ require exact-version certification. Room messages are never live-push candidates.
113
117
 
114
118
  ## Fallback
115
119
 
package/docs/CLI.md CHANGED
@@ -12,24 +12,62 @@ acc help
12
12
  acc version
13
13
  ```
14
14
 
15
+ Use `acc <command> --help` (or `-h`) and `acc help <command>` for that command's
16
+ required, optional, repeatable and flag options, accepted values, and usage notes.
17
+ For example, `acc work --help` lists intent modes, and `acc finish --help` lists
18
+ handoff statuses. `acc config --help` lists its subcommands;
19
+ `acc config init --help` and `acc help config init` describe initialization.
20
+
21
+ Add `--json` to receive the command description as structured data: `name`,
22
+ `summary`, `required`, `optional`, `repeated`, `flags`, `subcommands`, `choices`,
23
+ and `notes`, plus `subcommand` when selected. General `acc help --json` keeps its
24
+ grouped `commands` result. Help requires no session, workspace discovery, or
25
+ runtime storage, and does not execute the described command. A help-looking
26
+ option value remains data: `--body --help` sends the literal body `--help`.
27
+
15
28
  ## Coordinate from a session
16
29
 
17
30
  | Command | Required | Optional |
18
31
  |---|---|---|
19
- | `acc status` | — | `--participant`, `--all` |
20
- | `acc sync` | — | `--session`, `--cursor`, `--limit`, `--scope delta|full` |
32
+ | `acc status` | — | `--session`, `--generation`, `--participant`, `--all` |
33
+ | `acc sync` | — | `--session`, `--generation`, `--cursor`, `--limit`, `--scope delta|full|history`, `--type`, `--message`, `--current` |
21
34
  | `acc work` | `--summary` unless `--clear` | `--session`, `--generation`, `--mode`, `--state`, repeated `--hint`, `--clear` |
22
35
  | `acc claim` | `--resource` | `--session`, `--generation`, `--mode`, `--enforcement`, `--reason`, `--lease` |
23
- | `acc release` | `--claim` or `--resource` | `--session`, `--generation`, `--authority`, `--reason` |
24
- | `acc message` | `--subject`, `--body` | repeated `--to`, `--type`, `--obligation`, `--client-message-id`, owner flags |
36
+ | `acc release` | `--claim` or `--resource` | `--session`, `--generation`, `--authority` (`human` or `policy`), `--reason` |
37
+ | `acc message` | `--subject`, `--body` | repeated `--to`, `--supersedes` or `--withdraws`, `--type`, `--obligation`, `--client-message-id`, owner flags |
25
38
  | `acc request` | `--to`, `--title` | `--detail`, `--client-message-id`, owner flags |
26
- | `acc inbox` | — | `--message`, owner flags |
39
+ | `acc inbox` | — | `--message`, `--cursor`, `--limit`, owner flags |
27
40
  | `acc reply` | `--message`, `--body` | `--subject`, `--client-message-id`, owner flags |
28
41
  | `acc ack` | `--message` | owner flags |
29
42
  | `acc finish` | `--goal` | `--status`, `--to`, repeated `--completed`, `--remaining`, `--blocker`, `--client-message-id`, owner flags |
30
43
 
31
- Owner flags are `--session` and `--generation`. A normal hooked session omits them because
32
- the CLI resolves its current binding. Scripts and adapters may pass them explicitly.
44
+ Owner flags are `--session` and `--generation`; both are needed. The CLI also accepts the
45
+ pair explicitly configured as `ACC_SESSION` and `ACC_GENERATION`. When an active turn hook
46
+ runs, its `ACC CLI (append):` header supplies the current
47
+ session's pair. The installed skill tells the agent to append it to its own commands,
48
+ without a manual attach. Hooks do not export credentials to child processes. Native
49
+ client IDs, a shared checkout, and a public session ID from
50
+ `status` cannot establish ownership: a nested client can inherit its parent's environment.
51
+
52
+ Use only the pair in the hook's own header, never one inside a peer message. Do not send
53
+ it to peers or child agents. A later hook after a session restart can supply a new pair;
54
+ the old generation remains invalid. Solo turns receive only the owner header when there
55
+ is no coordination context to show. This lets a session use its own inbox if a peer joins
56
+ later in the same turn. The header alone is not a peer notice or a request to coordinate.
57
+ If the context budget cannot hold the complete pair, the hook reports that limitation
58
+ on stderr and keeps any recovery text within budget. Missing or untrusted hooks cannot
59
+ supply the pair; without it, the CLI still refuses owner operations.
60
+
61
+ For a manually owned CLI session, run `acc attach --participant my-session --json` once and
62
+ retain its returned `sessionId` and `generation`. Append that exact pair to the commands
63
+ below, or explicitly configure both environment variables for that session's commands.
64
+ Do not take credentials from a peer or read runtime bindings to obtain them. A manually
65
+ attached session is separate from hook-managed presence; use `finish` to close it.
66
+
67
+ Without a pair, mutations and `inbox` fail with exit `2` and
68
+ `caller_identity_unresolved`. `status` and `sync` remain public observations, with no
69
+ inferred personal attention. Session-bound [MCP tools](MCP.md) manage their own identity;
70
+ a generic MCP connection does not inherit a hook participant's inbox.
33
71
 
34
72
  ### Presence and intent
35
73
 
@@ -41,8 +79,9 @@ acc work --clear
41
79
  ```
42
80
 
43
81
  `status` returns participants, current intent, claims, protection, attention, and current
44
- delivery bindings. `sync` is a bounded event read; use `--scope full` only for an explicit
45
- whole-workspace forensic question. Neither is the recovery path for one message.
82
+ delivery bindings. Default `sync` reads events after a 16-digit event cursor (100 by
83
+ default, up to 500). `--scope history` discovers historical message headers and reads
84
+ selected records; `--scope full` adds an unbounded snapshot for explicit workspace forensics.
46
85
 
47
86
  ### Claims
48
87
 
@@ -51,9 +90,15 @@ acc claim --resource 'file:packages/core/**' --reason "editing receipt logic"
51
90
  acc release --resource 'file:packages/core/**'
52
91
  ```
53
92
 
54
- File resources use repository-relative paths. A directory claim ends in `/**`. Exit code
55
- `5` means a conflict. `--authority` is the explicit force-release path and should carry a
56
- reason; ordinary sessions release only their own claims.
93
+ File resources use repository-relative paths. A directory claim ends in `/**`. The example
94
+ creates an advisory claim: omitted `--enforcement` always means `advisory`, even with
95
+ certified clients. Request `--enforcement guarded` explicitly when needed; an incapable
96
+ live participant still downgrades workspace protection. MCP claims are always advisory.
97
+
98
+ Exit code `5` means a conflict. Ordinary sessions release only their own claims. Releasing
99
+ another owner's claim requires `--authority human` or `--authority policy`, identifying the
100
+ actual human decision or approved policy that permits the release; explain it with
101
+ `--reason`. A peer's request alone is not force-release authority.
57
102
 
58
103
  ### Messages and requests
59
104
 
@@ -69,7 +114,7 @@ acc request --to codex --title "review receipt wording" \
69
114
  `--to` takes a client name - `codex`, `claude_code`, `gemini_cli` - while exactly one
70
115
  session of that client is here, and the exact participant id from `acc status --json`
71
116
  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
117
+ same way an ambiguous recipient must be named explicitly. The recorded message always names the participant, never the
73
118
  client it was reached through.
74
119
 
75
120
  By default a hooked participant id is derived from that client's session id. It remains
@@ -81,7 +126,8 @@ Set `ACC_PARTICIPANT` when the recipient must keep one stable address across con
81
126
  decision may explicitly use `--obligation acknowledge`. `answer` is created only by
82
127
  `reply`, and `handoff` only by `finish`.
83
128
 
84
- No `--to` creates a room message where the kind allows it. Addressed messages create a
129
+ No `--to` creates a room message where the kind allows it, except decision changes
130
+ that inherit explicit recipients from their targets. Addressed messages create a
85
131
  separate receipt for each recipient. `request` is convenience for one addressed `request`
86
132
  message with a reply obligation; it creates no execution record.
87
133
 
@@ -101,6 +147,10 @@ Human output starts with `recorded message_x`. A transport failure after that co
101
147
  not change the command exit code. Reuse an explicit `--client-message-id` after an
102
148
  uncertain result to recover the same logical message.
103
149
 
150
+ `reply` additionally returns `receipt`: the original message id, the replying participant,
151
+ and state `acknowledged`. Its `message` and `delivery` describe the outgoing answer.
152
+ Human output distinguishes `recorded <reply-id>` from `acknowledged <original-id>`.
153
+
104
154
  ### Inbox, reply, and acknowledgement
105
155
 
106
156
  ```bash
@@ -110,10 +160,56 @@ acc reply --message message_x --body "Yes. Use offered."
110
160
  acc ack --message message_y
111
161
  ```
112
162
 
113
- Inbox returns only unresolved messages addressed to this participant. Reading advances
114
- that participant's receipt to `retrieved`. Reply creates an `answer` in the same thread and
115
- acknowledges the original atomically. `ack` acknowledges without writing an answer and has
116
- no state override.
163
+ Without `--message`, inbox returns `{items, nextCursor}`. Each item has a `message`
164
+ summary and its `receipt`; listing never returns bodies or changes receipts. Summaries
165
+ include the complete message/thread/sender ids, kind, obligation, timestamp, reply link,
166
+ subject (up to 160 UTF-8 bytes), `bodyBytes`, `artifactCount`, and untrusted attribution.
167
+ Bodies, artifact details, handoff payloads, and recipient lists require an exact read.
168
+
169
+ Pages are newest first (descending message id breaks timestamp ties), default to 20 items,
170
+ and contain at most 12,000 bytes of formatted page JSON, excluding the CLI envelope.
171
+ `--limit` accepts 1..500 but cannot raise the byte ceiling. Continue with
172
+ `acc inbox --cursor <nextCursor>` until it is `null`. The cursor is a complete message id,
173
+ not an offset; reading or acknowledging it does not shift the next page. These are live
174
+ pages: omit the cursor to see new arrivals. An unknown or foreign cursor is an error.
175
+
176
+ `--message <id>` returns the existing one-item array with the complete message/receipt
177
+ pair, advancing that participant's receipt to `retrieved` when needed. It cannot be
178
+ combined with `--cursor` or `--limit`. An exact id also reads an acknowledged message,
179
+ preserving its receipt, timestamp, and event history.
180
+ Use the original message id to inspect acknowledgement; the outgoing reply belongs to
181
+ its recipient's inbox. Resolved messages stay out of the ordinary inbox.
182
+
183
+ Reply creates an `answer` in the same thread and acknowledges the original atomically.
184
+ `ack` acknowledges without writing an answer and has no state override.
185
+
186
+ ### Historical recovery
187
+
188
+ ```bash
189
+ acc sync --scope history --type handoff --json
190
+ acc sync --scope history --type handoff --cursor message_x --json
191
+ acc sync --scope history --message message_y --json
192
+ ```
193
+
194
+ History returns `{scope: "history", view: "summary", items, nextCursor}` with the same
195
+ summary fields, ordering, page limits, and message-id cursors as inbox. `--type` accepts
196
+ any message kind and filters before pagination; keep the same filter between pages.
197
+ This public workspace observation includes records from before your session joined.
198
+ Exact history reads return `view: "message"` and one complete message in `items`,
199
+ without changing any receipt. Do not combine `--message` with type, cursor, or limit;
200
+ message and type are valid only in history scope. Decision reads also include `decisionStatus`. Use
201
+ `acc sync --scope history --type decision --current --json` for terminal decisions
202
+ and withdrawals; keep these filters when paging. Exact reads cannot use `--current`.
203
+ `current` means no explicit successor, not truth or consensus.
204
+
205
+ To change a decision, send another `acc message --type decision` with repeated
206
+ `--supersedes <message-id>` or `--withdraws <message-id>` (1..16 unique IDs; exclusive).
207
+ Use subject/body for the new position or withdrawal reason. Changes inherit the target
208
+ recipients and authors, including offline participants; `--to` adds recipients.
209
+ Any owned participant can record an attributed change. Multiple successor branches
210
+ remain conflicted until a new change explicitly references all current alternatives.
211
+ Old records leave ordinary inbox/automatic attention without any receipt change;
212
+ exact inbox and history still recover them. See [decision lifecycle](PROTOCOL.md#decision-lifecycle).
117
213
 
118
214
  ### Handoff
119
215
 
@@ -136,7 +232,7 @@ external AI client. An addressed handoff requires acknowledgement; a room handof
136
232
  | `acc doctor` | `--home`, `--repair` |
137
233
  | `acc config init` | `--yes`, `--force` |
138
234
  | `acc config validate` | — |
139
- | `acc update` | `--apply` |
235
+ | `acc update` | `--check`, `--auto on\|off`, `--pin VERSION\|none`, `--apply` (alias) |
140
236
  | `acc help` | — |
141
237
  | `acc version` | — |
142
238
 
@@ -147,12 +243,34 @@ terminal asks one default-No question per eligible client, and on a non-interact
147
243
  `--dry-run` it keeps fresh clients off. A recorded opt-in is kept on upgrade. If the detected
148
244
  client cannot receive native delivery - unsupported, below the captured minimum, a
149
245
  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`.
153
-
154
- Only `update` touches the network. `ACC_NO_UPDATE_CHECK=1` disables update checks. Hooks
155
- never perform them.
246
+ effective policy off and prints the reason. Claude Code shell activation writes an owned
247
+ zsh PATH block and a shim that `exec`s the real client; `ACC_BYPASS=1` bypasses that
248
+ activation. Codex LocalDaemon delivery uses recorded installation consent without changing
249
+ ordinary launch arguments. Its opt-in remains active when shim variables are absent or
250
+ bypassed; `acc install --adapter codex --delivery off` disables new native offers. ACC never
251
+ starts or stops the vendor daemon. See [delivery consent](CONFIGURATION.md#keep-delivery-consent-user-owned).
252
+
253
+ A normal `acc install` enables automatic updates. A background worker checks stable releases
254
+ at most once a day, downloads and verifies a separate runtime, then refreshes installed
255
+ integrations and skills after ACC process leases and native binding holds clear. ACC leases
256
+ require confirmed process exit; a native binding can clear on observed SessionEnd even
257
+ while its vendor daemon remains alive, or on confirmed process death. Unknown PIDs remain
258
+ holds. `finish`, presence TTL, and delivery off are not observed native end. Hooks do not
259
+ wait for network work. `ACC_NO_UPDATE_CHECK=1` disables update networking and background
260
+ scheduling.
261
+
262
+ `acc update` requests the update immediately; it reports a pending update when a running or
263
+ unidentified client prevents activation. `--check` only checks and cannot be combined with
264
+ settings changes. `--auto off` disables background updates, and `--auto on` enables them.
265
+ `--pin 0.4.0` holds an exact stable version; `--pin none` follows stable releases. A pin
266
+ cannot downgrade the active runtime. The old `--apply` flag remains accepted.
267
+
268
+ Failed downloads keep the working runtime. A failed integration refresh exits with code
269
+ `4`, names the failed adapter and configuration error, and keeps workspace admission closed.
270
+ Fix the reported configuration problem, then run `acc update` to finish it. `acc doctor`
271
+ reports the update policy and pending notice. Native clients may still require hook trust
272
+ or activation review. See [Upgrading](UPGRADING.md) for the initial 0.3.1 transition and
273
+ recovery details.
156
274
 
157
275
  ## Integrate a client lifecycle
158
276
 
package/docs/CONCEPTS.md CHANGED
@@ -79,6 +79,12 @@ Message kinds describe the conversation:
79
79
  An **obligation** is the communication response owed by a recipient. A request is not an
80
80
  order, and a reply is not proof that work is complete.
81
81
 
82
+ A decision can explicitly replace or withdraw earlier decisions. The old records stay
83
+ attributed and recoverable, while current reads and reminders follow the recorded links.
84
+ Any peer may record a change; competing branches remain visible until explicitly joined.
85
+ A current decision is a recorded position, not agreement or authority. See
86
+ [decision lifecycle](PROTOCOL.md#decision-lifecycle).
87
+
82
88
  ## Threads keep the exchange together
83
89
 
84
90
  The first message is a **thread** root. A reply names the original message and stays in that
@@ -100,19 +106,20 @@ queued -> offered -> retrieved -> acknowledged
100
106
 
101
107
  - `queued`: the durable message and receipt committed;
102
108
  - `offered`: ACC or a certified client accepted the delivery bytes, not proof of reading;
103
- - `retrieved`: the participant fetched the message, not proof of model attention;
109
+ - `retrieved`: the participant fetched the body through its inbox, not proof of model attention;
104
110
  - `acknowledged`: the participant acknowledged it or replied, not proof of task completion.
105
111
 
112
+ Listing inbox headers and observing workspace history do not change receipts.
106
113
  There is no `seen` receipt. A failed delivery attempt leaves the message queued and
107
114
  recoverable rather than creating a terminal failure state.
108
115
 
109
116
  ## Durable first, faster delivery second
110
117
 
111
- The durable inbox is universal. Exact-version certified adapters may also offer messages at
112
- the next normal turn. That does not wake an idle client. Claude Code has the only shipped
113
- experimental live path, off by default and subject to recipient policy and current
114
- reachability; Codex live delivery is withdrawn. [Capabilities](CAPABILITIES.md) is the
115
- current adapter matrix.
118
+ The durable inbox is universal. Exact-version certified adapters may also offer
119
+ messages at the next normal turn. Codex LocalDaemon and Claude Code Channel add
120
+ experimental live delivery, off by default and subject to recipient policy and
121
+ current reachability. Codex can retain an eligible daemon thread after its terminal
122
+ exits. [Capabilities](CAPABILITIES.md) gives the current limits.
116
123
 
117
124
  ## Handoffs preserve explicit context
118
125
 
@@ -6,7 +6,7 @@ as the same operating-system user on the same machine and resolve that same loca
6
6
  workspace.
7
7
 
8
8
  Create `acc.workspace.json` only for stable workspace identity, roots, or shared
9
- claim/context policy. It is optional project configuration that `acc config init` may write
9
+ context budget. It is optional project configuration that `acc config init` may write
10
10
  at your request; runtime state remains in platform app data outside the repository. The
11
11
  file never defines agents, messages, execution state, or delivery endpoints. Project map:
12
12
  [README](index.md). Terms used below: [Glossary](GLOSSARY.md).
@@ -18,11 +18,8 @@ file never defines agents, messages, execution state, or delivery endpoints. Pro
18
18
  Matching ids never connect different machines or OS users.
19
19
  - **More than one root.** A monorepo whose apps live in separate directories, or a
20
20
  workspace that spans sibling checkouts.
21
- - **Shared policy.** Claim mode and context budget, agreed once and committed, rather than
22
- each person's machine deciding.
23
- - **Stated expectations.** `requiredAdapters` records which harnesses this project expects
24
- to be installed, so `acc doctor` can say what is missing rather than leaving a session
25
- silently uncoordinated.
21
+ - **Shared context budget.** Set the ceiling for supported injected turn context once for
22
+ the workspace.
26
23
 
27
24
  ### Define the file
28
25
 
@@ -39,10 +36,8 @@ link can point anywhere, including at a file the repository does not control.
39
36
  "displayName": "Example",
40
37
  "roots": ["."],
41
38
  "policy": {
42
- "claimMode": "advisory",
43
39
  "contextBudgetBytes": 6000
44
- },
45
- "requiredAdapters": []
40
+ }
46
41
  }
47
42
  ```
48
43
 
@@ -52,11 +47,16 @@ link can point anywhere, including at a file the repository does not control.
52
47
  | `workspaceId` | Stable identity, portable id | required |
53
48
  | `displayName` | What peers see in a roster | the directory name |
54
49
  | `roots` | Directories in this workspace, relative to the config | `["."]` |
55
- | `policy.claimMode` | `advisory` or `guarded` | `advisory` |
50
+ | `policy.claimMode` | Validated compatibility metadata (`advisory` or `guarded`); does not select claim enforcement | `advisory` |
56
51
  | `policy.contextBudgetBytes` | Ceiling on injected turn context, 1–64000 | `6000` |
57
- | `requiredAdapters` | Harnesses this project expects | `[]` |
52
+ | `requiredAdapters` | Validated compatibility metadata; does not affect `acc doctor` diagnostics | `[]` |
58
53
  | `extensions` | Anything else, namespaced by whoever wrote it | `{}` |
59
54
 
55
+ `policy.claimMode` and `requiredAdapters` are stored but have no claim or doctor effect in
56
+ 0.4. CLI claims default to advisory; request `--enforcement guarded` on each claim when
57
+ appropriate, subject to every live participant's certified guard. MCP claims remain
58
+ advisory. Do not use these metadata fields to configure protection or missing-client checks.
59
+
60
60
  Roots are refused if they are absolute or escape the workspace. An absolute root is one
61
61
  machine's layout committed to a shared repository, and `packages/../../elsewhere` reaches
62
62
  outside the boundary the workspace is supposed to be. The check counts path segments, so an
@@ -98,17 +98,25 @@ Close them, or pass `--force` if you mean it — and restart them afterwards.
98
98
  <!-- test:illustration asks a person to confirm; there is nobody to ask in a test -->
99
99
  ```bash
100
100
  acc config init # preview, then write after you agree
101
- acc config validate # read-only; reports what applies
101
+ acc config validate # read-only; checks acc.workspace.json in the selected directory
102
102
  ```
103
103
 
104
+ `init` and `validate` operate only on `acc.workspace.json` directly inside the selected
105
+ `--cwd` directory (the current directory when omitted). Unlike ordinary workspace discovery,
106
+ they do not walk upward. Pass `--cwd` with the directory containing the config you intend
107
+ to inspect or create. A nested `init` can create a new config that shadows an ancestor;
108
+ check the ancestor first.
109
+
104
110
  `init` shows the exact file it would write and waits. In a non-interactive run — a pipe, a
105
111
  CI job, an agent — there is nobody to ask, so it refuses unless you pass `--yes`. It never
106
112
  overwrites an existing config: a committed identity is shared by everyone on the project,
107
113
  and replacing it on a mistyped command would split one workspace into two.
108
114
 
109
- `validate` only reads. A command someone runs to find out what is wrong must not change the
110
- thing it is inspecting. With no config present it reports the defaults rather than failing,
111
- because not having one is a valid state.
115
+ `validate` only reads. If that selected directory has no config, it reports
116
+ `no acc.workspace.json in selected directory; ancestors not checked`.
117
+ The JSON result returns default config metadata for that missing local file. Ordinary
118
+ commands may still discover an ancestor config; this is not an effective-policy report.
119
+ Run validation with `--cwd` set to that ancestor directory to check its file.
112
120
 
113
121
  ## Keep delivery consent user-owned
114
122
 
@@ -129,6 +137,13 @@ reports next-turn or inbox fallback. Each later session must also pass its own
129
137
  generation-bound handshake. A failed session handshake clears or refuses that binding and
130
138
  reports degraded reachability; it does not rewrite the installed consent.
131
139
 
140
+ Codex LocalDaemon delivery separately requires macOS arm64, Codex 0.152.1 or newer, a
141
+ current feature probe, and exact thread, canonical cwd, process, version and protocol
142
+ checks. Its daemon must already be running; ACC never starts or stops it. Codex reads
143
+ consent from the installation record, not a shell-shim variable. Unavailable or ineligible
144
+ sessions retain durable inbox fallback. Use `acc install --adapter codex --delivery off`
145
+ to stop new native offers; bypassing a shim does not disable that recorded opt-in.
146
+
132
147
  ## Override local paths and identity
133
148
 
134
149
  Nothing in `acc.workspace.json` says where state is stored, and nothing there can — that is
@@ -137,17 +152,17 @@ that resolves inside a workspace.
137
152
 
138
153
  | Variable | Purpose |
139
154
  |---|---|
140
- | `ACC_DATA_HOME` | Where session, claim, and message state is kept, instead of the platform default (`~/Library/Application Support/acc` on macOS; `~/.local/share/acc` on Linux, or wherever `XDG_DATA_HOME` points) |
141
- | `ACC_CONFIG_HOME` | The same override, for configuration state the platform would otherwise keep alongside `ACC_DATA_HOME` |
142
- | `ACC_CACHE_HOME` | The same override, for cache data the platform would otherwise keep under its own cache location |
155
+ | `ACC_DATA_HOME` | Base directory under which ACC creates `acc/` for runtime and coordination state. Defaults: `~/Library/Application Support` on macOS; `~/.local/share` on Linux, or `XDG_DATA_HOME` |
156
+ | `ACC_CONFIG_HOME` | Parsed and validated path override; no current configuration-storage consumer |
157
+ | `ACC_CACHE_HOME` | Parsed and validated path override; no current cache-storage consumer |
143
158
  | `ACC_PARTICIPANT` | Which participant a session belongs to, when the client does not say |
144
159
  | `ACC_WORKSPACE_ROOT` | The project to work in, instead of discovering one from the working directory. Absolute, or it is refused |
145
- | `ACC_SESSION` · `ACC_GENERATION` | Which session a command acts as when it is not worked out automatically. A supplied generation proves the exact opening; with only a session id the CLI resolves the current generation and refuses ambiguity |
160
+ | `ACC_SESSION` · `ACC_GENERATION` | Explicit CLI owner credentials, supplied together by the operator for this session. Hooks do not set them. A public session ID alone never resolves a generation; see [CLI ownership](CLI.md#coordinate-from-a-session) |
146
161
  | `ACC_MCP_PARTICIPANT` | Who `acc-mcp` takes part as. `mcp` by default |
147
162
  | `ACC_MCP_WORKSPACE` | The project `acc-mcp` joins. Without it the server takes the directory the client launched it in, which is rarely the project |
148
- | `ACC_NO_UPDATE_CHECK=1` | Never ask npm whether a newer ACC exists. `acc update` then says it is off, which is a different answer from "nothing is newer" |
163
+ | `ACC_NO_UPDATE_CHECK=1` | Disables update networking and background scheduling; manual recovery of an already downloaded update remains available |
149
164
  | `ACC_PROBE_TIMEOUT_MS` | How long to wait for a client to print its version. Three seconds by default: generous on an idle machine, and not always enough on a busy one, where a client that overruns it is reported as not installed |
150
- | `ACC_NATIVE_DELIVERY_POLICY` | Set only by an ACC-owned shell shim to the consented live policy (`off`, `actionable`, or `all`) before it `exec`s the real client, so the session's hook knows a native transport was activated. Not for a person to set: an ordinary or `ACC_BYPASS=1` launch leaves it unset, and the hook treats missing or invalid values as `off` |
151
- | `ACC_BYPASS=1` | Runs the unmodified client through an ACC shim: no launch-time check, no native flags, and the reserved policy variable is unset. The escape hatch when you want the vendor command exactly as it was |
165
+ | `ACC_NATIVE_DELIVERY_POLICY` | Owned shell-bootstrap consent, currently used by Claude Code. The shim sets `off`, `actionable`, or `all`; missing/invalid values mean off for that route. Codex instead reads recorded installation consent, even when this variable is absent |
166
+ | `ACC_BYPASS=1` | Bypasses owned shell activation, currently Claude Code: no bootstrap check/native flags, and shim policy is unset. It does not disable Codex recorded opt-in; use `acc install --adapter codex --delivery off` for new Codex offers |
152
167
  | `ACC_BOOTSTRAP_DEBUG=1` | Lets the internal `acc-bootstrap` check write one safe diagnostic line to stderr. Off, it is silent, and it never writes to stdout |
153
168
  | `CODEX_HOME` | Codex's own home, honoured when locating the Codex App Server daemon's control socket for native delivery. Codex sets it; ACC only reads it |
@@ -18,12 +18,15 @@ boundaries exist.
18
18
  | Runtime state outside the repository | A checkout can be deleted, cloned, or synced; presence and locks must not travel with it. |
19
19
  | Project config optional and runtime-free | A committed file is editable by anyone with a PR, so it may carry policy — never sessions or tokens. |
20
20
  | Durable state is authoritative | Next-turn or live delivery may accelerate an interaction; neither becomes the source of truth. |
21
+ | Bounded discovery, explicit history recovery | Automatic context stays small; peers select exact messages or historical records when they need full bodies. |
22
+ | Immutable explicit decision links | Replacements and withdrawals preserve prior records and expose competing branches without choosing by timestamp. |
23
+ | Fence managed runtime activation | Refresh all integrations before switching the active generation; partial refresh stays fenced until forward recovery completes. |
21
24
  | No heartbeat helper in v1 | An idle session is honestly reported `stale`. A sidecar process to fake liveness is worse than the truth. |
22
25
  | Presence reads the process, never writes the record | A pid answers "gone" at once; an age floor covers what a pid cannot, including its own reuse. Nothing is written back — no session has authority to edit another's record. This checks a process already there, not one beating on a session's behalf like the heartbeat helper above. |
23
- | No process launching | ACC attaches to sessions you already own. Owning them is a different product. |
26
+ | No AI client or session launching | ACC attaches to sessions you already own; its separate update worker manages ACC packages, not those sessions. |
24
27
  | One publishable package | One version and one release rather than twelve coordinated ones. |
25
28
  | MIT | Widest reuse, least friction. |
26
- | Node 24 (current production LTS) | Uses `node:test`, modern `fs` promises, and no transpiler. |
29
+ | Node 24 or newer required | Uses `node:test`, modern `fs` promises, and no transpiler. |
27
30
  | MCP session from launch config | Never from `initialize` or `clientInfo` — those are attacker-controllable. See the threat scenarios in [SECURITY_MODEL.md](SECURITY_MODEL.md) (scenario 8). |
28
31
 
29
32
  ## Avoid these rejected designs
@@ -32,7 +35,7 @@ boundaries exist.
32
35
  |---|---|
33
36
  | A file in each repo that agents poll | No guard, no identity, no atomicity — and it ends up committed. |
34
37
  | A permanent global lead session | Turns peers into workers and makes one crash fatal. |
35
- | Treating MCP as a lifecycle guarantee | MCP is a tool surface. It cannot attach, guard, or wake anything. |
38
+ | Treating MCP as an external-client lifecycle guarantee | Tool calls resolve MCP's own participant, but cannot infer the client's lifecycle, intercept writes, or wake its receiver. |
36
39
  | Requiring Git, tmux, PostgreSQL, or a service | Every requirement is a reason the tool is not installed. |
37
40
  | Collecting or sharing raw transcripts | Raw transcripts are never collected or shared. Explicit peer messages are bounded records the sender chose to address. |
38
41
  | Reporting queued messages as delivered | A delivery state that overstates itself is worse than no state. |
@@ -47,16 +50,18 @@ perturbed the record instead of removing it — a hook whose recorded hash no
47
50
  longer matched was still observed running, so absence was never actually
48
51
  tested.
49
52
 
50
- Absence is the whole mechanism. With no record, the client runs no hook at
51
- all, prints `hook: SessionStart Completed` while executing nothing, and ACC's
52
- write guard goes silently off — while `acc doctor` and `codex plugin list`
53
- both report it enabled. On a real machine, a shell write walked through a
53
+ Absence was sufficient to disable the hooks in that historical capture. With no
54
+ record, that client ran no hook, printed `hook: SessionStart Completed` while
55
+ executing nothing, and ACC's write guard went silently off — while `acc doctor`
56
+ and `codex plugin list` both reported it enabled. A shell write walked through a
54
57
  guarded claim; writing the exact same hashes back (captured before deletion,
55
58
  from an ACC three releases older) revived the guard immediately.
56
59
 
57
- That is why removal is never ACC's to do: the record is granted once by a
58
- person, survives ACC upgrades, and nothing ACC writes can restore it.
59
- Tidiness is not worth a permission only a human can re-grant.
60
+ That is why removal is never ACC's to do: it preserves the client's trust decision.
61
+ The historical observation above does not establish trust across arbitrary upgrades.
62
+ Codex 0.153.4 compares each current definition's hash and reports changed definitions
63
+ as modified; a trusted hook can also be disabled. ACC preserves the records but leaves
64
+ current readiness unverified, directing the user to `/hooks` in Codex.
60
65
 
61
66
  **The generalisation, since this cost a release:** to learn whether state is
62
67
  load-bearing, take it away. Changing it tests something else.
@@ -81,7 +86,7 @@ where a guard stops behaves better than one that believes it absolute.
81
86
  1. **Storage backend.** The hardened filesystem store ships first. A transactional backend
82
87
  can go behind the same interface later — but not merely to avoid a dependency.
83
88
  2. **Remote coordination.** v2, or a separate product.
84
- 3. **Process launching.** Possibly never; possibly an external integration.
89
+ 3. **AI client/session launching.** Possibly never; possibly an external integration.
85
90
  4. **Multi-root discovery rules** beyond the current `roots` list.
86
91
  5. **Default claim lease length** for hook-only adapters. A hook-only session cannot sustain
87
92
  a short renewal cadence, so lease policy must not assume one.