agents-can-communicate 0.1.18 → 0.2.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 (134) hide show
  1. package/README.md +78 -70
  2. package/SECURITY.md +31 -0
  3. package/bin/acc-hook.mjs +94 -12
  4. package/bin/acc-mcp.mjs +6 -2
  5. package/bin/acc.mjs +6 -1
  6. package/docs/ADAPTER_AUTHORING.md +172 -0
  7. package/docs/ARCHITECTURE.md +131 -0
  8. package/docs/CAPABILITIES.md +102 -214
  9. package/docs/CLI.md +157 -0
  10. package/docs/CONCEPTS.md +134 -0
  11. package/docs/CONFIGURATION.md +143 -0
  12. package/docs/DESIGN_DECISIONS.md +89 -0
  13. package/docs/GETTING_STARTED.md +145 -0
  14. package/docs/GLOSSARY.md +26 -0
  15. package/docs/MCP.md +94 -0
  16. package/docs/PROTOCOL.md +200 -0
  17. package/docs/RELEASING.md +109 -0
  18. package/docs/SECURITY_MODEL.md +131 -0
  19. package/docs/TROUBLESHOOTING.md +102 -0
  20. package/docs/WHY_ACC.md +61 -0
  21. package/docs/index.md +42 -0
  22. package/node_modules/@agents-can-communicate/adapter-claude-code/certification.json +78 -0
  23. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/PreToolUse-Edit.json +19 -0
  24. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/PreToolUse.json +17 -0
  25. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/SessionEnd.json +8 -0
  26. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/SessionStart.json +7 -0
  27. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/UserPromptSubmit.json +9 -0
  28. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/certification-provenance.json +77 -0
  29. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/delivery/claude-code-2.1.252.json +19 -0
  30. package/node_modules/@agents-can-communicate/adapter-claude-code/package.json +9 -1
  31. package/node_modules/@agents-can-communicate/adapter-claude-code/plugin/skills/acc/SKILL.md +20 -22
  32. package/node_modules/@agents-can-communicate/adapter-claude-code/src/adapter.mjs +12 -4
  33. package/node_modules/@agents-can-communicate/adapter-codex/certification.json +117 -0
  34. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/PreToolUse.json +14 -0
  35. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/SessionEnd.json +7 -0
  36. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/SessionStart.json +9 -0
  37. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/UserPromptSubmit.json +10 -0
  38. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/certification-provenance.json +66 -0
  39. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.0.json +19 -0
  40. package/node_modules/@agents-can-communicate/adapter-codex/package.json +8 -1
  41. package/node_modules/@agents-can-communicate/adapter-codex/plugin/.codex-plugin/plugin.json +1 -1
  42. package/node_modules/@agents-can-communicate/adapter-codex/plugin/skills/acc/SKILL.md +20 -22
  43. package/node_modules/@agents-can-communicate/adapter-codex/src/adapter.mjs +18 -11
  44. package/node_modules/@agents-can-communicate/adapter-gemini-cli/certification.json +52 -0
  45. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/gemini-extension.json +1 -1
  46. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/skills/acc/SKILL.md +20 -22
  47. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/BeforeAgent.json +8 -0
  48. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/BeforeTool-shell.json +12 -0
  49. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/BeforeTool.json +12 -0
  50. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/SessionEnd.json +8 -0
  51. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/SessionStart.json +8 -0
  52. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/certification-provenance.json +66 -0
  53. package/node_modules/@agents-can-communicate/adapter-gemini-cli/package.json +8 -1
  54. package/node_modules/@agents-can-communicate/adapter-gemini-cli/src/adapter.mjs +7 -3
  55. package/node_modules/@agents-can-communicate/adapter-gemini-cli/src/install.mjs +4 -2
  56. package/node_modules/@agents-can-communicate/adapter-grok/certification.json +3 -0
  57. package/node_modules/@agents-can-communicate/adapter-grok/package.json +2 -1
  58. package/node_modules/@agents-can-communicate/adapter-grok/plugin/skills/acc/SKILL.md +20 -22
  59. package/node_modules/@agents-can-communicate/adapter-grok/src/adapter.mjs +9 -9
  60. package/node_modules/@agents-can-communicate/adapter-kimi/certification.json +52 -0
  61. package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/PreToolUse-Bash.json +12 -0
  62. package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/PreToolUse-Write.json +12 -0
  63. package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/SessionHeartbeat.json +7 -0
  64. package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/SessionStart.json +9 -0
  65. package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/UserPromptSubmit.json +8 -0
  66. package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/certification-provenance.json +66 -0
  67. package/node_modules/@agents-can-communicate/adapter-kimi/package.json +8 -1
  68. package/node_modules/@agents-can-communicate/adapter-kimi/plugin/skills/acc/SKILL.md +20 -22
  69. package/node_modules/@agents-can-communicate/adapter-kimi/src/adapter.mjs +7 -3
  70. package/node_modules/@agents-can-communicate/adapter-sdk/package.json +1 -1
  71. package/node_modules/@agents-can-communicate/adapter-sdk/src/capabilities.mjs +34 -18
  72. package/node_modules/@agents-can-communicate/adapter-sdk/src/certification.mjs +158 -0
  73. package/node_modules/@agents-can-communicate/adapter-sdk/src/context-projector.mjs +36 -17
  74. package/node_modules/@agents-can-communicate/adapter-sdk/src/hook-shim.mjs +7 -1
  75. package/node_modules/@agents-can-communicate/adapter-sdk/src/index.mjs +1 -0
  76. package/node_modules/@agents-can-communicate/adapter-sdk/src/session-binding.mjs +13 -4
  77. package/node_modules/@agents-can-communicate/cli/package.json +1 -1
  78. package/node_modules/@agents-can-communicate/cli/src/args.mjs +11 -30
  79. package/node_modules/@agents-can-communicate/cli/src/doctor-command.mjs +3 -0
  80. package/node_modules/@agents-can-communicate/cli/src/help.mjs +2 -5
  81. package/node_modules/@agents-can-communicate/cli/src/install-command.mjs +9 -2
  82. package/node_modules/@agents-can-communicate/cli/src/main.mjs +100 -121
  83. package/node_modules/@agents-can-communicate/core/package.json +1 -1
  84. package/node_modules/@agents-can-communicate/core/src/attention.mjs +106 -0
  85. package/node_modules/@agents-can-communicate/core/src/conversations.mjs +276 -0
  86. package/node_modules/@agents-can-communicate/core/src/delivery-bindings.mjs +81 -0
  87. package/node_modules/@agents-can-communicate/core/src/finish-retries.mjs +97 -0
  88. package/node_modules/@agents-can-communicate/core/src/inbox.mjs +91 -107
  89. package/node_modules/@agents-can-communicate/core/src/index.mjs +3 -3
  90. package/node_modules/@agents-can-communicate/core/src/intents.mjs +0 -1
  91. package/node_modules/@agents-can-communicate/core/src/ports.mjs +2 -1
  92. package/node_modules/@agents-can-communicate/core/src/receipts.mjs +109 -0
  93. package/node_modules/@agents-can-communicate/core/src/service.mjs +11 -10
  94. package/node_modules/@agents-can-communicate/core/src/sessions.mjs +22 -20
  95. package/node_modules/@agents-can-communicate/core/src/status.mjs +11 -9
  96. package/node_modules/@agents-can-communicate/core/src/sync.mjs +3 -294
  97. package/node_modules/@agents-can-communicate/delivery-router/package.json +12 -0
  98. package/node_modules/@agents-can-communicate/delivery-router/src/index.mjs +1 -0
  99. package/node_modules/@agents-can-communicate/delivery-router/src/router.mjs +117 -0
  100. package/node_modules/@agents-can-communicate/hook-runner/package.json +1 -1
  101. package/node_modules/@agents-can-communicate/hook-runner/src/client-version.mjs +20 -0
  102. package/node_modules/@agents-can-communicate/hook-runner/src/runner.mjs +115 -63
  103. package/node_modules/@agents-can-communicate/installer/package.json +1 -1
  104. package/node_modules/@agents-can-communicate/installer/src/apply.mjs +23 -7
  105. package/node_modules/@agents-can-communicate/installer/src/detect.mjs +20 -5
  106. package/node_modules/@agents-can-communicate/installer/src/index.mjs +3 -2
  107. package/node_modules/@agents-can-communicate/installer/src/ownership.mjs +108 -12
  108. package/node_modules/@agents-can-communicate/installer/src/plan.mjs +19 -2
  109. package/node_modules/@agents-can-communicate/mcp-server/package.json +1 -1
  110. package/node_modules/@agents-can-communicate/mcp-server/src/input-validator.mjs +79 -0
  111. package/node_modules/@agents-can-communicate/mcp-server/src/resources.mjs +23 -28
  112. package/node_modules/@agents-can-communicate/mcp-server/src/server.mjs +102 -72
  113. package/node_modules/@agents-can-communicate/mcp-server/src/tools.mjs +54 -97
  114. package/node_modules/@agents-can-communicate/protocol/package.json +1 -1
  115. package/node_modules/@agents-can-communicate/protocol/src/config.mjs +1 -1
  116. package/node_modules/@agents-can-communicate/protocol/src/conversations.mjs +64 -0
  117. package/node_modules/@agents-can-communicate/protocol/src/index.mjs +4 -1
  118. package/node_modules/@agents-can-communicate/protocol/src/schema.mjs +49 -90
  119. package/node_modules/@agents-can-communicate/protocol/src/states.mjs +13 -40
  120. package/node_modules/@agents-can-communicate/storage-filesystem/package.json +1 -1
  121. package/node_modules/@agents-can-communicate/storage-filesystem/src/active-journal.mjs +230 -0
  122. package/node_modules/@agents-can-communicate/storage-filesystem/src/atomic-json.mjs +77 -28
  123. package/node_modules/@agents-can-communicate/storage-filesystem/src/identity.mjs +1 -1
  124. package/node_modules/@agents-can-communicate/storage-filesystem/src/journal.mjs +83 -35
  125. package/node_modules/@agents-can-communicate/storage-filesystem/src/retention.mjs +112 -0
  126. package/node_modules/@agents-can-communicate/storage-filesystem/src/safe-file.mjs +18 -8
  127. package/node_modules/@agents-can-communicate/storage-filesystem/src/store.mjs +68 -26
  128. package/node_modules/@agents-can-communicate/storage-filesystem/src/writer-mutex.mjs +113 -35
  129. package/package.json +19 -1
  130. package/node_modules/@agents-can-communicate/core/src/communication.mjs +0 -334
  131. package/node_modules/@agents-can-communicate/core/src/message-signals.mjs +0 -41
  132. package/node_modules/@agents-can-communicate/core/src/notify.mjs +0 -95
  133. package/node_modules/@agents-can-communicate/core/src/tasks.mjs +0 -244
  134. package/node_modules/@agents-can-communicate/core/src/workstreams.mjs +0 -109
