@staix/agent-hub 0.27.0 → 0.29.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 (106) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +11 -3
  3. package/docs/agent-notes/adapters.md +4 -2
  4. package/docs/agent-notes/bus.md +4 -4
  5. package/docs/agent-notes/daemon.md +9 -3
  6. package/docs/agent-notes/local-worker.md +3 -1
  7. package/docs/agent-notes/tasks.md +7 -0
  8. package/docs/agent-notes/tests.md +7 -5
  9. package/docs/design/adapters.md +76 -0
  10. package/docs/design/agent-hub-architecture.md +67 -0
  11. package/docs/design/agent-hub.md +52 -0
  12. package/docs/design/bus.md +48 -0
  13. package/docs/design/task-board.md +86 -0
  14. package/docs/dogfood.md +21 -3
  15. package/docs/operations.md +370 -12
  16. package/docs/profiles.md +1 -0
  17. package/docs/quickstart.md +19 -3
  18. package/docs/sdlc.md +2 -2
  19. package/docs/security.md +24 -4
  20. package/docs/smoke.md +2 -0
  21. package/docs/specs/2026-09-19-agent-hub-design.md +2 -0
  22. package/docs/verification/2026-10-31-codex-0166-reviewer-isolation.md +2 -0
  23. package/docs/verification/2026-11-02-0.28.0.md +54 -0
  24. package/docs/verification/2026-11-02-autonomy-t4.md +39 -0
  25. package/docs/verification/2026-11-02-codex-0166-reviewer-tool-call.md +53 -0
  26. package/docs/verification/2026-11-02-control-write-after.json +139 -0
  27. package/docs/verification/2026-11-02-control-write-baseline.json +127 -0
  28. package/docs/verification/2026-11-02-control-write-guarded.json +127 -0
  29. package/docs/verification/2026-11-02-control-write-outcomes.md +65 -0
  30. package/docs/verification/2026-11-02-orca-1.4.245-cli-contract.md +51 -0
  31. package/docs/verification/2026-11-03-0.29.0.md +59 -0
  32. package/docs/verification/2026-11-03-control-write-stall-windows.json +241 -0
  33. package/docs/verification/2026-11-03-control-write-stall-windows.md +20 -0
  34. package/docs/verification/2026-11-03-live-board-latency.json +556 -0
  35. package/docs/verification/2026-11-03-live-board-latency.md +64 -0
  36. package/docs/verified.json +14 -14
  37. package/package.json +2 -2
  38. package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
  39. package/plugins/agent-hub/server.js +857 -125
  40. package/src/adapters/claude-channel.ts +12 -2
  41. package/src/adapters/compat.ts +1 -1
  42. package/src/adapters/definitions/native-cli-claude-setup.ts +31 -9
  43. package/src/adapters/definitions/native-cli-entry-jcode.ts +33 -0
  44. package/src/adapters/definitions/native-cli-entry-qwen.ts +2 -2
  45. package/src/adapters/jcode.ts +37 -4
  46. package/src/adapters/qwen-dual.ts +3 -2
  47. package/src/cli/agents.ts +4 -2
  48. package/src/cli/bench.ts +4 -2
  49. package/src/cli/board-read.ts +25 -0
  50. package/src/cli/claude-homes.ts +2 -2
  51. package/src/cli/console-state.ts +8 -3
  52. package/src/cli/help.ts +6 -5
  53. package/src/cli/identity.ts +9 -1
  54. package/src/cli/init-prompt.ts +179 -0
  55. package/src/cli/init-settings.ts +229 -0
  56. package/src/cli/init.ts +102 -9
  57. package/src/cli/launch.ts +3 -1
  58. package/src/cli/main.ts +106 -35
  59. package/src/cli/output.ts +19 -0
  60. package/src/cli/recovery-package.ts +9 -0
  61. package/src/cli/setup-homes.ts +18 -3
  62. package/src/cli/specs.ts +150 -0
  63. package/src/cli/terminal-recovery.ts +35 -11
  64. package/src/hub/board.ts +59 -5
  65. package/src/hub/bus.ts +54 -7
  66. package/src/hub/child-process.ts +6 -4
  67. package/src/hub/config-apply.ts +4 -1
  68. package/src/hub/config-edit.ts +1 -1
  69. package/src/hub/config-tier.ts +1 -0
  70. package/src/hub/control-client.ts +43 -4
  71. package/src/hub/control-write-trace.ts +409 -0
  72. package/src/hub/cost-governance.ts +22 -6
  73. package/src/hub/crash.ts +20 -0
  74. package/src/hub/daemon.ts +470 -98
  75. package/src/hub/delivery-hints.ts +6 -3
  76. package/src/hub/delivery-journal.ts +14 -3
  77. package/src/hub/hub-tools.ts +10 -6
  78. package/src/hub/peers.ts +1 -1
  79. package/src/hub/review-brief.ts +18 -0
  80. package/src/hub/routing.ts +14 -3
  81. package/src/hub/runtime-capture-prune.ts +4 -1
  82. package/src/hub/sdlc-release-authorization.ts +13 -4
  83. package/src/hub/sdlc-release.ts +23 -10
  84. package/src/hub/sdlc.ts +15 -2
  85. package/src/hub/settings.ts +2 -0
  86. package/src/hub/specs-config.ts +43 -0
  87. package/src/hub/specs-task.ts +108 -0
  88. package/src/hub/specs.ts +1008 -0
  89. package/src/hub/task-list-page.ts +75 -0
  90. package/src/hub/task-sweep.ts +10 -1
  91. package/src/hub/task-worktree.ts +331 -0
  92. package/src/hub/tasks.ts +606 -53
  93. package/src/hub/terminal-open.ts +10 -5
  94. package/src/hub/tool-request.ts +131 -0
  95. package/src/local/deny.ts +49 -0
  96. package/src/local/tools.ts +4 -2
  97. package/src/memory/brief.ts +5 -0
  98. package/src/memory/client.ts +5 -2
  99. package/src/ui/office-model.ts +17 -1
  100. package/src/ui/office-space.ts +1 -1
  101. package/templates/config.json +1 -0
  102. package/templates/profiles/dev.json +1 -0
  103. package/templates/profiles/general.json +1 -0
  104. package/templates/profiles/research.json +1 -0
  105. package/templates/profiles/writing.json +1 -0
  106. package/templates/specs.block.md +5 -0
