@staix/agent-hub 0.12.23 → 0.12.25

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 (161) hide show
  1. package/CHANGELOG.md +109 -1
  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 +10 -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 +8 -0
  15. package/docs/agent-notes/tests.md +5 -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 +666 -19
  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 +2 -2
  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 +288 -0
  32. package/docs/specs/2026-09-19-agent-hub-design.md +633 -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/verification/2026-10-14-0.12.24-audit.md +123 -0
  43. package/docs/verification/2026-10-14-0.12.25.md +27 -0
  44. package/docs/verified.json +22 -13
  45. package/package.json +2 -1
  46. package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
  47. package/plugins/agent-hub/ROLE-NOTICE.md +26 -0
  48. package/plugins/agent-hub/server.js +1175 -339
  49. package/scripts/check-docs.mjs +129 -0
  50. package/src/adapters/acp.ts +112 -13
  51. package/src/adapters/claude-channel.ts +48 -11
  52. package/src/adapters/codex-appserver.ts +11 -0
  53. package/src/adapters/jcode.ts +110 -0
  54. package/src/adapters/local-worker.ts +10 -7
  55. package/src/adapters/pi.ts +171 -23
  56. package/src/cli/attention.ts +60 -0
  57. package/src/cli/bench.ts +24 -5
  58. package/src/cli/board-read.ts +12 -0
  59. package/src/cli/console-state.ts +103 -17
  60. package/src/cli/console.ts +54 -8
  61. package/src/cli/facts-hook.ts +12 -4
  62. package/src/cli/help.ts +35 -9
  63. package/src/cli/identity.ts +18 -7
  64. package/src/cli/init.ts +48 -10
  65. package/src/cli/jcode-mcp.ts +58 -0
  66. package/src/cli/kimi-mcp.ts +53 -0
  67. package/src/cli/launch.ts +16 -1
  68. package/src/cli/main.ts +392 -57
  69. package/src/cli/memory.ts +193 -0
  70. package/src/cli/output.ts +45 -4
  71. package/src/cli/pet-config.ts +1 -0
  72. package/src/cli/pet.ts +83 -0
  73. package/src/cli/preview.ts +38 -5
  74. package/src/cli/status-lines.ts +1 -1
  75. package/src/cli/tail-render.ts +1 -0
  76. package/src/cli/upgrade-runtime.ts +32 -3
  77. package/src/cli/watch.ts +31 -0
  78. package/src/hub/activity.ts +53 -0
  79. package/src/hub/ask.ts +10 -5
  80. package/src/hub/bench.ts +10 -3
  81. package/src/hub/board.ts +222 -16
  82. package/src/hub/bus.ts +48 -9
  83. package/src/hub/citations.ts +7 -0
  84. package/src/hub/conductor.ts +12 -7
  85. package/src/hub/config-trust.ts +4 -2
  86. package/src/hub/crash.ts +9 -0
  87. package/src/hub/daemon.ts +914 -120
  88. package/src/hub/delivery-journal.ts +5 -0
  89. package/src/hub/envelope.ts +1 -1
  90. package/src/hub/events.ts +12 -2
  91. package/src/hub/facts.ts +26 -7
  92. package/src/hub/git.ts +8 -2
  93. package/src/hub/github-import.ts +28 -0
  94. package/src/hub/hub-tools.ts +49 -10
  95. package/src/hub/inference.ts +1 -1
  96. package/src/hub/lifecycle-schema.ts +17 -0
  97. package/src/hub/listen.ts +15 -0
  98. package/src/hub/manager.ts +12 -5
  99. package/src/hub/path-policy.ts +115 -0
  100. package/src/hub/peer-catalog.ts +28 -0
  101. package/src/hub/permission-mode.ts +19 -5
  102. package/src/hub/planning.ts +70 -0
  103. package/src/hub/profiles.ts +74 -0
  104. package/src/hub/projected-diff.ts +73 -0
  105. package/src/hub/projection-exec.ts +24 -0
  106. package/src/hub/research.ts +144 -21
  107. package/src/hub/roles.ts +123 -0
  108. package/src/hub/roster.ts +23 -0
  109. package/src/hub/routing.ts +18 -5
  110. package/src/hub/sdlc-queue.ts +112 -0
  111. package/src/hub/sdlc-release.ts +125 -0
  112. package/src/hub/sdlc.ts +250 -0
  113. package/src/hub/settings.ts +34 -15
  114. package/src/hub/shipped-roles.ts +25 -0
  115. package/src/hub/snapshots.ts +89 -15
  116. package/src/hub/start-mode.ts +7 -5
  117. package/src/hub/supervision.ts +1 -0
  118. package/src/hub/task-sweep.ts +1 -1
  119. package/src/hub/tasks.ts +905 -89
  120. package/src/hub/text-projection.ts +151 -0
  121. package/src/hub/tooling.ts +170 -0
  122. package/src/hub/ui.ts +16 -2
  123. package/src/hub/workflow.ts +71 -0
  124. package/src/local/sandbox.ts +6 -4
  125. package/src/local/tools.ts +11 -6
  126. package/src/memory/brief.ts +28 -14
  127. package/src/memory/import.ts +55 -0
  128. package/src/memory/recall.ts +84 -0
  129. package/src/memory/store.ts +757 -0
  130. package/src/memory/sync.ts +145 -0
  131. package/src/pet/NOTICE.md +10 -0
  132. package/src/pet/characters.ts +1438 -0
  133. package/src/pet/config.ts +31 -0
  134. package/src/pet/frame.ts +17 -0
  135. package/src/pet/pixels.ts +28 -0
  136. package/src/pi/extension.ts +40 -5
  137. package/src/role-text.d.ts +1 -0
  138. package/src/ui/index.html +843 -46
  139. package/src/ui/needs.ts +58 -0
  140. package/src/ui/office-model.ts +440 -0
  141. package/src/ui/peer-palette.ts +16 -0
  142. package/src/ui/task-board.ts +49 -0
  143. package/src/ui/task-progress.ts +5 -1
  144. package/templates/AGENTS.block.md +3 -2
  145. package/templates/config.json +5 -1
  146. package/templates/profiles/dev.json +22 -0
  147. package/templates/profiles/general.json +26 -0
  148. package/templates/profiles/research.json +57 -0
  149. package/templates/profiles/writing.json +28 -0
  150. package/templates/roles/NOTICE.md +26 -0
  151. package/templates/roles/dev/backend-engineer.md +26 -0
  152. package/templates/roles/dev/code-reviewer.md +26 -0
  153. package/templates/roles/dev/frontend-engineer.md +26 -0
  154. package/templates/roles/dev/security-reviewer.md +26 -0
  155. package/templates/roles/dev/software-architect.md +26 -0
  156. package/templates/roles/dev/test-engineer.md +26 -0
  157. package/templates/roles/research/analyst.md +26 -0
  158. package/templates/roles/research/fact-checker.md +26 -0
  159. package/templates/roles/research/research-lead.md +26 -0
  160. package/templates/roles/research/researcher.md +26 -0
  161. package/templates/roles/research/statistician.md +26 -0
