@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.
- package/CHANGELOG.md +98 -0
- package/README.md +8 -3
- package/docs/addons/claude-mem.md +24 -0
- package/docs/addons/codex-plugin.md +8 -0
- package/docs/addons/dot-admit.md +8 -0
- package/docs/addons/open-code-review.md +8 -0
- package/docs/addons/ponytail.md +23 -0
- package/docs/addons/ripwire.md +22 -0
- package/docs/agent-notes/README.md +5 -0
- package/docs/agent-notes/adapters.md +8 -1
- package/docs/agent-notes/bus.md +3 -1
- package/docs/agent-notes/daemon.md +7 -1
- package/docs/agent-notes/local-worker.md +4 -2
- package/docs/agent-notes/tasks.md +4 -0
- package/docs/agent-notes/tests.md +2 -1
- package/docs/bench.md +28 -3
- package/docs/cooperbench.md +4 -0
- package/docs/data-policy.md +36 -0
- package/docs/events.md +3 -0
- package/docs/gsd-collaboration-analysis.md +48 -0
- package/docs/memory.md +231 -0
- package/docs/operations.md +651 -14
- package/docs/plans/2026-10-11-issues-109-sequential.md +81 -0
- package/docs/plans/2026-10-11-routing-evaluation-proposal.md +30 -0
- package/docs/profiles.md +57 -0
- package/docs/quickstart.md +1 -1
- package/docs/research.md +31 -1
- package/docs/roles.md +85 -0
- package/docs/sdlc.md +170 -0
- package/docs/security.md +111 -4
- package/docs/smoke.md +282 -0
- package/docs/specs/2026-09-19-agent-hub-design.md +601 -7
- package/docs/specs/2026-10-12-backlog-implementation-plan.md +186 -0
- package/docs/specs/2026-10-12-office-view-design.md +212 -0
- package/docs/text-projection.md +19 -0
- package/docs/verification/2026-10-11-acp-watch-t0.md +33 -0
- package/docs/verification/2026-10-11-agent-config-inventory.md +20 -0
- package/docs/verification/2026-10-11-jcode-peer-contract.md +27 -0
- package/docs/verification/2026-10-13-0.12.24.md +94 -0
- package/docs/verification/2026-10-13-board-phone.md +31 -0
- package/docs/verification/2026-10-13-fsmonitor-fixture-attribution.md +19 -0
- package/docs/verified.json +22 -13
- package/package.json +2 -1
- package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
- package/plugins/agent-hub/ROLE-NOTICE.md +26 -0
- package/plugins/agent-hub/server.js +1175 -339
- package/scripts/check-docs.mjs +129 -0
- package/src/adapters/acp.ts +112 -13
- package/src/adapters/claude-channel.ts +48 -11
- package/src/adapters/codex-appserver.ts +11 -0
- package/src/adapters/jcode.ts +110 -0
- package/src/adapters/local-worker.ts +10 -7
- package/src/adapters/pi.ts +94 -20
- package/src/cli/attention.ts +60 -0
- package/src/cli/bench.ts +24 -5
- package/src/cli/board-read.ts +12 -0
- package/src/cli/console-state.ts +103 -17
- package/src/cli/console.ts +54 -8
- package/src/cli/facts-hook.ts +12 -4
- package/src/cli/help.ts +35 -9
- package/src/cli/identity.ts +18 -7
- package/src/cli/init.ts +48 -10
- package/src/cli/jcode-mcp.ts +58 -0
- package/src/cli/kimi-mcp.ts +53 -0
- package/src/cli/launch.ts +16 -1
- package/src/cli/main.ts +392 -57
- package/src/cli/memory.ts +193 -0
- package/src/cli/output.ts +45 -4
- package/src/cli/pet-config.ts +1 -0
- package/src/cli/pet.ts +83 -0
- package/src/cli/preview.ts +38 -5
- package/src/cli/status-lines.ts +1 -1
- package/src/cli/tail-render.ts +1 -0
- package/src/cli/upgrade-runtime.ts +32 -3
- package/src/cli/watch.ts +31 -0
- package/src/hub/activity.ts +53 -0
- package/src/hub/ask.ts +10 -5
- package/src/hub/bench.ts +10 -3
- package/src/hub/board.ts +222 -16
- package/src/hub/bus.ts +48 -9
- package/src/hub/citations.ts +7 -0
- package/src/hub/conductor.ts +12 -7
- package/src/hub/config-trust.ts +4 -2
- package/src/hub/crash.ts +9 -0
- package/src/hub/daemon.ts +910 -120
- package/src/hub/delivery-journal.ts +5 -0
- package/src/hub/envelope.ts +1 -1
- package/src/hub/events.ts +12 -2
- package/src/hub/facts.ts +26 -7
- package/src/hub/git.ts +8 -2
- package/src/hub/github-import.ts +28 -0
- package/src/hub/hub-tools.ts +49 -10
- package/src/hub/inference.ts +1 -1
- package/src/hub/lifecycle-schema.ts +17 -0
- package/src/hub/listen.ts +15 -0
- package/src/hub/manager.ts +12 -5
- package/src/hub/path-policy.ts +96 -0
- package/src/hub/peer-catalog.ts +28 -0
- package/src/hub/permission-mode.ts +19 -5
- package/src/hub/planning.ts +70 -0
- package/src/hub/profiles.ts +74 -0
- package/src/hub/projected-diff.ts +73 -0
- package/src/hub/projection-exec.ts +24 -0
- package/src/hub/research.ts +144 -21
- package/src/hub/roles.ts +123 -0
- package/src/hub/roster.ts +23 -0
- package/src/hub/routing.ts +18 -5
- package/src/hub/sdlc-queue.ts +112 -0
- package/src/hub/sdlc-release.ts +125 -0
- package/src/hub/sdlc.ts +250 -0
- package/src/hub/settings.ts +34 -15
- package/src/hub/shipped-roles.ts +25 -0
- package/src/hub/snapshots.ts +89 -15
- package/src/hub/start-mode.ts +7 -5
- package/src/hub/supervision.ts +1 -0
- package/src/hub/task-sweep.ts +1 -1
- package/src/hub/tasks.ts +892 -87
- package/src/hub/text-projection.ts +126 -0
- package/src/hub/tooling.ts +159 -0
- package/src/hub/ui.ts +16 -2
- package/src/hub/workflow.ts +71 -0
- package/src/local/sandbox.ts +6 -4
- package/src/local/tools.ts +11 -6
- package/src/memory/brief.ts +28 -14
- package/src/memory/import.ts +55 -0
- package/src/memory/recall.ts +84 -0
- package/src/memory/store.ts +750 -0
- package/src/memory/sync.ts +145 -0
- package/src/pet/NOTICE.md +10 -0
- package/src/pet/characters.ts +1438 -0
- package/src/pet/config.ts +31 -0
- package/src/pet/frame.ts +17 -0
- package/src/pet/pixels.ts +28 -0
- package/src/role-text.d.ts +1 -0
- package/src/ui/index.html +842 -46
- package/src/ui/needs.ts +58 -0
- package/src/ui/office-model.ts +440 -0
- package/src/ui/peer-palette.ts +16 -0
- package/src/ui/task-board.ts +49 -0
- package/src/ui/task-progress.ts +5 -1
- package/templates/AGENTS.block.md +3 -2
- package/templates/config.json +5 -1
- package/templates/profiles/dev.json +22 -0
- package/templates/profiles/general.json +26 -0
- package/templates/profiles/research.json +57 -0
- package/templates/profiles/writing.json +28 -0
- package/templates/roles/NOTICE.md +26 -0
- package/templates/roles/dev/backend-engineer.md +26 -0
- package/templates/roles/dev/code-reviewer.md +26 -0
- package/templates/roles/dev/frontend-engineer.md +26 -0
- package/templates/roles/dev/security-reviewer.md +26 -0
- package/templates/roles/dev/software-architect.md +26 -0
- package/templates/roles/dev/test-engineer.md +26 -0
- package/templates/roles/research/analyst.md +26 -0
- package/templates/roles/research/fact-checker.md +26 -0
- package/templates/roles/research/research-lead.md +26 -0
- package/templates/roles/research/researcher.md +26 -0
- package/templates/roles/research/statistician.md +26 -0
package/docs/operations.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Operations guide
|
|
2
2
|
|
|
3
|
-
This guide describes ahub 0.12.
|
|
3
|
+
This guide describes ahub 0.12.24 and control protocol 16. Live verification
|
|
4
4
|
results and remaining prerequisites are recorded separately in [the smoke ledger](smoke.md).
|
|
5
5
|
|
|
6
6
|
## Command output
|
|
@@ -63,6 +63,25 @@ a three-line footer, separated by ASCII `-` rules; the stream has one rule above
|
|
|
63
63
|
its footer. The active tab is bracketed, as in `[2 Approvals]`, so it reads
|
|
64
64
|
without color. The Approvals tab counts pending requests and the Queue tab
|
|
65
65
|
counts `needs_review` deliveries, in the attention and failure tones.
|
|
66
|
+
|
|
67
|
+
The console attention companion (#280) shows waiting, blocked, review, working,
|
|
68
|
+
idle or asleep with separate action/watch counts. `n` selects the exact approval,
|
|
69
|
+
held queue or review row, or prints applicable guidance; it never answers a
|
|
70
|
+
request or runs a command. Editing, choices and confirmation retain their controls.
|
|
71
|
+
`P` cycles the five built-in characters and off for the current console.
|
|
72
|
+
|
|
73
|
+
Configure `pet` in `.agenthub/config.json` or `config.local.json`; local options
|
|
74
|
+
override shared ones. Defaults are `character: "stai"`, `size: "line"`,
|
|
75
|
+
`glyphs: "auto"`, `blink: true`, `bell: false`. Line preserves the three footer
|
|
76
|
+
rows and prompt position. Mini/full reserve a bounded character rectangle and
|
|
77
|
+
fall back when the terminal is too small. Supported glyphs and character choices
|
|
78
|
+
are described below. `pet: false` or `ahub console --no-pet` disables presentation.
|
|
79
|
+
Unknown options produce one bounded notice and fall back. Only an open approval
|
|
80
|
+
blinks through the existing redraw; `blink: false` disables it. The optional bell
|
|
81
|
+
sounds on an action-count transition from zero, at most once per minute, never
|
|
82
|
+
for a message alone. Plain mode prints the line only when the action count changes.
|
|
83
|
+
Messages addressed to `user` remain attention items until the next key. Drawing
|
|
84
|
+
adds no timer, network request or writable settings path.
|
|
66
85
|
Tabs change with the digits 1 to 5 or with Left and Right (wrapping at both
|
|
67
86
|
ends), never while a command is being edited or a choice is open; under a
|
|
68
87
|
confirmation an arrow dismisses it like any key but y, without moving a tab. A pasted
|
|
@@ -148,6 +167,60 @@ OS color preference through CSS. Both inline scripts and the style retain CSP
|
|
|
148
167
|
hashes; there are no external chart/theme assets. Live theme/readability inspection
|
|
149
168
|
is tracked in `docs/smoke.md` and remains unverified until performed.
|
|
150
169
|
|
|
170
|
+
The dashboard Office section (#264, phase 1 of 4) draws the same snapshot as a
|
|
171
|
+
static flat office: one desk per peer in a stable slot (claude, codex, kimi, pi,
|
|
172
|
+
local, then others by id; a peer going offline dims its desk and never moves
|
|
173
|
+
another), rooms for the board columns in a fixed order (To Do, Work floor,
|
|
174
|
+
Review, Done shelf as a count only), at most 8 cards per room with "+N more"
|
|
175
|
+
filtering the task list to that state, and at most 12 desks with "+N peers".
|
|
176
|
+
Work-floor cards sit at the owner's desk, marked for rework; a busy peer's task
|
|
177
|
+
bubble names its task only when it has exactly one in progress. Every peer
|
|
178
|
+
condition (idle, busy, offline, paused, waiting on approval) has a glyph and a
|
|
179
|
+
text label, and the scene carries ids, classes, states, kinds, counts and public
|
|
180
|
+
titles only: message bodies, task details and approval titles never enter it.
|
|
181
|
+
The scene adds no timer, frame loop or request and re-renders only when its
|
|
182
|
+
signature changes. A View control offers Off (the default), Flat and
|
|
183
|
+
Isometric; the choice is stored in a second host-scoped loopback cookie `agent-hub-office` with the
|
|
184
|
+
same attributes as the theme cookie, and blocked cookie access defaults to Off
|
|
185
|
+
without preventing operation. Desks and cards are focusable buttons; activating
|
|
186
|
+
one scrolls to and highlights the matching list row, and a list row highlights
|
|
187
|
+
its desk or card on focus and hover. The scene performs no action: every control
|
|
188
|
+
stays in the lists. The View control's third option, Isometric (phase 4),
|
|
189
|
+
renders the same model through the same code path with the grid coordinates
|
|
190
|
+
projected (x' = (x - y) cos 30, y' = (x + y) sin 30): tiles become
|
|
191
|
+
parallelograms, cards and labels stay upright, and the DOM order and
|
|
192
|
+
accessible names are identical to Flat. Switching the view jumps to the new
|
|
193
|
+
projection without animating; the settle rule and reduced motion apply
|
|
194
|
+
unchanged. The live browser look is tracked in `docs/smoke.md` and
|
|
195
|
+
remains unverified until performed.
|
|
196
|
+
|
|
197
|
+
Motion (phase 2): card moves between rooms and desks, message arcs between
|
|
198
|
+
desks (from the hub or the console they start at an anchor point), delivery
|
|
199
|
+
warning marks and the busy latch all follow the snapshot. Motion is CSS only:
|
|
200
|
+
transitions on transform and opacity (at most one second), keyframe fades for
|
|
201
|
+
the transient marks. Arcs and marks hold, then fade out ten seconds after the
|
|
202
|
+
event, timed at render from the model's timestamps; expired nodes purge on the
|
|
203
|
+
next changed render or their own animationend, never on a timer. Arcs expire on
|
|
204
|
+
the snapshot's own envelope clock, so an unchanged snapshot re-renders
|
|
205
|
+
identically and writes nothing to the DOM. The scene goes straight to final
|
|
206
|
+
positions on the first snapshot, after a project switch, after a snapshot gap
|
|
207
|
+
over three seconds, or when one snapshot brings more than six transitions.
|
|
208
|
+
`prefers-reduced-motion: reduce` removes all scene transitions and animations.
|
|
209
|
+
Event reasons and bodies never enter the scene; arcs carry from, to, kind,
|
|
210
|
+
priority, the task ref and the dropped flag only.
|
|
211
|
+
|
|
212
|
+
Snapshot fields (phase 3): three additive optional fields, so older pages and
|
|
213
|
+
older daemons mix freely and `PROTOCOL`/`EVENTS_SCHEMA` stay unchanged. A peer's
|
|
214
|
+
open turn (`since`, `task`, `attribution`) names the busy bubble's task exactly
|
|
215
|
+
instead of the single-in-progress-task heuristic, and a turn still open while
|
|
216
|
+
the peer is paused adds a "finishing a turn" line under the Break sign. A task's
|
|
217
|
+
`checking` flag draws a check-running mark on its card, which stays at its
|
|
218
|
+
owner's desk (rooms follow states only). Warning `links` (overlap from the
|
|
219
|
+
board's overlap test, cohorts, and recent turn-end conflicts the daemon keeps in
|
|
220
|
+
a bounded in-memory list) draw dashed lines between the desks they name, labeled
|
|
221
|
+
with kind and task ids; all three carry task and peer ids only, and a PII task
|
|
222
|
+
never joins a link.
|
|
223
|
+
|
|
151
224
|
Console color policy is `--color=auto|always|never`, with `auto` as the default.
|
|
152
225
|
Auto enables color only when both input and output are TTYs, `TERM` is not
|
|
153
226
|
`dumb`, and `NO_COLOR` is empty or absent. Explicit `always` overrides these
|
|
@@ -226,7 +299,7 @@ Launch that peer with `ahub claude` for channel pushes, or select `codex` in
|
|
|
226
299
|
observes `hub_status`, moves stalled work and obtains review before reporting
|
|
227
300
|
results and open decisions. It does not implement the tasks it handed out.
|
|
228
301
|
`hub_peer_start` starts a peer in the start mode a person set for it (see
|
|
229
|
-
"Start modes"): local
|
|
302
|
+
"Start modes"): local and headless Kimi, Pi or Codex start at once; for a
|
|
230
303
|
TUI peer the hub opens a terminal running the fixed `ahub <peer>` command,
|
|
231
304
|
after validating it through the shared launcher planner, and when it cannot
|
|
232
305
|
open one the call fails with that command for the person to run. The
|
|
@@ -622,6 +695,30 @@ ahub research backfill # build this project's records once from even
|
|
|
622
695
|
ahub task label 12 reverted # a later verdict (ok, regressed, reverted, incomplete, wrong, abandoned)
|
|
623
696
|
```
|
|
624
697
|
|
|
698
|
+
## Hub memory
|
|
699
|
+
|
|
700
|
+
The hub keeps its own memory in `~/.agenthub/memory/` beside claude-mem ([how it works](memory.md)): notes saved
|
|
701
|
+
against an open task are short-term; when the task is approved its decisions, contracts and fails become long-term.
|
|
702
|
+
Task briefs, session-start recall and `ahub ask` read it first, and the dashboard has a Memory section.
|
|
703
|
+
|
|
704
|
+
```bash
|
|
705
|
+
ahub memory # this project's entries, newest first
|
|
706
|
+
ahub memory search parser # every word must match
|
|
707
|
+
ahub memory show 1a2b3c4d # one entry, its provenance and edges
|
|
708
|
+
ahub memory forget 1a2b3c4d # a person's; also promote, demote, supersede, rebuild
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
`"memory": { "native": false }` in `.agenthub/config.json` turns it off for a project.
|
|
712
|
+
|
|
713
|
+
Between your machines, through a private git remote, with long-term tasks that span them:
|
|
714
|
+
|
|
715
|
+
```bash
|
|
716
|
+
ahub memory sync --remote git@github.com:you/agent-hub-memory.git # once per machine; then every 10 minutes
|
|
717
|
+
ahub goal new "native memory" # a long-term task
|
|
718
|
+
ahub goal # open ones, who holds each and until when
|
|
719
|
+
ahub goal take 1a2b3c4d --force # take one over from another machine
|
|
720
|
+
```
|
|
721
|
+
|
|
625
722
|
## Benchmarks
|
|
626
723
|
|
|
627
724
|
In a git repository kept for benchmarks (`"bench": { "enabled": true }` in its `.agenthub/config.json`, a clean tree),
|
|
@@ -915,7 +1012,7 @@ denylist (Pi and local), or native vendor boundaries (Claude and Codex).
|
|
|
915
1012
|
| --- | --- | --- | --- |
|
|
916
1013
|
| Kimi Code CLI | ACP yolo | ACP auto | ACP default |
|
|
917
1014
|
| Codex | on-request for every outgoing turn/start | never for every outgoing turn/start | Restore the known native policy once, then stop overriding |
|
|
918
|
-
| Claude | Allow resolving project file tools outside .agenthub/.git/.claude/.codex/.qwen/.kimi/.pi/.mcp.json | Hook allow for every tool | No hook decision |
|
|
1015
|
+
| Claude | Allow resolving project file tools outside .agenthub/.git/.claude/.codex/.qwen/.kimi/.kimi-code/.pi/.mcp.json | Hook allow for every tool | No hook decision |
|
|
919
1016
|
| Pi and local | Grant write/edit outside native agent configuration paths; read never asks; shell/git writes ask | Grant each tool once within the existing sandbox/guard | Normal approval handling |
|
|
920
1017
|
|
|
921
1018
|
Kimi's map applies only to the actual Kimi Code CLI identity, not another ACP
|
|
@@ -996,6 +1093,75 @@ permission_mode (peer/from/to) with no tool arguments under events schema 1.
|
|
|
996
1093
|
The optional control requests preserve PROTOCOL; an older hub answers unknown
|
|
997
1094
|
and the CLI advises upgrading.
|
|
998
1095
|
|
|
1096
|
+
## Change the participating peers while the hub runs
|
|
1097
|
+
|
|
1098
|
+
`ahub roster` lists every known peer, whether it participates, its start mode,
|
|
1099
|
+
current state, queued messages and open tasks. `ahub roster --json` is the same
|
|
1100
|
+
ordered catalog view for scripts. Status and the console keep their existing lazy
|
|
1101
|
+
rows; an off-roster peer is shown only while it has retained messages, an uncertain
|
|
1102
|
+
delivery or open work, with the words `off roster`.
|
|
1103
|
+
|
|
1104
|
+
```bash
|
|
1105
|
+
ahub roster
|
|
1106
|
+
ahub roster remove kimi --yes # print the preview, confirm and remove
|
|
1107
|
+
ahub roster remove kimi --yes --now # stop a busy owned runtime before handing work over
|
|
1108
|
+
ahub roster add kimi
|
|
1109
|
+
ahub settings set roster.kimi false --preview
|
|
1110
|
+
ahub settings set roster.kimi false --yes
|
|
1111
|
+
```
|
|
1112
|
+
|
|
1113
|
+
These are person's commands and use the same settings preview, write and undo as
|
|
1114
|
+
the dashboard's Roster settings. An ordinary dashboard session may remove a peer;
|
|
1115
|
+
adding requires `ahub ui --settings` or a person's terminal. Removal requires the
|
|
1116
|
+
peer id as confirmation. Without `--now`, a busy peer is refused. A conductor
|
|
1117
|
+
holder cannot be removed until its role is moved.
|
|
1118
|
+
|
|
1119
|
+
Removal fences membership, stops hub-owned runtimes or detaches sessions in a
|
|
1120
|
+
person's terminal, and then hands work over. The removal preview and result name
|
|
1121
|
+
the peer whose existing work the person must stop in that retained terminal;
|
|
1122
|
+
the preview names the roles offered and those with no eligible replacement; the
|
|
1123
|
+
result lists the saved owner/reviewer moves and every assignment that stays. No stop notice is forced into
|
|
1124
|
+
a detached session and nothing bypasses the journal. Codex 0.146.0
|
|
1125
|
+
exits its TUI on the close-4000 disconnect and does not reconnect automatically.
|
|
1126
|
+
Its app-server and proxy remain available; after `ahub roster add codex`, run
|
|
1127
|
+
`ahub codex resume <thread-id>` (the full id is printed in the preview, removal
|
|
1128
|
+
result and return) or `ahub codex resume` to select its previous native session. Removal never closes
|
|
1129
|
+
the terminal window itself. The Claude channel retries and reconnects on return.
|
|
1130
|
+
Pi return retains the verified owner's monotonic generation even after refused
|
|
1131
|
+
native activity while detached; it shares no personal output and invalidates any
|
|
1132
|
+
cached empty-session resume proof after that activity.
|
|
1133
|
+
It leaves queued and held deliveries, and existing manual or budget pauses,
|
|
1134
|
+
untouched. The queue listing names `off roster` as the membership hold. Returning
|
|
1135
|
+
and starting the peer makes retained queued messages available again; held
|
|
1136
|
+
uncertain work still needs the existing queue resolution command. A detached
|
|
1137
|
+
personal Pi TUI with a live owner still blocks controlled recovery as `pi is not
|
|
1138
|
+
settled`; end that retained TUI before restart/upgrade. The hub does not declare
|
|
1139
|
+
a live native owner settled or close it implicitly during preparation. Open owner and
|
|
1140
|
+
reviewer work, including ownership of `in_review` tasks, is offered through the
|
|
1141
|
+
existing reassignment path; a transferred review keeps its review state. If nobody can
|
|
1142
|
+
take it, its assignment stays and a notice names the person's next action. Task
|
|
1143
|
+
text in a notice uses its public title, so a private task remains a stub. A stop
|
|
1144
|
+
that is unconfirmed leaves the roster saved and reports that permission reset and
|
|
1145
|
+
handoff were not attempted; reapply the removal after checking the runtime.
|
|
1146
|
+
|
|
1147
|
+
A hub task, verdict, review or budget message addressed to an off-roster peer
|
|
1148
|
+
stays in its retained queue, with one public notice to the person. Task operations
|
|
1149
|
+
use the current owner and reviewer after reassignment. A mixed addressed audience
|
|
1150
|
+
receives the on-roster copies now and retains the off-roster copies; the sender
|
|
1151
|
+
sees the existing notice field (or a decision note for native answers). Broadcasts
|
|
1152
|
+
exclude off-roster peers; a person or agent addressing only removed peers is
|
|
1153
|
+
refused before publishing. The dashboard roster undo has its own peer-id
|
|
1154
|
+
confirmation and optional active-turn stop checkbox.
|
|
1155
|
+
|
|
1156
|
+
Without a roster setting, participation keeps the previous defaults. An explicit
|
|
1157
|
+
`roster.pi` overrides `pi.enabled`; otherwise that legacy switch continues to
|
|
1158
|
+
control Pi starts. External peer ids remain governed by their existing admission
|
|
1159
|
+
rules. A runtime permission override is cleared on removal and the configured
|
|
1160
|
+
default governs the next attachment. Config file edits outside the authorized
|
|
1161
|
+
roster setting do not change running participation: they take effect at the next
|
|
1162
|
+
hub start. The tracked config can provide defaults and config.local.json can
|
|
1163
|
+
override them.
|
|
1164
|
+
|
|
999
1165
|
## Settings from the dashboard and the terminal
|
|
1000
1166
|
|
|
1001
1167
|
The dashboard's Settings section and `ahub settings` show and change the same
|
|
@@ -1016,7 +1182,7 @@ ahub ui --settings # dashboard with a 15-minute settings session
|
|
|
1016
1182
|
| --- | --- | --- | --- |
|
|
1017
1183
|
| Permissions | `permission.<peer>` (the mode now) | the running hub only | at once |
|
|
1018
1184
|
| Permissions | `permission_modes.<peer>` (the mode at hub start) | `config.local.json` | next hub start |
|
|
1019
|
-
| Start | `peers.pi.start_mode`, `peers.codex.start_mode` (`tui` or `headless`) | `config.local.json` | that peer's next start |
|
|
1185
|
+
| Start | `peers.pi.start_mode`, `peers.codex.start_mode`, `peers.kimi.start_mode` (`tui` or `headless`) | `config.local.json` | that peer's next start |
|
|
1020
1186
|
| Start | `pi.auto_start` | `config.local.json` | next hub start |
|
|
1021
1187
|
| Routing | `routing.stay_switch`, `routing.classes.<class>.peers`, `.escalate_to`, `.route`, `.pi_backend` | `routing.local.toml` | at once |
|
|
1022
1188
|
| Switches | `research.enabled`, `approvals.notify`, `snapshots.enabled`, `coordination` | `config.local.json` | next hub start |
|
|
@@ -1070,7 +1236,7 @@ A peer that has a TUI the hub attaches to starts in it by default (issue #269).
|
|
|
1070
1236
|
| pi | `tui` | `ahub pi --headless` (or `--mode headless`), or `peers.pi.start_mode: headless` |
|
|
1071
1237
|
| codex | `tui` (`ahub codex`) | `peers.codex.start_mode: headless`: a hub-made start runs the app-server only |
|
|
1072
1238
|
| claude | `tui` (`ahub claude`) | none |
|
|
1073
|
-
| kimi |
|
|
1239
|
+
| kimi | `tui`, pull-only (`ahub kimi`) | `ahub kimi --mode headless`, or `peers.kimi.start_mode: headless` |
|
|
1074
1240
|
| local | headless (hub-native) | not applicable |
|
|
1075
1241
|
|
|
1076
1242
|
- **You type the command:** `ahub pi` opens Pi's TUI in that terminal.
|
|
@@ -1102,6 +1268,53 @@ A peer that has a TUI the hub attaches to starts in it by default (issue #269).
|
|
|
1102
1268
|
unplanned stop, a Pi that ran in a terminal is reported with its command and
|
|
1103
1269
|
is not replaced by a headless one unless headless is its start mode.
|
|
1104
1270
|
|
|
1271
|
+
### Kimi in its own TUI
|
|
1272
|
+
|
|
1273
|
+
`ahub kimi` runs Kimi in the person's terminal by default. The launcher atomically
|
|
1274
|
+
merges only `mcpServers["agent-hub"]` in `.kimi-code/mcp.json`, keeping foreign
|
|
1275
|
+
entries and fields. It contains machine paths and the peer identity, not a token.
|
|
1276
|
+
`ahub init` ignores that file when it is untracked; a tracked file is still written
|
|
1277
|
+
with a warning. `--print-command` shows the change and command without writing.
|
|
1278
|
+
The configured `kimi_cmd` must be a single executable or end in exactly `acp`;
|
|
1279
|
+
the TUI uses the executable or drops that final word. Other wrappers are refused
|
|
1280
|
+
with the headless command rather than guessed.
|
|
1281
|
+
|
|
1282
|
+
The TUI is pull-only. Its model reads `hub_inbox` at the start of work and before
|
|
1283
|
+
reporting, and shares results explicitly with `hub_send`. Status, the console and
|
|
1284
|
+
the dashboard show `pull-only`, the waiting count and the last inbox read. Messages
|
|
1285
|
+
and important markers do not push or interrupt it. There is no hub busy state,
|
|
1286
|
+
watchdog, console approval, hub permission mode, context reading, automatic quota
|
|
1287
|
+
pause/handoff, shared final answer or session resume. Read quota and approve tools
|
|
1288
|
+
in Kimi's own TUI; a person can pause the hub queue by hand. End the native terminal
|
|
1289
|
+
session there, not with `ahub stop kimi`.
|
|
1290
|
+
|
|
1291
|
+
Automatic routing never picks a pull-only owner or reviewer, even as the only
|
|
1292
|
+
candidate. A proposer can name the owner or claim its own task; a person or the
|
|
1293
|
+
conductor can name an owner or reviewer with
|
|
1294
|
+
`ahub task assign <id> kimi --role owner|reviewer`. A waiting task reserves its
|
|
1295
|
+
named owner; naming its reviewer is refused until dependencies are approved.
|
|
1296
|
+
A named review waits in the same inbox. Queue holds and pauses refuse a pull with
|
|
1297
|
+
the reason; an unaccepted assignment still follows the existing release deadline.
|
|
1298
|
+
|
|
1299
|
+
To switch to ACP, end the attached TUI and run `ahub kimi --mode headless`: the
|
|
1300
|
+
person's command removes only the hub's project MCP entry before starting ACP.
|
|
1301
|
+
A daemon-made headless start refuses a stale entry with that command and never
|
|
1302
|
+
edits the project file. To switch back, stop the headless peer with `ahub stop kimi`
|
|
1303
|
+
then run `ahub kimi --mode tui`. The peer id, queued messages and open tasks remain;
|
|
1304
|
+
the ACP session is not resumed in the TUI. Agents cannot switch modes.
|
|
1305
|
+
|
|
1306
|
+
Projects with no explicit Kimi start mode also move to this default on upgrade.
|
|
1307
|
+
The coordinating upgrade command announces it once; to keep ACP, run
|
|
1308
|
+
`ahub settings set peers.kimi.start_mode headless`.
|
|
1309
|
+
|
|
1310
|
+
Source preflight checked Kimi Code 2.1.1 at
|
|
1311
|
+
[f67e6398](https://github.com/MoonshotAI/kimi-code/tree/f67e6398fb3210ad8ace970e2dfd5bcc984ed61f):
|
|
1312
|
+
trusted ACP workspaces read the user, repository-root and project MCP files, and a
|
|
1313
|
+
passed session entry connects beside the project entry. Its model request path
|
|
1314
|
+
uses tool definitions and managed AGENTS instructions, not MCP initialize
|
|
1315
|
+
instructions. Folder trust, real TUI tool discovery and the model round trip are
|
|
1316
|
+
still unverified live; see `docs/smoke.md`.
|
|
1317
|
+
|
|
1105
1318
|
### Migration from 0.12.22 and earlier
|
|
1106
1319
|
|
|
1107
1320
|
Pi's default changes from headless to its TUI.
|
|
@@ -1354,8 +1567,8 @@ can run again), unless the error says the state cannot be read (a damaged
|
|
|
1354
1567
|
`hub.db` or journal fails the same way every time): `ahub reset --all --yes`
|
|
1355
1568
|
archives such a state directory as it is. A full reset names the archive once
|
|
1356
1569
|
the state directory has moved.
|
|
1357
|
-
It never touches claude-mem: notes saved with
|
|
1358
|
-
not hub state. Claude Code sessions attached to the hub lose their hub session;
|
|
1570
|
+
It never touches claude-mem or hub memory (`~/.agenthub/memory/`): notes saved with
|
|
1571
|
+
`hub_remember` are shared memory, not hub state. Claude Code sessions attached to the hub lose their hub session;
|
|
1359
1572
|
relaunch them with `ahub claude`.
|
|
1360
1573
|
|
|
1361
1574
|
## Orphaned daemons
|
|
@@ -1401,21 +1614,21 @@ section is what they run.
|
|
|
1401
1614
|
|
|
1402
1615
|
Upgrade running projects with the target release's own coordinator. It accepts
|
|
1403
1616
|
a running source on control protocol 9 (0.6.x), 10 (0.7.0 through 0.12.0),
|
|
1404
|
-
11 (0.12.1 and 0.12.2), 12 (0.12.3), 13 (0.12.4 through 0.12.15), 14 (0.12.16), 15 (0.12.17 through 0.12.19) or 16 (0.12.20 through 0.12.
|
|
1617
|
+
11 (0.12.1 and 0.12.2), 12 (0.12.3), 13 (0.12.4 through 0.12.15), 14 (0.12.16), 15 (0.12.17 through 0.12.19) or 16 (0.12.20 through 0.12.24), and only
|
|
1405
1618
|
a target on its own protocol, so the target's coordinator fits every supported
|
|
1406
1619
|
source and carries every recovery fix released up to it. Protocol 8 and older
|
|
1407
1620
|
(0.5.x and earlier) are refused as `manual-bootstrap-required`. Run from the
|
|
1408
1621
|
project directory, without replacing the global CLI first:
|
|
1409
1622
|
|
|
1410
1623
|
```bash
|
|
1411
|
-
bunx --package @staix/agent-hub@0.12.
|
|
1412
|
-
bunx --package @staix/agent-hub@0.12.
|
|
1624
|
+
bunx --package @staix/agent-hub@0.12.24 ahub upgrade --to 0.12.24 --dry-run
|
|
1625
|
+
bunx --package @staix/agent-hub@0.12.24 ahub upgrade --to 0.12.24 --yes
|
|
1413
1626
|
```
|
|
1414
1627
|
|
|
1415
1628
|
| Running now | Coordinator to use |
|
|
1416
1629
|
| --- | --- |
|
|
1417
1630
|
| 0.6.x (protocol 9) | the target's, through `bunx` as above |
|
|
1418
|
-
| 0.7.0 through 0.12.0 (protocol 10), 0.12.1 and 0.12.2 (protocol 11), 0.12.3 (protocol 12), 0.12.4 through 0.12.15 (protocol 13), 0.12.16 (protocol 14), 0.12.17 through 0.12.19 (protocol 15), 0.12.20 through 0.12.
|
|
1631
|
+
| 0.7.0 through 0.12.0 (protocol 10), 0.12.1 and 0.12.2 (protocol 11), 0.12.3 (protocol 12), 0.12.4 through 0.12.15 (protocol 13), 0.12.16 (protocol 14), 0.12.17 through 0.12.19 (protocol 15), 0.12.20 through 0.12.24 (protocol 16) | the target's, through `bunx` as above |
|
|
1419
1632
|
| any supported source, with the installed CLI already at the target | `ahub upgrade` below, which is the same coordinator |
|
|
1420
1633
|
| 0.5.x or earlier (protocol 8 and older) | not supported: bootstrap by hand with the matching CLI |
|
|
1421
1634
|
|
|
@@ -1447,14 +1660,14 @@ projects first:
|
|
|
1447
1660
|
|
|
1448
1661
|
```bash
|
|
1449
1662
|
ahub restart --dry-run
|
|
1450
|
-
ahub upgrade --to 0.12.
|
|
1663
|
+
ahub upgrade --to 0.12.24 --dry-run
|
|
1451
1664
|
```
|
|
1452
1665
|
|
|
1453
1666
|
Apply only after reviewing the plan:
|
|
1454
1667
|
|
|
1455
1668
|
```bash
|
|
1456
1669
|
ahub restart --yes
|
|
1457
|
-
ahub upgrade --to 0.12.
|
|
1670
|
+
ahub upgrade --to 0.12.24 --yes
|
|
1458
1671
|
ahub recovery status [<operation-id>]
|
|
1459
1672
|
ahub recovery resume [<operation-id>]
|
|
1460
1673
|
ahub recovery abort [<operation-id>]
|
|
@@ -2092,7 +2305,12 @@ include the stamped ancestors (CI checks out full history).
|
|
|
2092
2305
|
During release preparation, source review precedes restamping. Review each stale
|
|
2093
2306
|
page against its covered source, correct drift, and use the full SHA of the
|
|
2094
2307
|
reviewed source commit as `verifiedAgainst`. Record any deferred page and its
|
|
2095
|
-
specific unverified claims in the release verification report before tagging.
|
|
2308
|
+
specific unverified claims in the release verification report before tagging. Deferred
|
|
2309
|
+
pages must still be source-reviewed and current; a deferral is not a stale-stamp waiver.
|
|
2310
|
+
The tag gate runs `node scripts/check-docs.mjs --require-fresh` with full history
|
|
2311
|
+
before publishing. Stale or nonancestor stamps refuse publication, with the
|
|
2312
|
+
release merge-commit instruction; an identical tree and green CI cannot waive this.
|
|
2313
|
+
|
|
2096
2314
|
Do not advance a stamp solely to clear a notice. Source stamps can name an
|
|
2097
2315
|
ancestor: the manifest-only follow-up commit need not hash or stamp itself.
|
|
2098
2316
|
|
|
@@ -2296,3 +2514,422 @@ prompt was accepted but before history was persisted is not treated as empty:
|
|
|
2296
2514
|
its delivery is held, and another start refuses until resume history is verified.
|
|
2297
2515
|
Inspect and settle the held delivery before deliberately replacing that unpersisted
|
|
2298
2516
|
session by restarting the hub; the stop never silently chooses a fresh session.
|
|
2517
|
+
|
|
2518
|
+
A pull-only Kimi TUI has no controlled restore or resume. While it is attached,
|
|
2519
|
+
upgrade/restart planning stops before effects and asks the person to end Kimi in
|
|
2520
|
+
that terminal and make a new plan. Headless Kimi restoration stays headless even
|
|
2521
|
+
though the unset launch mode now means TUI; older targets keep their legacy
|
|
2522
|
+
command without a mode flag. Native recovery remains unverified.
|
|
2523
|
+
|
|
2524
|
+
Changing a reviewer on a task in review withdraws unread requests and tells the
|
|
2525
|
+
former reviewer its request is withdrawn. A delivered request cannot be recalled,
|
|
2526
|
+
but a later verdict from that former reviewer is refused by current authority.
|
|
2527
|
+
|
|
2528
|
+
Legacy Claude pull-only sessions retain their existing automatic owner/reviewer
|
|
2529
|
+
selection; the watched-Kimi exclusion does not disable that review path. After
|
|
2530
|
+
first creating the Kimi MCP file, run `ahub init` to ignore the untracked file.
|
|
2531
|
+
Init leaves existing ignore bytes alone when no Kimi MCP file exists.
|
|
2532
|
+
## Scoped grants for instruction files
|
|
2533
|
+
|
|
2534
|
+
`ahub settings set scoped_grants.protect_instructions true` asks a person before
|
|
2535
|
+
Pi/local scoped writes and edits to `AGENTS.md`, `CLAUDE.md` and `QWEN.md`, and
|
|
2536
|
+
withholds automatic permission from the managed Claude hook. Case, compatibility
|
|
2537
|
+
forms and both symlink spellings are checked. The default is false: these project
|
|
2538
|
+
documents remain editable under scoped grants. Reads, explicit approval and
|
|
2539
|
+
never-ask keep their existing behavior.
|
|
2540
|
+
|
|
2541
|
+
Use `ahub settings preview scoped_grants.protect_instructions true` before a
|
|
2542
|
+
change and `ahub settings undo` to restore it. It is in the Permissions registry,
|
|
2543
|
+
writes only machine-local `protect_instruction_files`, and applies immediately
|
|
2544
|
+
in the running hub. A dashboard settings session may change it; an ordinary
|
|
2545
|
+
session may turn protection on but cannot weaken it. No agent surface changes it.
|
|
2546
|
+
Like other machine-local security defaults, loading it requires git to establish
|
|
2547
|
+
that the file is untracked; a dropped value is reported by the settings result.
|
|
2548
|
+
|
|
2549
|
+
## SDLC artifact receipts and gates
|
|
2550
|
+
|
|
2551
|
+
The initial #257 lifecycle is off without .agenthub/sdlc.toml. Advise shows blockers; enforce checks head-bound review and approval transitions. See [the SDLC contract](sdlc.md) for the fixed stage order, required check names, claimed local receipts, console-only readbacks and pending custom/release/live parts. Owners/reviewers record bounded identities through hub_sdlc_record; these grant no additional authority.
|
|
2552
|
+
## Optional Qwen Code peer
|
|
2553
|
+
|
|
2554
|
+
Select Qwen per project with `ahub roster add qwen`; it defaults off and is absent
|
|
2555
|
+
from default class preferences. `ahub qwen [--mode headless] [--model <alias>]`
|
|
2556
|
+
starts its ACP peer. `--print-command` previews; TUI is refused until #286's
|
|
2557
|
+
verification. `ahub stop qwen` stops the owned process group. A conductor may start
|
|
2558
|
+
it only through the selected roster and existing capabilities.
|
|
2559
|
+
|
|
2560
|
+
The supported native ACP identity is qwen-code 0.25.0. A CLI version label alone
|
|
2561
|
+
is insufficient: startup verifies its native identity/version and advertised mode
|
|
2562
|
+
ids before any prompt. The observed local installation reports CLI 0.25.0 while
|
|
2563
|
+
its package/ACP source says 0.24.1; do not call that installation ready. Configure
|
|
2564
|
+
`qwen_cmd` only in untracked config.local.json with a verified 0.25.0 executable.
|
|
2565
|
+
The provider's tunnel/relay, if needed, must already be available. Startup cannot
|
|
2566
|
+
prove network readiness from a version command.
|
|
2567
|
+
|
|
2568
|
+
Modes: ask maps to default, scoped frequency maps to auto-edit, never-ask maps to
|
|
2569
|
+
yolo. Qwen yolo approves every tool outside any hub sandbox; its own vendor bounds
|
|
2570
|
+
apply. Auto and plan are not hub mode mappings. Unknown quota refusals are not
|
|
2571
|
+
classified as authoritative quota; until a real pinned refusal is recorded, pause
|
|
2572
|
+
by hand. Occupancy is context with a source, never a consumption estimate. Roles
|
|
2573
|
+
do not establish that Qwen can reliably replace Kimi before the live leg.
|
|
2574
|
+
|
|
2575
|
+
Qwen controlled recovery and automatic crash resume load the recorded conversation with ACP session/load. The emitted launcher passes --session-id; a controlled plan with a missing or unsafe identity refuses before effects. Preview redacts the id. A custom executable argv keeps its wrapper arguments before appended model flags. Native recovery remains unverified.
|
|
2576
|
+
|
|
2577
|
+
## Optional Jcode peer
|
|
2578
|
+
|
|
2579
|
+
Use ahub roster add jcode, then ahub jcode --mode headless [--model <alias>] [--provider-profile <name>]. The person launcher configures only agent-hub-jcode in .jcode/mcp.json; run ahub init afterwards to ignore the untracked machine-path file. Conductor/dashboard starts read that entry without editing it. Preview starts nothing, and ahub stop jcode stops only the owned private daemon/ACP groups. jcode_cmd, jcode_home and jcode_provider_profile are machine-local and never editable from settings.
|
|
2580
|
+
|
|
2581
|
+
Native policy is unmanaged and has NO hub sandbox; no permission_modes.jcode or runtime mode mapping is invented. Quota and consumption remain unknown. Version 0.94.0 cannot prove native session/load identity, so attached Jcode blocks controlled recovery before effects and crash recovery asks for deliberate native reopening. A requested load without an echoed identity refuses; no fresh session is presented as restored. Provider/tool/native teardown receipts remain unverified in the pinned contract report.
|
|
2582
|
+
|
|
2583
|
+
# Headless ACP watch (#286)
|
|
2584
|
+
|
|
2585
|
+
- A person opens `ahub watch kimi` or `ahub watch qwen` in a second terminal. `--no-thoughts` hides thought items; `--color=auto|always|never` controls colour. `q` or Ctrl+C leaves the view, keeping the peer running. Answer approvals in `ahub console` or with `ahub permit`.
|
|
2586
|
+
- Watch replays bounded memory history from this daemon, then displays live updates. It is the hub's read-only view, with no prompt input. It does not read native session files.
|
|
2587
|
+
- Kimi's default is its own pull-only TUI (#316). Watch requires `ahub kimi --mode headless`; its own TUI remains visible in its native terminal. Qwen requires roster participation and verified ACP 0.25.0. `ahub qwen --mode tui` remains refused.
|
|
2588
|
+
- Protocol stays 16; a same-protocol older daemon answers the new request as unknown, which the CLI reports. No automatic pane opening is included in this slice.
|
|
2589
|
+
- Native T0 limits: [ACP watch verification](verification/2026-10-11-acp-watch-t0.md).
|
|
2590
|
+
|
|
2591
|
+
# gsd-lite lifecycle guidance (#257)
|
|
2592
|
+
|
|
2593
|
+
- Set `workflow = "gsd-lite"` in `.agenthub/sdlc.toml` for the next daemon start; default none preserves the existing flow. Mode advise displays checklist blockers without blocking, while enforce checks them at approval.
|
|
2594
|
+
- The task reviewer/person records phase criteria via `ahub sdlc record <id> '<receipt JSON>'`. Existing tasks and predecessor ids must match the board; import does not move owners or edit dependencies. Use the existing task propose `--after` command to create edges.
|
|
2595
|
+
- `ahub sdlc status <id>`, `explain <id>` and `export <id>` read the same current board/config projection. Export hashes are projection/config hashes, with no external text, extra authority or verification claim. Schema and example: [SDLC](sdlc.md#gsd-lite-checklist-guidance).
|
|
2596
|
+
|
|
2597
|
+
# Catalog session guidance (#295)
|
|
2598
|
+
|
|
2599
|
+
- Read available guidance with `ahub role list [--group dev|research]` and `ahub role show <id>`. Each definition identifies its layer and content hash. Doctor reports invalid files/selections without printing their contents.
|
|
2600
|
+
- Select up to two ids per peer in `catalog_roles` in the shared/local config, with at least one flow base already held by that peer. Empty local lists clear shared selections. This initial slice applies selections at a new daemon/MCP/adapter start; live assignment/settings and task roles follow separately.
|
|
2601
|
+
- Defaults preserve the existing flow. Catalog guidance adds no authority or routing preference. Native ingestion/retention and measured benefit remain unverified. Schema, bounds and source notice: [roles](roles.md).
|
|
2602
|
+
|
|
2603
|
+
# Project profiles (#259)
|
|
2604
|
+
|
|
2605
|
+
- Initialize new projects with `ahub init --profile research|writing|general`; default dev retains its existing templates and contracts. Profile aliases map to the existing base flow and are displayed beside it.
|
|
2606
|
+
- Non-dev plans declare paths, section anchors, source ids and claims. Configure completion checks explicitly in machine-local config; selecting a profile never starts a check or study. Schema, examples and pending converter/policy slices: [profiles](profiles.md).
|
|
2607
|
+
|
|
2608
|
+
# Private and read-only data paths (#259)
|
|
2609
|
+
|
|
2610
|
+
- Optional pii.paths forces matching declared refs/plans/section files to the on-prem flow before triage and memory, including when ordinary pattern routing is off. Optional data.readonly protects managed local/Pi writes and makes managed commands filesystem read-only.
|
|
2611
|
+
- Both lists are empty by default and apply at daemon start. Reads/stdout remain available; command-created files/caches are blocked in read-only mode. Exact path rules, alias handling and evidence: [data policy](data-policy.md).
|
|
2612
|
+
|
|
2613
|
+
# Rich-document text projections (#259)
|
|
2614
|
+
|
|
2615
|
+
- Configure text_projection only in an untracked machine-local file, with a separate {input} argv argument. Facts uses bounded read-only/no-network conversion and a content/config cache; failure keeps the prior file view and logs a bounded notice.
|
|
2616
|
+
- Raw change identity and projected presentation stay separate; private paths never enter conversion. Schema, limits and current surface scope: [text projections](text-projection.md).
|
|
2617
|
+
|
|
2618
|
+
# Task catalog guidance (#295)
|
|
2619
|
+
|
|
2620
|
+
- A proposal may name `role` from `ahub role list`. The allowed class list is checked in Tasks, and assignment/review notices carry bounded guidance. The role grants no authority and changes no routing decision. Scope and pending person-assignment surfaces: [roles](roles.md).
|
|
2621
|
+
|
|
2622
|
+
# Person catalog-role assignment (#295)
|
|
2623
|
+
|
|
2624
|
+
- Use `ahub role assign <peer> <id>` or `ahub role clear <peer> [<id>]`, or the dashboard Roles settings group. The selection is bounded to two compatible catalog ids, writes only machine-local settings and applies at the next peer start. Inherit and explicit no roles are distinct.
|
|
2625
|
+
- Change an open task's guidance with `ahub task role <id> <role|none>`. Agent shells and peer/tools control clients cannot use these mutation commands. Details and unconfirmed native consumption: [roles](roles.md).
|
|
2626
|
+
|
|
2627
|
+
# Document projection review and undo
|
|
2628
|
+
|
|
2629
|
+
- Machine-local text_projection also supplies bounded review and reverse undo previews from stored raw snapshots. Task-proposal baselines survive restart and reviewer changes; missing/private/pruned evidence is unavailable. See [text projections](text-projection.md) for caps and converter requirements.
|
|
2630
|
+
- Undo remains a raw-file operation: projected text cannot bypass later-edit, concurrency or unknown-turn refusals. Native model/account ingestion remains unverified.
|
|
2631
|
+
|
|
2632
|
+
# Opt-in shadow repository
|
|
2633
|
+
|
|
2634
|
+
- `ahub init --profile research|writing|general --shadow [--dry-run --json]` supplies hub-owned snapshot/facts/undo storage for a non-git folder. It creates no `.git` entry and never switches an existing Git project.
|
|
2635
|
+
- Maintain `.agenthub/ignore` for large/raw data. Snapshot and facts operations leave the shadow index/HEAD alone; raw undo refusal rules remain authoritative. Shadow metadata stays protected from managed worker writes. See [profiles](profiles.md).
|
|
2636
|
+
|
|
2637
|
+
# Per-project profile data
|
|
2638
|
+
|
|
2639
|
+
- Use `profile_overrides` for class aliases, supported plan selection, role guidance, catalog defaults, managed AGENTS content and advisory example checks. Shared/local maps merge by key; selections/text replace. See [profiles](profiles.md).
|
|
2640
|
+
- Refresh instructions with init and restart the daemon/MCP clients to apply their resolved contracts. Existing flow-role and executable-check authority remains in `roles`/trusted `checks`. Native model/account evidence remains unverified.
|
|
2641
|
+
|
|
2642
|
+
|
|
2643
|
+
## Staging work in Backlog (#263)
|
|
2644
|
+
|
|
2645
|
+
Use `ahub task propose implement "Later work" --backlog --owner codex` to stage
|
|
2646
|
+
work without routing it. The owner is a reservation, including when an agent
|
|
2647
|
+
names itself. Normal proposal behavior is unchanged without `--backlog`.
|
|
2648
|
+
|
|
2649
|
+
The person inspects `ahub board backlog` and `ahub task show <id>`, then runs
|
|
2650
|
+
`ahub backlog pull <id>` to put it in To Do. Dependencies still block assignment.
|
|
2651
|
+
Ready work uses the existing assignment and delivery-recovery contract; if no
|
|
2652
|
+
peer can take it, a later attachment or restart can offer it. Return ownerless
|
|
2653
|
+
To Do work with `ahub backlog return <id>`. Owned or started work cannot return.
|
|
2654
|
+
|
|
2655
|
+
Ordinary agent task lists and conductor task reads exclude Backlog. Staged work
|
|
2656
|
+
is never claimed, accepted, completed, swept, escalated or relayed. PII cards and
|
|
2657
|
+
notices use the existing public stub. Planner grooming, five-column views, releases and dates are described below.
|
|
2658
|
+
The native planner/two-release smoke remains unverified; board release actions
|
|
2659
|
+
never tag or publish software.
|
|
2660
|
+
|
|
2661
|
+
|
|
2662
|
+
Pulling Backlog establishes its first execution-proposal boundary for projected
|
|
2663
|
+
review snapshots and research records. An initial Backlog row is not an offered
|
|
2664
|
+
proposal. Research uses the first pull time and preserves identity across later
|
|
2665
|
+
unstarted return/pull cycles; a new backlogged id after reset starts a new record
|
|
2666
|
+
generation. Partial work with acceptance/check/review evidence cannot return to
|
|
2667
|
+
Backlog even after decline or reassignment leaves it ownerless.
|
|
2668
|
+
|
|
2669
|
+
|
|
2670
|
+
## Dashboard project board (#263)
|
|
2671
|
+
|
|
2672
|
+
The board displays Backlog, To Do, In Progress, Review / QA and Done from task
|
|
2673
|
+
states. To Do separates ready work from dependency, reservation, delivery-hold
|
|
2674
|
+
and unavailable-owner waits. Review and Done offer no flow dragging. Owner and
|
|
2675
|
+
reviewer names remain readable beside their filled/outlined color markers.
|
|
2676
|
+
Urgent tasks display P0 and a star; ordinary legacy tasks display P2.
|
|
2677
|
+
|
|
2678
|
+
The legend reads the same live peer status as `ahub status`, with a derived
|
|
2679
|
+
owned-work count, active board ids and explicit permission display. Use the agent
|
|
2680
|
+
filter or By agent lanes to inspect work. Done shows recent rows first, with
|
|
2681
|
+
older rows expandable. At phone width columns stack and controls remain usable.
|
|
2682
|
+
|
|
2683
|
+
Drag eligible work onto a peer to assign it, or use its labelled select and
|
|
2684
|
+
Assign button. Drag Backlog into To Do to pull it; return only ownerless To Do
|
|
2685
|
+
work to Backlog. Each move has a button/keyboard equivalent and reaches `Tasks`
|
|
2686
|
+
through the existing authenticated console/dashboard action path. Cards carry
|
|
2687
|
+
origin, project, instance and view-generation fences; stale or foreign drags
|
|
2688
|
+
are refused. Review/verdict/approval transitions stay with their flow actors.
|
|
2689
|
+
|
|
2690
|
+
A hub advertises Backlog support explicitly. Older or unknown snapshots cannot
|
|
2691
|
+
silently turn Add to Backlog into an immediate offer. PII cards retain their
|
|
2692
|
+
public stub; legend entries contain ids/counts, never task prose. Planning priority/rank, releases, dates, planner grooming/undo and GitHub import
|
|
2693
|
+
are described below. Native planner-cycle evidence remains unverified.
|
|
2694
|
+
|
|
2695
|
+
|
|
2696
|
+
## Planning and phased releases (#263)
|
|
2697
|
+
|
|
2698
|
+
Use `ahub backlog list` to read public staged work, then `ahub backlog plan <id>
|
|
2699
|
+
<revision> <fields-json> <reason>` to set rank, priority (0-3), release id, planned
|
|
2700
|
+
start/due UTC milliseconds or pin. `pin` accepts true/false; `undo` needs the
|
|
2701
|
+
current revision and latest eligible edit. The dashboard provides local-time
|
|
2702
|
+
date fields, task/release filters and lanes, and Reload current values when an
|
|
2703
|
+
edit is stale. A person's order, pins and frozen scopes protect planner changes.
|
|
2704
|
+
|
|
2705
|
+
Create a phase with `ahub release new <name> <goal> <order>`, inspect `list` or
|
|
2706
|
+
`show`, and set planned start/cut/ship with `plan <name> <revision> <dates-json>`.
|
|
2707
|
+
`activate`, `freeze`, `ship` and `drop` need its current revision. Only a person
|
|
2708
|
+
freezes, ships, drops or edits frozen scope. Ship records the first ship time
|
|
2709
|
+
only after every member is approved or moved out; it runs no tag or publish.
|
|
2710
|
+
The dashboard shows phase progress, blocking dependencies, dates and remaining
|
|
2711
|
+
work. Actual task dates come from execution/review/approval history, never input.
|
|
2712
|
+
|
|
2713
|
+
Configured planners read `hub_backlog_list` and `hub_release_list`, edit with
|
|
2714
|
+
`hub_backlog_plan`, and undo their own latest eligible change with
|
|
2715
|
+
`hub_backlog_undo`. Catalog guidance or a caller-supplied role grants no authority.
|
|
2716
|
+
PII cards stay stubs, reasons are screened/withheld in public history, and planning
|
|
2717
|
+
telemetry records ids/changed fields without prose. #247 task records carry
|
|
2718
|
+
optional release, priority, plannedStart and due, retaining unknown legacy data.
|
|
2719
|
+
|
|
2720
|
+
Dependency/reservation planning, split/pull WIP limits, batched incoming notices
|
|
2721
|
+
and one-way GitHub import are described below. Source checks are recorded in the
|
|
2722
|
+
release verification report. Native planner work across two releases remains
|
|
2723
|
+
unverified; source and fixture checks do not establish installed live behavior.
|
|
2724
|
+
|
|
2725
|
+
Office merge corrections retain the header's view selector when Off hides the
|
|
2726
|
+
scene. Activating a card reveals its task if a state filter excluded it; Work
|
|
2727
|
+
includes rework. Stable desk slots determine bounds after peers disconnect.
|
|
2728
|
+
Reduced motion removes departures immediately and the existing snapshot poll
|
|
2729
|
+
prunes transient deadlines without new timers. Explicit unattributed turns have
|
|
2730
|
+
no guessed task bubble. Warning caps retain conflicts first and parallel warning
|
|
2731
|
+
kinds have separate segments/labels. Physical visual validation remains pending.
|
|
2732
|
+
|
|
2733
|
+
|
|
2734
|
+
Planner backlog plans also accept `deps` (at most 64 unique task ids) and
|
|
2735
|
+
`reserved` (rostered peer id or null). Dependency/reservation edits require
|
|
2736
|
+
unstarted, unowned backlog work even for the person; cycles and missing ids
|
|
2737
|
+
are refused before persistence. Planning undo restores previous dependency and
|
|
2738
|
+
reservation values at the same revision fence. Editing never routes work.
|
|
2739
|
+
|
|
2740
|
+
|
|
2741
|
+
Release date editors invalidate stale revisions and offer Reload current release
|
|
2742
|
+
without overwriting unsaved dates. Project changes clear release creation drafts.
|
|
2743
|
+
Dashboard release actions use public numeric ids even when labels are withheld;
|
|
2744
|
+
`ahub release show <name>` looks up the stored identity on the console and returns
|
|
2745
|
+
the screened public projection. Exact-head source verification is recorded in the release report.
|
|
2746
|
+
|
|
2747
|
+
|
|
2748
|
+
## Planner WIP pull (#263)
|
|
2749
|
+
|
|
2750
|
+
`hub_backlog_pull` takes id, current planning revision and a bounded reason. A
|
|
2751
|
+
configured planner with assignment capability reserves a ready To Do slot using
|
|
2752
|
+
current routing, roster, class, quota and health constraints. It refuses pins,
|
|
2753
|
+
unapproved dependencies, frozen scope and overriding person P0 order/reservations.
|
|
2754
|
+
The person uses `ahub backlog pull-ready <id> <revision> <reason>` or Pull within
|
|
2755
|
+
WIP on a card. Explicit manual pull/assignment retain their existing authority.
|
|
2756
|
+
|
|
2757
|
+
Capacity defaults to one per peer. `ahub settings set tasks.wip_limits.codex 2`
|
|
2758
|
+
uses the existing machine-local registry path; integers 0..32 apply at hub start,
|
|
2759
|
+
with 0 disabling planner admission for that peer. Stored pending values and
|
|
2760
|
+
effective runtime limits remain distinct. Status and the agent legend count
|
|
2761
|
+
owned unfinished work plus unowned planner-pull reservations.
|
|
2762
|
+
|
|
2763
|
+
Pending unowned, unstarted pull can be undone at its latest owned revision via
|
|
2764
|
+
`hub_backlog_undo` or the existing planning undo control, restoring its earlier
|
|
2765
|
+
reservation. An ordinary return to Backlog also restores the pre-pull reservation unless a later explicit reservation edit superseded it. Normal release routing offers work only while that reserved peer
|
|
2766
|
+
still has capacity; no other peer inherits its slot. Split and one-way import are described below. Native verification remains
|
|
2767
|
+
outstanding; exact-head source checks are recorded separately.
|
|
2768
|
+
|
|
2769
|
+
|
|
2770
|
+
Planned-date editors preserve loaded UTC milliseconds until their displayed
|
|
2771
|
+
value changes, including repeated local wall times during a clock change. Local
|
|
2772
|
+
inputs retain seconds/milliseconds and support HTML date years without truncating
|
|
2773
|
+
fields; see https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#local-dates-and-times.
|
|
2774
|
+
Date-editor source proof is recorded with the exact-head checks.
|
|
2775
|
+
|
|
2776
|
+
|
|
2777
|
+
## Backlog split (#263)
|
|
2778
|
+
|
|
2779
|
+
Use `hub_backlog_split` with parent id/revision, reason and two to eight part
|
|
2780
|
+
objects, or `ahub backlog split <id> <revision> <parts-json> <reason>`. Each part
|
|
2781
|
+
has a title and optional detail/class/refs/plan; `after` names existing ids and
|
|
2782
|
+
`afterParts` names earlier zero-based parts. The selected task's dashboard Split
|
|
2783
|
+
form accepts one title per line and optional sequential dependencies.
|
|
2784
|
+
|
|
2785
|
+
The original card remains integration/acceptance work and waits for every part.
|
|
2786
|
+
Children retain prerequisite, privacy and phase planning. A person's P0 order
|
|
2787
|
+
permits that goal's required predecessors, preventing dependency deadlock.
|
|
2788
|
+
Unused unchanged backlog children can be removed by latest split undo; later
|
|
2789
|
+
edits, execution, ownership or outside references refuse it. All writes roll
|
|
2790
|
+
back together and observers receive changes only after commit. Exact-head source checks are recorded separately; native verification remains
|
|
2791
|
+
unverified.
|
|
2792
|
+
|
|
2793
|
+
|
|
2794
|
+
The manager allows split screening, the bounded database wait and forwarding margin before declaring a missing reply unconfirmed. Reload the task before retrying an unconfirmed split. Stored role ids survive unavailable catalog guidance. Task memory-reference markers do not supersede assignment or check results, and dependency recovery ignores them.
|
|
2795
|
+
|
|
2796
|
+
## One-way GitHub intake (#263)
|
|
2797
|
+
|
|
2798
|
+
`ahub board import github --label <label> [--milestone <milestone>]
|
|
2799
|
+
[--repo <owner/repo>]` is person-only. Omitted repo is resolved by gh in the
|
|
2800
|
+
project directory. The command reads open issues with fixed bounded argv and
|
|
2801
|
+
stages up to 32 into unoffered Backlog, retaining canonical repo/issue identity
|
|
2802
|
+
across restarts. Repeating intake does not refresh or overwrite existing cards.
|
|
2803
|
+
|
|
2804
|
+
The response lists confirmed imported/existing task ids and explicit partial,
|
|
2805
|
+
complete and unconfirmed state. A truncated page, time budget or interrupted
|
|
2806
|
+
staging is incomplete; repeat safely to reconcile the persisted identity.
|
|
2807
|
+
Public cards link to their source; PII cards expose no external identity.
|
|
2808
|
+
GitHub comments/labels/assignment/closure are never written. Exact-head source checks are recorded separately. Native verification remains
|
|
2809
|
+
unverified; no live account import was performed.
|
|
2810
|
+
|
|
2811
|
+
|
|
2812
|
+
`ahub board --columns` groups the same state-derived columns and ready/waiting
|
|
2813
|
+
reasons as the dashboard; `--release <name> | --release-id <id>` filters public rows on the hub.
|
|
2814
|
+
`--columns --json` returns filtered tasks and column metadata together. Ordinary
|
|
2815
|
+
peer reads retain the existing backlog prohibition. Phase views flag public ids
|
|
2816
|
+
approved after a known cut outside that release, and separately list unknown
|
|
2817
|
+
approval times without inventing dates. Exact-head source verification is recorded in the release report.
|
|
2818
|
+
## Global attention and prompt output (#280, phase 3)
|
|
2819
|
+
|
|
2820
|
+
`ahub pet` reads the selected project's status file without a control token or
|
|
2821
|
+
network connection. It accepts only structural counts/state/first metadata from
|
|
2822
|
+
a confirmed daemon owner. Missing, malformed, legacy or unconfirmed data is
|
|
2823
|
+
reported as unavailable; it is not an empty live hub. `ahub pet --short` writes
|
|
2824
|
+
`ahub!N` when a known action count is positive, otherwise no bytes, including no
|
|
2825
|
+
newline. Explicit `pet` reads remain available when the presentation is off;
|
|
2826
|
+
normal `ahub status` appends the line only while the project's pet is enabled.
|
|
2827
|
+
|
|
2828
|
+
An open recovery lock is read without coordinating the operation. Only the
|
|
2829
|
+
shared runner check's observed absence adds an action; unknown remains watch and
|
|
2830
|
+
is labelled unknown. A matching daemon recovery watch is replaced once, without
|
|
2831
|
+
double counting. A missing hub status is labelled unavailable even when a known
|
|
2832
|
+
recovery action can be shown. The output never resumes, aborts or disposes a run.
|
|
2833
|
+
|
|
2834
|
+
Person-reviewed tasks contribute review actions; an offline peer holding
|
|
2835
|
+
unfinished work contributes one watch item with its lowest task id. The console
|
|
2836
|
+
receives those structural facts through its existing authenticated status reply.
|
|
2837
|
+
`n` selects an exact visible review task, or prints the task/review guidance if
|
|
2838
|
+
that row is unavailable. Offline guidance names status/task reads and an explicit
|
|
2839
|
+
assignment command. No command is executed by navigation. There is no extra
|
|
2840
|
+
console poll, timer or task-list request for stream mode.
|
|
2841
|
+
|
|
2842
|
+
Intentionally person-owned work is not an offline agent. Neither user nor hub
|
|
2843
|
+
creates an offline watch item, while person-reviewed tasks remain actionable.
|
|
2844
|
+
Status reads only the board's structural id/state/owner/reviewer projection and
|
|
2845
|
+
reuses it for retained peer ids, avoiding task body/plan/history decoding.
|
|
2846
|
+
|
|
2847
|
+
Planner reservations normalize the same lowercase peer syntax as owner arguments,
|
|
2848
|
+
reject reserved pseudo-peers and unknown unconfigured ids, and still enforce the
|
|
2849
|
+
roster. Returning unstarted ownerless work to Backlog joins the next planner
|
|
2850
|
+
notice batch without waiting for a restart.
|
|
2851
|
+
|
|
2852
|
+
Queued planner batches retain bounded ids-only backlog references and recheck
|
|
2853
|
+
the board at actual delivery. A batch containing pulled/removed work is discarded
|
|
2854
|
+
before reaching the planner; its remaining backlog ids join the next batch. This
|
|
2855
|
+
floor also applies during the legacy stale-notice delivery experiment. No task
|
|
2856
|
+
text is copied and no routing/ownership state changes.
|
|
2857
|
+
|
|
2858
|
+
## Console character choices (#280)
|
|
2859
|
+
|
|
2860
|
+
`pet.character` selects stai (default), gyul, lantern, cursor-cat or boxbot.
|
|
2861
|
+
`pet.size` selects line (default), mini or full. Mini needs 100 columns; full also
|
|
2862
|
+
needs 40 rows, and smaller terminals fall back automatically. `P` cycles the
|
|
2863
|
+
built-ins and off for the current console only. `?` lists this under Pet, even
|
|
2864
|
+
while drawing is off. The command prompt keeps its original row and width.
|
|
2865
|
+
|
|
2866
|
+
`pet.glyphs` selects auto/ascii/blocks; unsupported locales and dumb/linux
|
|
2867
|
+
terminals retain the ASCII floor. `pet.blink:false` is static. Neither choosing
|
|
2868
|
+
nor drawing a character changes authority, config files, task state or polling.
|
|
2869
|
+
Explicit `ahub pet` and text status use the configured line face; prompt tokens
|
|
2870
|
+
remain character-independent. Native glyph width and tmux are unverified.
|
|
2871
|
+
|
|
2872
|
+
## Dashboard attention character (#280)
|
|
2873
|
+
|
|
2874
|
+
The dashboard header draws the configured built-in character independently of
|
|
2875
|
+
Office. It uses the same structural needs model as status and the console. The
|
|
2876
|
+
accessible button names the character, state and action/watch counts; the tab
|
|
2877
|
+
title shows the action count. Activating the button scrolls and focuses the exact
|
|
2878
|
+
visible approval/task/peer row, or its related section with fixed id-only guidance
|
|
2879
|
+
when the row is filtered or unavailable. It performs no action and changes no
|
|
2880
|
+
filters. Legacy snapshots without attention keep the widget hidden.
|
|
2881
|
+
|
|
2882
|
+
Only a live approval alternates the two waiting poses once per second through
|
|
2883
|
+
CSS. `pet.blink:false` and reduced motion retain a static pose. No new timer,
|
|
2884
|
+
request, image protocol or character-file load is added. Project reset clears
|
|
2885
|
+
the widget and title. Native/browser visual validation remains unverified.
|
|
2886
|
+
With mini/full characters, active console notices remain visible away from the
|
|
2887
|
+
character: panel body rows show the bounded wrapped notice, and stream mode
|
|
2888
|
+
prints each fresh notice once through the existing local stream. Footer prose
|
|
2889
|
+
exclusion and fixed prompt/footer geometry remain. No new request or timer.
|
|
2890
|
+
|
|
2891
|
+
Automatic reroutes of planner-pulled work retain WIP and delivery-hold admission
|
|
2892
|
+
during offline, budget, roster and idle recovery. Explicit manual assignments
|
|
2893
|
+
retain their existing override authority.
|
|
2894
|
+
|
|
2895
|
+
|
|
2896
|
+
GitHub intake refuses comma-containing labels rather than allowing gh to split
|
|
2897
|
+
one literal label into several filters. WIP capacity excludes owner candidates
|
|
2898
|
+
only; eligible reviewers retain normal review routing. An auto-reassigning
|
|
2899
|
+
planner idle sweep waits without consuming its final step while no owner has
|
|
2900
|
+
capacity. Parent-only memory notes do not prevent unused child undo; child
|
|
2901
|
+
reference markers remain protected. Split-part plan schemas follow the selected
|
|
2902
|
+
project profile. Terminal tables preserve the visible read for stages and use
|
|
2903
|
+
a fresh peer status read on the same authenticated connection.
|
|
2904
|
+
|
|
2905
|
+
Integer WIP editors retain a saved pending value, including zero and inheritance, before hub restart. GitHub intake accepts dot-prefixed repository names within the existing bounded owner/repository identity. Split undo also refuses children referenced by another task's persisted phase checklist.
|
|
2906
|
+
|
|
2907
|
+
Declining rework returns changes_requested to To Do before rerouting. When a planner-pulled task has no eligible destination capacity, it remains ownerless in To Do and is retried after capacity clears, preserving the declined-owner exclusion.
|
|
2908
|
+
|
|
2909
|
+
With no release cut, outside approved tasks are reported under unknown cut evidence, including tasks with a known approval time. A child task execution budget also prevents split undo until the person disables that budget.
|
|
2910
|
+
|
|
2911
|
+
Split children retain their initial deterministic and inherited privacy signals across awaited screening. A routing-pattern reload cannot remove those captured signals from an unscreened child at final validation.
|
|
2912
|
+
|
|
2913
|
+
If a routing pattern adds deterministic privacy during screening, split history and telemetry use regex-private provenance rather than an earlier clear model result. The same captured final signals determine both the child and its provenance.
|
|
2914
|
+
|
|
2915
|
+
Dashboard backlog splits receive a dedicated outer HTTP request bound above manager forwarding, using the shared screening/database bounds and margin. Ordinary action policy remains unchanged. At phone widths, split form grids use one column so native date controls remain inside their panels.
|
|
2916
|
+
|
|
2917
|
+
An acknowledged ACP permission-mode change awaits queued cancellation cleanup only when the cancelled prompt response has already been observed. A still-unreported cancelled prompt stays busy under its existing deadline, while mode acknowledgements remain available. A successful mode acknowledgement alone does not prove the peer is idle.
|
|
2918
|
+
|
|
2919
|
+
Task idle sweeps ignore body-free memory-reference bookkeeping when finding the last real activity. Saving a task note or goal link does not postpone an idle notice or restart its escalation ladder.
|
|
2920
|
+
|
|
2921
|
+
Split reasons preserve deterministic privacy from both initial and final policy checks, including parent privacy. Once withheld, a reason stays withheld in public history even if routing patterns are later removed.
|
|
2922
|
+
|
|
2923
|
+
GitHub import rejects labels containing commas or double quotes before invoking gh, since its CSV-style label parser could otherwise select a different literal label.
|
|
2924
|
+
|
|
2925
|
+
Ask evidence skips body-free memory-reference markers when selecting the latest task transition and note. The selected note retains the existing withheld and on-campus privacy checks.
|
|
2926
|
+
|
|
2927
|
+
GitHub intake checks its staging deadline after every awaited proposal, including the final issue. A confirmed late save returns its task ID with partial=true and complete=false so the operator can read back and resume.
|
|
2928
|
+
|
|
2929
|
+
If GitHub intake saves a row but later bookkeeping fails, canonical identity readback preserves the confirmed ID and queues its Backlog notice. The response remains partial; unreadable or missing readback remains unconfirmed.
|
|
2930
|
+
|
|
2931
|
+
A later issue lookup or profile-preparation failure also returns the IDs confirmed earlier in the import as partial progress.
|
|
2932
|
+
|
|
2933
|
+
Release cut audits return exact counts with at most 32 example IDs per category; the dashboard states how many IDs are shown when truncated. Scope grouping and indexed approval dates avoid scanning each task history for every release. Full audit pagination remains a future extension.
|
|
2934
|
+
|
|
2935
|
+
Release cards include task states in their refresh key, so completion of an outside prerequisite updates blocked counts even when the release and audit preview are unchanged.
|