@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,137 @@
1
+ # Kimi 2.5.2 headless ACP model setter
2
+
3
+ Date: 2026-11-08. Task #809, Refs #1317 AC4. **Passed:** the installed artifact's
4
+ headless ACP setter changed A to B and restored A after clear;
5
+ the running A turn was not changed. This is a model-free compatibility receipt,
6
+ not a security attestation, reviewer isolation or provider/account qualification.
7
+
8
+ ## Artifact and admission
9
+
10
+ - Installed standalone macOS arm64 CLI: 2.5.2, 182,590,912 bytes, SHA-256
11
+ `ae3fa721a361a2c9e9b6b3960560d1572a0bca6a8d1407e2017e6b70f80e7f97`.
12
+ A byte-identical private executable copy was verified before/after execution.
13
+ Native `--version` and ACP initialize both confirmed 2.5.2. The embedded Web UI
14
+ contains an older 2.5.1 string; it is not this receipt's version evidence.
15
+ - The headless peer retains its existing native identity admission. The setter
16
+ additionally requires an exact receipt-backed 2.5.2 policy, the current owned
17
+ process/session and a valid model advertisement/baseline. No other version is
18
+ admitted by this receipt. `kimi-review` retains its separate COMPAT and
19
+ isolation gate, without this capability or a 2.5.2 verified-version change.
20
+ - Native adapter/latch source was committed at
21
+ `1b67f69db720bc7d6feaedd5ca71abbfaad50e3a` for the original A/B leg, then
22
+ `771117140fd7a314db0e7af79623cffe7d3c04c4` for the A/B/clear/A leg after
23
+ merging the updated T1 base. The probe instantiates the actual
24
+ `AcpPeer`, `ModelOverrides` and `ModelOverrideLatches`; it does not substitute
25
+ protocol responses. A transparent observer records bounded method/model IDs,
26
+ calls the original request with unchanged arguments and returns its same
27
+ promise. This is not a real dashboard/CLI or full-daemon native journey.
28
+
29
+ ## Isolation
30
+
31
+ A fresh owned 0700 fixture beneath `/private/tmp/ahub-809-...` supplies HOME,
32
+ KIMI_CODE_HOME, TMPDIR, cwd, empty MCP and every XDG/tool home before production
33
+ imports. The environment is an explicit allowlist, not inherited accounts,
34
+ session markers, proxy credentials or personal settings. The two private models
35
+ `fixture-a` and `fixture-b` reference the same synthetic managed provider and
36
+ fixed loopback Anthropic endpoint. Synthetic file-backed OAuth data supplies
37
+ only `synthetic-access-only`; the installed transport sends that value as
38
+ `X-Api-Key`, with no Authorization or Cookie. No actual account or model is used.
39
+
40
+ The provider binds 127.0.0.1 on port 0, caps request bodies at 1 MiB, rejects
41
+ Origin, wrong paths/auth and excess requests, and emits fixed text SSE only.
42
+ There are no generated tools. ACP advertises no filesystem/terminal client
43
+ capability; every native permission request is denied, and the observed count
44
+ was zero. No reviewer agent-file allowlist or native tool-isolation claim is
45
+ inferred from this ACP run.
46
+
47
+ Every native launch is wrapped in Seatbelt using the existing local-worker
48
+ profile plus exact owned paths/port. Actual-home data and installed-binary
49
+ writes remain denied. Controls prove private-provider TCP succeeds, an owned
50
+ decoy port is denied, a named actual config cannot be read and the installed
51
+ binary cannot be write-opened without truncation. The only extra runtime service
52
+ is `com.apple.FSEvents`, needed for the native workspace watcher. An installed
53
+ runtime preload control observes a private-file watcher event with that service;
54
+ without it the same control reports EMFILE. No file limit, security setting,
55
+ production permission or deadline was raised.
56
+
57
+ The reused Node loopback guard is supplementary. The kernel port controls are
58
+ the network boundary; an empty application log alone is not proof that no call
59
+ was attempted. Process lifetime containment beyond observed owned cleanup
60
+ remains unproven; this native run is not a disposable-runner attestation.
61
+
62
+ ## Observed next-turn procedure
63
+
64
+ 1. `initialize` returns protocol 1, name `Kimi Code CLI` and version 2.5.2.
65
+ `session/new` returns a session and model config option with current A and
66
+ both exact fixture choices. The adapter proves its process binding and
67
+ immutable baseline A.
68
+ 2. The private DB stores A, and actual `AcpPeer.deliver` sends the first prompt.
69
+ The provider sees `fixture-a` and holds a fixed text stream behind an explicit
70
+ release barrier. The adapter remains busy.
71
+ 3. The DB is changed to B while A is held. Latch status retains effective A and
72
+ reports desired B/pending next turn. The request observer sees no model
73
+ setter; the only provider request remains A.
74
+ 4. The fixture releases A and observes its normal completion, without cancel or
75
+ restart. On the next deliver, the adapter sends exactly one
76
+ `session/set_config_option` with `configId: model`, value `fixture-b` and the
77
+ bound session. Production parsing validates the response/config update.
78
+ 5. The second fixture request uses `fixture-b`. The prompt completes normally
79
+ and the latch reports B applied, with no pending revision. The exact observed
80
+ effect order through B is prompt, config setter, prompt.
81
+ 6. Clear removes the desired DB row. Status initially retains effective B with
82
+ pending next turn. The third deliver sends the original baseline A through
83
+ the standard setter, then the actual provider receives A. Final status has
84
+ effective A, no desired override and no pending next turn. The complete wire
85
+ sequence is `[A, B, A]`, with setter values `[B, A]`, three normal outputs,
86
+ zero cancels, zero turn failures and zero permission calls.
87
+ 7. Private config, device, MCP, synthetic credential and copied-binary hashes
88
+ match immediately after B, after clear completes and after owned stop.
89
+ Successful cleanup removes only the owned fixture.
90
+
91
+ The original A/B leg passed first. A fresh three-prompt leg then retained every
92
+ original assertion and the same 50 s operation/10 s stop budgets, extending only
93
+ its exact expected request count from two to three. Existing provider/account
94
+ configuration, launch argv and the person's real native home are not changed.
95
+
96
+ ## Real-home checks and failed attempts
97
+
98
+ The selected actual config/credential snapshot has nine entries, with symlinks
99
+ recorded without following. The passing probe's before/after digest is
100
+ `297927630977dddf707dce6dd4af9cd561a38dcc2d42e3c2027f7660dba1d094`
101
+ for the original A/B leg, and
102
+ `938c4047672ae8a1144c45ffa9946653b1ed692c6edcba23d9b5f1919b3ff069`
103
+ for the A/B/clear/A leg.
104
+ The installed original binary is unchanged. There was credential-file drift
105
+ between earlier metadata/probes, detected before any candidate spawn. That
106
+ failed pre-spawn guard is retained, and no actual file was restored or edited.
107
+ Writer attribution is unproven; there is no task-wide unchanged-state claim
108
+ across those intervals. Each executed leg keeps its own before/after check.
109
+
110
+ Two earlier native attempts failed before any provider request or setter, with
111
+ owned stop and per-case actual config checks passing. The diagnostic attempt
112
+ confirmed correct initialize identity/version, then native `session/new` failed
113
+ with watcher EMFILE. A separate controlled watcher isolated the missing
114
+ FSEvents service. The final fresh run kept every assertion and the same 50 s
115
+ operation/10 s stop budgets and passed after that exact service was allowed.
116
+ The synthetic auth-header assumption was corrected from installed source before
117
+ any native provider request, not by accepting an unknown credential after a
118
+ failure. Failed fixtures/logs are preserved privately.
119
+
120
+ ## Evidence and limits
121
+
122
+ Workspace scratch `temp/task809-kimi` contains the probe/factory; `temp/task809`
123
+ contains the controller, closed logs and case bindings. The passing result is
124
+ bound to these SHA-256 values (the final clear leg root is
125
+ `/private/tmp/ahub-809-o_nuxlfe`):
126
+
127
+ | Item | SHA-256 |
128
+ | --- | --- |
129
+ | native probe | `df711ffd1e712141fef96096e89676971462765a8dea95eca8acddbce249f6cf` |
130
+ | synthetic fixture factory | `02a8e172817af815c3247a6ca4c43b888775c3cf99b0d0ca02f02428270b90a8` |
131
+ | root controller | `a9bf78022546b9c9ebe25c63586522476527b28b3c535547d625a8f189ad59ac` |
132
+ | closed native result | `d0b63136b705952d5f0b29ee9b2fccbd9502e0393d4f056eb0b50354da3578d7` |
133
+
134
+ Real provider/model behavior, actual accounts, other providers/platforms,
135
+ the reviewer surface and installed-hub rollout remain unverified. Typecheck,
136
+ unit tests, canonical DGX and hosted CI are separate PR gates; no pass is inferred
137
+ from this native receipt and no verified stamp or release is performed here.
@@ -0,0 +1,45 @@
1
+ # Kimi TUI completion facts (#1282)
2
+
3
+ Date: 2026-11-08. Scope: exact native version Kimi Code 2.5.2 on macOS arm64, isolated Git projects and isolated `KIMI_CODE_HOME`, real model turns and the real hub control protocol. No prompt, answer, session id, task title, command or credential is reproduced here.
4
+
5
+ ## T0 native evidence
6
+
7
+ - Ordinary turns write `turn.prompt(origin.kind)` and final `turn.ended(reason)`. A blocked first Stop produced only the intermediate `agent.turn.ended`; the final `turn.ended` and `prompt.completed` appeared only after the second Stop was allowed.
8
+ - A real background process wrote `agents/main/tasks/<id>.json` with `status: "running"` and `endedAt: null`, then `status: "completed"` with a numeric end time. Its ordinary turn completed before the background process.
9
+ - StopFailure produced `turn.ended(reason: "failed")` and a matching prompt failure. Interrupt produced `turn.ended(reason: "cancelled")` and `prompt.aborted`.
10
+ - `TurnStarted.origin_kind` was `user` for person prompts and `task` for a background notification. `turn.prompt` may omit `promptId`; notification turns may also omit `prompt.completed`. The native `notificationId` or turn id is the correlation fallback.
11
+ - TaskStarted and Notification hooks were not observed in these runs. Settlement therefore re-reads the native inventory and final turn instead of requiring a hook.
12
+ - A launcher-scoped local plugin worked from `plugins/managed/agent-hub` and `plugins/installed.json`. Its record carries the launch id, not prompt data. Normal TUI exit removed the record and files; another plugin remained.
13
+ - `spawnSync` blocked the launcher's control socket heartbeat. The production launcher now uses async spawn in the foreground process group.
14
+
15
+ ## Live implementation evidence
16
+
17
+ - Ordinary person turn: one private `done`, with the correlated native turn end and no text in the completion sinks.
18
+ - Real background `sleep 15`: no completion while the task file said running. One `done` appeared only after the task and notification turn had settled, without requiring TaskStarted or Notification hooks.
19
+ - `hub_inbox`: a queued message was pulled and the person prompt that called the tool produced one `done`. The hub message itself opened no additional person run.
20
+ - Earlier forced-close/restart probes produced one `interrupted` for the open run, never a duplicate on later reads.
21
+ - `ahub results --json` exposed only ids, peer, outcome, times and `private: true`. The launch-scoped plugin was removed on normal exit and other plugins stayed installed.
22
+ - Focused regression suites: 90 completion, agy, launcher and review-follow-up tests plus 36 full-gate failure-focused tests passed, with typecheck and bundle freshness. These covered the codec, completion flow, missing prompt ids, absent Stop/Notification hooks, unknown inventory, compat receipts and unverified-version behavior.
23
+ - PR review follow-up: the version probe preserves a wrapper/interpreter prefix without launch-only model options. A shared-home plugin record carries its owner pid and process signature; an active or unknown owner is never replaced, and only a proven-gone owner is stale. Replacement and cleanup also share one fail-closed lock per native home, and setup failure always falls back to the plain TUI. `turn_end` is emitted for agy and Kimi native turns, a final row after the 2 s Stop deadline still settles, and an unknown task inventory no longer discards final-turn evidence. Quiet re-reads back off from 250 ms to 1 s.
24
+ - Full Linux `scripts/check.sh --changed` at `8402dcd9c712e410f7f610e6271fe768894ac11e`: **12737 pass, 102 skip, 0 fail**, ending `check: OK`. The earlier full run's 10 failures were all fixed and re-run in the focused suites.
25
+ - OCR delegation covered all 21 reviewable files at that head. Two preview/ownership findings were fixed with red/green plugin regressions.
26
+
27
+ ## Acceptance criteria
28
+
29
+ - [x] AC1: blocked-Stop, delayed final output and stale-replay cases; Stop alone creates no completion.
30
+ - [x] AC2: one unread completion only after final-turn readback and verified background quiescence.
31
+ - [x] AC3: StopFailure becomes `failed` only after final-state readback; Interrupt is quiet; launcher loss/restart yields at most one `interrupted`.
32
+ - [x] AC4: a real `hub_inbox` pull does not create a person-originated native turn; the person's prompt settles once.
33
+ - [x] AC5: forged, stale, wrong-launch, wrong-session, wrong-cwd and replayed observations create no run, completion or receipt.
34
+ - [x] AC6: active background work and unknown inventory never produce a premature `done`.
35
+ - [x] AC7: no prompt, answer, hook error, task command or title reaches completion rows, events, logs or memory; native-person results are private stubs.
36
+ - [x] AC8: only compat `kimi-tui` 2.5.2 enables the bridge; other versions keep existing TUI behavior with completion disabled.
37
+ - [x] AC9: `scripts/check.sh --changed` passed at `8402dcd9c712e410f7f610e6271fe768894ac11e`, with 12737 pass, 102 skip and 0 fail. Live exact-version evidence above is complete.
38
+
39
+ ## Hardcoded-value calibration
40
+
41
+ A fresh blind sample of 80 decided entries passed 69/80 (86.25%) after applying the published contract, external-input safety floor, operational default and test-seam distinctions. The new inventory constants were then classified; `bun scripts/inventory-hardcoded-values.ts --check` passed (3494 entries, 2489 classified, 1005 baseline).
42
+
43
+ ## Implementation boundary
44
+
45
+ Hooks are candidates only. The daemon, current launch, native home, native session, project and current socket generation bind every observation. The transcript supplies origin and final outcome; background task files supply count or explicit unknown. Native-person results stay private. Headless ACP behavior is unchanged. An unverified TUI version or a launch without these readbacks declares no TUI settle.
@@ -0,0 +1,31 @@
1
+ # Kimi sliced wire-log drain (#1283)
2
+
3
+ Date: 2026-11-08. Scope: deterministic synthetic fixtures only. No personal wire log, account, model call or native session was used.
4
+
5
+ ## Baseline and after
6
+
7
+ `scripts/benchmarks/kimi-wire-drain-1283.ts` creates three agents with the same append backlog and forces 16 minimum-sized reader slices. Baseline has no scheduler and retains the original synchronous 16-pass behavior. Sliced mode uses the daemon scheduler and a 0 ms continuation between slices.
8
+
9
+ | Measurement | Baseline | Sliced |
10
+ | --- | ---: | ---: |
11
+ | Slices | 16 | 16 |
12
+ | Drain wall time | 34.401 ms | 33.824 ms |
13
+ | Longest synchronous slice | 34.373 ms | 3.296 ms |
14
+ | Discovery calls | 32 | 32 |
15
+ | Bytes read | 2,082,248 | 2,082,248 |
16
+ | Yields | 0 | 15 |
17
+ | Caught-up reports | 1 | 1 |
18
+
19
+ These are one local run's raw values, not a production latency or percentage claim. Discovery and bytes are unchanged; each scheduled invocation returns after one bounded read/commit, and control traffic can run before the next slice. All 16 continuation callbacks are timed individually. The terminal offline read still drains synchronously before drop, and a failed attempt uses the bounded 250 ms follow-up instead of an unbounded 0 ms retry.
20
+
21
+ ## Acceptance criteria
22
+
23
+ - [x] AC1: the same fixture reports before/after longest synchronous slice and discovery count, with raw values and no inferred percentage.
24
+ - [x] AC2: a real daemon `status` request completed between two slices; the test asserts pending-slice ordering, not elapsed milliseconds.
25
+ - [x] AC3: fault injection after reader offset advancement proves cancellation cannot discard the uncommitted slice; the delayed timer also contains an event failure and keeps its bounded retry.
26
+ - [x] AC4: a new agent created between slices is discovered and counted by the next fresh validation pass.
27
+ - [x] AC5: protocol, privacy, rotation, hard-link, shrunk-file, malformed-row and partial-line tests pass; earlier successful rows survive a later failure exactly once.
28
+ - [x] AC6: concurrent cues remain serialized at one pending drain, and stop/session replacement cannot rebind the old session.
29
+ - [x] AC7: `scripts/check.sh --changed` passed at `a9b777a947ab2636f36da704b71cae8dc157fb6e`, with 12698 pass, 102 skip and 0 fail, ending `check: OK`.
30
+
31
+ Focused result: 43 tests across the benchmark, delayed-usage, daemon and wire suites passed, plus typecheck. Baseline/sliced receipt generation and the benchmark test also passed independently.
@@ -0,0 +1,250 @@
1
+ # Live model override T1 evidence, #1317
2
+
3
+ Task #808 implements person-owned desired model state and supported next-turn
4
+ selection. This is source and fake-transport work. No model, real account,
5
+ native profile, deployed daemon, release or machine trust was changed.
6
+
7
+ ## Contract and scope
8
+
9
+ - Overrides live in the project hub.db and survive daemon restart. Runtime reset
10
+ clears them; retained state is bound by recovery feature/integrity admission.
11
+ - CLI model set/clear/list is person-only, including agent-shell/live-test refusal.
12
+ Dashboard writes use verified settings-session identity, preview and confirmation;
13
+ expiry alone is not treated as a session identity.
14
+ - The desired revision and an active turn's captured model are separate. Captures
15
+ happen before asynchronous preparation; acknowledgements bind their actual
16
+ adapter owner and turn, not a future turn id or a model string alone.
17
+ - Conductor ruling on 2026-11-08 admits both CodexPeer app-server turn/start
18
+ paths. An explicit native client model wins, turn/steer is unchanged, and a
19
+ turn/start model becomes the native thread default. Clear removes the hub
20
+ override but does not invent an earlier native default.
21
+ - T1 does not add ACP setters or native TUI authority. The supported factories
22
+ are host-marked; public capability text alone cannot claim a live setter.
23
+ - Tier 3 instance/model/command/provider rules, native reviewer tool/isolation
24
+ fences and local budget/campus/observer safeguards remain in force.
25
+
26
+ ## Checks
27
+
28
+ The worktree began at b97ee5af976e92b97d2eb55b8a1147908a83fac7. Local dependency
29
+ preparation used pinned Bun 1.4.2 with a frozen lockfile (99 packages), with no
30
+ pin or lock change. A bounded DGX structural query found ripwire unavailable in
31
+ the image, so planning used the inspected source call sites instead. That query
32
+ was not a compilation or test gate. Committed-head checks are recorded below
33
+ when their results are available; no test pass is claimed yet.
34
+
35
+ ## Remaining evidence
36
+
37
+ Focused fakes, canonical DGX and exact-head hosted CI remain unverified until
38
+ recorded. No native/provider/model-backed run is claimed by those checks.
39
+
40
+
41
+ ## Initial committed checks
42
+
43
+ - `c0640100a3ff4bf2ab583351ba6a2f26eb2290e0`: frozen DGX install then TSC
44
+ stopped at one possibly undefined model-boundary access. Inventory and tests
45
+ did not run. The guard now requires existence before comparing the owner.
46
+ - `7ae86fcc726a70505107b11e445e8373321b8001`: the separate DGX inventory check
47
+ identified seven new keys. This is a failed inventory run, not a green gate.
48
+ No key was added to the baseline.
49
+
50
+ The new thread-model cache cap, stored override count, pending preview count and
51
+ confirmation TTL are operational limits on the hub's own retained state. Pending
52
+ native RPC records, CLI response rows and incoming confirmation-token length
53
+ are safety floors at input/proof-reader boundaries. The existing #844 token
54
+ representation is reused unchanged in a pure leaf module; native adapters do
55
+ not import the registry through instances, avoiding an initialization cycle.
56
+
57
+
58
+ At `69974c37b53cc74bb6656b63648f6b8b07818754`, DGX typecheck,
59
+ inventory and all 559 exact seed anchors passed. Runtime tests had 383 pass,
60
+ 3 existing platform skips and 1 failure across twenty files (3,821 assertions;
61
+ 124 s). The new Codex test requested steering after the RPC response but before
62
+ its actual native `turn/started` observation. Its fake now supplies that barrier
63
+ and asserts the steer uses the observed native turn id. No ownership guard,
64
+ assertion or timeout was relaxed. The three existing #845 skips do not provide
65
+ Linux-native sandbox evidence.
66
+
67
+ Additional boundary checks before submission cover a saved override whose audit
68
+ append fails (explicit saved-but-failed reply and readback/repair guidance), an
69
+ older hub that advertises no model support (refusal before any model request),
70
+ and model listings with retained removed peers. The model view has a display-only 512-row ceiling, with bounded collection
71
+ of builtin, configured, external, active local and retained ids. Legacy native
72
+ peer admission has no universal 64-peer cap, so a complete inventory is not
73
+ assumed to fit. Overflow explicitly refuses list, marks model data unavailable in
74
+ status/snapshot without breaking other fields, and leaves single-peer set/clear
75
+ usable. No peer admission is narrowed and no truncated list is called complete. This does not raise the
76
+ storage cap or change any existing timeout.
77
+
78
+
79
+ The display path caches a scalar launch model only when a trusted supported
80
+ factory registers its owner. Periodic model views do not call unsupported
81
+ owners' recovery hooks or scan task history. The unavailable flag has fixed
82
+ CLI/UI cause and repair guidance, and disables stale model controls.
83
+
84
+ At `29f3be831399c0125ad9ea5bd4f117894505a760`, the new real fake-WebSocket
85
+ ACK-order test reproduced a product defect: an older explicit-client ACK arrived
86
+ after a newer hub model acceptance and incorrectly emitted `client-older` as the
87
+ native choice. The named assertion failed normally (one case, seven assertions,
88
+ 4 s), without setup/compiler/timeout failure. This red checkpoint intentionally
89
+ contained the new test and unchanged Codex source; other pending refinements were
90
+ not claimed tested. Its eventual fix and green evidence are recorded separately.
91
+
92
+
93
+ At `4e10add8e7f6ad446aaf42278ea46ceb86fc77df`, typecheck, inventory and
94
+ all 559 anchors passed. The Codex ACK-order regression was green (139 ms),
95
+ including unknown-default cases, with its original failing assertion preserved.
96
+ The selected seven files had 125 pass and one new fixture failure (1,700
97
+ assertions; 61 s): a counter included legacy status recovery-hook calls rather
98
+ than isolating the new model view. The correction checks the model-list path
99
+ immediately and executes the actual cached fallback projection separately.
100
+ The legacy status behavior is not rewritten or counted as a model regression.
101
+
102
+ A second named red test at `d92ea42aa1d0de528dba014b771895b672e2ad44`
103
+ used the real authenticated fake Pi bridge and an owned process signature. It
104
+ held the public setter return after a successful native ACK, withdrew roster
105
+ ownership, then observed an incorrect `applied` callback before the existing
106
+ epoch guard (expected zero, observed one; five assertions, 4 s). The source moves
107
+ that callback after the existing post-ACK guard. Cancellation/shutdown precede
108
+ the fixture's delivery join; the owned process is confirmed exited. This is
109
+ synthetic host/protocol evidence, not a native account or model qualification.
110
+
111
+ The new Codex steer test also uses the fake's existing file gate to hold turn
112
+ completion until its native-id/model assertions finish, replacing a 100 ms
113
+ completion race without changing any product timeout or shared fake behavior.
114
+ Final unavailable banners describe bounded-read failure generically, because
115
+ store-read failure and catalog overflow must not be confused.
116
+
117
+
118
+ At `ded9db733f0a0b7b8fea70934d41d051afd1da94`, DGX typecheck, inventory
119
+ and all 559 anchors passed; all 122 selected Codex/Pi/controller/CLI/UI tests
120
+ passed (1,475 assertions, five files; exit 0 in 53 s). This includes the prior
121
+ ACK-order red test and the invalidated Pi ACK red test. Other adapter, tier 3,
122
+ reset and HTTP-auth tests passed in the earlier wider run; no earlier failed
123
+ whole run is relabelled as green.
124
+
125
+ Final state/UI edges add a captured-revision check for clear before its first
126
+ ACK, and per-component draft/request generations for model confirmation. Editing
127
+ the draft or beginning a new preview invalidates old tokens and all late success,
128
+ error and finally effects. Preview metadata must match the exact set value or
129
+ null clear. Server refusals retain bounded plain error/repair text through the
130
+ existing text-only surface; unsafe or malformed replies use fixed fallbacks.
131
+ The UI error-text ceiling is a safety floor, not a new authority or model bound.
132
+
133
+
134
+ At `8333ffcdfe05f373a7c58fa192a4efd7123c138e`, typecheck and inventory
135
+ passed; all 25 changed state/UI tests passed (237 assertions, two files;
136
+ 39 s). This covers pending clear before first ACK, strict draft/token binding,
137
+ late preview/confirmation success/error/finally, and specific safe server repair
138
+ text without claiming native application.
139
+
140
+ Main `6da56c7a3cc697d9401903b827897148e05826e9` was merged cleanly for
141
+ integration, including the #1318 macOS typecheck heap fix. The model runtime,
142
+ adapter, CLI/UI, package, lock and generated bundle bytes are unchanged from the
143
+ passing source checkpoint; incoming changes are Orca O2 and the CI fix. No
144
+ unmerged fix branch is imported. Two new seeded guards target person-only model
145
+ control and the reproduced accepted-ACK ordering defect, using existing named
146
+ Linux tests. Their actual seeded results follow separately.
147
+
148
+
149
+ ## Integration checkpoint and remaining gate
150
+
151
+ At `15cb959eab3b7e5796e3df4c50046d8447fe801c`, all 561 anchors matched.
152
+ Seed shards 48/64 and 49/64 passed all 18 original-green / named-mutant-detected
153
+ pairs, including both new model guards (46 s total). The separate existing
154
+ Office/role/pet/motion/UI integration tests passed 101/0, with 140,310 assertions
155
+ across five files (17 s). Logs: scratchpad `temp/task808-seeds.log` and
156
+ `temp/task808-ui-integration.log`. These are focused shards, not a claim that
157
+ all 561 mutants ran.
158
+
159
+ The initial 44-file independent source/test/doc review had no confirmed
160
+ Important finding; its CLI 30-second timeout nit was corrected to the repository
161
+ 20-second ceiling. Subsequent delta reviews covered all nongenerated changes
162
+ and confirmed the model ACK, cached metadata and UI fences. The unavailable
163
+ cause nit is fixed. The generated bundle is checked by the gate rather than
164
+ claimed manually reviewed. A provisional token-newline alert was retracted
165
+ against the actual pinned runtime and ECMAScript semantics, with no source change
166
+ or pass claim based on it.
167
+
168
+ The final report-only head starts canonical `scripts/check.sh --changed` on
169
+ DGX. Its result and exact-head hosted CI remain unverified until recorded. The
170
+ known inherited Herdr `/home/dev` fixture defect (#807) is outside this feature.
171
+ No test is excluded or weakened for it. Native/provider-backed model acceptance,
172
+ real UI browser interaction and installed-hub rollout remain unrun. No release,
173
+ upgrade, restart or model change was performed on the person's running hub.
174
+
175
+
176
+ ## Unchanged covering contracts
177
+
178
+ The parent agent-hub goal spec is unchanged: this refines existing native
179
+ adapters and person-owned control without changing task/peer authority,
180
+ account ownership or the deployment boundary. The owning adapter and
181
+ architecture specs carry the new model state, turn and evidence contract.
182
+ The bus spec is unchanged: reset clears an additional independent runtime table,
183
+ while message addressing, queue/journal disposition, receipts, TTL, broker and
184
+ reset admission semantics remain as before. Model selection is not a task or
185
+ delivery effect.
186
+
187
+ This acknowledgement was omitted from the first board completion. The final
188
+ document-only correction carries the same runtime and test bytes. Canonical
189
+ verification continues at parent `2f311bf61c6c77636aeb54a5ad249838b8ea0ee5`;
190
+ it is not an exact-head canonical pass for the corrected document head. Hosted
191
+ CI must verify the final head before merge. No duplicate canonical run or empty
192
+ retry commit is introduced for this bookkeeping correction.
193
+
194
+ ## Reviewer regression corrections
195
+
196
+ Review of `54546e9d` found two regressions the earlier focused set missed:
197
+ the generic reviewer factory supplied a model getter to unsupported Claude and
198
+ Kimi reviewer surfaces, and a client-forwarded Codex start rejected before any
199
+ turn began retained its captured model choice. Both are operational regressions,
200
+ not unavailable evidence. The corrected fixtures exercise actual daemon reviewer
201
+ starts and rejected proxy requests followed by a corrected desired model.
202
+
203
+ The original canonical run at `2f311bf6` reproduced the Claude reviewer failure
204
+ in `reviewer-pool-daemon.test.ts`. It also reported a `#733` catch-up test failure.
205
+ After those failures and this review, the owner interrupted that obsolete run
206
+ with SIGINT; it exited 130 after 592 seconds. It is cancelled, not a full-suite
207
+ pass, and no test failure is erased or counted as fixed merely by cancellation.
208
+
209
+ The correction also acknowledges Pi selections only after prompt acceptance,
210
+ and identifies a cleared Codex override retained by the native thread as
211
+ `native thread default (was override)`. The latter describes known accepted
212
+ history; clear still cannot reconstruct a previous thread model. Unsupported
213
+ reviewer surfaces keep their original no-override review behavior and do not
214
+ gain a model-setting capability.
215
+
216
+ Concurrent definitive rejections drain a single bounded retirement candidate,
217
+ including when an explicit client-model request is the last one to reject.
218
+ Native acceptance or a native start protects the current boundary. Reused RPC
219
+ ids remain ambiguous: their tombstone is retained until client reattachment,
220
+ rather than treating the first response as proof all duplicate requests failed.
221
+ No retirement callback grants model authority or overwrites an explicit client
222
+ choice.
223
+
224
+ The first correction check at `f7e84a200a494c4566f71915260f96dbf0318e5a`
225
+ passed typecheck, inventory and bundle comparison, then reported 172 pass and
226
+ 1 fail (2,100 assertions, ten files; remote exit 1 in 76 s). The failure was in
227
+ the new Pi acceptance fixture: its synthetic settlement omitted the required
228
+ native generation, so the existing fence correctly ignored it. Commit
229
+ `8f8c9794f0b71d52bca6a8983598e34968edd134` supplies the actual generation-bound
230
+ start/settled lifecycle. It changes only that fixture, preserving every existing
231
+ assertion, deadline and production lifecycle check.
232
+
233
+ Committed-head DGX verification at `8f8c9794f0b71d52bca6a8983598e34968edd134`
234
+ passed typecheck, inventory (3,496 entries; 2,491 classified; unchanged 1,005
235
+ baseline entries), bundle comparison, and all 173 tests across ten files
236
+ (2,103 assertions). This includes the original failing reviewer daemon suites,
237
+ the actual proxy correction, concurrent rejection cases and Pi acceptance and
238
+ rejection. Seed shards 48/64 and 49/64 passed all 18 original-green /
239
+ named-mutant-detected pairs, including both model guards. The combined remote
240
+ command exited 0 in 109 seconds; log: `scratchpad/temp/task808-review-final-focused.log`.
241
+
242
+ The independent correction review covered all 16 nongenerated changed files
243
+ and found the explicit-last rejection gap before verification; it was corrected
244
+ and reread with no further finding. The generated bundle is verified by
245
+ comparison. The final report-only head has identical runtime, test and script
246
+ bytes to that focused-tested commit. Its canonical changed-scope gate and
247
+ hosted exact-head CI remain separate, unverified gates until their results are
248
+ recorded; neither the focused pass nor the interrupted earlier run substitutes
249
+ for them. Native/provider-backed acceptance and real dashboard interaction
250
+ remain unrun.
@@ -0,0 +1,138 @@
1
+ # Qwen Code 0.26.9 ACP receipt
2
+
3
+ Date: 2026-11-08. Task #811, Refs #843 and #1317. Repeats the
4
+ [0.26.8 account-free ACP procedure](2026-11-06-qwen-0268-acp.md) on macOS arm64.
5
+
6
+ **Decision: add exactly 0.26.9 to COMPAT.qwen.verified.** Native ACP, the actual
7
+ published permission handler, network-denial controls, owned cleanup and the
8
+ separate reviewed optional lifecycle replay passed. This qualifies no other
9
+ version or native surface. Runtime model setters belong to #1317 T2 and are
10
+ not proved by this receipt.
11
+
12
+ ## Artifact
13
+
14
+ The [official release](https://github.com/QwenLM/qwen-code/releases/tag/v0.26.9)
15
+ and exact [npm metadata](https://registry.npmjs.org/@qwen-code/qwen-code/0.26.9)
16
+ identify commit `600aff0592bcfc21668ca4aba95a5b20c6491b86`.
17
+ The private npm lock's SRI equals that metadata. No global install, update or
18
+ trust change was performed.
19
+
20
+ | Binding | Value |
21
+ | --- | --- |
22
+ | Package | `@qwen-code/qwen-code@0.26.9` |
23
+ | npm integrity | `sha512-2orVsP3Dr01gk38STbYTWcFZeXftc0QXDHhglK7YPsIwgmumvnJeTAu1N00esRUwuLcevZ8k4godLwypDKb1LA==` |
24
+ | package.json SHA-256 | `47f5ad2df1ba61df66e8ce409e65beb01cc3fcf551acaa028ca1d0904b5cba09` |
25
+ | cli-entry.js SHA-256 | `113efe4104a9fc66f507d34bfd6abbd896ceb77de47f4b468a0825a327fdc6a5` |
26
+ | chunks/acpAgent-GNBAKZNO.js SHA-256 | `a856ab4bbd2fceabc2430ef3a5689fd404b70d766c8f1fc3715632ff0afd4f8a` |
27
+
28
+ Source for the committed producers was `d87dfe25d` (the branch's main base).
29
+ The collector imports `runQwenProofs` and `runBoundedReceiptCommand`; it does not
30
+ copy their assertions or rewrite installed candidate code. The permission leg
31
+ uses the producer's exports-only temporary chunk copy and removes it afterwards.
32
+ Original package and producer hashes matched before and after both native runs.
33
+
34
+ ## Isolation and cleanup
35
+
36
+ - A fresh 0700 root under `/private/tmp/ahub-811-...` holds the private npm prefix,
37
+ HOME, cwd, TMPDIR, QWEN_HOME, QWEN_RUNTIME_DIR and all XDG config/cache/data/state
38
+ paths. Only fixed runtime PATH and locale values enter helpers. No account,
39
+ OAuth state, personal profile, real key, MCP project or agent/session marker
40
+ was copied. Authentication uses only the producer's synthetic fixture key.
41
+ - The installer uses empty user/global npm configurations and its own cache.
42
+ Seatbelt starts from `src/local/sandbox.ts`, then denies actual-home data and
43
+ global writes, allowing runtime code reads and writes only in the owned root.
44
+ Only the install phase permits package downloads. Both native proof phases
45
+ deny all kernel network access, in addition to the unchanged Node preload.
46
+ - `/usr/bin/true` passed. Read-open of a named actual configuration and write-open
47
+ of the installed Node executable, without truncation or writing bytes, were
48
+ denied with Operation not permitted. These are receipt-controller controls,
49
+ not a general sandbox attestation for the release.
50
+ - The before/after configuration snapshot covers regular files smaller than
51
+ 2 MiB below the actual `.qwen` and `.pi/agent`, excluding sessions, logs, cache,
52
+ install, bin, node_modules and .git; symlinks are recorded without following.
53
+ All 2,318 entries matched, aggregate SHA-256
54
+ `37e4d8a5f0fe0acbbbecc87d3bd57ee6ea6b9c6dccfc7ebefcc1a3a37232464b`.
55
+ The person's real configuration was unchanged after install and after native
56
+ verification. The snapshot is deliberately not a hash of every session/log.
57
+ - Every native command returned bounded output and confirmed its owned stop.
58
+ The ACP producer reports `groupGone: true`, leader exit -15, before and after
59
+ lifecycle replay. A final process inventory found no private-root survivor.
60
+ Detached process lifetime containment remains unproven; a native Seatbelt
61
+ run is not a disposable-runner attestation. No unknown process was signalled.
62
+
63
+ ## Native ACP and permission legs
64
+
65
+ The unmodified promoted `qwen-acp.py` ran with `--acp --bare --advisor off`,
66
+ synthetic OpenAI auth, `fixture-model`, loopback port 9 and telemetry disabled.
67
+ No ACP prompt was sent and no model or fixture completion was requested.
68
+
69
+ - `initialize` returned protocol 1 and exact `qwen-code` / `Qwen Code` / 0.26.9
70
+ identity. Only the expected terminal OpenAI auth method was offered.
71
+ - `session/new` returned a nonempty session identity, only the fixture model,
72
+ and initial mode `default`. The advertised ids include the hub's mapped subset
73
+ `default`, `auto-edit`, `yolo`. All four `session/set_mode` calls in
74
+ `default -> auto-edit -> yolo -> default` acknowledged successfully.
75
+ - The unchanged preload's positive denial control passed before candidate code.
76
+ Six startup network API attempts were blocked in each run; no connection was
77
+ allowed by the kernel profile. This does not infer absence of attempted calls
78
+ from an empty log.
79
+ - `qwen-permission.mjs` drove the actual published `SubAgentTracker` handler,
80
+ using only synthetic clients, tools and events. Two permission requests had
81
+ the exact options: project/user `allow_always`, `proceed_once` / `allow_once`,
82
+ and `cancel` / `reject_once`. The allow-once callback returned `proceed_once`,
83
+ cancellation returned `cancel`, and an unoffered option was rejected. No
84
+ permission-fixture network attempt was recorded. No model-generated tool call
85
+ or actual board approval was involved.
86
+
87
+ ## Optional lifecycle and repetition
88
+
89
+ The optional `@qwen-code/audio-capture` install script is byte-identical to the
90
+ previous reviewed script, SHA-256
91
+ `bf91a3db08fdaf1622a0fa938f1f0e29cef712586ca13c2b0ac2422dd3f916fd`.
92
+ It invokes `node-gyp-build` and deliberately exits 0 even when the optional
93
+ microphone backend is unavailable. Normal private npm installation passed
94
+ without disabling scripts. An explicit replay under the private HOME, no-network
95
+ Seatbelt profile and build concurrency two also exited 0 with owned cleanup.
96
+ This proves the reviewed lifecycle procedure, not microphone functionality.
97
+
98
+ After replay, new private HOME/cwd/XDG paths repeated all ACP and permission
99
+ assertions successfully. The generic machine summary still calls the lifecycle
100
+ leg `not-run: source-review-required`; the separate reviewed/replayed control
101
+ above supplies that evidence, without changing the producer's result or claiming
102
+ automatic harness eligibility.
103
+
104
+ One post-lifecycle controller attempt failed before any native command: Bun had
105
+ already created its HOME cache, conflicting with the collector's directory
106
+ creation. The repaired controller validates precreated owned 0700 HOME paths
107
+ and keeps native proof/output creation exclusive. The failed setup log is kept;
108
+ no protocol, refusal, integrity assertion, timeout or production code changed.
109
+
110
+ ## Separate surfaces and not verified
111
+
112
+ `qwen-dual` needs its own 0.26.9 receipt. Its input-file/json-file TUI protocol,
113
+ interruption, permission and resume behavior is distinct from ACP. The
114
+ [0.26.8 dual-output check](2026-11-06-qwen-0268-dual-output.md) did not qualify
115
+ that version, and this ACP run supplies no missing TUI proof. Its verified set
116
+ remains 0.26.1. No remote/Linux, Intel Mac, real account/provider/model, runtime
117
+ model setter, real model permission call, microphone or TUI leg is claimed.
118
+
119
+ Committed-head DGX validation and hosted CI are separate PR gates, recorded in
120
+ the PR/task completion. No `docs/verified.json` stamp, release or production
121
+ upgrade is part of this change. The temporary prefix is retained privately for
122
+ the independent T2 setter experiment, not installed into the person's profile.
123
+
124
+ ## Evidence fingerprints
125
+
126
+ Closed results and controller sources are in workspace scratch `temp/task811`.
127
+ The underlying installed prefix and synthetic native artifacts remain in the
128
+ owned temporary root while T2 is in progress.
129
+
130
+ | Evidence | SHA-256 |
131
+ | --- | --- |
132
+ | private installation result | `447e5194eec456e61c35ac38ca042e4d21eded4040af0585a03b351678ae7a5c` |
133
+ | first native collector result | `498e672a133d0479dec564f0e0d3eb7022b2ad97e32a97c79835e693d7784f56` |
134
+ | optional lifecycle result | `e27602dc5fe10a84c6e54219d460d7cb198a8ffd6dbc2bcbce4b67118878e4c5` |
135
+ | post-lifecycle collector result | `4586096e28cf5939f059e11350d8b3c3e89e33fd265c7db0b17d1b7e226a3fa4` |
136
+ | final configuration snapshot | `22aabd64a69a6ddef7f5a2a0915ada14849f37295d531f70c9626f860b44268f` |
137
+ | post-lifecycle ACP result | `0eda1b826007ae53dbca2b41668331d728b2791fa39942e4d468d4160fca5566` |
138
+ | post-lifecycle permission result | `e6ebfbf1572713288bc9eed11071e5228273bf5087a0b8cdf5767573f051ac2e` |