@staix/agent-hub 0.12.23 → 0.12.24

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 (158) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/README.md +8 -3
  3. package/docs/addons/claude-mem.md +24 -0
  4. package/docs/addons/codex-plugin.md +8 -0
  5. package/docs/addons/dot-admit.md +8 -0
  6. package/docs/addons/open-code-review.md +8 -0
  7. package/docs/addons/ponytail.md +23 -0
  8. package/docs/addons/ripwire.md +22 -0
  9. package/docs/agent-notes/README.md +5 -0
  10. package/docs/agent-notes/adapters.md +8 -1
  11. package/docs/agent-notes/bus.md +3 -1
  12. package/docs/agent-notes/daemon.md +7 -1
  13. package/docs/agent-notes/local-worker.md +4 -2
  14. package/docs/agent-notes/tasks.md +4 -0
  15. package/docs/agent-notes/tests.md +2 -1
  16. package/docs/bench.md +28 -3
  17. package/docs/cooperbench.md +4 -0
  18. package/docs/data-policy.md +36 -0
  19. package/docs/events.md +3 -0
  20. package/docs/gsd-collaboration-analysis.md +48 -0
  21. package/docs/memory.md +231 -0
  22. package/docs/operations.md +651 -14
  23. package/docs/plans/2026-10-11-issues-109-sequential.md +81 -0
  24. package/docs/plans/2026-10-11-routing-evaluation-proposal.md +30 -0
  25. package/docs/profiles.md +57 -0
  26. package/docs/quickstart.md +1 -1
  27. package/docs/research.md +31 -1
  28. package/docs/roles.md +85 -0
  29. package/docs/sdlc.md +170 -0
  30. package/docs/security.md +111 -4
  31. package/docs/smoke.md +282 -0
  32. package/docs/specs/2026-09-19-agent-hub-design.md +601 -7
  33. package/docs/specs/2026-10-12-backlog-implementation-plan.md +186 -0
  34. package/docs/specs/2026-10-12-office-view-design.md +212 -0
  35. package/docs/text-projection.md +19 -0
  36. package/docs/verification/2026-10-11-acp-watch-t0.md +33 -0
  37. package/docs/verification/2026-10-11-agent-config-inventory.md +20 -0
  38. package/docs/verification/2026-10-11-jcode-peer-contract.md +27 -0
  39. package/docs/verification/2026-10-13-0.12.24.md +94 -0
  40. package/docs/verification/2026-10-13-board-phone.md +31 -0
  41. package/docs/verification/2026-10-13-fsmonitor-fixture-attribution.md +19 -0
  42. package/docs/verified.json +22 -13
  43. package/package.json +2 -1
  44. package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
  45. package/plugins/agent-hub/ROLE-NOTICE.md +26 -0
  46. package/plugins/agent-hub/server.js +1175 -339
  47. package/scripts/check-docs.mjs +129 -0
  48. package/src/adapters/acp.ts +112 -13
  49. package/src/adapters/claude-channel.ts +48 -11
  50. package/src/adapters/codex-appserver.ts +11 -0
  51. package/src/adapters/jcode.ts +110 -0
  52. package/src/adapters/local-worker.ts +10 -7
  53. package/src/adapters/pi.ts +94 -20
  54. package/src/cli/attention.ts +60 -0
  55. package/src/cli/bench.ts +24 -5
  56. package/src/cli/board-read.ts +12 -0
  57. package/src/cli/console-state.ts +103 -17
  58. package/src/cli/console.ts +54 -8
  59. package/src/cli/facts-hook.ts +12 -4
  60. package/src/cli/help.ts +35 -9
  61. package/src/cli/identity.ts +18 -7
  62. package/src/cli/init.ts +48 -10
  63. package/src/cli/jcode-mcp.ts +58 -0
  64. package/src/cli/kimi-mcp.ts +53 -0
  65. package/src/cli/launch.ts +16 -1
  66. package/src/cli/main.ts +392 -57
  67. package/src/cli/memory.ts +193 -0
  68. package/src/cli/output.ts +45 -4
  69. package/src/cli/pet-config.ts +1 -0
  70. package/src/cli/pet.ts +83 -0
  71. package/src/cli/preview.ts +38 -5
  72. package/src/cli/status-lines.ts +1 -1
  73. package/src/cli/tail-render.ts +1 -0
  74. package/src/cli/upgrade-runtime.ts +32 -3
  75. package/src/cli/watch.ts +31 -0
  76. package/src/hub/activity.ts +53 -0
  77. package/src/hub/ask.ts +10 -5
  78. package/src/hub/bench.ts +10 -3
  79. package/src/hub/board.ts +222 -16
  80. package/src/hub/bus.ts +48 -9
  81. package/src/hub/citations.ts +7 -0
  82. package/src/hub/conductor.ts +12 -7
  83. package/src/hub/config-trust.ts +4 -2
  84. package/src/hub/crash.ts +9 -0
  85. package/src/hub/daemon.ts +910 -120
  86. package/src/hub/delivery-journal.ts +5 -0
  87. package/src/hub/envelope.ts +1 -1
  88. package/src/hub/events.ts +12 -2
  89. package/src/hub/facts.ts +26 -7
  90. package/src/hub/git.ts +8 -2
  91. package/src/hub/github-import.ts +28 -0
  92. package/src/hub/hub-tools.ts +49 -10
  93. package/src/hub/inference.ts +1 -1
  94. package/src/hub/lifecycle-schema.ts +17 -0
  95. package/src/hub/listen.ts +15 -0
  96. package/src/hub/manager.ts +12 -5
  97. package/src/hub/path-policy.ts +96 -0
  98. package/src/hub/peer-catalog.ts +28 -0
  99. package/src/hub/permission-mode.ts +19 -5
  100. package/src/hub/planning.ts +70 -0
  101. package/src/hub/profiles.ts +74 -0
  102. package/src/hub/projected-diff.ts +73 -0
  103. package/src/hub/projection-exec.ts +24 -0
  104. package/src/hub/research.ts +144 -21
  105. package/src/hub/roles.ts +123 -0
  106. package/src/hub/roster.ts +23 -0
  107. package/src/hub/routing.ts +18 -5
  108. package/src/hub/sdlc-queue.ts +112 -0
  109. package/src/hub/sdlc-release.ts +125 -0
  110. package/src/hub/sdlc.ts +250 -0
  111. package/src/hub/settings.ts +34 -15
  112. package/src/hub/shipped-roles.ts +25 -0
  113. package/src/hub/snapshots.ts +89 -15
  114. package/src/hub/start-mode.ts +7 -5
  115. package/src/hub/supervision.ts +1 -0
  116. package/src/hub/task-sweep.ts +1 -1
  117. package/src/hub/tasks.ts +892 -87
  118. package/src/hub/text-projection.ts +126 -0
  119. package/src/hub/tooling.ts +159 -0
  120. package/src/hub/ui.ts +16 -2
  121. package/src/hub/workflow.ts +71 -0
  122. package/src/local/sandbox.ts +6 -4
  123. package/src/local/tools.ts +11 -6
  124. package/src/memory/brief.ts +28 -14
  125. package/src/memory/import.ts +55 -0
  126. package/src/memory/recall.ts +84 -0
  127. package/src/memory/store.ts +750 -0
  128. package/src/memory/sync.ts +145 -0
  129. package/src/pet/NOTICE.md +10 -0
  130. package/src/pet/characters.ts +1438 -0
  131. package/src/pet/config.ts +31 -0
  132. package/src/pet/frame.ts +17 -0
  133. package/src/pet/pixels.ts +28 -0
  134. package/src/role-text.d.ts +1 -0
  135. package/src/ui/index.html +842 -46
  136. package/src/ui/needs.ts +58 -0
  137. package/src/ui/office-model.ts +440 -0
  138. package/src/ui/peer-palette.ts +16 -0
  139. package/src/ui/task-board.ts +49 -0
  140. package/src/ui/task-progress.ts +5 -1
  141. package/templates/AGENTS.block.md +3 -2
  142. package/templates/config.json +5 -1
  143. package/templates/profiles/dev.json +22 -0
  144. package/templates/profiles/general.json +26 -0
  145. package/templates/profiles/research.json +57 -0
  146. package/templates/profiles/writing.json +28 -0
  147. package/templates/roles/NOTICE.md +26 -0
  148. package/templates/roles/dev/backend-engineer.md +26 -0
  149. package/templates/roles/dev/code-reviewer.md +26 -0
  150. package/templates/roles/dev/frontend-engineer.md +26 -0
  151. package/templates/roles/dev/security-reviewer.md +26 -0
  152. package/templates/roles/dev/software-architect.md +26 -0
  153. package/templates/roles/dev/test-engineer.md +26 -0
  154. package/templates/roles/research/analyst.md +26 -0
  155. package/templates/roles/research/fact-checker.md +26 -0
  156. package/templates/roles/research/research-lead.md +26 -0
  157. package/templates/roles/research/researcher.md +26 -0
  158. package/templates/roles/research/statistician.md +26 -0
