@staix/agent-hub 0.34.1 → 0.35.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 (159) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +35 -6
  3. package/docs/adding-an-ai-tool.md +2 -2
  4. package/docs/addons/claude-mem.md +4 -4
  5. package/docs/addons/open-code-review.md +1 -1
  6. package/docs/agent-notes/README.md +6 -0
  7. package/docs/agent-notes/adapters.md +9 -5
  8. package/docs/agent-notes/budget.md +1 -1
  9. package/docs/agent-notes/bus.md +1 -1
  10. package/docs/agent-notes/daemon.md +4 -3
  11. package/docs/agent-notes/local-worker.md +1 -1
  12. package/docs/agent-notes/models.md +2 -0
  13. package/docs/agent-notes/tasks.md +1 -1
  14. package/docs/agent-notes/tests.md +5 -0
  15. package/docs/design/adapters.md +110 -2
  16. package/docs/design/agent-hub-architecture.md +63 -1
  17. package/docs/design/agent-hub.md +6 -0
  18. package/docs/design/bus.md +18 -0
  19. package/docs/design/execution-reference.md +146 -0
  20. package/docs/design/task-board.md +10 -0
  21. package/docs/dogfood.md +33 -12
  22. package/docs/events.md +38 -20
  23. package/docs/memory.md +21 -7
  24. package/docs/operations.md +539 -24
  25. package/docs/quickstart.md +12 -4
  26. package/docs/research.md +71 -13
  27. package/docs/roles.md +1 -1
  28. package/docs/sdlc.md +9 -7
  29. package/docs/security.md +87 -11
  30. package/docs/smoke.md +14 -0
  31. package/docs/specs/2026-09-19-agent-hub-design.md +8 -3
  32. package/docs/verification/2026-11-07-compat-python-startup-1248.md +51 -0
  33. package/docs/verification/2026-11-07-compat-receipt-harness-1248.md +105 -0
  34. package/docs/verification/2026-11-07-compat-receipt-producers-1248.md +96 -0
  35. package/docs/verification/2026-11-07-compat-workflow-1248.md +94 -0
  36. package/docs/verification/2026-11-07-daemon-startup-1232.md +169 -0
  37. package/docs/verification/2026-11-07-jcode-receipt-reconstruction-1248.md +118 -0
  38. package/docs/verification/2026-11-07-kimi-delayed-usage.md +34 -0
  39. package/docs/verification/2026-11-07-kimi-review-watch-1284.md +115 -0
  40. package/docs/verification/2026-11-08-agy-1.5.3.md +96 -0
  41. package/docs/verification/2026-11-08-agy-acp-t0.md +56 -0
  42. package/docs/verification/2026-11-08-hub-visual-1058.md +161 -0
  43. package/docs/verification/2026-11-08-jcode-0991-model-setter-1317.md +143 -0
  44. package/docs/verification/2026-11-08-kimi-252-model-setter-1317.md +137 -0
  45. package/docs/verification/2026-11-08-kimi-tui-completion-1282.md +45 -0
  46. package/docs/verification/2026-11-08-kimi-wire-yield-1283.md +31 -0
  47. package/docs/verification/2026-11-08-live-model-override-1317.md +250 -0
  48. package/docs/verification/2026-11-08-qwen-0269-acp.md +138 -0
  49. package/docs/verification/2026-11-08-qwen-0269-model-setter-1317.md +91 -0
  50. package/docs/verification/2026-11-09-0.35.0.md +129 -0
  51. package/docs/verification/2026-11-09-headless-records-1320.md +157 -0
  52. package/docs/verification/claude-permission-transport-native.py +10 -3
  53. package/docs/verification/claude-shell-wrapper-native.py +8 -8
  54. package/docs/verified.json +245 -15
  55. package/package.json +3 -3
  56. package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
  57. package/plugins/agent-hub/kimi-hook.js +20397 -0
  58. package/plugins/agent-hub/kimi-review-policy-worker.js +217 -0
  59. package/plugins/agent-hub/server.js +2701 -664
  60. package/scripts/check-docs.mjs +12 -1
  61. package/src/adapters/acp-model-policy.ts +56 -0
  62. package/src/adapters/acp.ts +175 -5
  63. package/src/adapters/agy/entry.ts +8 -5
  64. package/src/adapters/agy/hooks.ts +65 -15
  65. package/src/adapters/channel-peer.ts +33 -1
  66. package/src/adapters/claude-implementer.ts +16 -3
  67. package/src/adapters/codex-appserver.ts +118 -8
  68. package/src/adapters/codex-review-isolation.ts +3 -1
  69. package/src/adapters/compat.ts +11 -6
  70. package/src/adapters/definitions/builtin-metadata.ts +8 -1
  71. package/src/adapters/definitions/native-cli-entry-kimi.ts +76 -7
  72. package/src/adapters/definitions/native-cli-preview-common.ts +2 -2
  73. package/src/adapters/definitions/native-cli-preview-kimi.ts +9 -2
  74. package/src/adapters/definitions/reviewer-variants.ts +3 -1
  75. package/src/adapters/kimi-review-policy-worker.js +2 -0
  76. package/src/adapters/kimi-review-policy-worker.ts +85 -0
  77. package/src/adapters/kimi-review-policy.ts +68 -0
  78. package/src/adapters/kimi-review.ts +41 -41
  79. package/src/adapters/kimi-tui-facts.ts +153 -0
  80. package/src/adapters/kimi-wire-usage.ts +33 -8
  81. package/src/adapters/local-worker.ts +59 -20
  82. package/src/adapters/model-token.ts +3 -0
  83. package/src/adapters/pi.ts +27 -5
  84. package/src/adapters/registry-types.ts +34 -3
  85. package/src/adapters/registry.ts +1 -0
  86. package/src/adapters/reviewer-policy-watch.ts +86 -0
  87. package/src/adapters/reviewer-print.ts +80 -18
  88. package/src/cli/agents.ts +1 -1
  89. package/src/cli/facts-hook.ts +4 -2
  90. package/src/cli/help.ts +3 -2
  91. package/src/cli/identity.ts +3 -0
  92. package/src/cli/kimi-facts-hook.ts +11 -0
  93. package/src/cli/kimi-plugin.ts +157 -0
  94. package/src/cli/main.ts +48 -9
  95. package/src/cli/model.ts +52 -0
  96. package/src/cli/output.ts +23 -1
  97. package/src/cli/reset.ts +1 -1
  98. package/src/cli/status-lines.ts +8 -4
  99. package/src/hub/budget.ts +1 -1
  100. package/src/hub/bus.ts +40 -2
  101. package/src/hub/code-facts.ts +10 -3
  102. package/src/hub/completions.ts +3 -1
  103. package/src/hub/config-apply.ts +2 -1
  104. package/src/hub/control-client.ts +1 -1
  105. package/src/hub/daemon.ts +1050 -106
  106. package/src/hub/deliverable-files.ts +38 -5
  107. package/src/hub/dogfood-profile.ts +1 -1
  108. package/src/hub/envelope.ts +1 -1
  109. package/src/hub/events.ts +28 -18
  110. package/src/hub/execution-lineage.ts +120 -0
  111. package/src/hub/execution-reference.ts +36 -0
  112. package/src/hub/hub-tools.ts +21 -2
  113. package/src/hub/instances.ts +4 -3
  114. package/src/hub/kimi-events.ts +46 -0
  115. package/src/hub/kimi-usage.ts +132 -29
  116. package/src/hub/lifecycle.ts +31 -15
  117. package/src/hub/limits.ts +13 -4
  118. package/src/hub/manager.ts +15 -2
  119. package/src/hub/memory-policy.ts +2 -1
  120. package/src/hub/memory-sync-attestation.ts +54 -0
  121. package/src/hub/memory-sync-state.ts +20 -5
  122. package/src/hub/model-overrides.ts +115 -0
  123. package/src/hub/native-hook-launch.ts +12 -3
  124. package/src/hub/operational-view.ts +2 -2
  125. package/src/hub/peers.ts +27 -0
  126. package/src/hub/permission-mode.ts +1 -1
  127. package/src/hub/person-figures.ts +88 -0
  128. package/src/hub/report.ts +38 -4
  129. package/src/hub/research-dataset.ts +158 -0
  130. package/src/hub/research-memory.ts +68 -0
  131. package/src/hub/research-quality.ts +118 -0
  132. package/src/hub/research-record.ts +279 -0
  133. package/src/hub/research.ts +126 -27
  134. package/src/hub/restart.ts +14 -0
  135. package/src/hub/settings.ts +3 -0
  136. package/src/hub/startup-event-seeds.ts +51 -0
  137. package/src/hub/startup-readiness.ts +65 -0
  138. package/src/hub/startup-timing.ts +38 -0
  139. package/src/hub/tasks.ts +29 -9
  140. package/src/hub/ui.ts +9 -5
  141. package/src/hub/visual-assets.ts +50 -0
  142. package/src/hub/visual.ts +257 -0
  143. package/src/memory/brief.ts +169 -14
  144. package/src/memory/capture.ts +2 -1
  145. package/src/memory/recall.ts +46 -5
  146. package/src/memory/record-provenance.ts +82 -0
  147. package/src/memory/records.ts +116 -0
  148. package/src/models/route/adec.ts +190 -0
  149. package/src/models/route/config.ts +37 -3
  150. package/src/models/route/decision-evidence.ts +83 -0
  151. package/src/models/route/decision.ts +143 -0
  152. package/src/models/route/runtime.ts +13 -6
  153. package/src/ui/index.html +134 -6
  154. package/src/ui/plugin.ts +65 -4
  155. package/templates/AGENTS.block.md +1 -1
  156. package/templates/config.json +1 -1
  157. package/templates/profiles/general.json +1 -1
  158. package/templates/profiles/research.json +1 -1
  159. package/templates/profiles/writing.json +1 -1
