@staix/agent-hub 0.12.43 → 0.12.45

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 (180) hide show
  1. package/CHANGELOG.md +38 -3
  2. package/README.md +3 -3
  3. package/THIRD_PARTY_NOTICES.md +29 -0
  4. package/docs/adding-an-ai-tool.md +228 -0
  5. package/docs/agent-notes/README.md +14 -0
  6. package/docs/agent-notes/adapters.md +61 -42
  7. package/docs/agent-notes/budget.md +2 -2
  8. package/docs/agent-notes/daemon.md +16 -10
  9. package/docs/agent-notes/local-worker.md +4 -3
  10. package/docs/agent-notes/tasks.md +13 -6
  11. package/docs/agent-notes/tests.md +9 -7
  12. package/docs/operations.md +163 -12
  13. package/docs/quickstart.md +10 -2
  14. package/docs/sdlc.md +26 -8
  15. package/docs/security.md +11 -6
  16. package/docs/specs/2026-09-19-agent-hub-design.md +273 -8
  17. package/docs/verification/2026-10-21-0.12.44.md +54 -0
  18. package/docs/verification/2026-10-21-469-r1-dashboard-tokens.md +43 -0
  19. package/docs/verification/2026-10-21-469-r2-dashboard-shell.md +54 -0
  20. package/docs/verification/2026-10-21-469-r3-dashboard-board.md +51 -0
  21. package/docs/verification/2026-10-21-469-r4-dashboard-views.md +77 -0
  22. package/docs/verification/2026-10-21-469-r6-dashboard-motion-states.md +82 -0
  23. package/docs/verification/2026-10-21-grok-config-acp-t0.md +30 -0
  24. package/docs/verification/2026-10-22-0.12.45.md +60 -0
  25. package/docs/verification/assets/469-r1-board-1440-dark.png +0 -0
  26. package/docs/verification/assets/469-r1-board-1440-light.png +0 -0
  27. package/docs/verification/assets/469-r1-board-390-dark.png +0 -0
  28. package/docs/verification/assets/469-r1-board-390-light.png +0 -0
  29. package/docs/verification/assets/469-r2-agents-1440-dark.png +0 -0
  30. package/docs/verification/assets/469-r2-agents-768-dark.png +0 -0
  31. package/docs/verification/assets/469-r2-board-1024-light.png +0 -0
  32. package/docs/verification/assets/469-r2-board-1440-dark.png +0 -0
  33. package/docs/verification/assets/469-r2-board-1440-light.png +0 -0
  34. package/docs/verification/assets/469-r2-board-390-dark.png +0 -0
  35. package/docs/verification/assets/469-r2-board-390-light.png +0 -0
  36. package/docs/verification/assets/469-r2-board-768-light.png +0 -0
  37. package/docs/verification/assets/469-r3-board-1440-dark.png +0 -0
  38. package/docs/verification/assets/469-r3-board-1440-light.png +0 -0
  39. package/docs/verification/assets/469-r3-board-390-light.png +0 -0
  40. package/docs/verification/assets/469-r3-detail-1440-dark.png +0 -0
  41. package/docs/verification/assets/469-r3-detail-1440-light.png +0 -0
  42. package/docs/verification/assets/469-r3-detail-390-dark.png +0 -0
  43. package/docs/verification/assets/469-r3-plan-1440-light.png +0 -0
  44. package/docs/verification/assets/469-r3-plan-390-light.png +0 -0
  45. package/docs/verification/assets/469-r4-agents-1440-dark.png +0 -0
  46. package/docs/verification/assets/469-r4-agents-1440-light.png +0 -0
  47. package/docs/verification/assets/469-r4-agents-390-dark.png +0 -0
  48. package/docs/verification/assets/469-r4-memory-1440-dark.png +0 -0
  49. package/docs/verification/assets/469-r4-memory-1440-light.png +0 -0
  50. package/docs/verification/assets/469-r4-memory-390-dark.png +0 -0
  51. package/docs/verification/assets/469-r4-message-1440-light.png +0 -0
  52. package/docs/verification/assets/469-r4-office-1440-dark.png +0 -0
  53. package/docs/verification/assets/469-r4-office-1440-light.png +0 -0
  54. package/docs/verification/assets/469-r4-settings-1440-dark.png +0 -0
  55. package/docs/verification/assets/469-r4-settings-1440-light.png +0 -0
  56. package/docs/verification/assets/469-r4-stream-1440-light.png +0 -0
  57. package/docs/verification/assets/469-r4-stream-390-light.png +0 -0
  58. package/docs/verification/assets/469-r6-agents-empty-390-dark.png +0 -0
  59. package/docs/verification/assets/469-r6-agents-empty-390-light.png +0 -0
  60. package/docs/verification/assets/469-r6-board-1440-light.png +0 -0
  61. package/docs/verification/assets/469-r6-board-390-dark.png +0 -0
  62. package/docs/verification/assets/469-r6-board-empty-1440-dark.png +0 -0
  63. package/docs/verification/assets/469-r6-board-empty-1440-light.png +0 -0
  64. package/docs/verification/assets/469-r6-disconnected-1440-dark.png +0 -0
  65. package/docs/verification/assets/469-r6-disconnected-1440-light.png +0 -0
  66. package/docs/verification/assets/469-r6-disconnected-390-dark.png +0 -0
  67. package/docs/verification/assets/469-r6-skeleton-1440-light.png +0 -0
  68. package/docs/verification/assets/469-r6-skeleton-390-dark.png +0 -0
  69. package/docs/verification/assets/469-r6-toasts-1440-dark.png +0 -0
  70. package/docs/verification/assets/469-r6-toasts-1440-light.png +0 -0
  71. package/docs/verification/assets/469-r6-toasts-390-light.png +0 -0
  72. package/docs/verified.json +38 -20
  73. package/package.json +5 -1
  74. package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
  75. package/plugins/agent-hub/server.js +10287 -9560
  76. package/src/adapters/acp-owned-group.ts +124 -0
  77. package/src/adapters/acp.ts +92 -25
  78. package/src/adapters/adapter-api.ts +2 -0
  79. package/src/adapters/agy/definition.ts +4 -4
  80. package/src/adapters/agy/entry.ts +4 -1
  81. package/src/adapters/channel-peer.ts +143 -0
  82. package/src/adapters/claude-channel.ts +21 -12
  83. package/src/adapters/codex-appserver.ts +17 -2
  84. package/src/adapters/configured-acp.ts +124 -0
  85. package/src/adapters/conformance/acp.ts +114 -0
  86. package/src/adapters/conformance/codex.ts +191 -0
  87. package/src/adapters/conformance/enrollment.ts +43 -0
  88. package/src/adapters/conformance/factories.ts +17 -0
  89. package/src/adapters/conformance/fake-paths.ts +12 -0
  90. package/src/adapters/conformance/fakes/acp-server.ts +267 -0
  91. package/src/adapters/conformance/fakes/acp-watchdog-agent.ts +10 -0
  92. package/src/adapters/conformance/fakes/app-server.ts +119 -0
  93. package/src/adapters/conformance/fakes/codex-bin.ts +15 -0
  94. package/src/adapters/conformance/fakes/jcode-agent.ts +91 -0
  95. package/src/adapters/conformance/fakes/model-server.ts +39 -0
  96. package/src/adapters/conformance/fakes/pi-rpc.ts +32 -0
  97. package/src/adapters/conformance/index.ts +11 -0
  98. package/src/adapters/conformance/kit.ts +50 -0
  99. package/src/adapters/conformance/local-pi.ts +100 -0
  100. package/src/adapters/conformance/owned-acp.ts +44 -0
  101. package/src/adapters/definitions/builtin-metadata.ts +60 -39
  102. package/src/adapters/definitions/native-channel-state.ts +41 -0
  103. package/src/adapters/definitions/native-cli-entry-kimi.ts +9 -1
  104. package/src/adapters/definitions/native-cli-entry.ts +7 -19
  105. package/src/adapters/definitions/native-cli-preview-qwen.ts +1 -1
  106. package/src/adapters/definitions/native-cli-preview.ts +2 -11
  107. package/src/adapters/definitions/native-identity-defaults.ts +14 -0
  108. package/src/adapters/definitions/qwen.ts +7 -9
  109. package/src/adapters/definitions/reviewer-variants.ts +3 -7
  110. package/src/adapters/external-metadata.ts +48 -0
  111. package/src/adapters/external-module-scan.ts +126 -0
  112. package/src/adapters/external-modules.ts +240 -0
  113. package/src/adapters/jcode.ts +4 -0
  114. package/src/adapters/local-worker.ts +4 -0
  115. package/src/adapters/pi.ts +6 -0
  116. package/src/adapters/public.ts +7 -0
  117. package/src/adapters/registry-types.ts +28 -16
  118. package/src/adapters/registry.ts +115 -17
  119. package/src/adapters/reviewer-print.ts +4 -0
  120. package/src/cli/agy-mcp.ts +3 -2
  121. package/src/cli/configured-acp-entry.ts +58 -0
  122. package/src/cli/console-state.ts +9 -4
  123. package/src/cli/facts-hook.ts +2 -1
  124. package/src/cli/help.ts +27 -16
  125. package/src/cli/identity.ts +8 -7
  126. package/src/cli/launch.ts +5 -4
  127. package/src/cli/main.ts +101 -32
  128. package/src/cli/memory.ts +13 -10
  129. package/src/cli/output.ts +1 -0
  130. package/src/cli/preview.ts +9 -0
  131. package/src/cli/recovery-guidance.ts +1 -1
  132. package/src/cli/terminal-recovery.ts +16 -13
  133. package/src/cli/upgrade-labels.ts +1 -1
  134. package/src/cli/upgrade-presentation.ts +1 -1
  135. package/src/cli/upgrade-restore-state.ts +6 -4
  136. package/src/cli/upgrade-runtime.ts +25 -7
  137. package/src/cli/upgrade.ts +3 -2
  138. package/src/hub/board.ts +37 -8
  139. package/src/hub/budget.ts +9 -2
  140. package/src/hub/bus.ts +6 -2
  141. package/src/hub/claude-state.ts +2 -37
  142. package/src/hub/conductor.ts +8 -6
  143. package/src/hub/config-apply.ts +37 -17
  144. package/src/hub/config-reload.ts +42 -11
  145. package/src/hub/config-trust.ts +1 -1
  146. package/src/hub/context-window.ts +6 -0
  147. package/src/hub/control-client.ts +4 -1
  148. package/src/hub/crash.ts +8 -6
  149. package/src/hub/daemon.ts +412 -328
  150. package/src/hub/facts.ts +76 -13
  151. package/src/hub/hub-tools.ts +57 -5
  152. package/src/hub/instance-config.ts +33 -12
  153. package/src/hub/instance-execution.ts +23 -11
  154. package/src/hub/instances.ts +47 -22
  155. package/src/hub/lifecycle-schema.ts +5 -3
  156. package/src/hub/memory-profile.ts +16 -3
  157. package/src/hub/no-writes.ts +50 -0
  158. package/src/hub/peers.ts +9 -0
  159. package/src/hub/permission-mode.ts +9 -7
  160. package/src/hub/plan-conformance.ts +83 -0
  161. package/src/hub/review-findings.ts +104 -0
  162. package/src/hub/roster.ts +35 -6
  163. package/src/hub/routing.ts +21 -20
  164. package/src/hub/sdlc-queue.ts +19 -4
  165. package/src/hub/sdlc-release.ts +16 -1
  166. package/src/hub/sdlc.ts +27 -12
  167. package/src/hub/settings.ts +54 -16
  168. package/src/hub/snapshots.ts +32 -6
  169. package/src/hub/start-mode.ts +10 -8
  170. package/src/hub/task-sweep.ts +8 -2
  171. package/src/hub/tasks.ts +358 -60
  172. package/src/hub/ui.ts +2 -2
  173. package/src/memory/capture.ts +2 -1
  174. package/src/ui/index.html +563 -77
  175. package/src/ui/office-model.ts +3 -1
  176. package/src/ui/peer-palette.ts +44 -0
  177. package/templates/AGENTS.block.md +1 -1
  178. package/templates/profiles/general.json +1 -1
  179. package/templates/profiles/research.json +1 -1
  180. package/templates/profiles/writing.json +1 -1
