agents-can-communicate 0.3.0 → 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 +112 -91
  2. package/SECURITY.md +8 -5
  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 +62 -24
  17. package/docs/ARCHITECTURE.md +79 -20
  18. package/docs/CAPABILITIES.md +52 -30
  19. package/docs/CLI.md +164 -35
  20. package/docs/CONCEPTS.md +97 -93
  21. package/docs/CONFIGURATION.md +66 -45
  22. package/docs/DESIGN_DECISIONS.md +24 -15
  23. package/docs/GETTING_STARTED.md +124 -118
  24. package/docs/GLOSSARY.md +12 -6
  25. package/docs/HOW_IT_WORKS.md +136 -229
  26. package/docs/MCP.md +98 -31
  27. package/docs/PROTOCOL.md +76 -14
  28. package/docs/RELEASING.md +128 -86
  29. package/docs/SECURITY_MODEL.md +52 -15
  30. package/docs/TROUBLESHOOTING.md +88 -18
  31. package/docs/UPGRADING.md +119 -0
  32. package/docs/WHY_ACC.md +19 -16
  33. package/docs/index.md +40 -24
  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 +112 -9
  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 +111 -8
  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 +111 -8
  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 +111 -8
  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 +111 -8
  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 +66 -18
  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 +48 -24
  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 +4 -2
  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
@@ -1,27 +1,27 @@
1
1
  # Configuration
2
2
 
3
- ACC works with no configuration at all. A workspace is identified by its Git common
4
- directory when there is one and by the directory itself otherwise. Independently opened
5
- sessions can communicate without adding runtime state to the project.
6
-
7
- `acc.workspace.json` is only for stable workspace identity, roots, and shared claim/context
8
- policy. It never defines agents, messages, execution state, or delivery endpoints. Project
9
- map: [README](index.md). Terms used below: [Glossary](GLOSSARY.md).
10
-
11
- ## When you need a config
12
-
13
- - **Identity that survives a move.** Without a config, the same project checked out at two
14
- paths is two workspaces, and two people whose clones sit in different directories do not
15
- see each other. `workspaceId` fixes that, and it is the usual reason this file exists.
3
+ Start without configuration. ACC identifies a workspace from its Git common directory, or
4
+ from the directory itself when Git is absent. Sessions can communicate only when they run
5
+ as the same operating-system user on the same machine and resolve that same local
6
+ workspace.
7
+
8
+ Create `acc.workspace.json` only for stable workspace identity, roots, or shared
9
+ context budget. It is optional project configuration that `acc config init` may write
10
+ at your request; runtime state remains in platform app data outside the repository. The
11
+ file never defines agents, messages, execution state, or delivery endpoints. Project map:
12
+ [README](index.md). Terms used below: [Glossary](GLOSSARY.md).
13
+
14
+ ## Decide whether you need a config
15
+
16
+ - **Identity that survives a local move.** Without a config, the same non-Git project at two
17
+ paths is two workspaces. `workspaceId` lets the same OS user move or reopen it locally.
18
+ Matching ids never connect different machines or OS users.
16
19
  - **More than one root.** A monorepo whose apps live in separate directories, or a
17
20
  workspace that spans sibling checkouts.
18
- - **Shared policy.** Claim mode and context budget, agreed once and committed, rather than
19
- each person's machine deciding.
20
- - **Stated expectations.** `requiredAdapters` records which harnesses this project expects
21
- to be installed, so `acc doctor` can say what is missing rather than leaving a session
22
- silently uncoordinated.
21
+ - **Shared context budget.** Set the ceiling for supported injected turn context once for
22
+ the workspace.
23
23
 
24
- ### The file
24
+ ### Define the file
25
25
 
26
26
  `acc.workspace.json`, at the root of the workspace. One name, so discovery is a lookup and
27
27
  not a search. It is found by walking up from the working directory, because sessions start
