agents-can-communicate 0.1.18 → 0.3.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 (155) hide show
  1. package/README.md +87 -69
  2. package/SECURITY.md +31 -0
  3. package/bin/acc-bootstrap.mjs +56 -0
  4. package/bin/acc-claude-channel.mjs +177 -0
  5. package/bin/acc-hook.mjs +94 -12
  6. package/bin/acc-mcp.mjs +6 -2
  7. package/bin/acc.mjs +13 -3
  8. package/docs/ADAPTER_AUTHORING.md +204 -0
  9. package/docs/ARCHITECTURE.md +131 -0
  10. package/docs/CAPABILITIES.md +117 -214
  11. package/docs/CLI.md +164 -0
  12. package/docs/CONCEPTS.md +134 -0
  13. package/docs/CONFIGURATION.md +147 -0
  14. package/docs/DESIGN_DECISIONS.md +89 -0
  15. package/docs/GETTING_STARTED.md +145 -0
  16. package/docs/GLOSSARY.md +26 -0
  17. package/docs/HOW_IT_WORKS.md +277 -0
  18. package/docs/MCP.md +94 -0
  19. package/docs/PROTOCOL.md +200 -0
  20. package/docs/RELEASING.md +115 -0
  21. package/docs/SECURITY_MODEL.md +131 -0
  22. package/docs/TROUBLESHOOTING.md +108 -0
  23. package/docs/WHY_ACC.md +61 -0
  24. package/docs/index.md +44 -0
  25. package/node_modules/@agents-can-communicate/adapter-claude-code/certification.json +228 -0
  26. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/PreToolUse-Edit.json +19 -0
  27. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/PreToolUse.json +17 -0
  28. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/SessionEnd.json +8 -0
  29. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/SessionStart.json +7 -0
  30. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/UserPromptSubmit.json +9 -0
  31. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/certification-provenance.json +269 -0
  32. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/delivery/claude-code-2.1.252.json +21 -0
  33. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/delivery/claude-code-2.1.258.json +23 -0
  34. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/delivery/claude-code-2.1.260.json +23 -0
  35. package/node_modules/@agents-can-communicate/adapter-claude-code/package.json +13 -2
  36. package/node_modules/@agents-can-communicate/adapter-claude-code/plugin/.mcp.json +8 -0
  37. package/node_modules/@agents-can-communicate/adapter-claude-code/plugin/skills/acc/SKILL.md +22 -22
  38. package/node_modules/@agents-can-communicate/adapter-claude-code/src/adapter.mjs +45 -5
  39. package/node_modules/@agents-can-communicate/adapter-claude-code/src/channel.mjs +377 -0
  40. package/node_modules/@agents-can-communicate/adapter-claude-code/src/install.mjs +27 -7
  41. package/node_modules/@agents-can-communicate/adapter-claude-code/src/native-delivery.mjs +229 -0
  42. package/node_modules/@agents-can-communicate/adapter-codex/certification.json +150 -0
  43. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/PreToolUse.json +14 -0
  44. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/SessionEnd.json +7 -0
  45. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/SessionStart.json +9 -0
  46. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/UserPromptSubmit.json +10 -0
  47. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/certification-provenance.json +199 -0
  48. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.0.json +21 -0
  49. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-remote-workspace.json +25 -0
  50. package/node_modules/@agents-can-communicate/adapter-codex/package.json +11 -2
  51. package/node_modules/@agents-can-communicate/adapter-codex/plugin/.codex-plugin/plugin.json +1 -1
  52. package/node_modules/@agents-can-communicate/adapter-codex/plugin/skills/acc/SKILL.md +22 -22
  53. package/node_modules/@agents-can-communicate/adapter-codex/src/adapter.mjs +54 -12
  54. package/node_modules/@agents-can-communicate/adapter-codex/src/app-server-client.mjs +121 -0
  55. package/node_modules/@agents-can-communicate/adapter-codex/src/native-delivery.mjs +151 -0
  56. package/node_modules/@agents-can-communicate/adapter-codex/src/ws-json-rpc.mjs +192 -0
  57. package/node_modules/@agents-can-communicate/adapter-gemini-cli/certification.json +68 -0
  58. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/gemini-extension.json +1 -1
  59. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/skills/acc/SKILL.md +22 -22
  60. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/BeforeAgent-0.57.0.json +8 -0
  61. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/BeforeTool-0.57.0.json +12 -0
  62. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/BeforeTool-shell-0.57.0.json +12 -0
  63. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/SessionEnd-0.57.0.json +8 -0
  64. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/SessionStart-0.57.0.json +8 -0
  65. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/certification-provenance.json +293 -0
  66. package/node_modules/@agents-can-communicate/adapter-gemini-cli/package.json +8 -1
  67. package/node_modules/@agents-can-communicate/adapter-gemini-cli/src/adapter.mjs +31 -13
  68. package/node_modules/@agents-can-communicate/adapter-gemini-cli/src/install.mjs +4 -2
  69. package/node_modules/@agents-can-communicate/adapter-grok/certification.json +3 -0
  70. package/node_modules/@agents-can-communicate/adapter-grok/package.json +2 -1
  71. package/node_modules/@agents-can-communicate/adapter-grok/plugin/skills/acc/SKILL.md +22 -22
  72. package/node_modules/@agents-can-communicate/adapter-grok/src/adapter.mjs +11 -9
  73. package/node_modules/@agents-can-communicate/adapter-kimi/certification.json +52 -0
  74. package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/PreToolUse-Bash.json +12 -0
  75. package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/PreToolUse-Write.json +12 -0
  76. package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/SessionHeartbeat.json +7 -0
  77. package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/SessionStart.json +9 -0
  78. package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/UserPromptSubmit.json +8 -0
  79. package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/certification-provenance.json +66 -0
  80. package/node_modules/@agents-can-communicate/adapter-kimi/package.json +8 -1
  81. package/node_modules/@agents-can-communicate/adapter-kimi/plugin/skills/acc/SKILL.md +22 -22
  82. package/node_modules/@agents-can-communicate/adapter-kimi/src/adapter.mjs +7 -3
  83. package/node_modules/@agents-can-communicate/adapter-sdk/package.json +1 -1
  84. package/node_modules/@agents-can-communicate/adapter-sdk/src/capabilities.mjs +52 -18
  85. package/node_modules/@agents-can-communicate/adapter-sdk/src/certification.mjs +158 -0
  86. package/node_modules/@agents-can-communicate/adapter-sdk/src/context-projector.mjs +36 -17
  87. package/node_modules/@agents-can-communicate/adapter-sdk/src/hook-shim.mjs +9 -1
  88. package/node_modules/@agents-can-communicate/adapter-sdk/src/index.mjs +7 -2
  89. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-activation.mjs +76 -0
  90. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-delivery.mjs +202 -0
  91. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-vocabulary.mjs +101 -0
  92. package/node_modules/@agents-can-communicate/adapter-sdk/src/session-binding.mjs +28 -4
  93. package/node_modules/@agents-can-communicate/cli/package.json +1 -1
  94. package/node_modules/@agents-can-communicate/cli/src/args.mjs +12 -31
  95. package/node_modules/@agents-can-communicate/cli/src/doctor-command.mjs +70 -5
  96. package/node_modules/@agents-can-communicate/cli/src/help.mjs +2 -5
  97. package/node_modules/@agents-can-communicate/cli/src/install-command.mjs +111 -12
  98. package/node_modules/@agents-can-communicate/cli/src/main.mjs +100 -121
  99. package/node_modules/@agents-can-communicate/core/package.json +1 -1
  100. package/node_modules/@agents-can-communicate/core/src/attention.mjs +106 -0
  101. package/node_modules/@agents-can-communicate/core/src/conversations.mjs +276 -0
  102. package/node_modules/@agents-can-communicate/core/src/delivery-bindings.mjs +131 -0
  103. package/node_modules/@agents-can-communicate/core/src/finish-retries.mjs +97 -0
  104. package/node_modules/@agents-can-communicate/core/src/inbox.mjs +91 -107
  105. package/node_modules/@agents-can-communicate/core/src/index.mjs +3 -3
  106. package/node_modules/@agents-can-communicate/core/src/intents.mjs +0 -1
  107. package/node_modules/@agents-can-communicate/core/src/ports.mjs +2 -1
  108. package/node_modules/@agents-can-communicate/core/src/receipts.mjs +109 -0
  109. package/node_modules/@agents-can-communicate/core/src/service.mjs +21 -10
  110. package/node_modules/@agents-can-communicate/core/src/sessions.mjs +22 -20
  111. package/node_modules/@agents-can-communicate/core/src/status.mjs +11 -9
  112. package/node_modules/@agents-can-communicate/core/src/sync.mjs +3 -294
  113. package/node_modules/@agents-can-communicate/delivery-router/package.json +12 -0
  114. package/node_modules/@agents-can-communicate/delivery-router/src/index.mjs +1 -0
  115. package/node_modules/@agents-can-communicate/delivery-router/src/router.mjs +131 -0
  116. package/node_modules/@agents-can-communicate/hook-runner/package.json +4 -2
  117. package/node_modules/@agents-can-communicate/hook-runner/src/client-version.mjs +20 -0
  118. package/node_modules/@agents-can-communicate/hook-runner/src/native-binding.mjs +90 -0
  119. package/node_modules/@agents-can-communicate/hook-runner/src/runner.mjs +190 -105
  120. package/node_modules/@agents-can-communicate/installer/package.json +1 -1
  121. package/node_modules/@agents-can-communicate/installer/src/apply.mjs +70 -10
  122. package/node_modules/@agents-can-communicate/installer/src/bootstrap-runtime.mjs +144 -0
  123. package/node_modules/@agents-can-communicate/installer/src/detect.mjs +89 -5
  124. package/node_modules/@agents-can-communicate/installer/src/index.mjs +10 -2
  125. package/node_modules/@agents-can-communicate/installer/src/native-activation.mjs +161 -0
  126. package/node_modules/@agents-can-communicate/installer/src/ownership.mjs +112 -12
  127. package/node_modules/@agents-can-communicate/installer/src/plan.mjs +54 -2
  128. package/node_modules/@agents-can-communicate/installer/src/shell-bootstrap.mjs +210 -0
  129. package/node_modules/@agents-can-communicate/mcp-server/package.json +1 -1
  130. package/node_modules/@agents-can-communicate/mcp-server/src/input-validator.mjs +79 -0
  131. package/node_modules/@agents-can-communicate/mcp-server/src/resources.mjs +23 -28
  132. package/node_modules/@agents-can-communicate/mcp-server/src/server.mjs +102 -72
  133. package/node_modules/@agents-can-communicate/mcp-server/src/tools.mjs +54 -97
  134. package/node_modules/@agents-can-communicate/protocol/package.json +1 -1
  135. package/node_modules/@agents-can-communicate/protocol/src/config.mjs +1 -1
  136. package/node_modules/@agents-can-communicate/protocol/src/conversations.mjs +64 -0
  137. package/node_modules/@agents-can-communicate/protocol/src/fields.mjs +17 -0
  138. package/node_modules/@agents-can-communicate/protocol/src/index.mjs +4 -1
  139. package/node_modules/@agents-can-communicate/protocol/src/schema.mjs +64 -90
  140. package/node_modules/@agents-can-communicate/protocol/src/states.mjs +13 -40
  141. package/node_modules/@agents-can-communicate/storage-filesystem/package.json +1 -1
  142. package/node_modules/@agents-can-communicate/storage-filesystem/src/active-journal.mjs +230 -0
  143. package/node_modules/@agents-can-communicate/storage-filesystem/src/atomic-json.mjs +77 -28
  144. package/node_modules/@agents-can-communicate/storage-filesystem/src/identity.mjs +1 -1
  145. package/node_modules/@agents-can-communicate/storage-filesystem/src/journal.mjs +83 -35
  146. package/node_modules/@agents-can-communicate/storage-filesystem/src/retention.mjs +112 -0
  147. package/node_modules/@agents-can-communicate/storage-filesystem/src/safe-file.mjs +18 -8
  148. package/node_modules/@agents-can-communicate/storage-filesystem/src/store.mjs +68 -26
  149. package/node_modules/@agents-can-communicate/storage-filesystem/src/writer-mutex.mjs +113 -35
  150. package/package.json +20 -1
  151. package/node_modules/@agents-can-communicate/core/src/communication.mjs +0 -334
  152. package/node_modules/@agents-can-communicate/core/src/message-signals.mjs +0 -41
  153. package/node_modules/@agents-can-communicate/core/src/notify.mjs +0 -95
  154. package/node_modules/@agents-can-communicate/core/src/tasks.mjs +0 -244
  155. package/node_modules/@agents-can-communicate/core/src/workstreams.mjs +0 -109