@@ -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,30 @@
1
+ # Grok config-only ACP T0, 2026-10-21
2
+
3
+ This receipt separates the generic ACP implementation from native Grok readiness. It does not establish #486 AC1-AC6 or #451 AC3 as complete.
4
+
5
+ ## Observed native build and isolation
6
+
7
+ - Local native binary reports `grok 1.0.62 (1474f9cbdd91)`.
8
+ - Version, agent help and stdio help exited 0 under a temporary HOME, Grok home, XDG config/cache/data directories and project directory outside a Git repository.
9
+ - The protocol probe used `grok agent --no-leader stdio`, with inherited agent markers removed and a probe-specific peer identity. The probe harness copied no personal config or credential files and wrote only to its isolated directories; no production hub was used. The exact native-file check below is bounded, and broader native credential state remains unverified.
10
+ - The saved agent help states that the leader default is `[cli] use_leader` in `config.toml`, rather than a guaranteed foreground default; `--no-leader` forces a new agent. A plain `grok agent stdio` argv therefore does not itself establish foreground ownership in an ambient home. `--leader-socket` is also an attach selector. The config compiler therefore requires explicit standalone `--no-leader` for recognized Grok declarations before any process starts, and still refuses `--leader` and `--leader-socket`; isolated HOME alone is not substituted for the opt-out.
11
+ - Before/after SHA-256 values of the exact real Grok `config.toml` and `version.json` matched. The additionally checked `config.json`, `settings.json` and `mcp.json` were absent before and after. This bounded check is not a claim about every native configuration path.
12
+
13
+ ## Protocol result
14
+
15
+ - Initialize replied and advertised `loadSession: true`, image/audio prompt support false, embedded context true, HTTP/SSE MCP support and session list/resume/close capabilities.
16
+ - Initialize did not provide `agentInfo`. The config-only adapter requires the observed native name/version pin to match initialize before creating a session or prompting. The native build therefore has no usable runtime identity pin under this contract.
17
+ - The separate raw protocol probe attempted `session/new` in the isolated project with an empty MCP server list. It received an RPC error. Its raw error payload was neither logged nor published; the cause remains unclassified.
18
+ - No model prompt or native MCP tool ran. Session/load echo, session/set_mode, usage/occupancy and a real hub-tool result are unverified. Advertising load or MCP support is not proof of those operations.
19
+ - Because no prompt ran, no process-tree and socket/IPC observation while a prompt was active exists. The required no-detached-leader evidence is unverified.
20
+
21
+ ## Owned group and teardown
22
+
23
+ - The runtime ownership helper positively verified the direct child, its original process group and shared process signature at start and immediately before teardown.
24
+ - The first probe's teardown returned `unconfirmed`. A fresh process-table read after the probe exited showed no Grok process. This is not recorded as a confirmed stop receipt.
25
+ - A post-SIGKILL defunct-row observation edge was fixed and covered by deterministic regression tests: after the last signal, wait for the original group to disappear within the bound, tolerating command/parent changes of a dying row while preserving PID/start/group identity. Pre-signal ownership checks remain strict, and no process outside the spawned group is signalled.
26
+ - A second isolated probe with the same native build again lacked initialize identity and had session/new refused. With the corrected observation fence, start and pre-stop group checks passed, group disappearance was confirmed, and a separate fresh process-table read found no Grok process. The exact real-config hashes again matched. This confirms teardown for this refused attempt, not foreground behavior during a model prompt.
27
+
28
+ ## Readiness decision
29
+
30
+ Grok remains unsupported by this receipt. The generic config-only ACP path is covered independently with the repository's fake ACP transport, including identity mismatch, load-echo refusal, owned-group checks, permission ACKs, read-only ceilings, task delivery and project isolation. Native Grok admission still needs a build with matching initialize identity plus successful isolated session creation, actual hub-tool execution, load-echo evidence and foreground tree/IPC proof during a prompt. No permission, quota, sandbox, planner or reviewer claim is inferred from these observations.
@@ -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`.