@@ -36,10 +36,8 @@ link can point anywhere, including at a file the repository does not control.
36
36
  "displayName": "Example",
37
37
  "roots": ["."],
38
38
  "policy": {
39
- "claimMode": "advisory",
40
39
  "contextBudgetBytes": 6000
41
- },
42
- "requiredAdapters": []
40
+ }
43
41
  }
44
42
  ```
45
43
 
@@ -49,11 +47,16 @@ link can point anywhere, including at a file the repository does not control.
49
47
  | `workspaceId` | Stable identity, portable id | required |
50
48
  | `displayName` | What peers see in a roster | the directory name |
51
49
  | `roots` | Directories in this workspace, relative to the config | `["."]` |
52
- | `policy.claimMode` | `advisory` or `guarded` | `advisory` |
50
+ | `policy.claimMode` | Validated compatibility metadata (`advisory` or `guarded`); does not select claim enforcement | `advisory` |
53
51
  | `policy.contextBudgetBytes` | Ceiling on injected turn context, 1–64000 | `6000` |
54
- | `requiredAdapters` | Harnesses this project expects | `[]` |
52
+ | `requiredAdapters` | Validated compatibility metadata; does not affect `acc doctor` diagnostics | `[]` |
55
53
  | `extensions` | Anything else, namespaced by whoever wrote it | `{}` |
56
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
+
57
60
  Roots are refused if they are absolute or escape the workspace. An absolute root is one
58
61
  machine's layout committed to a shared repository, and `packages/../../elsewhere` reaches
59
62
  outside the boundary the workspace is supposed to be. The check counts path segments, so an
@@ -64,7 +67,7 @@ like nothing at all to a parser that ignores what it does not know, and the resu
64
67
  team whose policy quietly stopped applying. `extensions` is the one declared door for
65
68
  anything ACC does not define.
66
69
 
67
- ### What it must never contain
70
+ ### Keep runtime state out
68
71
 
69
72
  Sessions, participants, messages, claims, receipts, intents, events, tokens, credentials.
70
73
  All of it is refused, by name, with the key that caused it, for two reasons. Runtime state
@@ -73,7 +76,7 @@ without carrying presence and locks along. And a config lives in a repository, w
73
76
  who can open a pull request can edit it — a file that could declare sessions would be a way
74
77
  to hand a peer state it should have had to earn.
75
78
 
76
- ### Writing one while sessions are running
79
+ ### Change identity safely
77
80
 
78
81
  The config carries the workspace identity, so writing one moves the project to a new
79
82
  workspace. Sessions already attached stay on the old one: they keep heartbeating it, they
@@ -90,24 +93,32 @@ pass --force to write anyway.
90
93
 
91
94
  Close them, or pass `--force` if you mean it — and restart them afterwards.
92
95
 
93
- ### Commands
96
+ ### Create or validate it
94
97
 
95
98
  <!-- test:illustration asks a person to confirm; there is nobody to ask in a test -->
96
99
  ```bash
97
100
  acc config init # preview, then write after you agree