@@ -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,108 @@
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.57.0 on `darwin-arm64` has
57
+ package-shipped delivery certification; other versions still use inbox.
58
+
59
+ From 0.55 onwards there is a quieter cause with the same symptom: an untrusted folder. The
60
+ client prints `Approval mode overridden to "default" because the current folder is not
61
+ trusted` and keeps going, and the default mode has no write or shell tool to guard - so the
62
+ guard never fires and the mode you passed appears to have been ignored. Trust the folder,
63
+ or start the session somewhere trusted.
64
+
65
+ ## Grok shows no injected message
66
+
67
+ Grok 1.0.13 discarded UserPromptSubmit context in the real capture. Its next-turn and guard
68
+ capabilities remain false. Use `acc status` and `acc inbox`; do not wait for a banner.
69
+
70
+ ## Kimi sessions remain in history
71
+
72
+ Kimi 0.36.1 emits a heartbeat but prompt-mode `SessionEnd` was not observed. An exited
73
+ session becomes offline by presence rules rather than a clean end signal. The default
74
+ status hides offline sessions; `acc status --all` intentionally retains attribution and
75
+ checkout history.
76
+
77
+ ## A write was blocked
78
+
79
+ Exit code `5` names the overlapping claim and owner. Ask the owner or wait for release. If
80
+ an explicit authority has decided to replace it:
81
+
82
+ ```bash
83
+ acc release --claim claim_x --authority "agreed with models" \
84
+ --reason "handing over the file"
85
+ ```
86
+
87
+ ## Protection says advisory
88
+
89
+ At least one live participant cannot be stopped through a certified hook, or at least one
90
+ claim asked only for advisory enforcement. This includes generic MCP and Grok. Respect the
91
+ claim manually; `guarded` would be a false room-wide promise.
92
+
93
+ ## Store version is incompatible
94
+
95
+ v0.2 rejects v0.1 state and provides no migration or automatic deletion. `acc doctor`
96
+ identifies the incompatible data path. Back it up or remove it deliberately only after
97
+ confirming no needed coordination state remains.
98
+
99
+ ## Uninstall left files
100
+
101
+ ACC removes only bytes that still match its install record. Anything edited by the user is
102
+ reported and retained. Remove those leftovers manually if desired.
103
+
104
+ Runtime state is outside the repository by design. `ACC_DATA_HOME` can relocate it, but ACC
105
+ refuses a path inside any workspace root.
106
+
107
+ Next: [Getting started](GETTING_STARTED.md) · [Capabilities](CAPABILITIES.md) ·
108
+ [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,44 @@
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. [How ACC works](HOW_IT_WORKS.md) — the end-to-end path from client hook and workspace
12
+ identity through durable storage, delivery fallback, reply, and acknowledgement.
13
+ 4. [Capabilities](CAPABILITIES.md) — certified support, current reachability, recipient
14
+ policy, fallback, and limitations beside each adapter.
15
+
16
+ ## Use it
17
+
18
+ 1. [Getting started](GETTING_STARTED.md) — two user-opened sessions complete one useful
19
+ acknowledged question-and-answer interaction.
20
+ 2. [CLI](CLI.md) — exact commands, flags, result shapes, and exit codes.
21
+ 3. [MCP](MCP.md) — durable polling for clients without a native adapter.
22
+ 4. [Configuration](CONFIGURATION.md) — optional workspace identity and policy.
23
+ 5. [Troubleshooting](TROUBLESHOOTING.md) — symptoms, exact downgrades, and fixes.
24
+
25
+ ## Understand and extend it
26
+
27
+ - [Protocol](PROTOCOL.md) — message envelope, thread rules, receipt lifecycle, handoffs,
28
+ bindings, and the clean v0.2 store break.
29
+ - [Architecture](ARCHITECTURE.md) — record-first flow, package boundaries, router, storage,
30
+ and hooks.
31
+ - [Security model](SECURITY_MODEL.md) — untrusted peer content, delivery integrity,
32
+ filesystem boundaries, and executable attack tests.
33
+ - [Adapter authoring](ADAPTER_AUTHORING.md) — capability evidence, hook contracts, and
34
+ installation ownership.
35
+ - [Glossary](GLOSSARY.md) — each public term in one line.
36
+
37
+ ## Project work
38
+
39
+ - [Contributing](https://github.com/automatis-tools/agents-can-communicate/blob/main/AGENTS.md) — invariants and the mutation-proof gate.
40
+ - [Design decisions](DESIGN_DECISIONS.md) — architectural decisions and reversals.
41
+ - [Releasing](RELEASING.md) — packed-artifact verification.
42
+
43
+ Runtime state and raw transcripts are not documentation artifacts and never belong in the
44
+ repository.
@@ -0,0 +1,228 @@
1
+ {
2
+ "evidence": [
3
+ {
4
+ "client": "claude-code",
5
+ "version": "2.1.233",
6
+ "platform": "darwin-arm64",
7
+ "observedAt": "2026-08-16",
8
+ "capability": "lifecycle.sessionStart",
9
+ "fixture": "fixtures/SessionStart.json",
10
+ "idleBehavior": "fires when a session starts",
11
+ "provenance": "fixtures/certification-provenance.json",
12
+ "provenanceId": "session-start",
13
+ "busyBehavior": "fires before the first model turn",
14
+ "authorityLevel": "advisory",
15
+ "limitations": [
16
+ "capture used a one-session --plugin-dir"
17
+ ],
18
+ "result": "pass"
19
+ },
20
+ {
21
+ "client": "claude-code",
22
+ "version": "2.1.233",
23
+ "platform": "darwin-arm64",
24
+ "observedAt": "2026-08-16",
25
+ "capability": "lifecycle.sessionEnd",
26
+ "fixture": "fixtures/SessionEnd.json",
27
+ "idleBehavior": "fires when a session exits",
28
+ "provenance": "fixtures/certification-provenance.json",
29
+ "provenanceId": "session-end",
30
+ "busyBehavior": "does not run until the session exits",
31
+ "authorityLevel": "advisory",
32
+ "limitations": [
33
+ "cannot write a handoff after the model has stopped"
34
+ ],
35
+ "result": "pass"
36
+ },
37
+ {
38
+ "client": "claude-code",
39
+ "version": "2.1.233",
40
+ "platform": "darwin-arm64",
41
+ "observedAt": "2026-08-16",
42
+ "capability": "context.beforeTurnInjection",
43
+ "fixture": "fixtures/UserPromptSubmit.json",
44
+ "idleBehavior": "waits for the next user prompt",
45
+ "provenance": "fixtures/certification-provenance.json",
46
+ "provenanceId": "user-prompt-submit",
47
+ "busyBehavior": "does not interrupt an in-progress turn",
48
+ "authorityLevel": "context",
49
+ "limitations": [
50
+ "requires the hookSpecificOutput additionalContext envelope"
51
+ ],
52
+ "result": "pass"
53
+ },
54
+ {
55
+ "client": "claude-code",
56
+ "version": "2.1.233",
57
+ "platform": "darwin-arm64",
58
+ "observedAt": "2026-08-16",
59
+ "capability": "guards.beforeWrite",
60
+ "fixture": "fixtures/PreToolUse-Edit.json",
61
+ "idleBehavior": "no write exists to guard",
62
+ "provenance": "fixtures/certification-provenance.json",
63
+ "provenanceId": "pre-tool-use-edit",
64
+ "busyBehavior": "denies a file edit before disk mutation",
65
+ "authorityLevel": "blocking",
66
+ "limitations": [
67
+ "runtime writes are outside the hook boundary"
68
+ ],
69
+ "result": "pass"
70
+ },
71
+ {
72
+ "client": "claude-code",
73
+ "version": "2.1.233",
74
+ "platform": "darwin-arm64",
75
+ "observedAt": "2026-08-16",
76
+ "capability": "guards.beforeShell",
77
+ "fixture": "fixtures/PreToolUse.json",
78
+ "idleBehavior": "no shell call exists to guard",
79
+ "provenance": "fixtures/certification-provenance.json",
80
+ "provenanceId": "pre-tool-use-bash",
81
+ "busyBehavior": "denies a Bash call before execution",
82
+ "authorityLevel": "blocking",
83
+ "limitations": [
84
+ "only tool calls reaching PreToolUse are guarded"
85
+ ],
86
+ "result": "pass"
87
+ },
88
+ {
89
+ "client": "claude-code",
90
+ "version": "2.1.233",
91
+ "platform": "darwin-arm64",
92
+ "observedAt": "2026-08-16",
93
+ "capability": "delivery.nextTurn",
94
+ "fixture": "fixtures/UserPromptSubmit.json",
95
+ "idleBehavior": "offers complete peer messages at the next prompt",
96
+ "provenance": "fixtures/certification-provenance.json",
97
+ "provenanceId": "user-prompt-submit",
98
+ "busyBehavior": "does not interrupt an in-progress turn",
99
+ "authorityLevel": "context",
100
+ "limitations": [
101
+ "delivery requires the next normal user turn"
102
+ ],
103
+ "result": "pass"
104
+ },
105
+ {
106
+ "client": "claude-code",
107
+ "version": "2.1.252",
108
+ "platform": "darwin-arm64",
109
+ "observedAt": "2026-09-01T16:17:06Z",
110
+ "capability": "delivery.livePush",
111
+ "fixture": "fixtures/delivery/claude-code-2.1.252.json",
112
+ "idleBehavior": "unobserved",
113
+ "provenance": "fixtures/certification-provenance.json",
114
+ "provenanceId": "native-delivery-2-1-252",
115
+ "busyBehavior": "unobserved",
116
+ "authorityLevel": "none",
117
+ "limitations": [
118
+ "Claude Code displayed the development-channel security warning and the operator did not accept it",
119
+ "Claude Code did not spawn the acc-spike MCP child and the Unix-domain socket was never created",
120
+ "idle, busy, reply, duplicate, and fallback branches were not observed"
121
+ ],
122
+ "result": "fail"
123
+ },
124
+ {
125
+ "client": "claude-code",
126
+ "version": "2.1.252",
127
+ "platform": "darwin-arm64",
128
+ "observedAt": "2026-09-01T16:17:06Z",
129
+ "capability": "delivery.replyRoute",
130
+ "fixture": "fixtures/delivery/claude-code-2.1.252.json",
131
+ "idleBehavior": "unobserved",
132
+ "provenance": "fixtures/certification-provenance.json",
133
+ "provenanceId": "native-delivery-2-1-252",
134
+ "busyBehavior": "unobserved",
135
+ "authorityLevel": "none",
136
+ "limitations": [
137
+ "Claude Code displayed the development-channel security warning and the operator did not accept it",
138
+ "Claude Code did not spawn the acc-spike MCP child and the Unix-domain socket was never created",
139
+ "idle, busy, reply, duplicate, and fallback branches were not observed"
140
+ ],
141
+ "result": "fail"
142
+ },
143
+ {
144
+ "client": "claude-code",
145
+ "version": "2.1.258",
146
+ "platform": "darwin-arm64",
147
+ "observedAt": "2026-09-02T21:20:11.676Z",
148
+ "capability": "delivery.livePush",
149
+ "fixture": "fixtures/delivery/claude-code-2.1.258.json",
150
+ "idleBehavior": "offered",
151
+ "provenance": "fixtures/certification-provenance.json",
152
+ "provenanceId": "native-delivery-2-1-258",
153
+ "busyBehavior": "queued_after_turn",
154
+ "authorityLevel": "experimental",
155
+ "limitations": [
156
+ "captured on darwin-arm64 only; Linux and Windows remain uncaptured",
157
+ "the vendor development-channel warning stayed visible and was accepted by the operator by hand",
158
+ "the plugin .mcp.json must live in the marketplace source copy; the plugin cache copy alone is not read",
159
+ "acc_reply routed through the spike's explicit tool call; the spike created no durable ACC answer record",
160
+ "presentation after the busy turn was observed by the operator; the channel log records the write at 21:18:45Z and the explicit reply at 21:19:21Z"
161
+ ],
162
+ "result": "pass"
163
+ },
164
+ {
165
+ "client": "claude-code",
166
+ "version": "2.1.258",
167
+ "platform": "darwin-arm64",
168
+ "observedAt": "2026-09-02T21:20:11.676Z",
169
+ "capability": "delivery.replyRoute",
170
+ "fixture": "fixtures/delivery/claude-code-2.1.258.json",
171
+ "idleBehavior": "offered",
172
+ "provenance": "fixtures/certification-provenance.json",
173
+ "provenanceId": "native-delivery-2-1-258",
174
+ "busyBehavior": "queued_after_turn",
175
+ "authorityLevel": "experimental",
176
+ "limitations": [
177
+ "captured on darwin-arm64 only; Linux and Windows remain uncaptured",
178
+ "the vendor development-channel warning stayed visible and was accepted by the operator by hand",
179
+ "the plugin .mcp.json must live in the marketplace source copy; the plugin cache copy alone is not read",
180
+ "acc_reply routed through the spike's explicit tool call; the spike created no durable ACC answer record",
181
+ "presentation after the busy turn was observed by the operator; the channel log records the write at 21:18:45Z and the explicit reply at 21:19:21Z"
182
+ ],
183
+ "result": "pass"
184
+ },
185
+ {
186
+ "client": "claude-code",
187
+ "version": "2.1.260",
188
+ "platform": "darwin-arm64",
189
+ "observedAt": "2026-09-04T03:41:29.688Z",
190
+ "capability": "delivery.livePush",
191
+ "fixture": "fixtures/delivery/claude-code-2.1.260.json",
192
+ "idleBehavior": "offered",
193
+ "provenance": "fixtures/certification-provenance.json",
194
+ "provenanceId": "native-delivery-2-1-260",
195
+ "busyBehavior": "queued_after_turn",
196
+ "authorityLevel": "experimental",
197
+ "limitations": [
198
+ "captured on darwin-arm64 only; Linux and Windows remain uncaptured",
199
+ "the vendor development-channel warning stayed visible and was accepted by the operator by hand",
200
+ "two ordinary sessions in one workspace, each bound to its own client process; the earlier 2.1.259 attempt is what exposed the channel binding another session identity, and this run is the verification of that fix",
201
+ "duplicate was observed as one logical message id and one native offer: the repeated send took the durable path, so the channel was never asked to notify twice, and exactly one answer was recorded",
202
+ "busy was observed by the operator: the running turn completed before the channel presented the message, and the session named that order in its own answer"
203
+ ],
204
+ "result": "pass"
205
+ },
206
+ {
207
+ "client": "claude-code",
208
+ "version": "2.1.260",
209
+ "platform": "darwin-arm64",
210
+ "observedAt": "2026-09-04T03:41:29.688Z",
211
+ "capability": "delivery.replyRoute",
212
+ "fixture": "fixtures/delivery/claude-code-2.1.260.json",
213
+ "idleBehavior": "offered",
214
+ "provenance": "fixtures/certification-provenance.json",
215
+ "provenanceId": "native-delivery-2-1-260",
216
+ "busyBehavior": "queued_after_turn",
217
+ "authorityLevel": "experimental",
218
+ "limitations": [
219
+ "captured on darwin-arm64 only; Linux and Windows remain uncaptured",
220
+ "the vendor development-channel warning stayed visible and was accepted by the operator by hand",
221
+ "two ordinary sessions in one workspace, each bound to its own client process; the earlier 2.1.259 attempt is what exposed the channel binding another session identity, and this run is the verification of that fix",
222
+ "duplicate was observed as one logical message id and one native offer: the repeated send took the durable path, so the channel was never asked to notify twice, and exactly one answer was recorded",
223
+ "busy was observed by the operator: the running turn completed before the channel presented the message, and the session named that order in its own answer"
224
+ ],
225
+ "result": "pass"
226
+ }
227
+ ]
228
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "session_id": "a96cb852-40af-4406-978b-edd9c0affdd1",
3
+ "transcript_path": "<redacted: conversation transcript>",
4
+ "cwd": "/tmp/example-workspace",
5
+ "prompt_id": "082bbc2b-f77b-4571-88ce-92a4faaf7ecd",
6
+ "permission_mode": "auto",
7
+ "effort": {
8
+ "level": "xhigh"
9
+ },
10
+ "hook_event_name": "PreToolUse",
11
+ "tool_name": "Edit",
12
+ "tool_input": {
13
+ "file_path": "/tmp/example-workspace/notes.txt",
14
+ "old_string": "<redacted: file contents>",
15
+ "new_string": "<redacted: file contents>",
16
+ "replace_all": false
17
+ },
18
+ "tool_use_id": "toolu_0000000000000000000000"
19
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "session_id": "a96cb852-40af-4406-978b-edd9c0affdd1",
3
+ "transcript_path": "<redacted: conversation transcript>",
4
+ "cwd": "/tmp/example-workspace",
5
+ "prompt_id": "8b56d896-013c-4ab8-845b-f9670ac34386",
6
+ "permission_mode": "bypassPermissions",
7
+ "effort": {
8
+ "level": "xhigh"
9
+ },
10
+ "hook_event_name": "PreToolUse",
11
+ "tool_name": "Bash",
12
+ "tool_input": {
13
+ "command": "echo probe",
14
+ "description": "Run echo probe"
15
+ },
16
+ "tool_use_id": "toolu_01DwntPqjB3f7otHzHhGoFGH"
17
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "session_id": "a96cb852-40af-4406-978b-edd9c0affdd1",
3
+ "transcript_path": "<redacted: conversation transcript>",
4
+ "cwd": "/tmp/example-workspace",
5
+ "prompt_id": "8b56d896-013c-4ab8-845b-f9670ac34386",
6
+ "hook_event_name": "SessionEnd",
7
+ "reason": "other"
8
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "session_id": "a96cb852-40af-4406-978b-edd9c0affdd1",
3
+ "transcript_path": "<redacted: conversation transcript>",
4
+ "cwd": "/tmp/example-workspace",
5
+ "hook_event_name": "SessionStart",
6
+ "source": "startup"
7
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "session_id": "a96cb852-40af-4406-978b-edd9c0affdd1",
3
+ "transcript_path": "<redacted: conversation transcript>",
4
+ "cwd": "/tmp/example-workspace",
5
+ "prompt_id": "8b56d896-013c-4ab8-845b-f9670ac34386",
6
+ "permission_mode": "bypassPermissions",
7
+ "hook_event_name": "UserPromptSubmit",
8
+ "prompt": "<redacted: user prompt>"
9
+ }