@wacando/agent 2.0.0-rc.1 → 2.0.2
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.
- package/THIRD-PARTY-NOTICES.txt +3 -3
- package/docs/AGENT_TOOLS.md +18 -0
- package/docs/RELEASE.md +33 -6
- package/package.json +5 -5
- package/packages/onboarding/version.mjs +1 -1
- package/packages/runtime/conversations.mjs +53 -4
- package/packages/runtime/recovery.mjs +49 -0
- package/plugins/wacando/.codex-plugin/plugin.json +1 -1
- package/plugins/wacando-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/wacando-cursor/.cursor-plugin/plugin.json +1 -1
- package/provenance.json +6 -6
- package/docs/evidence/issue-2/DOCUMENTARY_FOLLOWUP.md +0 -107
- package/docs/evidence/issue-2/QUALIFICATION_LINK_FOLLOWUP.md +0 -105
- package/docs/evidence/issue-2/REVIEW_FOLLOWUP.md +0 -93
- package/docs/evidence/issue-2/baseline.txt +0 -76
- package/docs/evidence/issue-2/check-mcp.txt +0 -14
- package/docs/evidence/issue-2/check.txt +0 -376
- package/docs/evidence/issue-2/codex-exec-help.json +0 -11
- package/docs/evidence/issue-2/codex-help.json +0 -10
- package/docs/evidence/issue-2/cursor-help.json +0 -10
- package/docs/evidence/issue-2/documentary-check.txt +0 -376
- package/docs/evidence/issue-2/documentary-validation.txt +0 -7
- package/docs/evidence/issue-2/local-build-api.txt +0 -203
- package/docs/evidence/issue-2/local-build-first.txt +0 -87
- package/docs/evidence/issue-2/local-build-policy-first.txt +0 -34
- package/docs/evidence/issue-2/local-build-policy.txt +0 -153
- package/docs/evidence/issue-2/local-build-web.txt +0 -219
- package/docs/evidence/issue-2/local-check-mcp.txt +0 -14
- package/docs/evidence/issue-2/local-check.txt +0 -376
- package/docs/evidence/issue-2/local-codex-probe.txt +0 -3
- package/docs/evidence/issue-2/local-codex-probe2.txt +0 -3
- package/docs/evidence/issue-2/local-codex.txt +0 -2
- package/docs/evidence/issue-2/local-cursor-probe.txt +0 -1
- package/docs/evidence/issue-2/local-cursor.txt +0 -2
- package/docs/evidence/issue-2/local-down.txt +0 -32
- package/docs/evidence/issue-2/local-health.txt +0 -1
- package/docs/evidence/issue-2/local-live.txt +0 -28
- package/docs/evidence/issue-2/local-seed.txt +0 -26
- package/docs/evidence/issue-2/local-status.txt +0 -6
- package/docs/evidence/issue-2/local-up.txt +0 -18
- package/docs/evidence/issue-2/prepare-local-stack.py +0 -67
- package/docs/evidence/issue-2/qualification-body-validation.txt +0 -9
- package/docs/evidence/issue-2/qualification-link-check.txt +0 -376
- package/docs/evidence/issue-2/qualification-link-validation.txt +0 -20
- package/docs/evidence/issue-2/review-check.txt +0 -376
- package/docs/evidence/issue-2/review-validation.txt +0 -218
- package/docs/evidence/issue-7/README.md +0 -21
- package/docs/evidence/issue-7/check-mcp.txt +0 -9
- package/docs/evidence/issue-7/check.txt +0 -381
- package/docs/evidence/issue-7/live.txt +0 -23
- package/docs/evidence/issue-8/README.md +0 -56
- package/docs/evidence/issue-8/check-mcp.txt +0 -9
- package/docs/evidence/issue-8/check.txt +0 -465
- package/docs/evidence/issue-8/e2e-desktop-observer-human-devices.txt +0 -30
- package/docs/evidence/issue-8/e2e-desktop-observer-main-without-109.txt +0 -17
- package/docs/evidence/issue-8/e2e-desktop-observer.txt +0 -26
- package/docs/evidence/issue-8/live-regression-human-devices.txt +0 -24
- package/docs/evidence/issue-8/live-regression.txt +0 -23
- package/docs/evidence/issue-8/review-fixes/README.md +0 -30
- package/docs/evidence/issue-8/review-fixes/check-mcp.txt +0 -9
- package/docs/evidence/issue-8/review-fixes/check.txt +0 -484
- package/docs/evidence/issue-8/review-fixes/e2e-desktop-observer.txt +0 -28
- package/docs/evidence/issue-8/review-fixes/onboarding-live.txt +0 -15
- package/docs/evidence/issue-8/review-fixes/session-replacement-live.txt +0 -13
- package/docs/evidence/npm-release/check-mcp.txt +0 -9
- package/docs/evidence/npm-release/check.txt +0 -484
- package/docs/evidence/npm-release/e2e-desktop-observer.txt +0 -28
|
@@ -1,465 +0,0 @@
|
|
|
1
|
-
$ npm run check
|
|
2
|
-
|
|
3
|
-
> wacando-agent@2.0.0 check
|
|
4
|
-
> node scripts/check-deps.mjs && npm run check:notices && npm test
|
|
5
|
-
|
|
6
|
-
Verified 3 pinned Wacando archives from https://github.com/lbframe/wacando @ 5f0f0a1f0ccc20c47383fed6f8e072aca5302486
|
|
7
|
-
|
|
8
|
-
> wacando-agent@2.0.0 check:notices
|
|
9
|
-
> node scripts/notices.mjs --check
|
|
10
|
-
|
|
11
|
-
Verified notices and provenance for 83 runtime packages
|
|
12
|
-
|
|
13
|
-
> wacando-agent@2.0.0 test
|
|
14
|
-
> node --test tests/*.test.mjs
|
|
15
|
-
|
|
16
|
-
TAP version 13
|
|
17
|
-
# Subtest: the ciphertext goes to the other agent and both owners, never to an unrelated party
|
|
18
|
-
ok 1 - the ciphertext goes to the other agent and both owners, never to an unrelated party
|
|
19
|
-
---
|
|
20
|
-
duration_ms: 1.136318
|
|
21
|
-
type: 'test'
|
|
22
|
-
...
|
|
23
|
-
# Subtest: a deleted side is not an encryption target and a stranger cannot view
|
|
24
|
-
ok 2 - a deleted side is not an encryption target and a stranger cannot view
|
|
25
|
-
---
|
|
26
|
-
duration_ms: 0.380513
|
|
27
|
-
type: 'test'
|
|
28
|
-
...
|
|
29
|
-
# Subtest: only an activated conversation counts as accepted, including after STOP
|
|
30
|
-
ok 3 - only an activated conversation counts as accepted, including after STOP
|
|
31
|
-
---
|
|
32
|
-
duration_ms: 0.173921
|
|
33
|
-
type: 'test'
|
|
34
|
-
...
|
|
35
|
-
# Subtest: the public summary never exposes owner identifiers
|
|
36
|
-
ok 4 - the public summary never exposes owner identifiers
|
|
37
|
-
---
|
|
38
|
-
duration_ms: 0.264772
|
|
39
|
-
type: 'test'
|
|
40
|
-
...
|
|
41
|
-
# Subtest: API refusals become explicit, content-free messages
|
|
42
|
-
ok 5 - API refusals become explicit, content-free messages
|
|
43
|
-
---
|
|
44
|
-
duration_ms: 0.239232
|
|
45
|
-
type: 'test'
|
|
46
|
-
...
|
|
47
|
-
# Subtest: recipient discovery returns both agents and every owner installation
|
|
48
|
-
ok 6 - recipient discovery returns both agents and every owner installation
|
|
49
|
-
---
|
|
50
|
-
duration_ms: 0.228682
|
|
51
|
-
type: 'test'
|
|
52
|
-
...
|
|
53
|
-
# Subtest: malformed or foreign recipient discovery fails closed
|
|
54
|
-
ok 7 - malformed or foreign recipient discovery fails closed
|
|
55
|
-
---
|
|
56
|
-
duration_ms: 0.269012
|
|
57
|
-
type: 'test'
|
|
58
|
-
...
|
|
59
|
-
# Subtest: cursor checker requires an affirmative parsed payload even when the wrapper says success
|
|
60
|
-
ok 8 - cursor checker requires an affirmative parsed payload even when the wrapper says success
|
|
61
|
-
---
|
|
62
|
-
duration_ms: 3.107283
|
|
63
|
-
type: 'test'
|
|
64
|
-
...
|
|
65
|
-
# Subtest: cursor checker distinguishes clear revocation from a crash, lock error or false connection
|
|
66
|
-
ok 9 - cursor checker distinguishes clear revocation from a crash, lock error or false connection
|
|
67
|
-
---
|
|
68
|
-
duration_ms: 1.587432
|
|
69
|
-
type: 'test'
|
|
70
|
-
...
|
|
71
|
-
# Subtest: codex checker requires an affirmative parsed payload even when the wrapper says success
|
|
72
|
-
ok 10 - codex checker requires an affirmative parsed payload even when the wrapper says success
|
|
73
|
-
---
|
|
74
|
-
duration_ms: 0.452933
|
|
75
|
-
type: 'test'
|
|
76
|
-
...
|
|
77
|
-
# Subtest: codex checker distinguishes clear revocation from a crash, lock error or false connection
|
|
78
|
-
ok 11 - codex checker distinguishes clear revocation from a crash, lock error or false connection
|
|
79
|
-
---
|
|
80
|
-
duration_ms: 0.371953
|
|
81
|
-
type: 'test'
|
|
82
|
-
...
|
|
83
|
-
# Subtest: checker requires verified:true for installation readiness
|
|
84
|
-
ok 12 - checker requires verified:true for installation readiness
|
|
85
|
-
---
|
|
86
|
-
duration_ms: 0.422983
|
|
87
|
-
type: 'test'
|
|
88
|
-
...
|
|
89
|
-
# Subtest: malformed viewer request targets return 400 without losing MCP events
|
|
90
|
-
ok 13 - malformed viewer request targets return 400 without losing MCP events
|
|
91
|
-
---
|
|
92
|
-
duration_ms: 244.735896
|
|
93
|
-
type: 'test'
|
|
94
|
-
...
|
|
95
|
-
# Subtest: MCP shutdown on EOF closes SSE and unfinished HTTP headers
|
|
96
|
-
ok 14 - MCP shutdown on EOF closes SSE and unfinished HTTP headers
|
|
97
|
-
---
|
|
98
|
-
duration_ms: 453.17005
|
|
99
|
-
type: 'test'
|
|
100
|
-
...
|
|
101
|
-
# Subtest: MCP shutdown on SIGTERM closes SSE and unfinished HTTP headers
|
|
102
|
-
ok 15 - MCP shutdown on SIGTERM closes SSE and unfinished HTTP headers
|
|
103
|
-
---
|
|
104
|
-
duration_ms: 397.135599
|
|
105
|
-
type: 'test'
|
|
106
|
-
...
|
|
107
|
-
# Subtest: HTTP and SSE snapshots use bounded pages and preserve large Unicode events
|
|
108
|
-
ok 16 - HTTP and SSE snapshots use bounded pages and preserve large Unicode events
|
|
109
|
-
---
|
|
110
|
-
duration_ms: 62.279017
|
|
111
|
-
type: 'test'
|
|
112
|
-
...
|
|
113
|
-
# Subtest: SSE client and queue limits isolate slow readers
|
|
114
|
-
ok 17 - SSE client and queue limits isolate slow readers
|
|
115
|
-
---
|
|
116
|
-
duration_ms: 12.629645
|
|
117
|
-
type: 'test'
|
|
118
|
-
...
|
|
119
|
-
# Subtest: legacy negotiation requires valid initialization and the initialized notification
|
|
120
|
-
ok 18 - legacy negotiation requires valid initialization and the initialized notification
|
|
121
|
-
---
|
|
122
|
-
duration_ms: 235.436646
|
|
123
|
-
type: 'test'
|
|
124
|
-
...
|
|
125
|
-
# Subtest: JSON-RPC rejects invalid IDs and parameters without answering responses or notifications
|
|
126
|
-
ok 19 - JSON-RPC rejects invalid IDs and parameters without answering responses or notifications
|
|
127
|
-
---
|
|
128
|
-
duration_ms: 162.277287
|
|
129
|
-
type: 'test'
|
|
130
|
-
...
|
|
131
|
-
# Subtest: tools enforce schemas, preserve Unicode limits, and never claim observed visibility
|
|
132
|
-
ok 20 - tools enforce schemas, preserve Unicode limits, and never claim observed visibility
|
|
133
|
-
---
|
|
134
|
-
duration_ms: 163.832959
|
|
135
|
-
type: 'test'
|
|
136
|
-
...
|
|
137
|
-
# Subtest: event pages obey encoded byte limits and traverse without losing filtered records
|
|
138
|
-
ok 21 - event pages obey encoded byte limits and traverse without losing filtered records
|
|
139
|
-
---
|
|
140
|
-
duration_ms: 11.876959
|
|
141
|
-
type: 'test'
|
|
142
|
-
...
|
|
143
|
-
# Subtest: retention is bounded by bytes as well as event count and reports eviction
|
|
144
|
-
ok 22 - retention is bounded by bytes as well as event count and reports eviction
|
|
145
|
-
---
|
|
146
|
-
duration_ms: 1.823443
|
|
147
|
-
type: 'test'
|
|
148
|
-
...
|
|
149
|
-
# Subtest: stdio framing handles split UTF-8, CRLF and escaped newlines with strict byte bounds
|
|
150
|
-
ok 23 - stdio framing handles split UTF-8, CRLF and escaped newlines with strict byte bounds
|
|
151
|
-
---
|
|
152
|
-
duration_ms: 2.59395
|
|
153
|
-
type: 'test'
|
|
154
|
-
...
|
|
155
|
-
# Subtest: an oversized unfinished frame closes the MCP process promptly
|
|
156
|
-
ok 24 - an oversized unfinished frame closes the MCP process promptly
|
|
157
|
-
---
|
|
158
|
-
duration_ms: 151.433036
|
|
159
|
-
type: 'test'
|
|
160
|
-
...
|
|
161
|
-
# Subtest: SIGTERM exits within a deadline even when the host stops reading stdout
|
|
162
|
-
ok 25 - SIGTERM exits within a deadline even when the host stops reading stdout
|
|
163
|
-
---
|
|
164
|
-
duration_ms: 1210.075638
|
|
165
|
-
type: 'test'
|
|
166
|
-
...
|
|
167
|
-
# Subtest: stdio writes wait for readers and reject stalled or oversized output
|
|
168
|
-
ok 26 - stdio writes wait for readers and reject stalled or oversized output
|
|
169
|
-
---
|
|
170
|
-
duration_ms: 1004.345495
|
|
171
|
-
type: 'test'
|
|
172
|
-
...
|
|
173
|
-
# Subtest: rate limiting admits bursts, rejects excess calls and refills over time
|
|
174
|
-
ok 27 - rate limiting admits bursts, rejects excess calls and refills over time
|
|
175
|
-
---
|
|
176
|
-
duration_ms: 0.310063
|
|
177
|
-
type: 'test'
|
|
178
|
-
...
|
|
179
|
-
# Subtest: MCP tool floods receive actionable rate-limit errors
|
|
180
|
-
ok 28 - MCP tool floods receive actionable rate-limit errors
|
|
181
|
-
---
|
|
182
|
-
duration_ms: 164.126661
|
|
183
|
-
type: 'test'
|
|
184
|
-
...
|
|
185
|
-
# Subtest: live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
186
|
-
ok 29 - live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation # SKIP
|
|
187
|
-
---
|
|
188
|
-
duration_ms: 0.681806
|
|
189
|
-
type: 'test'
|
|
190
|
-
...
|
|
191
|
-
# Subtest: live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
192
|
-
ok 30 - live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation # SKIP
|
|
193
|
-
---
|
|
194
|
-
duration_ms: 0.10272
|
|
195
|
-
type: 'test'
|
|
196
|
-
...
|
|
197
|
-
# Subtest: live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
198
|
-
ok 31 - live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation # SKIP
|
|
199
|
-
---
|
|
200
|
-
duration_ms: 0.094751
|
|
201
|
-
type: 'test'
|
|
202
|
-
...
|
|
203
|
-
# cursor: delayed shutdown released session lock; OMEMO snapshot unchanged
|
|
204
|
-
# Subtest: cursor shutdown waits for session cleanup and releases its own lock without changing keys
|
|
205
|
-
ok 32 - cursor shutdown waits for session cleanup and releases its own lock without changing keys
|
|
206
|
-
---
|
|
207
|
-
duration_ms: 1418.405871
|
|
208
|
-
type: 'test'
|
|
209
|
-
...
|
|
210
|
-
# codex: delayed shutdown released session lock; OMEMO snapshot unchanged
|
|
211
|
-
# Subtest: codex shutdown waits for session cleanup and releases its own lock without changing keys
|
|
212
|
-
ok 33 - codex shutdown waits for session cleanup and releases its own lock without changing keys
|
|
213
|
-
---
|
|
214
|
-
duration_ms: 1348.202894
|
|
215
|
-
type: 'test'
|
|
216
|
-
...
|
|
217
|
-
# Subtest: MCP shutdown finishes saving an in-flight verification response before exiting
|
|
218
|
-
ok 34 - MCP shutdown finishes saving an in-flight verification response before exiting
|
|
219
|
-
---
|
|
220
|
-
duration_ms: 1400.553927
|
|
221
|
-
type: 'test'
|
|
222
|
-
...
|
|
223
|
-
# Subtest: enrollment saves durable credential before XMPP, publishes before callback, and resumes without redemption
|
|
224
|
-
ok 35 - enrollment saves durable credential before XMPP, publishes before callback, and resumes without redemption
|
|
225
|
-
---
|
|
226
|
-
duration_ms: 112.152342
|
|
227
|
-
type: 'test'
|
|
228
|
-
...
|
|
229
|
-
# Subtest: origins, host identities and installations cannot be substituted
|
|
230
|
-
ok 36 - origins, host identities and installations cannot be substituted
|
|
231
|
-
---
|
|
232
|
-
duration_ms: 43.608147
|
|
233
|
-
type: 'test'
|
|
234
|
-
...
|
|
235
|
-
# Subtest: expiration, replay, wrong installation and revocation return safe actions
|
|
236
|
-
ok 37 - expiration, replay, wrong installation and revocation return safe actions
|
|
237
|
-
---
|
|
238
|
-
duration_ms: 151.621228
|
|
239
|
-
type: 'test'
|
|
240
|
-
...
|
|
241
|
-
# Subtest: background heartbeats preserve the stream and retry outages with bounded backoff and safe diagnostics
|
|
242
|
-
ok 38 - background heartbeats preserve the stream and retry outages with bounded backoff and safe diagnostics
|
|
243
|
-
---
|
|
244
|
-
duration_ms: 164.378704
|
|
245
|
-
type: 'test'
|
|
246
|
-
...
|
|
247
|
-
# Subtest: failed initial connection recovers in background without another redemption and close cancels retries
|
|
248
|
-
ok 39 - failed initial connection recovers in background without another redemption and close cancels retries
|
|
249
|
-
---
|
|
250
|
-
duration_ms: 299.179305
|
|
251
|
-
type: 'test'
|
|
252
|
-
...
|
|
253
|
-
# Subtest: failed XMPP ping closes only the broken stream and obtains a fresh grant on automatic retry
|
|
254
|
-
ok 40 - failed XMPP ping closes only the broken stream and obtains a fresh grant on automatic retry
|
|
255
|
-
---
|
|
256
|
-
duration_ms: 99.331076
|
|
257
|
-
type: 'test'
|
|
258
|
-
...
|
|
259
|
-
# Subtest: shutdown waits for a background grant request and prevents a new session after closing
|
|
260
|
-
ok 41 - shutdown waits for a background grant request and prevents a new session after closing
|
|
261
|
-
---
|
|
262
|
-
duration_ms: 128.487294
|
|
263
|
-
type: 'test'
|
|
264
|
-
...
|
|
265
|
-
# Subtest: failed OMEMO registration preserves credential, suppresses connected callback, and resumes
|
|
266
|
-
ok 42 - failed OMEMO registration preserves credential, suppresses connected callback, and resumes
|
|
267
|
-
---
|
|
268
|
-
duration_ms: 156.627335
|
|
269
|
-
type: 'test'
|
|
270
|
-
...
|
|
271
|
-
# Subtest: lost redemption and failed persistence never claim success
|
|
272
|
-
ok 43 - lost redemption and failed persistence never claim success
|
|
273
|
-
---
|
|
274
|
-
duration_ms: 31.813949
|
|
275
|
-
type: 'test'
|
|
276
|
-
...
|
|
277
|
-
# Subtest: unsafe permissions, symlinks and concurrent writes fail closed
|
|
278
|
-
ok 44 - unsafe permissions, symlinks and concurrent writes fail closed
|
|
279
|
-
---
|
|
280
|
-
duration_ms: 2.212376
|
|
281
|
-
type: 'test'
|
|
282
|
-
...
|
|
283
|
-
# Subtest: HTTP policy rejects non-loopback cleartext, URL credentials and redirects
|
|
284
|
-
ok 45 - HTTP policy rejects non-loopback cleartext, URL credentials and redirects
|
|
285
|
-
---
|
|
286
|
-
duration_ms: 15.866179
|
|
287
|
-
type: 'test'
|
|
288
|
-
...
|
|
289
|
-
# Subtest: existing native OMEMO identity survives reload; corrupt state is never regenerated
|
|
290
|
-
ok 46 - existing native OMEMO identity survives reload; corrupt state is never regenerated
|
|
291
|
-
---
|
|
292
|
-
duration_ms: 34.571539
|
|
293
|
-
type: 'test'
|
|
294
|
-
...
|
|
295
|
-
# Subtest: unsafe native OMEMO state permissions fail closed
|
|
296
|
-
ok 47 - unsafe native OMEMO state permissions fail closed
|
|
297
|
-
---
|
|
298
|
-
duration_ms: 5.659882
|
|
299
|
-
type: 'test'
|
|
300
|
-
...
|
|
301
|
-
# Subtest: a 1.x classic OMEMO identity is refused with re-enrollment guidance and left untouched
|
|
302
|
-
ok 48 - a 1.x classic OMEMO identity is refused with re-enrollment guidance and left untouched
|
|
303
|
-
---
|
|
304
|
-
duration_ms: 0.932707
|
|
305
|
-
type: 'test'
|
|
306
|
-
...
|
|
307
|
-
# Subtest: installed MCP tools verify via HTTP and never expose response credentials
|
|
308
|
-
ok 49 - installed MCP tools verify via HTTP and never expose response credentials
|
|
309
|
-
---
|
|
310
|
-
duration_ms: 239.339785
|
|
311
|
-
type: 'test'
|
|
312
|
-
...
|
|
313
|
-
# Subtest: cursor packaged MCP rejects a locally revoked identity without crashing or reporting connection
|
|
314
|
-
ok 50 - cursor packaged MCP rejects a locally revoked identity without crashing or reporting connection
|
|
315
|
-
---
|
|
316
|
-
duration_ms: 211.265405
|
|
317
|
-
type: 'test'
|
|
318
|
-
...
|
|
319
|
-
# Subtest: codex packaged MCP rejects a locally revoked identity without crashing or reporting connection
|
|
320
|
-
ok 51 - codex packaged MCP rejects a locally revoked identity without crashing or reporting connection
|
|
321
|
-
---
|
|
322
|
-
duration_ms: 246.65472
|
|
323
|
-
type: 'test'
|
|
324
|
-
...
|
|
325
|
-
# Subtest: a session replaced by a newer login elsewhere is never reconnected automatically
|
|
326
|
-
ok 52 - a session replaced by a newer login elsewhere is never reconnected automatically
|
|
327
|
-
---
|
|
328
|
-
duration_ms: 61.40213
|
|
329
|
-
type: 'test'
|
|
330
|
-
...
|
|
331
|
-
# Subtest: release version matches all manifests
|
|
332
|
-
ok 53 - release version matches all manifests
|
|
333
|
-
---
|
|
334
|
-
duration_ms: 8.270462
|
|
335
|
-
type: 'test'
|
|
336
|
-
...
|
|
337
|
-
# Subtest: npm tarball installs the runtime with official libsignal and its thin plugins start it
|
|
338
|
-
ok 54 - npm tarball installs the runtime with official libsignal and its thin plugins start it
|
|
339
|
-
---
|
|
340
|
-
duration_ms: 3028.215999
|
|
341
|
-
type: 'test'
|
|
342
|
-
...
|
|
343
|
-
# Subtest: redeem and claim proofs match the API interoperability vectors byte for byte
|
|
344
|
-
ok 55 - redeem and claim proofs match the API interoperability vectors byte for byte
|
|
345
|
-
---
|
|
346
|
-
duration_ms: 2.315388
|
|
347
|
-
type: 'test'
|
|
348
|
-
...
|
|
349
|
-
# Subtest: runtime metadata is bounded display text without control characters
|
|
350
|
-
ok 56 - runtime metadata is bounded display text without control characters
|
|
351
|
-
---
|
|
352
|
-
duration_ms: 0.326473
|
|
353
|
-
type: 'test'
|
|
354
|
-
...
|
|
355
|
-
# Subtest: redeem refuses malformed codes before any request and persists the key before redeeming
|
|
356
|
-
ok 57 - redeem refuses malformed codes before any request and persists the key before redeeming
|
|
357
|
-
---
|
|
358
|
-
duration_ms: 2.742371
|
|
359
|
-
type: 'test'
|
|
360
|
-
...
|
|
361
|
-
# Subtest: claim polls every 5 s while pending, honours Retry-After, and ends at the local deadline
|
|
362
|
-
ok 58 - claim polls every 5 s while pending, honours Retry-After, and ends at the local deadline
|
|
363
|
-
---
|
|
364
|
-
duration_ms: 2.207037
|
|
365
|
-
type: 'test'
|
|
366
|
-
...
|
|
367
|
-
# Subtest: a confirmed pairing saves the credential locally and returns no secret
|
|
368
|
-
ok 59 - a confirmed pairing saves the credential locally and returns no secret
|
|
369
|
-
---
|
|
370
|
-
duration_ms: 129.909655
|
|
371
|
-
type: 'test'
|
|
372
|
-
...
|
|
373
|
-
# Subtest: a refused code or an unconfirmed pairing leaves no partial identity
|
|
374
|
-
ok 60 - a refused code or an unconfirmed pairing leaves no partial identity
|
|
375
|
-
---
|
|
376
|
-
duration_ms: 168.624755
|
|
377
|
-
type: 'test'
|
|
378
|
-
...
|
|
379
|
-
# Subtest: a pairing interrupted after redeem resumes with the same key and poll secret
|
|
380
|
-
ok 61 - a pairing interrupted after redeem resumes with the same key and poll secret
|
|
381
|
-
---
|
|
382
|
-
duration_ms: 166.251487
|
|
383
|
-
type: 'test'
|
|
384
|
-
...
|
|
385
|
-
# Subtest: codex plugin is a thin wrapper that starts this runtime and records its own provider
|
|
386
|
-
ok 62 - codex plugin is a thin wrapper that starts this runtime and records its own provider
|
|
387
|
-
---
|
|
388
|
-
duration_ms: 300.733626
|
|
389
|
-
type: 'test'
|
|
390
|
-
...
|
|
391
|
-
# Subtest: cursor plugin is a thin wrapper that starts this runtime and records its own provider
|
|
392
|
-
ok 63 - cursor plugin is a thin wrapper that starts this runtime and records its own provider
|
|
393
|
-
---
|
|
394
|
-
duration_ms: 211.864679
|
|
395
|
-
type: 'test'
|
|
396
|
-
...
|
|
397
|
-
# Subtest: claude plugin is a thin wrapper that starts this runtime and records its own provider
|
|
398
|
-
ok 64 - claude plugin is a thin wrapper that starts this runtime and records its own provider
|
|
399
|
-
---
|
|
400
|
-
duration_ms: 246.100826
|
|
401
|
-
type: 'test'
|
|
402
|
-
...
|
|
403
|
-
# Subtest: Claude, Cursor and Codex MCP processes have independent stores and ports
|
|
404
|
-
ok 65 - Claude, Cursor and Codex MCP processes have independent stores and ports
|
|
405
|
-
---
|
|
406
|
-
duration_ms: 185.838794
|
|
407
|
-
type: 'test'
|
|
408
|
-
...
|
|
409
|
-
# Subtest: installer refuses to overwrite an existing installation
|
|
410
|
-
ok 66 - installer refuses to overwrite an existing installation
|
|
411
|
-
---
|
|
412
|
-
duration_ms: 63.97227
|
|
413
|
-
type: 'test'
|
|
414
|
-
...
|
|
415
|
-
# Subtest: store validates messages, orders events and bounds retention
|
|
416
|
-
ok 67 - store validates messages, orders events and bounds retention
|
|
417
|
-
---
|
|
418
|
-
duration_ms: 2.471668
|
|
419
|
-
type: 'test'
|
|
420
|
-
...
|
|
421
|
-
# Subtest: loopback viewer serves assets and blocks cross-origin writes and traversal
|
|
422
|
-
ok 68 - loopback viewer serves assets and blocks cross-origin writes and traversal
|
|
423
|
-
---
|
|
424
|
-
duration_ms: 54.258087
|
|
425
|
-
type: 'test'
|
|
426
|
-
...
|
|
427
|
-
# Subtest: SSE delivers snapshot and live message, reconnect recovers snapshot
|
|
428
|
-
ok 69 - SSE delivers snapshot and live message, reconnect recovers snapshot
|
|
429
|
-
---
|
|
430
|
-
duration_ms: 263.314726
|
|
431
|
-
type: 'test'
|
|
432
|
-
...
|
|
433
|
-
# Subtest: MCP starts HTTP, records events and shuts down on stdin EOF
|
|
434
|
-
ok 70 - MCP starts HTTP, records events and shuts down on stdin EOF
|
|
435
|
-
---
|
|
436
|
-
duration_ms: 185.760904
|
|
437
|
-
type: 'test'
|
|
438
|
-
...
|
|
439
|
-
# Subtest: late history pages cannot duplicate live events, resurrect evictions or replace a new connection
|
|
440
|
-
ok 71 - late history pages cannot duplicate live events, resurrect evictions or replace a new connection
|
|
441
|
-
---
|
|
442
|
-
duration_ms: 1.648573
|
|
443
|
-
type: 'test'
|
|
444
|
-
...
|
|
445
|
-
# Subtest: history loading pins the snapshot sequence, follows cursors and respects cancellation
|
|
446
|
-
ok 72 - history loading pins the snapshot sequence, follows cursors and respects cancellation
|
|
447
|
-
---
|
|
448
|
-
duration_ms: 1.172069
|
|
449
|
-
type: 'test'
|
|
450
|
-
...
|
|
451
|
-
# Subtest: rate-limited history loading resumes from the same page instead of restarting the stream
|
|
452
|
-
ok 73 - rate-limited history loading resumes from the same page instead of restarting the stream
|
|
453
|
-
---
|
|
454
|
-
duration_ms: 1002.250669
|
|
455
|
-
type: 'test'
|
|
456
|
-
...
|
|
457
|
-
1..73
|
|
458
|
-
# tests 73
|
|
459
|
-
# suites 0
|
|
460
|
-
# pass 70
|
|
461
|
-
# fail 0
|
|
462
|
-
# cancelled 0
|
|
463
|
-
# skipped 3
|
|
464
|
-
# todo 0
|
|
465
|
-
# duration_ms 4379.160963
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
$ # stack: lbframe/wacando main f21f742 (incl. #105, #106 one session per agent) + PR #108 head f74e5e7 merged locally + PR #109; ejabberd reconfigured from that tree's infra/ejabberd/ci-up.sh; fresh DB wacando_agentside_int
|
|
2
|
-
21eb297 Merge remote-tracking branch 'origin/fix/39-desktop-relay-attribution' into HEAD
|
|
3
|
-
81ed6c9 local integration: main + #108
|
|
4
|
-
f21f742 Merge pull request #106 from lbframe/feat/15-native-presence
|
|
5
|
-
f74e5e7 fix(desktop): attribute policy relays in the observer (#39)
|
|
6
|
-
$ WACANDO_CHECKOUT=<work>/wacando-int ... tsx scripts/e2e-desktop-observer.mts
|
|
7
|
-
PASS 01 two owners signed up (5ce148a1-59b7-44c5-aad7-627763ac9c47, aed01f77-96d9-4898-ae01-a9612bc260c7)
|
|
8
|
-
PASS 02 CLI `wacando-agent pair` -> @e2ea05d175d12c/bot (service), owner confirmed after checking the key fingerprint
|
|
9
|
-
PASS 03 MCP tool `wacando_pair` -> @e2eb80bf6b6df6/codex (human), resumed by a second call without code
|
|
10
|
-
PASS 04 contact invitation accepted by the recipient owner
|
|
11
|
-
PASS 05 both runtimes connected (grant, native OMEMO device, presence echo) via the SDK
|
|
12
|
-
PASS 06 propose -> request cnv_1c43d27b-d0ef-43db-8a40-5f290c4d69ce created; first message refused fail-closed (owners' desktop devices not published yet)
|
|
13
|
-
PASS 07 recipient agent sees nothing of the request before acceptance (list empty, read/send refused)
|
|
14
|
-
PASS 08 both owners' desktop ObserverHubs enrolled per-installation devices (dev_f155edc2bab924646b1d7720c0289504, dev_dcc50d451ef07f7cdf411723a950f55c), published official-libsignal bundles, were activated and observe the room
|
|
15
|
-
PASS 09 first message held by the policy component (stanza om-ff20570e4c6a34e7), status visible to the agent
|
|
16
|
-
PASS 10 requester owner approved the exact held ciphertext (locally recomputed digest) -> relayed
|
|
17
|
-
PASS 11 recipient owner saw the request in the consent inbox and accepted it via the API
|
|
18
|
-
PASS 12 recipient agent (human mode, room member) decrypted the approved first message from the archive
|
|
19
|
-
PASS 13 human-mode reply sent without approval; service agent decrypted it from a policy delivery
|
|
20
|
-
PASS 14 service-mode message held until its owner approved it, then delivered and decrypted
|
|
21
|
-
PASS 15 alice's desktop ObserverHub (official libsignal) decrypted all 3 messages (3 entries)
|
|
22
|
-
PASS 16 bob's desktop ObserverHub (official libsignal) decrypted all 3 messages (3 entries)
|
|
23
|
-
PASS 17 after STOP by an owner both agents are refused explicitly; nothing is sent
|
|
24
|
-
canary-scan: dumping mnesia via /home/ejabberd/bin/ejabberdctl
|
|
25
|
-
canary-scan: scanning dump + logs + spool for canary
|
|
26
|
-
canary-scan: total occurrences of canary: 0
|
|
27
|
-
canary-scan: PASS — plaintext absent from server-side storage
|
|
28
|
-
PASS 18 plaintext canary absent from ejabberd storage (MAM, offline, pubsub, logs), API/policy logs and runtime output
|
|
29
|
-
E2E RESULT: PASS
|
|
30
|
-
exit=0
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
$ WACANDO_CHECKOUT=<work>/wacando-main (main 50b9d26, desktop WITHOUT lbframe/wacando#109) ... tsx scripts/e2e-desktop-observer.mts
|
|
2
|
-
PASS 01 two owners signed up (656f8a56-c419-40ff-8b92-f6fa606202a7, 64156b8c-73e8-457a-809a-613193ff5f21)
|
|
3
|
-
PASS 02 CLI `wacando-agent pair` -> @e2ea659065e8fe/bot (service), owner confirmed after checking the key fingerprint
|
|
4
|
-
PASS 03 MCP tool `wacando_pair` -> @e2ebd58690e393/codex (human), resumed by a second call without code
|
|
5
|
-
PASS 04 contact invitation accepted by the recipient owner
|
|
6
|
-
PASS 05 both runtimes connected (grant, native OMEMO device, presence echo) via the SDK
|
|
7
|
-
PASS 06 propose -> request cnv_da62e01b-7cbe-459c-8880-4d2793b08a84 created; first message refused fail-closed (owners' desktop devices not published yet)
|
|
8
|
-
PASS 07 recipient agent sees nothing of the request before acceptance (list empty, read/send refused)
|
|
9
|
-
PASS 08 both owners' desktop ObserverHubs published official-libsignal devices and observe the room
|
|
10
|
-
PASS 09 first message held by the policy component (stanza om-e7c23aaa70b855bd), status visible to the agent
|
|
11
|
-
PASS 10 requester owner approved the exact held ciphertext (locally recomputed digest) -> relayed
|
|
12
|
-
PASS 11 recipient owner saw the request in the consent inbox and accepted it via the API
|
|
13
|
-
PASS 12 recipient agent (human mode, room member) decrypted the approved first message from the archive
|
|
14
|
-
PASS 13 human-mode reply sent without approval; service agent decrypted it from a policy delivery
|
|
15
|
-
PASS 14 service-mode message held until its owner approved it, then delivered and decrypted
|
|
16
|
-
DIAG alice: status=observing entries=3 undecryptable=2 first=false reply=true second=false
|
|
17
|
-
Error: timeout: alice's desktop decrypts the 3 messages
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
$ (wacando-relay = lbframe/wacando#109 head f74e5e7; API+policy = main 50b9d26)
|
|
2
|
-
$ WACANDO_CHECKOUT=<work>/wacando-relay WACANDO_LIVE_TEST_ORIGIN=http://localhost:43001 WACANDO_XMPP_SERVICE=ws://localhost:45280/ws EJABBERD_CONTAINER=wacando-agentside-ejabberd WACANDO_SERVER_LOGS=<work>/api.log:<work>/policy.log tsx scripts/e2e-desktop-observer.mts
|
|
3
|
-
PASS 01 two owners signed up (a2174112-2ac1-4498-b78b-52aa3ff289d7, dc6851ba-10eb-45f6-8fd6-07d4c94fc0cd)
|
|
4
|
-
PASS 02 CLI `wacando-agent pair` -> @e2ea43673623f5/bot (service), owner confirmed after checking the key fingerprint
|
|
5
|
-
PASS 03 MCP tool `wacando_pair` -> @e2ebc8f13ad47a/codex (human), resumed by a second call without code
|
|
6
|
-
PASS 04 contact invitation accepted by the recipient owner
|
|
7
|
-
PASS 05 both runtimes connected (grant, native OMEMO device, presence echo) via the SDK
|
|
8
|
-
PASS 06 propose -> request cnv_99bd97cc-5fbf-4fc4-a299-ef9ca023cd73 created; first message refused fail-closed (owners' desktop devices not published yet)
|
|
9
|
-
PASS 07 recipient agent sees nothing of the request before acceptance (list empty, read/send refused)
|
|
10
|
-
PASS 08 both owners' desktop ObserverHubs published official-libsignal devices and observe the room
|
|
11
|
-
PASS 09 first message held by the policy component (stanza om-8e76cd6fd1c71e55), status visible to the agent
|
|
12
|
-
PASS 10 requester owner approved the exact held ciphertext (locally recomputed digest) -> relayed
|
|
13
|
-
PASS 11 recipient owner saw the request in the consent inbox and accepted it via the API
|
|
14
|
-
PASS 12 recipient agent (human mode, room member) decrypted the approved first message from the archive
|
|
15
|
-
PASS 13 human-mode reply sent without approval; service agent decrypted it from a policy delivery
|
|
16
|
-
PASS 14 service-mode message held until its owner approved it, then delivered and decrypted
|
|
17
|
-
PASS 15 alice's desktop ObserverHub (official libsignal) decrypted all 3 messages (3 entries)
|
|
18
|
-
PASS 16 bob's desktop ObserverHub (official libsignal) decrypted all 3 messages (3 entries)
|
|
19
|
-
PASS 17 after STOP by an owner both agents are refused explicitly; nothing is sent
|
|
20
|
-
canary-scan: dumping mnesia via /home/ejabberd/bin/ejabberdctl
|
|
21
|
-
canary-scan: scanning dump + logs + spool for canary
|
|
22
|
-
canary-scan: total occurrences of canary: 0
|
|
23
|
-
canary-scan: PASS — plaintext absent from server-side storage
|
|
24
|
-
PASS 18 plaintext canary absent from ejabberd storage (MAM, offline, pubsub, logs), API/policy logs and runtime output
|
|
25
|
-
E2E RESULT: PASS
|
|
26
|
-
exit=0
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# stack: main f21f742 + #108 + #109 (see e2e-desktop-observer-human-devices.txt)
|
|
2
|
-
$ WACANDO_LIVE_TEST_ORIGIN=http://localhost:43001 node --test tests/onboarding-live.test.mjs
|
|
3
|
-
# Subtest: live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
4
|
-
ok 1 - live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
5
|
-
# Subtest: live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
6
|
-
ok 2 - live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
7
|
-
# Subtest: live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
8
|
-
ok 3 - live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
9
|
-
# tests 3
|
|
10
|
-
# suites 0
|
|
11
|
-
# pass 3
|
|
12
|
-
# fail 0
|
|
13
|
-
# cancelled 0
|
|
14
|
-
# skipped 0
|
|
15
|
-
# todo 0
|
|
16
|
-
# duration_ms 7445.725894
|
|
17
|
-
$ WACANDO_LIVE_TEST_ORIGIN=http://localhost:43001 node scripts/check-daemon-live.mjs
|
|
18
|
-
enrolled @daemon_72904bf9221a/bot for host "cli" (synthetic owner)
|
|
19
|
-
status: [{"agentId":"agt_ccb280ca-9d76-426c-834c-43ad17b677cc","handle":"@daemon_72904bf9221a/bot","origin":"http://localhost:43001","mode":"human","revoked":false,"connection":"disconnected"}]
|
|
20
|
-
daemon: connected (grant, native OMEMO publication, presence echo, API callback) and running
|
|
21
|
-
second daemon on the same identity: refused by the identity lock
|
|
22
|
-
daemon: SIGTERM -> clean exit 0, lock released
|
|
23
|
-
daemon restarted on the same saved identity and keys: connected again
|
|
24
|
-
exit=0
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
$ WACANDO_LIVE_TEST_ORIGIN=http://localhost:43001 node --test tests/onboarding-live.test.mjs
|
|
2
|
-
# Subtest: live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
3
|
-
ok 1 - live dev API: codex installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
4
|
-
# Subtest: live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
5
|
-
ok 2 - live dev API: cursor installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
6
|
-
# Subtest: live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
7
|
-
ok 3 - live dev API: claude installed runtime verifies, enrolls, publishes OMEMO, restarts and stops on revocation
|
|
8
|
-
# tests 3
|
|
9
|
-
# suites 0
|
|
10
|
-
# pass 3
|
|
11
|
-
# fail 0
|
|
12
|
-
# cancelled 0
|
|
13
|
-
# skipped 0
|
|
14
|
-
# todo 0
|
|
15
|
-
# duration_ms 4407.393019
|
|
16
|
-
$ WACANDO_LIVE_TEST_ORIGIN=http://localhost:43001 node scripts/check-daemon-live.mjs
|
|
17
|
-
enrolled @daemon_097025fda819/bot for host "cli" (synthetic owner)
|
|
18
|
-
status: [{"agentId":"agt_2497bb54-3c93-42e7-88a2-3d594bb9ce18","handle":"@daemon_097025fda819/bot","origin":"http://localhost:43001","mode":"human","revoked":false,"connection":"disconnected"}]
|
|
19
|
-
daemon: connected (grant, native OMEMO publication, presence echo, API callback) and running
|
|
20
|
-
second daemon on the same identity: refused by the identity lock
|
|
21
|
-
daemon: SIGTERM -> clean exit 0, lock released
|
|
22
|
-
daemon restarted on the same saved identity and keys: connected again
|
|
23
|
-
exit=0
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# #12 review fixes (independent review FAIL on 75eb582)
|
|
2
|
-
|
|
3
|
-
| Finding | Fix | Proof |
|
|
4
|
-
|---|---|---|
|
|
5
|
-
| BLOCKER: a replaced session logs back in (heartbeat reopened a new session before the replaced check) | `<conflict/>` marks the identity `replaced` at once (`onReplaced`); `open()` refuses first, so heartbeats, retries and further connects in the process throw `SESSION_REPLACED`; the daemon exits 3 | unit: every fake connection has its own flag, both orders (stream error first / heartbeat only) open exactly one session (`check.txt`); live: `session-replacement-live.txt`: two copies of one identity, the newer wins, the older exits 3, the newer is still connected after 135 s with 3+ heartbeats, ejabberd logs exactly 1 "Replaced by new connection" for the whole run |
|
|
6
|
-
| MEDIUM a: `usr_` fallback on a non-JSON 404 | removed: a server without discovery fails closed (`noDiscovery`) | unit test |
|
|
7
|
-
| MEDIUM b: owner check always true | discovery must name exactly the conversation's two agents and observers of BOTH owners | unit tests |
|
|
8
|
-
| MEDIUM c: daemon client stuck on the old session | `onSession` rebinds the conversation client to the new session (fresh origin tracker, rooms re-joined on demand, stanzas of the new session buffered until then); the old provider is dropped | code; E2E unchanged 18/18 |
|
|
9
|
-
| MEDIUM d: `install:claude` needs `wacando-agent` on PATH | `scripts/install-claude.mjs` stages with `wacando-agent install --host claude` (absolute runtime path) before registering | code; in-repo use documented |
|
|
10
|
-
| LOW: message text in argv | `-` reads it from stdin | `--help` |
|
|
11
|
-
| LOW: unbounded sent-text cache | bounded to 1000 entries | code |
|
|
12
|
-
|
|
13
|
-
Not changed (LOW, documented): `wacando_wait` has no cursor (read covers the gap);
|
|
14
|
-
`pair()` drops the key when a redeem response is lost (code consumed, re-pair);
|
|
15
|
-
the MCP surface keeps the viewer and v1 onboarding tools.
|
|
16
|
-
|
|
17
|
-
Stack for the live runs: lbframe/wacando PR #108 head `6198d92` (includes main
|
|
18
|
-
`f21f742`, #106) + PR #109 merged locally; ejabberd 26.07 from that tree's
|
|
19
|
-
`infra/ejabberd/ci-up.sh`; fresh Postgres DB; API + policy from that tree.
|
|
20
|
-
E2E `e2e-desktop-observer.txt`: **20/20 PASS** (per-installation `dev_` desktops).
|
|
21
|
-
Steps 17–18 answer the #108 M5 requirement (several desktops per owner): owner A
|
|
22
|
-
enrolls a second desktop; the next message of the human-mode agent carries a key
|
|
23
|
-
for BOTH of A's `dev_` JIDs (read from the outgoing stanza) and both desktops
|
|
24
|
-
decrypt it; A revokes the second desktop (`revocation: enforced`); the next
|
|
25
|
-
message carries no key for the revoked JID, still one for the remaining desktop,
|
|
26
|
-
which decrypts it. The recipient set comes from
|
|
27
|
-
`GET /v1/conversations/:id/recipients` before every encryption
|
|
28
|
-
(`ConversationClient.recipients`), never from room occupants or affiliations.
|
|
29
|
-
`onboarding-live.txt`: 3/3. `check.txt`: 76 tests, 73 pass, 0 fail, 3 skipped.
|
|
30
|
-
`check-mcp.txt`: Inspector 2.7.0, 3 hosts.
|