package/docs/security.md CHANGED
@@ -55,7 +55,7 @@ the console. Merged and generated Claude settings live in 0600 state files and
55
55
  are passed by path, keeping caller settings out of process argv.
56
56
 
57
57
  Claude ask-when-needed grants only resolving project file targets outside
58
- .agenthub, .git, .claude, .codex, .qwen, .kimi, .pi and .mcp.json. Symlink escapes, protected aliases, traversal and
58
+ .agenthub, .git, .claude, .codex, .qwen, .kimi, .kimi-code, .pi, .mcp.json, .agents and .claude.json. Symlink escapes, protected aliases, traversal and
59
59
  unresolved wildcard targets receive no decision. Names are compared folded (letter case, compatibility forms and
60
60
  the code points HFS+ ignores; case-insensitive APFS folds case but ignored none in the probe; so a look-alike such
61
61
  as a long s or a name with a zero-width joiner is the same name), the path is judged inside the project, and
@@ -109,11 +109,11 @@ Please report vulnerabilities privately through GitHub's "Report a vulnerability
109
109
 
110
110
  - `ahub ui` uses the authenticated console control connection to start an ephemeral HTTP listener on `127.0.0.1`. No UI listener exists before that command. The control and Codex proxy ports continue to refuse every `Origin` header.
111
111
  - The daemon issues a cryptographically random, single-use bootstrap ticket valid for 60 seconds. The CLI opens the dashboard with that ticket in the URL fragment, never a query string or the control token. The static page removes the fragment immediately and exchanges it with a same-origin POST. Tickets are consumed once; expired tickets cannot create sessions.