@@ -0,0 +1,91 @@
1
+ # Qwen 0.26.9 ACP model setter, failed clear
2
+
3
+ Date: 2026-11-08. Task #809, Refs #1317 AC4. **Failed:** the original model was
4
+ not restored on the next prompt. Qwen has no production live-setter capability
5
+ in this change. General compatibility qualification is separate, in
6
+ [the 0.26.9 ACP receipt](2026-11-08-qwen-0269-acp.md).
7
+
8
+ ## Exact artifact and isolation
9
+
10
+ The installed macOS arm64 package is `@qwen-code/qwen-code` 0.26.9, gitHead
11
+ `600aff0592bcfc21668ca4aba95a5b20c6491b86`. Its package SRI is
12
+ `sha512-2orVsP3Dr01gk38STbYTWcFZeXftc0QXDHhglK7YPsIwgmumvnJeTAu1N00esRUwuLcevZ8k4godLwypDKb1LA==`.
13
+ A private package already qualified by #811 runs with Node 24.18.1. The package
14
+ manifest, CLI entry and ACP module hashes match that receipt before and after.
15
+ The original package and selected real `.qwen`/`.pi` configuration snapshot are
16
+ unchanged during this probe (2,318 entries, digest
17
+ `4b3f2fb1cda310ba624f7854c6d5881fc7eff45f368268c884cf6493bea7cfa8`).
18
+ This is a per-probe check, not a claim that other sessions made no changes
19
+ between the earlier compatibility receipt and this one.
20
+
21
+ Fresh 0700 private directories provide HOME, cwd, TMPDIR, XDG and tool homes
22
+ before imports. The private trust file admits only this fixture's exact version;
23
+ no machine trust is changed. Seatbelt denies actual-home data and global runtime
24
+ writes. Positive exact-provider TCP and negative owned-decoy TCP, actual-config
25
+ read and installed-binary write-open controls pass. The Node watcher control
26
+ passes without raising file limits. No real account, credential, model or
27
+ personal profile is used or modified.
28
+
29
+ The synthetic OpenAI provider has two declared models, A (`task809-a`) and B
30
+ (`task809-b`), on the same loopback endpoint and synthetic key. Its bounded fixed
31
+ SSE responses generate no tool calls. Origin, wrong auth/path, oversized bodies,
32
+ unexpected models and excess requests fail the probe. Native permissions are
33
+ denied; none were requested. Process cleanup is confirmed, while detached
34
+ lifetime containment remains unproven.
35
+
36
+ ## Actual adapter and observation
37
+
38
+ The probe uses the production `AcpPeer`, `ModelOverrides` and
39
+ `ModelOverrideLatches` at source `7c86077e89f790af0fd444b8ca9bd90e8d0bc09f`.
40
+ A transparent observer invokes the original RPC with unchanged arguments and
41
+ returns the same promise. It records bounded method/model ids only.
42
+
43
+ Qwen advertises provider-qualified wire ids `task809-a(openai)` and
44
+ `task809-b(openai)`. The probe uses an exact reversible suffix codec for these
45
+ unique fixture ids. This is neither a production admission nor a display-name
46
+ or hashed-route selector. Matching an auth type alone does not prove that two
47
+ arbitrary native presets share an endpoint or account.
48
+
49
+ 1. The first ordinary user prompt uses A. Desired B is written while A is held;
50
+ the running A request is unchanged and no setter is sent during it.
51
+ 2. The next prompt sends `session/set_config_option`, `configId: model`, value
52
+ `task809-b(openai)`. Native acknowledgement precedes a request using B.
53
+ 3. Clear removes the desired row. The adapter sends the original baseline
54
+ `task809-a(openai)` and receives acknowledgement, but the third ordinary user
55
+ prompt still requests B. The required wire sequence A/B/A is **A/B/B**.
56
+ 4. The fixture refuses that third unexpected model and reports failure. It does
57
+ not count the resulting turn as completed or as a passing clear. Two prior
58
+ delivery ids completed. Owned stop succeeds and private settings remain
59
+ byte-identical immediately after B and after stop.
60
+
61
+ All three requests are ordinary prompts: message counts 2, 4 and 6, with user
62
+ counts 1, 2 and 3. No response-format/title schema is present. Auto-title is
63
+ explicitly disabled before startup. This excludes an extra background title
64
+ request as an explanation for this final sequence. The underlying native cause
65
+ is not claimed here; the observed ACK is insufficient to certify clear.
66
+
67
+ ## Earlier setup failures
68
+
69
+ - An initial watcher control used an immediate throwing evaluation before the
70
+ asynchronous watcher could answer. It failed before native ACP started.
71
+ Replacing only that control evaluation with `void 0` established the event.
72
+ - A subsequent probe reached A/B but its settings byte fence failed. The native
73
+ loader added `$version: 4` and formatting; model.name stayed A and all original
74
+ fields were equal. That run's extra B request was unclassified. The final
75
+ fresh fixture declares the current schema before its original hash and
76
+ disables the documented auto-title path before startup. No assertion, request
77
+ cap, timeout or clear requirement was removed.
78
+
79
+ ## Evidence and limits
80
+
81
+ The final private root is `/private/tmp/ahub-809-r2l7mnlg`. Its closed result is
82
+ retained in scratch `task809/qwen-schema.log`, SHA-256
83
+ `1f71465d1bfb87705132ec4d0b429a51eb75ef32577e069e3a312ebc8efe01d7`.
84
+ The scratch probe SHA-256 is
85
+ `e0af80d8b3d9cf013794908e619f4579c90460d181024c4857b62472038d1c30`;
86
+ controller SHA-256 is
87
+ `d54e5f733b25bc4d6ee9e96a24e8ceb59871ba3eec44d47bbf4cc558aac611af`.
88
+ These identify uncommitted producers, not a committed reproducible proof module.
89
+ No native daemon/dashboard journey, real provider/account, Linux, TUI,
90
+ qwen-dual, preset migration or general provider-identity qualification is made.
91
+ No COMPAT, trust, reviewer isolation or verified stamp is changed by this task.
@@ -0,0 +1,129 @@
1
+ # 0.35.0 release verification
2
+
3
+ This record covers release preparation and source review. It claims no installation, no running-hub upgrade to 0.35.0 and no live TUI launch.
4
+
5
+ ## Candidate
6
+
7
+ Version 0.35.0, prepared from main 44410b11 (51 commits since v0.34.1, 28 of them `feat`; bump rule: minor). The release commits carry the version, the CHANGELOG section, the bundle and the documentation stamps.
8
+
9
+ ## Reviews
10
+
11
+ Pull requests named by the commits since v0.34.1: 51 PRs (#1339, #1336, #1337, #1335, #1334, #1327, #1323, #1321, #1325, #1313, #1309, #1322, #1315, #1316, #1302, #1319, #1301, #1300, #1314, #1312, #1311, #1306, #1291, #1295, #1305, #1304, #1298, #1299, #1294, #1297, #1286, #1303, #1308, #1293, #1290, #1276, #1296, #1289, #1288, #1272, #1285, #1270, #1275, #1267, #1264, #1271, #1265, #1269, #1259, #1258, #1256). #1280, #1307, #1292, #1284, #1262, #1268, #1261 and #1263 appear in commit subjects as issue references, not merged PRs.
12
+
13
+ Every PR merged with its single exact-head `check` run green and no unresolved review thread (GraphQL `reviewThreads.isResolved`, 0 open on all 51). 40 merged at the head their hub approval bound. 10 merged at a later head (below). #1271 had no hub_review: a jcode review task read its final head. Skipped ancillary jobs are not test proof.
14
+
15
+ | PR / task | Review | Approved and final PR head | Merge commit | Hosted CI |
16
+ | --- | --- | --- | --- | --- |
17
+ | [#1339](https://github.com/STAIxBWLB/agent-hub/pull/1339), task 828 | claude (hub review) | `df7dc01a1ad7bd66bf9fc5793b357c725ee08398` | `44410b11b191ad19438e2277867aaf41714b3e7c` | [5 success, 5 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42554238313), identical-tree reuse of full gate [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42553898322) at `3f13e162` |
18
+ | [#1336](https://github.com/STAIxBWLB/agent-hub/pull/1336), task 817 | claude (hub review, 1 changes_requested round) | `b9e9e96a4e262156302e6200a838ecd5ab6d45a9` | `cd2080ecf8e54145c34ec8259ec35fa4909c3b7d` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42536192039) |
19
+ | [#1337](https://github.com/STAIxBWLB/agent-hub/pull/1337), task 829 | claude (hub review) | `7e951ea411907f67aa2ba8524108eef4f5fa7dd5` | `499d276be95ab2ed5b20b08168f53792e0f072ce` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42537668703) |
20
+ | [#1335](https://github.com/STAIxBWLB/agent-hub/pull/1335), task 827 | claude (hub review) | `57cc2bd8a320cae09223aa9f6399a54726c83828` | `0ffc889b763c87a52dff19f8d2e4845ba62f7864` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42527180362) |
21
+ | [#1334](https://github.com/STAIxBWLB/agent-hub/pull/1334), task 816 | claude (hub review, 1 changes_requested round) | `8b3671a58af43a0d6c7defd959c0166f1ff91d60` | `d620d6318f13aaee1ecb0bb05cdc62ba2b7384f5` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42523528679) |
22
+ | [#1327](https://github.com/STAIxBWLB/agent-hub/pull/1327), task 813, task 814 | claude (hub review); final approval on task 814 | `0539f82b2d1984b250a317325c498209060a294d` | `a403eb23ffb6bd852ef4cee2b6733a658f5de0c3` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42475335654) |
23
+ | [#1323](https://github.com/STAIxBWLB/agent-hub/pull/1323), task 809 | claude (hub review) | `001ca0d6690bb2eb400f40985ad8fc31252db3f2` | `90292b7dba8f8bbbb1e3134c909174fd8be5a589` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42467415994) |
24
+ | [#1321](https://github.com/STAIxBWLB/agent-hub/pull/1321), task 808 | claude (hub review, 1 changes_requested round) | `3801132dd2f4d6089a5676d024d45093edd3b5c3` | `8dfa2e44798e8fb8eb522ae4495a5bd9590b4fa2` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42460676156) |
25
+ | [#1325](https://github.com/STAIxBWLB/agent-hub/pull/1325), task 812 | claude (hub review) | `e2deb5af7750f899f394ae7c31081413f48ec827` | `e28625c5653e09ddae5f6d01f0db638c1d52e4e0` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42462300859) |
26
+ | [#1313](https://github.com/STAIxBWLB/agent-hub/pull/1313), task 804 | claude (hub review, 1 changes_requested round) | `f9df413d6a6e6f4350a8ea45d4a1e23092c7cdfc` | `cfa4e138a91043ed6e68db892ae8e2b6ea240301` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42453969408) |
27
+ | [#1309](https://github.com/STAIxBWLB/agent-hub/pull/1309), task 803 | claude (hub review, 1 changes_requested round) | `315b89fa55bc31347dbbc4e5484eaa0a56034e07` | `f2c676f87e9bb135c06df63f76fd87f32e3a7906` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42453962880) |
28
+ | [#1322](https://github.com/STAIxBWLB/agent-hub/pull/1322), task 811 | claude (hub review) | `7411b9823f452abf90f68fceed50e9e3dacbf25d` | `85354cdf609455e55487afbf3ea8c99ae5ffd00c` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42449700175) |
29
+ | [#1315](https://github.com/STAIxBWLB/agent-hub/pull/1315), task 709 | claude (hub review, 1 changes_requested round) | `ad8d0785003495c3858e30ea3918b5bb618bbb50` | `013e8785b4d2c080973d7b6d61176fc13a522e73` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42447527293) |
30
+ | [#1316](https://github.com/STAIxBWLB/agent-hub/pull/1316), task 807 | claude (hub review, 1 changes_requested round) | approved `f7f8301b89f851ad29c0887a442b9542a5eb944c`; final `0882ef79a421111186f1b07c067c683342b7e4c0`: final adds only a clean merge of main (`0882ef79`, no conflict resolution) | `7c12c43788f03088258cbeb5c5f10b34862e3097` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42447423362) |
31
+ | [#1302](https://github.com/STAIxBWLB/agent-hub/pull/1302), task 792, task 805 | claude (hub review); final approval on task 805 | approved `a5d2b81c3f5abc2a7134da98d867ffc7a7b9402a`; final `13ebde3b1ac9c3f16aca06638c6edf77e4b9c329`: final adds only a clean merge of main (`13ebde3b`, brings #1319; no conflict resolution) | `d87dfe25dedf9473f44097b9a2bf55dd4477915f` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42446078169) |
32
+ | [#1319](https://github.com/STAIxBWLB/agent-hub/pull/1319), task 810 | claude (hub review) | `6f8f1066b88a87d1357560443dcc84e314d9ee59` | `6da56c7a3cc697d9401903b827897148e05826e9` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42441448758) |
33
+ | [#1301](https://github.com/STAIxBWLB/agent-hub/pull/1301), task 791 | claude (hub review) | approved `72751436a880baf83c2648e527f6ddebc7265254`; final `74b44452a8f5020e58a6982cbc576515e3fe9be4`: final is a rebase of `aad7ba51` (O2 replayed onto approved O1 plus the stale-reply fix, filed as task 805 phase B), which has **no board approval**; the last approval on the O2 code is `72751436` (task 791) | `276050764fd432bac0f98bab78773f271da2f85f` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42438726108) |
34
+ | [#1300](https://github.com/STAIxBWLB/agent-hub/pull/1300), task 790, task 805 | claude (hub review): task 790 approved the stacked O1 head `f579cc5b`; task 805 (O1 review fixes for two connector threads; its PR binding later moved to #1302) approved the final head | `6dc329c9d1fa28982302c3e62c2e3a51e47c5ba1` | `b97ee5af976e92b97d2eb55b8a1147908a83fac7` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42433965087) |
35
+ | [#1314](https://github.com/STAIxBWLB/agent-hub/pull/1314), task 801 | claude (hub review) | `f8831010cfcea76c08819dc29d203cdfbb23a20b` | `b0396f1fc762da5f764fe814e879a1c8b7af2305` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42435439160) |
36
+ | [#1312](https://github.com/STAIxBWLB/agent-hub/pull/1312), task 802, task 806 | claude (hub review); final approval on task 806 | `6b09587eb1e2317d872de1d80620c27fc29afed4` | `b4853aaa1b299266d7469ff58d1c3b4eae1ef331` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42434045692) |
37
+ | [#1311](https://github.com/STAIxBWLB/agent-hub/pull/1311), task 800 | claude (hub review, 1 changes_requested round) | `7edbe7854bb6ccfd529ac81c65df6c9d2c0e424f` | `497aa61a922aa03b1298f96d82d931280c82ce9c` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42425430114) |
38
+ | [#1306](https://github.com/STAIxBWLB/agent-hub/pull/1306), task 796 | claude (hub review) | approved `8fef8a678d66422c67e792672694b4e936f7fe55`; final `276877463453af250e92d9384ad08d1b5251bf73`: final is a patch-identical rebase onto main (range-diff `=`) | `b3d3167a4c093f3164c7e399c9ad9b30162e4489` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42427614535) |
39
+ | [#1291](https://github.com/STAIxBWLB/agent-hub/pull/1291), task 783 | claude (hub review) | `7fdcab5847239074d73b0f2e9132bca5e23b0ec8` | `4fb4f7e7cf873dcce3b87c87ce0b07daecb17626` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42425278502) |
40
+ | [#1295](https://github.com/STAIxBWLB/agent-hub/pull/1295), task 798 | claude (hub review, 2 changes_requested rounds) | approved `1e6da1ee221acd601fa28201c8cd0081d8214566`; final `5032c7a0f5eb8698da3c57af79a1ab7207103036`: final adds merges of the stack bases and main only, no conflict resolution | `a09806ed9d0454b3c1380ae53d34a4a78e80b0d0` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42417684815) |
41
+ | [#1305](https://github.com/STAIxBWLB/agent-hub/pull/1305), task 795 | claude (hub review, 1 changes_requested round) | approved `6a64ab64aa32ea4b649a1245ee8105a3846efccb`; final `6e484667de2dfb03ef8ca594c7b3b23d0ba6b648`: final is a patch-identical rebase onto main of `63df0870`+`6a64ab64` (range-diff `=`) | `87fb2468793f2039179eb7c2b9d56eb6529b8b01` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42423572778) |
42
+ | [#1304](https://github.com/STAIxBWLB/agent-hub/pull/1304), task 794 | claude (hub review) | `5c3181358680feb2abfe7f5db01820ee89c0c2fc` | `5af8df4df834893654bdee1d1d354da51b220aa5` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42418165231) |
43
+ | [#1298](https://github.com/STAIxBWLB/agent-hub/pull/1298), task 780 | claude (hub review, 1 changes_requested round) | `261845ad8f8ae664363ad6968b08899cf7d28d57` | `4b0d36639d9417b7a810175ed3c9a13d49f429c6` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42418894137) |
44
+ | [#1299](https://github.com/STAIxBWLB/agent-hub/pull/1299), task 789 | claude (hub review) | approved `7b95115d8398604996a91550addd0cb8b2ed5eb1`; final `6d0df595c9be66b30530d651bde6bcaeebcd3824`: final adds two merges of main that resolve conflicts in docs/dogfood.md and docs/operations.md (both sides kept) | `42c1c5010191dd0c0dd19d5fafdd0a730f2d886d` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42417637637) |
45
+ | [#1294](https://github.com/STAIxBWLB/agent-hub/pull/1294), task 784 | claude (hub review) | approved `eb6eaf987208889eac52f1c0560c2a112b0faba0`; final `7bcde8ed2056a8bcd2b20865d2ab5902e269942a`: final adds merges only; `38b212c7` resolves a conflict in src/hub/daemon.ts (keeps both the agy usage lines and the #1285 startup seeds), `7bcde8ed` is clean | `61161ef3b7597d70860d2cdb5ebae5e3f7412e71` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42413064766) |
46
+ | [#1297](https://github.com/STAIxBWLB/agent-hub/pull/1297), task 779 | claude (hub review, 1 changes_requested round) | approved `5b0fc992e8db25a4305c0a38fb556278131b8ac6`; final `47f32f2fc8b78e0c9fb07b8dd3fc6039a99211cb`: final is a patch-identical rebase onto main of `7769d32d`+`5b0fc992` (range-diff `=`) | `5d0bdcaf1acd29d6b76e4e56327a5dd35c825f9f` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42402807512) |
47
+ | [#1286](https://github.com/STAIxBWLB/agent-hub/pull/1286), task 781 | claude (hub review, 1 changes_requested round) | approved `494031e772e00342a845eed4446032a81e55c80f`; final `aa6d6bbd2528e521047eefb5b18dc013b0046d46`: final adds a merge of main that resolves plugins/agent-hub/server.js (generated bundle) | `7860ae334124d630e5ebd613d2e5c32c8b9a6ea1` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42397231097) |
48
+ | [#1303](https://github.com/STAIxBWLB/agent-hub/pull/1303), task 793 | claude (hub review) | `766bb3cec01baeca8250647823498e5b5edd9e62` | `8ab91c6885154524d770d38d8daa8e7202e1fbd9` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42399536629) |
49
+ | [#1308](https://github.com/STAIxBWLB/agent-hub/pull/1308), task 799 | codex (hub review) | `23c28f709fb60afa55e981604fa16418affd4c5e` | `8cfc950acb734ec9ee202deb1098d0af0f42f739` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42408123667) |
50
+ | [#1293](https://github.com/STAIxBWLB/agent-hub/pull/1293), task 797 | codex (hub review) | `c7bbecbddd9332916938937bfb137f2f1015201c` | `51d996e092d1b2789a243a7343d3406d934881c2` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42386183694) |
51
+ | [#1290](https://github.com/STAIxBWLB/agent-hub/pull/1290), task 778 | claude (hub review, 1 changes_requested round) | `1beb9833edc3e8b0ee6b067c06fca3778f59b745` | `26059bd070929b724c330df075bfdcb2c7a311a5` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42390993373) |
52
+ | [#1276](https://github.com/STAIxBWLB/agent-hub/pull/1276), task 777 | claude (hub review, 1 changes_requested round) | `077f351d18feb31a1354f4f4ab35fd939ff2e06c` | `7b58bf74cdced6ec8f6d9d5da8f2cac67bdd0f8a` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42376096936) |
53
+ | [#1296](https://github.com/STAIxBWLB/agent-hub/pull/1296), task 785 | claude (hub review) | `c042ca86dec6e982bcb5320bba767e962d8224e4` | `fcb47f79ac2fd59f6962382a015aad50c86eb4b1` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42385987593) |
54
+ | [#1289](https://github.com/STAIxBWLB/agent-hub/pull/1289), task 782 | claude (hub review) | `eaf4544654601cdf6c165de681a493019a7a0dc6` | `654ca21bd8150db60ee6b073f255bf8008fcf277` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42377488582) |
55
+ | [#1288](https://github.com/STAIxBWLB/agent-hub/pull/1288), task 775 | claude (hub review) | `6067be6040c38ef79b1129d085a5bf755f2323ef` | `ba4d8b12e30bec617c0cf1fb696954828e5964f1` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42376290661) |
56
+ | [#1272](https://github.com/STAIxBWLB/agent-hub/pull/1272), task 764 | claude (hub review) | `40b6374b3e318d50aa12cc4449a6bd84cd1f616f` | `c3413ea1c458ac56bf0794a390f5b28adff436e7` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42376389127) |
57
+ | [#1285](https://github.com/STAIxBWLB/agent-hub/pull/1285), task 770 | claude (hub review) | `5833da3d901d261fbf53d4e6f7275c435070fe62` | `531f47b3416412a8ebc5ef6df0558e879701cac1` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42372063401) |
58
+ | [#1270](https://github.com/STAIxBWLB/agent-hub/pull/1270), task 774 | codex (hub review; earlier one jcode changes_requested round and jcode approvals at `4fcb14c6` and `6230fc3a`) | `0cd432ef63f0983a8b1ecde8dbd578f554480d90` | `5f20b92e5d159dace66894514189dc4c76d7a121` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42372273559) |
59
+ | [#1275](https://github.com/STAIxBWLB/agent-hub/pull/1275), task 767 | claude (hub review) | `f994143d2039c392d71811c3d399224a462e7a9b` | `2fb8c1c07972d21d339ee3f9bdbe98287a4cab97` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42368348563) |
60
+ | [#1267](https://github.com/STAIxBWLB/agent-hub/pull/1267), task 772 | claude (hub review, 2 changes_requested rounds) | `d4d1820a5e742279da8f77ea7429bc7a82861d98` | `a3de35e41ca26614108593b61de5674a960b2b95` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42364266086) |
61
+ | [#1264](https://github.com/STAIxBWLB/agent-hub/pull/1264), task 765 | claude (hub review, 1 changes_requested round) | `60f16c5d54b9e2ef66471b4450453c6785045fc3` | `7f6c03385aca8a5895a2674935b3876d4d15b646` | [17 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42360319904) |
62
+ | [#1271](https://github.com/STAIxBWLB/agent-hub/pull/1271), task 776 | jcode review task (class review, no hub_review): reviewed the final head, nothing blocking; Codex connector review no findings; merged after the queued macOS shard passed | `4b94a702b0dcc8e746472107653f8e783fff1469` | `3e27f16c82c57aafc946d9a794e0e0b45c0088b7` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42360647848) |
63
+ | [#1265](https://github.com/STAIxBWLB/agent-hub/pull/1265), task 771 | claude (hub review, 1 changes_requested round) | `eeb24a1706aed33e8be01e2803473e676cfc22da` | `3a0e985bf0dda79907e7d0f09ed2692aacbb6fa4` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42358747977) |
64
+ | [#1269](https://github.com/STAIxBWLB/agent-hub/pull/1269), task 773 | claude (hub review) | `12ed8b3098f14aa65eddf47dc28add1a83b65a7c` | `6df55b13842968f067537a2ee4e9b73c154f1676` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42358633850) |
65
+ | [#1259](https://github.com/STAIxBWLB/agent-hub/pull/1259), task 769 | claude (hub review, 2 changes_requested rounds) | `549cfa052c45bbb9720b3201546581209587143b` | `8e066f20c2809b7700539cd7dd42ef4232f44eae` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42348538629) |
66
+ | [#1258](https://github.com/STAIxBWLB/agent-hub/pull/1258), task 768 | claude (hub review, 1 changes_requested round) | `3a05f6b4f31d7c86a814c52dd67df2541e440082` | `d0db711324178c3ac2d3073e90442b4e9e1c1a54` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42346912434) |
67
+ | [#1256](https://github.com/STAIxBWLB/agent-hub/pull/1256), task 763 | claude (hub review, 1 changes_requested round) | `528a0877aa564d9f4459e5ce62e96a3bf99187d3` | `6f851dc388acc6ca1742741637aa04b51ae3567c` | [16 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42344975330) |
68
+
69
+ Heads that moved after approval:
70
+
71
+ - Patch-identical rebases onto main, checked with `git range-diff` (every commit `=`): #1305, #1306, #1297. These were stacked PRs rebased after the PR below them was squash-merged.
72
+ - Merge commits only, with no conflict resolution (`git show --cc` empty): #1316, #1302, #1295.
73
+ - Merge commits that resolve conflicts, not re-reviewed on the board: #1286 (plugins/agent-hub/server.js, the generated bundle), #1294 (src/hub/daemon.ts, keeps both the agy usage lines and the #1285 startup seeds), #1299 (docs/dogfood.md and docs/operations.md, both sides kept). Exact-head CI was green on each.
74
+ - #1301: the final head `74b44452` is a patch-identical rebase of `aad7ba51`. That head replays O2 onto approved O1 and adds "discard stale status projection replies", which answered a connector thread. Task 805 filed it as phase B, but the board records no approval at `aad7ba51` or `74b44452`. The conductor reviewed that 12-line delta (`integrations/orca/panel/index.html` plus its race test) after the merge, during this release preparation: a request generation guard discards a status reply that arrives after the selection changed, and clears the stale status on deselect. No defect; the panel is read-only. Exact-head CI was green.
75
+
76
+ #1339's exact-head `check` run reused the full gate of an identical tree (`ci-reuse.mjs`, tree `fe92ecf5`): run 42553898322 at the earlier head `3f13e162`, 16 success and 2 skipped. The post-merge push run on main, 42559536093, passed too. #1300's final head was approved on task 805, whose PR binding later moved to #1302. #1312's final head was approved on follow-up task 806, and #1327's on task 814.
77
+
78
+ ## Native acceptance receipts
79
+
80
+ Receipts added under `docs/verification/` since v0.34.1: `docs/verification/2026-11-07-compat-python-startup-1248.md`, `docs/verification/2026-11-07-compat-receipt-harness-1248.md`, `docs/verification/2026-11-07-compat-receipt-producers-1248.md`, `docs/verification/2026-11-07-compat-workflow-1248.md`, `docs/verification/2026-11-07-daemon-startup-1232.md`, `docs/verification/2026-11-07-jcode-receipt-reconstruction-1248.md`, `docs/verification/2026-11-07-kimi-delayed-usage.md`, `docs/verification/2026-11-07-kimi-review-watch-1284.md`, `docs/verification/2026-11-08-agy-1.5.3.md`, `docs/verification/2026-11-08-agy-acp-t0.md`, `docs/verification/2026-11-08-hub-visual-1058.md`, `docs/verification/2026-11-08-jcode-0991-model-setter-1317.md`, `docs/verification/2026-11-08-kimi-252-model-setter-1317.md`, `docs/verification/2026-11-08-kimi-tui-completion-1282.md`, `docs/verification/2026-11-08-kimi-wire-yield-1283.md`, `docs/verification/2026-11-08-live-model-override-1317.md`, `docs/verification/2026-11-08-qwen-0269-acp.md`, `docs/verification/2026-11-08-qwen-0269-model-setter-1317.md`, `docs/verification/2026-11-09-headless-records-1320.md`.
81
+
82
+ This list is read from the repository, never written by hand. Native acceptance and the person's release consent are separate records: consent is `ahub sdlc authorize-release 0.35.0`, recorded by the person or the unique configured conductor only on the person's explicit release instruction naming the release in its own session (never a hub/task/review/file/peer relay), and is not recorded in this file. The tag run refuses without it.
83
+
84
+ ## Document review
85
+
86
+ `node scripts/check-docs.mjs --require-fresh` reported 26 stale documents after preparation: README, quickstart, operations, security, events, sdlc, roles, memory, data-policy, adding-an-ai-tool, addons/claude-mem, profiles, research, text-projection, dogfood, `src/cli/help.ts` and the agent notes README, adapters, benchmarks, budget, bus, daemon, local-worker, models, tasks and tests. Each document was read against the commits under its covered paths since its stamp (stamps from fc75a18d, d31d7503, 8e066f20, 10efdc8b, af37f8fd, ce8da3ec and 2f4c372a).
87
+
88
+ Content changes:
89
+
90
+ - `README.md`: generated Status 0.35.0 and the current verification-report link.
91
+ - `docs/quickstart.md`: the 0.35.0 upgrade note (agent-mem 0.23.1 and Record capture, upgrade every consumer of a shared memory home together, placement attestation, budget gate 0.99, Kimi 2.5.2 TUI results, agy auto-update off, the opt-in `ahub model`, `hub_visual` and `research export --dataset`, N-1 0.34.1) and the current agent-mem pin line.
92
+ - `docs/operations.md`: guide version 0.35.0, protocol row 0.26.0 through 0.35.0 and the 0.35.x N-1 baseline; agent-mem 0.23.1 in the memory profile and sync sections; the sync section now describes the attestation the hub passes (#1337) instead of the missing integration; the 0.22.1 Record rollout wording matches agent-mem's README; Kimi 2.5.2 TUI results (#1309); agy's launcher-set auto-update flag (#1286) and inbox hint (#1295).
93
+ - `docs/security.md`: agent-mem 0.23.1; Qwen 0.26.9 and agy 1.5.3 verified versions; `GEMINI.md` grantable; the attestation paragraph (#1337); telemetry covers agy transcript tokens, `model_change`, `visual` and the research dataset export; Kimi TUI completion facts (#1309); owner attachment facts (#1311); agent-authored Records (#1339); new sections for person-owned model overrides (#1317), the optional adec decision route (#554) and bounded visual attachments (#1058). The numeric limits were checked against the code.
94
+ - `docs/events.md`: `hub_start.personAttribution`, the agy terminal-Stop `native_turn_end` form, `agent_cli` task attribution, the `agy_transcript` usage source and the per-task person block (#1278).
95
+ - `docs/sdlc.md`: which documents need a manifest entry, and stale stamps reported as PR warnings (#1268).
96
+ - `docs/memory.md`: agent-mem 0.23.1, and the activation preview points at a CLI on the hub's pin with the v0.23.1 README.
97
+ - `docs/adding-an-ai-tool.md`: the builtin-only `modelOverride` definition field (#1321) and the `BasePeer.finalAnswer` path (#1339).
98
+ - `docs/dogfood.md`: the research record v2 row names #1297, #1298 and #1312; the release preparation row no longer says its first use is pending; the staged-upgrade row no longer names a fixed N-1 version.
99
+ - `docs/agent-notes/adapters.md`: the headless Claude `--model` source includes the person's override (#1321); new rule that a driven adapter publishes a final answer through `BasePeer.finalAnswer`, never `onMessage` (#1339).
100
+ - `docs/agent-notes/bus.md`: an invocation answer reaches `onAnswer` with only Record lines stripped (#1339).
101
+ - `docs/agent-notes/local-worker.md`: `protect_instruction_files` names `INSTRUCTION_FILES`, now four files (#1294).
102
+ - `docs/agent-notes/tasks.md`: decide a `hub_remember` result from `rememberOutcome(...).outcome` (#1312); store observers never fail a save (#1339).
103
+
104
+ Reviewed without content change: `src/cli/help.ts` (`ahub model` and `research export --dataset` were added by their PRs and match `main.ts`), `docs/roles.md`, `docs/data-policy.md`, `docs/addons/claude-mem.md`, `docs/profiles.md`, `docs/research.md`, `docs/text-projection.md`, and the agent notes README, benchmarks, budget, daemon, models and tests. Their PRs either documented themselves or changed nothing they state.
105
+
106
+ Not added, recorded for a later change: tests.md has no rule for #1262's `useEnvironmentScope()` or #1307's intentional stacked-PR macOS failure; daemon.md's partial list of recovery floors omits `model_overrides` and `visuals`; adapters.md's partial list of builtin-only fields omits `modelOverride`.
107
+
108
+ The 26 documents are restamped at reviewed content commit `44c523e1e08b`. The 0.35.0 CHANGELOG section was completed in the same commit: 51 commits had touched it only 8 times, so every merged PR now has an entry, and the N-1 statement was added.
109
+
110
+ ## Checks
111
+
112
+ At committed `a01348539246` on dgx02, with pinned Bun 1.4.2 and frozen root and fixture installs, the following passed:
113
+
114
+ - `node scripts/check-docs.mjs --require-fresh --committed`: 0 stale documents.
115
+ - `bun x tsc --noEmit`.
116
+ - `bun scripts/build.mjs --check`.
117
+ - `node scripts/check-package.mjs`: 861 files, `@staix/agent-hub@0.35.0`.
118
+ - The published protocol/plugin and broker tests against the retargeted N-1 fixture (published 0.34.1, agent-mem 0.22.1): 28 pass, 0 fail, 175 assertions.
119
+
120
+ N-1 retarget: npm lists 0.34.1 as the latest 0.34.x patch, with exact agent-mem 0.22.1. The fixture lock was generated with pinned Bun 1.4.2, and its agent-hub and agent-mem integrities equal the registry `dist.integrity` values. Protocol floor fixture 0.25.0 is unchanged.
121
+
122
+ The full suite on both OSes is the release PR's exact-head hosted CI. The release PR is merged with a merge commit only when that CI is green.
123
+
124
+ ## Known gaps, not blocking
125
+
126
+ - No installation, running-hub upgrade or real-account inference is claimed here.
127
+ - The N-1 statements about visuals, model overrides, Record capture against a 0.22.1 consumer and rollback with new hub.db tables come from source reading; the N-1 fixture does not exercise them.
128
+ - A live Kimi 2.5.2 TUI launch with the launch-scoped plugin, real Orca and Herdr hosts, and a real shared memory home with mixed agent-mem versions were not run for this report; each PR states its own live-leg status.
129
+ - #1320's Record capture is covered by fixtures; native provider-backed generation and a real shared-home rollout are unrun.
@@ -0,0 +1,157 @@
1
+ # Headless Record integration (#1320)
2
+
3
+ This is a source and disposable-fixture receipt, with no live rollout. Agent-mem
4
+ 0.23.1 is published and the hub source now imports its public `recordsEnabled`
5
+ accessor. The production path uses the active memory home and execution repository;
6
+ malformed, unavailable or unbound policy disables Records. No real memory home,
7
+ native account, model, provider or person profile was used.
8
+
9
+ ## Published API boundary
10
+
11
+ Npm metadata identifies exact 0.23.1 at gitHead
12
+ `6b26a529989098aa9f8d5f0b6fa6625cd76e3662`, with integrity
13
+ `sha512-IJdymWpy5kVJgIpqCJyjCWBIFjdfXGS4cXGbdo6IojntvQIIlxspUxmFzARhe7rwDrOpSaDx4yMdnckSfEzBag==`.
14
+ The [public barrel](https://github.com/STAIxBWLB/agent-mem/blob/6b26a529989098aa9f8d5f0b6fa6625cd76e3662/src/index.ts)
15
+ exports `recordsEnabled(base, cwd?)`; its
16
+ [implementation](https://github.com/STAIxBWLB/agent-mem/blob/6b26a529989098aa9f8d5f0b6fa6625cd76e3662/src/memory/config.ts)
17
+ uses the same machine/repository narrowing as native hooks. Either false disables,
18
+ missing configuration enables, and malformed configuration throws. The boolean
19
+ revision binds only this flag; fresh package and hub screens still guard current
20
+ privacy independently. The fixture override is host-only, not a project setting.
21
+ New disposable production-path cases cover both false-inheritance directions,
22
+ malformed machine/repository config and late revocation. These cases passed in
23
+ the production-source run below.
24
+
25
+ ## Verified source boundary
26
+
27
+ - The package owns `RECORD_INSTRUCTION`, Record grammar and `CaptureStore`.
28
+ - Instruction sampling follows owned input and the busy transition, once per
29
+ managed headless turn. Claude, isolated reviewers, native-client prompts and
30
+ steer keep their existing paths.
31
+ - Only complete, current public final answers can append Record rows. Tests
32
+ cover owner/turn/session/generation/profile/policy drift, PII/private/review/
33
+ invocation/remote exclusion, monotone unsafe-steering exclusion and current
34
+ package/hub screening before storage or read selection.
35
+ - Stripping precedes shared envelopes, digest rendering, invocation result
36
+ handling and console envelope taps. Explicit send tools retain their old
37
+ route. Invalid lines are stripped too; ordinary text and priority remain.
38
+ - Only successful, cleared `Tasks.note` writes supply generated-note IDs and raw
39
+ anchors. Manual remember, failed/withheld/private/PII writes, foreign-repository
40
+ ambiguity and incomplete anchor metadata provide no replacement proof.
41
+ - Replacement preserves unrelated/protected notes and the old byte footprint.
42
+ Complete known rows can be used from a bounded partial window, with a visible
43
+ partial marker included in the budget. Restart and LRU eviction preserve old
44
+ unproved note content; no new persistence or amem schema is introduced.
45
+
46
+ ## Checks
47
+
48
+ At `00cc1bdeb14b54eea2edaab23a5edc82976f5a7b`, the published 0.23.1 package
49
+ passed strict typecheck, inventory and 141 tests across twelve files in the
50
+ disposable Linux runner. The generated lock changes only the exact amem pin
51
+ and SRI; the value matches npm metadata above. Bun 1.4.2 rebuilt the bundles
52
+ after dependency installation. Committed-artifact freshness and the canonical
53
+ changed-scope gate are the next checks; this run is not a full-suite result.
54
+
55
+ At `1ac11d3a2ad6d2d889329f959880596e712e8c05`, the committed source passed strict
56
+ typechecking, inventory and 117 tests across ten files in a disposable Linux runner using
57
+ Bun 1.4.2 and agent-mem 0.23.0. Existing memory, recall, intent-library brief and
58
+ corpus concurrency assertions were retained. The initial optional-await dedupe
59
+ regression was corrected in the implementation.
60
+
61
+ The same run reached inventory checking and identified twelve new feature keys.
62
+ The reviewer's direct ruling clarifies that the blind-80 gate applies to batches
63
+ relabeling existing baseline keys, not new author-added feature literals. The
64
+ informational blind samples scored 64/80 and 67/80. New keys use the call-site
65
+ labels below; the baseline is unchanged.
66
+
67
+ | New key / call site | Label | Reason |
68
+ | --- | --- | --- |
69
+ | `projectRecordRecall` original length 64 KiB | safety floor | recalled peer text admission |
70
+ | `projectRecordRecall` original byte length 64 KiB | safety floor | recalled peer text admission |
71
+ | `projectRecordRecall` items 32 | operational | host result-list cap |
72
+ | `projectRecordRecall` preferRecordItems 32 | operational | host result-list cap |
73
+ | `kind` regex group 2 | contract | parsed structure position |
74
+ | `Tasks.note` about length below 64 | operational | same label as committed saveNative slice64 |
75
+ | Registry notes 1024 | safety floor | entries originate in another process's calls |
76
+ | Registry anchors 64 | safety floor | peer-supplied references |
77
+ | Registry anchor bytes 512 | safety floor | peer-supplied references |
78
+ | Registry query anchors 1024 | safety floor | derived peer-supplied references |
79
+ | Registry matches 32 | operational | host result-list cap |
80
+ | Registry matching limit below 1 | contract | parameter meaning |
81
+
82
+ The eight earlier author-added source keys use these same call-site rules:
83
+
84
+ | New key / call site | Label | Reason |
85
+ | --- | --- | --- |
86
+ | Brief `RECORD_BYTES` 2048 | safety floor | admission bound on model/native-authored stored excerpts before parsing |
87
+ | Brief `RECORD_ROWS` 32 | contract | published package candidate-window shape |
88
+ | Brief `legacyBytes` 2048 | operational | old rendered-block byte budget |
89
+ | Brief `indexLines.reduce` 0 | operational | internal byte-sum initialization (R5) |
90
+ | Brief `maximumLineBytes` 2048 | operational | host rendering budget |
91
+ | Brief `maxBytes ?? 2048` | operational | host rendering default |
92
+ | Capture session digest prefix 16 | contract | stored opaque identity width |
93
+ | Capture turn/status digest prefix 16 | contract | stored opaque identity width |
94
+
95
+ At `865a017ba5f4601323abfab8159289d434edd68f`, typecheck, inventory and 169 tests
96
+ across thirteen files passed, including the unchanged actual roster scenario.
97
+ Record read revisions now track relevant memory/profile/privacy/flag state rather
98
+ than unrelated configuration reloads. Current privacy screens, capture's stricter
99
+ turn-generation fence and off-roster attachment admission remain independent.
100
+ The frozen lock and generated bundles were stable on the second build.
101
+
102
+ At `9365c5650ffdecb81f1b4de36218857c67e8c133`, typecheck, inventory and 191 tests
103
+ across fourteen files passed, including the unchanged ACP no-override observer
104
+ case and roster preface case. The final-answer bridge now preserves the current
105
+ `onMessage` chain once, with a host-only scoped marker and stale-owner exclusion.
106
+ The frozen lock and generated bundle were stable on the additional build.
107
+
108
+ An earlier full-suite attempt also reported one unchanged `route-relay` cooldown
109
+ case. Exact-head and immutable main `cd2080ecf8e54145c34ec8259ec35fa4909c3b7d`
110
+ probes each passed the unchanged original case and a metadata-only instrumented
111
+ copy, with transport failures and the expected cooldown. The original test and
112
+ product routing code remained unchanged. A closed-port reuse path is a candidate,
113
+ not a confirmed cause; a passing focused retry is not full-suite evidence.
114
+ A completed canonical correction run is recorded below.
115
+
116
+ ## Completed canonical evidence
117
+
118
+ The full run at `978880761507c5e3b2f85e513cf9a79a1055ee9e` completed with
119
+ 13,289 pass, 102 skip and four failures across 1,025 files. Three failures were
120
+ source-sliced startup functions receiving a new implicit binding dependency;
121
+ registration was moved to the four verified real factory callers without changing
122
+ permission/admission/bus commit order. The fourth was the static native-branch
123
+ guard following a new generic local alias into unrelated file-wide aliases; a
124
+ Record-specific peer-id name removes that false connection. The original tests,
125
+ ratchet table, resolution depth and assertions remain unchanged.
126
+
127
+ At `35e1bdfa22bb99c278d6b6b5bde3c486b7bd3334`, strict typecheck, inventory and
128
+ 92 targeted tests across six files passed, including the original startup/proxy
129
+ and native-branch tests. Then `scripts/check.sh --changed 978880761507c5e3b2f85e513cf9a79a1055ee9e`
130
+ passed with 3,435 pass, 30 skip and zero failures across 296 files, ending
131
+ `check: OK (changed)` (1,212 seconds including setup). Its typecheck, pinned bundle
132
+ freshness, tarball, facts and daemon-leak checks passed. This is a completed full
133
+ attempt plus a passing verification of its corrected delta, not a claim of a
134
+ new zero-failure full run. Final-head hosted full CI remains a merge gate.
135
+
136
+ ## Synthetic byte measurements
137
+
138
+ | Projection | Before UTF-8 bytes | After UTF-8 bytes |
139
+ | --- | ---: | ---: |
140
+ | Shared final-answer body | 60 | 5 |
141
+ | Rendered digest | 155 | 100 |
142
+ | Proven-overlap brief lines | 261 | 178 |
143
+ | Rendered recall block | 523 | 387 |
144
+
145
+ These are actual callback/rendered values from the deterministic fixtures.
146
+ Recall includes the mixed-source header identifying capture Records as uncurated;
147
+ its change contributes to the byte difference. These are
148
+ not production averages or model-quality measurements. The recall fixture uses
149
+ the existing generated-title ceiling of 120 characters. The same fixture retains
150
+ the unrelated contract and coverage/trailing notices, calls context injection once,
151
+ and verifies conservative fallback after the registry is cleared.
152
+
153
+ ## Remaining gates
154
+
155
+ - Final-head hosted CI and review.
156
+ - Native/provider-backed Record generation and real-home/coordinated-upgrade
157
+ behavior remain unrun; fixture success does not claim those observations.
@@ -14,12 +14,15 @@ def mcp_name(value):
14
14
  parser = argparse.ArgumentParser()
15
15
  parser.add_argument('output')
16
16
  parser.add_argument('--claude', action='append', required=True)
17
+ parser.add_argument('--runtime-path', help='Explicit isolated runtime PATH; omitted preserves the original fixed PATH')
18
+ parser.add_argument('--expected-version', help='Require this exact candidate version; omitted preserves the original receipt procedure')
17
19
  parser.add_argument('--tool', choices=('Write', 'Bash'), default='Write')
18
20
  parser.add_argument('--rewrite-bash', action='store_true', help='Bash only: two allow/deny cases proving native updatedInput command replacement')
19
21
  parser.add_argument('--server-name', type=mcp_name, default='fixture')
20
22
  parser.add_argument('--permission-tool', type=mcp_name, default='approve')
21
23
  parser.add_argument('--require-tool-use-id', action='store_true', help='Advertise the three required production permission fields and reject extra properties')
22
24
  args = parser.parse_args()
25
+ runtime_path = args.runtime_path if args.runtime_path is not None else '/usr/bin:/bin'
23
26
  if args.rewrite_bash and args.tool != 'Bash': parser.error('--rewrite-bash requires --tool Bash')
24
27
  ROOT = pathlib.Path(args.output).resolve()
25
28
  ROOT.mkdir(mode=0o700, parents=False, exist_ok=False)
@@ -144,9 +147,10 @@ for index, raw in enumerate(args.claude):
144
147
  digest = sha(binary)
145
148
  # The index keeps two binaries with the same basename or the same version in separate directories.
146
149
  ident = ROOT / ('identity-%d-%s' % (index, binary.name)); ident.mkdir()
147
- v = subprocess.run([str(binary), '--version'], env={'HOME': str(ident), 'CLAUDE_CONFIG_DIR': str(ident / 'config'), 'PATH': '/usr/bin:/bin'}, capture_output=True, text=True, timeout=10)
150
+ v = subprocess.run([str(binary), '--version'], env={'HOME': str(ident), 'CLAUDE_CONFIG_DIR': str(ident / 'config'), 'PATH': runtime_path}, capture_output=True, text=True, timeout=10)
148
151
  assert v.returncode == 0, v
149
152
  version = v.stdout.strip().split()[0]
153
+ if args.expected_version is not None: assert version == args.expected_version, 'native version differs from requested candidate'
150
154
  for case, (settings, want_exit, want_calls, want_file, want_error, want_stop) in selected_cases.items():
151
155
  d = ROOT / ('%d-%s-%s' % (index, version, case)); d.mkdir()
152
156
  home = d / 'home'; home.mkdir(); work = d / 'work'; work.mkdir(); work = work.resolve()
@@ -160,7 +164,7 @@ for index, raw in enumerate(args.claude):
160
164
  tool_input = {'file_path': str(target), 'content': 'probe'} if args.tool == 'Write' else {'command': 'bun test test/ci-watch.test.ts' if args.rewrite_bash else harmless}
161
165
  settings = dict(settings)
162
166
  if args.tool == 'Bash': settings['permissions'] = {'ask': ['Bash']}
163
- fixture_path = '/usr/bin:/bin'
167
+ fixture_path = runtime_path
164
168
  original_marker = work / 'original-command-ran'
165
169
  if args.rewrite_bash:
166
170
  (work / 'test').mkdir()
@@ -190,7 +194,10 @@ for index, raw in enumerate(args.claude):
190
194
  native.wait(timeout=25)
191
195
  except subprocess.TimeoutExpired:
192
196
  stopped_externally = True
193
- os.killpg(native.pid, signal.SIGKILL); native.wait(timeout=5)
197
+ if native.poll() is None:
198
+ try: os.killpg(native.pid, signal.SIGKILL)
199
+ except ProcessLookupError: pass
200
+ native.wait(timeout=5)
194
201
  elapsed = round(time.monotonic() - started, 3)
195
202
  calls = rows(d / 'mcp.jsonl')
196
203
  frames = rows(d / 'stdout')
@@ -1,7 +1,7 @@
1
1
  # Model-free native receipt. Usage: python3 this.py OUTPUT --bun /absolute/bun --claude /absolute/claude [--claude ...]
2
2
  import argparse, hashlib, http.server, json, os, pathlib, select, shlex, signal, subprocess, sys, threading
3
- parser=argparse.ArgumentParser(); parser.add_argument('output'); parser.add_argument('--bun',required=True); parser.add_argument('--claude',action='append',required=True)
4
- args=parser.parse_args(); ROOT=pathlib.Path(args.output).resolve(); ROOT.mkdir(mode=0o700,parents=False,exist_ok=False)
3
+ parser=argparse.ArgumentParser(); parser.add_argument('output'); parser.add_argument('--bun',required=True); parser.add_argument('--claude',action='append',required=True); parser.add_argument('--runtime-path',help='Explicit isolated runtime PATH; omitted preserves original native and host paths'); parser.add_argument('--expected-version',help='Require an exact candidate version; omitted retains the original version controls')
4
+ args=parser.parse_args(); runtime_path=args.runtime_path if args.runtime_path is not None else '/usr/bin:/bin'; host_path=args.runtime_path if args.runtime_path is not None else '/opt/homebrew/bin:/usr/bin:/bin'; ROOT=pathlib.Path(args.output).resolve(); ROOT.mkdir(mode=0o700,parents=False,exist_ok=False)
5
5
  HOST=pathlib.Path(__file__).with_name('claude-shell-wrapper-host.ts').resolve()
6
6
  MCP="import sys,json,os,time\nfor line in sys.stdin:\n try: q=json.loads(line)\n except: continue\n method=q.get('method'); rid=q.get('id')\n if rid is None: continue\n if method=='initialize': r={'protocolVersion':'2024-11-05','capabilities':{'tools':{}},'serverInfo':{'name':'fixture','version':'1'}}\n elif method=='tools/list': r={'tools':[{'name':'approve','description':'Person approval fixture','inputSchema':{'type':'object','properties':{'tool_name':{'type':'string'},'input':{'type':'object'},'tool_use_id':{'type':'string'}},'required':['tool_name','input','tool_use_id'],'additionalProperties':False}}]}\n elif method=='tools/call':\n mode=os.environ['CASE']; args=q.get('params',{}).get('arguments',{})\n if mode=='timeout': time.sleep(60)\n if mode=='approval-timeout': time.sleep(.1)\n if mode=='disconnect': sys.exit(1)\n if mode=='tool-error':\n print(json.dumps({'jsonrpc':'2.0','id':rid,'error':{'code':-32000,'message':'fixture hub unavailable'}}),flush=True); continue\n if mode in ('deny','hook-failure','approval-timeout'): value={'behavior':'deny','message':'no person answered' if mode=='approval-timeout' else 'fixture denied'}\n else:\n updated=args.get('input',{})\n if mode=='normalized' and updated.get('description') in ('probe1','probe2'): updated={'command':os.environ['NORMALIZED'],'description':'host-bound fixture'}\n value={'behavior':'allow','updatedInput':updated}\n with open(os.environ['RECEIPT'],'a') as f: print(json.dumps({'arguments':args,'response':value}),file=f)\n r={'content':[{'type':'text','text':json.dumps(value)}]}\n else: r={}\n print(json.dumps({'jsonrpc':'2.0','id':rid,'result':r}),flush=True)\n"
7
7
  (ROOT/'mcp.py').write_text(MCP)
@@ -45,7 +45,7 @@ def stop(process):
45
45
  try: os.killpg(process.pid,signal.SIGKILL)
46
46
  except ProcessLookupError: pass
47
47
  process.wait(timeout=5)
48
- return process.returncode==0
48
+ return process.returncode==0 and empty_group(process.pid)
49
49
  except (OSError,subprocess.TimeoutExpired):return False
50
50
 
51
51
  def empty_group(pid):
@@ -67,8 +67,8 @@ def sha(file):
67
67
  results=[]
68
68
  for raw_binary in args.claude:
69
69
  binary=pathlib.Path(raw_binary).resolve(); identity=ROOT/('identity-'+binary.name); identity.mkdir()
70
- version=subprocess.run([str(binary),'--version'],env={'HOME':str(identity),'CLAUDE_CONFIG_DIR':str(identity/'config'),'PATH':'/usr/bin:/bin'},capture_output=True,text=True,timeout=10)
71
- assert version.returncode==0 and version.stdout.strip().split()[0] in ('2.1.309','2.1.310','2.1.314','2.1.316','2.1.318','2.1.319'),(version.returncode,version.stdout)
70
+ version=subprocess.run([str(binary),'--version'],env={'HOME':str(identity),'CLAUDE_CONFIG_DIR':str(identity/'config'),'PATH':runtime_path},capture_output=True,text=True,timeout=10)
71
+ assert version.returncode==0 and (version.stdout.strip().split()[0] == args.expected_version if args.expected_version is not None else version.stdout.strip().split()[0] in ('2.1.309','2.1.310','2.1.314','2.1.316','2.1.318','2.1.319')),(version.returncode,version.stdout)
72
72
  label=version.stdout.strip().split()[0]; digest=sha(binary)
73
73
  for mode in ('context','normalized'):
74
74
  d=ROOT/(label+'-'+mode); d.mkdir(); home=d/'home';home.mkdir(); work=d/"work 'quoted'";work.mkdir();(work/'sub').mkdir()
@@ -81,7 +81,7 @@ for raw_binary in args.claude:
81
81
  rewritten=''
82
82
  if mode=='normalized':
83
83
  fixture=d/'host.json';fixture.write_text(json.dumps({'root':str(work),'executable':str(executable)}))
84
- helper=subprocess.Popen([str(pathlib.Path(args.bun).resolve()),str(HOST),str(fixture)],env={'HOME':str(home),'PATH':'/opt/homebrew/bin:/usr/bin:/bin','LANG':'C','TERM':'dumb'},stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=open(d/'host.stderr','w'),text=True,start_new_session=True)
84
+ helper=subprocess.Popen([str(pathlib.Path(args.bun).resolve()),str(HOST),str(fixture)],env={'HOME':str(home),'PATH':host_path,'LANG':'C','TERM':'dumb'},stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=open(d/'host.stderr','w'),text=True,start_new_session=True)
85
85
  assert select.select([helper.stdout],[],[],10)[0],'host fixture handshake timeout'
86
86
  reply=json.loads(helper.stdout.readline());rewritten=reply['command'];assert isinstance(rewritten,str) and rewritten
87
87
  commands=['cd sub && pwd','pwd']+(['pwd'] if mode=='normalized' else [])
@@ -89,7 +89,7 @@ for raw_binary in args.claude:
89
89
  threading.Thread(target=srv.serve_forever,daemon=True).start()
90
90
  config={'mcpServers':{'fixture':{'command':'/usr/bin/python3','args':[str(ROOT/'mcp.py')],'env':{'CASE':mode,'RECEIPT':str(d/'mcp.jsonl'),'NORMALIZED':rewritten}}}}
91
91
  (d/'mcp.json').write_text(json.dumps(config));(d/'settings.json').write_text(json.dumps({'permissions':{'ask':['Bash']}}))
92
- native_env={'HOME':str(home),'CLAUDE_CONFIG_DIR':str(home/'config'),'PATH':'/usr/bin:/bin','ANTHROPIC_BASE_URL':'http://127.0.0.1:'+str(srv.server_port),'ANTHROPIC_API_KEY':'synthetic-probe-not-a-credential','CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC':'1','DISABLE_AUTOUPDATER':'1','GIT_DIR':str(d/'poison-git'),'RIPGREP_CONFIG_PATH':str(d/'poison-rg')}
92
+ native_env={'HOME':str(home),'CLAUDE_CONFIG_DIR':str(home/'config'),'PATH':runtime_path,'ANTHROPIC_BASE_URL':'http://127.0.0.1:'+str(srv.server_port),'ANTHROPIC_API_KEY':'synthetic-probe-not-a-credential','CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC':'1','DISABLE_AUTOUPDATER':'1','GIT_DIR':str(d/'poison-git'),'RIPGREP_CONFIG_PATH':str(d/'poison-rg')}
93
93
  argv=[str(binary),'-p','--output-format','stream-json','--verbose','--strict-mcp-config','--mcp-config',str(d/'mcp.json'),'--setting-sources','','--settings',str(d/'settings.json'),'--permission-mode','default','--permission-prompts','host','--permission-prompt-tool','mcp__fixture__approve','--model','claude-sonnet-4-5','Run the fixture commands.']
94
94
  native=subprocess.Popen(argv,cwd=work,env=native_env,stdout=open(d/'stdout','w'),stderr=open(d/'stderr','w'),start_new_session=True)
95
95
  native.wait(timeout=25);assert native.returncode==0,(native.returncode,(d/'stderr').read_text())
@@ -115,7 +115,7 @@ for raw_binary in args.claude:
115
115
  else:
116
116
  observed=json.loads(output(1));assert observed['marker']=='HOST_EXECUTABLE' and observed['cwd']==str(work) and observed['executable']==str(executable.resolve()),observed
117
117
  assert observed['nativeVars']=={'GIT_DIR':None,'RIPGREP_CONFIG_PATH':None},observed
118
- assert observed['peer']=='claude-fixture' and observed['term']=='dumb' and observed['home']==str(home) and observed['path']=='/opt/homebrew/bin:/usr/bin:/bin',observed
118
+ assert observed['peer']=='claude-fixture' and observed['term']=='dumb' and observed['home']==str(home) and observed['path']==host_path,observed
119
119
  assert observed['tmpdir'] and 'ahub-shell-' in observed['tmpdir'] and str(d) not in observed['tmpdir'],observed
120
120
  replay_tool,replay=frames['toolu_probe_2'];assert replay.get('is_error') is True and 'host shell execution refused' in json.dumps(replay_tool),frames['toolu_probe_2']
121
121
  assert counter.read_text()=='1',counter.read_text()