@@ -0,0 +1,186 @@
1
+ # Remaining implementation plan and issue audit
2
+
3
+ ## Scope and evidence snapshot
4
+
5
+ - Owner request: audit all open issues, close completed work, correct partial work, plan the remaining implementation and retain the research track with a research label.
6
+ - Repository: STAIxBWLB/agent-hub. Source baseline: main 7759ee8a3c5471e434ea6e0a7b73596a96bdf451, 2026-10-12 KST. The intake contains 27 open issues and one ready open PR, #346.
7
+ - Nineteen delivery PRs have merged since the #324 intake: #325, #326, #328, #329, #330, #331, #333, #334, #335, #336, #337, #338, #339, #340, #341, #342, #343, #344 and #345. Do not equate source merges with release, installation or native acceptance.
8
+ - Solo implementation continues under the existing owner constraint. No ahub coordination, delegated implementers, release, installation or live hub activation is part of this audit.
9
+ - Repository issue bodies remain the acceptance contracts. This document orders their remaining slices; it does not replace their original criteria or authorize new research experiments.
10
+ - Full vault enrichment is skipped for this repository-local audit: GitHub contracts, source and verification receipts resolve the scope without a person or institution ambiguity.
11
+
12
+ ## Phase 0: documentation and API discovery
13
+
14
+ Read the applicable area notes before editing. Read every docs/agent-notes file before editing daemon.ts, main.ts or launch.ts. Re-read the issue and current source before each slice; this snapshot will drift.
15
+
16
+ | Existing boundary | Confirmed source or pattern | Use in later work |
17
+ | --- | --- | --- |
18
+ | Task mutations | src/hub/tasks.ts, Board.propose/update in src/hub/board.ts | Extend Tasks, then persist; never mutate Board from an adapter, tool or CLI. |
19
+ | Lifecycle | sdlcConfig, sdlcReceipt, readSdlcPr in src/hub/sdlc.ts; src/hub/workflow.ts; test/sdlc.test.ts and test/workflow.test.ts | Retain exact-head readbacks, bounded receipt claims and existing phase ownership. Custom stage definitions currently refuse. |
20
+ | Profiles | projectProfile, profileClass in src/hub/profiles.ts; docs/profiles.md; test/profiles.test.ts | Reuse base-class mapping. PR #346 adds resolveProfile/mergeProfileOverrides; confirm its merged status before using those APIs. |
21
+ | Roles | loadRoleCatalog, catalogAssignments, selectedRoles, catalogSection in src/hub/roles.ts; docs/roles.md | Guidance adds no authority. Reuse person settings and original proposal identity. |
22
+ | Data policy | docs/data-policy.md; existing declared-path policy and local/Pi managed-tool tests | Extend one matcher, preserving lexical/real-path, alias and hardlink defenses. |
23
+ | Document projection | src/hub/text-projection.ts, projection-exec.ts; docs/text-projection.md; test/projection-surfaces.test.ts | Bounded read-only conversion, scoped historical blobs and sanitized previews. |
24
+ | Shadow Git | docs/profiles.md; test/shadow-repo.test.ts, shadow-cli.test.ts, shadow-daemon.test.ts | Explicit opt-in, protected bare metadata, no preview HEAD/index writes. |
25
+ | Assignment | src/hub/routing.ts assign and route explain | One pure decision for execution policy and explanations. |
26
+ | Evidence and memory | src/hub/research.ts, src/memory/client.ts, brief.ts, capture.ts, src/hub/ask.ts | Keep event identities, unknown observations, fail-open memory and PII exclusion. |
27
+ | Native peers | docs/agent-notes/adapters.md; test/qwen-peer.test.ts; docs/verification/2026-10-11-jcode-peer-contract.md | Per-version capability and identity proof; no invented permission mode or restoration claim. |
28
+ | Dashboard | src/hub/ui.ts and current settings/role controls | Preserve loopback, Origin refusal, CSP, keyboard access and existing public projections. |
29
+ | Verification | docs/agent-notes/tests.md, scripts/check.sh, scripts/seeded-check.ts | Original assertion green, mutation assertion fails; guards run sequentially. |
30
+
31
+ Allowed APIs are the existing names above and the source confirmed at the start of a slice. Proposed modules and commands below require a spec amendment before implementation; their appearance in this plan is not proof they already exist.
32
+
33
+ ## Audit disposition of every open issue
34
+
35
+ | Issue | Disposition | Remaining closure evidence |
36
+ | --- | --- | --- |
37
+ | #1 | Keep open, native infrastructure | Authorized off-campus Access leg and natural attached Codex budget pause; never manufacture quota pressure. |
38
+ | #8 | Keep open, research | Normal-use overlap count, conflict attribution and owner decision; review around 2026-10-14, extend if usage is insufficient. |
39
+ | #30 | Keep open, research tracker; correct stale maturity checkboxes | L1-L5 and measured T1-T6, with separate research gates. #185-#189 are already closed. |
40
+ | #41 | Keep open, research | Capability-led isolated transaction, quiescence, fenced two-part resolution, fault injection and actual supported native readback. |
41
+ | #42 | Keep open, research | Versioned executable commitments and all five preregistered pilot arms after #41. |
42
+ | #43 | Keep open, research | Documented development/held-out dataset, predictor and regime outcomes after #42. |
43
+ | #44 | Keep open, research | Telemetry quality, trace replay, then optimizer/live week and review-routing comparison. |
44
+ | #45 | Keep open, research | Adapter observability profiles first, then lattice/model/protocol analysis. |
45
+ | #109 | Keep open, research | Current-version routing-time calibration and held-out errors; automatic rerouting remains gated. |
46
+ | #198 | Keep open, research measurement | Actual PII model recall against fixed 0.90 bound, precision and unknown rate; existing screen is shipped. |
47
+ | #199 | Keep open, research measurement | Mixed Pi/digest workload wait-time comparison; existing load/cooldown source is shipped and absent threshold stays off. |
48
+ | #248 | Keep open, research | Tooling fingerprints, controlled arms, intervals and adopt/optional/drop decisions. |
49
+ | #252 | Correct stale status; keep open, research measurement | GSD analysis and optional gsd-lite are merged; default versus gsd-lite measurement remains. |
50
+ | #256 | Close completed optional implementation after transfer to #273 | AC3 allows explicit native unverified. Preserve identity/provider/tool/stop/recovery/quota obligations in #273; no default replacement. |
51
+ | #257 | Correct partial status; keep open | Custom lifecycle schema, full merge/release readiness and actual advise cycle. Built-in gates/checklists already shipped. |
52
+ | #258 | Keep open | Store/tiers/graph/retrieval, private sync/tombstones/leases, dashboard, import and controlled measurement. |
53
+ | #259 | Correct partial checkboxes; keep open | Glob policy/Claude-grant interaction and PR #346 overrides. Native research-profile run remains explicitly unverified. |
54
+ | #263 | Keep open | Backlog state, person/planner mutations, releases/dates, board/legend and optional read-only GitHub import. |
55
+ | #264 | Keep open | Static Flat view, snapshot motion, optional ids, Isometric and backlog/release scene. |
56
+ | #266 | Keep open, mixed implementation/research | Native capability table, task execution policy, matrix/recommendation and evidence-led escalation. |
57
+ | #273 | Correct and expand owed native ledger; keep open | Dated actual receipts, including merged Kimi #328 and Qwen #331 follow-ups. |
58
+ | #280 | Keep open | Attention model/console line, selected artwork and variants, then status/dashboard. |
59
+ | #285 | Keep open | Owned Kimi wire usage, count windows, source-labelled budget surfaces; credential probe remains a separate decision. |
60
+ | #286 | Keep open | Watch is shipped; terminal-provider integration and gated Qwen dual-output TUI/native coverage remain. |
61
+ | #295 | Correct partial checkboxes; keep open | Reconcile original AC3 byte baseline and finish AC13 task-role board card after #263. Catalog/task/settings/session records already shipped. |
62
+ | #324 | Correct master status; keep open | This ordered backlog and per-slice source/native/research receipts. |
63
+ | #332 | Keep open | Jcode native project MCP tool receipt, remaining PII/native log proof and independently verified restored identity; current 0.94.0 cannot prove automatic restoration. |
64
+
65
+ Research label set: #8, #30, #41, #42, #43, #44, #45, #109, #198, #199, #248, #252 and #266. A research project profile (#259) and research role definitions (#295) are product features, not themselves experiments. #1 and #273 are native verification ledgers. Mixed #266 remains labelled research while its independently reviewable source slices can proceed.
66
+
67
+ ## Delivery sequence
68
+
69
+ Each numbered phase is a sequence of small PRs, not one large implementation branch. Work begins only from the current verified main. Preserve unrelated worktrees and unknown dirty work. Dependency arrows refer to completed source contracts, not assumed native success.
70
+
71
+ ### Phase 1: finish the active profile slice and data policy
72
+
73
+ - Scope: #259; open PR #346 project overrides, then bounded pii.paths/data.readonly glob matching and Claude scoped-grant interaction.
74
+ - PR #346 snapshot: head 384a222e77c74c9e37e6c238dd943da519a9e5aa, local full 2249/0 with check: OK, macOS and Linux platform checks successful after one limited Linux sidecar retry. The 133-guard job is still running at planning time. Both review findings are fixed/resolved. Do not merge before the complete exact-head receipt.
75
+ - Read docs/profiles.md, docs/data-policy.md, docs/agent-notes/tasks.md, local-worker.md, adapters.md and tests.md. Follow the existing resolved-profile propagation and path-policy tests.
76
+ - Specify accepted glob grammar, normalization, directory containment and limits before code; reject ambiguous/unbounded patterns. Use the same lexical/resolved matcher for private task classification, facts exclusion and managed write refusal. Unknown resolution remains conservative. A pattern cannot widen a protected grant.
77
+ - Verify unchanged default dev bytes; isolated shared/local overrides; custom alias/base persistence; disjoint document sections across different owners; all native/local tool schemas; glob symlink/case/parent/hardlink tests; no marker in events/memory; Claude grant refusal for protected paths.
78
+ - Exit: PR #346 merged with cleanup, then glob AC7 proved. Record native/model ingestion as unknown until actual receipts exist. Do not run a multi-agent research pilot as a source test.
79
+
80
+ ### Phase 2: lifecycle completion
81
+
82
+ - Scope: #257 and the remaining specification boundaries informed by #252.
83
+ - Read docs/sdlc.md, docs/gsd-collaboration-analysis.md, sdlc.ts, workflow.ts and their fake-gh suites. Reuse readSdlcPr, current head fences and existing reviewer/person ownership.
84
+ - Slice A: bounded custom stages, actors and named gates, with cycle/duplicate/unknown validation and versioned persistence. Amend the spec first. Keep built-in default bytes and mode off/advise/enforce semantics.
85
+ - Slice B: read-only merge ordering and release readiness: exact merged/head identities, required checks, unresolved requests/threads, docs stale/nonancestor status and owed native receipts. Every unavailable readback is unknown.
86
+ - Slice C: shared CLI/console/dashboard projections with actor, blocker and next action; no auto-advance, merge/release, capability grant or second writable plan store.
87
+ - Verify stale-head/late-read/reassignment races, missing check set, changes requested, custom gate cycle rejection, PII projection and old row compatibility. A fake GitHub is source evidence only.
88
+ - Exit: source criteria implemented. AC6 actual advise cycle through merge/release remains a separately owed native/operational gate. #252 comparison stays open; full bidirectional GSD import needs its own authority/import contract.
89
+
90
+ ### Phase 3: project board and role card completion
91
+
92
+ - Scope: #263, then #295 AC13 and AC3 baseline reconciliation.
93
+ - Read docs/agent-notes/tasks.md and daemon.md, current Tasks/Board/routing and role settings controls. Add mutations only through Tasks.
94
+ - Slice A: backlog state and validated promotion/demotion; prove backlog never routes, claims, offers, sweeps or escalates. Migrate legacy rows without rewriting history.
95
+ - Slice B: planner grooming, bounded split/pull, batched notices, pinned/frozen release fences, reason/history and undo. Refuse non-planners and preserve private stubs.
96
+ - Slice C: release create/allocate/freeze/ship and dates. Actual timestamps derive from history, not user input; ship requires all tasks approved or deliberately removed.
97
+ - Slice D: five-column dashboard, ready/waiting distinction, status-backed peer legend, keyboard equivalent for person drag actions, task-role card and optional idempotent read-only GitHub import.
98
+ - Reconcile #295 original 1cbbc57 baseline against the shipped d83cb8dd contract fixture before checking AC3. If an intentional contract amendment is needed, document the exact comparison and reason rather than changing the assertion silently.
99
+ - Verify all state transitions, undo, scope freezes, old rows, actor refusal, marker privacy, keyboard/phone layout and CSP/Origin headers. Use one shared palette and projection.
100
+ - Exit: board contracts and source role surfaces complete; an actual planner/two-release cycle remains unverified until separately run or explicitly recorded as unverified where allowed.
101
+
102
+ ### Phase 4: person attention and agent office views
103
+
104
+ - Scope: #280 console attention, #264 office, then their dashboard integrations after Phase 3.
105
+ - Read the full original visual contracts and existing console/dashboard models before frontend skills or assets. Use the approved design language and retain list/key paths.
106
+ - Attention slice A: pure needs model from existing approval/default/delivery/storage/message/budget/recovery states; plain console line, count, configuration and --no-pet. No daemon change.
107
+ - Attention slice B: mini/full and ascii/blocks STAI artwork with owner-selected alternatives and license/attribution. Unselected variants remain decisions; do not invent an asset adoption.
108
+ - Attention slice C: optional ids/counts in status and ahub pet commands, then inline SVG/dashboard title count. Never expose task/approval/message bodies beside the pet.
109
+ - Office slice A: officeModel, stable peer slots, static Flat SVG, Off default, keyboard/list highlighting, phone and theme proof; no scene actions.
110
+ - Office slice B: snapshot-triggered motion with reduced-motion static equivalent and settle rules; unchanged snapshots cause no DOM writes. No polling animation loop.
111
+ - Office slice C: bounded optional turn/checking/links id fields, old-page compatibility and no schema bump unless separately justified; then Isometric from the same model/focus order.
112
+ - Office slice D: backlog wall/release docks/planner desk after #263. Measure each served-page size delta against the 30 KB budget.
113
+ - Verify marker privacy, source-labelled attention counts, no outside/data requests, CSP unchanged, no inline handlers/style attributes, no-colour/phone/reduced-motion/keyboard behavior. Live browser/terminal looks remain separately recorded.
114
+
115
+ ### Phase 5: native memory foundations
116
+
117
+ - Scope: #258. This changes the current hub-does-not-own-a-memory-store architecture; amend spec decisions 9/10 before source changes.
118
+ - Read docs/agent-notes/local-worker.md, tasks.md, daemon.md, src/memory and ask.ts. Reuse privacy filtering and evidence-only answer identities; never include hub-model answers as fresh evidence.
119
+ - Slice A: bounded append-only long-term store, short-term expiry, approval promotion of decision/contract/fail only, deterministic refs/plan/path/issue graph and supersession-aware retrieval. Establish schema/identity/version/tombstone rules first.
120
+ - Slice B: memory CLI and CSP-local dashboard list/neighborhood/detail; incremental index equals rebuild. Suggested model edges stay excluded from briefs/ask until person-confirmed.
121
+ - Slice C: private-remote git sync with two simulated AGENTHUB_HOMEs, immutable segments, concurrent writes and forget propagation. Verify remote privacy; missing/unreadable remote fails open with one notice.
122
+ - Slice D: machine identity, long-term task leases, expiry/person force and explicit concurrent-claim conflict. A synchronized lease is not an atomic distributed lock; preserve uncertain ownership.
123
+ - Slice E: bounded claude-mem import and optional proposed edges, retaining provenance/privacy and confirmed authority. Do not duplicate or mutate the existing claude-mem database.
124
+ - Verify marker absence in store/index/remote, malformed/truncated segment recovery, supersession/linked fail ordering, replay equivalence, concurrent tombstones and lease conflicts.
125
+ - Exit: source contracts and simulated sync proven. AC11 memory-off/claude-mem/native-graph study stays research evidence, not a synthetic acceptance claim.
126
+
127
+ ### Phase 6: execution policy and source-labelled usage
128
+
129
+ - Scope: independently reviewable #266 source slices and #285 usage/budget surfaces.
130
+ - Read docs/agent-notes/adapters.md, budget.md, models.md and benchmarks.md, routing.ts, research.ts and existing ACP occupancy/wire boundaries.
131
+ - Policy slice A: source/version capability table for model and effort (launch/turn/none/unknown), then bounded per-task/role exec identity with planned/actual records. Unsupported changes refuse or remain visibly unavailable.
132
+ - Policy slice B: trusted policy configuration through the same assign decision as explain; planner overrides only inside the allowed set with a reason; no permission/sandbox changes.
133
+ - Policy slice C: bounded escalation ladder and reviewer risk rules, at most max_steps, unsupported steps recorded and ceiling sent to the person. No performance recommendation is auto-applied.
134
+ - Usage slice A: owned Kimi session wire reader with offsets/rotation/truncation/schema/index fences and sub-agent attribution. Read only usage.record fields; never retain prompt/tool bodies, paths or session ids in public events.
135
+ - Usage slice B: cache-excluded count-window function, fake-clock reset/pause/handoff, native/manual precedence and kind/source/age across budget/status/console/dashboard/doctor. Occupancy never becomes consumption.
136
+ - Usage slice C: optional OAuth quota probe stays off pending the original exact authorization; no tracked token or inferred credential use. Probe failure remains unknown.
137
+ - Verify unknown native cells, pure policy/explain equivalence, PII on-prem restriction, no policy-to-permission coupling, wire rotation/shrink/truncation markers, cache ceiling and old-client behavior.
138
+ - Exit: source policy and usage proved. #266 matrix/Pareto/recommendation quality and native small matrix remain research gates. #285 live source timing/provider quota remain #273 receipts.
139
+
140
+ ### Phase 7: remaining native adapter and watch follow-ups
141
+
142
+ - Scope: #286 and #332; #256 native obligations live in #273 after implementation closure.
143
+ - Reuse the shipped watch ring/console-only side channel and Qwen/jcode identity fences. Read docs/verification/2026-10-11-acp-watch-t0.md and 2026-10-11-jcode-peer-contract.md.
144
+ - Slice A: fixed-command terminal-provider integration for headless watch and peer-panel shortcut. No caller text, approval or command enters the watch scene.
145
+ - Slice B: Qwen dual-output TUI only after real T0 Q2-Q6 proof; fail/unknown retains explicit refusal. Kimi stays its shipped pull-only TUI, not watch-driven TUI control.
146
+ - Slice C: jcode-specific PII/marker/native log proof and project MCP tool-call receipt. Preserve foreign project entries, unmanaged policy, default-off roster and owned private daemon/socket.
147
+ - Jcode 0.94.0 native session/load does not echo actual restored identity. Do not implement guessed automatic recovery. Wait for a separately proven interface/upstream capability; controlled recovery refuses before effects and manual reopening stays explicit.
148
+ - Verify wrong runtime identity, foreign socket/override, stale entry, late native acknowledgement, owned process teardown and no new-conversation-as-restored claim. Native model/tool/stop/readback remains account-gated.
149
+ - Exit: independently implementable source fixes merged; real native receipts either recorded or still open in #273/#332/#286. No accounts or live instances are started by this plan.
150
+
151
+ ## Preserved research and measurement sequence
152
+
153
+ These items keep research labels and remain open. Existing issue-specific go-aheads, preregistration, real-account/resource requirements and study validity rules still apply; this planning request does not satisfy a missing experiment authorization.
154
+
155
+ | Sequence | Issue and required work | Dependencies / exit evidence |
156
+ | --- | --- | --- |
157
+ | R1 | #109 calibration and held-out routing-time prediction assessment | Current-version profile and sealed outcomes; no evaluator leakage or rerouting enablement from source alone. Reuse #329 controlled study as its recorded evidence, not proof of unrun criteria. |
158
+ | R2 | #45 T1 per-adapter observability/capability declarations | Version-specific tests and actual capability gaps; no exactly-once from snapshots or conversation revert alone. |
159
+ | R3 | #41 isolated workspace transactions | R2; supported effect scope/quiescence, durable resolution phases, separate workspace/native rollback readbacks and late-effect fault suite. |
160
+ | R4 | #42 executable commitments | R3; five complete preregistered regimes, target-bound validation/certificates and every requested attempt retained. |
161
+ | R5 | #43 headroom predictor/regime selection | R4; documented dataset, held-out AUROC and always-solo/always-team comparison. |
162
+ | R6 | #44 telemetry quality and trace-replay simulator, then optimizer | Can prepare independently of R3-R5; simulation error first, enough review outcomes, then actual live-week comparison. |
163
+ | R7 | #45 remaining lattice/status, protocol/TLA+ model and five-vendor analysis | Composition reflects the limiting member and #41 conditional guarantees. |
164
+ | R8 | #8 normal-use overlap measurement and owner decision | Review around 2026-10-14; low usage extends the window. It determines default isolation, not an opt-in #41 prerequisite. |
165
+ | R9 | #198 and #199 shipped-system evaluations | Actual authorized local/on-campus screen and mixed load, fixed recall bound 0.90, uncertainty/precision/wait outcomes; defects get follow-up source slices. |
166
+ | R10 | #252 gsd-lite, #248 add-ons, #258 memory and #266 model/effort comparisons | Sealed #251/#247 fingerprints, independent arms, failures/unknowns, effect sizes/intervals and inconclusive counts. No native adoption/default policy without data. |
167
+
168
+ #30 tracks measured targets T1-T6 and stays open. #1 and #273 retain all infrastructure/native legs, including conditions that cannot safely be manufactured. Research measurement may find a regression; preserve the result and create/fix the actual defect rather than adjusting the target or calling unknown zero.
169
+
170
+ ## Verification and completion contract
171
+
172
+ - Before heavy local work, read host pressure/current jobs and the resource policy, then use dot admission. One heavy job per repo across all worktrees. Exit 75 is a defer; wait or use already-authorized CI, never bypass or kill an unrelated job.
173
+ - Every source slice gets focused regression checks appropriate to its contract, typecheck, generated plugin rebuild when imported inputs/version change, full scripts/check.sh ending check: OK, exact-head Linux/macOS CI and sequential seeded guards. Preserve original test assertions; a test failure is repaired in source.
174
+ - Gate receipts name full source SHA, run URL, test/guard counts and outcomes. A rerun is an additional attempt, not deletion of the initial failure. Current PR #346's isolated sidecar failure and limited same-head retry remain in its receipt.
175
+ - Refresh current-head source review and resolve/answer every actionable thread. Before merge read gh pr view --comments and unresolved threads plus pending changes requested. Quota-skipped review is not evidence.
176
+ - After confirmed merge, fast-forward main, verify the merged tree, delete only the owned merged branch/worktree. Preserve any foreign/dirty checkout; do not force-remove it.
177
+ - Issue closure requires every original acceptance criterion completed, or its explicitly allowed unverified disposition. Transfer an implementation issue's still-owed native leg to a named open survivor before closing, with exact criteria and no loss of scope. Research issues are retained under the owner's instruction.
178
+ - A full release, installation, live hub activation and paid/account experiments are outside this audit. When separately authorized, use release merge commits, fresh/ancestor doc stamps, exact tag and actual installation/runtime readback. Never label code/CI as native success.
179
+ - Re-read all remaining issue states after each phase; update #324 and the canonical claude-mem work state with completed source, open research/native criteria and the next independent slice.
180
+
181
+ ## Immediate next actions
182
+
183
+ - Finish #346's 133-guard exact-head gate and fresh review readback; merge/clean only if all required checks pass.
184
+ - Implement #259 glob policy/Claude-grant slice, then #257 custom lifecycle and release-readiness slices.
185
+ - Proceed through board/roles, attention/office, memory and policy/usage phases in dependency order.
186
+ - Keep all research-labelled items open, and record native prerequisites as unknown rather than manufacturing live conditions.
@@ -0,0 +1,212 @@
1
+ ---
2
+ title: Office view of live agent work in the dashboard
3
+ date: 2026-10-12
4
+ project: agent-hub
5
+ status: phases 1-4 implemented (Flat and Isometric office with motion and turn/checking/link fields); phase 5 pending #263
6
+ issue: 264
7
+ ---
8
+
9
+ # Office view of live agent work in the dashboard
10
+
11
+ Issue #264. The dashboard shows lists; seeing "who is doing what, with whom,
12
+ right now" meant reading several of them. This spec adds an office view: a pure
13
+ model, one SVG renderer, and (in a later phase) two projections. Ideas only are
14
+ taken from agenttrail (e4ba2da) and Hermes3D (beb7629), both MIT; no code or
15
+ asset is copied.
16
+
17
+ ## Design (all phases)
18
+
19
+ - A pure, self-contained `officeModel(snapshot, previous, { cols })` in
20
+ `src/ui/office-model.ts` turns the snapshot into a scene description (desks,
21
+ rooms, cards, counts, marks, transitions) and is injected into the page by
22
+ `toString()` like `taskProgress`, before the CSP hashes are computed.
23
+ - The model is built by allowlist: peer states, queue counts and permission
24
+ modes; task ids, classes, states, owners, reviewers, deps and public titles;
25
+ approval counts by peer; budget pause readings. `env.body`, task detail,
26
+ approval titles, paths and symbols never enter (marker test).
27
+ - One renderer draws the model as inline SVG with `createElementNS`, from the
28
+ same `render(snapshot)` call as the lists, only when its signature changed.
29
+ No timer, no `requestAnimationFrame`, no request. Colours come from the
30
+ page's theme tokens through CSS classes; every state also carries a glyph
31
+ and a text label.
32
+ - An always-visible View control in the page header offers Off (the default), Flat, and in
33
+ phase 4 Isometric; the choice persists in the host-scoped `agent-hub-office`
34
+ cookie with the `agent-hub-theme` attributes and try/catch fallback (#246).
35
+ - Layout: stable desk slots (claude, codex, kimi, pi, local, then others by id;
36
+ sticky across snapshots via the previous scene, so a peer keeps its slot when
37
+ others come and go); rooms are the board columns in a fixed order; at most 8
38
+ cards per room then "+N more" (filters the task list to that state); the Done
39
+ shelf is a count; more than 12 desks shows "+N peers". `cols` comes from the
40
+ section width: rooms left to right when wide, stacked when narrow.
41
+ - Interaction: desks and cards are focusable SVG groups with `role="button"`
42
+ and accessible names; activation scrolls to and highlights the matching list
43
+ row, and a list row highlights its desk or card on focus and hover. The scene
44
+ performs no action and sends no request; the closed action list is unchanged.
45
+ - Room counts equal `taskProgress(tasks).counts` for the same snapshot (pinned
46
+ by a test, including randomized boards).
47
+
48
+ ## Phasing (per the issue)
49
+
50
+ 1. `officeModel` and the static Flat office: desks, states, rooms, cards,
51
+ counts, the view control, list highlighting. No daemon change. (This
52
+ document's implementation phase.)
53
+ 2. Motion from the snapshot: card moves, message arcs, delivery marks, the busy
54
+ latch, the settle rule. No daemon change.
55
+ 3. Optional snapshot fields `turn`, `checking`, `links` and what they draw.
56
+ 4. The Isometric projection of the same model.
57
+ 5. Backlog wall, release docks and the planner's desk, once #263 lands.
58
+
59
+ Phase 1 decisions within the spec:
60
+
61
+ - `previous` is the previous scene model, not the raw snapshot: sticky slots
62
+ and transitions both read from it, and `resetView` clears it so a project
63
+ switch starts fresh.
64
+ - The primary condition of a desk is the first of offline, paused, waiting on
65
+ approval, busy, idle; the raised-hand count, inbox tray, mode badge and break
66
+ sign are independent marks that combine freely with it.
67
+ - Work-floor cards sit at the owner's desk (at most 3, then "+N more" as text);
68
+ a card whose owner has no visible desk waits in the Work floor room. Tasks in
69
+ an unknown state are counted (`counts.unknown`) but placed nowhere.
70
+ - The busy bubble names the task only when the peer has exactly one
71
+ `in_progress` task; it is never guessed (phase 3 adds the exact `turn`
72
+ field).
73
+ - Transitions are computed as data in phase 1 (desks added/removed, cards
74
+ moved); they drive motion only from phase 2.
75
+
76
+ Phase 2 decisions within the spec:
77
+
78
+ - Motion is CSS only. Cards are persistent keyed SVG nodes positioned by CSSOM
79
+ `transform`, so a changed placement animates through a `transform` transition
80
+ (0.8 s); desks never move and are rebuilt in place when their content
81
+ changes. The busy glyph and the raised hand pulse (`opacity` keyframes); an
82
+ idle desk has no animation class. `prefers-reduced-motion: reduce` removes
83
+ all scene transitions and animations.
84
+ - Arcs, delivery marks and the busy latch are transient marks with an absolute
85
+ expiry timestamp in the model. The renderer draws them once with a keyframe
86
+ fade whose delay is computed at render time (hold, then fade over the final
87
+ second, `fill: forwards`), so "fade after 10 seconds" needs no timer; expired
88
+ nodes purge lazily on the next changed render or on their own animationend.
89
+ - The model's clock for arc expiry is the snapshot's own newest envelope
90
+ timestamp (`eventTime`), not wall time: an unchanged snapshot yields an
91
+ identical model at any wall time, so the signature guard still writes
92
+ nothing. Wall time enters only as `options.now` at the moment an event row is
93
+ first consumed (alert/latch horizons) and in the settle gap.
94
+ - Event rows are deduped by `seq` against `lastSeq`, so re-rendering the same
95
+ snapshot (for example after a task-filter change) draws nothing twice. The
96
+ first snapshot after load or a project switch consumes rows without drawing
97
+ them: no replay of history.
98
+ - The settle flag is carried unchanged while nothing moves, and recomputed when
99
+ a snapshot brings changes: gap over 3 s since the last change, or more than
100
+ 6 transitions (card moves, desk adds/removals, new marks) at once, jump
101
+ straight to final positions.
102
+ - Arc fan-out: an envelope with no `to` draws an arc to every visible desk; a
103
+ `from` that is not a peer (hub, console) starts at a fixed anchor point.
104
+ Delivery marks from `quiet` rows land on every named peer; `off_roster` rows
105
+ are not drawn (the mapping table names only overflow, undeliverable, stale
106
+ and quiet). Event `reason` strings are never copied into the model.
107
+
108
+ Phase 3 decisions within the spec:
109
+
110
+ - `status.peers[id].turn` is built in `uiSnapshot` from the daemon's `turns`
111
+ map as `{ since, task?, attribution }`. A private turn (a peer holding a PII
112
+ task) or an attribution flagged `pii` omits `task`; such a turn can exist
113
+ only for the in-process local worker, since the board refuses PII tasks to
114
+ any other owner.
115
+ - The exact busy bubble uses `turn.task` whenever present (even when the peer
116
+ has zero or several in_progress tasks, and even if the task meanwhile left
117
+ the board, then with a plain label). The phase-1 heuristic is the fallback
118
+ for an older daemon that sends no `turn`.
119
+ - `tasks[].checking` comes from `Tasks.isChecking` at snapshot time. A checking
120
+ task stays `in_progress`, so its card never moves; the mark is a glyph plus
121
+ an accessible-name note, not a state.
122
+ - `links[]` is assembled in `uiSnapshot`: overlap pairs from the new
123
+ `Tasks.overlapLinks()` (the board's own `overlapHits`, so `ahub route` and
124
+ the scene cannot drift) and `Tasks.cohortLinks()` (`Cohorts.list()`), plus
125
+ conflicts from a bounded (12) in-memory list the daemon fills where it
126
+ already emits `conflict` events, deduped by task pair and dropped once either
127
+ task leaves the open states. All three carry task and peer ids only; overlap
128
+ and cohort links exclude PII tasks through `overlapHits`/`formCohort`.
129
+ - The scene validates links down to the three kinds and their id lists (an
130
+ older or newer peer of the protocol that sends more is ignored), draws a
131
+ dashed line per consecutive desk pair with a kind/task-ids label, and treats
132
+ links as state: no fade, present while the link exists.
133
+ - `PROTOCOL` (16) and `EVENTS_SCHEMA` (1) are pinned by a test; the fields are
134
+ additive and optional both ways.
135
+
136
+ Phase 4 decisions within the spec:
137
+
138
+ - Isometric is a pure coordinate projection at the renderer, not a second
139
+ scene: `officeProject(x, y)` maps grid coordinates to (x - y) cos 30,
140
+ (x + y) sin 30 and every node is laid out upright in local coordinates and
141
+ positioned by its projected CSSOM transform. Desk and room tiles become
142
+ parallelogram polygons (the linear image of their rect); cards, text labels,
143
+ bubbles, marks and arc labels stay upright. No WebGL, no library, no new
144
+ route, no CSP change.
145
+ - The DOM is projection-independent: the same keyed nodes in the same order
146
+ with the same accessible names, so focus order is identical (AC7, tested by
147
+ comparing serialized tab order between Flat and Isometric). The viewBox is
148
+ the projected bounding box with a small margin; the SVG keeps `width: 100%`,
149
+ so phone width scales without horizontal page scroll.
150
+ - A projection switch repaints every node in place (the projection is part of
151
+ each reconcile signature) and is treated as a settle: positions jump, no
152
+ transform transition storms. Card moves under Isometric animate through the
153
+ same transform transition as Flat; reduced motion removes it all as before.
154
+ - Size accounting against the issue's 30 KB budget (page base 59,329 bytes at
155
+ phase 1 branch point): phase 1 +11,040, phase 2 +7,340, phase 3 +2,141,
156
+ phase 4 +1,704, art polish +3,559; final 89,113 bytes, +25,784 total,
157
+ inside the budget. The iso shelf's base skirt was dropped to stay under it.
158
+ - Art polish (2026-10-12): two reference concept images (a flat view and an
159
+ isometric view) were generated with Higgsfield (nano_banana_pro) and kept
160
+ outside the repo (scratchpad); they served as drawing references only. Per
161
+ this issue's "art made in code, with no image files" rule, nothing ships as
162
+ an image: no asset files, no CSP change, no new route. What was adopted:
163
+ outline-shape condition glyphs (pause bars, ring, filled dot, cross) and a
164
+ raised hand drawn as palm-and-fingers shapes, a person avatar per desk
165
+ (inside the flat tile; standing behind the iso desk), an extruded iso desk
166
+ (top plus two front legs), a name plate parallelogram on the iso desk's
167
+ front edge, the warm-accent (--amber) emphasis on a waiting desk, faint
168
+ wireframe iso room boxes with small-caps labels at the base, a Done shelf
169
+ cabinet (flat) and stacked boxes on a slab (iso) with the count kept as
170
+ text, two-column room cards with thin dividers, and arc arrowheads at the
171
+ target end.
172
+
173
+ ## Verification
174
+
175
+ - `test/office-model.test.ts`: mapping fixture, counts equality with
176
+ `taskProgress`, slot stability, transitions, caps, glyph/label coverage, the
177
+ marker test (no body, detail, approval title or PII text in the model);
178
+ phase 2: arcs, delivery marks and the busy latch from event rows, no replay
179
+ on the first snapshot, seq dedupe, arc expiry on the snapshot clock, and the
180
+ settle rule (first snapshot, gap, transition storm, flag stability);
181
+ phase 3: the exact bubble and its fallback, finishing-a-turn, the checking
182
+ mark, link validation, and markers in turn-adjacent data, check output and
183
+ conflict reasons never reaching the model.
184
+ - `test/office-view.test.ts`: injection and CSP cleanliness of the served page,
185
+ the cookie (default Off, persistence, blocked-cookie fallback), no
186
+ timer/request/colour literal in the scene code, reduced-motion and motion CSS
187
+ scans, no DOM write on an unchanged snapshot (counting fake document), focus
188
+ and activation highlighting, "+N more" filtering, `resetView` clearing;
189
+ phase 2: card moves keep their node and animate by transform, arcs/marks/
190
+ latch draw once with fade timing, departure fade purges on animationend;
191
+ phase 3: the exact bubble, finishing-a-turn line, check-running mark and
192
+ warning lines render.
193
+ - `test/tasks.test.ts`: `overlapLinks`/`cohortLinks` carry ids only and exclude
194
+ PII tasks. `test/daemon.test.ts`: `ui_snapshot` carries `turn`, `checking`
195
+ and overlap/cohort links against a real daemon, pins `PROTOCOL` (16) and
196
+ `EVENTS_SCHEMA` (1), and proves a PII task keeps its stub, refuses a
197
+ non-local owner and joins no link.
198
+ - The live browser look (two agents working, both themes, console open) is
199
+ recorded in `docs/smoke.md` as unverified for phase 1.
200
+
201
+
202
+ ## Merge review corrections
203
+
204
+ Current snapshot task privacy is checked again when warning links are built,
205
+ including cohorts and conflicts created before a task became private. The Off
206
+ selector stays visible outside the hidden scene. Filtered card activation reveals
207
+ its task; Work overflow includes rework. Sticky desk coordinates set scene bounds.
208
+ The existing snapshot poll prunes transient deadlines even when the model is
209
+ unchanged; reduced-motion departures are immediate and settled paints receive no
210
+ appearance class. Explicit unattributed turns never use the legacy task guess.
211
+ Large warning caps prioritize conflicts; distinct kinds use parallel offsets.
212
+ Original test assertions are retained. Physical visual readback remains pending.
@@ -0,0 +1,19 @@
1
+ # Bounded text projections (#259)
2
+
3
+ - Optional machine-local text_projection maps lowercase extensions to argv arrays. Each uses one separate {input} argument. No shell string, automatic converter install or default command.
4
+ - Example: { "text_projection": { ".docx": ["/usr/bin/textutil", "-convert", "txt", "-stdout", "{input}"] } }. Configure the converter explicitly for the machine. Shared/tracked config cannot choose these programs.
5
+ - Facts excludes private paths before conversion. The converter reads an immutable snapshot in an owned temporary directory, from its own scratch directory, with literal read grants for that file and for the program and script files its argv names (relative ones are passed as absolute paths, and the directories above an in-project script can be listed) (nothing else in the project is readable, even under a `local.read_allow` entry that encloses it, so a converter that follows an include or loads a sibling helper module fails), uses the existing macOS no-network/read-only sandbox and has a 5-second deadline, 16 MiB input cap and 256 KiB stdout/stderr cap. A trusted helper owns and stops its process group; converter stderr is never published.
6
+ - Output caches in state by raw content hash, extension and argv/program/script metadata fingerprint. Invalid/oversized cache or failing/unavailable conversion falls back to the existing raw/binary facts behavior, with one bounded notice per extension. A conversion that fails with its full deadline is not tried again for the same bytes and command for the life of the hub process, within a bounded in-memory record (#382).
7
+ - Raw hashes and git blob identities remain the change identities. Projected text only supplies presentation diffs. A projected read or patch cannot establish raw-file write attribution. Existing text privacy checks and header sanitization still apply.
8
+ - Converter programs may require temporary writes/caches; those fail under this read-only policy. Use a converter that emits stdout. The owner and other native same-user processes remain outside this boundary.
9
+ - Linux retains no-sandbox/no-converter behavior. No native model/account study runs. Shadow repositories and profile override/glob follow-ups remain open in #259.
10
+
11
+ # Review and undo previews
12
+
13
+ - A configured projection adds text diffs to review notices and `ahub undo` previews. These are project-snapshot changes, not evidence of authorship or permission to restore raw files.
14
+ - Review uses the original task-proposal snapshot, persisted by task id and proposal time. Reviewer replacement and daemon restart retain that baseline. It is never repaired with a later snapshot. Missing or pruned baselines, undeclared paths, disabled snapshots and private snapshot windows are marked unavailable.
15
+ - Review includes changed files under declared refs/plan paths and section files only. Private tasks have no review projection. Declared private paths are withheld before conversion; private-data patterns are withheld before publication. Document bodies enter neither task history nor memory through this feature.
16
+ - Undo projects the recorded end snapshot back to the recorded start snapshot. It still checks raw files for later edits, concurrent/unknown turns and pruned trees, then repeats its plan immediately before restore. Conversion never writes or authorizes a raw restore.
17
+ - Historical blobs must be regular files in the project scope. Symlinks, hub/git metadata and denylisted paths are refused. Deleted and created documents use their stored bytes; no current file read substitutes for a missing old version. Converter identities must agree across a pair.
18
+ - A preview shares an 8-second monotonic deadline across git reads, conversion and diffing. Each converter still has at most 5 seconds; termination stops its owned process group. At most 8 files and 12000 UTF-8 bytes of presentation are shown, with explicit omissions. CLI previews strip terminal controls and all inserted headers are quoted.
19
+ - Converter failure preserves the ordinary file-only view. Linux continues to refuse conversion without the supported sandbox. Native model consumption and live research-profile/account studies remain unverified.
@@ -0,0 +1,33 @@
1
+ # ACP watch verification, 2026-10-11
2
+
3
+ - Scope: #286 Part 1, headless Kimi/Qwen transient watch only. No native account, model, TUI or production hub was started during this solo implementation.
4
+ - Base: e4146115, agent-hub 0.12.23, protocol 16. Fake protocol tests establish the hub contract; they do not establish what a vendor actually emits.
5
+ - Kimi source baseline: 2.1.1, recorded in #286. Qwen source baseline: expected ACP 0.25.0; #256's source inventory found installed CLI 0.25.0 versus ACP/package 0.24.1. The production adapter refuses that identity drift.
6
+
7
+ | Check | Verdict | Reason and consequence |
8
+ | --- | --- | --- |
9
+ | K1 | Unverified | Native read/edit/command/approval turn not run. Fake ACP message/thought/tools/plan/approval projection is tested, actual field coverage unknown. |
10
+ | K2 | Unverified | No concurrent native visualizer session. No `watch --native` offered. |
11
+ | K3 | Unverified | No second writer started. No concurrent resume command offered. |
12
+ | K4 | Unverified | No Kimi web session inspection. ACP transport retained. |
13
+ | Q1 | Unverified | Installed ACP identity drift; no native turn run. Fake 0.25.0 contract only. |
14
+ | Q2 | Unverified | Dual output busy/submit round trip not run. TUI mode remains refused. |
15
+ | Q3 | Unverified | Native dual-output approvals and MCP identity not run. No TUI permission mapping shipped. |
16
+ | Q4 | Unverified | No native external turn cancellation test. No TUI watchdog shipped. |
17
+ | Q5 | Unverified | Unread native event-file limit not tested. No file transport shipped. |
18
+ | Q6 | Unverified | Native TUI recovery not tested. Existing ACP recovery stays separate. |
19
+ | Q7 | Unverified | Final isolated provider environment not exercised; CLI version alone is insufficient. |
20
+
21
+ # Delivered contract
22
+
23
+ - `ahub watch kimi|qwen` subscribes to a console-only memory ring, replays it, then streams new items. It sends only `watch` and `status` requests. `q` and Ctrl+C leave without stopping the peer.
24
+ - The ring holds at most 500 items and 256 KiB of serialized UTF-8 JSON per peer. Item text is bounded at 4096 UTF-16 code units. Message/thought chunks coalesce up to that cap or a 50 ms flush boundary; tool/permission/end boundaries flush synchronously.
25
+ - Tool updates project only declared fields, locations and bounded last text lines, or diff line counts. ACP terminal references without inline output say output is unavailable; filesystem/terminal capability remains disabled. No terminal RPC or native session file is read.
26
+ - Private envelopes, daemon-marked private turns and associated PII work show one stub. Privacy stays latched if the task closes during the turn; unreadable privacy state also withholds activity.
27
+ - Watch is unavailable for Kimi pull-only TUI mode, off-roster Qwen and non-ACP peers. Jcode is outside this slice. No terminal-provider automation or console Peers-panel shortcut ships here.
28
+ - Existing final-answer delivery and existing native approval display (console and dashboard) retain their own policies. Watch adds no copy to the bus, events, hub.log, UI, tools or claude-mem. A final answer containing a marker can still reach the existing answer bus; that is not a watch side channel.
29
+ - Native payload coverage, model/tool execution and TUI claims remain unverified. No performance or quality comparison was measured.
30
+
31
+ # Marker fixture provenance
32
+
33
+ - Existing ACP approval payloads appear in the dashboard as well as the console (`uiSnapshot` and the existing dashboard allow/deny integration test). Watch does not change that approval policy. The transient-only marker is in thoughts, read/edit tool arguments and tool output; the separate executable approval command and final answer are ordinary unmarked fixtures. The test checks the transient marker is absent even while that independent approval is pending. All marker assertions are retained.
@@ -0,0 +1,20 @@
1
+ # Project agent configuration inventory (#323)
2
+
3
+ Read on 2026-10-11. No native model turn was run. Version commands: Claude Code 2.1.296, Codex 0.146.0, Kimi 2.1.1, Qwen 0.25.0, Pi 1.0.1. The Qwen npm manifest at the selected executable tree says 0.24.1 despite the CLI reporting 0.25.0; do not use the manifest as served/native-version proof.
4
+
5
+ | Peer | Project paths established | Source and limit |
6
+ | --- | --- | --- |
7
+ | Claude | `.claude/settings.json`, `.claude/settings.local.json`, `.claude/skills/`, `.claude/agents/`, `.mcp.json` | [Vendor settings](https://code.claude.com/docs/en/settings), [skills](https://code.claude.com/docs/en/skills), [MCP](https://code.claude.com/docs/en/mcp). Closed vendor source; current documentation, no native discovery run. |
8
+ | Codex | `.codex/config.toml`, `.agents/skills/`; legacy skills in config roots | [0.146.0 loader](https://github.com/openai/codex/blob/be449751a978f02e5bbba886999662956c7f38f5/codex-rs/core-skills/src/loader.rs), `repo_skill_roots` probes `.agents/skills` between cwd and project root. Config commands and trust are vendor-owned. |
9
+ | Kimi | `.kimi-code/mcp.json`, `.kimi-code/local.toml`, `.kimi-code/skills/`, `.agents/skills/` | [2.1.1 skills](https://github.com/MoonshotAI/kimi-code/blob/a00639d0654d2c91c6f0c1388267b62ad51f8b9c/docs/en/customization/skills.md), [configuration](https://github.com/MoonshotAI/kimi-code/blob/a00639d0654d2c91c6f0c1388267b62ad51f8b9c/docs/en/configuration/config-files.md), [MCP](https://github.com/MoonshotAI/kimi-code/blob/a00639d0654d2c91c6f0c1388267b62ad51f8b9c/docs/en/customization/mcp.md). Project stdio MCP entries run local commands. Legacy `.kimi` remains protected for earlier versions. |
10
+ | Qwen | `.qwen/settings.json`, `.qwen/skills/`, `.agents/skills/`, `.qwen/hooks/`, `.qwen/commands/`, `.qwen/agents/`, `.mcp.json` | Installed `chunks/chunk-ZYDMQCQP.js` declares `SKILL_PROVIDER_CONFIG_DIRS = [".qwen", ".agents"]`; `chunk-J6QWYIXU.js` maps them to `<projectRoot>/<provider>/skills` and lists startup/configuration paths. [Vendor skills](https://qwenlm.github.io/qwen-code-docs/en/users/features/skills/). Package-version mismatch above; no live discovery claim. |
11
+ | Pi | `.pi/settings.json`, `.pi/skills/`, `.pi/extensions/`, resource paths configured there | [1.0.1 resource loader](https://github.com/earendil-works/pi/blob/a7229ddc21810d6245105978033b7df645ecc2f7/packages/coding-agent/src/core/resource-loader.ts). Installed package documentation also lists `.agents/skills`; that additional discovery path was not proven in the executing bundled CLI. It is protected by the shared rule regardless. |
12
+ | Local | `.agenthub/config*.json`, `.agenthub/routing*.toml`; no native skill/MCP discovery | Repository loader and local tool implementation. The existing hub configuration refusal applies. |
13
+
14
+ ## Decisions
15
+
16
+ - Exclude `.agents` from scoped automatic file grants: skills may direct code/tool use and are loaded by several supported peers. Existing `.claude`, `.codex`, `.qwen`, `.kimi`, `.kimi-code`, `.pi` and `.mcp.json` exclusions cover their configured project resources.
17
+ - Exclude `.claude.json` conservatively as an agent configuration filename. The documented default is home-level `~/.claude.json`, not a project-local file; default project discovery of `.claude.json` was not established. Do not claim that adding this name proves a project loader exists.
18
+ - The owner's 2026-10-11 decision keeps `AGENTS.md`, `CLAUDE.md`, `QWEN.md` grantable by default. `scoped_grants.protect_instructions` enables protection for those three names only, including folded and symlink spellings. It persists as machine-local `protect_instruction_files`, applies after the settings write or undo, and is available only through person settings surfaces.
19
+ - Configured arbitrary skill/hook paths and configurable context filenames are not a complete name inventory. The hub does not infer additional protected filenames from arbitrary native settings. No guarantee for every vendor-loaded path follows from this list.
20
+ - The option affects scoped writes/edits, not instruction reads or explicit human approval/never-ask. A tracked project file cannot set this machine-local policy. Ordinary dashboard sessions may enable protection, but weakening it requires a settings session; agent/tools/conductor surfaces cannot change it.
@@ -0,0 +1,27 @@
1
+ # Jcode peer contract (#332)
2
+
3
+ Installed CLI: jcode 0.94.0, release build b6c63ff04ca6786d4d328a086d7f3ac06d6fb578, read through version --json. This identifies [1jehuang/jcode](https://github.com/1jehuang/jcode/tree/b6c63ff04ca6786d4d328a086d7f3ac06d6fb578), not the unrelated cnjack/jcode project.
4
+
5
+ ## Verified source surfaces
6
+
7
+ - src/cli/acp.rs: native identity jcode/package version, protocol 1, new/load/prompt/cancel/close. Session-scoped mcpServers arrays are tolerated but ignored. No session/set_mode or request_permission mapping is provided.
8
+ - crates/jcode-base/src/mcp/protocol.rs and manager.rs: per-session project directory selects .jcode/mcp.json, then .mcp.json, then .claude/mcp.json. Later names override. Both servers and mcpServers are accepted; shared:false makes the connection session-owned.
9
+ - src/cli/dispatch.rs and crates/jcode-app-core/src/server/socket.rs: serve runs in the foreground, a private --socket selects the runtime, JCODE_READY_FD signals listening, temporary-server/owner-pid support cleanup. Automatic updates and self-dev can be disabled. No global stop command is required.
10
+ - Native MCP first-use import can write Codex definitions into Jcode's global store. The hub refuses startup until that native store exists; it never initializes or copies it. Credentials stay in the operator's native store.
11
+ - ACP load returns no restored id while attach_existing_session can replace its internal id from History. Therefore 0.94.0 cannot prove restored identity through this interface. Automatic crash/controlled recovery is withheld. A manually requested load must echo an exact id or refuses without a model prompt or restored claim. Fakes can exercise that positive echo contract; they do not establish native 0.94.0 restoration.
12
+
13
+ ## Alternative assessment
14
+
15
+ | Surface | Jcode | Qwen | Pi |
16
+ | --- | --- | --- | --- |
17
+ | Integration | Owned daemon/socket plus ACP and project MCP | Owned ACP, session MCP | Native events and hub-moderated tools |
18
+ | Permission boundary | Unmanaged native policy, no hub sandbox | Version-specific native modes, no hub sandbox | Hub path guard/sandbox for managed tools |
19
+ | Provider choice | Operator's native provider profile | Operator's native provider | Existing hub relay policy |
20
+ | Recovery | Refuse unproven native identity restoration | Saved ACP conversation | Existing file/id restoration |
21
+ | Quota | Unknown unless observed/pinned | Unknown unless observed/pinned | Existing on-prem policy and measurements |
22
+
23
+ No local comparison of RAM, latency, quality, resources or operator overhead ran. Upstream performance claims are not this workspace's measurement. Jcode is optional and does not replace class defaults or establish reliable verification from a role label.
24
+
25
+ ## Unverified native legs
26
+
27
+ Provider/model serving, project MCP discovery and a real hub-tool call, native permissions, native stop/child teardown and recovery all remain unverified. Source inspection, fakes, a CLI version and a listening socket are separate evidence, not native model/tool readiness.