112
- - The exchange creates a separate random session, valid for one hour without renewal, in an `HttpOnly; SameSite=Strict; Path=/` cookie named for this listener's port. Sessions and tickets live only in memory and die with the daemon. The page itself keeps one more cookie, `agent-hub-theme` (issue #246): script-set, `SameSite=Strict`, kept for a year for the whole `127.0.0.1` host, and read back only as one of `system`, `light` or `dark`. HTTP is loopback-only; the cookie is not a substitute for the origin checks.
112
+ - The exchange creates a separate random session, valid for one hour without renewal, in an `HttpOnly; SameSite=Strict; Path=/` cookie named for this listener's port. Sessions and tickets live only in memory and die with the daemon. The page itself keeps one more cookie, `agent-hub-theme` (issue #246): script-set, `SameSite=Strict`, kept for a year for the whole `127.0.0.1` host, and read back only as one of `system`, `light` or `dark`. A second script-set cookie, `agent-hub-office` (issue #264), keeps the Office view choice under the same attributes and is read back only as `off`, `flat` or `isometric`. HTTP is loopback-only; the cookie is not a substitute for the origin checks.
113
113
  - Every request must have the exact listener Host. Every data or action request, including the ticket exchange and snapshot polling, must be POST with the exact listener Origin and JSON content type. Foreign and missing origins, missing or expired sessions, oversized bodies and unknown actions are rejected. There is no CORS support. The only unauthenticated GET is the fixed, data-free HTML shell. No files or paths are served dynamically.
114
114
  - Responses are non-cacheable, cannot be framed, suppress referrers, and use a content security policy restricting scripts/styles to the shipped inline content and connections to this origin. Browser text is rendered with textContent, never interpreted as HTML.
