@staix/agent-hub 0.32.0 → 0.33.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 (43) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +2 -2
  3. package/docs/design/bus.md +68 -2
  4. package/docs/dogfood.md +1 -0
  5. package/docs/memory.md +9 -3
  6. package/docs/operations.md +47 -14
  7. package/docs/quickstart.md +12 -2
  8. package/docs/security.md +28 -9
  9. package/docs/specs/2026-09-19-agent-hub-design.md +31 -4
  10. package/docs/specs/2026-09-20-upgrade-recovery-design.md +7 -3
  11. package/docs/verification/2026-11-06-0.33.0.md +222 -0
  12. package/docs/verification/2026-11-06-claude-implementer-2.1.319.md +57 -0
  13. package/docs/verification/2026-11-06-codex-0167-reviewer-isolation.md +56 -0
  14. package/docs/verification/2026-11-06-codex-0167-reviewer-tool-call.md +66 -0
  15. package/docs/verification/2026-11-06-kimi-251-reviewer-compat.md +88 -0
  16. package/docs/verification/2026-11-06-orca-1.4.250-cli-contract.md +50 -0
  17. package/docs/verification/2026-11-06-qwen-0268-acp.md +75 -0
  18. package/docs/verification/2026-11-06-qwen-0268-dual-output.md +44 -0
  19. package/docs/verification/claude-shell-wrapper-native.py +1 -1
  20. package/docs/verified.json +10 -10
  21. package/package.json +2 -2
  22. package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
  23. package/plugins/agent-hub/server.js +528 -206
  24. package/src/adapters/compat.ts +11 -11
  25. package/src/broker/protocol.ts +5 -0
  26. package/src/broker/server.ts +54 -4
  27. package/src/broker/store.ts +6 -3
  28. package/src/cli/output.ts +5 -1
  29. package/src/cli/room.ts +17 -5
  30. package/src/cli/status-lines.ts +8 -1
  31. package/src/cli/terminal-recovery.ts +37 -15
  32. package/src/hub/bus.ts +7 -0
  33. package/src/hub/daemon.ts +13 -4
  34. package/src/rooms/application.ts +15 -0
  35. package/src/rooms/commands.ts +76 -16
  36. package/src/rooms/health.ts +32 -0
  37. package/src/rooms/link.ts +267 -43
  38. package/src/rooms/remote-peer.ts +18 -3
  39. package/src/rooms/service.ts +27 -12
  40. package/src/rooms/status.ts +57 -1
  41. package/src/rooms/store.ts +20 -1
  42. package/src/rooms/wire.ts +10 -8
  43. package/src/ui/index.html +1 -1