98
- acc config validate # read-only; reports what applies
101
+ acc config validate # read-only; checks acc.workspace.json in the selected directory
99
102
  ```
100
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
+
101
110
  `init` shows the exact file it would write and waits. In a non-interactive run — a pipe, a
102
111
  CI job, an agent — there is nobody to ask, so it refuses unless you pass `--yes`. It never
103
112
  overwrites an existing config: a committed identity is shared by everyone on the project,
104
113
  and replacing it on a mistyped command would split one workspace into two.
105
114
 
106
- `validate` only reads. A command someone runs to find out what is wrong must not change the
107
- thing it is inspecting. With no config present it reports the defaults rather than failing,
108
- 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.
109
120
 
110
- ## Delivery policy is not project policy
121
+ ## Keep delivery consent user-owned
111
122
 
112
123
  Live delivery may start a model turn and spend that recipient's tokens, so it is configured
113
124
  through the recipient's user-owned client installation:
@@ -118,12 +129,22 @@ acc install --adapter codex --delivery off
118
129
 
119
130
  The allowed values are `off`, `actionable`, and `all`; the default is `off`. This setting
120
131
  does not belong in `acc.workspace.json`, where a pull request could opt someone else into
121
- spending a turn. It also cannot create a capability: when the detected exact client
122
- version lacks passing live-push evidence, installation keeps the effective policy `off`
123
- and reports durable next-turn or inbox fallback. No shipped adapter currently qualifies
124
- for native live push.
125
-
126
- ## Environment
132
+ spending a turn. It also cannot create a capability. Exact-version evidence governs
133
+ ordinary hook features; Claude Code live delivery separately requires macOS arm64, version
134
+ 2.1.258 or newer, and a current feature probe before installation applies the requested
135
+ policy. If those install-time checks fail, effective policy remains `off` and the installer
136
+ reports next-turn or inbox fallback. Each later session must also pass its own
137
+ generation-bound handshake. A failed session handshake clears or refuses that binding and
138
+ reports degraded reachability; it does not rewrite the installed consent.
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
+
147
+ ## Override local paths and identity
127
148
 
128
149
  Nothing in `acc.workspace.json` says where state is stored, and nothing there can — that is
129
150
  the job of these variables, or the platform's own locations, and ACC refuses any of them
@@ -131,17 +152,17 @@ that resolves inside a workspace.
131
152
 
132
153
  | Variable | Purpose |
133
154
  |---|---|
134
- | `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) |
135
- | `ACC_CONFIG_HOME` | The same override, for configuration state the platform would otherwise keep alongside `ACC_DATA_HOME` |
136
- | `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 |
137
158
  | `ACC_PARTICIPANT` | Which participant a session belongs to, when the client does not say |
138
159
  | `ACC_WORKSPACE_ROOT` | The project to work in, instead of discovering one from the working directory. Absolute, or it is refused |
139
- | `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) |
140
161
  | `ACC_MCP_PARTICIPANT` | Who `acc-mcp` takes part as. `mcp` by default |
141
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 |
142
- | `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 |
143
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 |
144
- | `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` |
145
- | `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 |
146
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 |
147
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 |
@@ -1,8 +1,10 @@
1
1
  # Design decisions
2
2
 
3
- Why ACC is shaped the way it is, and what is deliberately still open.
3
+ Use this log to understand constraints that should survive refactors and proposals that
4
+ remain open. Runtime contracts live in [Protocol](PROTOCOL.md); this page records why the
5
+ boundaries exist.
4
6
 
5
- ## Settled
7
+ ## Preserve these decisions
6
8
 
7
9
  | Decision | Reason |
8
10
  |---|---|
@@ -16,26 +18,31 @@ Why ACC is shaped the way it is, and what is deliberately still open.
16
18
  | Runtime state outside the repository | A checkout can be deleted, cloned, or synced; presence and locks must not travel with it. |
17
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. |
18
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. |
19
24
  | No heartbeat helper in v1 | An idle session is honestly reported `stale`. A sidecar process to fake liveness is worse than the truth. |
20
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. |
21
- | 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. |
22
27
  | One publishable package | One version and one release rather than twelve coordinated ones. |
23
28
  | MIT | Widest reuse, least friction. |
24
- | 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. |
25
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). |
26
31
 
27
- ## Rejected, and why
32
+ ## Avoid these rejected designs
28
33
 
29
34
  | Rejected | Why |
30
35
  |---|---|
31
36
  | A file in each repo that agents poll | No guard, no identity, no atomicity — and it ends up committed. |
32
37
  | A permanent global lead session | Turns peers into workers and makes one crash fatal. |
33
- | 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. |
34
39
  | Requiring Git, tmux, PostgreSQL, or a service | Every requirement is a reason the tool is not installed. |