115
- - The browser receives a bounded redacted event stream, peer states and queue counts, public task views, budget windows, pending approvals, the settings rows (closed values and ids, the file each comes from) and each startable peer's start plan (issue #269), and benchmark run summaries (issue #251): the newest runs in `~/.agenthub/bench/`, whichever project on this machine ran them, by suite name, arm label, state, the task id in progress, counts, tokens and times, never suite text. Private envelope bodies and PII task text never cross this endpoint. Local-worker and Pi approval titles can contain PII, so their details remain terminal-only; the dashboard identifies the request and directs the operator to `ahub tail` before allowing it. Budget checkpoint summaries are also omitted.
116
- - The closed action list is permission response, peer pause/resume, console message, task proposal, task assignment and, since issue #269, the settings actions below (set, undo, preview). These use the existing daemon/task paths and budget pause rules. `start_peer` (issue #269) starts a peer from a closed list in the mode a person set, with a command the hub assembles: the request carries a peer id and nothing else. There is no generic control proxy, task-detail read, shell, file access, free-form configuration edit, budget override, launch of a caller-chosen command or daemon shutdown API.
115
+ - The browser receives a bounded redacted event stream, peer states and queue counts, public task views, budget windows, pending approvals, the settings rows (closed values and ids, the file each comes from) and each startable peer's start plan (issue #269), benchmark run summaries (issue #251): the newest runs in `~/.agenthub/bench/`, whichever project on this machine ran them, by suite name, arm label, state, the task id in progress, counts, tokens and times, never suite text, and the office view's optional fields (issue #264): each peer's open turn (start time, attributed task id, attribution kind), a `checking` flag on tasks whose check is running, and warning `links` of overlapping, conflicting or cohort tasks (task and peer ids only, never paths, symbols or reasons; a PII task never joins a link, and a private or PII-attributed turn exposes no task id). Private envelope bodies and PII task text never cross this endpoint. Local-worker and Pi approval titles can contain PII, so their details remain terminal-only; the dashboard identifies the request and directs the operator to `ahub tail` before allowing it. Budget checkpoint summaries are also omitted.
116
+ - The closed action list includes permission response, peer pause/resume, console message, task proposal/assignment and the settings actions below (set, undo, preview). Project-board actions add revision-fenced planning, Backlog pull/return/split/undo and release planning/state changes through Tasks; they do not tag, publish or write GitHub state. These use the existing daemon/task paths and budget pause rules. `start_peer` (issue #269) starts a peer from a closed list in the mode a person set, with a command the hub assembles: the request carries a peer id and nothing else. There is no generic control proxy, task-detail read, shell, file access, free-form configuration edit, budget override, launch of a caller-chosen command or daemon shutdown API.
117
117
  - The listener stops with the daemon. Expired sessions must be reopened with `ahub ui`; the page does not silently obtain new credentials.
118
118
 
119
119
  ## Dashboard settings and the settings session (issue #269)
@@ -144,3 +144,110 @@ The manager can start registered hubs in attended mode. Its project launches do
144
144
  not inherit state, unattended or gateway URL/key overrides from the session that
145
145
  opened the manager. Native memory is deliberately not a project-isolation boundary:
146
146
  its existing basename/worktree aliases and provider accounts can remain shared.
147
+
148
+ ## Peer roster authority
149
+
150
+ The running peer roster changes only through console-only settings requests.
151
+ `ahub roster` is a person's CLI command, including its read form; no hub tool
152
+ exposes the catalog or edits membership. An ordinary dashboard can remove a peer,
153
+ but adding requires the existing settings-session authority. Removing the
154
+ conductor holder is refused. Local and Pi scoped tools cannot write `.agenthub`.
155
+ Claude, Codex and Kimi still follow their own file permissions and can edit a
156
+ config file; such an edit changes participation only at the next hub start. A
157
+ live settings write or undo applies its own roster key and does not adopt other
158
+ file edits. External ids outside the known native catalog keep their prior
159
+ admission rules.
160
+
161
+ Kimi's pull-only TUI owns its tool approvals and session. The person's launcher
162
+ merges/removes only the hub MCP entry; the daemon never edits that file and
163
+ refuses headless starts while a stale entry exists. An attached Kimi TUI blocks
164
+ controlled recovery instead of being treated as a hub-owned headless process.
165
+ Scoped Pi and local-worker write/edit grants check both the original project-relative
166
+ path and its resolved target for protected agent configuration names. A protected
167
+ directory symlinked to an ordinary project directory still asks a person; an alias
168
+ into a protected directory also asks. Effects use the guarded real path and recheck
169
+ it after approval. Explicit approval and never-ask retain their existing meaning
170
+ (#322). ACP permissions arriving offline are cancelled before any auto-approval or
171
+ console request; pending permissions are withdrawn on watchdog, offline or stop,
172
+ and a late person answer cannot grant them (#311).
173
+
174
+ The shared scoped-grant exclusion also covers `.agents` skills and `.claude.json`.
175
+ The latter is conservatively protected by name; its default documented location
176
+ is in the home directory, not a project loader. The source inventory and limits
177
+ are in [the configuration inventory](verification/2026-10-11-agent-config-inventory.md).
178
+ Instruction files `AGENTS.md`, `CLAUDE.md` and `QWEN.md` remain grantable by default.
179
+ A person can set `scoped_grants.protect_instructions` to true to require approval
180
+ for scoped writes and edits through original or resolved spellings. It applies
181
+ live after a settings write or undo, never changes reads or never-ask, and cannot
182
+ be set through an agent, tools or conductor surface. Claude's daemon response
183
+ withholds the scoped mode on these writes so an older hook grants nothing too.
184
+
185
+ Qwen Code's optional production ACP peer requires qwen-code 0.25.0 native identity
186
+ and advertised mode ids before setting a policy or starting work. Its own tools
187
+ have no hub sandbox; auto-edit approves file edits, yolo every tool. Configured
188
+ never-ask still requires the person's confirmation. qwen_cmd is machine-local and
189
+ never editable through settings. Legacy benchmark adapters remain unmanaged by
190
+ this production table. Startup diagnostics withhold native host/payload details.
191
+
192
+ Jcode is optional, source/version-fenced and runs native tools without a hub sandbox or hub permission-mode mapping. .jcode joins the scoped-grant exclusion, including lexical/resolved aliases. Only a person writes its unique project MCP entry; foreign/override/symlink entries refuse. The hub owns a private daemon/socket and ACP group, never the global daemon, and copies no credentials. Native diagnostics withhold payloads/hosts. Unproved conversation loads refuse; no fresh replacement is called a restore.
193
+
194
+ # Transient ACP activity (#286)
195
+
196
+ - Watch activity can contain file contents, thoughts and command output. It is console-role only, kept in a bounded in-memory ring and exposed only through the `watch` control request. Agent shells, conductor tools, dashboard snapshots, hub tools and memory observers cannot read it. Terminal bodies pass through the console's sanitization and wrapping helpers. Slow sockets close instead of accumulating unbounded output.
197
+ - Private/PII turns show a single stub; the adapter latches privacy for that turn. The existing final-answer bus and native approval paths (console and dashboard) remain independent, with their existing privacy rules. Watch never adds activity to either path or any disk log.
198
+ - There is no Qwen dual-output input file or TUI transport in this slice; Q2-Q6 are unverified and TUI mode stays refused.
199
+
200
+ ## Global attention metadata (#280, phase 3)
201
+
202
+ The optional status `needs` projection contains act/watch counts, a known state
203
+ and the first item (kind, level, peer/id and numeric times only). Status JSON has
204
+ no console-local unread-message count and no full item list. The console-role
205
+ reply to the existing status request additionally supplies `attentionItems`,
206
+ using the same body-free allowlist so stream navigation needs no board-text read.
207
+ Peer/tools status callers do not receive that full list. The summary and item
208
+ projection never reads task title/detail, approval title/options, pause reason,
209
+ error text or paths, and is never forwarded to memory. PROTOCOL remains 16 and
210
+ EVENTS_SCHEMA remains 1; clients that ignore optional fields remain compatible.
211
+
212
+ The file-reading pet command verifies the recorded process identity through the
213
+ shared liveness contract and treats missing/unconfirmed evidence as unavailable.
214
+ Recovery uses the existing lock/runner read path; unknown is never absent and
215
+ navigation grants no permission or mutation authority. Built-in characters and the dashboard projection use the same structural
216
+ privacy boundary described below.
217
+
218
+ Built-in text-frame characters are literal data, not user files or runtime image
219
+ loads. Presentation config admits only known ids/sizes/glyph modes, never paths
220
+ or arbitrary glyph bodies. Character cycling emits no workflow effects. Larger
221
+ frames carry only structural need ids/counts and exclude source/notice prose;
222
+ private task and approval details remain in their existing operator views.
223
+
224
+ The optional dashboard attention input contains only structural task ids, states,
225
+ owner/reviewer ids, approval ids and numeric times, peer delivery states and
226
+ budget pause times. It is assembled from the same allowlisted input as status;
227
+ task text, plans, approval prose, error text and paths are excluded. This input
228
+ is supplied only inside console-authorized dashboard snapshots, never ordinary
229
+ status replies or status.json. The pet creates trusted inline SVG pixel nodes
230
+ from built-in literal frames with existing theme colours, without HTML insertion,
231
+ inline handlers, style attributes or external assets. Existing CSP hashing,
232
+ headers, origin and session authorization remain in force. Clicking scrolls and
233
+ focuses only; it cannot grant permissions or invoke a mutation.
234
+
235
+
236
+ ## Hub-owned structured memory (#258)
237
+
238
+ With a project config, native hub memory is enabled unless `memory.native` is
239
+ false. Append-only segments and their derived index stay in the private hub-home
240
+ memory directory, created with 0700 directory permissions. New note segments request mode 0600, and `index.db` receives a best-effort
241
+ 0600 chmod. Existing file modes and SQLite-created WAL/shared-memory sidecar
242
+ modes are not a per-file guarantee; the store protects access through its
243
+ explicitly chmodded 0700 parent directory.
244
+ PII-task notes, PII-pattern notes and secret-looking text are refused before
245
+ persistence; promotions are
246
+ screened again. The index can be rebuilt from segments and does not replace the
247
+ separate claude-mem worker database.
248
+
249
+ Sync starts only after a person configures a remote. Public GitHub remotes are
250
+ refused; unknown visibility proceeds with a warning for the configured remote.
251
+ Short-term segments, machine identity and the derived index are excluded from
252
+ sync. Suggested graph edges are off by default and are not evidence until a
253
+ person confirms them. Operational details and limits: [hub memory](memory.md).
package/docs/smoke.md CHANGED
@@ -2,6 +2,49 @@
2
2
 
3
3
  `scripts/check.sh` covers everything against fakes. The legs below need real accounts and an interactive terminal, so they are run by hand and recorded here.
4
4
 
5
+ ## Hub memory (#258)
6
+
7
+ Not run yet (2026-10-12). Source and fakes cover tiers, the graph, retrieval, sync between two simulated homes and a bare remote, leases, import and suggestions (`test/memory-*.test.ts`).
8
+
9
+ - [ ] Real sync between two physical machines through a private GitHub remote over SSH: entries, a forget, a lease and a conflict each visible on the other side.
10
+ - [ ] `gh` reports a public test remote and the sync refuses it.
11
+ - [ ] `ahub memory import claude-mem` against the live claude-mem store of this machine: counts and skipped classes, claude-mem unchanged.
12
+ - [ ] `memory.suggest_edges: true` with the hub's model reachable: suggestions appear, are drawn dashed, and stay out of briefs until confirmed.
13
+ - [ ] Dashboard Memory section and Long-term tasks tab in a browser, light and dark, at phone width.
14
+ - [ ] AC11 arms on a bench project (`--memory off`, `claude-mem`, `native`), 5 repeats each, and two weeks of research records with `briefs`.
15
+
16
+ ## Office view (#264, phases 1-4)
17
+
18
+ Not run live yet (unverified). Phases 1-4 ship the office with its Off/Flat/
19
+ Isometric control: snapshot-driven motion (card moves, message arcs, delivery
20
+ marks, the busy latch, the settle rule), the optional turn/checking/links
21
+ snapshot fields (exact task bubble, check-running mark, finishing-a-turn,
22
+ warning lines), and the isometric projection of the same model.
23
+ `test/office-model.test.ts`, `test/office-view.test.ts`,
24
+ `test/tasks.test.ts` and `test/daemon.test.ts` cover the model, the daemon
25
+ fields, the cookie, the CSP cleanliness, the motion wiring, the settle rule and
26
+ the projection (same focus order and names as Flat) against fakes, but no
27
+ browser was opened.
28
+ The live leg: `ahub up` on a scratch project with two agents working, `ahub ui`,
29
+ set the Office View control to Flat and to Isometric. Check the scene in both
30
+ projections, in both themes and at phone
31
+ width with the browser console open (no CSP violations), that cards glide between
32
+ rooms and desks as tasks change state, that arcs and marks fade after about ten
33
+ seconds, that desks and cards are focusable with sensible names in the same
34
+ order under both projections, that activating
35
+ one scrolls to and highlights the matching list row, that reduced motion gives
36
+ static positions, and that the page weight stays within the 30 KB budget of the
37
+ issue. Record the look here when performed.
38
+
39
+ ## Add-on arms and fingerprints (#248)
40
+
41
+ Not run yet (2026-10-12). Source and fakes cover the fingerprint, the arm check and the report (`test/tooling.test.ts`, `test/bench.test.ts`, `test/research.test.ts`).
42
+
43
+ - [ ] Live fingerprint: `ahub claude` and `ahub codex` attached on the development machine, `events.jsonl` shows one `tooling` event per attach with claude-mem, ponytail, ripwire and dot-admit as installed.
44
+ - [ ] Arms on a bench project for each of claude-mem, ponytail and ripwire: `all-on`, `<tool>-off`, `all-off`, 5 repeats each, interleaved and with a randomized task order (docs/bench.md, Add-on arms); then `ahub bench compare`.
45
+ - [ ] Field data: `research.enabled` on this repository for at least two weeks, then `ahub research addons`.
46
+ - [ ] Update `docs/addons/*.md` from the results.
47
+
5
48
  ## Settings from the dashboard and the terminal (#269, part 1)
6
49
 
7
50
  Not run live yet (unverified). `test/settings.test.ts` drives a real daemon, its
@@ -1548,3 +1591,242 @@ In the console run `status --all`, `queue list`, `queue show <id>`, `turns`, `bu
1548
1591
  run `ahub projects`, `ahub doctor --orphans` and `ahub models status` in the terminal outside the console. Status's informational ids can be compared with `status --full`.
1549
1592
  Confirm JSON output stays plain under `--color=always`. Record the exact head and visual verdict here after the owner performs this leg.
1550
1593
 
1594
+
1595
+ ## Live roster return (#315)
1596
+
1597
+ - Codex 0.146.0: run without a model turn against the real native app-server and
1598
+ hub proxy. The TUI reached attached/idle with zero input/output tokens; removal
1599
+ closed its socket with 4000, and it printed the off-roster reason and exited 1.
1600
+ Re-adding left the preserved proxy/app-server unattached. A person must relaunch
1601
+ with `ahub codex resume <thread-id>` (or the resume picker) after adding it back. No tool
1602
+ update or model prompt was run. Actual native resume after the exit is not
1603
+ verified: the follow-up no-turn probe was admission-deferred with exit 75
1604
+ before starting, and was not bypassed or retried. The scripted proxy test sends
1605
+ thread/resume with the same thread id; this is separate transport evidence.
1606
+ - Pi native TUI: not run. Resource admission deferred the live probe with exit
1607
+ 75; it was not bypassed. The scripted authenticated bridge tests separately
1608
+ verify retained owner identity, idle/busy return and queue delivery.
1609
+
1610
+
1611
+ ## Kimi TUI pull mode (#316), not run live
1612
+
1613
+ - Kimi Code 2.1.1 source preflight: trusted ACP workspaces read the project MCP
1614
+ file, and the model request path ignores MCP initialize instructions. This is
1615
+ source evidence, not a live session observation.
1616
+ - In a disposable initialized project, run `ahub kimi --print-command`, confirm
1617
+ no file changed, then `ahub kimi`. Observe the folder-trust prompt naming the
1618
+ server and confirm the tool list includes hub_inbox and hub_send. Unverified.
1619
+ - With another peer attached, queue chat, an explicitly owned task and a named
1620
+ review. Ask the model to call hub_inbox, then hub_send; confirm one read and one
1621
+ reply per item, public PII stubs only, and last-read status. Confirm managed
1622
+ AGENTS instructions and tool descriptions are available; do not claim MCP
1623
+ initialize instructions are model-visible. Unverified.
1624
+ - End the TUI, start `ahub kimi --mode headless`, and inspect that only the project
1625
+ hub entry was removed before ACP starts. Confirm no second baseline hub MCP
1626
+ process in a trusted project. Stop ACP and return to a new TUI, preserving queued
1627
+ work and task ownership. Unverified.
1628
+
1629
+ ## Initial SDLC gates (#257)
1630
+
1631
+ Unverified: a live repository cycle through merge/release under advise. Fake-gh and task fixture checks are source/unit evidence only. Custom lifecycle gates and full release-readiness presentation remain pending; no live cycle or automatic merge is claimed.
1632
+ ## Qwen Code 0.25.0 production peer (#256)
1633
+
1634
+ Unverified: real provider handshake, a native model/tool turn, context occupancy,
1635
+ owned stop/recovery and the first authoritative quota refusal. Fake ACP tests are
1636
+ separate evidence. CLI --version returned 0.25.0 locally but installed package and
1637
+ ACP source returned 0.24.1; this drift is not a native readiness claim. Select
1638
+ roster.qwen and a verified qwen_cmd before the live leg. Confirm mode ids and
1639
+ visible boundaries, inbox/tool approval, stop and exact-head results, then record
1640
+ the native version and observed outcome here. No hub-driven Qwen TUI is offered.
1641
+
1642
+ Qwen recovery source/fake proof: saved ids pass through the driver and CLI to ACP session/load, and the crash loader restores the recorded id/model. Actual native/provider recovery remains unverified.
1643
+
1644
+ ## Jcode 0.94.0 peer (#332)
1645
+
1646
+ Source/fixture proof is recorded in verification/2026-10-11-jcode-peer-contract.md. Unverified: real provider/model, native project MCP discovery and hub-tool receipt, native tool policy and stop/child teardown. Native automatic restoration is withheld because the pinned ACP load does not prove the id. No benchmark comparison or default replacement ran.
1647
+
1648
+
1649
+ ## Project board (#263)
1650
+
1651
+ - Source model and isolated DOM/daemon regressions cover five columns, ready/wait
1652
+ reasons, public stubs, owner/reviewer markers, keyboard buttons, assignment and
1653
+ staging authority, stale/foreign gesture fences and legacy capability refusal.
1654
+ - Current source checks are pending for this draft; browser visual verification
1655
+ at desktop/phone widths and real peer permission/state readback are unverified.
1656
+ - Native planner grooming into two releases, planned/actual date measurement and
1657
+ GitHub import remain unverified or unimplemented in later source slices. No
1658
+ release, installation, account experiment or live activation is implied.
1659
+
1660
+
1661
+ ## Planning and release controls (#263)
1662
+
1663
+ Source/fixture coverage is in planning.test.ts and planning-surfaces.test.ts:
1664
+ legacy/restart persistence, revision/role/pin/person order/frozen scope/undo/ship,
1665
+ actual task dates, CLI marker authority, public PII and research reset identities.
1666
+ All current platform and seeded checks remain pending. Desktop/phone rendering and
1667
+ native planner grooming into two releases are unverified; no real account run,
1668
+ tag, publish, install or live activation was performed.
1669
+
1670
+ ## Office stack merge review (#355, #357, #358, #360)
1671
+
1672
+ Current-main integration and review corrections are being verified on an owned
1673
+ merge worktree. Source regressions cover the visible Off selector, filtered-card
1674
+ activation, card/desk sibling layers, sparse sticky bounds, Work/rework overflow,
1675
+ reduced-motion/settled cleanup, expired arcs, explicit unattributed turn omission,
1676
+ conflict priority under the cap and distinct parallel warning coordinates.
1677
+ Platform/full206-guard proof is pending. Desktop/phone/real-peer visual readback
1678
+ remains unverified; no account, release, installation or live activation ran.
1679
+
1680
+
1681
+ Dependency/reservation grooming regression covers direct/transitive cycles,
1682
+ missing or duplicate ids, off-roster reservations, atomic rejection and undo,
1683
+ and started-task refusal. Current source/fixture proof remains pending.
1684
+
1685
+
1686
+ Planner pull source regressions cover slot capacity, role and revision, P0/person
1687
+ reservation floors, post-screen races, offer-time capacity changes, dependency
1688
+ approval and pin refusal, pending-only undo, bounded integer settings/local
1689
+ store and actual HTTP/tool/status projections. Current full proof and native
1690
+ planner/two-release/desktop/phone readback remain unverified.
1691
+
1692
+
1693
+ Split fixtures cover atomic callbacks/rollback, earlier-part DAGs, cycle refusal,
1694
+ changed/referenced children, private phase inheritance, P0 prerequisites and
1695
+ actual tool/CLI/authenticated HTTP undo. Full current source/native/visual proof
1696
+ remains pending; the inherited started fixture exception is still unresolved.
1697
+
1698
+
1699
+ GitHub intake fixtures cover fixed read-only selection, page and identity
1700
+ validation, persistent/restart/after-screen dedupe, PII source projection,
1701
+ confirmed partial progress and person CLI classification. Current full and
1702
+ native/visual evidence remain pending. No real-account import ran.
1703
+
1704
+
1705
+ Remaining board projection fixtures exercise shared column mapping/waits and
1706
+ actual CLI release/JSON filters with peer backlog floors. Cut flags derive
1707
+ structured approval history and retain missing approval/cut as unknown. Current
1708
+ full source/phone/native proof remains pending.
1709
+ ## Console attention (#280, phase 1)
1710
+
1711
+ Automated coverage targets request ordering, read-only navigation/modal ownership,
1712
+ fixed footer/cursor cells at 80/99/100/120 columns and 24/40 rows, allowlisted
1713
+ structural projection, configuration precedence, deadline-only blink and plain
1714
+ message acknowledgement. Platform/full seeded gates are pending. Light/dark
1715
+ terminal, tmux, colour-off and actual terminal glyph readbacks are unverified;
1716
+ this phase renders ASCII only. No native account or live hub was activated.
1717
+
1718
+ ## Global attention status and CLI (#280, phase 3 in progress)
1719
+
1720
+ Source/fixture checks target person review, offline ownership, unknown/absent
1721
+ recovery runners, status privacy/role separation, signed file ownership and CLI
1722
+ output without a token or connection. Full immutable-head platform/seed/review
1723
+ gates remain pending. Native light/dark terminal, tmux, glyph and account readback
1724
+ is unverified; no release, installation or live hub activation ran.
1725
+
1726
+ ## Attention status follow-up (#280)
1727
+
1728
+ Regression fixtures cover reserved pseudo-peer ownership, preserved person
1729
+ reviews, selected SQL columns and actual status reads with unreadable unrelated
1730
+ JSON payloads. The focused tests pass; immutable-head platform/255-guard proof
1731
+ is pending. Native/account/artwork/dashboard legs remain unverified.
1732
+
1733
+ Latest planner source fixes have an actual focused result of 11 pass/0 fail:
1734
+ reservation normalization/unsupported-id rejection and returned-work notices.
1735
+ The previous full262 guard job reached its 10-minute CI limit; the job cap is
1736
+ now20 minutes, with all named assertion and per-test/watchdog limits unchanged.
1737
+ Current immutable-head265 proof is pending.
1738
+
1739
+ The actual queued planner notice regression and prior grooming/conductor group
1740
+ passed23/0 with235 assertions. The bus pull omitted a stale batch and the next
1741
+ notice contained only the remaining backlog id. Current full gates remain
1742
+ pending; no native grooming or live-account claim.
1743
+
1744
+ Per-recipient retry and overflow source fixes passed26/0 with255 assertions
1745
+ once the owner approved the notice-only fixture. A separate no-worker diagnostic
1746
+ verified first2 ids, one consumed copy, stale0, retry1 to Pi, repeated Claude0.
1747
+ Roster, per-recipient retry and overflow guards each have actual isolated green
1748
+ -> named assertion detected proof. The owner also approved realPath normalization
1749
+ in three CLI fixtures, retaining every earlier assertion and identity validation.
1750
+ The descendant integration group passed53/0 with368 assertions, including real
1751
+ fake-account CLI pull/split/import and five-peer notice baselines. Full current
1752
+ platform/seed/review and native account verification remain pending.
1753
+
1754
+ ## Approved character source fixtures (#280, phase 2)
1755
+
1756
+ The original STAIx reference and four existing Higgsfield concepts were inspected;
1757
+ 210 hand-reduced frames satisfy the literal glyph and geometry limits. Actual
1758
+ console fixtures exercise all five choices plus off, full scroll geometry,
1759
+ resize fallback, keyboard-modal ownership, prompt preservation and unchanged
1760
+ config bytes. The focused console/config/geometry/runtime group passed138/0
1761
+ with23808 assertions. Immutable-head platform/seed/review proof is pending.
1762
+ Light/dark physical terminal, tmux and ambiguous-wide block glyphs are unverified.
1763
+
1764
+ ## Dashboard character (#280, phase 4 in progress)
1765
+
1766
+ Source fixtures cover shared body-free review projection, selected configuration,
1767
+ status-input separation, bounded SVG pixels, unchanged-snapshot DOM writes,
1768
+ exact-row navigation, missing-row guidance and stale-navigation refusal. Existing
1769
+ dashboard authentication/CSP/page-size and Office regressions are retained.
1770
+ Current full platform, mutation, browser, mobile, light/dark and reduced-motion
1771
+ proof is pending. Native terminal/tmux/account legs remain unverified.
1772
+
1773
+ Actual source-only Ego Chromium QA at b54b7c6c exercised STAIx and all four
1774
+ selected alternatives. Screenshots were opened and inspected at390x844 and
1775
+ 1440x1000 in light/dark projections: document widths matched, Enter on the
1776
+ review control focused exact task4, and no action callback ran. Reduced motion
1777
+ reported no animation, open pose opacity1 and blink pose opacity0. The task
1778
+ space finished and the admitted helper exited0. This is fixture/browser proof,
1779
+ not a native account or production runtime claim. Served bytes compared against
1780
+ phase2 with the same upstream main:146871 before,164034 after (+17163).
1781
+ The focused production-boundary correction group passed35/0 (145589 assertions);
1782
+ current full platform/seed/review proof remains pending.
1783
+ The expanded-footer follow-up group passed7/0 with6687 assertions: primary
1784
+ stream rows survive alternate panels and are cleared before queued events return;
1785
+ expired notices restore the selected approval id and expiry. No earlier assertion
1786
+ was removed. Native terminal/tmux proof and final full gates remain pending.
1787
+
1788
+ After the optional dashboard title initializer was isolated from missing DOM
1789
+ capabilities, the unchanged Settings/role/Office regressions and new pet suite
1790
+ passed61/0 with139938 assertions. This fixes the full Linux gate's three helper
1791
+ initialization failures in production code; final platform/seed proof is pending.
1792
+
1793
+ Dashboard blink now requires a live approval item, not merely waiting state
1794
+ (which also includes pending defaults). The actual pet suite passed6/0 with
1795
+ 138742 assertions across defaults, live approvals, expired approvals and blink-off;
1796
+ a mutation guard covers this distinction. Full current-head proof is pending.
1797
+ Line-size console faces now honor the resolved ASCII/block selection, with the
1798
+ locale fallback retained and ASCII/CLI defaults unchanged. Actual line glyph,
1799
+ geometry, modal and runtime regression group passed19/0 with7165 assertions.
1800
+ All five faces stayed100 cells wide without colour escapes. Full gates pending.
1801
+
1802
+ The first final265-guard run found a surviving line-glyph seed: shipped ASCII
1803
+ and block line faces intentionally have identical bytes. Added a separate
1804
+ observable catalog fixture, restored in finally, retaining every earlier assertion.
1805
+ Local execution of this additional case is admission-deferred, not a pass;
1806
+ current immutable-head full platform/seed proof is pending.
1807
+
1808
+ Lowercase review eyes retain a distinct pixel mask, and Gyul leaf pixels use
1809
+ the defined amber attention tone in light/dark/system themes. The actual pet
1810
+ suite passed7/0 with138010 assertions across all five characters. Two mutation
1811
+ guards cover case preservation and the existing theme variable. Final full
1812
+ platform/seed/review and updated browser readback remain pending.
1813
+
1814
+ The review-eye mask guard has actual admitted isolated green -> named assertion
1815
+ failure proof. Leaf-tone coverage now checks the bounded CSS fill value in a
1816
+ separate test while retaining the earlier HTML assertions: printing the entire
1817
+ HTML on failure contained unrelated runtime diagnostic strings, so the strict
1818
+ classifier correctly rejected the previous detection. The bounded leaf test now
1819
+ also has actual green -> named assertion detected proof. Full final gates pending.
1820
+ Final review found active notices suppressed by expanded footers. Source now
1821
+ shows them in panel body or once in the local stream, away from the character.
1822
+ Added output/expiry/prompt geometry regressions and two guards. First local
1823
+ execution was admission-deferred; final actual proof remains pending.
1824
+
1825
+
1826
+ ## Project board phone-width fixture (2026-10-13)
1827
+
1828
+ The current source fixture at 6d311a51dccd41d3703079175cac65a487189b15 used the normal loopback ticket/session/CSP path with synthetic data and refused production changes. Source board desktop/390px light/dark, release-cut text, pending WIP 2/0/inherit and Save payload, and date-control containment were verified. All nine PNGs were viewed. The refresh exposed and fixed phone date-field clipping that document width alone missed. The same approved Space 44 was reused and finished once; its server was stopped. Receipt: [phone-width verification](verification/2026-10-13-board-phone.md).
1829
+
1830
+ This supersedes earlier phone-fixture pending statements only for this source. The old 1bbced04 captures remain historical; no later byte-identity premise is used. Native planner/two-release, accounts, model ingestion and measured effects remain unverified.
1831
+
1832
+ The later bounded release-audit preview text is verified by DOM tests, not by a refreshed phone capture. The6d311a51 PNGs remain evidence for their pinned source; see the later-audit note in the phone verification report.