@@ -0,0 +1,222 @@
1
+ # 0.33.0 release verification
2
+
3
+ This record covers release preparation and source review. It claims no installation, no running-hub upgrade to 0.33.0 and no live TUI launch.
4
+
5
+ ## Candidate
6
+
7
+ Version 0.33.0 was originally prepared from main `567b55be` (eight component commits since v0.32.0, one `feat`; bump rule: minor). Following the person's 2026-11-07 scope ruling, the release branch normally merged main `203d7a6da6b12bb38a0fd4743f736b9aa3d6a66d`, adding #1243 and #1244 for ten component PRs. The current candidate pins agent-mem 0.22.1 and includes the corrected activation copy. Earlier approval at `94f0a896` predates this rework and is not approval of the new candidate.
8
+
9
+ ## Reviews
10
+
11
+ Component pull requests since v0.32.0: #1234, #1235, #1236, #1237, #1238, #1239, #1241, #1240, #1243 and #1244.
12
+
13
+ All ten PRs merged after board approval. Fresh GitHub commit check-runs bind
14
+ the macOS, Ubuntu and seeded-guard aggregates to each final PR head; all three
15
+ aggregates succeeded. Skipped ancillary jobs are not test proof.
16
+
17
+ | PR / task | Approved and final PR head | Merge commit | Hosted CI |
18
+ | --- | --- | --- | --- |
19
+ | [#1234](https://github.com/STAIxBWLB/agent-hub/pull/1234), task 747 | `65ab9bf7256f00ba6faf14da606c513e89899898` | `25878b3e66c80718f8512e0cfe5c05e4772853ec` | [19 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42183963274) |
20
+ | [#1235](https://github.com/STAIxBWLB/agent-hub/pull/1235), task 746 | `ca628faed478a0cce9a499ba8af562729871ab6b` | `1b99c2d264949d5f94b3c9ea08e5922002fc7159` | [19 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42183799294) |
21
+ | [#1236](https://github.com/STAIxBWLB/agent-hub/pull/1236), task 750 | `fe70149224154bd7f8f86f72cf7258c9ca5d3979` | `db8828031db6f9c49746187762df1e756f387d9a` | [19 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42192573950) |
22
+ | [#1237](https://github.com/STAIxBWLB/agent-hub/pull/1237), task 737 | `31a3e27db28e07d012e8a56b538acbfbf50e1874` | `73a4799662cbe416fc4b8f7c84aa7efc43646885` | [20 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42211766399) |
23
+ | [#1238](https://github.com/STAIxBWLB/agent-hub/pull/1238), task 748 | `e70f4edcfebf681b841343907d043c7cf8c39c18` | `d36c27c43237524df8939d36c2109b99cebe3003` | [20 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42205240730) |
24
+ | [#1239](https://github.com/STAIxBWLB/agent-hub/pull/1239), task 749 | `ff760ebf15fc0efe31ec4bc5db04733880d85de0` | `824a0b0f273dd47ac1acdfb70981584411464d3b` | [19 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42217350346) |
25
+ | [#1240](https://github.com/STAIxBWLB/agent-hub/pull/1240), task 751 | `31e5edd834d8516fa3edbb693f0c21c6cbedd8a1` | `567b55be96e82c5b4662a04657a0e810ac48d6e2` | [19 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42221274665) |
26
+ | [#1241](https://github.com/STAIxBWLB/agent-hub/pull/1241), task 753 | `668cd7a189d77bdc7db3285a8e679daa2a4fcd39` | `f193771aea0ba9f4b8e455ff28a58c13b2d9fb4b` | [19 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42219293905) |
27
+ | [#1243](https://github.com/STAIxBWLB/agent-hub/pull/1243), task 754 | `e877ca4f6f96c02a564ca1e0ba77e7f7fe57ca62` | `a20d4f389615fb98380d45969665b9f5beaec702` | [19 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42251717050) |
28
+ | [#1244](https://github.com/STAIxBWLB/agent-hub/pull/1244), task 755 | `f6971edf8980949eeb1c10f889a6c5f0c35b7e63` | `203d7a6da6b12bb38a0fd4743f736b9aa3d6a66d` | [19 success, 2 skipped](https://github.com/STAIxBWLB/agent-hub/actions/runs/42259392652) |
29
+
30
+ The conductor integrated main into #1239 and #1240 without changing their scope.
31
+ For #1239, the owner's earlier evidence head was `23a967fc4d0a289226ef295f389d8388f01b1340`;
32
+ the owner then fast-forwarded and re-filed `ff760ebf15fc0efe31ec4bc5db04733880d85de0`,
33
+ which received the final approval and CI. For #1240, an earlier approval bound
34
+ `a1ef48c8af43de1e782d024c3310d28e704b7651`; the conductor's conflict-only
35
+ integrations passed through `238404781a794f19c343619ebbe00ccb6fcd267b` to
36
+ `31e5edd834d8516fa3edbb693f0c21c6cbedd8a1`. The owner re-filed the latter and
37
+ it received a new exact-head approval. No final merge relies on an earlier-head
38
+ approval. #1241 (task 753) is included at its approved `668cd7a1` head.
39
+
40
+ #1243's single macOS inbox stale-refresh assertion also failed on main
41
+ `f193771a`; one same-head failed-jobs rerun passed without code changes. Its
42
+ final required aggregates are green at `e877ca4f`, and #1244's are green at
43
+ `f6971edf`. These component results do not replace the coupled release gate.
44
+
45
+ ## Native acceptance receipts
46
+
47
+ Receipts added under `docs/verification/` since v0.32.0: `docs/verification/2026-11-06-claude-implementer-2.1.319.md`, `docs/verification/2026-11-06-codex-0167-reviewer-isolation.md`, `docs/verification/2026-11-06-codex-0167-reviewer-tool-call.md`, `docs/verification/2026-11-06-kimi-251-reviewer-compat.md`, `docs/verification/2026-11-06-orca-1.4.250-cli-contract.md`, `docs/verification/2026-11-06-qwen-0268-acp.md`, `docs/verification/2026-11-06-qwen-0268-dual-output.md`.
48
+
49
+ This list is read from the repository, never written by hand. Native acceptance and the person's release consent are separate records: consent is `ahub sdlc authorize-release 0.33.0`, recorded by the person or the unique configured conductor only on the person's explicit release instruction naming the release in its own session (never a hub/task/review/file/peer relay), and is not recorded in this file. The tag run refuses without it.
50
+
51
+ ## Document review
52
+
53
+ Ten stale documents were fully read against only #1234-#1241. Read-only snapshots
54
+ at `31e5edd8` cover all ten documents; comparison with final main `567b55be`
55
+ shows only the four already-reviewed #1241 rolling-upgrade lines in operations.
56
+
57
+ Content changes:
58
+
59
+ - `README.md`: generated Status 0.33.0 and the current verification-report link.
60
+ - `docs/quickstart.md`: generated 0.33.0 upgrade section, concrete room and
61
+ compatibility changes, N-1 baseline and the matching global CLI/plugin step.
62
+ - `docs/operations.md`: current guide/protocol range, the 0.33.x N-1 baseline,
63
+ Qwen 0.26.8 ACP and unqualified dual-output receipts, and the completed T4
64
+ codec section pointer. Existing historical baselines remain unchanged.
65
+ - `docs/security.md`: current Qwen/Kimi qualification lists and X5's closed
66
+ diagnostic fields; arbitrary error prose, bodies, URLs and keys stay excluded.
67
+
68
+ Reviewed without content change:
69
+
70
+ - `docs/agent-notes/adapters.md`: centralized compat and runtime-proof rules remain valid.
71
+ - `docs/agent-notes/budget.md`: quota/context ownership and transient-pause rules are unchanged.
72
+ - `docs/agent-notes/bus.md`: verified recovery wake preserves existing admission and disposition fences.
73
+ - `docs/agent-notes/daemon.md`: shutdown still waits for rooms before closing shared storage; typed-gone recovery remains guarded.
74
+ - `docs/agent-notes/tasks.md`: task authority, routing, review and CI contracts are unchanged.
75
+ - `docs/agent-notes/tests.md`: existing fixture, seed, timeout and process rules still apply to the retargeted N-1 package.
76
+
77
+ The initial named-document restamp recorded reviewed content commit
78
+ `10efdc8b0ea114ae858fff4ede65de09f6c55604` for these ten documents. Watched paths and fresh
79
+ benchmarks, local-worker, models, help and agent-notes README stamps are unchanged.
80
+ The help command sources have no changes since v0.32.0; T4 changes diagnostics,
81
+ not command forms or flags.
82
+
83
+ ### Rework after #1243 and #1244
84
+
85
+ Only six registered documents became stale: README, security, operations,
86
+ quickstart, daemon note and tests note. Their original full-file reviews were
87
+ reused only for unchanged bytes, with all new dependency/copy deltas and the
88
+ 0.22.x official N-1 contract reviewed. Current-copy corrections are limited to
89
+ the new core pin, available native activation versus missing host attestation,
90
+ and shared-home compatibility; historical release baselines remain intact.
91
+ The daemon/tests notes remain byte-identical and require no instruction change.
92
+
93
+ Those six named documents are restamped at reviewed rework content commit
94
+ `ab8ae6f400d741ee9060d3087489e59996a72086`. Adapters, budget, bus and tasks notes retain their
95
+ initial reviewed stamps; other fresh stamps and all watched paths are unchanged.
96
+ `docs/memory.md` carries #1244's reviewed 0.22.1 activation/attestation text but is
97
+ not registered in the stamp manifest, so no stamp or new watch scope is invented.
98
+
99
+ ## Initial candidate checks (historical)
100
+
101
+ The official generator was dry-run first, then applied from exact main
102
+ `567b55be96e82c5b4662a04657a0e810ac48d6e2` on branch `release/0.33.0` in
103
+ a dgx02 checkout, using frozen root dependencies and pinned Bun 1.4.2. Only the
104
+ existing published v0.32.0 tag was fetched. The separate fixture lock was then
105
+ generated by Bun 1.4.2. Only the planned committed text artifacts returned;
106
+ no dependency tree or other build directory returned.
107
+
108
+ Producer SHA-256:
109
+
110
+ - Bundle: `94532d16e1380743e6a2dd08abe5aeab30d211ad893d56f3ea5d00982dd2234c`.
111
+ - Plugin manifest: `9705bfe5fd9320eefcf8ef1bc6a1bbabdfac85c121a09102ec4e82869904355a`.
112
+ - N-1 lock: `9926687c74cdc12aead17a6ff66cc29e762f4e2dff83bda9cf2309f07769f8c3`.
113
+
114
+ npm confirms 0.32.0 is the latest published 0.32.x patch, with exact agent-mem
115
+ 0.21.0. Its registry integrity matches the fixture lock. Protocol floor 0.25.0
116
+ is unchanged. The new N-1 prose distinguishes old `ahub room status` filtering
117
+ from generic `ahub status --json`, which passes raw daemon fields through.
118
+
119
+ At committed `d1f01f676ce9a940119b050d52467b7d1b5b682c`, dgx02 first passed
120
+ `node scripts/check-docs.mjs --require-fresh --committed`, frozen root and both
121
+ published-fixture installs, then the published protocol/plugin and broker tests:
122
+ 28 pass, 0 fail, 175 assertions across two files in 4.78 seconds. The control/plugin
123
+ legs are bidirectional and retain the existing synthetic native-parent-row
124
+ observation; they are not a real Claude launch or account receipt. The room cases
125
+ load an unchanged published 0.32.0 member against the current broker and current
126
+ links against the published 0.32.0 broker. Their ordinary current-to-old chat,
127
+ legacy presence and ephemeral/liveness observations supplement the unchanged
128
+ v1-codec source comparison; they do not establish live two-machine behavior.
129
+
130
+ The same exact-head run then executed `scripts/check.sh --changed`. Package and
131
+ fixture changes selected the full suite:
132
+
133
+ ```text
134
+ 12073 pass
135
+ 101 skip
136
+ 0 fail
137
+ 312186 expect() calls
138
+ Ran 12174 tests across 938 files. [2048.93s]
139
+ check: no current-invocation agent-hub daemon leaks
140
+ check: OK
141
+ remote_dev: verify dev/agent-hub/.worktrees/release-0.33.0 d1f01f676ce9 exit 0 in 2092s
142
+ ```
143
+
144
+ Typecheck, roles, inventory (3293 entries, 2288 classified, 1005 unchanged baseline
145
+ keys), bundle freshness and package contents passed. Documentation had 0 stale
146
+ documents. Total wall time includes the focused leg and setup above.
147
+
148
+ This following report-only commit records the completed result; it does not
149
+ inherit a new full-suite claim for itself. Final-head documentation/delta checks
150
+ and hosted CI are recorded in the release PR. Exact-head hosted CI remains the
151
+ merge gate, not a claim inherited from this runtime head or a component PR.
152
+
153
+ ## Rework checks
154
+
155
+ After normally integrating main `203d7a6d`, pinned Bun 1.4.2 regenerated the
156
+ 0.33.0 bundle with core 0.22.1 on dgx02. Current bundle SHA-256 is
157
+ `009b624ca203e3c34243b480bf79c5feb9b1e84053709f8523c306bdda0fa620`;
158
+ plugin manifest and N-1 lock hashes remain those above. The fixture still uses
159
+ published 0.32.0/core 0.21.0; protocol floor 0.25.0 is unchanged.
160
+
161
+ At exact committed candidate `ebf139b7288517a34059259676709dbe66558ee5`, dgx02
162
+ passed committed documentation freshness, frozen root/protocol-floor/N-1 installs,
163
+ and the focused published-protocol, broker/member and placement-health files.
164
+ The same run then executed `scripts/check.sh --changed`, which selected the
165
+ full suite with current core 0.22.1 and published N-1 core 0.21.0:
166
+
167
+ ```text
168
+ 12073 pass
169
+ 101 skip
170
+ 0 fail
171
+ 312186 expect() calls
172
+ Ran 12174 tests across 938 files. [2048.37s]
173
+ check: no current-invocation agent-hub daemon leaks
174
+ check: OK
175
+ remote_dev: verify dev/agent-hub/.worktrees/release-0.33.0 ebf139b72885 exit 0 in 2085s
176
+ ```
177
+
178
+ Documentation had 0 stale entries. Typecheck, roles, inventory, bundle freshness
179
+ and package contents passed. This is new coupled evidence, separate from the
180
+ initial candidate and component PRs. The following documentation-only commit
181
+ records these results and clarifies the conditional old-reader sentence and
182
+ table formatting; it does not inherit a new full-suite claim. Final-head
183
+ documentation/delta checks and exact-head hosted CI are recorded in the PR,
184
+ and hosted CI remains the merge gate.
185
+
186
+ ## Shared-home N-1 boundary
187
+
188
+ The current hub pins core 0.22.1; published hub 0.32.0 pins 0.21.0. Core 0.22.x's
189
+ own N-1 statement preserves curated, capture, hook-spool, candidates, work-list
190
+ and setup-receipt formats, `INDEX_VERSION` and the index filename. Shared-v1,
191
+ generation and v1/v2 shard sync are unchanged, and inactive homes behave as before.
192
+ Placement activation and writer renewal are opt-in person commands. If renewal
193
+ history is present, the old 0.21.0 closed journal reader refuses that history
194
+ and placement publication before effects. This is not a promise of compatibility after arbitrary person
195
+ operations. Shared-home coordination remains the person's separate operation
196
+ after release; preparation performs no activation, renewal or floor change.
197
+
198
+ ## Known gaps, not blocking
199
+
200
+ - This preparation makes no installation, running-hub upgrade, native/model call,
201
+ real-account, live TLS/proxy or two-machine acceptance claim. Published-package
202
+ control/plugin and isolated broker/member fixtures are separate evidence.
203
+ - The Claude 2.1.319, Kimi 2.5.1 and Qwen ACP 0.26.8 receipts are model-free.
204
+ Codex 0.167.0's single authorized attempt ended at harness readiness before
205
+ verdict readback: its outcome is unknown, not a proven model failure, no retry
206
+ occurred, and the version stays unverified. Qwen dual-output 0.26.8 is not
207
+ qualified; the verified dual-output version remains 0.26.1.
208
+ - Mixed room upgrades keep plain chat, but a 0.33.0 feature-required send to a
209
+ released member or through a released broker refuses before effects. Upgrade
210
+ broker, members, reconnect. Signed codec observations are compatibility only,
211
+ not privacy, permission, task or native authority.
212
+ - #1204's AC1-AC8 in-process acceptance audit was approved and the issue is closed.
213
+ Receiver dedupe retains its documented 30-day / 10,000-identity ceiling; removed
214
+ operator gap notices do not relax permanent replay floors.
215
+ - Agent-mem is now 0.22.1 via #1243, and #1244 accurately names the available
216
+ person-only activation preview. Default-host active-v3 sync still lacks fresh
217
+ placement-attestation integration (#1173); activation alone does not enable it.
218
+ No home activation, writer renewal or floor mutation occurs here.
219
+ - Other person/account-dependent gates remain in the smoke ledger. This task
220
+ performs no merge, tag, publication or release-consent write. The conductor's
221
+ release merge must preserve these stamps with a merge commit and the default
222
+ subject; the person's tag decision is separate.
@@ -0,0 +1,57 @@
1
+ # Claude Code 2.1.319 headless implementer receipt
2
+
3
+ Date: 2026-11-06. Scope: #888 (claude-implementer row), hub task #750. This repeats the procedures of the [2.1.318 receipt](2026-11-05-claude-implementer-2.1.318.md) on the installed Claude Code 2.1.319, with 2.1.318 run through the same producers as the control: the permission transport (Write, production-name Bash, Bash `updatedInput` rewrite) and the host shell wrapper. Source base: `f7cbefda` (0.32.0). Platform: macOS arm64, host Bun 1.4.3.
4
+
5
+ Result: every case passed on both binaries. `2.1.319` is added to `COMPAT["claude-implementer"].verified`.
6
+
7
+ | Native version | Binary SHA-256 |
8
+ | --- | --- |
9
+ | Claude Code 2.1.318 (control) | `677a2ea7bf576cedd20e191d973914ed8a41796f53a63b1923381ddc4d5b5e7d` |
10
+ | Claude Code 2.1.319 | `1f53587e92dee8e089fa349188a4cda64fa34ace6e7b0ca2ee278ddaa3cc2ebd` |
11
+
12
+ The 2.1.318 hash matches the 2.1.318 receipt, so the control is the binary it certified.
13
+
14
+ ## Upstream changes since 2.1.318
15
+
16
+ None to read: the upstream [CHANGELOG](https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md) had no 2.1.319 entry when this was checked (its newest heading was 2.1.318), and npm `@anthropic-ai/claude-code` latest was still 2.1.318. 2.1.319 reached this machine through the native installer. This receipt therefore rests on observed behavior only, with no changelog reading.
17
+
18
+ ## Runs
19
+
20
+ Each producer ran both binaries sequentially with an isolated HOME and `CLAUDE_CONFIG_DIR`, a fixture MCP server, a deterministic loopback provider and the literal API key `synthetic-probe-not-a-credential`, from a shell with the hub's agent markers (`AGENTHUB_HOME`, `AGENTHUB_PEER_ID`, `CLAUDECODE`, `CLAUDE_CODE_SESSION_ID`) unset. No account, provider request or model inference was involved. Every native child's process group was confirmed empty afterwards, and both binary hashes were the same before and after.
21
+
22
+ ```sh
23
+ python3 docs/verification/claude-permission-transport-native.py OUT/write --claude 2.1.318 --claude 2.1.319
24
+ python3 docs/verification/claude-permission-transport-native.py OUT/bash --tool Bash --server-name agent-hub --permission-tool hub_permission_request --require-tool-use-id --claude ... --claude ...
25
+ python3 docs/verification/claude-permission-transport-native.py OUT/rewrite --tool Bash --rewrite-bash --server-name agent-hub --permission-tool hub_permission_request --require-tool-use-id --claude ... --claude ...
26
+ python3 docs/verification/claude-shell-wrapper-native.py OUT/wrapper --bun ABSOLUTE_BUN --claude ... --claude ...
27
+ ```
28
+
29
+ (binary arguments are the absolute installed paths under `~/.local/share/claude/versions/`; `--bun` was the Homebrew Bun 1.4.3 path resolved with `readlink -f`).
30
+
31
+ | Producer | Cases per binary | 2.1.318 | 2.1.319 |
32
+ | --- | --- | --- | --- |
33
+ | Write transport (allow, deny, missing tool, hook deny/allow, MCP error, disconnect, pending, deadline) | 9 | 9 pass | 9 pass |
34
+ | Bash transport, production server and tool names, `tool_use_id` required | 9 | 9 pass | 9 pass |
35
+ | Bash `updatedInput` command replacement (allow, deny) | 2 | 2 pass | 2 pass |
36
+ | Host shell wrapper (persistent-cwd control, fixed-wrapper rewrite with replay refusal) | 2 | 2 pass | 2 pass |
37
+
38
+ Per-case shapes on 2.1.319 match the control: pending stopped externally at the deadline; wrapper control 3 requests and 2 permission calls, wrapper rewrite 4 requests and 3 permission calls with the effect counter at exactly 1 after replay.
39
+
40
+ The only producer change is the version allow-list in `claude-shell-wrapper-native.py`, which now admits `2.1.319`.
41
+
42
+ | Artifact | SHA-256 |
43
+ | --- | --- |
44
+ | Permission producer (unchanged) | `8f8885f7153b3a236f3b3f8ce49a344b908f2af3b3aba8b064762d82d1ecf12a` |
45
+ | Wrapper producer (this change) | `ce4b9fdd06e393656155a3bd767e899a445abaec4313d832f1a4a519a42c155d` |
46
+ | Wrapper host fixture (unchanged) | `616e6711e392f0eee7e3fa1c7bdc47a537dfa86bcc8ffb30e549ca94e5a71cef` |
47
+ | Fixed CLI wrapper (unchanged) | `8ff56514a6e3f25bce0784775d396df199b58b1b93f55ad0e8747bbc729d2fd8` |
48
+ | Write receipt JSON | `ed55c32bb86de8326251c63250b3bb90138e299558822f57fba19cb97231ddfb` |
49
+ | Bash receipt JSON | `a07501001835a7bcfb90bd4f6f546eb1e358bcad4be79b0e5b7f7d9b7c3d9e2d` |
50
+ | Rewrite receipt JSON | `1e3364f4925e098d34d9b7245a1b93bdd7815cb6d3e23138de2c25c7cede6238` |
51
+ | Wrapper receipt JSON | `f1708b427ae166cfc95e33e6c1c2ffc7d57acfae04cc6e2f394c9249292cab16` |
52
+
53
+ The receipt JSON files stay in the local diagnostic directory; they carry local paths and are not committed.
54
+
55
+ ## Evidence boundaries
56
+
57
+ Unchanged from the earlier receipts: no real provider authentication, model tool selection, person approval interaction, task-session resume or production-daemon task binding is proved, and this is not a runtime receipt gate. With no public changelog for 2.1.319, a behavior change outside these producers' cases would not be seen here. Native version admission and binary fencing remain required. The Monitor tool is still an unrewritten prompt-tool path. Exact-head package gate and CI are recorded on the PR.
@@ -0,0 +1,56 @@
1
+ # Codex 0.167.0 fresh-reviewer isolation receipt
2
+
3
+ Date: 2026-11-06. Platform: macOS arm64, Bun 1.4.3. Scope: issue #888, task 747. This repeats the [0.166.0 model-free production preparation](2026-10-31-codex-0166-reviewer-isolation.md) with 0.166.0 as the control. Source base: `f7cbefda` (0.32.0 on main). No `codex exec`, model request, login, credential copy or live reviewer run was performed. The returned launch was inspected, never started. The person's real HOME, `~/.codex`, the Orca codex account home and the global Codex install were never supplied to a Codex process or modified.
4
+
5
+ Result: all four model-free legs returned the expected outcome. 0.167.0 passed the model-free procedure and joins the verified reviewer set after the separately authorized model-backed run. This receipt does not add it, because `docs/agent-notes/adapters.md` requires a successful model-backed hub tool call before a reviewer version is marked verified (0.166.0 was reverted once for the same reason). That single run (the [2026-11-02 receipt](2026-11-02-codex-0166-reviewer-tool-call.md) is the 0.166.0 precedent) needs the person's separate authorization and was not run. It is unverified for 0.167.0, as is everything a model turn would show (tool selection, verdict delivery, the synthetic marker readback, real account authentication). Until then the person can run `ahub agents trust codex-review 0.167.0`, and every runtime proof still runs.
6
+
7
+ ## Source identity and re-read regions
8
+
9
+ `git ls-remote https://github.com/openai/codex.git` returned, for 0.167.0, annotated tag object `cb41599ccbe371272892f156286a236aa097bada` and peeled commit `086ccc833bc9cf01024ad2dd6af7dbd421b6bf9a`. The same readback returned the 0.166.0 tag object `593389380740f7b4762771573c447ccfdc59742f` and peeled commit `6ff1e1ca3b30fc8b914720681fcf5fe62e95f856`, matching its receipt.
10
+
11
+ Each of the seven files read for 0.166.0 was fetched at both peeled commits and compared by SHA-256 and by diff. Five are byte-identical between the tags: `exec/src/cli.rs`, `config/src/mcp_types.rs`, `core/src/mcp.rs`, `hooks/src/registry.rs` and `sandboxing/src/seatbelt.rs`. Two changed, `core/src/session/mod.rs` and `core-plugins/src/manager.rs`, and were read at their new anchors.
12
+
13
+ - [Exec switches, lines 40-50](https://github.com/openai/codex/blob/086ccc833bc9cf01024ad2dd6af7dbd421b6bf9a/codex-rs/exec/src/cli.rs#L40): identical. `--ephemeral`, `--ignore-user-config` and `--ignore-rules` remain independent global switches, and auth still uses `CODEX_HOME`.
14
+ - [Apps projection, lines 279-285](https://github.com/openai/codex/blob/086ccc833bc9cf01024ad2dd6af7dbd421b6bf9a/codex-rs/core/src/mcp.rs#L279) and [registration, lines 464-485](https://github.com/openai/codex/blob/086ccc833bc9cf01024ad2dd6af7dbd421b6bf9a/codex-rs/core/src/mcp.rs#L464): identical. Disabling MCP servers clears the Apps gate, and implicit Apps registration still needs Apps enabled and a non-isolated session. Configured inventory alone still cannot prove the runtime server absent, so effective feature readback stays required.
15
+ - [MCP schema, lines 243-245](https://github.com/openai/codex/blob/086ccc833bc9cf01024ad2dd6af7dbd421b6bf9a/codex-rs/config/src/mcp_types.rs#L243) and [291-297](https://github.com/openai/codex/blob/086ccc833bc9cf01024ad2dd6af7dbd421b6bf9a/codex-rs/config/src/mcp_types.rs#L291): identical. A disabled server is not initialized; `enabled_tools` restricts, `disabled_tools` filters afterwards.
16
+ - [Registry, lines 179-197](https://github.com/openai/codex/blob/086ccc833bc9cf01024ad2dd6af7dbd421b6bf9a/codex-rs/hooks/src/registry.rs#L179): identical. A non-empty legacy notify argv still becomes an after-agent hook independently of the hooks feature flag.
17
+ - [Session hook configuration, now line 5822](https://github.com/openai/codex/blob/086ccc833bc9cf01024ad2dd6af7dbd421b6bf9a/codex-rs/core/src/session/mod.rs#L5822) (was 5736) and the [session-static comment, now lines 2407-2410](https://github.com/openai/codex/blob/086ccc833bc9cf01024ad2dd6af7dbd421b6bf9a/codex-rs/core/src/session/mod.rs#L2407) (was 2389-2392): `session/mod.rs` changed (5756 to 5842 lines). The diff was read in full for the regions that matter here. `legacy_notify_argv: config.notify.clone()` is unchanged, and the comment still says legacy notify settings remain session-static. The other hunks are an `inject` visibility change, a `PendingApproval` import, a `NetworkApprovalTurn` enum, token-estimate and sampling bookkeeping, queued network approval holding, and an exec policy manager now built `from_snapshot` with its source requirements. None touches notify, hooks, Apps gating or isolated-session metadata. The host therefore still pins `notify=[]` for the metadata proofs and the returned exec argv.
18
+ - [Plugin manager, now lines 836-841](https://github.com/openai/codex/blob/086ccc833bc9cf01024ad2dd6af7dbd421b6bf9a/codex-rs/core-plugins/src/manager.rs#L836) (was 831-834): `manager.rs` changed (3793 to 3800 lines). The plugin-disabled early return of the default load outcome is unchanged. The one hunk, near line 665, clears per-plugin Apps policy before building the plugin load input, which does not change the disabled-plugins path.
19
+ - [Seatbelt glob compiler, lines 624-705](https://github.com/openai/codex/blob/086ccc833bc9cf01024ad2dd6af7dbd421b6bf9a/codex-rs/sandboxing/src/seatbelt.rs#L624): identical, so the anchored read/write denies, static-prefix variants and ancestor unlink denies are the same code.
20
+
21
+ ## Native production preparation
22
+
23
+ A throwaway producer outside the source checkout, in a private scratch directory, invoked the actual `codexReviewerBackend.prepare` from a clean worktree of main plus this change, with the frozen install's exact `@staix/agent-mem@0.21.0`. Each leg used its own fresh root holding project, HOME, CODEX_HOME and TMPDIR. The child ran under `env -i` with only PATH, LANG, HOME, CODEX_HOME, TMPDIR and two fixture markers. Before importing the backend, it rejected any extra variable, a `os.homedir()` that differed from HOME, and any home, CODEX_HOME or temp directory outside the root. The MCP transport was inert `/usr/bin/false` with no control token, and the private paths were `**/*.env`, `.private`, `nested/secret` and `~/private-proof`.
24
+
25
+ Both Codex versions were installed with `npm install --prefix` into separate private prefixes, with scratch HOME and cache and empty user and global npm configs. The command was each prefix's `codex.js` launcher, resolved by production to its native arm64 binary. Temporary roots and canaries were removed after each leg, and the returned exec launch was never executed.
26
+
27
+ | Leg | Outcome | Elapsed |
28
+ | --- | --- | --- |
29
+ | Before compat edit, 0.167.0, empty homes | Refused only at version admission, `causeClass: version`; previous verified set 0.146.0, 0.163.0, 0.164.0, 0.166.0 | 160.67 ms |
30
+ | With 0.167.0 provisionally in the local verified array (a stand-in for the person's machine trust), empty homes | All production preparation legs pass | 261.26 ms |
31
+ | Same provisional entry, synthetic ambient config | All production preparation legs pass | 261.83 ms |
32
+ | Control 0.166.0, empty homes (run before the edit) | All production preparation legs pass | 302.52 ms |
33
+ | Control 0.166.0, synthetic ambient config (run after the edit) | All production preparation legs pass | 252.46 ms |
34
+
35
+ The ambient file enabled Apps, plugins and hooks, set a legacy notify command and declared one stdio and one HTTP MCP server. Metadata preparation disabled the ambient servers, kept only the hub server with exactly `hub_review` and `hub_task_show`, and proved effective Apps, plugins and hooks disablement. Per-tool approval stays configured only for those two hub tools; actual MCP tool execution is outside this receipt.
36
+
37
+ | Version | Native binary SHA-256 | Production binary identity |
38
+ | --- | --- | --- |
39
+ | 0.167.0 | `030316ecfbb41f4e7946e584b0063ef333b7a36cd312ba349f2f6869e39b62cc` | `sha256:213f7a2c8109c5f5158151b829bfc561bc76bbcdcce0b641c1e9a01b8b541e37` |
40
+ | 0.166.0 (control) | `39acf979729dd290f9a24ee38b2914e036c91b65952872e28ae2a6b88a7db7c1` | `sha256:77c2eae1013cec5acaa8a2d980bb760a7ca7657ebb9cb3033550cad787ab2fdd` |
41
+
42
+ The control's native digest and production identity equal the values in the 0.166.0 receipt, so the procedure reproduces. Every successful launch returned `backend: codex`, `readOnly: true`, `strictMcp: true`, `ephemeral: true`, `current(): true`, an exec argv beginning `exec` and an explicit `-c notify=[]`. The evidence list was identical across all four successful launches and equal to the 0.166.0 list: `model-free-mcp-inventory-disabled-ambient`, `hub-tools-exact-allowlist`, `plugins-and-hooks-disabled`, `legacy-notify-disabled`, `apps-disabled-effective-feature-readback`, `web-search-disabled`, `project-untrusted`, `native-public-read-private-deny-write-deny`, `native-glob-and-symlink-private-deny`, `portable-core-name-and-state-deny`, `standard-host-credential-roots-denied`, `binary-config-stable`, `binary-hash-once-metadata-fence`, `session-ephemeral`.
43
+
44
+ Production's own native canaries passed for 0.167.0: public read, denied exact private read, denied nested private glob and symlink alias, denied portable-core `.env` and `.agenthub/state`, denied synthetic gh, kube and docker credential roots and credential alias, and denied creation of a new file with the file remaining absent. Production's metadata commands kept their 2-second command and 12-second overall limits and owned-group cleanup; none failed.
45
+
46
+ ## Compatibility and evidence boundaries
47
+
48
+ The verified reviewer versions stay 0.146.0, 0.163.0, 0.164.0 and 0.166.0. 0.167.0 is not added: the area note requires the model-backed hub tool call first, and a connector review on the first revision of this PR correctly flagged that I had added it. The two passing 0.167.0 legs above ran with 0.167.0 in a local, uncommitted copy of the verified array, which is the same admission outcome the person's `ahub agents trust codex-review 0.167.0` produces, since trust lifts only the version pin and every proof still runs. The committed tree refuses 0.167.0 at version admission, as the first leg showed. 0.165.0 stays unverified. The attached Codex adapter's capability pins (`NATIVE_PINS.codex`, still 0.166.0) are a separate contract and unchanged. No isolation implementation, sandbox ceiling or trust bypass changes. The compat receipt pointer names this receipt. `docs/verified.json` is not restamped.
49
+
50
+ Unverified for 0.167.0: the single model-backed tool-call run (marker, head, verdict and cleanup readback), which needs the person's separate authorization; exec selecting the named default profile; model tool selection; real account authentication; and effective web-search mode. The network setting is configured disabled without a separate probe. No native Linux result is claimed. Same-user mutation after the final metadata check is outside atomic snapshot guarantees, and the bounded credential-root list is not a classifier for every private host file.
51
+
52
+ Source claims apply to the two peeled commits only. Each upgrade repeats the procedure; the throwaway producer is not a supported command and its raw records carry temporary paths, so they stay outside git. The changed-source gate on dgx02 and exact-head hosted CI are separate evidence recorded on the PR.
53
+
54
+ ## Separately authorized model-backed attempt
55
+
56
+ The [2026-11-06 single tool-call attempt](2026-11-06-codex-0167-reviewer-tool-call.md) passed native startup isolation and the rendered accepted-plan marker precondition, then failed the harness readiness/readback leg before a complete persisted verdict/head/marker result was recorded. Its one-attempt fence was consumed once; no retry was made. The model/tool outcome remains unknown, not a proven missing verdict. This does not qualify 0.167.0, and the verified set remains unchanged.
@@ -0,0 +1,66 @@
1
+ # Codex 0.167.0 single reviewer tool-call attempt, not qualified
2
+
3
+ Date: 2026-11-06. Scope: issue #888, task #751. This records exactly one newly authorized native reviewer attempt after the [0.167.0 model-free receipt](2026-11-06-codex-0167-reviewer-isolation.md), following the corrected [0.166.0 procedure](2026-11-02-codex-0166-reviewer-tool-call.md).
4
+
5
+ **Result: qualification failed at the harness readiness/readback leg.** Native startup isolation and the accepted-plan marker precondition passed. The one-attempt fence was consumed once. The harness then reported `fixture readiness deadline` before it emitted `verdict-readback`. No complete persisted verdict/head/marker result was recorded, so the model/tool outcome remains unknown. This is not proof that the model failed to call a tool or that no verdict existed. No retry was made, and 0.167.0 stays outside `COMPAT["codex-review"].verified`.
6
+
7
+ ## Bound procedure and model-free preflight
8
+
9
+ The source worktree branched from merged PR #1234 at `25878b3e66c80718f8512e0cfe5c05e4772853ec`. The retained task #625 controller and driver were copied only into a new private task directory. Adaptations changed the source path, task labels/environment prefix and exact native version from 0.166.0 to 0.167.0; the original consumed fence was not touched. The new task used its own persistent exclusive `wx` fence.
10
+
11
+ The worktree had its own frozen dependency installation, exact `@staix/agent-mem@0.21.0`, and pinned Bun 1.4.2. The Mac native exception was admitted through `dot admit`, with normal memory, thermal state 0, about 87% CPU idle and no competing local admission owner. The global Bun executable was not changed.
12
+
13
+ `--prepare` bound the installed exact 0.167.0 package and parsed the private driver without reading credential values. The setup-only rehearsal passed with zero native preparations and zero model requests, no auth symlink and no consumed fence. It created production daemon state only in fresh temporary homes, confirmed source/auth metadata stability and removed its temporary state. The current-source dgx02 model-free regression run passed 91 tests, 0 failed, 617 assertions across `review-scope`, `codex-review-isolation` and `compat` at that source head. This includes accepted-plan envelope coverage; it is not a native model result.
14
+
15
+ The controller held the repository lock before creating fresh HOME, CODEX_HOME and TMPDIR. Actual mode created one auth symlink to the configured account, used eighteen bounded original credential roots in private paths and granted version admission only in the temporary hub home. It did not change machine trust or the real configuration. No account path, credential value, private marker value or model prose is included here.
16
+
17
+ ## One attempt and observed boundaries
18
+
19
+ The native fixture uses production `startDaemon`, `ReviewerPrintPeer`, `codexReviewerBackend`, the stdio plugin and `Tasks`. A synthetic builder proposed and accepted an arithmetic task with the marker in one accepted `plan.risks` item. The wrapper verified the actual rendered review envelope contained that marker before opening the one-attempt fence and before calling the original `ReviewerPrintPeer.review`. It neither called `hub_review` on the model's behalf nor substituted a verdict.
20
+
21
+ | Evidence | Observed |
22
+ | --- | --- |
23
+ | Source head | `25878b3e66c80718f8512e0cfe5c05e4772853ec` |
24
+ | Platform / Bun / memory core | macOS arm64 / 1.4.2 / 0.21.0 |
25
+ | Native startup reviewer | actual `ReviewerPrintPeer`, Codex 0.167.0 |
26
+ | Startup binary identity | `sha256:213f7a2c8109c5f5158151b829bfc561bc76bbcdcce0b641c1e9a01b8b541e37` |
27
+ | Startup isolation profile | `sha256:b0a4c1f0de7363e689a41056ec2ce21e5f0cead04399e1f8590c4cc1bc635af1` |
28
+ | Backend source SHA-256 | `8e6ce4e64c6787a81e48a97172d25bbf1876ae5bc24a54934e7a107075a72214` |
29
+ | Stdio plugin SHA-256 | `4c2b052a198b78a2162d410e8908e6501769632fcaa522ed88ee15a3a967dc88` |
30
+ | Startup `readOnly`, `strictMcp`, `ephemeral` | all true |
31
+ | Startup model-free evidence markers | all 14 present |
32
+ | Actual envelope marker / summary withholding | present / review-only summary withheld |
33
+ | Original review entries / fence consumptions | 1 / 1 |
34
+ | Fixture start, UTC | `2026-11-06T09:05:41.828Z` |
35
+ | Original review entered, UTC | `2026-11-06T09:05:42.679Z` |
36
+ | Failed readiness check, UTC | `2026-11-06T09:06:10.455Z` |
37
+ | Recorded cause | harness `fixture readiness deadline` |
38
+ | Persisted state, reviewer and verdict count readback | unknown, no `verdict-readback` event |
39
+ | Verdict head binding and marker match | unknown, not recorded |
40
+ | Actual model tool-call result / turn isolation readback | unknown, not recorded |
41
+
42
+ The failure event retained a stale phase label `reviewer-start`; that label is not used to attribute a native startup failure, because startup had already succeeded and `model-review-requested` was recorded. The private harness has bounded task/delivery readiness and reviewer-idle waits after that request. The preserved generic deadline does not identify a model/tool failure. Its fixed 110-second fixture and 120-second controller limits were not increased.
43
+
44
+ The startup receipt retained the exact two-tool MCP allowlist, Apps/plugins/hooks disablement, legacy notify disablement, public/private/glob/symlink/credential and write-denial canaries, binary/config fences and ephemeral-session evidence. These are startup model-free observations. No post-turn isolation receipt was emitted, and effective model-turn network or web-search behavior is not inferred.
45
+
46
+ ## Cleanup and decision
47
+
48
+ Production daemon stop and owned-group teardown were awaited; the controller confirmed its driver group was gone and released only its inode/owner-bound repository lock. Before cleanup, the synthetic source was unchanged and the original account auth metadata matched. The auth symlink, fake homes, source project, task state and temporary directory were removed. A later bounded argv scan found zero remaining processes naming this fixture root; this is not universal orphan detection. The harness log was empty.
49
+
50
+ Before/after auth metadata SHA-256 was `1987ef4ee1e354dbac5566fde47c85a482d1a3530d3df6fbe93dc8d7fd57a909` in both observations. This fingerprints filesystem metadata without reading credential contents. The consumed task #751 fence remains intact; no additional native model review was launched.
51
+
52
+ The required complete model-backed receipt was not obtained. The verified set remains 0.146.0, 0.163.0, 0.164.0 and 0.166.0. The person-controlled exact-version trust path and every runtime isolation proof remain unchanged. No production adapter, task behavior, test assertion, bundle, global install, account setting or documentation stamp is changed by this failed receipt. Final changed-source and exact-head hosted CI evidence are separate and recorded in the PR.
53
+
54
+ ## Private evidence fingerprints
55
+
56
+ Private producers and safe metadata remain outside git under `scratchpad/temp/ahub-751`. The original account values, marker and model prose are not retained in the repository.
57
+
58
+ | File | SHA-256 |
59
+ | --- | --- |
60
+ | `controller.ts` | `b278dc169bd85e73903158ba35a3a665c08c862d387581e90c8ecbaceecf069a` |
61
+ | `run.ts` | `637d3eac56dd9a5e113e3996d8aabbf2c54b01777664d6e0c81d606e4a5af665` |
62
+ | `setup-events.jsonl` | `e6489b086bea498e62073c98f5c6ff99b75defbef0ca5cc31d0e89bf34a8779a` |
63
+ | `native-events.jsonl` | `89dbf07daff59346e0fa861de49244f62411fc660c532bd32565f4b5db87eea2` |
64
+ | `post-cleanup.json` | `0470f71f36adcb57f1d323a77b798c9e0e0b25cf70e5b93ac0af52a170eaae2e` |
65
+
66
+ The native event stream contains 10 safe metadata events (2703 bytes). This failed attempt does not qualify a version, establish a missing verdict, demonstrate model quality or authorize another run.
@@ -0,0 +1,88 @@
1
+ # Kimi 2.5.1 fresh-reviewer compatibility receipt
2
+
3
+ Date: 2026-11-06. Scope: issue #888, task #748. This repeats the [2.4.1 model-free procedure](2026-10-31-kimi-241-reviewer-compat.md). Both isolated macOS native passes succeeded, including the proposed verified entry without machine trust. Only 2.5.1 qualifies; nearby versions remain unverified. No real account, inference or persisted Tasks verdict is part of the procedure.
4
+
5
+ ## Artifact and installation
6
+
7
+ | Artifact | Binding |
8
+ | --- | --- |
9
+ | Upstream annotated tag | `@moonshot-ai/kimi-code@2.5.1`, tag object `232e42606210d4f1674f104abfa133043408b925` |
10
+ | Peeled source commit | `1b02030d8c2c6b00131b23ebb67a231614877827` |
11
+ | Official macOS arm64 archive | `kimi-code-darwin-arm64.tar.gz`, 54,789,239 bytes |
12
+ | Archive SHA-256 | `fb0dc25033f2545c5cf820d01898fdc6e2a13a5d83529091fedee1dfef078632` |
13
+ | Standalone executable SHA-256 | `d71bd6fed919cdcb12623fa1a096b9adc4f51ac26f55b5801bbe1aee5809e714` |
14
+ | Standalone executable size | 182,590,912 bytes |
15
+ | Source hub checkpoint | `f7cbefdaa924ee506117a994e2d14f1f92aeae55`, exact `@staix/agent-mem@0.21.0` |
16
+
17
+ The archive came from the [official tagged release](https://github.com/MoonshotAI/kimi-code/releases/tag/%40moonshot-ai/kimi-code%402.5.1). Its SHA-256 matched both the GitHub asset digest and sibling checksum before bounded extraction in a dgx02 container. Extraction refused absolute paths, parent traversal, links, nonregular files and oversized expanded contents. Only the verified official standalone artifact was transferred to the isolated Mac prefix; no upstream source or node_modules tree is copied to the Mac. No global installer is used.
18
+
19
+ ## Isolated production and native controls
20
+
21
+ The retained 2.4.1 producer is adapted only for the private executable/source paths, exact 2.5.1 version, source commit and evidence destination. It requires the current exact memory-core dependency, creates its own HOME, KIMI_CODE_HOME, temporary cwd, empty skills and synthetic managed-provider OAuth slot, and drives the production reviewer preparation and task-bound two-tool MCP broker.
22
+
23
+ The source worktree used its own frozen install under a fake installation HOME,
24
+ with pinned Bun 1.4.2 and exact memory core 0.21.0. No node_modules tree was copied.
25
+ Before the isolated native work, the Mac showed 82.8% CPU idle, normal memory
26
+ pressure (1), 0.56 MB swap used, and no local agent-hub heavy job; candidate gate
27
+ processes were confirmed as SSH clients for remote jobs. The host has 18 logical
28
+ CPUs. No thermal/performance warning was recorded, which is not a positive
29
+ thermal measurement. No local check.sh, build or full test gate was run.
30
+
31
+ | Leg | Fixture-trust run | Verified run, no trust |
32
+ | --- | --- | --- |
33
+ | Production preparation, exact version/current/config, replace environment | pass | pass, `fixtureTrustOnly: false` |
34
+ | Exactly two MCP tools, empty subagents and skills, config mode 0600 | pass | pass |
35
+ | Wrong task, third tool, missing authorization and revoked broker refusals | pass | pass |
36
+ | Actual native two-tool loop, fixed loopback responses | pass, four requests | pass, four requests |
37
+ | Injected Write absent from inventory and native tool-not-found result | pass, marker unchanged | pass, marker unchanged |
38
+ | Explicit Write positive control | pass, two requests, marker written | pass, two requests, marker written |
39
+ | Trust-workspace environment decoy removed from launch environment | pass | pass |
40
+ | Original synthetic config/credential bytes, owned-group and temporary cleanup | pass | pass |
41
+
42
+ Every restricted native request advertised exactly
43
+ `mcp__agent-hub__hub_review` and `mcp__agent-hub__hub_task_show`. Both calls reached
44
+ the production task-bound broker's synthetic callback; no real task board or
45
+ persisted verdict was invoked. The positive control explicitly added Write to
46
+ the private agent, establishing that its absence in the restricted run was an
47
+ execution-time allowlist result. A separate preload positive control blocked a
48
+ non-loopback HTTPS attempt before connection. The native fixture redirected
49
+ only its copied provider/OAuth endpoint and synthetic credential slot to the
50
+ owned loopback server. These application-level guards do not establish kernel
51
+ network isolation.
52
+
53
+ The initial run used an invented trust record only in its temporary hub home
54
+ while 2.5.1 was absent from COMPAT. The second asserted a verified assessment for
55
+ the proposed exact entry with an empty trust list and no trust record. Both
56
+ prepared launches remained current after the native controls. Real account,
57
+ login/provider readiness, real OAuth refresh, attached-TUI coexistence, model
58
+ behavior/quality and quota remain unverified.
59
+
60
+ ## Source review
61
+
62
+ A scoped review compared 2.4.1 source `2c73f3f50af4fa7f2540ca0d2e33b07a1408e3a7` with 2.5.1 source `1b02030d8c2c6b00131b23ebb67a231614877827`. The complete diff has 1,471 changed files; this receipt does not claim to review the full release.
63
+
64
+ - `workspaceTrust/trustEnv.ts`, agent-file parsing, builtin tool assembly, tool registry and registry service, and `packages/oauth/src/oauth-manager.ts` are byte-identical at the two source commits.
65
+ - [Workspace MCP configuration](https://github.com/MoonshotAI/kimi-code/blob/1b02030d8c2c6b00131b23ebb67a231614877827/packages/agent-core-v2/src/workspace/workspaceMcpConfig/workspaceMcpConfigService.ts) adds configuration-bound MCP OAuth cancellation/invalidation and retains credentials during trust changes. These paths concern the fixture's loopback task-bound HTTP MCP identity; no real OAuth exchange is in scope.
66
+ - [Workspace trust service](https://github.com/MoonshotAI/kimi-code/blob/1b02030d8c2c6b00131b23ebb67a231614877827/packages/agent-core-v2/src/workspace/workspaceTrust/workspaceTrustService.ts) now waits for config and recognizes the explicit `workspace.require_trust` option. The new option defaults to requiring trust. The producer never supplies that opt-out and keeps its trust-environment decoy assertion.
67
+ - `toolContribution.ts` renames the environment-capability type/property, and the managed Kimi credential adapter changes an import path. The agent-file tool allowlist and native registry assembly inspected above are unchanged.
68
+ - The 2.5.0 and 2.5.1 changelog entries were read for isolation impact: remote execution environments, dynamic tool refresh after MCP changes, MCP OAuth cleanup and the workspace-trust opt-out are in the relevant scope. Model-free native exact-two-tool inventories across all fixed-response requests are still required; source inspection alone does not qualify the version.
69
+
70
+ ## Evidence and decision
71
+
72
+ Evidence producers and raw result files are outside git under `scratchpad/temp/agent-hub-748`. The real Kimi install, account state and native home are not inputs to the isolated controls. No machine trust is changed. All required model-free legs passed, so exactly 2.5.1 is added to `COMPAT["kimi-review"].verified`; the receipt pointer and Kimi-only operations list advance to this procedure. No reviewer is enabled or launched on the real hub.
73
+
74
+ | Evidence file | SHA-256 |
75
+ | --- | --- |
76
+ | `kimi-probe.ts` | `2ff8e2841f2cbd58d07add57e5deb9041ee33a692489083a176e6b5d5f406edf` |
77
+ | `kimi-native-result.json` | `082720d3c4d47409a122b3ce8031d0c7b520ab04e07011cb541ef7b855faa188` |
78
+ | `kimi-verified-result.json` | `fb1631f4ef47b565bf97bec267aa31ddbea25cfe2a6492eacdd7b144a545e6c0` |
79
+ | `run-kimi.py` | `1822f6d597d4b4cd7128d451addf81cb7bcd67492f339ea363ba99b288f80f5e` |
80
+ | `loopback-only.cjs` | `f4e4714ac846c9e1861306f19c1c656350d1d4180818bd834aa34d1ae0ced8df` |
81
+ | `source-review.log` | `671748eaa956f97351763e70ae2e0d5b3873d2ad6349b352cc676f43e15eb56d` |
82
+ | `source-trust-assembly.log` | `66346c8f19ad72b86bf44026d46bd2373af805136af434e5a9ec8faffd9f7282` |
83
+
84
+ The source comparison and native controls qualify the observed standalone
85
+ macOS arm64 artifact only. Other platforms, future versions and model-backed
86
+ behavior are not inferred. Committed-head dgx02 `scripts/check.sh --changed`,
87
+ bundle freshness and hosted exact-head CI are separate evidence; their final
88
+ states are recorded in the PR.
@@ -0,0 +1,50 @@
1
+ # Orca CLI contract recheck on 1.4.250
2
+
3
+ - Issue: #1233; hub task #746.
4
+ - Date: 2026-11-06, Asia/Seoul.
5
+ - Orca: `orca --version` printed `1.4.250`. The previous receipt is [1.4.245](2026-11-02-orca-1.4.245-cli-contract.md).
6
+ - Result: the commands agent-hub reads behave as on 1.4.245, with two additions the code did not handle. A `terminal wait` on a pane whose process ended fails with `terminal_exited`, and a wait held by a prompt answers `satisfied: false` with a `blockedReason`. Both are handled by #1233. Commands that create, close or switch a pane stay **unverified**, as before.
7
+
8
+ ## Why this recheck
9
+
10
+ The 0.30.0 to 0.32.0 upgrade of this project (operation `3e1bea10`, 2026-11-06 07:16Z) stopped while restoring the codex terminal with `Orca terminal wait failed: exit status 1`. `run()` mapped only `terminal_handle_stale`; any other Orca error became a command error showing only the exit status, and the restoration loop stopped before its launcher check. Orca prints the error code on stdout with an empty stderr, so the code was lost.
11
+
12
+ ## How this was checked
13
+
14
+ Read-only commands against the person's running Orca, from a script that printed field names, types, counts and error codes, never a value: `orca --version`, `terminal list --json`, `terminal show --terminal <handle> --json`, `terminal wait --terminal <handle> --for tui-idle --timeout-ms 1 --json` on every listed terminal, the same wait and `show` with a made-up handle, and `worktree current --json` in a temporary directory Orca does not manage. A 1 ms wait changes no pane. No handle, tab id, worktree id, host name or path is recorded here.
15
+
16
+ For the codes a wait can raise, the bundled main process (`Orca.app/Contents/Resources/app.asar`) was read for the throw sites, without running or modifying it.
17
+
18
+ ## Observed on 1.4.250
19
+
20
+ | Command | Observed | Code impact |
21
+ | --- | --- | --- |
22
+ | `terminal list --json` | exit 0, `ok: true`; `result` keys `hostScope`, `terminals`, `topologyRevisions`, `totalCount`, `truncated`. 31 rows, `truncated: false`, `totalCount` equal to the row count, handles and incarnations unique. 16 rows carried `agentIdentity` as a string; on the other 15 the key is absent (1.4.245 printed `null`). 8 rows read `orphaned: true, connected: true`. | None. `identityFrom` reads a missing key and `null` alike; the orphaned-and-connected pair is the existing `terminal-orphaned` blocker. |
23
+ | `terminal show --terminal <handle> --json` | exit 0, `ok: true`; `result.terminal` holds the list fields plus `agentWait`, `paneRuntimeId` and `rendererGraphEpoch`. | None. |
24
+ | `terminal wait ... --for tui-idle --timeout-ms 1 --json` | Of 31 terminals: 14 answered `satisfied: true`; 16 exit 1 with code `timeout`; 1 answered exit 0, `ok: true`, `satisfied: false` with `blockedReason: "agent-update-prompt"`. | New: the blocked answer was reported only as "did not become idle". The `terminal-unready` blocker now names Orca's reason. |
25
+ | wait or `show` with a made-up handle | exit 1, `ok: false`, `error` keys `code`, `data`, `message`, code `terminal_handle_stale`, on stdout with nothing on stderr. | Unchanged. |
26
+ | `worktree current --json` outside Orca | exit 1, `ok: false`, code `selector_not_found`. | Unchanged. |
27
+
28
+ ## Codes a wait can raise (source read)
29
+
30
+ | Code | When the main process raises it | Before #1233 | After #1233 |
31
+ | --- | --- | --- | --- |
32
+ | `timeout` | the condition was not met within `--timeout-ms` | not satisfied | not satisfied |
33
+ | `terminal_handle_stale` | the handle names no live pane | `terminal-gone` | `terminal-gone` |
34
+ | `terminal_exited` | a `tui-idle` wait on a pane whose process ended | command error, "exit status 1" | `terminal-gone`, "exited (terminal_exited)" |
35
+ | `terminal_gone` | the pane has no connected PTY | command error | `terminal-gone`, naming the code |
36
+ | `no_connected_pty` | same family as `terminal_gone` | command error | `terminal-gone`, naming the code |
37
+ | `request_aborted` | the wait was aborted | command error | command error, naming the code |
38
+
39
+ Orca's own CLI groups `terminal_handle_stale`, `terminal_exited`, `terminal_gone` and `no_connected_pty` as one "terminal is gone" condition, which #1233 follows. During a restoration, a `terminal-gone` answer sends the loop to the launcher check: a launcher that recorded itself and is gone is `launcher-exited`; with no record, the terminal's listing decides, as for a stale handle. Any other Orca failure now shows `code: message` before falling back to the exit status.
40
+
41
+ `terminal_exited` was not produced live: it needs a pane whose process ended. It is covered by the source read and by fixture tests in `test/terminal-recovery.test.ts`. Whether the upgrade's codex wait raised exactly this code cannot be shown after the fact, because the code was not recorded; the next failure will name it.
42
+
43
+ ## Unverified, with the reason
44
+
45
+ | Command or behaviour | Why |
46
+ | --- | --- |
47
+ | `terminal create`, `terminal close`, `terminal switch` | They create, close or switch a live pane. |
48
+ | `terminal_exited`, `terminal_gone`, `no_connected_pty` and `request_aborted` produced live | They need a pane whose process ended, a lost PTY or an aborted request. |
49
+ | Other `blockedReason` values | Only `agent-update-prompt` was seen. |
50
+ | A `truncated: true` inventory, remote servers, the Linux binary | As in the 1.4.245 receipt. |