@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.
- package/CHANGELOG.md +47 -0
- package/README.md +35 -6
- package/docs/adding-an-ai-tool.md +2 -2
- package/docs/addons/claude-mem.md +4 -4
- package/docs/addons/open-code-review.md +1 -1
- package/docs/agent-notes/README.md +6 -0
- package/docs/agent-notes/adapters.md +9 -5
- package/docs/agent-notes/budget.md +1 -1
- package/docs/agent-notes/bus.md +1 -1
- package/docs/agent-notes/daemon.md +4 -3
- package/docs/agent-notes/local-worker.md +1 -1
- package/docs/agent-notes/models.md +2 -0
- package/docs/agent-notes/tasks.md +1 -1
- package/docs/agent-notes/tests.md +5 -0
- package/docs/design/adapters.md +110 -2
- package/docs/design/agent-hub-architecture.md +63 -1
- package/docs/design/agent-hub.md +6 -0
- package/docs/design/bus.md +18 -0
- package/docs/design/execution-reference.md +146 -0
- package/docs/design/task-board.md +10 -0
- package/docs/dogfood.md +33 -12
- package/docs/events.md +38 -20
- package/docs/memory.md +21 -7
- package/docs/operations.md +539 -24
- package/docs/quickstart.md +12 -4
- package/docs/research.md +71 -13
- package/docs/roles.md +1 -1
- package/docs/sdlc.md +9 -7
- package/docs/security.md +87 -11
- package/docs/smoke.md +14 -0
- package/docs/specs/2026-09-19-agent-hub-design.md +8 -3
- package/docs/verification/2026-11-07-compat-python-startup-1248.md +51 -0
- package/docs/verification/2026-11-07-compat-receipt-harness-1248.md +105 -0
- package/docs/verification/2026-11-07-compat-receipt-producers-1248.md +96 -0
- package/docs/verification/2026-11-07-compat-workflow-1248.md +94 -0
- package/docs/verification/2026-11-07-daemon-startup-1232.md +169 -0
- package/docs/verification/2026-11-07-jcode-receipt-reconstruction-1248.md +118 -0
- package/docs/verification/2026-11-07-kimi-delayed-usage.md +34 -0
- package/docs/verification/2026-11-07-kimi-review-watch-1284.md +115 -0
- package/docs/verification/2026-11-08-agy-1.5.3.md +96 -0
- package/docs/verification/2026-11-08-agy-acp-t0.md +56 -0
- package/docs/verification/2026-11-08-hub-visual-1058.md +161 -0
- package/docs/verification/2026-11-08-jcode-0991-model-setter-1317.md +143 -0
- package/docs/verification/2026-11-08-kimi-252-model-setter-1317.md +137 -0
- package/docs/verification/2026-11-08-kimi-tui-completion-1282.md +45 -0
- package/docs/verification/2026-11-08-kimi-wire-yield-1283.md +31 -0
- package/docs/verification/2026-11-08-live-model-override-1317.md +250 -0
- package/docs/verification/2026-11-08-qwen-0269-acp.md +138 -0
- package/docs/verification/2026-11-08-qwen-0269-model-setter-1317.md +91 -0
- package/docs/verification/2026-11-09-0.35.0.md +129 -0
- package/docs/verification/2026-11-09-headless-records-1320.md +157 -0
- package/docs/verification/claude-permission-transport-native.py +10 -3
- package/docs/verification/claude-shell-wrapper-native.py +8 -8
- package/docs/verified.json +245 -15
- package/package.json +3 -3
- package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
- package/plugins/agent-hub/kimi-hook.js +20397 -0
- package/plugins/agent-hub/kimi-review-policy-worker.js +217 -0
- package/plugins/agent-hub/server.js +2701 -664
- package/scripts/check-docs.mjs +12 -1
- package/src/adapters/acp-model-policy.ts +56 -0
- package/src/adapters/acp.ts +175 -5
- package/src/adapters/agy/entry.ts +8 -5
- package/src/adapters/agy/hooks.ts +65 -15
- package/src/adapters/channel-peer.ts +33 -1
- package/src/adapters/claude-implementer.ts +16 -3
- package/src/adapters/codex-appserver.ts +118 -8
- package/src/adapters/codex-review-isolation.ts +3 -1
- package/src/adapters/compat.ts +11 -6
- package/src/adapters/definitions/builtin-metadata.ts +8 -1
- package/src/adapters/definitions/native-cli-entry-kimi.ts +76 -7
- package/src/adapters/definitions/native-cli-preview-common.ts +2 -2
- package/src/adapters/definitions/native-cli-preview-kimi.ts +9 -2
- package/src/adapters/definitions/reviewer-variants.ts +3 -1
- package/src/adapters/kimi-review-policy-worker.js +2 -0
- package/src/adapters/kimi-review-policy-worker.ts +85 -0
- package/src/adapters/kimi-review-policy.ts +68 -0
- package/src/adapters/kimi-review.ts +41 -41
- package/src/adapters/kimi-tui-facts.ts +153 -0
- package/src/adapters/kimi-wire-usage.ts +33 -8
- package/src/adapters/local-worker.ts +59 -20
- package/src/adapters/model-token.ts +3 -0
- package/src/adapters/pi.ts +27 -5
- package/src/adapters/registry-types.ts +34 -3
- package/src/adapters/registry.ts +1 -0
- package/src/adapters/reviewer-policy-watch.ts +86 -0
- package/src/adapters/reviewer-print.ts +80 -18
- package/src/cli/agents.ts +1 -1
- package/src/cli/facts-hook.ts +4 -2
- package/src/cli/help.ts +3 -2
- package/src/cli/identity.ts +3 -0
- package/src/cli/kimi-facts-hook.ts +11 -0
- package/src/cli/kimi-plugin.ts +157 -0
- package/src/cli/main.ts +48 -9
- package/src/cli/model.ts +52 -0
- package/src/cli/output.ts +23 -1
- package/src/cli/reset.ts +1 -1
- package/src/cli/status-lines.ts +8 -4
- package/src/hub/budget.ts +1 -1
- package/src/hub/bus.ts +40 -2
- package/src/hub/code-facts.ts +10 -3
- package/src/hub/completions.ts +3 -1
- package/src/hub/config-apply.ts +2 -1
- package/src/hub/control-client.ts +1 -1
- package/src/hub/daemon.ts +1050 -106
- package/src/hub/deliverable-files.ts +38 -5
- package/src/hub/dogfood-profile.ts +1 -1
- package/src/hub/envelope.ts +1 -1
- package/src/hub/events.ts +28 -18
- package/src/hub/execution-lineage.ts +120 -0
- package/src/hub/execution-reference.ts +36 -0
- package/src/hub/hub-tools.ts +21 -2
- package/src/hub/instances.ts +4 -3
- package/src/hub/kimi-events.ts +46 -0
- package/src/hub/kimi-usage.ts +132 -29
- package/src/hub/lifecycle.ts +31 -15
- package/src/hub/limits.ts +13 -4
- package/src/hub/manager.ts +15 -2
- package/src/hub/memory-policy.ts +2 -1
- package/src/hub/memory-sync-attestation.ts +54 -0
- package/src/hub/memory-sync-state.ts +20 -5
- package/src/hub/model-overrides.ts +115 -0
- package/src/hub/native-hook-launch.ts +12 -3
- package/src/hub/operational-view.ts +2 -2
- package/src/hub/peers.ts +27 -0
- package/src/hub/permission-mode.ts +1 -1
- package/src/hub/person-figures.ts +88 -0
- package/src/hub/report.ts +38 -4
- package/src/hub/research-dataset.ts +158 -0
- package/src/hub/research-memory.ts +68 -0
- package/src/hub/research-quality.ts +118 -0
- package/src/hub/research-record.ts +279 -0
- package/src/hub/research.ts +126 -27
- package/src/hub/restart.ts +14 -0
- package/src/hub/settings.ts +3 -0
- package/src/hub/startup-event-seeds.ts +51 -0
- package/src/hub/startup-readiness.ts +65 -0
- package/src/hub/startup-timing.ts +38 -0
- package/src/hub/tasks.ts +29 -9
- package/src/hub/ui.ts +9 -5
- package/src/hub/visual-assets.ts +50 -0
- package/src/hub/visual.ts +257 -0
- package/src/memory/brief.ts +169 -14
- package/src/memory/capture.ts +2 -1
- package/src/memory/recall.ts +46 -5
- package/src/memory/record-provenance.ts +82 -0
- package/src/memory/records.ts +116 -0
- package/src/models/route/adec.ts +190 -0
- package/src/models/route/config.ts +37 -3
- package/src/models/route/decision-evidence.ts +83 -0
- package/src/models/route/decision.ts +143 -0
- package/src/models/route/runtime.ts +13 -6
- package/src/ui/index.html +134 -6
- package/src/ui/plugin.ts +65 -4
- package/templates/AGENTS.block.md +1 -1
- package/templates/config.json +1 -1
- package/templates/profiles/general.json +1 -1
- package/templates/profiles/research.json +1 -1
- 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':
|
|
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 =
|
|
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
|
-
|
|
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':
|
|
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':
|
|
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':
|
|
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']==
|
|
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()
|