@staix/agent-hub 0.12.44 → 0.13.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 (197) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +83 -116
  3. package/THIRD_PARTY_NOTICES.md +29 -0
  4. package/docs/adding-an-ai-tool.md +102 -14
  5. package/docs/agent-notes/README.md +15 -0
  6. package/docs/agent-notes/adapters.md +63 -46
  7. package/docs/agent-notes/budget.md +7 -2
  8. package/docs/agent-notes/bus.md +6 -4
  9. package/docs/agent-notes/daemon.md +15 -8
  10. package/docs/agent-notes/local-worker.md +6 -4
  11. package/docs/agent-notes/tasks.md +18 -5
  12. package/docs/agent-notes/tests.md +11 -9
  13. package/docs/dogfood.md +92 -0
  14. package/docs/events.md +14 -1
  15. package/docs/operations.md +349 -26
  16. package/docs/profiles.md +2 -2
  17. package/docs/quickstart.md +12 -2
  18. package/docs/sdlc.md +61 -13
  19. package/docs/security.md +24 -12
  20. package/docs/smoke.md +9 -4
  21. package/docs/specs/2026-09-19-agent-hub-design.md +873 -13
  22. package/docs/verification/2026-10-19-reviewer-isolation.md +2 -0
  23. package/docs/verification/2026-10-21-469-r1-dashboard-tokens.md +43 -0
  24. package/docs/verification/2026-10-21-469-r2-dashboard-shell.md +54 -0
  25. package/docs/verification/2026-10-21-469-r3-dashboard-board.md +51 -0
  26. package/docs/verification/2026-10-21-469-r4-dashboard-views.md +77 -0
  27. package/docs/verification/2026-10-21-469-r6-dashboard-motion-states.md +82 -0
  28. package/docs/verification/2026-10-22-0.12.45.md +60 -0
  29. package/docs/verification/2026-10-22-code-facts.md +78 -0
  30. package/docs/verification/2026-10-22-codex-reviewer-isolation.md +47 -0
  31. package/docs/verification/2026-10-22-kimi-qwen-compat.md +79 -0
  32. package/docs/verification/2026-10-23-0.13.0.md +89 -0
  33. package/docs/verification/assets/469-r1-board-1440-dark.png +0 -0
  34. package/docs/verification/assets/469-r1-board-1440-light.png +0 -0
  35. package/docs/verification/assets/469-r1-board-390-dark.png +0 -0
  36. package/docs/verification/assets/469-r1-board-390-light.png +0 -0
  37. package/docs/verification/assets/469-r2-agents-1440-dark.png +0 -0
  38. package/docs/verification/assets/469-r2-agents-768-dark.png +0 -0
  39. package/docs/verification/assets/469-r2-board-1024-light.png +0 -0
  40. package/docs/verification/assets/469-r2-board-1440-dark.png +0 -0
  41. package/docs/verification/assets/469-r2-board-1440-light.png +0 -0
  42. package/docs/verification/assets/469-r2-board-390-dark.png +0 -0
  43. package/docs/verification/assets/469-r2-board-390-light.png +0 -0
  44. package/docs/verification/assets/469-r2-board-768-light.png +0 -0
  45. package/docs/verification/assets/469-r3-board-1440-dark.png +0 -0
  46. package/docs/verification/assets/469-r3-board-1440-light.png +0 -0
  47. package/docs/verification/assets/469-r3-board-390-light.png +0 -0
  48. package/docs/verification/assets/469-r3-detail-1440-dark.png +0 -0
  49. package/docs/verification/assets/469-r3-detail-1440-light.png +0 -0
  50. package/docs/verification/assets/469-r3-detail-390-dark.png +0 -0
  51. package/docs/verification/assets/469-r3-plan-1440-light.png +0 -0
  52. package/docs/verification/assets/469-r3-plan-390-light.png +0 -0
  53. package/docs/verification/assets/469-r4-agents-1440-dark.png +0 -0
  54. package/docs/verification/assets/469-r4-agents-1440-light.png +0 -0
  55. package/docs/verification/assets/469-r4-agents-390-dark.png +0 -0
  56. package/docs/verification/assets/469-r4-memory-1440-dark.png +0 -0
  57. package/docs/verification/assets/469-r4-memory-1440-light.png +0 -0
  58. package/docs/verification/assets/469-r4-memory-390-dark.png +0 -0
  59. package/docs/verification/assets/469-r4-message-1440-light.png +0 -0
  60. package/docs/verification/assets/469-r4-office-1440-dark.png +0 -0
  61. package/docs/verification/assets/469-r4-office-1440-light.png +0 -0
  62. package/docs/verification/assets/469-r4-settings-1440-dark.png +0 -0
  63. package/docs/verification/assets/469-r4-settings-1440-light.png +0 -0
  64. package/docs/verification/assets/469-r4-stream-1440-light.png +0 -0
  65. package/docs/verification/assets/469-r4-stream-390-light.png +0 -0
  66. package/docs/verification/assets/469-r6-agents-empty-390-dark.png +0 -0
  67. package/docs/verification/assets/469-r6-agents-empty-390-light.png +0 -0
  68. package/docs/verification/assets/469-r6-board-1440-light.png +0 -0
  69. package/docs/verification/assets/469-r6-board-390-dark.png +0 -0
  70. package/docs/verification/assets/469-r6-board-empty-1440-dark.png +0 -0
  71. package/docs/verification/assets/469-r6-board-empty-1440-light.png +0 -0
  72. package/docs/verification/assets/469-r6-disconnected-1440-dark.png +0 -0
  73. package/docs/verification/assets/469-r6-disconnected-1440-light.png +0 -0
  74. package/docs/verification/assets/469-r6-disconnected-390-dark.png +0 -0
  75. package/docs/verification/assets/469-r6-skeleton-1440-light.png +0 -0
  76. package/docs/verification/assets/469-r6-skeleton-390-dark.png +0 -0
  77. package/docs/verification/assets/469-r6-toasts-1440-dark.png +0 -0
  78. package/docs/verification/assets/469-r6-toasts-1440-light.png +0 -0
  79. package/docs/verification/assets/469-r6-toasts-390-light.png +0 -0
  80. package/docs/verification/dogfood/2026-10-22.md +3109 -0
  81. package/docs/verified.json +19 -16
  82. package/package.json +5 -1
  83. package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
  84. package/plugins/agent-hub/server.js +10120 -9623
  85. package/src/adapters/adapter-api.ts +2 -0
  86. package/src/adapters/agy/definition.ts +3 -1
  87. package/src/adapters/agy/entry.ts +5 -4
  88. package/src/adapters/claude-channel.ts +32 -12
  89. package/src/adapters/codex-appserver.ts +19 -2
  90. package/src/adapters/codex-review-isolation.ts +12 -5
  91. package/src/adapters/compat.ts +140 -0
  92. package/src/adapters/conformance/acp.ts +114 -0
  93. package/src/adapters/conformance/codex.ts +191 -0
  94. package/src/adapters/conformance/enrollment.ts +43 -0
  95. package/src/adapters/conformance/factories.ts +17 -0
  96. package/src/adapters/conformance/fake-paths.ts +12 -0
  97. package/src/adapters/conformance/fakes/acp-server.ts +267 -0
  98. package/src/adapters/conformance/fakes/acp-watchdog-agent.ts +10 -0
  99. package/src/adapters/conformance/fakes/app-server.ts +119 -0
  100. package/src/adapters/conformance/fakes/codex-bin.ts +15 -0
  101. package/src/adapters/conformance/fakes/jcode-agent.ts +91 -0
  102. package/src/adapters/conformance/fakes/model-server.ts +39 -0
  103. package/src/adapters/conformance/fakes/pi-rpc.ts +32 -0
  104. package/src/adapters/conformance/index.ts +11 -0
  105. package/src/adapters/conformance/kit.ts +50 -0
  106. package/src/adapters/conformance/local-pi.ts +100 -0
  107. package/src/adapters/conformance/owned-acp.ts +44 -0
  108. package/src/adapters/definitions/builtin-metadata.ts +25 -7
  109. package/src/adapters/definitions/native-cli-doctor.ts +12 -5
  110. package/src/adapters/definitions/native-cli-entry-jcode.ts +9 -6
  111. package/src/adapters/definitions/native-cli-entry-kimi.ts +7 -1
  112. package/src/adapters/definitions/native-cli-entry.ts +7 -19
  113. package/src/adapters/definitions/native-cli-jcode-mcp.ts +9 -2
  114. package/src/adapters/definitions/native-cli-preview-common.ts +2 -0
  115. package/src/adapters/definitions/native-cli-preview-jcode.ts +8 -2
  116. package/src/adapters/definitions/native-cli-preview-qwen.ts +2 -1
  117. package/src/adapters/definitions/native-cli-preview.ts +2 -11
  118. package/src/adapters/definitions/qwen-native.ts +7 -3
  119. package/src/adapters/definitions/qwen.ts +5 -1
  120. package/src/adapters/external-metadata.ts +48 -0
  121. package/src/adapters/external-module-scan.ts +126 -0
  122. package/src/adapters/external-modules.ts +240 -0
  123. package/src/adapters/jcode.ts +72 -31
  124. package/src/adapters/kimi-review.ts +6 -3
  125. package/src/adapters/pi.ts +2 -0
  126. package/src/adapters/public.ts +7 -0
  127. package/src/adapters/registry-types.ts +13 -1
  128. package/src/adapters/registry.ts +52 -15
  129. package/src/cli/agents.ts +40 -0
  130. package/src/cli/console-review.ts +54 -0
  131. package/src/cli/console-state.ts +124 -29
  132. package/src/cli/console-symbols.ts +74 -0
  133. package/src/cli/console-usage.ts +89 -0
  134. package/src/cli/console.ts +26 -1
  135. package/src/cli/help.ts +36 -21
  136. package/src/cli/identity.ts +30 -7
  137. package/src/cli/init.ts +109 -11
  138. package/src/cli/main.ts +145 -16
  139. package/src/cli/output.ts +44 -1
  140. package/src/cli/preview.ts +1 -1
  141. package/src/cli/sdlc-release-guard.ts +82 -0
  142. package/src/cli/upgrade-labels.ts +1 -1
  143. package/src/cli/upgrade-presentation.ts +1 -1
  144. package/src/cli/upgrade-restore-state.ts +3 -2
  145. package/src/cli/upgrade-runtime.ts +4 -1
  146. package/src/hub/action-class.ts +362 -0
  147. package/src/hub/action-policy.ts +106 -0
  148. package/src/hub/board.ts +72 -11
  149. package/src/hub/budget.ts +71 -2
  150. package/src/hub/bus.ts +43 -3
  151. package/src/hub/checks.ts +80 -31
  152. package/src/hub/code-facts.ts +223 -0
  153. package/src/hub/config-apply.ts +28 -11
  154. package/src/hub/config-reload.ts +8 -5
  155. package/src/hub/config-trust.ts +7 -4
  156. package/src/hub/control-client.ts +4 -1
  157. package/src/hub/daemon.ts +332 -61
  158. package/src/hub/dogfood-read.ts +199 -0
  159. package/src/hub/dogfood.ts +163 -0
  160. package/src/hub/envelope.ts +1 -1
  161. package/src/hub/events.ts +11 -2
  162. package/src/hub/facts.ts +76 -13
  163. package/src/hub/hub-tools.ts +45 -7
  164. package/src/hub/inbox-polling.ts +25 -0
  165. package/src/hub/instance-config.ts +17 -5
  166. package/src/hub/instance-execution.ts +20 -8
  167. package/src/hub/instances.ts +75 -2
  168. package/src/hub/peers.ts +9 -0
  169. package/src/hub/plan-conformance.ts +83 -0
  170. package/src/hub/profiles.ts +7 -2
  171. package/src/hub/release-worktree.ts +56 -0
  172. package/src/hub/review-brief.ts +36 -0
  173. package/src/hub/review-findings.ts +104 -0
  174. package/src/hub/roster.ts +31 -5
  175. package/src/hub/sdlc-queue.ts +48 -11
  176. package/src/hub/sdlc-release-authorization.ts +173 -0
  177. package/src/hub/sdlc-release.ts +16 -1
  178. package/src/hub/sdlc.ts +71 -18
  179. package/src/hub/settings.ts +10 -3
  180. package/src/hub/snapshots.ts +101 -14
  181. package/src/hub/symbol-normalizer.ts +26 -0
  182. package/src/hub/task-code-symbols.ts +90 -0
  183. package/src/hub/task-sweep.ts +3 -2
  184. package/src/hub/tasks.ts +556 -88
  185. package/src/hub/test-integrity.ts +162 -0
  186. package/src/hub/ui.ts +2 -2
  187. package/src/hub/usage-rollup.ts +361 -0
  188. package/src/local/sandbox.ts +5 -3
  189. package/src/ui/index.html +560 -78
  190. package/src/ui/office-model.ts +3 -1
  191. package/src/ui/peer-palette.ts +44 -0
  192. package/templates/AGENTS.block.md +1 -1
  193. package/templates/profiles/dev.json +6 -1
  194. package/templates/profiles/general.json +6 -1
  195. package/templates/profiles/research.json +6 -1
  196. package/templates/profiles/writing.json +6 -1
  197. package/templates/release-guard.block.md +6 -0
