@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,51 @@
1
+ # Bounded Python receipt-helper startup (#1248 T1)
2
+
3
+ Date: 2026-11-07. Task #775, Refs #1248. Hosted [measurement run 42361191648](https://github.com/STAIxBWLB/agent-hub/actions/runs/42361191648). Exact measurement source: `e9e10b8f1130d02dd5c9907ddc2507671a3e2d25`.
4
+
5
+ All 12 planned artifacts are present: three fresh hosted-VM jobs per OS/helper mode. Source SHA, committed helper SHA-256, flags, replicate identity, runner OS/architecture, metadata scalars and all helper/refusal outcomes validate. This follow-up selects an 8000 ms helper allowance from this complete series and the larger prior completed CI observation below.
6
+
7
+ | OS / architecture | Actual mode | Cold ms, replicates 1 / 2 / 3 | Cold max ms | Warm samples | Warm max ms |
8
+ | --- | --- | --- | ---: | ---: | ---: |
9
+ | macOS arm64 | output-check (-I) | 1067.451583 / 1435.647209 / 1578.762166 | 1578.762166 | 15 | 131.304500 |
10
+ | macOS arm64 | extract (no -I) | 1187.909083 / 1129.775667 / 2032.190459 | 2032.190459 | 15 | 101.507000 |
11
+ | Ubuntu x64 | output-check (-I) | 26.032033 / 20.150258 / 24.773280 | 26.032033 | 15 | 27.823435 |
12
+ | Ubuntu x64 | extract (no -I) | 33.736413 / 23.114327 / 34.226551 | 34.226551 | 15 | 32.182228 |
13
+
14
+ Counts: 12 cold, 60 warm, 12 refusal controls and 12 later interpreter metadata invocations, 96 total observations. Censored: 0. Errors: 0. Refusal controls: 12/12 expected exit 2. No failed or censored observation was dropped.
15
+
16
+ ## Binding and procedure
17
+
18
+ - Output check uses the exact committed `write-output.py` with production `-I` and an inherited owned directory capability at FD3. The occupied-output refusal is unchanged.
19
+ - Extraction uses the exact committed `extract-archive.py`, without `-I` as production does. Node zlib creates the tiny public regular-file ustar before the first Python execution; the traversal archive is a separate refusal control.
20
+ - No Bun/npm installation, setup-python, native agent, account, model, or interpreter metadata probe precedes the first helper. Warm samples and refusal controls precede the interpreter metadata invocation.
21
+ - The controlled launcher records its first Python invocation; no claim is made that the OS/image caches were absolutely cold. Each child has a 15000 ms measurement ceiling and 4096-byte output cap. A timeout would remain right-censored; none occurred.
22
+
23
+ | Helper | SHA-256 at measured commit |
24
+ | --- | --- |
25
+ | output-check | `a6e056a59506922d4e15765495cec6e15cc33568ad6fdf90f5cc30c7b344217b` |
26
+ | extract | `7daf837943d279f2e72ca7e03cc8e6ea3c0bc9ab1eda6db738f20d57045c7eb3` |
27
+
28
+ | OS | Interpreter | Runner image |
29
+ | --- | --- | --- |
30
+ | darwin | CPython 3.9.6 | macos15 20261104.0514.1 |
31
+ | linux | CPython 3.12.3 | ubuntu24 20261101.360.1 |
32
+
33
+ ## Eight-second sizing tradeoff
34
+
35
+ The complete series has maximum cold time 2032.190459 ms (macOS extractor replicate 3). The separately recorded completed CI extractor sample remains larger: 3835.40 ms in [run 42355168440](https://github.com/STAIxBWLB/agent-hub/actions/runs/42355168440), macOS shard 1/4; it is not one of these 12 samples and is not discarded. Twice that known completed sample is 7670.80 ms. The selected 8000 ms helper allowance is 2.0858 times that prior sample, leaving 4164.60 ms beyond it.
36
+
37
+ The direct output-check maximum is 1578.762166 ms; using the larger extractor tail to size output-helper startup is a conservative shared-interpreter allowance, not a claim that the writer itself took 3835.40 ms. Both helper modes were measured explicitly.
38
+
39
+ Keeping two individually bounded output operations means `RECEIPT_OUTPUT_MS = 16000` ms. Existing controller aggregation includes that value automatically, increasing its advertised worst-case output allowance by 12000 ms from the former 4000 ms. The production 180000 ms installation allowance remains unchanged. Only the archive test fixture reuses one helper allowance for both totalMs/installMs.
40
+
41
+ Eight seconds reduces false timeout risk at the cost of allowing a genuine helper hang to block up to eight seconds per operation, rather than two. The finite timeout, kill/reap behavior, FD/no-follow, collision, ownership, integrity and explicit timeout assertions must remain intact. No unbounded warm-up is proposed. Three cold samples per cell do not estimate a statistical p99 or guarantee all future runner tails.
42
+
43
+ All 12 records were reviewed before the bound changed. The temporary measurement workflow was restored in `c4a40cee`, before normally merging origin/main at `3e27f16c`. The permanent measurement module remains callable; the scheduled compatibility workflow is unchanged by this follow-up. No package, real home, account, model, machine trust or agent CLI was installed or used. This receipt is not a native compatibility qualification.
44
+
45
+ ## Regression checks and evidence limits
46
+
47
+ The output test retains every FD, ancestry, collision, no-follow and content assertion and changes only the exact total-budget contract from 4000 to 16000. A temporary helper uses `exec /bin/sleep 3` to exceed the former two-second allowance and finish. A second uses `exec /bin/sleep 60`; the actual eight-second spawnSync timeout must report `timeout`, reap that same owned helper process and publish no output. Both tests retain an explicit 20-second outer hang guard. No forked background helper is created. The generic npm fixture remains at 3000 ms installation budget; explicit timeout and archive-integrity controls are unchanged.
48
+
49
+ Committed-head DGX checks and hosted CI are separate from the measurement run and are reported at their tested SHA in the task/PR. They are not inferred from these hosted timing observations. No verified stamp is refreshed.
50
+
51
+ Per-observation elapsed/censor/outcome/exit fields are retained in the hosted per-job `measurement/result.json` artifacts and the workspace-local `task775-measurement-e9-complete/validated-complete.json` projection. No raw helper stdout/stderr, private paths or environment values are included in this report or the validated projection.
@@ -0,0 +1,105 @@
1
+ # Model-free receipt harness core (#1248 T1)
2
+
3
+ Task #763. This report describes the harness and its fake-only verification. No
4
+ agent CLI was installed or run on the Mac, and no account or real model was used.
5
+ The T0 manifest and existing runtime admission policy are unchanged.
6
+
7
+ ## Command and artifacts
8
+
9
+ `bun scripts/compat-receipt.ts <id> <exact-version> --out <new-owned-directory> --disposable-runner`
10
+ validates the id/version and refuses unsafe or occupied outputs before install.
11
+ It also requires a GitHub-hosted runner or disposable Linux container. A personal
12
+ Mac is refused; a temporary HOME alone does not contain installer code. The
13
+ explicit flag acknowledges that the runner must be destroyed after the job.
14
+ Each run creates fresh HOME, XDG, cache, prefix, project and native tool homes.
15
+ The caller's account/model variables and agent/Orca markers are not inherited.
16
+ The worker is started in that environment before native proof API imports.
17
+
18
+ Public exact npm artifacts are byte-verified against SRI before npm receives the
19
+ local tarball; npm user/global config and cache stay private. Tagged release
20
+ assets are checked against SHA-256 metadata and a checksum before extraction.
21
+ The two-pass extractor rejects traversal, links, nonregular entries, duplicates,
22
+ excess entries and expanded bytes before writing. This is not an assertion of
23
+ kernel confinement of arbitrary package lifecycle code. No ignore-scripts flag
24
+ is used to make installation or a proof succeed.
25
+
26
+ `summary.json` records identity, actual OS/architecture, artifact integrity,
27
+ installation and each manifest leg's closed status/cause/next step, time bounds,
28
+ scoped owned-stop status, lifetime process cleanup with its reason, disposable
29
+ runner containment and eligibility. `receipt.md` is its human view. Neither contains raw
30
+ native output, caller secrets or temporary prefix paths. Unproven lifetime cleanup or failed owned stop keeps
31
+ the private workspace and reports its location only on stderr. No version,
32
+ line window, real-home trust or PR is changed by the harness.
33
+
34
+ ## Proof reuse and conductor ruling
35
+
36
+ Conductor ruling 2026-11-07 confines T1 to committed producer code. Historical
37
+ scratch Kimi/Qwen/Jcode producers are not copied or promoted here. Their missing
38
+ native legs report exactly "producer not committed; see follow-up task". Pi's
39
+ historical committed top-level producer is not an import-safe candidate API, so
40
+ its remaining proof reports that extraction gap. Source/lifecycle semantic review,
41
+ unsupported native platforms, account/model and TUI work are explicit not-run.
42
+ None can become a pass merely because installation or configuration succeeded.
43
+
44
+ - Codex imports `codexReviewerBackend.prepare` in the isolated worker, using only
45
+ temporary exact-version fixture trust. Empty/ambient preparations and their
46
+ structured isolation assertions must pass before its internally executed
47
+ metadata/native-canary checks can pass. The returned model exec is never run.
48
+ A candidate already admitted by policy cannot reproduce its old pre-admission
49
+ negative check without changing policy, so that leg is not applicable.
50
+ - Kimi imports its existing prepare and task-bound MCP broker. Only actual private
51
+ config/inventory/environment and host broker-refusal assertions are mapped.
52
+ Native Write/tool-loop/network/child-cleanup legs remain not-run. Production
53
+ managed-provider validation is not relaxed or pointed at a loopback service.
54
+ - Claude imports the existing Python producers through runpy. Optional
55
+ --expected-version and --runtime-path inputs parameterize the candidate and
56
+ isolated interpreters while preserving historical defaults/assertions. A group
57
+ must exit 0 with exact cases, version, binary stability and its native/host
58
+ group assertions before those assertions pass. These assertions do not prove
59
+ lifetime cleanup of detached helpers. Producer cleanup legs retain their pass or
60
+ fail on this original group evidence. PID groups are never signalled after their
61
+ reaped leader may have been reused. Original historical producer fingerprints
62
+ are history, not hashes of these newly parameterized files.
63
+
64
+ ## Bounds and evidence ceiling
65
+
66
+ Install/proof execution has monotonic scheduling deadlines; default budgets are
67
+ 15 minutes total, 3 minutes install and 2 minutes per proof worker/group. A fixed
68
+ 10-second teardown allowance and a 4-second output check/publication allowance
69
+ are included in reported total wall-time bounds; elapsed time is sampled before
70
+ publication. The
71
+ production owned-process/descendant teardown is reused with a credential-free
72
+ process-table observer. Unconfirmed owned stop or a detected survivor fails the run.
73
+ Lifetime cleanup is separately reported as unproven, never inferred from an empty
74
+ leader PGID. Per the corrected ruling, this reported property does not gate
75
+ eligibility or rewrite producer cleanup assertions: outcome pass, policy eligibility,
76
+ confirmed owned stop and no detected survivor are the admission conditions.
77
+ An inconsistent optimistic pass/timeout result is rejected.
78
+
79
+ The test suite uses fake package metadata/bytes, fake installers and fake proof
80
+ executables. It covers pass plus both outputs, failed proof and no PR, pre-dispatch
81
+ model refusal despite an optimistic response, leg and total timeouts with owned
82
+ descendants, private environment/no caller mutation, unsupported platform,
83
+ invalid exact inputs, symlink outputs, digest-before-effects, bounded safe archive
84
+ extraction, committed producer mapping and isolated-worker missing-producer refusal.
85
+ The adversarial cleanup fixture launches a detached helper with a new PGID and
86
+ ignored pipes, then exits its launcher with code 0. The helper can remain alive
87
+ when the original group is empty. T1 reports `processCleanup: unproven` with a
88
+ reason, preserves owned-stop checks and fails any survivor it can detect. A passing
89
+ producer cleanup leg can remain pass and the receipt can be eligible while harness
90
+ lifetime cleanup is unproven; the test suite covers that distinction. It does
91
+ not install a Linux subreaper or macOS supervisor. Disposable runner lifetime is
92
+ the containment boundary; workflow integration must destroy the VM/container.
93
+ A process-supervision follow-up is required for lifetime proof.
94
+
95
+ The output regression renames the output parent and substitutes a symlink during
96
+ a run. A retained verified directory descriptor plus dir-relative exclusive
97
+ no-follow writes prevents final artifacts from reaching the replacement target.
98
+ These are harness/host fixture results, not new native CLI compatibility receipts.
99
+
100
+ ## Verification
101
+
102
+ Final committed-head dgx02 checks and hosted exact-head CI are recorded in the PR
103
+ and task submission. No local full suite, native agent installation, account,
104
+ real API key or model run is claimed. Producer promotions and workflow/publisher
105
+ integration remain outside this PR; T2 publisher integration follows the person's separate token decision.
@@ -0,0 +1,96 @@
1
+ # Committed Kimi and Qwen receipt producers (#1248 T1b)
2
+
3
+ Task #765 promotes the first-party historical producers behind the Kimi 2.5.1
4
+ and Qwen 0.26.8 receipts into callable modules. Candidate executable/package paths
5
+ and versions are parameters; no personal installation or account is an input.
6
+ The harness worker imports these modules instead of embedding their proof bodies.
7
+ No COMPAT, trust, workflow, verified version or documentation stamp changes.
8
+
9
+ ## Provenance
10
+
11
+ Every retained producer matched its receipt fingerprint before promotion.
12
+
13
+ | Receipt | Historical producer | SHA-256 | Committed owner |
14
+ | --- | --- | --- | --- |
15
+ | [Kimi 2.5.1](2026-11-06-kimi-251-reviewer-compat.md) | `agent-hub-748/kimi-probe.ts` | `2ff8e2841f2cbd58d07add57e5deb9041ee33a692489083a176e6b5d5f406edf` | `scripts/compat-receipts/proofs/kimi.ts` |
16
+ | Kimi 2.5.1 | `agent-hub-748/loopback-only.cjs` | `f4e4714ac846c9e1861306f19c1c656350d1d4180818bd834aa34d1ae0ced8df` | `proofs/kimi-loopback-only.cjs`, original bytes |
17
+ | Kimi 2.5.1 | `agent-hub-748/run-kimi.py` | `1822f6d597d4b4cd7128d451addf81cb7bcd67492f339ea363ba99b288f80f5e` | Native process ownership is now the shared bounded command port |
18
+ | [Qwen 0.26.8](2026-11-06-qwen-0268-acp.md) | `agent-hub-749/probes/qwen-acp-probe.py` | `897ff1b615f93da8cf5d0a93a5ce150eadfc55e87dce1d44625ad833c236691f` | `proofs/qwen-acp.py` |
19
+ | Qwen 0.26.8 | `agent-hub-749/probes/qwen-permission.mjs` | `d777feb9070f254238f5ecf57f510e6af88e817b559919f65160bfd7db02a154` | `proofs/qwen-permission.mjs` |
20
+ | Qwen 0.26.8 | `agent-hub-749/probes/deny-network.cjs` | `361148af658dd4b65ed35308622ec99bb882ec5a25fab54581776546f139e892` | `proofs/qwen-network.cjs`, original bytes |
21
+
22
+ Historical paths are relative to workspace `scratchpad/temp/`. These hashes bind
23
+ the original procedures, not the newly parameterized module bytes. The promoted
24
+ Python/MJS helpers are import-safe and invoked by the single Qwen module.
25
+
26
+ ## Receipt-to-leg mapping
27
+
28
+ Kimi's "Isolated production and native controls" is split at the existing
29
+ preparation boundary. `reviewers.ts` still owns preparation, exact inventory,
30
+ environment decoy, task-bound broker and source-fixture cleanup. An optional native
31
+ callback runs before broker revocation; negative broker controls compare their
32
+ callback count against the preceding positive native calls.
33
+
34
+ - `native-tool-loop`: fixed loopback SSE drives the actual two-tool loop, requires
35
+ the exact advertised two-tool inventory and the expected broker callbacks.
36
+ - `write-absent`: injected Write is absent and produces native tool-not-found;
37
+ the marker stays unchanged.
38
+ - `write-positive-control`: the private agent explicitly gains Write; fixed replies
39
+ produce the marker and the positive request sequence.
40
+ - `network-guard-control`: the original preload's non-loopback positive control
41
+ must deny the synthetic attempt. This is application-level, not kernel isolation.
42
+ - `cleanup`: original synthetic config/credential bytes, current launch, native
43
+ group stop and per-case temporary removal remain assertions. Synthetic provider
44
+ fields reproduce the original fixture; no real OAuth exchange occurs.
45
+
46
+ Qwen's "Native ACP, no prompts" and "Actual published permission handler" remain
47
+ canonical Python/MJS procedures behind `qwen.ts`.
48
+
49
+ - `artifact-private-install-integrity`: private package/name/version/CLI binding
50
+ and original CLI/chunk/metadata byte fences supplement the controller's SRI.
51
+ - `native-acp-auth-session-modes`: initialize, session and the four mapped mode
52
+ transitions. Receipt-observed protocol, title, auth, default mode and fixture
53
+ model are now explicit assertions; extra unmapped modes are permitted.
54
+ - `actual-published-permission-handler`: exports-only copy beside the original
55
+ published chunk, native approval handler and exact options, allow-once,
56
+ cancellation and unoffered-option refusal; original chunk bytes stay unchanged.
57
+ - `preload-network-cleanup`: original preload plus positive control, no permission
58
+ fixture network attempt, and bounded native-group cleanup observations.
59
+ - `native-macos-repetition`: passes only on actual macOS arm64 after the native
60
+ controls pass. `additional-linux` never substitutes for that requirement.
61
+ - `reviewed-optional-lifecycle-replay` remains human source-review work, not a
62
+ successful install inferred as a lifecycle review.
63
+
64
+ Cleanup never signals a group after its leader was reaped. Producer group
65
+ assertions retain their original meaning. Harness lifetime cleanup remains a
66
+ separate reported property under disposable-runner containment; it is not an
67
+ admission gate. Detected survivors and unconfirmed owned stop still fail.
68
+
69
+ The [Jcode 0.99.1](2026-10-26-jcode-0.99.1.md) producer was not retained:
70
+ `/tmp/ahub-jc0991` is gone. Its legs remain `producer-not-committed`; reconstruction
71
+ and proof against the 0.99.1 control are a separate task, not a promotion here.
72
+
73
+ ## Verification and limits
74
+
75
+ Tests use typed fake command/protocol ports and private fixture homes, without a
76
+ mocking library. No native agent CLI is installed or run on the person's Mac, and
77
+ no real account, API key or model is supplied. Fixed loopback messages and tokens
78
+ are synthetic controls, not model behavior or provider readiness.
79
+
80
+ Exact committed-head dgx02 checks, hosted CI and review-thread state are recorded
81
+ in the PR/task. A successful fake protocol suite proves wiring and refusal
82
+ behavior, not a new native compatibility receipt or verified version.
83
+
84
+ ## Review corrections
85
+
86
+ Both Qwen preload arguments quote their guard path. A fixture relocates the four
87
+ canonical helpers beneath a directory containing spaces and Korean characters,
88
+ then exercises both actual preload denial controls, ACP and permission handling.
89
+ The guard bytes and all existing refusal assertions stay unchanged.
90
+
91
+ In [CI run 42355168440](https://github.com/STAIxBWLB/agent-hub/actions/runs/42355168440),
92
+ the first macOS archive extraction completed in 3835.40 ms and the next in
93
+ 454.92 ms. The archive fixture now uses its existing 5000 ms total budget for
94
+ installation, so its former 3000 ms margin does not mask an integrity refusal.
95
+ Production deadlines, the npm fixture and the explicit timeout assertions are
96
+ unchanged. Exact-head checks for these corrections are recorded in the PR/task.
@@ -0,0 +1,94 @@
1
+ # Automated compatibility receipt workflow (#1248 T2)
2
+
3
+ Task #764 extends the existing drift watcher with structured candidate data,
4
+ isolated per-ID proof jobs and a data-only publisher. This report describes the
5
+ implementation and its fixture evidence; it is not a native CLI receipt.
6
+
7
+ ## Trust and credential boundaries
8
+
9
+ - The watcher reads the trusted COMPAT policy and manifest. Public version strings
10
+ must be exact safe versions before they enter JSON matrix data. Unknown sources
11
+ remain drift without a runnable version. Confirmed verified IDs are separate
12
+ structured data, used to clear their old managed issue blocks.
13
+ - The matrix uses the manifest OS, at most eight IDs and two concurrent jobs.
14
+ Unspecified OS is not guessed. Each hosted runner has `contents: read`, no
15
+ supplied secrets, `persist-credentials: false`, a 20-minute bound and explicit
16
+ `--disposable-runner`. Native processes receive the harness's private homes and
17
+ allowlisted environment. Receipt artifacts remain data, not publisher code.
18
+ - Trusted read-only preparation validates native summaries against the manifest,
19
+ strips untrusted prose, and retains only canonical statuses, identities, digests
20
+ and scalar observations. Malformed or duplicate summary records make the batch drift-only; unreadable or oversized input refuses preparation.
21
+ For an eligible candidate it patches one row, builds repository code with pinned
22
+ Bun/frozen dependencies, binds fixed output files to the source SHA, then
23
+ restores source, plugin assets and role notice. This job has no GitHub writes.
24
+ - The privileged publisher downloads only that preparer's immutable artifact ID.
25
+ It validates every descriptor/hash/source binding before effects and re-plans
26
+ against current bot-owned PRs. It runs Node builtins and first-party pure
27
+ functions plus `gh` REST, never candidate code or a package install/build.
28
+ `GITHUB_TOKEN` must be explicitly present; personal `gh` login is not a fallback.
29
+
30
+ The [GitHub runner reference](https://docs.github.com/en/actions/how-tos/write-workflows/choose-where-workflows-run/choose-the-runner-for-a-job)
31
+ names `macos-latest` as arm64 and hosted jobs as fresh VMs. The harness still checks
32
+ actual OS/architecture. The [artifact action](https://github.com/actions/download-artifact)
33
+ supports downloading by immutable ID, avoiding candidate-selected bundle names.
34
+
35
+ ## Publication and dry run
36
+
37
+ All required legs must pass and trusted manifest policy must allow model-free
38
+ admission. Model/TUI, source-review, unsupported-platform and missing-producer
39
+ legs stay not-run; `eligible` supplied by an artifact is not trusted. Harness
40
+ lifetime cleanup remains reported unproven and disposable-runner containment,
41
+ without overriding the producer's native-group assertions or acting as an
42
+ admission gate. A detected survivor or unconfirmed owned stop still fails.
43
+
44
+ One branch `compat/<id>-<version>` holds only the exact verified-array/receipt
45
+ edit, generated receipt and prepared plugin assets. Every other row and each
46
+ line window stays byte-identical. Existing bot PR metadata and owned file hashes
47
+ protect against ordinary manual drift; unknown/manual branch collisions refuse.
48
+ Updates use append-only Git history and `force: false`, not a claimed expected-old
49
+ SHA compare-and-swap. Editable PR markers are not cryptographic provenance against
50
+ a person who can coherently forge repository state. No verification PR is merged.
51
+
52
+ The person selected `GITHUB_TOKEN` plus explicit `check.yml` workflow dispatch.
53
+ GitHub's [workflow dispatch API](https://docs.github.com/en/rest/actions/workflows#creating-a-workflow-dispatch-event)
54
+ requires Actions write permission, so that permission is confined to publish.
55
+ There are no GitHub App credentials. The replacement PR and check dispatch must
56
+ succeed before an older same-ID PR is closed. Separate PR-only checks remain
57
+ normal review gates rather than being claimed as dispatched by `check.yml`.
58
+
59
+ The candidate CLI runs as the same user and in the same job as the harness that
60
+ writes its receipt. A malicious release could replace `summary.json` with a
61
+ well-formed eligible forgery before upload, which preparation's validation cannot
62
+ detect. Eligibility is a compatibility signal, not a security attestation of the
63
+ release. The person's PR and release review is the real admission gate; opening
64
+ an automated PR is not permission to merge it.
65
+
66
+ An exact-title tracker is selected through the existing fail-closed identity
67
+ helper. Closed-cause per-ID blocks preserve other drift/unknown evidence and
68
+ remove confirmed verified IDs. `dry: true` still runs the isolated proof and
69
+ read-only artifact preparation, then prints plans with zero branch, PR, issue, label or check-dispatch mutations.
70
+ Live publication is restricted to the trusted current main source; feature-branch
71
+ dispatch is usable for dry validation only.
72
+
73
+ ## Verification
74
+
75
+ Pure tests cover admission policy, incomplete/malformed input, superseding
76
+ versions and dry plans. File-helper tests cover exact-row byte preservation and
77
+ refusal of unsafe grammar. Preparation uses fake build ports; publisher tests use
78
+ fake REST data to cover branch ownership, changed source/assets, two-parent main
79
+ integration, new-day receipts, preserved human prose, dispatch-before-supersede,
80
+ stale verified issue blocks and zero-write dry/validation modes. Workflow tests
81
+ check permissions, no secrets/credential persistence, job bounds and artifact IDs.
82
+ No mocking library or real token is required by these fixtures.
83
+
84
+ Exact committed-head dgx02 results, hosted CI, workflow dry-run results and review
85
+ threads are recorded in the PR/task. Unrun live/native/platform behavior stays
86
+ unverified; no real token value, account path or model prose is committed.
87
+
88
+ The real dry run [42359014165](https://github.com/STAIxBWLB/agent-hub/actions/runs/42359014165)
89
+ completed watch, three macOS harness jobs, prepare and publish at
90
+ `36d9059a35abeb22fd1b72423072e3bd90bebd9a`. It printed drift updates only: no
91
+ candidate was eligible. The current implementation's PR-open, update and
92
+ supersede write paths have not run against real GitHub; their evidence is the
93
+ fake REST suite. Scheduled live drift writes are not claimed as exercised by
94
+ this dry run.
@@ -0,0 +1,169 @@
1
+ # Daemon startup and pending readiness (#1232)
2
+
3
+ Date: 2026-11-07. Refs #1232, task #770.
4
+
5
+ The historical 11-16 second startup did not reproduce. An isolated real-state
6
+ copy started in 2503 ms before the change and 2171 ms after it. The representative
7
+ synthetic fixture on dgx02 took 2201 ms before and 1382 ms after. These are single
8
+ observations, with different runtimes and different event mixes as described
9
+ below; they do not establish a general speedup or the historical cause.
10
+
11
+ The measured redundant work was three full `events.jsonl` seed reads. They now
12
+ share one lossless streaming pass. No persistent index, migration, log rotation
13
+ or historical-key truncation was added. The index follow-up is #1266.
14
+
15
+ ## Method and boundaries
16
+
17
+ Each sample used a fresh isolated project and state copy. Wall time starts with
18
+ the measured child launch and includes imports and daemon initialization through
19
+ readiness. Copying or generating the fixture happens before that clock. The
20
+ phase line measures exclusive boundaries inside `startDaemon`; import time is
21
+ reported separately from those phases.
22
+
23
+ The real state remained on this Mac. Its copied database used SQLite's online
24
+ read-only backup; only the destination was normalized out of WAL mode so the
25
+ first Bun read did not depend on missing sidecars. The event copy retained a
26
+ complete append-only prefix. Private files and directories had private modes.
27
+ The measured child had isolated HOME/tool homes, a loopback port allocated at
28
+ startup, no peers, no gateway/model/sync work, and both application effect guards
29
+ and a Seatbelt profile denying outbound networking and the original state paths.
30
+ Storage and cache initialization remained enabled. Every successful observation
31
+ reported zero prohibited effects, stopped its owned child and removed the copy.
32
+ The real hub's listener identity was unchanged.
33
+
34
+ The authorized three-attempt limit was exhausted, including the first failed
35
+ attempt: it stopped before daemon startup because a freshly backed-up WAL-mode
36
+ database lacked sidecars for Bun's read-only open. That attempt has no startup
37
+ timing claim. A public WAL-backup regression covers the correction. Attempts 2
38
+ and 3 are the before/after Mac observations below. No private state was sent to
39
+ dgx02, and no task or event body was read into the model.
40
+
41
+ The dgx02 fixture matches the before-copy counts and aggregate byte sizes, not
42
+ its private contents. Every synthetic event is a native-end record, a worst-case
43
+ dedupe-set workload rather than the real event-type distribution. Its rollup is
44
+ cold; the real copy retains its existing rollup cursor. SQLite page padding makes
45
+ the synthetic DB 8192 bytes larger than requested. The private `ready` phase is
46
+ about 1.24 seconds and is not reproduced by this aggregate synthetic fixture.
47
+
48
+ ## Observation bindings
49
+
50
+ | Observation | Head | Runtime | Wall ms | Import plus startup ms | Phase total ms |
51
+ | --- | --- | --- | ---: | ---: | ---: |
52
+ | Mac copied state, before, attempt 2 | `efe43fdbc62b35495a160dcf71ba119479fc12f3` | Bun 1.4.4, macOS arm64 | 2503 | 2479 | 2346 |
53
+ | Mac copied state, after, attempt 3 | `b4ae2e66dacb80f537a55e1daef701498d117449` | Bun 1.4.4, macOS arm64 | 2171 | 2144 | 1995 |
54
+ | dgx02 synthetic, before | `efe43fdbc62b35495a160dcf71ba119479fc12f3` | Bun 1.4.2, Linux x64 | 2201 | 2182 | 1989 |
55
+ | dgx02 synthetic, after | `a87e3c5d7e243d350ee19dc7d38c6d792b9f7873` | Bun 1.4.2, Linux x64 | 1382 | 1362 | 1167 |
56
+
57
+ | Profile | Mac before / synthetic | Mac after |
58
+ | --- | ---: | ---: |
59
+ | DB bytes | 38260736 / 38268928 | 38260736 |
60
+ | Tasks / history entries | 773 / 8383 | 775 / 8425 |
61
+ | Task text bytes | 941219 | 943364 |
62
+ | Delivery rows / payload bytes | 2052 / 10429841 | 2052 / 10383407 |
63
+ | Event bytes / lines | 135894851 / 723243 | 136341131 / 725816 |
64
+ | Abandoned files / aggregate bytes | 7 / 94021653 | 7 / 94021653 |
65
+ | Largest abandoned file bytes | 16932725 | 16932725 |
66
+
67
+ The real hub continued running between copies, so its two profiles differ.
68
+
69
+ ## Phase timings
70
+
71
+ All values are milliseconds. The phase names and numeric-only line shape are
72
+ fixed; unavailable or regressing diagnostic clocks cannot fail startup.
73
+
74
+ | Phase | Mac before | Mac after | Synthetic before | Synthetic after |
75
+ | --- | ---: | ---: | ---: | ---: |
76
+ | schema | 1 | 1 | 1 | 1 |
77
+ | source | 38 | 41 | 24 | 24 |
78
+ | configuration | 1 | 2 | 3 | 3 |
79
+ | control | 3 | 2 | 6 | 6 |
80
+ | recovery | 1 | 2 | 0 | 1 |
81
+ | journal | 45 | 44 | 38 | 42 |
82
+ | bus | 71 | 91 | 88 | 100 |
83
+ | memory | 87 | 88 | 61 | 59 |
84
+ | model_runtime | 0 | 0 | 1 | 0 |
85
+ | board | 2 | 2 | 1 | 2 |
86
+ | task_runtime | 170 | 177 | 38 | 37 |
87
+ | native_stop_seed | 209 | 229 | 598 | 685 |
88
+ | budget | 1 | 1 | 7 | 9 |
89
+ | usage_seed | 223 | 36 | 535 | 79 |
90
+ | usage_rollup | 2 | 2 | 33 | 33 |
91
+ | token_runtime | 13 | 10 | 13 | 13 |
92
+ | token_seed | 14 | 14 | 10 | 12 |
93
+ | services | 14 | 15 | 25 | 28 |
94
+ | transcript_usage_seed | 216 | 0 | 478 | 0 |
95
+ | ready | 1235 | 1238 | 28 | 30 |
96
+ | post_ready | 0 | 0 | 1 | 3 |
97
+
98
+ The three seed calls already exist at v0.20.0 (`daemon.ts` lines 1969, 2123 and
99
+ 3277) and v0.23.0 (lines 2375, 2565 and 4123). The measurements do not show that
100
+ these calls were introduced during the historical latency jump.
101
+
102
+ ## I/O and semantic preservation
103
+
104
+ | I/O observation | Mac before | Mac after | Synthetic before | Synthetic after |
105
+ | --- | ---: | ---: | ---: | ---: |
106
+ | Aggregate event bytes read | 407685899 | 136341537 | 416073489 | 144283569 |
107
+ | Streaming seed passes | three legacy full reads | 1 | three legacy full reads | 1 |
108
+ | Streaming seed bytes | not separately recorded | 136341240 | not separately recorded | 135894960 |
109
+ | Event `readFileSync` calls after the change | not separately recorded | 0 | not separately recorded | 0 |
110
+ | Separate auxiliary event bytes | not separately recorded | 297 | not separately recorded | 8388609 |
111
+ | Abandoned snapshot body bytes | 0 | 0 | 0 | 0 |
112
+
113
+ Seed bytes include the child's new hub-start record. Aggregate I/O also includes
114
+ the existing bounded rollup poll and the appender's one-byte newline check. Cold
115
+ synthetic auxiliary I/O is 8 MiB plus that byte; the warm private copy reads a
116
+ small remaining tail. Those reads are shown explicitly rather than claimed to
117
+ be part of a single physical read of every consumer.
118
+
119
+ The later benchmark-only review correction independently attributes bytes around
120
+ the real synchronous `UsageRollup.poll` method and restores its original
121
+ descriptor. Acceptance caps that actual rollup I/O at its existing 8 MiB budget
122
+ and permits at most the appender's one extra byte outside the seed and rollup
123
+ scopes. A second streaming descriptor pass outside either scope, or a full-log
124
+ poll inside the rollup scope, is rejected. Private attempt 3 predates these scoped
125
+ counters: its 297 auxiliary bytes are retained as an aggregate observation, not
126
+ retroactively assigned to `usageRollupReadBytes` or `residualExtraReadBytes`.
127
+ There was no fourth private run. The underlying daemon change is unchanged.
128
+
129
+ At `33ad860f5bda`, typecheck and all 61 focused tests passed. The stricter public
130
+ synthetic acceptance run took 1364 ms and independently measured 8388608 rollup
131
+ bytes, one rollup call and one residual appender byte. Seed passes remained one,
132
+ with no event `readFileSync` call, abandoned body read or prohibited effect.
133
+
134
+ The shared line predicate preserves measured-time handling, malformed-line
135
+ skipping and a complete final JSON record without a newline. Streaming UTF-8
136
+ decoding has no line-size or history ceiling. Native-stop IDs and Claude usage
137
+ IDs are folded during the pass, while the existing budget, Kimi and token-window
138
+ consumers reuse the same accepted event array. Their existing expressions and
139
+ historical keys remain intact.
140
+
141
+ ## Readiness behavior and checks
142
+
143
+ The status promise and runtime schema are unchanged. A signed, bound own child
144
+ that remains pending gets one stderr notice after 12 seconds. The CLI continues
145
+ waiting, and authenticated late readiness uses the existing runtime admission
146
+ and confirmation path once. Death, authority cancellation or the 120-second
147
+ outer bound cannot turn unknown startup into success. An outer-bound failure
148
+ leaves the daemon running and its runtime unconfirmed. Each connect/status pair
149
+ gets at most half the remaining wait budget; ordinary `inspectProject` callers
150
+ retain their API and timeout semantics.
151
+
152
+ At `a87e3c5d`, typecheck, 41 tests and the representative synthetic acceptance run
153
+ passed. At `844fbbdc0461b884b7c69234c3c4c5c05510b6c3`, typecheck and 62 tests
154
+ passed, including actual retained-runtime lifecycle fixtures and a real owned
155
+ fake child's signed identity. Its subsequent inventory check listed the 39 new
156
+ keys, which are classified separately without changing the baseline or existing
157
+ labels. Tests compare legacy and streamed seed results, long/fragmented UTF-8
158
+ records, quota/Kimi/token semantics, actual reader I/O, repeated observer calls,
159
+ late confirmation, cancellation, competing claims and both readiness bounds.
160
+
161
+ The full canonical dgx02 gate at
162
+ `d16e7ea18613adeb4c0705085e45f5454abf5698` passed: 12248 pass, 101 skip,
163
+ 0 fail across 953 files, with no current-invocation daemon leaks. That full result
164
+ predates the benchmark-only scoped-I/O and cleanup corrections described above;
165
+ their current-head delta gate and hosted CI are recorded separately in the PR/task.
166
+
167
+ The pinned Bun 1.4.2 bundle was regenerated after a worktree-local frozen install.
168
+ Final canonical gate, hosted CI and review-thread evidence are recorded in the
169
+ PR/task. No interactive agent start or real account/model behavior is claimed.
@@ -0,0 +1,118 @@
1
+ # Jcode receipt reconstruction: partial control, not qualified (#1248)
2
+
3
+ Date: 2026-11-07. Task #767. This is new proof code, not promotion of the missing
4
+ producer behind [the historical Mac receipt](2026-10-26-jcode-0.99.1.md).
5
+
6
+ The isolated Linux x64 control executed the verified 0.99.1 release. Isolation,
7
+ serve cleanup, ACP and MCP passed. Telemetry and the strict persisted-context
8
+ binding failed. Source comparison remains not-run. These failures are retained;
9
+ this report makes no COMPAT, trust or macOS qualification change.
10
+
11
+ ## Artifact and runner binding
12
+
13
+ The public [v0.99.1 release](https://github.com/1jehuang/jcode/releases/tag/v0.99.1)
14
+ provides `jcode-linux-x86_64.tar.gz`, 56203997 bytes, with SHA-256
15
+ `0b2a612de97c6e01ae6de1c0cff555b3460cf8364d1a11d2f8649fc0c9d7a1e6`.
16
+ The installer verified its tagged asset digest and `SHA256SUMS` before extraction.
17
+ The archive has a 505-byte regular wrapper `jcode-linux-x86_64` and its regular
18
+ adjacent `.bin`; their names and bytes are preserved.
19
+
20
+ At `350a3d042fc9d9680fa84b90c82f5c77bd3941b7`, dgx02 ran Bun 1.4.2 in a
21
+ disposable Linux x64 container. Typecheck and 79 fixture tests passed. The actual
22
+ native control's installation passed with the digest above; its overall outcome
23
+ was failure, with owned stop confirmed and lifetime process cleanup unproven.
24
+ The container's lifetime supplies containment. The control sets `autoAdmit:false`
25
+ in a temporary in-memory Linux projection and never spoofs its OS or architecture.
26
+ The checked-in manifest still requires macOS arm64.
27
+
28
+ The Mac archive's acquisition was checked separately on Linux without executing
29
+ its binary: SHA-256
30
+ `3623164d518b0c9d443ab07052084244b379e8a3377037db67d2382220f4ed14`,
31
+ wrapper `jcode-macos-aarch64`. That is packaging evidence, not native Mac evidence.
32
+
33
+ ## Reconstructed procedure and observed legs
34
+
35
+ The single imported module owns private HOME/JCODE_HOME, the loopback provider,
36
+ serve/ACP children and their cleanup. Serve and ACP argv reuse production
37
+ `jcodeCommand`; version and private-provider configuration use parameterized
38
+ commands. The MCP entry carries no peer environment; the observer checks the
39
+ two synthetic owned-launch markers inherited by its native child. No real native
40
+ home, account, API key or model is supplied. The four real-home hashes from the
41
+ historical receipt were not reproduced: only the private HOME decoys are fenced.
42
+
43
+ | Leg | 0.99.1 Linux observation |
44
+ | --- | --- |
45
+ | isolation | pass: private environment and unchanged private decoy files |
46
+ | serve-cleanup | pass: ready FD/socket/sidecar metadata and stopped owned groups |
47
+ | acp-initialize-new-load-mode-ceilings | pass: protocol/identity/new/load and both unsupported-method checks |
48
+ | mcp-owned-environment | pass: actual eager child inherits the two expected markers |
49
+ | active-turn-soft-interrupt | fail: strict private persisted System-carrier binding was not established |
50
+ | telemetry | fail: `telemetry_id` appeared in the private native home |
51
+ | source-comparison | not-run: scoped source investigation is not the historical full compare review |
52
+
53
+ `session/load` still omits `sessionId`. The existing withheld recovery guarantee
54
+ and `requireLoadSessionEcho` policy are unchanged.
55
+
56
+ The fixed-stream loopback turn reached ping capability, same-session subscribe,
57
+ idle/active state, non-urgent interrupt acknowledgement, `end_turn` and two
58
+ completion bodies. Closed observations classified the first request as native
59
+ context plus original prompt, and the second as context, original, streamed head
60
+ and steer. Those observations do not substitute for the failed persisted-role
61
+ assertion. The final code also counts every completion POST attempt, rejecting a
62
+ third attempt even when its body is refused by the two-body storage cap.
63
+
64
+ ## Narrow context and lock rules
65
+
66
+ Pinned source
67
+ [session.rs](https://github.com/1jehuang/jcode/blob/7206efd0c1dbf49ef38d06b63f3a96a3a7cee611/crates/jcode-base/src/session.rs#L989)
68
+ and [prompt.rs](https://github.com/1jehuang/jcode/blob/7206efd0c1dbf49ef38d06b63f3a96a3a7cee611/crates/jcode-base/src/prompt.rs#L656)
69
+ define the hidden user/System-display session-context carrier. The allowed
70
+ exception requires the new private session's matching ID and working directory,
71
+ a first stored `role:user`/`display_role:system` text carrier, the exact reminder
72
+ frame and seven field names, and identical bytes once at the same position in
73
+ both provider requests. Only that carrier may be excluded. Duplicate, forged,
74
+ changed-field, extra-field, moved or app-sentinel carriers fail. Application
75
+ original/head/steer bytes, order and all generic extra-user negatives remain
76
+ strict.
77
+
78
+ The Linux control failed that binding. The source also permits optional hardware
79
+ and Git context, which the seven-field rule does not admit. That is a possible
80
+ platform-dependent limitation, not a diagnosis proved by the closed failure
81
+ checkpoint. Snapshot/journal coverage is not inferred when the role binding is
82
+ unavailable.
83
+
84
+ Today's 0.99.1 control creates an empty `telemetry_id.lock`. The proof treats only
85
+ that exact zero-byte, regular, single-link, run-owned file in the private native
86
+ home, with `JCODE_NO_TELEMETRY=1`, as coordination rather than telemetry data.
87
+ Non-empty, symlink, hardlink and wrong-location locks fail; identity, event and
88
+ milestone artifacts still fail. The same control subsequently detected
89
+ `telemetry_id`, so the telemetry leg remains failed. File presence does not prove
90
+ that telemetry was transmitted.
91
+
92
+ We cannot tell whether the original 2026-10-26 producer saw the empty lock,
93
+ ignored it, or whether it did not appear then. The historical receipt is unchanged
94
+ and is not claimed to cover this allowance.
95
+
96
+ ## Acquisition and runner corrections
97
+
98
+ The real control exposed three shared harness defects:
99
+
100
+ - GitHub release metadata rejected `Accept:application/octet-stream` with HTTP
101
+ 415. Metadata now requests JSON; archive/checksum requests retain binary content
102
+ negotiation and every redirect, checksum and pre-effect integrity check.
103
+ - The archive wrapper is platform-qualified rather than named `jcode`. An
104
+ optional trusted recipe executable basename selects its unique existing file;
105
+ traversal, links and paths outside the verified prefix remain refused.
106
+ - A nested command runner counted its own proof worker's private request path as
107
+ a survivor. Only that current PID is excluded from the path heuristic. Known
108
+ descendants and other private-root processes remain detected, and lifetime
109
+ cleanup remains unproven. A separately owned helper negative verifies that the
110
+ observation never grants authority to signal it.
111
+
112
+ The metadata regression failed on dgx02 before its correction. Header-sensitive
113
+ and executable-selector fixtures retain all archive, timeout and integrity
114
+ negatives. Protocol fakes exercise the application/role/context/telemetry and
115
+ third-request refusals; they are not native-version qualification evidence.
116
+ Diagnostics contain bounded closed labels, booleans and counts only, and are
117
+ never admission data or native content. Final committed-head gate and review
118
+ evidence are recorded in the PR/task.