35
40
  | Collecting or sharing raw transcripts | Raw transcripts are never collected or shared. Explicit peer messages are bounded records the sender chose to address. |
36
41
  | Reporting queued messages as delivered | A delivery state that overstates itself is worse than no state. |
37
42
  | Guessing file paths out of shell commands | It would block work at random and still miss real writes. See [CAPABILITIES.md](CAPABILITIES.md). |
38
43
 
44
+ ### Reversals backed by failures
45
+
39
46
  **Reversed in 0.1.11: removing the client's hook-trust record on uninstall.**
40
47
  0.1.9 took Codex's `[hooks.state."<plugin>:…"]` tables out on uninstall,
41
48
  reasoning they named a plugin that was gone. The check behind that reasoning
@@ -43,16 +50,18 @@ perturbed the record instead of removing it — a hook whose recorded hash no
43
50
  longer matched was still observed running, so absence was never actually
44
51
  tested.
45
52
 
46
- Absence is the whole mechanism. With no record, the client runs no hook at
47
- all, prints `hook: SessionStart Completed` while executing nothing, and ACC's
48
- write guard goes silently off — while `acc doctor` and `codex plugin list`
49
- 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
50
57
  guarded claim; writing the exact same hashes back (captured before deletion,
51
58
  from an ACC three releases older) revived the guard immediately.
52
59
 
53
- That is why removal is never ACC's to do: the record is granted once by a
54
- person, survives ACC upgrades, and nothing ACC writes can restore it.
55
- 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.
56
65
 
57
66
  **The generalisation, since this cost a release:** to learn whether state is
58
67
  load-bearing, take it away. Changing it tests something else.
@@ -72,12 +81,12 @@ declared. Coverage is deliberately partial, and
72
81
  [CAPABILITIES.md](CAPABILITIES.md) says where it ends: an agent that knows
73
82
  where a guard stops behaves better than one that believes it absolute.
74
83
 
75
- ## Still open
84
+ ## Decide these later
76
85
 
77
86
  1. **Storage backend.** The hardened filesystem store ships first. A transactional backend
78
87
  can go behind the same interface later — but not merely to avoid a dependency.
79
88
  2. **Remote coordination.** v2, or a separate product.
80
- 3. **Process launching.** Possibly never; possibly an external integration.
89
+ 3. **AI client/session launching.** Possibly never; possibly an external integration.
81
90
  4. **Multi-root discovery rules** beyond the current `roots` list.
82
91
  5. **Default claim lease length** for hook-only adapters. A hook-only session cannot sustain
83
92
  a short renewal cadence, so lease policy must not assume one.
@@ -1,145 +1,151 @@
1
1
  # Getting started
2
2
 
3
- ACC begins with two AI sessions that you open yourself. It does not create a team or choose
4
- which model does what. The first useful run is a question that travels from one session to
5
- the other, receives a reply in the same thread, and is acknowledged without you copying
6
- the message between windows.
7
-
8
- ```mermaid
9
- sequenceDiagram
10
- participant A as First session
11
- participant ACC
12
- participant B as Second session
13
- A->>ACC: durable question
14
- ACC-->>B: next-turn offer or inbox fallback
15
- B->>ACC: reply in the same thread
16
- ACC-->>A: next-turn offer or inbox fallback
17
- ```
18
-
19
- ## 1. Install once per machine
20
-
21
- Install the package, then let ACC wire only the clients it detects:
22
-
23
- <!-- test:command -->
24
- ```bash
25
- acc install
26
- ```
27
-
28
- Restart those clients because hooks load at startup. Codex also asks you to trust the
29
- plugin. `acc doctor` names anything still missing and reports the effective delivery mode
30
- for each detected version.
31
-
32
- ## 2. Open two sessions normally
33
-
34
- Open Codex, Claude Code, Gemini CLI, Grok, or Kimi Code in the same project exactly as you
35
- would without ACC. A generic MCP client can participate by running `acc-mcp`. ACC never
36
- launches or owns either session.
37
-
38
- In either window:
39
-
40
- ```bash
41
- acc status
42
- ```
43
-
44
- The roster gives the participant ids used by `--to`. If it shows only one session, fix the
45
- second client's installation or workspace path before testing communication.
46
-
47
- ## 3. Publish intent, then claim narrowly
48
-
49
- Intent is cheap awareness and grants no protection:
50
-
51
- ```bash
52
- acc work --summary "updating receipt rendering" --mode edit \
53
- --hint 'file:packages/cli/src/main.mjs'
54
- ```
55
-
56
- Reserve only what the session is about to change:
57
-
58
- ```bash
59
- acc claim --resource 'file:packages/cli/src/main.mjs' \
60
- --reason "updating receipt rendering"
61
- ```
3
+ Install ACC, open the AI sessions you already use, and give them related work. Supported
4
+ integrations make peers visible and teach each agent how to communicate. You do not need to
5
+ carry messages between windows or add coordination instructions to your task prompts.
62
6
 