@@ -9,6 +9,8 @@ Status: source integration and model-free production-backend admission are verif
9
9
  - Existing #223 Claude behavior is retained. This work adds no new live Claude acceptance proof.
10
10
  - Codex/Kimi fresh reviewer declarations require `review_mode: "fresh"`. Existing headless instances with roles `["reviewer"]` but no opt-in retain native transport/worktree/permission behavior and stay outside the fresh pool. Claude keeps #223 automatic selection; agy remains metadata-only unavailable. A failed fresh start never downgrades to a continuing native session.
11
11
 
12
+ Current-version update: the [2026-10-22 receipt](2026-10-22-codex-reviewer-isolation.md) additionally verifies 0.163.0 and retains 0.146.0. The 0.163.0 unavailability statements below describe this historical slice.
13
+
12
14
  ## Codex native evidence
13
15
 
14
16
  - Exact executable used for offline probes: `/opt/homebrew/bin/codex`, reporting `codex-cli 0.146.0`. Its npm package resolves to a native binary. A separate fnm executable on PATH reports 0.163.0; that version has no receipt in this slice and must be unavailable.
@@ -0,0 +1,43 @@
1
+ # #469 R1: dashboard design tokens, screenshots and layout check
2
+
3
+ Task #170, branch `feat/469-r1-tokens`. R1 changes the style block, the peer palette variants and the contrast test. It changes no
4
+ layout, view, key or behaviour.
5
+
6
+ ## Source of the screenshots
7
+
8
+ A scratch hub created under a `mktemp`-style directory outside any git repository (its own `AGENTHUB_HOME`, never the person's
9
+ `~/.agenthub` or live hub), with five fake pull-only peers (claude, codex, kimi, pi, local), eight sample tasks (one in progress,
10
+ one backlog) and one console message. Rendered by a headless Chromium (Chrome for Testing 156) over the DevTools protocol with
11
+ `prefers-color-scheme` emulated, at 1440x1000 and 390x900. The Board view is shown: it is the default view, and the one R1's rules
12
+ touch most. The other views use the same tokens.
13
+
14
+ | | light | dark |
15
+ | --- | --- | --- |
16
+ | 1440 px | `assets/469-r1-board-1440-light.png` | `assets/469-r1-board-1440-dark.png` |
17
+ | 390 px | `assets/469-r1-board-390-light.png` | `assets/469-r1-board-390-dark.png` |
18
+
19
+ Computed `body` background in the run: light `rgb(238, 238, 241)`, dark `rgb(18, 19, 22)`; `scrollWidth` equals the viewport width at
20
+ both sizes in both themes (no sideways scroll).
21
+
22
+ ## "No layout change", measured
23
+
24
+ The same sample hub was rendered from `origin/main` (c4b1c998) and from this branch, and the rectangles of the header, the nav, its
25
+ buttons, the board section, the progress strip, the agent slots, the columns and the cards were compared (148 rectangles over the
26
+ four size and theme combinations).
27
+
28
+ - Exact pixel equality does not hold, and is not claimed. R1 snaps spacing to the 4px scale, so three paddings grew from 10px to
29
+ 12px: the board column (`.board-column`, 10px to 12px: columns 600 px to 635 px tall at 1440), the agent slot
30
+ (`.agent-slot`, 10px to 12px: 166 px to 178 px) and the 14px/18px section and row paddings moved to 12px/16px (`.section-head` 14px 18px to 12px 16px). Cards keep their height
31
+ except one empty-state card (47 px to 68 px) and are 3 px narrower at 1440 because their column is 4 px narrower inside. Nav
32
+ buttons are up to 4 px wider (control padding 6px/10px to 8px/12px; their 44 px minimum height hides the vertical change). The whole 390 px page is 78 px taller (2905 to
33
+ 2983) and the 1440 px page 16 px taller (1595 to 1611).
34
+ - Structure is identical in all 16 checks (4 selectors x 4 combinations): the same number of columns and rows, the same reading
35
+ order, 5 board columns at 1440 and 1 at 390, 8 nav buttons in 1 row at 1440 and in 2 rows at 390, the same 3 card columns.
36
+ - Nothing scrolls sideways at 390 or 1440 px after the change.
37
+
38
+ ## Not covered
39
+
40
+ - Only the Board view was photographed. Office, Stream, Agents, Message, Memory and Settings were not, so their light and dark
41
+ rendering is covered by the token and contrast tests and by reading the CSS, not by a picture.
42
+ - 768 and 1024 px were not photographed (they belong to R2's AC3).
43
+ - Chrome only; no Firefox or Safari rendering was run.
@@ -0,0 +1,54 @@
1
+ # #469 R2: dashboard app shell, screenshots and width check
2
+
3
+ Task #171, branch `feat/469-r2-shell` (on top of `feat/469-r1-tokens`). R2 adds the shell (top bar, sidebar or tabs), the icon sprite
4
+ and the view keys. It keeps the view names, their order, the `agent-hub-view` cookie, the pinned ids and every action.
5
+
6
+ ## Source
7
+
8
+ A scratch hub outside any git repository, with its own `HOME` and `AGENTHUB_HOME` (never the person's home or live hub): five fake
9
+ pull-only peers, sixteen to twenty-four sample tasks, one console message. Headless Chromium (Chrome for Testing 156) over the
10
+ DevTools protocol with `prefers-color-scheme` emulated. Every one of the seven views was visited at 1440, 1024, 768 and 390 px in
11
+ light and dark (56 combinations), and one representative set is kept here.
12
+
13
+ | View and size | image |
14
+ | --- | --- |
15
+ | Board 1440, light | `assets/469-r2-board-1440-light.png` |
16
+ | Board 1440, dark | `assets/469-r2-board-1440-dark.png` |
17
+ | Board 1024, light | `assets/469-r2-board-1024-light.png` |
18
+ | Board 768, light (tabs) | `assets/469-r2-board-768-light.png` |
19
+ | Board 390, light | `assets/469-r2-board-390-light.png` |
20
+ | Board 390, dark | `assets/469-r2-board-390-dark.png` |
21
+ | Agents 1440, dark | `assets/469-r2-agents-1440-dark.png` |
22
+ | Agents 768, dark | `assets/469-r2-agents-768-dark.png` |
23
+
24
+ ## AC3: nothing scrolls the page sideways
25
+
26
+ Measured in the page, not assumed: for each of the 56 combinations the document's `scrollWidth` was compared with the viewport width
27
+ and every element past the right edge (outside the nav) was listed.
28
+
29
+ - 1440 px: `scrollWidth` 1440 in all 14 view and theme combinations. 1024 px: 1024. 768 px: 768. 390 px: 390.
30
+ - No element extended past the viewport in any of the 56 combinations.
31
+ - The nav is a column of width 199 px at 1440 and 1024, and a row at 768 and 390 whose own `scrollWidth` (769) exceeds its
32
+ `clientWidth` (768 or 390): the tabs scroll inside the nav, as designed, and the page does not.
33
+ - The top bar is 61 px tall from 1024 px up and 129 px at 768 and 390 (it wraps below 1024 px; the screenshots show it).
34
+
35
+ ## AC4: keys
36
+
37
+ Tested through the page's own handler in the navigation test harness (`test/dashboard-views.test.ts`): `1`-`7` switch the seven
38
+ views in order and write the cookie, `?` opens the key list, the buttons open and close it, and view keys are ignored inside an
39
+ input, a textarea, a select, an editable node, with Ctrl, Alt or Cmd held, and while the key list or the task detail is open.
40
+ `Esc` is the native dialog's own close and is not handled by the page. Six deliberate breakages of the key handler each fail a test (a seventh, accepting multi-character keys such as `01`, first survived and led to a stronger test), and eight breakages of the sprite, labels and shell CSS each fail a test too. Not covered: a
41
+ real browser key press (no browser-driven test of the keys was run), and `Esc` itself, which rests on the dialog element.
42
+
43
+ ## Icons
44
+
45
+ Nine Tabler Icons (outline) in one inline sprite, path data copied unchanged from tabler-icons; the MIT notice is in
46
+ `THIRD_PARTY_NOTICES.md`. A test checks the count (at most 20), one stroke width, path-only symbols, no external reference, no
47
+ unused or undefined symbol, `aria-hidden` on every icon, and a text label or `aria-label` next to each.
48
+
49
+ ## Not covered
50
+
51
+ - Screenshots show Board and Agents only, at the sizes above; Office, Stream, Message, Memory and Settings were measured for width
52
+ but not photographed.
53
+ - Chrome only. The sidebar's sticky height uses `100vh`, which on a mobile browser with a collapsing toolbar was not tried.
54
+ - The "tabs scroll sideways" behaviour at 390 px is shown by the cut-off fourth tab in the screenshot, not by a scroll gesture.
@@ -0,0 +1,51 @@
1
+ # #469 R3: dashboard board, side sheets and the Plan sheet
2
+
3
+ Task #172, branch `feat/469-r3-board` (on top of `feat/469-r2-shell`). R3 changes the cards, the task detail and where the five board
4
+ forms live. It keeps drag and drop, the Pull and Assign buttons, the Ready and Waiting subheads, "Show N older" and every action.
5
+
6
+ ## Source
7
+
8
+ A scratch hub outside any git repository with its own `HOME` and `AGENTHUB_HOME` (never the person's home or live hub): five fake
9
+ pull-only peers, eight sample tasks (one in progress, backlog tasks, no owner on some). Headless Chromium (Chrome for Testing 156)
10
+ over the DevTools protocol with `prefers-color-scheme` emulated, at 1440x1000 and 390x900.
11
+
12
+ | What | image |
13
+ | --- | --- |
14
+ | Board 1440, light | `assets/469-r3-board-1440-light.png` |
15
+ | Board 1440, dark | `assets/469-r3-board-1440-dark.png` |
16
+ | Board 390, light | `assets/469-r3-board-390-light.png` |
17
+ | Detail sheet 1440, light | `assets/469-r3-detail-1440-light.png` |
18
+ | Detail sheet 1440, dark | `assets/469-r3-detail-1440-dark.png` |
19
+ | Detail sheet 390, dark | `assets/469-r3-detail-390-dark.png` |
20
+ | Plan sheet 1440, light | `assets/469-r3-plan-1440-light.png` |
21
+ | Plan sheet 390, light | `assets/469-r3-plan-390-light.png` |
22
+
23
+ ## AC5: cards and the detail sheet
24
+
25
+ Measured in the page for eight cards at each of the four size and theme combinations:
26
+
27
+ - every card has two children (the head with the avatar and the title, and one line with the badge and the release chip), exactly one
28
+ badge, exactly one owner avatar, and a title no taller than two lines (`title height / line height` was 2 at most);
29
+ - the page does not scroll sideways (`scrollWidth` equals the viewport at 1440 and 390);
30
+ - the detail sheet is open and pinned to the right edge at 1440 (x 920, width 520, the full 1000 px height) and fills the screen at 390
31
+ (x 0, width 390, the full 900 px height); the Plan sheet likewise (x 880, width 560 at 1440).
32
+
33
+ The detail groups its lines into Status, People, Dates and Links. Each original line (class, stage, waiting, rework, check, SDLC,
34
+ overdue, owner, reviewer, guidance, description, planned and actual dates, release, GitHub link, pinned) appears exactly once, in its
35
+ group; a group with nothing to show is left out. Group headings are `h4`, not `h3`, because the board tests find the five columns by `h3`.
36
+
37
+ ## AC6: the Plan sheet
38
+
39
+ The five forms (`planning`, `split-backlog`, `release-new`, `release-plan`, `propose`) moved out of five `<details>` blocks (plan, split, releases, delivery evidence, propose) into one native
40
+ `<dialog id="plan-dialog">` opened by a Plan button in the board toolbar. Their controls were compared with `origin/main`: identical
41
+ ids and order in all five (11, 4, 3, 6 and 5 controls), and every submit handler still attaches by id. The Releases panel, the delivery
42
+ evidence panel and the split panel keep their ids. A test now pins the full control list of each form.
43
+
44
+ ## Not covered
45
+
46
+ - Drag and drop, hover and the pressed (dragging) shadow were not exercised in a browser: the drop handlers are unchanged and covered by
47
+ the existing board tests, and the hover and drag styles are CSS only, read, not seen.
48
+ - Only the sample data above was rendered: no release chip, no GitHub link, no SDLC lifecycle and no rework round appear in the
49
+ screenshots; those lines are covered by the DOM tests only.
50
+ - The sheet slide-in animation was not observed, and `Esc` rests on the native dialog.
51
+ - Chrome only.
@@ -0,0 +1,77 @@
1
+ # #469 R4 and R5: the other dashboard views, glyphs to icons, Office colour checks
2
+
3
+ Task #173, branch `feat/469-r4-views` (on top of `feat/469-r3-board`). R4 restyles Agents, Stream, Memory, Settings and Message and
4
+ replaces the symbol glyphs. R5 puts the Office scene's colour use under the contrast test. Behaviour, view names and order, the view
5
+ cookie, element ids and every action are unchanged.
6
+
7
+ ## Source
8
+
9
+ A scratch hub outside any git repository with its own `HOME` and `AGENTHUB_HOME` (never the person's home or live hub): five fake
10
+ pull-only peers, seven sample tasks plus a backlog task, four short-term memory notes (decision, fail, contract, finding) and three
11
+ console messages. Headless Chromium over the DevTools protocol with `prefers-color-scheme` emulated, at 1440x1000 and 390x900.
12
+
13
+ | What | image |
14
+ | --- | --- |
15
+ | Agents 1440 light / dark | `assets/469-r4-agents-1440-light.png`, `assets/469-r4-agents-1440-dark.png` |
16
+ | Agents 390 dark | `assets/469-r4-agents-390-dark.png` |
17
+ | Stream 1440 light, 390 light | `assets/469-r4-stream-1440-light.png`, `assets/469-r4-stream-390-light.png` |
18
+ | Memory 1440 light / dark, 390 dark | `assets/469-r4-memory-1440-light.png`, `assets/469-r4-memory-1440-dark.png`, `assets/469-r4-memory-390-dark.png` |
19
+ | Settings 1440 light / dark | `assets/469-r4-settings-1440-light.png`, `assets/469-r4-settings-1440-dark.png` |
20
+ | Message 1440 light | `assets/469-r4-message-1440-light.png` |
21
+ | Office (Flat) 1440 light / dark | `assets/469-r4-office-1440-light.png`, `assets/469-r4-office-1440-dark.png` |
22
+
23
+ The rig also shot the other combinations (all six views at 1440 and 390, light and dark); only the ones above are attached.
24
+
25
+ ## R4
26
+
27
+ - **Agents.** Every peer row (five of five) has one summary line (queued count, "Working on #n" or "No active task") and exactly one
28
+ closed `<details class="peer-fold">` holding the former meta lines. Row height was 144 to 145 px with the fold closed. The status
29
+ notice stays outside the fold. Approvals stay first.
30
+ - **Stream.** The filter chips and Follow latest are in the section head, above the scrolling list. Each event is a head line (time,
31
+ sender, kind) above a monospace body; in the page the left edge of every event was the same x (249 at 1440, 29 at 390). That is
32
+ aligned rows, not four separate columns: the spec's "time column, kind, sender, body" is met as one head line plus the body.
33
+ - **Memory.** Rows show title, a kind badge and a meta line with the id, peer and date and time (not a relative age); the selected row has an accent edge. The graph
34
+ and the detail pane use tokens only. With four notes: four rows, one pressed, the detail pane filled.
35
+ - **Settings.** Six groups as sections. The reload row now has padding, and a "restart pending" badge and a count by "Pending
36
+ restart" exist in the markup. The text lines, Preview, Save and Undo are as before.
37
+ - **Message.** Same form, capped at 640 px, with the shared field and label styles.
38
+ - **No page scrolls sideways** in any of the six views at 1440 or 390 in either theme (`scrollWidth` equals the viewport).
39
+
40
+ ## AC7: glyphs
41
+
42
+ - A test fails if any of `○ ● × ‖ ⚑ ★ → ⟳` is back as a quoted string in the page, and one fails if an Office shape name is renamed.
43
+ Both were run red (see below).
44
+ - The star, the stream arrow and the Office "checking" mark are Tabler `star`, `arrow-right` and `refresh` (the path data was compared
45
+ with the upstream files, unchanged). The sprite has twelve symbols of the twenty allowed, and `THIRD_PARTY_NOTICES.md` names all of them.
46
+ - The Office conditions are drawn as shapes (ring, disc, cross, bars, raised hand), each next to its words. The condition names
47
+ (`idle`, `busy`, `offline`, `paused`, `waiting`) are unchanged.
48
+ - Every icon use sits beside a text label or has an `aria-label`; a test counts the `icon()` and `officeIcon()` call sites.
49
+
50
+ ## R5: Office colours and contrast
51
+
52
+ The Office rules already named colours only through `var(--token)`, so nothing was remapped. What changed is the checks:
53
+
54
+ - The colour-literal test no longer skips the Office block.
55
+ - A new test reads the tokens each Office rule uses, fails on a token it does not classify, and checks text tokens at 4.5:1 and mark
56
+ tokens at 3:1 against the three Office surfaces (`--panel-soft`, `--panel`, `--control`), in both themes. The earlier R1 test
57
+ already covered text, `--dot`, `--on-accent`, disabled controls and the peer palette.
58
+ - **Decision to review:** the hairline tokens `--line` and `--control-border` carry no information (room, desk and shelf edges,
59
+ dividers) and measure 1.2 to 1.7:1 on those surfaces, so they are classified as separators and not held to 3:1. If a reviewer wants a
60
+ 3:1 edge, that is a colour change to the tokens, not a test change.
61
+
62
+ ## Checks that were run red
63
+
64
+ Each was applied to the working tree, the tests run, and the file restored:
65
+
66
+ - an Office rule using an unknown token: the new Office token test failed;
67
+ - a `⟳` put back into the page script: the AC7 glyph test failed;
68
+ - the Office `ring` shape renamed in `office-model.ts`: the AC7 shape test failed.
69
+
70
+ ## Not covered
71
+
72
+ - The Office was shot in Flat mode with five idle peers. The busy, offline, paused and waiting shapes, the checking icon and the
73
+ approval hand were checked by the model tests and the DOM tests, not seen in a browser. Isometric was not shot.
74
+ - The "restart pending" badge on a setting row and the Pending restart count need a pending key, and the sample hub had none, so they
75
+ were not rendered. They are covered by the DOM tests only.
76
+ - Memory's long-term and tasks tiers, and the graph with more than one hop, were not shot.
77
+ - Chrome only. Of the attached images, the Message and the dark Office were not looked at one by one.
@@ -0,0 +1,82 @@
1
+ # #469 R6: keyed rendering, quiet motion, and loading, empty, disconnected and toast states
2
+
3
+ Task #174, branch `feat/469-r6-motion` (on top of `feat/469-r4-views`). The poll interval, every action, authority rule and pinned
4
+ element id are unchanged.
5
+
6
+ ## Source
7
+
8
+ A scratch hub outside any git repository with its own `HOME` and `AGENTHUB_HOME` (never the person's home or live hub): five fake
9
+ pull-only peers and eight sample tasks, plus a second hub with no peers and no tasks for the empty views. Headless Chromium over the
10
+ DevTools protocol with `prefers-color-scheme` emulated, at 1440x1000 and 390x900. `/snapshot` was held, failed and released through
11
+ the DevTools Fetch domain to produce the skeleton and the disconnected state.
12
+
13
+ | What | image |
14
+ | --- | --- |
15
+ | Skeleton, board 1440 light / 390 dark | `assets/469-r6-skeleton-1440-light.png`, `assets/469-r6-skeleton-390-dark.png` |
16
+ | Toast stack 1440 light / dark, 390 light | `assets/469-r6-toasts-1440-light.png`, `assets/469-r6-toasts-1440-dark.png`, `assets/469-r6-toasts-390-light.png` |
17
+ | Disconnected 1440 light / dark, 390 dark | `assets/469-r6-disconnected-1440-light.png`, `assets/469-r6-disconnected-1440-dark.png`, `assets/469-r6-disconnected-390-dark.png` |
18
+ | Empty board 1440 light / dark | `assets/469-r6-board-empty-1440-light.png`, `assets/469-r6-board-empty-1440-dark.png` |
19
+ | Empty peers 390 light / dark | `assets/469-r6-agents-empty-390-light.png`, `assets/469-r6-agents-empty-390-dark.png` |
20
+ | Board after load 1440 light, 390 dark | `assets/469-r6-board-1440-light.png`, `assets/469-r6-board-390-dark.png` |
21
+
22
+ ## AC8: keyed rendering
23
+
24
+ How it works: a keyed pass (`keyedStart`) hands out one node per key. A card, peer row or memory row whose JSON signature is the same
25
+ as last time is the same node; a changed one is rebuilt (its listeners close over its data, so it is replaced, not patched) and, if
26
+ it held focus, `update()` hands the focus to the replacement. Keys that are gone are dropped. The card signature includes the
27
+ board context, the capabilities its buttons depend on and the release name, so a change to any of those rebuilds the card.
28
+
29
+ - **vm tests** (`test/dashboard-motion.test.ts`), on the real board code and the real `update()`: after a poll that changes one
30
+ task the other three cards are the same objects, the changed one is new, and a focused card keeps focus; a focused card that
31
+ itself changes passes its focus to its replacement; an unchanged poll leaves `children` as the same array; a gone card is removed
32
+ and the rest are untouched; a card that changes capability is rebuilt.
33
+ - **Chrome**, four theme and size combinations: focus the first card, add a task, wait three polls: `document.activeElement` is
34
+ still that card, it is still connected, and the three cards after it are the same nodes (`3/3`), with the card count up by one.
35
+
36
+ ## AC9: motion, states
37
+
38
+ - **Motion test over the CSS:** every `transition` is `none` or on `transform` or `opacity` only, 120 to 200 ms (the Office's own
39
+ .8 s transform move is pinned elsewhere and allowed up to .8 s); every `@keyframes` moves only `transform` and `opacity`; every
40
+ animation names one of the known keyframes at 120 to 200 ms (the Office ones keep their pinned timings); the only `infinite`
41
+ animation in the page is the Office pulse; and one `@media(prefers-reduced-motion:reduce)` rule turns `transition` and
42
+ `animation` off for `*`, `*::before` and `*::after`.
43
+ - **Chrome with reduced motion emulated:** computed styles at 1440. With no preference: view animation `view-in` 0.16 s, button
44
+ transition 0.12 s, card transition 0.15 s, toast `toast-in`. With `reduce`: all four are `none` or `0s`.
45
+ - **Skeleton:** five column blocks on the board and three bars in the peer list, `aria-hidden`, with the text "Loading the board..."
46
+ next to them. With `/snapshot` held they were on screen; after release `.skeleton` was gone from the page (0 left). They do not
47
+ animate.
48
+ - **Empty views:** the board, peers, stream, approvals, memory (three cases) say what fills them and the command. Every command they
49
+ name is in `ahub help` (a test). The empty hub showed the board and peers texts in Chrome.
50
+ - **Disconnected:** with `/snapshot` failing, `main` gets `data-stale`, its content measured `opacity 0.6`, the status read
51
+ "Disconnected / retrying: Failed to fetch", and the line read "Last snapshot at 10:43:11 PM. Polling continues every second."
52
+ After the fetch came back both were cleared. Seen at 1440 and 390, light and dark.
53
+ - **Toasts:** three notices (one success, two errors) gave a stack of three with a Dismiss button each, the box inside the viewport
54
+ and no sideways scroll (`scrollWidth` equals the viewport). Five seconds later the success had faded and both errors were still
55
+ there; pressing Dismiss on each left none. Test: four at most, the same text replaces its toast, an empty text clears the stack,
56
+ the fade starts at 4 s and the removal 160 ms later, an error never expires, reduced motion keeps a success.
57
+
58
+ ## Pinned contracts changed (named, nothing loosened)
59
+
60
+ - `test/ui.test.ts`: it read `#notice` as one element (`textContent`, `error`). With a stack those two reads come from the newest
61
+ toast, defined once in the harness. Every assertion below is unchanged.
62
+ - `test/dashboard-views.test.ts`: it pinned five `setTimeout(` calls in the page. The five are still there; `notice()` adds two
63
+ (the fade and the removal), and the test now pins both counts, so a timer anywhere else still fails it.
64
+ - The card's own transition was `transform .15s, box-shadow .15s`. It is `transform .15s` now, because the spec limits motion to
65
+ `transform` and `opacity`; the hover shadow still appears, without easing.
66
+ - `update()` gained focus carry-over and `resetView` clears the keyed caches; neither changes the signature fast path.
67
+
68
+ ## Checks that were run red
69
+
70
+ Each applied to the page, the new tests run, the file restored: a cache that never hits; no focus hand-off; a success toast that
71
+ never fades; an error toast that fades; a `width` transition; a weakened reduced-motion rule; an `infinite` card animation; a
72
+ disconnected line never cleared; an animated skeleton; a capability left out of the card signature. Each failed the test written
73
+ for it.
74
+
75
+ ## Not covered
76
+
77
+ - Peer rows and memory rows use the same keyed pass, but only the board's cards were driven through a poll in a browser and in the
78
+ vm tests; the peer and memory paths are covered by the shared pass test and by the existing tests, which still pass.
79
+ - A card that is replaced and was hovered loses its hover until the pointer moves. That is the browser's behaviour for a new node.
80
+ - The card's enter animation and the toast's fade were checked by computed style and by the test over the CSS, not watched.
81
+ - Dragging a card across a poll was not exercised.
82
+ - Chrome only. The dark skeleton, the 390 empty board and the Stream's empty text were not looked at one by one.
@@ -0,0 +1,60 @@
1
+ # 0.12.45 release verification
2
+
3
+ This record covers release preparation and source review. It does not claim publication, installation, a running-hub restart or a live TUI launch.
4
+
5
+ ## Candidate
6
+
7
+ Version 0.12.45, from merged main at 0612e5d5. The person directed on 2026-10-22 to finish the work in progress and release it.
8
+
9
+ - Dashboard redesign (#469): tokens (#649), app shell and view keys (#650), board cards with detail and Plan sheets (#651), view restyle and Office colours (#659), keyed rendering, motion and loading, empty, disconnected and toast states (#660), and follow-ups (#662, #664).
10
+ - External adapter modules and the conformance kit (#451 A4, #648, #653); the A5 guide and adapters note pass (#668).
11
+ - Peer lists and the CLI surface derived from adapter definitions (#625, #656), and PeerAdapter capability members (#625 phase 6 slice 1, #667).
12
+ - Structured review findings with an Important gate (#481 S3, #652, #657) and plan conformance with person-only departure acceptance (#481 S2, #665).
13
+ - #230 S10 review-readiness rulings (#641, #643, #644), #428 racy same-size rewrites of large files (#646), #221 channel hints (#647), #225 stale roster keys and the shared git budget (#663), #654 Kimi TUI retained-command diagnostic (#658), and #661 held snapshot clocks for runner-speed-dependent daemon tests (#666, #669).
14
+ - Still open: #655 (dependency-ready auto-assignment ignores the owner's WIP cap), board task #287 (external-kind instances), the later #625 phase 6 slices and #481 S4-S7.
15
+
16
+ ## Reviews
17
+
18
+ | PR | Final head | Review | CI |
19
+ | --- | --- | --- | --- |
20
+ | #641, #643, #644 (#230) | see PRs | Spec ruling, then code review with red-first regressions | exact head, success |
21
+ | #646 (#428) | e4b3fb9a | Two rounds with an independent reviewer (unbounded hashing and the atHead regression fixed) | exact head, success |
22
+ | #647 (#221) | 0b1ae257 | Reviewer read; a connector P2 (legacy nudge under a held hint) fixed by the reviewer | exact head, success |
23
+ | #648, #653 (#451 A4) | 222a5839, 4a271455 | Two rounds with independent security and packaging reviews; project-cwd SDK resolution, whole-daemon refusal and offline roster fixed; follow-ups in #653 | exact head, success |
24
+ | #649, #650, #651, #659, #660 (#469) | see PRs | Reviewer read per phase; R3 seed rot re-anchored; connector findings fixed or tracked (#293, #296) | exact head, success (R6 after one Ubuntu rerun of the #661 flake) |
25
+ | #652, #657 (#481 S3) | d60d5bd6, ecc4b39f | Two rounds with an independent reviewer (unbound-head bypass and head carry-forward fixed); a connector P1 (supplied head) fixed in #657 | exact head, success |
26
+ | #656 (#625) | d803de2b | Reviewer read against the projection ruling; fixture correction (#294); bundle rebuilt after #658 | exact head, success |
27
+ | #658 (#654) | a6409371 | Reviewer read; root cause reproduced by delay | exact head, success |
28
+ | #662 | f46cb77f | Main-red fix after #656 and #660 crossed | exact head, success |
29
+ | #663 (#225) | fd71191b | Reviewer read; three connector findings (instance eligibility, shared-config removal, result text) fixed red-first | exact head, success |
30
+ | #664 (#296) | 0d21de7a | Reviewer read; fixes two connector P2s from #660 | exact head, success |
31
+ | #665 (#481 S2) | 88bec9ab | Three rounds with an independent reviewer (rename and root-entry bypasses, status writes, off-mode, queue rename regression fixed); a connector P1 (departure scope) fixed red-first (#298) | exact head, success |
32
+ | #666, #669 (#661) | 948b6afd, 389262df | Reviewer read; red-first with a slowed-git stand-in; a connector P1 (20 s per-test ceiling) fixed | exact head, success |
33
+ | #667 (#625) | 17ab88d2 | Reviewer read against the phase 6 rulings | exact head, success |
34
+ | #668 (#451 A5) | fc052e89 | Reviewer read; two connector P2s fixed by the reviewer | exact head, success |
35
+
36
+ ## Document review
37
+
38
+ Fourteen documents were stale against the 0.12.44 stamps. Each was checked against `git log <stamp>..HEAD` over its paths (with PR #665's diff) by read-only reviewers in four groups, and corrected where a merged change made a statement wrong or missing.
39
+
40
+ | Document | Result | Checked claims and correction |
41
+ | --- | --- | --- |
42
+ | `README.md` | corrected | Status 0.12.45; dashboard, adapter modules, review findings and plan conformance, stale roster key removal; verification link. |
43
+ | `docs/quickstart.md` | corrected | Install pin `v0.12.45`; "Upgrading to 0.12.45" (dashboard, modules, findings, plan conformance and `accept-departure`, Kimi diagnostic, channel hints, #428). |
44
+ | `docs/operations.md` | corrected | New "External adapter modules" section; recovery floor; conditional source refusal; shared git budget; stale roster keys; SDLC S3 and S2 with pointers to `docs/sdlc.md`. |
45
+ | `docs/security.md` | corrected | A4 trust paragraph (a pin authorizes code, not a sandbox); delegated-CLI refusals include departure acceptance; metadata-only plan conformance reads; stale roster keys grant nothing. |
46
+ | `src/cli/help.ts` | corrected | `release-assign <reason...>`; roster remove deletes a stale instance key; `plan-review` flag grouping; native usage rendered from definitions matches each entry parser. |
47
+ | `docs/agent-notes/tasks.md` | corrected | Supplied-head binding, id-only settlement, hub-proposed recurrence markers, S2 conformance and departure consent rules; `plan-conformance.ts` in scope. |
48
+ | `docs/agent-notes/daemon.md` | corrected | Module recovery floor, conditional source refusal, historical receipt reads, stale keys, external catalog, retained `kimi_cmd` diagnostic. |
49
+ | `docs/agent-notes/adapters.md` | corrected | PeerAdapter capability ports (#667). |
50
+ | `docs/agent-notes/tests.md` | corrected | Held snapshot clocks, the 20 s per-test ceiling, seed re-anchoring, CI tests the PR head, kit and fakes under `src/adapters/conformance/`. |
51
+ | `docs/agent-notes/local-worker.md` | corrected | #428 racy large-file rule. |
52
+ | `docs/agent-notes/budget.md` | corrected | `Budget.report` skips external module kinds. |
53
+ | `docs/agent-notes/README.md` | corrected | Background section holding the rationale moved out of the notes. |
54
+ | `docs/agent-notes/benchmarks.md`, `bus.md` | no change | Rules checked against the diffs; no contradiction. |
55
+
56
+ `AGENTS.md` and `docs/verified.json` gain the new task-board and test paths, and the pre-0.7.7 issue-numbering note is removed from `AGENTS.md` at the person's request.
57
+
58
+ ## Release mechanics
59
+
60
+ Merge the release PR with a merge commit (the stamps name release-branch commits), run `node scripts/check-docs.mjs --require-fresh` on the merged main, then tag `v0.12.45`.
@@ -0,0 +1,78 @@
1
+ # Optional code-facts native receipt, 2026-10-22
2
+
3
+ - Hub source commit: `21ed30ed72f6b5436126461945a9f409eb056b38`.
4
+ - Native tool: installed ripwire 0.6.7. The module verifies its version and output schema/keys; this is not a binary attestation.
5
+ - Host: macOS, Bun 1.4.2. Model-free tiny temporary Git fixture with two TypeScript functions; no model, provider login or live agent turn.
6
+ - The production `CodeFacts` methods were invoked for changed symbols, one enclosing definition, existence and one-hop neighbours. All four returned parsed known values. Both actual XML verbs and the actual callers/callees JSON path were exercised.
7
+ - The fixture's main HEAD stayed unchanged; after every read the disposable worktree was removed and only the original fixture checkout remained. The fixture itself was removed afterwards. No analysis of the agent-hub main checkout was performed.
8
+ - Change kinds remain unknown: ripwire 0.6.7 omits deleted definitions and does not expose both-tree change identity. `countsFloor` is retained for graph observations. This receipt does not establish a complete semantic diff or graph.
9
+ - Separate Linux fakes cover missing/version/schema/truncated/overflow failures, deadline teardown, an exited CLI leaving a descendant, reader close, untracked owner contamination, repository filters, metadata screening and review admission fences. The strict file/coverage gate is unchanged.
10
+
11
+ ## Parsed fixture values
12
+
13
+ ```json
14
+ {
15
+ "changed": {
16
+ "state": "known",
17
+ "value": [
18
+ {
19
+ "name": "retained",
20
+ "kind": "fn",
21
+ "path": "a.ts",
22
+ "line": 1,
23
+ "ambiguous": false,
24
+ "change": "unknown"
25
+ },
26
+ {
27
+ "name": "added",
28
+ "kind": "fn",
29
+ "path": "a.ts",
30
+ "line": 3,
31
+ "ambiguous": false,
32
+ "change": "unknown"
33
+ }
34
+ ]
35
+ },
36
+ "at": {
37
+ "state": "known",
38
+ "value": [
39
+ {
40
+ "name": "added",
41
+ "kind": "fn",
42
+ "path": "a.ts",
43
+ "line": 3,
44
+ "ambiguous": false,
45
+ "change": "unknown",
46
+ "endLine": 3
47
+ }
48
+ ]
49
+ },
50
+ "exists": {
51
+ "state": "known",
52
+ "value": {
53
+ "exists": true,
54
+ "ambiguous": false
55
+ }
56
+ },
57
+ "neighbours": {
58
+ "state": "known",
59
+ "value": {
60
+ "countsFloor": true,
61
+ "callers": [
62
+ {
63
+ "name": "added",
64
+ "kind": "fn",
65
+ "path": "a.ts",
66
+ "line": 3,
67
+ "ambiguous": false,
68
+ "change": "unknown"
69
+ }
70
+ ],
71
+ "callees": [],
72
+ "hiddenAmbiguous": 0
73
+ }
74
+ },
75
+ "mainUnchanged": true,
76
+ "worktrees": 1
77
+ }
78
+ ```
@@ -0,0 +1,47 @@
1
+ # Codex 0.163.0 fresh-reviewer isolation receipt
2
+
3
+ Date: 2026-10-22. Platform: macOS arm64. Scope: model-free production `codexReviewerBackend.prepare`; no `codex exec`, model request, account login, credential copy or live review was performed. This extends the [0.146.0 receipt](2026-10-19-reviewer-isolation.md), retaining its limitations.
4
+
5
+ ## Source identity
6
+
7
+ The upstream annotated tag `openai/codex` `rust-v0.163.0` resolves to tag object `129b8ec7ee6f4511557a4856279f529025c25af4`, peeled commit `83086188ae0614bd882818ff1aa23f3194962012` (`git ls-remote` readback).
8
+
9
+ - [Exec switches](https://github.com/openai/codex/blob/83086188ae0614bd882818ff1aa23f3194962012/codex-rs/exec/src/cli.rs#L40) retain ephemeral sessions, ignored user config and ignored execpolicy rules. These do not remove every config layer.
10
+ - [Apps gate](https://github.com/openai/codex/blob/83086188ae0614bd882818ff1aa23f3194962012/codex-rs/core/src/mcp.rs#L403) excludes the runtime compatibility MCP server when Apps is disabled; configured MCP inventory alone cannot establish that.
11
+ - [Plugin manager](https://github.com/openai/codex/blob/83086188ae0614bd882818ff1aa23f3194962012/codex-rs/core-plugins/src/manager.rs#L821) returns no plugins when disabled. [MCP schema](https://github.com/openai/codex/blob/83086188ae0614bd882818ff1aa23f3194962012/codex-rs/config/src/mcp_types.rs#L234) retains disabled-server exclusion and the enabled-tools allowlist.
12
+ - Legacy `notify` is independent of the hooks feature: [session construction](https://github.com/openai/codex/blob/83086188ae0614bd882818ff1aa23f3194962012/codex-rs/core/src/session/mod.rs#L5461), [hook registry](https://github.com/openai/codex/blob/83086188ae0614bd882818ff1aa23f3194962012/codex-rs/hooks/src/registry.rs#L124). The host now additionally pins `notify=[]` in both metadata proofs and returned exec argv. This is a source/argv guarantee, not a model-driven hook execution test.
13
+ - [Seatbelt compiler](https://github.com/openai/codex/blob/83086188ae0614bd882818ff1aa23f3194962012/codex-rs/sandboxing/src/seatbelt.rs#L624) retains anchored unreadable-glob translation, including `**/`, canonical-prefix and ancestor protections.
14
+
15
+ ## Native production preparation
16
+
17
+ The installed fnm launcher was selected explicitly, rather than changing `codex_bin` or downgrading the main peer. The producer resolves it to the native `@openai/codex-darwin-arm64` executable and hashes its bytes. Its receipt's binary identity is `sha256:721bb3cd0657262380cfc3458992e1d7ec2c0a9a6e4b7365924c2ffc71722d4e` (the receipt hashes the native binary digest in the bound-command file list).
18
+
19
+ The probe created separate temporary HOME, CODEX_HOME and project directories. It removed inherited variables except PATH, TMPDIR and LANG, then set only those temporary homes. The hub transport was inert `/usr/bin/false` with no token. The actual production prepare function was invoked with a fresh session id, abort signal, fixed prompt and private paths. It returned a launch description; that launch was never executed. Both launch-owned and outer temporary directories were removed in `finally`.
20
+
21
+ Runs:
22
+
23
+ - Empty temporary homes, 0.163.0: passed every production admission leg.
24
+ - Separate temporary home with only synthetic stdio and HTTP MCP declarations: passed; ambient servers were disabled stubs, and only `agent-hub` remained enabled with exactly `hub_review` and `hub_task_show`.
25
+ - Final policy including `notify=[]`, 0.163.0 with synthetic ambient servers: passed again.
26
+ - Retained 0.146.0 executable with final policy and empty temporary homes: passed. Its receipt binary identity is `sha256:4a6398187165c5bd75ad92c9a6fba6df6d401a59b62f7e1ecf9218a8196852a6`.
27
+
28
+ After the centralized compatibility change (#691) merged, both final production preparations were repeated from the rebased source: 0.163.0 with synthetic ambient MCP entries and 0.146.0 with empty homes. Both passed again, retaining the binary identities above and the `legacy-notify-disabled` evidence.
29
+
30
+ The producer required unique effective Apps/plugins/hooks rows with value false, exact MCP transport/tool readback, bounded bundled-model catalog validation, stable binary/config metadata, public read success and all native sandbox canaries below. Every successful launch returned `readOnly: true`, `strictMcp: true`, `ephemeral: true` and `current(): true`.
31
+
32
+ | Native canary | Required observed result |
33
+ | --- | --- |
34
+ | Public file | Read allowed |
35
+ | Exact private path | Read denied |
36
+ | Nested `**/*.env` private path | Read denied |
37
+ | Symlink alias into private glob | Read denied |
38
+ | Portable-core `.env` and `.agenthub/state` | Read denied |
39
+ | Synthetic host gh, kube and docker credential roots | Read denied |
40
+ | Symlink alias into synthetic credential root | Read denied |
41
+ | New file creation | Write denied; file absent |
42
+
43
+ Central compatibility policy marks 0.146.0 and 0.163.0 as verified. Other versions are refused unless the person explicitly trusts that exact version on this machine; every runtime isolation proof still runs after trust. The receipt reports the observed version. Refusals name the observed and verified versions in a bounded diagnostic; malformed version output becomes unknown without echoing native text. The daemon preserves the centralized compatibility refusal, while ordinary isolation failures remain generic.
44
+
45
+ ## Evidence boundaries
46
+
47
+ The network setting remains configured disabled, without a separate network probe. Web search is requested disabled; effective model-turn mode is not read back. Returned exec argv is checked, but no run proves exec selecting the named default permission profile. No account/model review, TUI interaction or native Linux result is claimed. These runtime tests exercise the installed macOS binary; same-user filesystem/config mutation after the final metadata check remains outside atomic snapshot guarantees. The supported credential-root list is bounded, not a classifier for every private host file. Hosted CI and the changed-source gate are separate code-verification evidence recorded on the PR.
@@ -0,0 +1,79 @@
1
+ # Kimi 2.3.0 and Qwen Code 0.26.0 compatibility receipt
2
+
3
+ ## Scope and identity
4
+
5
+ This #373/#691 follow-up covers model-free native contracts. No real account, provider inference, personal configuration, native login, credential refresh or personal machine trust was used or changed. PATH's Kimi was already 2.3.0; PATH's Qwen remains 0.25.0. Qwen 0.26.0 was installed into a private temporary prefix with npm install scripts disabled. This receipt does not upgrade either tool.
6
+
7
+ | Artifact | Binding |
8
+ | --- | --- |
9
+ | Kimi native macOS arm64 executable | version `2.3.0`; SHA-256 `33eb2b6201ec4864daba89f57e4913126b483fdbe22d70411691ef7dbfca190d` |
10
+ | Kimi source | tag `@moonshot-ai/kimi-code@2.3.0`, commit [`b5e28fd6beac752a2cdcc0ff2f5fdf40e6494fbb`](https://github.com/MoonshotAI/kimi-code/tree/b5e28fd6beac752a2cdcc0ff2f5fdf40e6494fbb) |
11
+ | Qwen package | `@qwen-code/qwen-code@0.26.0`; npm gitHead [`ac97ce7a70d9b2ea5d62b357e3d9b0851423afc9`](https://github.com/QwenLM/qwen-code/tree/ac97ce7a70d9b2ea5d62b357e3d9b0851423afc9) |
12
+ | Qwen npm integrity | `sha512-JFO+gXpc3AVB+sR+ybQUb20DFfBMgB3p+F+rbru6xWeooYTixqOhCa3tOj0gCrDfkRxZFIziIH+zL05JgA2xVw==` |
13
+ | Qwen `cli-entry.js` | SHA-256 `3c53a220bdf124e8ef9fd28cd3465c761a2a466deb6dc6a97272d0a6d1121f59` |
14
+ | Qwen `chunks/acpAgent-5XER3TGL.js` | SHA-256 `a50d4de8c3c2abc90d3b5c2a9e00e0084f5a8cf21f0a66a3cc3125d6bd63f6a0` |
15
+
16
+ ## Kimi private production preparation
17
+
18
+ The actual `kimiReviewerBackend.prepare` ran against an isolated HOME and a synthetic native KIMI_CODE_HOME containing only a managed `kimi` provider, invented access-only OAuth data, credentials/oauth directories and device identity. No personal file was linked. The producer created its own clean cwd, private home, empty skills directory and replace-mode environment. Its mode-0600 config contains the managed provider only, without the synthetic token value. Its agent YAML has exactly `mcp__agent-hub__hub_review` and `mcp__agent-hub__hub_task_show`, with `subagents: []`. Directory/device links point only to the synthetic source. `current()` passed and source config/token bytes survived cleanup.
19
+
20
+ Before deciding the verified list, a synthetic trust record inside this disposable fixture lifted only the version gate; every production preparation check remained active. After the evidence passed and the verified entry was added, preparation was repeated without that fixture trust. Runtime checks remain required before every production child. This is native tool policy, not a filesystem/network sandbox.
21
+
22
+ The real `createReviewerMcpSession` exposed exactly the two tools. A different task ID, a third tool and missing per-session authority were refused. Revocation refused subsequent reads. Native allowed calls reached the host only as `hub_task_show {id:7}` and `hub_review {id:7}`. No full daemon control token or actual project board was involved.
23
+
24
+ ## Kimi native allowlist positive and negative controls
25
+
26
+ A separate native print fixture used the generated agent and task-bound MCP config. Only its managed provider endpoint and synthetic OAuth slot were redirected to a loopback fixed-response Anthropic-protocol server. These fixed responses perform no inference. The production prepared files were not modified; its `current()` remained true. No static API-key provider or OAuth-lock override was selected.
27
+
28
+ The pinned native source derives an endpoint-specific OAuth key from `sha256(JSON.stringify({oauthHost,baseUrl})).slice(0,16)`, with prefix `oauth/kimi-code-env-`. Only invented access-only records were created in that slot. See [managed auth scoping](https://github.com/MoonshotAI/kimi-code/blob/b5e28fd6beac752a2cdcc0ff2f5fdf40e6494fbb/packages/oauth/src/managed-kimi-code.ts#L324) and [storage-name resolution](https://github.com/MoonshotAI/kimi-code/blob/b5e28fd6beac752a2cdcc0ff2f5fdf40e6494fbb/packages/oauth/src/toolkit.ts#L465).
29
+
30
+ | Native case | Observed result |
31
+ | --- | --- |
32
+ | Exact two-tool agent | exit 0; four fixed-response requests, every inventory exactly the two hub names; both allowed MCP operations reached the host |
33
+ | Inject unlisted `Write` | native result `Tool "Write" not found`; owned marker remained `unchanged` |
34
+ | Same arguments with `Write` explicitly added to the agent | exit 0; two fixed-response requests, inventory includes `Write`; marker became `synthetic-write-control` |
35
+
36
+ Both use production print flags (`-p`, stream-json, explicit agent file and empty skills). Children had new owned process groups, a 30 s deadline and a 1 MiB combined output cap; cleanup completed before temporary trees were removed. Synthetic source configuration/token bytes stayed unchanged. Session hints inside temporary homes were not resumed.
37
+
38
+ Three earlier harness outcomes are retained as non-passes: combining `-p` with `--auto` was rejected before any request; redirecting the endpoint without its scoped synthetic token produced no configured credential and zero requests; a collector required `tool_result.is_error`, but native Kimi emits the explicit tool-not-found text without that flag. The corrected collector checks that actual refusal together with exact inventory, unchanged marker and the successful Write positive control. None was an authenticated attempt or a concealed native-version failure.
39
+
40
+ ## Qwen native ACP and permission contract
41
+
42
+ The actual private-prefix CLI ran with isolated HOME/QWEN_HOME/QWEN_RUNTIME_DIR/XDG_CONFIG_HOME/TMPDIR, clean cwd and an allowlisted environment. It used a dummy OpenAI key, fixture model and unreachable loopback base, with `--acp --bare --advisor off --auth-type openai --telemetry=false`. No `session/prompt` or authentication RPC was sent. Native Node transport guards were loaded before imports; six background network attempts were blocked. No provider inference or account request occurred.
43
+
44
+ Observed native readback:
45
+
46
+ - initialize protocolVersion 1, served `agentInfo.name = qwen-code`, `version = 0.26.0`;
47
+ - session/new with no MCP servers succeeded;
48
+ - advertised modes: `plan`, `default`, `auto-edit`, `auto`, `yolo`;
49
+ - native ACKs for `default -> auto-edit -> yolo -> default`;
50
+ - bounded 30 s RPC deadlines and 1 MiB combined output; SIGTERM exit and whole owned process group gone.
51
+
52
+ The hub continues to map only ask/default, ask-when-needed/auto-edit and never-ask/yolo. Auto and plan are not added to its permission map. The served ACP identity was checked independently of the npm/CLI version label.
53
+
54
+ The published ACP chunk does not export its permission builder. A scratch copy rewrote import URLs to the installed package and added exports for the native `SubAgentTracker`, `toPermissionOptions` and `resolvePermissionOutcome`; native function bodies were unchanged. Its real `createApprovalHandler` ran with synthetic client/tool/event ports, without a prompt or tool execution. The request carried `sessionId`, `toolCallId`, pending status/title/content/locations/kind/rawInput and `_meta.toolName`; options carried `optionId`, `name`, and `kind`. Offered `proceed_once`/allow_once selection reached the native respond callback, cancellation resolved to cancel, and an unoffered option ID was rejected. The group was removed and no network attempt occurred in this callback fixture.
55
+
56
+ This is published-code callback evidence, not a model-generated ACP permission turn. Existing host mapping tests retain configured-server/call-ID binding, raw-argument display and offered-option selection; an unrecognized title still requires ordinary approval. The callback does not grant any broader MCP identity.
57
+
58
+ ## Reproduction and remaining live legs
59
+
60
+ The external `scratchpad/temp/agent-hub-373` evidence archive contains the bounded Kimi producer/result and Qwen initialize/mode/permission producers, synthetic transcripts, result JSON and SHA-256 manifest. The Kimi/hub producer uses pinned Bun 1.4.2; Qwen uses Node with Python controllers. Each repository runs one admitted native/test job at a time. The Qwen prefix is recreated from the exact npm package with `--ignore-scripts`; the native executable's served identity must still pass. No historical 2.2.0 live receipt is relabelled as a 2.3.0 pass.
61
+
62
+ Real Kimi login/refresh and attached-TUI coexistence, a model-produced review verdict/quality, actual provider readiness, Qwen model-selected permission turns and production rollout remain unverified live legs. Kimi token usage is not measured by this receipt. The exact versions may enter compat verified; no future version, compatible line, sandbox relaxation or skipped runtime proof is inferred.
63
+
64
+
65
+ ## Host validation
66
+
67
+ Focused portable fixtures: 49 pass, 0 fail, 277 assertions across `compat`, `qwen-peer`, `kimi-review` and `reviewer-mcp`; typecheck passed. The Qwen host parser also consumed the captured native callback fields and selected only an offered once option, with cancellation and unknown-option refusal. Kimi's final production preparation plus native controls passed with `fixtureTrustOnly: false`. The generated plugin bundle is rebuilt with pinned Bun after the frozen install; runtime isolation proofs are unchanged.
68
+
69
+ External producer/result fingerprints:
70
+
71
+ | Archive item | SHA-256 |
72
+ | --- | --- |
73
+ | `kimi-probe.ts` | `fc3a210f18736586fafd3294dd8f8212bf6e341b62deb6bff4828bcfce835bd4` |
74
+ | `kimi-native-result.json` | `3c7008f251dcf0ac266dedcf1934c15dc53f1e1dc89a21aeb234e5742238b9c1` |
75
+ | `kimi-verified-result.json` | `9d283932e1f01ca14694e577e30f0b9039a93c088267e16c8d3aff6367fff609` |
76
+ | `qwen-probe.py` | `bc6834b0e3015f482262b22ea97c89cb5036e1b1ed97a59f19e7feff25bcbd6d` |
77
+ | `qwen-native-result.json` | `9322ec7c575542d035cc6bbaf596d39b576a926b24de012b5e6492bf08d3c19d` |
78
+ | `qwen-permission-result.json` | `8fd15c8e5c5e793992187e19b1f4bfdb60ce020fba13f55360b743c2528e34ae` |
79
+ | `qwen-native-permission-exports.mjs` | `75ba574de1f52bfc45f4e49bacd4bf4b904946c401d43a35bd539f3ea54a27ff` |