@@ -0,0 +1,556 @@
1
+ {
2
+ "schema": "agent-hub.private-board-profile/v1",
3
+ "result": "not_reproduced",
4
+ "source_heads": {
5
+ "current": "e2ff29696d6a5ddb7a9232c4aadeb7fc97995794",
6
+ "v027": "1d0557d6ee7f6e1b48416e5905865704b35c9dbe"
7
+ },
8
+ "snapshot": {
9
+ "captured_at_utc": "2026-11-02T21:52:22.818871+00:00",
10
+ "bytes": 33292288,
11
+ "tasks": 670,
12
+ "history_bytes": 4719605,
13
+ "deliveries_by_state": {
14
+ "accepted": {
15
+ "count": 7,
16
+ "payload_bytes": 77970
17
+ },
18
+ "completed": {
19
+ "count": 1801,
20
+ "payload_bytes": 8697266
21
+ },
22
+ "discarded": {
23
+ "count": 111,
24
+ "payload_bytes": 121132
25
+ },
26
+ "failed": {
27
+ "count": 136,
28
+ "payload_bytes": 492788
29
+ }
30
+ }
31
+ },
32
+ "read_only_current": {
33
+ "tasks": 670,
34
+ "board_list_ms": 100.6,
35
+ "tasks_constructor_ms": 132.49,
36
+ "public_view_all_ms": 142.67,
37
+ "status_tasks_ms": 0.44,
38
+ "stalled_ms": 0.68,
39
+ "pending_offers_ms": 0.18
40
+ },
41
+ "runs": {
42
+ "current_core": {
43
+ "host": {
44
+ "platform": "darwin",
45
+ "arch": "arm64",
46
+ "bun": "1.4.3"
47
+ },
48
+ "startup": {
49
+ "totalMs": 330.14,
50
+ "includesStartupEventLogReads": true
51
+ },
52
+ "iterations_per_phase": 3,
53
+ "phases": [
54
+ {
55
+ "name": "review_approved",
56
+ "count": 3,
57
+ "p50Ms": 67.7,
58
+ "p95Ms": 78.34,
59
+ "outcomes": {
60
+ "ok": 3
61
+ },
62
+ "states": {
63
+ "approved": 3
64
+ },
65
+ "board": {
66
+ "listCalls": 21,
67
+ "listRows": 8103,
68
+ "listMs": 82.45,
69
+ "privacyProjectionCalls": 6,
70
+ "privacyProjectionRows": 84,
71
+ "privacyProjectionMs": 0.65,
72
+ "taskWriteCalls": 3,
73
+ "taskWriteMs": 108.65,
74
+ "deliveryCompleteCalls": 0,
75
+ "deliveryCompleteMs": 0
76
+ }
77
+ },
78
+ {
79
+ "name": "proposal_backlog",
80
+ "count": 3,
81
+ "p50Ms": 31.8,
82
+ "p95Ms": 32.22,
83
+ "outcomes": {
84
+ "ok": 3
85
+ },
86
+ "states": {
87
+ "backlog": 3
88
+ },
89
+ "board": {
90
+ "listCalls": 6,
91
+ "listRows": 2028,
92
+ "listMs": 19.74,
93
+ "privacyProjectionCalls": 6,
94
+ "privacyProjectionRows": 84,
95
+ "privacyProjectionMs": 0.85,
96
+ "taskWriteCalls": 3,
97
+ "taskWriteMs": 69.4,
98
+ "deliveryCompleteCalls": 0,
99
+ "deliveryCompleteMs": 0
100
+ }
101
+ },
102
+ {
103
+ "name": "proposal_claim",
104
+ "count": 3,
105
+ "p50Ms": 86.74,
106
+ "p95Ms": 87.95,
107
+ "outcomes": {
108
+ "ok": 3
109
+ },
110
+ "states": {
111
+ "in_progress": 3
112
+ },
113
+ "board": {
114
+ "listCalls": 33,
115
+ "listRows": 16254,
116
+ "listMs": 159.76,
117
+ "privacyProjectionCalls": 15,
118
+ "privacyProjectionRows": 5364,
119
+ "privacyProjectionMs": 3.62,
120
+ "taskWriteCalls": 9,
121
+ "taskWriteMs": 157.19,
122
+ "deliveryCompleteCalls": 0,
123
+ "deliveryCompleteMs": 0
124
+ }
125
+ },
126
+ {
127
+ "name": "delivery_complete",
128
+ "count": 3,
129
+ "p50Ms": 18,
130
+ "p95Ms": 18.62,
131
+ "outcomes": {
132
+ "completed": 3
133
+ },
134
+ "states": {
135
+ "completed": 3
136
+ },
137
+ "board": {
138
+ "listCalls": 0,
139
+ "listRows": 0,
140
+ "listMs": 0,
141
+ "privacyProjectionCalls": 0,
142
+ "privacyProjectionRows": 0,
143
+ "privacyProjectionMs": 0,
144
+ "taskWriteCalls": 0,
145
+ "taskWriteMs": 0,
146
+ "deliveryCompleteCalls": 3,
147
+ "deliveryCompleteMs": 51.38
148
+ }
149
+ }
150
+ ],
151
+ "harness_sha256": "6433ad66b7a696c0bfd6d176a72f6edf28b2446617d7b08467efd9fd7933dcec"
152
+ },
153
+ "v027_core": {
154
+ "host": {
155
+ "platform": "darwin",
156
+ "arch": "arm64",
157
+ "bun": "1.4.3"
158
+ },
159
+ "startup": {
160
+ "totalMs": 350.95,
161
+ "includesStartupEventLogReads": true
162
+ },
163
+ "iterations_per_phase": 3,
164
+ "phases": [
165
+ {
166
+ "name": "review_approved",
167
+ "count": 3,
168
+ "p50Ms": 89.69,
169
+ "p95Ms": 103.84,
170
+ "outcomes": {
171
+ "ok": 3
172
+ },
173
+ "states": {
174
+ "approved": 3
175
+ },
176
+ "board": {
177
+ "listCalls": 27,
178
+ "listRows": 12141,
179
+ "listMs": 131.62,
180
+ "privacyProjectionCalls": 0,
181
+ "privacyProjectionRows": 0,
182
+ "privacyProjectionMs": 0,
183
+ "taskWriteCalls": 3,
184
+ "taskWriteMs": 122.15,
185
+ "deliveryCompleteCalls": 0,
186
+ "deliveryCompleteMs": 0
187
+ }
188
+ },
189
+ {
190
+ "name": "proposal_backlog",
191
+ "count": 3,
192
+ "p50Ms": 28.07,
193
+ "p95Ms": 28.43,
194
+ "outcomes": {
195
+ "ok": 3
196
+ },
197
+ "states": {
198
+ "backlog": 3
199
+ },
200
+ "board": {
201
+ "listCalls": 6,
202
+ "listRows": 2028,
203
+ "listMs": 20.38,
204
+ "privacyProjectionCalls": 0,
205
+ "privacyProjectionRows": 0,
206
+ "privacyProjectionMs": 0,
207
+ "taskWriteCalls": 3,
208
+ "taskWriteMs": 77.6,
209
+ "deliveryCompleteCalls": 0,
210
+ "deliveryCompleteMs": 0
211
+ }
212
+ },
213
+ {
214
+ "name": "proposal_claim",
215
+ "count": 3,
216
+ "p50Ms": 81.62,
217
+ "p95Ms": 89.19,
218
+ "outcomes": {
219
+ "ok": 3
220
+ },
221
+ "states": {
222
+ "in_progress": 3
223
+ },
224
+ "board": {
225
+ "listCalls": 33,
226
+ "listRows": 16254,
227
+ "listMs": 175.25,
228
+ "privacyProjectionCalls": 0,
229
+ "privacyProjectionRows": 0,
230
+ "privacyProjectionMs": 0,
231
+ "taskWriteCalls": 9,
232
+ "taskWriteMs": 177.28,
233
+ "deliveryCompleteCalls": 0,
234
+ "deliveryCompleteMs": 0
235
+ }
236
+ },
237
+ {
238
+ "name": "delivery_complete",
239
+ "count": 3,
240
+ "p50Ms": 20.43,
241
+ "p95Ms": 20.68,
242
+ "outcomes": {
243
+ "completed": 3
244
+ },
245
+ "states": {
246
+ "completed": 3
247
+ },
248
+ "board": {
249
+ "listCalls": 0,
250
+ "listRows": 0,
251
+ "listMs": 0,
252
+ "privacyProjectionCalls": 0,
253
+ "privacyProjectionRows": 0,
254
+ "privacyProjectionMs": 0,
255
+ "taskWriteCalls": 0,
256
+ "taskWriteMs": 0,
257
+ "deliveryCompleteCalls": 3,
258
+ "deliveryCompleteMs": 56.9
259
+ }
260
+ }
261
+ ],
262
+ "harness_sha256": "94801693c03d665ee9e044222edb2383a79eac058e35b56b60aab0161de8ebb0"
263
+ },
264
+ "v027_matched_isolated": {
265
+ "host": {
266
+ "platform": "darwin",
267
+ "arch": "arm64",
268
+ "bun": "1.4.3"
269
+ },
270
+ "startup": {
271
+ "totalMs": 1525.36,
272
+ "includesStartupEventLogReads": true
273
+ },
274
+ "iterations_per_phase": 3,
275
+ "phases": [
276
+ {
277
+ "name": "review_approved",
278
+ "count": 3,
279
+ "p50Ms": 137.69,
280
+ "p95Ms": 146.96,
281
+ "outcomes": {
282
+ "ok": 3
283
+ },
284
+ "states": {
285
+ "approved": 3
286
+ },
287
+ "board": {
288
+ "listCalls": 42,
289
+ "listRows": 20217,
290
+ "listMs": 203.23,
291
+ "privacyProjectionCalls": 0,
292
+ "privacyProjectionRows": 0,
293
+ "privacyProjectionMs": 0,
294
+ "taskWriteCalls": 6,
295
+ "taskWriteMs": 181.76,
296
+ "deliveryCompleteCalls": 0,
297
+ "deliveryCompleteMs": 0
298
+ }
299
+ },
300
+ {
301
+ "name": "proposal_backlog",
302
+ "count": 3,
303
+ "p50Ms": 34.71,
304
+ "p95Ms": 35.46,
305
+ "outcomes": {
306
+ "ok": 3
307
+ },
308
+ "states": {
309
+ "backlog": 3
310
+ },
311
+ "board": {
312
+ "listCalls": 9,
313
+ "listRows": 4056,
314
+ "listMs": 36.75,
315
+ "privacyProjectionCalls": 0,
316
+ "privacyProjectionRows": 0,
317
+ "privacyProjectionMs": 0,
318
+ "taskWriteCalls": 3,
319
+ "taskWriteMs": 98.63,
320
+ "deliveryCompleteCalls": 0,
321
+ "deliveryCompleteMs": 0
322
+ }
323
+ },
324
+ {
325
+ "name": "proposal_claim",
326
+ "count": 3,
327
+ "p50Ms": 144.18,
328
+ "p95Ms": 145.91,
329
+ "outcomes": {
330
+ "ok": 3
331
+ },
332
+ "states": {
333
+ "in_progress": 3
334
+ },
335
+ "board": {
336
+ "listCalls": 43,
337
+ "listRows": 23026,
338
+ "listMs": 219.58,
339
+ "privacyProjectionCalls": 0,
340
+ "privacyProjectionRows": 0,
341
+ "privacyProjectionMs": 0,
342
+ "taskWriteCalls": 9,
343
+ "taskWriteMs": 230.26,
344
+ "deliveryCompleteCalls": 0,
345
+ "deliveryCompleteMs": 0
346
+ }
347
+ },
348
+ {
349
+ "name": "delivery_complete",
350
+ "count": 3,
351
+ "p50Ms": 19.38,
352
+ "p95Ms": 20.48,
353
+ "outcomes": {
354
+ "completed": 3
355
+ },
356
+ "states": {
357
+ "completed": 3
358
+ },
359
+ "board": {
360
+ "listCalls": 0,
361
+ "listRows": 0,
362
+ "listMs": 0,
363
+ "privacyProjectionCalls": 0,
364
+ "privacyProjectionRows": 0,
365
+ "privacyProjectionMs": 0,
366
+ "taskWriteCalls": 0,
367
+ "taskWriteMs": 0,
368
+ "deliveryCompleteCalls": 3,
369
+ "deliveryCompleteMs": 56.87
370
+ }
371
+ }
372
+ ],
373
+ "harness_sha256": "af94616627702b8aa1f783478a68f6aeaaddeedca65680361d1954f5c3481b32"
374
+ },
375
+ "v027_matched_hooks": {
376
+ "host": {
377
+ "platform": "darwin",
378
+ "arch": "arm64",
379
+ "bun": "1.4.3"
380
+ },
381
+ "startup": {
382
+ "totalMs": 1662.28,
383
+ "includesStartupEventLogReads": true
384
+ },
385
+ "iterations_per_phase": 3,
386
+ "phases": [
387
+ {
388
+ "name": "review_approved",
389
+ "count": 3,
390
+ "p50Ms": 134.3,
391
+ "p95Ms": 144.84,
392
+ "outcomes": {
393
+ "ok": 3
394
+ },
395
+ "states": {
396
+ "approved": 3
397
+ },
398
+ "board": {
399
+ "queueHookMs": 90.21,
400
+ "queueHookCalls": 18,
401
+ "boardHookMs": 179.69,
402
+ "boardHookCalls": 6,
403
+ "listCalls": 42,
404
+ "listRows": 20217,
405
+ "listMs": 199.85,
406
+ "privacyProjectionCalls": 0,
407
+ "privacyProjectionRows": 0,
408
+ "privacyProjectionMs": 0,
409
+ "taskWriteCalls": 6,
410
+ "taskWriteMs": 180.41,
411
+ "deliveryCompleteCalls": 0,
412
+ "deliveryCompleteMs": 0
413
+ }
414
+ },
415
+ {
416
+ "name": "proposal_backlog",
417
+ "count": 3,
418
+ "p50Ms": 33.77,
419
+ "p95Ms": 34.75,
420
+ "outcomes": {
421
+ "ok": 3
422
+ },
423
+ "states": {
424
+ "backlog": 3
425
+ },
426
+ "board": {
427
+ "queueHookMs": 0,
428
+ "queueHookCalls": 0,
429
+ "boardHookMs": 91.97,
430
+ "boardHookCalls": 3,
431
+ "listCalls": 9,
432
+ "listRows": 4056,
433
+ "listMs": 39.33,
434
+ "privacyProjectionCalls": 0,
435
+ "privacyProjectionRows": 0,
436
+ "privacyProjectionMs": 0,
437
+ "taskWriteCalls": 3,
438
+ "taskWriteMs": 98.96,
439
+ "deliveryCompleteCalls": 0,
440
+ "deliveryCompleteMs": 0
441
+ }
442
+ },
443
+ {
444
+ "name": "proposal_claim",
445
+ "count": 3,
446
+ "p50Ms": 141.73,
447
+ "p95Ms": 146.71,
448
+ "outcomes": {
449
+ "ok": 3
450
+ },
451
+ "states": {
452
+ "in_progress": 3
453
+ },
454
+ "board": {
455
+ "queueHookMs": 0,
456
+ "queueHookCalls": 0,
457
+ "boardHookMs": 223.18,
458
+ "boardHookCalls": 9,
459
+ "listCalls": 43,
460
+ "listRows": 23026,
461
+ "listMs": 218.43,
462
+ "privacyProjectionCalls": 0,
463
+ "privacyProjectionRows": 0,
464
+ "privacyProjectionMs": 0,
465
+ "taskWriteCalls": 9,
466
+ "taskWriteMs": 228.89,
467
+ "deliveryCompleteCalls": 0,
468
+ "deliveryCompleteMs": 0
469
+ }
470
+ },
471
+ {
472
+ "name": "task_assign",
473
+ "count": 3,
474
+ "p50Ms": 186.26,
475
+ "p95Ms": 192.51,
476
+ "outcomes": {
477
+ "ok": 3
478
+ },
479
+ "states": {
480
+ "proposed": 3
481
+ },
482
+ "board": {
483
+ "queueHookMs": 77.33,
484
+ "queueHookCalls": 15,
485
+ "boardHookMs": 116.67,
486
+ "boardHookCalls": 3,
487
+ "listCalls": 57,
488
+ "listRows": 34743,
489
+ "listMs": 327.33,
490
+ "privacyProjectionCalls": 0,
491
+ "privacyProjectionRows": 0,
492
+ "privacyProjectionMs": 0,
493
+ "taskWriteCalls": 3,
494
+ "taskWriteMs": 116.94,
495
+ "deliveryCompleteCalls": 0,
496
+ "deliveryCompleteMs": 0
497
+ }
498
+ },
499
+ {
500
+ "name": "delivery_complete",
501
+ "count": 3,
502
+ "p50Ms": 21.35,
503
+ "p95Ms": 21.94,
504
+ "outcomes": {
505
+ "completed": 3
506
+ },
507
+ "states": {
508
+ "completed": 3
509
+ },
510
+ "board": {
511
+ "queueHookMs": 58.45,
512
+ "queueHookCalls": 6,
513
+ "boardHookMs": 0,
514
+ "boardHookCalls": 0,
515
+ "listCalls": 0,
516
+ "listRows": 0,
517
+ "listMs": 0,
518
+ "privacyProjectionCalls": 0,
519
+ "privacyProjectionRows": 0,
520
+ "privacyProjectionMs": 0,
521
+ "taskWriteCalls": 0,
522
+ "taskWriteMs": 0,
523
+ "deliveryCompleteCalls": 3,
524
+ "deliveryCompleteMs": 61.09
525
+ }
526
+ }
527
+ ],
528
+ "harness_sha256": "3aa30a564680a95c12f00b3432b1c36a34c9e976757df06e57e5185a6b0646d0"
529
+ }
530
+ },
531
+ "limitations": [
532
+ "Three samples per phase; p95 is the maximum sample, not a stable production percentile.",
533
+ "Private consistent database backup, not original WAL files, lock holders, memory repository, sessions or scheduler state.",
534
+ "Models, native agents and outbound fetch were not exercised. Matched runs use fresh isolated memory, disabled inference/MLX/native capture/task sweep and WIP 32.",
535
+ "MCP stdio wrapper, live socket backlog and live memory capture contention are not measured.",
536
+ "macOS Bun 1.4.3 diagnostic; not a pinned-Bun gate or exact live-process binary reproduction."
537
+ ],
538
+ "replay_audit": {
539
+ "current_registry": [
540
+ "hub_task_propose",
541
+ "hub_review"
542
+ ],
543
+ "natural_journal_idempotence": [
544
+ "delivery_complete"
545
+ ],
546
+ "not_in_current_write_operation": [
547
+ "hub_task_accept",
548
+ "task_assign",
549
+ "hub_task_done",
550
+ "hub_task_decline",
551
+ "hub_task_cancel"
552
+ ],
553
+ "observed_live_replay_feature": false,
554
+ "accept_history_note": "The four accepts on task 668 were plan revisions; they are not a reproduced timeout retry."
555
+ }
556
+ }
@@ -0,0 +1,64 @@
1
+ # Live-board-copy write latency, 2026-11-03
2
+
3
+ Task #669, Refs #1078. **The reported 30-second stall was not reproduced and its cause remains unknown.** These measurements do not establish an environmental cause or a latency fix. No production code, timeout, retry bound, live configuration or running daemon was changed.
4
+
5
+ ## Input and isolation
6
+
7
+ A read-only SQLite connection backed up the project's live database into an owner-only scratch directory. SQLite backup includes committed WAL state without copying an inconsistent database/WAL pair. Profiling then used that snapshot and disposable copies only. The snapshot contains 670 tasks, 4,719,605 bytes of history JSON and a 33,292,288-byte database. Its 2,055 deliveries comprise 1,801 completed, 136 failed, 111 discarded and 7 accepted rows. Counts differ from the assignment's earlier observation because the board continued operating before backup.
8
+
9
+ Matching config.json, config.local.json, routing.toml and sdlc.toml were copied privately. No task text, config contents, database, account path or native/model output is in this receipt or the aggregate. The original snapshot was never used as a writable daemon database. Each control experiment first copied it to a new scratch project's database, appended three synthetic review tasks and used scripted peers. Private HOME, AGENTHUB_HOME, AMEM_HOME and agent homes prevented access to account or memory state. No native agent or real model was started.
10
+
11
+ Read-only current-source probes used a readonly Bun SQLite handle with query_only and Board's read methods. Control probes adapted the existing scripts/benchmarks/control-write-latency.ts runner: replace synthetic board seeding with the snapshot copy plus synthetic review rows, preserve the production startDaemon/Tasks/Bus/ControlClient path, and emit aggregate timings only. The copied delivery journal retained its historical rows. Synthetic event-log bulk seeding was disabled; the person's event log was not replayed. Startup is timed separately.
12
+
13
+ The matched-config runs loaded the copied configuration and routing, with explicit isolation differences: fresh empty memory store enabled; native memory capture, inference, triage, MLX and task sweep disabled; WIP limits set to 32 for the scripted batch; batching set to zero; PII screening scripted clear; outbound fetch refused. Research and snapshot settings otherwise followed the loaded configuration. This is not a claim to reproduce the live memory repository, external services, native session state or concurrent activity.
14
+
15
+ ## Source and measurements
16
+
17
+ All diagnostics ran on the same Mac, darwin/arm64, Bun 1.4.3. They are bounded private-copy profiling, not a test gate or a pinned-Bun live-binary reproduction. The 0.27.0 source is tag v0.27.0, commit 1d0557d6ee7f6e1b48416e5905865704b35c9dbe, using the installed runtime's exact agent-mem 0.18.0 dependency through an own-worktree symlink. The current source is e2ff29696d6a5ddb7a9232c4aadeb7fc97995794 with agent-mem 0.19.0. No dependency was installed or changed on the Mac.
18
+
19
+ A token-free status copy confirmed the running hub was 0.27.0, protocol 16, without tool_write_idempotency. The released-source comparisons below are separate from the running process; it received no profiling requests.
20
+
21
+ Read-only current-source observation: Board.list 100.60 ms, Tasks construction 132.49 ms, all 670 publicView projections 142.67 ms, statusTasks 0.44 ms, stalled 0.68 ms and pendingOffers 0.18 ms. An earlier independent SQLite select/decode observation was 4.09/12.47 ms. These are single observations, not latency distributions or proof that repeated scans can never accumulate.
22
+
23
+ Each control phase has only three successful samples. The reported p95 is nearest-rank, therefore the maximum of those three samples. It is not a stable production percentile. Values are request round trips in milliseconds:
24
+
25
+ | Source / fixture | Review p50 / p95 | Backlog propose p50 / p95 | Claimed propose p50 / p95 | Delivery complete p50 / p95 |
26
+ | --- | --- | --- | --- | --- |
27
+ | Current, isolated core | 67.70 / 78.34 | 31.80 / 32.22 | 86.74 / 87.95 | 18.00 / 18.62 |
28
+ | 0.27.0, isolated core | 89.69 / 103.84 | 28.07 / 28.43 | 81.62 / 89.19 | 20.43 / 20.68 |
29
+ | 0.27.0, matched config with isolation | 137.69 / 146.96 | 34.71 / 35.46 | 144.18 / 145.91 | 19.38 / 20.48 |
30
+ | 0.27.0, same config with hook spans | 134.30 / 144.84 | 33.77 / 34.75 | 141.73 / 146.71 | 21.35 / 21.94 |
31
+
32
+ The last run also exercised the console's real task_assign operation: 186.26 / 192.51 ms, three successful assignments. Assigned tasks remain proposed until their owners accept, as expected. Startup ranged from 330.14 ms to 1,662.28 ms and is excluded from the table. No speedup claim is made from comparisons with different versions, configuration or instrumentation.
33
+
34
+ ## Shared hook observations
35
+
36
+ Both board writes and delivery completion synchronously refresh queue/status state in daemon.ts. Board.onChange calls settleSupersededDeliveries and writeStatus; bus.onQueues also refreshes holds and status. In addition, Bus.refreshRecoveryHold reads journal.list(peer), which includes historical completed deliveries. These are plausible accumulation points absent from the earlier zero-delivery synthetic fixture, but the copy measurements did not show the reported stall.
37
+
38
+ The last run wrapped the real board.onChange and bus.onQueues callbacks, retaining their behavior. Across three samples per phase, aggregate board-hook / queue-hook times were:
39
+
40
+ | Phase | Board hook total ms / calls | Queue hook total ms / calls |
41
+ | --- | --- | --- |
42
+ | Review | 179.69 / 6 | 90.21 / 18 |
43
+ | Backlog propose | 91.97 / 3 | 0 / 0 |
44
+ | Claimed propose | 223.18 / 9 | 0 / 0 |
45
+ | Assignment | 116.67 / 3 | 77.33 / 15 |
46
+ | Delivery complete | 0 / 0 | 58.45 / 6 |
47
+
48
+ These spans nest inside writes and sometimes inside one another; do not add them to round-trip times. They do not separate SQLite fsync/checkpoint time from the rest of a write. The original active WAL, lock holders and their timing are not retained by an online backup, so transient disk/lock behavior remains unverified.
49
+
50
+ On the snapshot, tasks 667 and 668 went from proposed to lifecycle linked to assigned within 52 and 54 ms respectively. Their first proposed timestamps are 2026-11-02T20:55:33.856Z and 20:56:34.404Z. This bounds those recorded transitions only: no request-start or reply timestamp is present, so it cannot establish their complete tool-call latency.
51
+
52
+ ## Replay coverage finding
53
+
54
+ Source audit at e2ff2969 confirms toolWriteOperation recognizes task propose and review, plus delivery_complete for unknown-outcome handling. Delivery completion uses the journal's natural idempotence rather than registry capacity. Task accept, task_assign, done, decline and cancel are outside that operation set; transport uncertainty/replay protection must not be described as covering every write. No timeout retry was injected in this investigation.
55
+
56
+ The four accept entries on task 668 were deliberate plan revisions as the implementation scope grew, not evidence of a timeout retry. A separate controlled test is needed to demonstrate a lost-response retry for accept or assignment before expanding their idempotency contract. The running 0.27.0 process also lacks the feature shipped in the later source; a source merge is not live activation.
57
+
58
+ ## Result and next step
59
+
60
+ No causal production fix is justified by these observations. The copy rules out a deterministic 30-second stall for these particular sampled inputs and isolated configurations; it does not exonerate every local path. Live memory-store contention, MCP stdio handling, queued socket work, concurrent background passes, external metadata calls and intermittent filesystem delays remain unmeasured.
61
+
62
+ Next, in a separately approved instrumentation change, record bounded metadata-only monotonic spans at client send/receive, daemon receive/reply, and the board/queue/status/memory/external-call boundaries. Include event-loop delay so queued admission can be distinguished from post-write work. Use counts, operation names and opaque correlation IDs, never payloads or task text. Deploy through the normal reviewed release/upgrade process and capture one naturally occurring stall before choosing a fix. Do not raise the 30-second timeout or WAL/resource thresholds. This task did not deploy, restart, upgrade, inject a failure into, or attach a profiler to the live daemon.
63
+
64
+ The [aggregate JSON](2026-11-03-live-board-latency.json) contains counts and timings only, SHA-256 e44ef37a822b350673064f2d2640c372bb51725bd8ad5152d3d8c38e7f8cc65d. Harness hashes identify the private adapters of the existing runner; raw inputs and account/environment state are intentionally not published. This is a findings receipt, not an exact reproduction package or before/after fix receipt.