63
- Exit code `5` means an overlapping live claim exists. Ask its owner or narrow the edit;
64
- do not silently work around it. A claim can be `guarded` only where the client exposes a
65
- certified write guard. Otherwise it remains useful but `advisory`.
66
-
67
- ## 4. Send a real question
68
-
69
- From the first session, address a participant listed by `acc status`:
70
-
71
- ```bash
72
- acc message --to models --type question --subject "receipt wording" \
73
- --body "Should the UI say offered or delivered after the transport accepts bytes?" \
74
- --client-message-id client_receipt_wording_1
75
- ```
7
+ Active hooks supply each agent's own CLI arguments in coordination context; the installed
8
+ skill tells the agent to use them. This path was observed in Claude Code 2.1.263 and
9
+ Codex 0.153.4. Hooks must be enabled and trusted by the client. Without hook context, owner
10
+ operations require an explicit pair or session-bound ACC MCP tools. See [CLI ownership](CLI.md#coordinate-from-a-session).
76
11
 
77
- The output starts with `recorded message_x`. That is the durable guarantee. Any following
78
- delivery diagnostic is acceleration, not the source of truth. Reuse the explicit
79
- `client_receipt_wording_1` key when retrying after an uncertain result; it returns the same
80
- logical message instead of creating a duplicate.
12
+ ## 1. Install once on this machine
81
13
 
82
- ## 5. Read and reply from the second session
14
+ ACC requires macOS or Linux and Node.js 24 or newer.
83
15
 
84
- A certified hook may offer the question on the recipient's next normal turn. Grok, MCP,
85
- unknown versions, and any missed projection use the same durable recovery path:
16
+ Already using 0.3.1? Follow the [upgrade guide](UPGRADING.md) before mixing versions.
86
17
 
87
18
  ```bash
88
- acc inbox
89
- acc inbox --message message_x
90
- acc reply --message message_x \
91
- --body "Use offered. It proves transport acceptance, not that the model read it."
19
+ npm install -g agents-can-communicate
92
20
  ```
93
21
 
94
- `reply` creates an `answer` in the original thread and acknowledges the recipient's
95
- receipt for the question atomically. It does not mark the requested work complete. The
96
- first session receives the answer through its own next-turn or inbox path; you do not copy
97
- the peer body between sessions.
98
-
99
- Use `acc ack --message message_x` only when the message asks for acknowledgement and no
100
- written reply is needed.
101
-
102
- ## 6. Hand off while context still exists
103
-
22
+ <!-- test:command -->
104
23
  ```bash
105
- acc finish --goal "update receipt rendering" --status partial \
106
- --completed "CLI wording changed" --remaining "MCP docs" \
107
- --blocker "waiting for fixture"
24
+ acc install
108
25
  ```
109
26
 
110
- `finish` records a structured handoff, releases that ACC session's claims, and ends its ACC
111
- presence. It does not close the external client.
112
-
113
- ## Delivery expectations
114
-
115
- Durable inbox delivery works for every participant. Certified next-turn delivery currently
116
- exists only for exact captured versions of Codex, Claude Code, Gemini CLI, and Kimi Code.
117
- Grok and generic MCP poll. No current adapter has certified native live push. Although
118
- `acc install --delivery off|actionable|all` defines recipient policy, unsupported or
119
- uncertified clients keep effective policy `off` and report their fallback beside the
120
- adapter result.
121
-
122
- ## Optional workspace configuration
123
-
124
- No file is required. Use one only for a stable shared workspace id, multiple roots, or
125
- project policy:
27
+ Installation also enables automatic updates. ACC downloads releases in the background and
28
+ refreshes its runtime and skills when active clients have left. Use `acc update` for an
29
+ immediate update, or `acc update --auto off` to disable background updates. See
30
+ [update controls](UPGRADING.md#automatic-updates-after-installation).
31
+
32
+ The installer connects only the supported clients it finds. Open a new terminal and
33
+ restart any running clients so they load their integrations. Follow the activation steps
34
+ printed by the installer. In Codex, use `/plugins` to check ACC is enabled, then `/hooks`
35
+ to review each ACC hook and enable/trust its current definition if needed. Restart the
36
+ session after that review; changed hook definitions may require trust again.
37
+
38
+ If the installer preserved your existing Codex sandbox settings, verify the named ACC
39
+ state directory is in `sandbox_workspace_write.writable_roots` in the config it identifies.
40
+ ACC keeps those user settings unchanged. Installed files alone do not establish that hooks
41
+ are active; `acc doctor` leaves current readiness unverified and directs you to Codex.
42
+
43
+ If you opt into Claude Code's experimental idle delivery, Claude also shows its own
44
+ development-channel warning at every startup. The feature is off by default, can spend
45
+ model tokens, and currently requires Apple Silicon macOS, zsh, and Claude Code 2.1.258 or
46
+ newer. You do not need it for durable messages or supported next-turn delivery.
47
+
48
+ ## 2. Open two sessions and give them ordinary tasks
49
+
50
+ Start each client normally in the same project. ACC does not launch, supervise, or assign
51
+ work to either session. For example:
52
+
53
+ | Session | Your prompt |
54
+ |---|---|
55
+ | Codex | Add an account-registration endpoint. |
56
+ | Claude Code | Build the account-registration screen. |
57
+
58
+ Those are complete prompts. The integration tells each agent that peers are present and
59
+ provides the coordination instructions. If an agent notices that the screen depends on the
60
+ endpoint contract, it can identify the peer, ask for the request and response shape, and
61
+ continue with the answer.
62
+
63
+ The sessions may use different supported clients or two instances of the same client.
64
+ Same-client addresses can be ambiguous when several instances are live; agents use the
65
+ exact participant ids in the roster when needed. See [Concepts](CONCEPTS.md) for participant
66
+ and session identity.
67
+
68
+ A second repeatable pattern is review and handoff. Ask the implementing agent to request
69
+ review of an identified revision (a commit when Git is available, or named files and
70
+ version otherwise) and wait for the verdict. Ask the reviewer to return blocking defects
71
+ or approval. If either session must stop, it can leave a durable handoff naming completed
72
+ work, remaining work, and blockers. A later session can recover it from history. The
73
+ underlying commands are [`acc request`](CLI.md#messages-and-requests), exact
74
+ [`acc inbox --message`](CLI.md#inbox-reply-and-acknowledgement),
75
+ [`acc reply`](CLI.md#inbox-reply-and-acknowledgement), and
76
+ [`acc finish`](CLI.md#handoff).
77
+
78
+ ## 3. Watch for useful coordination
79
+
80
+ Look for an agent discovering a peer, publishing the files it expects to change, noticing a
81
+ shared dependency, asking a focused question, or answering one in the same thread. These
82
+ events appear in the agent's normal activity; the exact presentation depends on the client.
83
+
84
+ ACC provides awareness and communication tools. It cannot guarantee that a model will
85
+ notice every dependency or coordinate on every task. Each agent decides whether a peer is
86
+ relevant under its own instructions, context, and permissions.
87
+
88
+ The commands behind that activity belong to the agents' installed skill. They can publish
89
+ intent, make an advisory or guarded claim, send and reply to messages, acknowledge a thread,
90
+ and leave a handoff. If you want to inspect that interface, use the [CLI reference](CLI.md)
91
+ or follow the interaction through [How ACC works](HOW_IT_WORKS.md).
92
+
93
+ ## 4. Know when messages arrive
94
+
95
+ Every message is recorded before ACC attempts faster delivery. Every participant has a
96
+ durable inbox, which is the universal recovery path.
97
+
98
+ On exact client versions and platforms with captured support, Codex, Claude Code, Gemini
99
+ CLI, and Kimi Code can receive a message at the next normal turn. That does not wake an idle
100
+ session. Grok, generic MCP clients, unknown versions, and unsupported platforms use the
101
+ durable inbox instead.
102
+
103
+ Codex LocalDaemon and Claude Code Channel offer optional native delivery on
104
+ Apple Silicon macOS. They are experimental, can spend tokens, and queue messages
105
+ until a running turn finishes. Codex requires 0.152.1 or newer, an already-running
106
+ LocalDaemon, recorded opt-in and a verified session; start it with your normal
107
+ command. A loaded daemon thread can receive messages after its terminal exits.
108
+ [Capabilities](CAPABILITIES.md) explains policy, versions and fallback.
109
+
110
+ Delivery evidence is deliberately narrow: `queued -> offered -> retrieved -> acknowledged`.
111
+ An offer is not proof that the model read anything, retrieval is not proof of attention, and
112
+ a reply settles the communication obligation rather than proving that work is complete.
113
+
114
+ ## 5. Keep the workspace boundary clear
115
+
116
+ ACC is local to the same machine and operating-system user. Git worktrees of one repository
117
+ share an ACC workspace while keeping their separate checkout facts. Git is optional, but
118
+ two unrelated plain folders do not share a workspace merely because people consider them
119
+ the same project.
120
+
121
+ Messages and runtime state live in platform app data outside the repository. ACC never
122
+ collects or shares raw transcripts. An optional `acc.workspace.json` can provide a stable
123
+ workspace id, multiple roots, or project policy; it is user-requested configuration, not
124
+ runtime state. See [Configuration](CONFIGURATION.md) and the
125
+ [non-Git example](https://github.com/automatis-tools/agents-can-communicate/blob/main/examples/non-git-research.md).
126
+
127
+ ## Diagnose or remove it
128
+
129
+ If a peer does not appear or delivery differs from what you expected, run this from the
130
+ project directory:
126
131
 
127
132
  <!-- test:command -->
128
133
  ```bash
129
- acc config validate
134
+ acc doctor
130
135
  ```
131
136
 
132
- See [Configuration](CONFIGURATION.md) before writing it. Runtime messages and sessions
133
- never belong in that committed file.
137
+ The report names detected clients, installed integrations, exact capability downgrades,
138
+ and the next action. Continue with [Troubleshooting](TROUBLESHOOTING.md).
134
139
 
135
- ## Uninstall
140
+ To remove ACC's integrations:
136
141
 
142
+ <!-- test:command -->
137
143
  ```bash
138
144
  acc uninstall
139
145
  ```
140
146
 
141
- ACC removes only installation bytes that still match what it wrote. User-modified client
142
- settings remain in place.
147
+ Uninstall removes only bytes ACC wrote that still match its install record. User edits are
148
+ reported and preserved.
143
149
 
144
150
  Next: [Why ACC](WHY_ACC.md) · [Capabilities](CAPABILITIES.md) · [CLI](CLI.md) ·
145
151
  [Troubleshooting](TROUBLESHOOTING.md)
package/docs/GLOSSARY.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # Glossary
2
2
 
3
- - **Workspace** — one local coordination room; all worktrees of a Git repository share it.
4
- - **Participant** — the stable address that sends and receives messages.
5
- - **Session** — one independently opened client conversation participating in a workspace.
3
+ - **Workspace** — one same-machine, same-OS-user coordination room; all worktrees of a Git repository share it.
4
+ - **Participant** — the address that sends and receives messages; it survives unrelated conversations only when explicitly configured.
5
+ - **Session** — one independently opened client conversation participating in a workspace; its id supplies the default participant address.
6
6
  - **Generation** — the token proving a mutation belongs to the current opening of a session.
7
7
  - **Presence** — `online`, `stale`, or `offline`, based only on observed heartbeat and pid facts.
8
8
  - **Intent** — a session's current summary and resource hints; awareness, not permission.
9
9
  - **Claim** — a leased reservation for a canonical resource such as `file:src/**`.
10
- - **Advisory / guarded** — a claim peers must respect versus one ACC can stop on measured client write paths; neither stops unrelated local processes.
10
+ - **Advisory / guarded** — CLI claims default to advisory. Explicit guarded enforcement also requires certified guards from every live participant; neither mode stops unrelated local processes.
11
11
  - **Message** — an attributed untrusted `note`, `question`, `request`, `answer`, `decision`, or `handoff`.
12
12
  - **Thread** — a root message plus linked answers sharing one immutable `threadId`.
13
13
  - **Obligation** — `none`, `reply`, or `acknowledge`; what communication the recipient owes.
@@ -16,11 +16,17 @@
16
16
  - **Retrieved** — the participant received the body; not proof of model attention.
17
17
  - **Acknowledged** — that participant explicitly acknowledged or replied; a reply is not proof requested work finished.
18
18
  - **Next-turn delivery** — certified projection at the client's next normal turn; it never interrupts an active turn.
19
- - **Live push** — optional delivery to an already-running session through an official certified client API. No shipped adapter currently qualifies.
19
+ - **Live push** — optional delivery through Claude Code Channel or Codex LocalDaemon to an already-running session, behind recipient opt-in. Both wait for an active turn to finish; [Capabilities](CAPABILITIES.md) gives the measured eligibility and limits.
20
20
  - **Recipient policy** — `off`, `actionable`, or `all`; opt-in permission to spend a turn, not a capability.
21
21
  - **Delivery binding** — ephemeral, generation-bound reachability data owned by an adapter.
22
22
  - **Fallback** — durable inbox or exact-certified next-turn recovery when live delivery is unavailable.
23
23
  - **Managed / manual lifecycle** — whether hooks report ACC presence automatically; never ownership of the external client process.
24
- - **MCP participation** — polling access to durable communication without native lifecycle, context, guards, or push.
24
+ - **MCP participation** — manual incoming polling without native lifecycle, context, guards, or receive wake; outgoing messages can use an eligible recipient's opted-in native route.
25
+ - **Bounded discovery** — inbox/history summary pages with limits and cursors; bodies require selection.
26
+ - **Exact recovery** — read one addressed inbox body, or one history record; history reads do not advance receipts.
27
+ - **Decision change** — an immutable decision explicitly supersedes or withdraws prior decisions; old records remain.
28
+ - **Current decision** — a terminal recorded position or withdrawal, not proven truth; competing branches stay visible.
29
+ - **Managed runtime** — ACC's staged installation generations and automatic-update controls, distinct from managed/manual session presence.
30
+ - **Activation hold** — an ACC process lease or native binding that postpones runtime refresh; observed lifecycle cleanup can release a native hold without stopping a vendor daemon.
25
31
 
26
32
  See [Concepts](CONCEPTS.md) for relationships and [Protocol](PROTOCOL.md) for exact rules.