@@ -0,0 +1,200 @@
1
+ # Protocol
2
+
3
+ The protocol is the vendor-neutral contract shared by core, CLI, MCP, storage, and every
4
+ adapter. Version 0.2 uses store schema version `3` and deliberately rejects v0.1 state.
5
+ There is no compatibility reader, conversion, archive path, or automatic deletion.
6
+
7
+ ## Durable records
8
+
9
+ The store accepts only these durable kinds:
10
+
11
+ ```text
12
+ workspace · participant · session · intent · claim · message · receipt · event
13
+ ```
14
+
15
+ `deliveryBinding` is validated but ephemeral. It is tied to one open session generation
16
+ and never written inside a repository.
17
+
18
+ ## Identity
19
+
20
+ ```text
21
+ Workspace
22
+ └── Participant
23
+ └── Session generation
24
+ ```
25
+
26
+ - A workspace is one local coordination room.
27
+ - A participant is the stable recipient of a message.
28
+ - A session is one client conversation. Its unguessable generation token proves that a
29
+ later mutation still belongs to the current opening.
30
+
31
+ Sessions carry harness, checkout, branch, optional pid, enforcement, and lifecycle facts.
32
+ The `managed` lifecycle value means ACC hooks can report presence changes; it does not mean
33
+ ACC owns or controls the external client.
34
+
35
+ ## Intent and claims
36
+
37
+ Intent contains `summary`, `mode`, `resourceHints`, `state`, and `updatedAt`. It is
38
+ awareness only.
39
+
40
+ Claims contain the owner session and generation, canonical resource URI, shared or
41
+ exclusive mode, advisory or guarded enforcement, reason, and lease timestamps. Claim
42
+ acquisition and conflict detection are atomic. Presence becoming stale never releases a
43
+ claim; expiry or an explicit release does.
44
+
45
+ ## Message envelope
46
+
47
+ Every message contains:
48
+
49
+ ```text
50
+ messageId
51
+ threadId
52
+ clientMessageId
53
+ workspaceId
54
+ fromParticipantId
55
+ fromSessionId
56
+ toParticipantIds
57
+ kind
58
+ obligation
59
+ subject
60
+ body
61
+ inReplyTo
62
+ artifacts
63
+ handoff
64
+ sentAt
65
+ ```
66
+
67
+ `clientMessageId` is an idempotency key scoped to workspace plus sender participant. A
68
+ retry with the same logical content returns the original message. Reusing the key with
69
+ different content is a data error. CLI and MCP generate a key when omitted and return it
70
+ inside the message so an uncertain caller can retry explicitly.
71
+
72
+ An empty `toParticipantIds` creates a room record. At commit time, core resolves every
73
+ known peer participant with an open session and creates a receipt for each. Participants
74
+ that arrive later can inspect room history through a full sync but do not receive
75
+ retroactive receipts. Those already-present recipients get the normal inbox and certified
76
+ next-turn path; a successful next-turn write advances their room receipt to `offered`.
77
+ Room records are never eligible for native live push.
78
+
79
+ ## Kinds and obligations
80
+
81
+ | Kind | Valid obligation | Addressing |
82
+ |---|---|---|
83
+ | `note` | `none` | addressed or room |
84
+ | `question` | `reply` | addressed only |
85
+ | `request` | `reply` | addressed only |
86
+ | `answer` | `none` | addressed reply only |
87
+ | `decision` | `none`, or `acknowledge` | addressed or room; room must use `none` |
88
+ | `handoff` | `acknowledge`, or `none` | addressed must acknowledge; room must use `none` |
89
+
90
+ The generic `message` boundary accepts only `note`, `question`, `request`, and `decision`.
91
+ An `answer` must be made through `reply`, which supplies the thread link. A `handoff` must
92
+ be made through `finish`, which supplies the structured payload.
93
+
94
+ A request has no accepted, running, or done state. The reply resolves its communication
95
+ obligation; execution evidence belongs in the answer or handoff.
96
+
97
+ ## Threads
98
+
99
+ The root message uses its own id as the thread id:
100
+
101
+ ```text
102
+ threadId = messageId
103
+ inReplyTo = null
104
+ ```
105
+
106
+ An answer carries the same `threadId` and the original message id in `inReplyTo`. There is
107
+ no mutable thread record or hidden thread status.
108
+
109
+ ## Receipt lifecycle
110
+
111
+ Every resolved recipient gets an independent receipt:
112
+
113
+ ```text
114
+ queued -> offered -> retrieved -> acknowledged
115
+ ```
116
+
117
+ `recorded` is the send boundary's success result: the message is durable. It is not a
118
+ receipt state. `queued` is the distinct per-recipient fact created in the same transaction,
119
+ so one recorded room or multi-recipient message can have zero or several queued receipts.
120
+
121
+ - `queued` proves the durable message and receipt committed.
122
+ - `offered` proves bytes crossed ACC's transport boundary or the target client accepted a
123
+ certified native call.
124
+ - `retrieved` proves the participant explicitly received the body through inbox or an
125
+ equally strong certified adapter signal.
126
+ - `acknowledged` proves that participant acknowledged or replied.
127
+
128
+ Offered is not read. Retrieved is not model attention. Reply is not task completion.
129
+
130
+ Forward skips are allowed when the stronger observation implies the weaker ones. Repeating
131
+ a state is idempotent; moving backward is rejected. There is no `seen` state because ACC
132
+ cannot inspect model attention, and no terminal delivery `failed` state because the
133
+ durable path remains available.
134
+
135
+ ## Offer attempts
136
+
137
+ Delivery attempts are immutable events, not receipt states:
138
+
139
+ ```text
140
+ message.offer_succeeded
141
+ message.offer_failed
142
+ ```
143
+
144
+ Every attempt identifies `messageId`, `recipientParticipantId`, `targetSessionId`, and
145
+ `targetGeneration`, followed by the transport name, adapter, client version, and timestamp.
146
+ A failed attempt additionally carries a safe closed error code. Core validates the target
147
+ as that recipient's recorded session generation and derives event attribution from it; the
148
+ router cannot substitute the sender or omit the selected binding. Attempts never copy the
149
+ peer body into diagnostics.
150
+ Receipt `offered` is committed only after the transport accepts bytes. A failed attempt
151
+ leaves the receipt queued.
152
+
153
+ ## Inbox, reply, and acknowledgement
154
+
155
+ `inbox` returns unresolved messages owned by the calling participant and advances only
156
+ that participant's receipt to `retrieved`. An exact message id is the recovery path after
157
+ compaction or an over-budget projection.
158
+
159
+ `reply` verifies that ownership, records an `answer` in the original thread, and advances
160
+ the original receipt to `acknowledged` in one transaction. Only after that durable commit
161
+ may the answer be offered to the original author. A transport error cannot roll back it.
162
+
163
+ `ack` advances the caller's receipt without creating a reply. It exposes no state override;
164
+ callers cannot claim that a transport offered or a participant retrieved a message.
165
+
166
+ ## Handoff
167
+
168
+ `finish` creates a `handoff` with structured `status`, `completed`, `remaining`,
169
+ `blockers`, and `verification`, releases the sender session's claims, and ends its ACC
170
+ presence. An addressed handoff requires acknowledgement. A room handoff does not. Neither
171
+ form closes or otherwise controls the external AI client.
172
+
173
+ ## Delivery binding and recipient policy
174
+
175
+ A live-capable adapter may publish one ephemeral binding for its exact session generation:
176
+
177
+ ```text
178
+ sessionId · generation · adapterId · clientVersion · availableModes
179
+ livePolicy · opaqueEndpointRef · leaseUntil
180
+ ```
181
+
182
+ The recipient owns `livePolicy` because native push may start a model turn:
183
+
184
+ - `off`: inbox and normal next-turn paths only;
185
+ - `actionable`: questions, requests, and addressed handoffs may use live push;
186
+ - `all`: every addressed kind may use live push.
187
+
188
+ Default is `off`. Policy never creates a capability. The router still requires a current
189
+ reachable binding, one unambiguous recipient generation, a passing exact-version
190
+ certification, and adapter acceptance. The current Codex and Claude captures do not meet
191
+ those requirements; all shipped native live routes therefore fall back durably.
192
+
193
+ ## Attention and sync
194
+
195
+ Bounded sync returns events after a cursor plus explicit attention. Full sync is a
196
+ forensic workspace snapshot, not the normal way to recover one message. Attention is
197
+ limited to six explicit rules: `reply_required`, `acknowledgement_required`,
198
+ `recipient_unavailable`, `claim_conflict`, `claim_contended`, and `claim_expired`.
199
+
200
+ Next: [CLI](CLI.md) · [MCP](MCP.md) · [Architecture](ARCHITECTURE.md)
@@ -0,0 +1,109 @@
1
+ # Releasing
2
+
3
+ ```mermaid
4
+ graph LR
5
+ A[npm ci] --> B[npm run check] --> C[npm test] --> D[clean candidate commit] --> E[npm pack] --> F[verify-package] --> G{approved?}
6
+ G -->|yes| H[tag · publish · release]
7
+ G -->|no| I[stop]
8
+ ```
9
+
10
+ ## Build the candidate
11
+
12
+ ```bash
13
+ npm ci
14
+ npm run check
15
+ env npm_config_cache=/private/tmp/acc-npm-cache-v02 npm test
16
+ git status --short
17
+ git commit -m "release: prepare ACC v0.2.0"
18
+ candidate_dir="$(mktemp -d /private/tmp/acc-v0.2.XXXXXX)"
19
+ env npm_config_cache=/private/tmp/acc-npm-cache-v02 npm pack --pack-destination "$candidate_dir"
20
+ env npm_config_cache=/private/tmp/acc-npm-cache-v02 node scripts/verify-package.mjs \
21
+ "$candidate_dir/agents-can-communicate-0.2.0.tgz"
22
+ git diff --check
23
+ ```
24
+
25
+ `verify-package.mjs` is the gate that matters. It installs the tarball into a
26
+ clean directory with **no workspace anywhere** and then drives the product. The
27
+ acceptance suite additionally opens independent Claude/Codex hook sessions from
28
+ the installed artifact, completes both message directions, proves downgrade and
29
+ restart behavior, exercises the installed MCP binary, and removes client wiring twice.
30
+
31
+ Development cannot catch what this catches. Workspace symlinks are always
32
+ present there, so an unbundled package imports fine right up until somebody
33
+ else installs it.
34
+
35
+ ## What it refuses
36
+
37
+ | Refused | Why |
38
+ |---|---|
39
+ | `tests/`, `test/` | test suite |
40
+ | unreferenced `fixtures/` | material that is not exact redacted certification evidence |
41
+ | `scripts/spikes/`, `*.sock` | development probes and local endpoints |
42
+ | runtime, transcript, or secret directories | machine state and private material |
43
+ | `.github/`, `.githooks/`, `.agents/` | local configuration |
44
+ | `*.jsonl` | looks like a transcript |
45
+ | Workspaces missing from `node_modules/` | every internal import would fail |
46
+
47
+ ## Record the evidence
48
+
49
+ Put the tarball name, sha256, **the commit it was built from**, exact platform/client
50
+ facts, fallback result, and known limitations in `docs/release-evidence/v0.2.0.md` and
51
+ the current `CHANGELOG.md` release table. A release without them is a release nobody can
52
+ audit later. Test count is deliberately left out: nothing verifies it, so it only
53
+ decorates or, when it drifts, misleads.
54
+
55
+ The commit matters because every workspace travels inside the tarball, so any
56
+ change to shipped code changes the digest. A digest recorded alone goes stale
57
+ on the next merge and then reads as a false claim about the current tree
58
+ rather than a true one about an older commit. `verify-package.mjs` prints
59
+ both on one line for exactly this reason, and refuses to imply
60
+ reproducibility when the working tree is dirty:
61
+
62
+ ```text
63
+ PASS agents-can-communicate-0.0.0.tgz sha256 a5c8bb1d… built from 39d0dcf
64
+ ```
65
+
66
+ It went stale four times in a row anyway, each caught by hand and only
67
+ because someone happened to run the script. So `npm test` now checks it:
68
+ `tests/acceptance/recorded-candidate.test.mjs` fails when shipped code has
69
+ changed since the recorded commit, and names the files. A shallow clone that
70
+ does not have the commit reports that instead of failing — the check is of
71
+ the record, not of the checkout depth.
72
+
73
+ The candidate therefore uses two commits. Commit A contains every packed file and every
74
+ release gate. Pack and verify clean commit A, then commit B records its digest and evidence
75
+ only in files that are not packed. Never record a dirty-tree digest: changing a packed file
76
+ after commit A means making a new candidate commit and packing again.
77
+
78
+ Native real-client tests run only where the retained capture proved that native boundary.
79
+ For v0.2.0 neither Codex 0.152.0 nor Claude Code 2.1.252 did: the Codex control socket was
80
+ absent and Claude stopped at the development-channel warning. Record those exact failed
81
+ captures and run the packed inbox/next-turn fallback instead of promoting an unobserved
82
+ native path. Windows is an explicit unsupported-platform skip, not a passing capture.
83
+
84
+ A published version's record is history and is not rewritten; later changes
85
+ get a new `## Unreleased` entry at the top, checked the same way against the
86
+ current tree.
87
+
88
+ ## Then stop
89
+
90
+ Publishing, tagging, and cutting a GitHub release are **external mutations**.
91
+ They need explicit approval from the maintainer, every time.
92
+
93
+ With two-factor authentication set to `auth-and-writes` — which is what `npm
94
+ profile get` reports for this account — every publish needs a code, and npm
95
+ does not prompt for one:
96
+
97
+ ```bash
98
+ npm publish --otp=123456
99
+ ```
100
+
101
+ An npm *Automation* token, or a granular token with write access, publishes
102
+ without a code. A granular token scoped to selected packages cannot create a
103
+ package that does not exist yet, which is the case exactly once per package.
104
+ The `Release` workflow builds and verifies a candidate and uploads it as an
105
+ artifact; it does not publish.
106
+
107
+ ---
108
+
109
+ See also: [README](index.md) for navigation and [Glossary](GLOSSARY.md) for terms.
@@ -0,0 +1,131 @@
1
+ # Security model
2
+
3
+ ACC connects independently controlled sessions without merging their authority. A peer can
4
+ send useful context, a question, or a request; its text never becomes system policy or a
5
+ human instruction merely because ACC transported it.
6
+
7
+ The first release coordinates processes under one local OS user. Same-user access protects
8
+ local transport from the network; it does not make model output trustworthy.
9
+
10
+ ## Trust boundaries
11
+
12
+ 1. Human instructions and approved local policy.
13
+ 2. ACC protocol and core invariants.
14
+ 3. Adapter facts backed by exact real-client evidence.
15
+ 4. Peer messages and artifact references, always untrusted input.
16
+
17
+ ```mermaid
18
+ graph LR
19
+ P["peer session — untrusted text"] --> ACC["ACC runtime"]
20
+ ACC --> S[("state outside repositories")]
21
+ ACC --> C["recipient client — own permissions"]
22
+ H["human authority"] --> C
23
+ ```
24
+
25
+ ACC does not read raw transcripts, relay permission approvals, or start target clients. A
26
+ native delivery path may only offer an attributed peer envelope to an already-running,
27
+ user-owned session.
28
+
29
+ ## Peer-content boundary
30
+
31
+ Inbound messages are rendered as structured, attributed peer data. The frame includes the
32
+ sender, message id, kind, obligation, and an explicit untrusted marker. The renderer
33
+ escapes fences, nested strings, terminal control sequences, and human output. If a body
34
+ cannot fit the context budget, the projection keeps the id and directs the participant to
35
+ `acc inbox --message <id>` instead of cutting the frame in half.
36
+
37
+ A model may still choose to follow persuasive peer text. Attribution and the recipient's
38
+ own instruction hierarchy are the mitigation; ACC is not a model sandbox.
39
+
40
+ ## Identity and ownership
41
+
42
+ - Participant identity is the address; session identity is one current client opening.
43
+ - Mutating calls prove their owner with the session generation.
44
+ - A stale process cannot renew or release records owned by a newer generation.
45
+ - Inbox, reply, and acknowledgement validate the recipient's participant id.
46
+ - One participant cannot advance another participant's receipt.
47
+ - MCP identity derives from user-owned server launch configuration, never from untrusted
48
+ `initialize` or `clientInfo` fields.
49
+
50
+ The `managed` lifecycle label means hooks can report ACC presence transitions. It never
51
+ grants ACC process-control authority.
52
+
53
+ ## Durable and delivery integrity
54
+
55
+ Messages and queued receipts commit before delivery is attempted. Receipt words correspond
56
+ to observations:
57
+
58
+ - `offered` only after bytes cross ACC's boundary or a certified client accepts the call;
59
+ - `retrieved` only after the participant receives the body through inbox or equally strong
60
+ evidence;
61
+ - `acknowledged` only after that participant acknowledges or replies.
62
+
63
+ There is no model-attention claim and no public state override. Failed acceleration leaves
64
+ the message queued and records only a closed safe error code. Diagnostics and offer events
65
+ never copy the peer body.
66
+
67
+ A future live adapter must match exact passing evidence, one unexpired generation-bound
68
+ binding, and the recipient's opt-in policy. Opaque endpoint references remain inside the
69
+ adapter and outside repositories. Current Codex and Claude native captures failed, so no
70
+ live transport is enabled.
71
+
72
+ ## Claims
73
+
74
+ Claims are advisory unless every live participant exposes a certified guard for the
75
+ relevant mutation path. Even guarded claims do not stop unrelated processes, runtime-built
76
+ paths, or tool calls the client never presents to the hook. Force release requires explicit
77
+ authority and records actor and reason.
78
+
79
+ File resources are canonicalized and kept inside workspace roots. Misleading glob forms
80
+ are refused. Hooks fail open on timeout or coordination failure so ACC cannot stop a client
81
+ from operating merely because its own state is unavailable.
82
+
83
+ ## Filesystem and installation
84
+
85
+ - Runtime state, bindings, sockets, and install ownership records stay outside repositories.
86
+ - Managed paths are checked for containment and symlink escape.
87
+ - Store publication uses atomic no-replace behavior, journaling, and writer locks.
88
+ - Corrupt or incompatible store versions fail closed before mutation.
89
+ - Client installers preserve unrelated settings and record content hashes.
90
+ - Uninstall removes only bytes still matching what ACC wrote.
91
+ - Tokens, credentials, and environment contents are never copied into ACC or project config.
92
+
93
+ ## Data collected
94
+
95
+ ACC stores participant/session identity, presence, one-line intent, explicit claims,
96
+ explicit messages and structured handoffs, per-recipient receipts, artifact references,
97
+ and coordination events. It excludes complete prompts, assistant responses, raw
98
+ transcripts, secrets, environment variables, and unrelated files.
99
+
100
+ ## Threat scenarios
101
+
102
+ | Threat | Prevention and detection | Residual |
103
+ |---|---|---|
104
+ | Peer message impersonates system authority | Attributed untrusted frame; fence and terminal escaping; injection tests | A model can still make a poor judgment about untrusted data |
105
+ | Large body buries a claim conflict | Fixed attention priority and bounded whole-frame projection | Very small budgets omit lower-priority roster detail |
106
+ | Stale session mutates new ownership | Exact generation on mutations; conflict error on mismatch | A same-user attacker with runtime access is out of scope |
107
+ | Symlink or traversal escapes a managed root | Per-segment containment, no-follow reads, closed config schema | Host filesystem compromise is out of scope |
108
+ | Claim denial of service | Leases, visible owner, explicit authority release | Deliberate abuse by a trusted local peer is social |
109
+ | Installer removes user configuration | Content-hashed ownership and byte comparison | User must remove modified leftovers manually |
110
+ | False delivery claim | Record-first order, transport-owned `offered`, recipient-owned retrieval/ack, mutation tests | Crash after offer before commit can cause duplicate display |
111
+ | Native endpoint leaks | Ephemeral opaque reference, user-only local endpoint, status redaction | Same-user local processes are outside the trust boundary |
112
+ | MCP client impersonates another session | Identity fixed by launch env, closed tool schemas | A compromised launch config already controls that client |
113
+ | Corrupt or v0.1 store is reinterpreted | Schema version rejection and doctor diagnostics | The maintainer must reset incompatible local state deliberately |
114
+
115
+ ## Verification
116
+
117
+ The release gate executes attacks rather than trusting this page:
118
+
119
+ | Boundary | Covering tests |
120
+ |---|---|
121
+ | peer text and budget framing | `tests/security/peer-injection.test.mjs`, `packages/adapter-sdk/test/context-projector.test.mjs` |
122
+ | receipt ownership and truthful transitions | `packages/core/test/inbox-and-reply.test.mjs`, `receipt-offer-idempotency.test.mjs` |
123
+ | path, symlink, and config containment | `tests/security/storage-boundary.test.mjs`, `symlinked-workspace.test.mjs`, `claim-spelling.test.mjs` |
124
+ | installer ownership and restoration | `tests/security/installer.test.mjs`, `restore-every-client.test.mjs` |
125
+ | no hook-path network access | `tests/security/no-network-on-the-hook-path.test.mjs` |
126
+ | capability evidence and version downgrade | `packages/adapter-sdk/test/certification.test.mjs` |
127
+
128
+ An attacker who can rewrite the user's ACC data home or client configuration already has
129
+ the local rights ACC relies on. Report vulnerabilities through [SECURITY.md](../SECURITY.md).
130
+
131
+ Next: [Architecture](ARCHITECTURE.md) · [Capabilities](CAPABILITIES.md)
@@ -0,0 +1,102 @@
1
+ # Troubleshooting
2
+
3
+ Start with:
4
+
5
+ ```bash
6
+ acc doctor
7
+ ```
8
+
9
+ It reports detected clients, exact versions, installation ownership, capability downgrade,
10
+ and the next action. Restart a client after installation because hooks load at startup.
11
+
12
+ ## The second session does not appear
13
+
14
+ Run `acc status --json` in both windows and compare `workspaceId`. Common causes are an
15
+ already-running client that never loaded the hook, a generic MCP server launched without
16
+ `ACC_MCP_WORKSPACE`, or two plain directories that are not the same workspace. Codex also
17
+ requires plugin trust.
18
+
19
+ ACC does not launch a missing session. Open it normally after fixing the installation or
20
+ workspace path.
21
+
22
+ ## A message stays queued
23
+
24
+ Queued means the durable message is safe; it does not mean the recipient model saw it.
25
+ Have the recipient run:
26
+
27
+ ```bash
28
+ acc inbox
29
+ acc inbox --message message_x
30
+ ```
31
+
32
+ Certified next-turn delivery waits for that client's next normal prompt. Grok, generic MCP,
33
+ unknown client versions, and other platforms poll inbox. A reply acknowledges the original
34
+ automatically; `acc ack` is for acknowledgement-only messages.
35
+
36
+ ## I enabled live delivery but got fallback
37
+
38
+ `--delivery actionable|all` is recipient policy, not a capability switch. No current
39
+ adapter has passing native live-push certification:
40
+
41
+ - Codex 0.152.0: the existing app-server control socket was absent; ACC did not start one.
42
+ - Claude Code 2.1.252: the capture stopped at the development-channel warning before the
43
+ ACC child process started.
44
+
45
+ The installer therefore keeps effective policy off and reports exact-certified next-turn
46
+ or inbox fallback. This is expected, not a partially working live route.
47
+
48
+ ## Codex plugin is listed but inactive
49
+
50
+ Trust the plugin in Codex, then restart it. Until the client accepts that trust step, hooks
51
+ do not run. `acc doctor` reports the installed cache copy and missing activation separately.
52
+
53
+ ## Gemini does not guard a write
54
+
55
+ Default and `plan` modes expose no write tool to the model. `auto_edit` exposes edit tools;
56
+ shell availability depends on approval mode. Only Gemini CLI 0.37.0 on `darwin-arm64` has
57
+ package-shipped delivery certification; other versions still use inbox.
58
+
59
+ ## Grok shows no injected message
60
+
61
+ Grok 1.0.13 discarded UserPromptSubmit context in the real capture. Its next-turn and guard
62
+ capabilities remain false. Use `acc status` and `acc inbox`; do not wait for a banner.
63
+
64
+ ## Kimi sessions remain in history
65
+
66
+ Kimi 0.36.1 emits a heartbeat but prompt-mode `SessionEnd` was not observed. An exited
67
+ session becomes offline by presence rules rather than a clean end signal. The default
68
+ status hides offline sessions; `acc status --all` intentionally retains attribution and
69
+ checkout history.
70
+
71
+ ## A write was blocked
72
+
73
+ Exit code `5` names the overlapping claim and owner. Ask the owner or wait for release. If
74
+ an explicit authority has decided to replace it:
75
+
76
+ ```bash
77
+ acc release --claim claim_x --authority "agreed with models" \
78
+ --reason "handing over the file"
79
+ ```
80
+
81
+ ## Protection says advisory
82
+
83
+ At least one live participant cannot be stopped through a certified hook, or at least one
84
+ claim asked only for advisory enforcement. This includes generic MCP and Grok. Respect the
85
+ claim manually; `guarded` would be a false room-wide promise.
86
+
87
+ ## Store version is incompatible
88
+
89
+ v0.2 rejects v0.1 state and provides no migration or automatic deletion. `acc doctor`
90
+ identifies the incompatible data path. Back it up or remove it deliberately only after
91
+ confirming no needed coordination state remains.
92
+
93
+ ## Uninstall left files
94
+
95
+ ACC removes only bytes that still match its install record. Anything edited by the user is
96
+ reported and retained. Remove those leftovers manually if desired.
97
+
98
+ Runtime state is outside the repository by design. `ACC_DATA_HOME` can relocate it, but ACC
99
+ refuses a path inside any workspace root.
100
+
101
+ Next: [Getting started](GETTING_STARTED.md) · [Capabilities](CAPABILITIES.md) ·
102
+ [Configuration](CONFIGURATION.md)
@@ -0,0 +1,61 @@
1
+ # Why ACC
2
+
3
+ ACC exists for a narrow situation: you already have several AI sessions open, each with
4
+ its own client, context, permissions, checkout, and human direction, and they need to
5
+ communicate without becoming workers owned by one controller.
6
+
7
+ That boundary matters. Systems that create an agent team can schedule work because they
8
+ own the workers. ACC deliberately does not. It gives independent sessions a local durable
9
+ place to discover peers, ask questions, answer in threads, acknowledge messages, reserve
10
+ resources, and hand off context. If every session closes, the durable records still tell
11
+ the truth.
12
+
13
+ ## Does it fit?
14
+
15
+ ```mermaid
16
+ flowchart TD
17
+ A["Do you independently open several sessions?"] -->|no| N["ACC adds little and stays quiet"]
18
+ A -->|yes| B["Must they keep separate ownership and permissions?"]
19
+ B -->|no| M["A managed agent runtime may fit better"]
20
+ B -->|yes| C["Do they need direct questions, durable replies, or claim awareness?"]
21
+ C -->|yes| Y["ACC fits this workflow"]
22
+ C -->|no| N
23
+ ```
24
+
25
+ The strongest adoption signal is not installation or a large roster. It is a second
26
+ independently opened session completing a useful acknowledged interaction without the
27
+ human copying peer message content.
28
+
29
+ ## What is different
30
+
31
+ | Need | ACC's boundary |
32
+ |---|---|
33
+ | Keep sessions you already opened | Hooks or MCP add participation; ACC never starts replacement workers. |
34
+ | Mix clients and worktrees | One repository maps to one local workspace while each session keeps its checkout identity. Git is optional. |
35
+ | Ask without granting authority | Messages are attributed untrusted data. A request expects a reply but is not an order. |
36
+ | Recover after compaction or restart | Messages and receipts commit before delivery; participant addressing survives when the participant id is stable. |
37
+ | Avoid overlapping edits | Intent warns; narrow claims may advise or guard, depending on every live client's measured capability. |
38
+ | Trust delivery language | Recorded, queued, offered, retrieved, and acknowledged are separate observable facts. |
39
+ | Keep it private and removable | State is local and outside repositories; transcripts are excluded; uninstall preserves user edits. |
40
+
41
+ Claims support communication; they are not the product's center. The useful loop is ask,
42
+ retrieve, reply, acknowledge, and hand off. A claim merely makes “I am changing this”
43
+ actionable before two sessions collide.
44
+
45
+ ## Choose another layer when
46
+
47
+ Choose a managed runtime if you want the system to create agents, assign execution state,
48
+ select models, spend token budgets, or control process lifecycle. Choose a tracker when
49
+ you need organizational planning. Choose a hosted service when participants must
50
+ coordinate across machines.
51
+
52
+ ACC also does not merge model memory, read raw conversations, approve tools, operate CI,
53
+ or make guarded claims immune to unrelated local processes. Current native live push is
54
+ uncertified, so workflows that require immediate interruption of an already-running model
55
+ should not depend on ACC today.
56
+
57
+ If the sessions should remain yours and simply stop working in isolation, that is the
58
+ product ACC is designed to be.
59
+
60
+ Next: [Getting started](GETTING_STARTED.md) · [Concepts](CONCEPTS.md) ·
61
+ [Capabilities](CAPABILITIES.md)
package/docs/index.md ADDED
@@ -0,0 +1,42 @@
1
+ # ACC documentation
2
+
3
+ ACC connects independently opened AI sessions so they can discover peers and communicate
4
+ without becoming one managed agent team. This map starts with the useful interaction, then
5
+ separates protocol truth from adapter reach.
6
+
7
+ ## Evaluate
8
+
9
+ 1. [Why ACC](WHY_ACC.md) — the product boundary and when a managed runtime fits better.
10
+ 2. [Concepts](CONCEPTS.md) — peers, durable threads, receipts, intent, and claims.
11
+ 3. [Capabilities](CAPABILITIES.md) — certified support, current reachability, recipient
12
+ policy, fallback, and limitations beside each adapter.
13
+
14
+ ## Use it
15
+
16
+ 1. [Getting started](GETTING_STARTED.md) — two user-opened sessions complete one useful
17
+ acknowledged question-and-answer interaction.
18
+ 2. [CLI](CLI.md) — exact commands, flags, result shapes, and exit codes.
19
+ 3. [MCP](MCP.md) — durable polling for clients without a native adapter.
20
+ 4. [Configuration](CONFIGURATION.md) — optional workspace identity and policy.
21
+ 5. [Troubleshooting](TROUBLESHOOTING.md) — symptoms, exact downgrades, and fixes.
22
+
23
+ ## Understand and extend it
24
+
25
+ - [Protocol](PROTOCOL.md) — message envelope, thread rules, receipt lifecycle, handoffs,
26
+ bindings, and the clean v0.2 store break.
27
+ - [Architecture](ARCHITECTURE.md) — record-first flow, package boundaries, router, storage,
28
+ and hooks.
29
+ - [Security model](SECURITY_MODEL.md) — untrusted peer content, delivery integrity,
30
+ filesystem boundaries, and executable attack tests.
31
+ - [Adapter authoring](ADAPTER_AUTHORING.md) — capability evidence, hook contracts, and
32
+ installation ownership.
33
+ - [Glossary](GLOSSARY.md) — each public term in one line.
34
+
35
+ ## Project work
36
+
37
+ - [Contributing](https://github.com/automatis-tools/agents-can-communicate/blob/main/AGENTS.md) — invariants and the mutation-proof gate.
38
+ - [Design decisions](DESIGN_DECISIONS.md) — architectural decisions and reversals.
39
+ - [Releasing](RELEASING.md) — packed-artifact verification.
40
+
41
+ Runtime state and raw transcripts are not documentation artifacts and never belong in the
42
+ repository.