@staix/agent-hub 0.12.27 → 0.12.29

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 CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  Issue and pull request numbers in the entries for 0.7.7 and earlier refer to the previous repository, archived on 2026-09-30 when this repository's history was rewritten; the one exception is the open smoke-check issue, formerly #12, which moved here as #1. Numbers in newer entries refer to this repository.
4
4
 
5
+ ## 0.12.29
6
+
7
+ - Let an explicitly authorized agent run live verification through `ahub --live-test`, with operational console authority scoped to the invocation and its ahub continuations, the initiating peer retained in a mandatory delegation audit, and ordinary agent permissions unchanged (#408).
8
+
9
+ - Remove the site caveat card accent edge and refresh the #273 live-verification ledger, including the machine-wide upgrade isolation requirements (#406, #273).
10
+
11
+ ## 0.12.28
12
+
13
+ - Recover an offline Pi owner with person-selected preserved history via `ahub pi --replace-session --session-file`, retaining prior identity metadata and queued work while refusing live owners and unsettled effects (#403).
14
+
15
+ - Tell a pull-only session (a Kimi TUI, a Claude session without pushes) that important messages are waiting: the hub sends an advisory count over its control link and every hub tool result but `hub_inbox` ends with it until a read drains them; `hub_inbox` replies also carry the important count. Make `scripts/check.sh` take a heavy-job slot shared by every worktree of the repo, so a second gate waits (bounded by `AHUB_CHECK_LOCK_WAIT_S`) and names the holder instead of overlapping (#398).
16
+
5
17
  ## 0.12.27
6
18
 
7
19
  - Refine the dashboard Office view with an intrinsic 12 px/unit scale, 1 px non-scaling hairlines and padded room cards in flat and isometric themes, and un-nest the desk More control into a separately reconciled sibling button so screen readers can reach it (#394).
package/README.md CHANGED
@@ -4,7 +4,7 @@ Native multi-agent hub for one developer's machine: Claude Code, Codex, Kimi Cod
4
4
  hub-owned local-LLM worker, with optional Qwen Code and Jcode support, collaborate as peers in independent project directories, with
5
5
  task-aware model routing (Switchyard) in front of a self-hosted gateway (OmniRoute).
6
6
 
7
- Status: 0.12.27, control protocol 16. Durable delivery records distinguish queued
7
+ Status: 0.12.29, control protocol 16. Durable delivery records distinguish queued
8
8
  work from uncertain execution. The [smoke checklist](docs/smoke.md) records
9
9
  verified paths and remaining prerequisites.
10
10
 
@@ -33,7 +33,7 @@ cd <your project> && ahub init && ahub up
33
33
  Or install the same version from GitHub:
34
34
 
35
35
  ```bash
36
- bun add -g github:STAIxBWLB/agent-hub#v0.12.27 && ahub setup
36
+ bun add -g github:STAIxBWLB/agent-hub#v0.12.29 && ahub setup
37
37
  ```
38
38
 
39
39
  The installed commands remain `ahub` and `agent-hub`.
@@ -81,7 +81,7 @@ an N-peer message bus and attaches each agent through its native control surface
81
81
  | --- | --- | --- | --- |
82
82
  | Claude Code | channel plugin push (`notifications/claude/channel`) under `ahub claude`; otherwise tools-only, read with `hub_inbox` | MCP tools | queued by Claude Code, grouped on next turn; tools-only: queued at the hub |
83
83
  | Codex | app-server `turn/start` (idle) / `turn/steer` (busy) | proxy intercepts `item/agentMessage` | steer or queue |
84
- | Kimi Code | ACP `session/prompt` | ACP `session/update` stream | queue (`turn.agent_busy`) |
84
+ | Kimi Code | TUI: pull with `hub_inbox`; headless: ACP `session/prompt` | TUI: `hub_send`; headless: ACP `session/update` stream | TUI: hub queue with important-count hints; headless: queue (`turn.agent_busy`) |
85
85
  | Pi | RPC or managed native TUI extension | hub-approved tools | queued until `agent_settled` |
86
86
  | Local worker | hub-native agent loop | hub-native | hub-owned |
87
87
 
@@ -14,6 +14,7 @@ Scope: delivery, digests and condensation, reply addressing, priority and limits
14
14
  - A reply is addressed, never broadcast. An adapter that answers a delivery passes `to: replyAudience(envs)`; anything else with an `inReplyTo` inherits that envelope's sender. Leaving `to` empty fans the message out to every peer.
15
15
  - `digest` is not a peer: addressing a reply at the envelopes the peer was handed sends it nowhere once a delivery was condensed. The bus resolves `digest` back through `lastDelivery.originals`; anything else that reads a reply's `to` has to do the same.
16
16
  - A pull-only peer (a Claude session without channel pushes or Kimi in its own TUI) is never drained; `Bus.pull` hands it what one push would take. Drain and pull share `held()` (recovery, an uncertain delivery, any pause, the lifecycle `deliveryHeld` fence) and `remember()` (so `reply_to` resolves), and a drain rechecks `deliverable()` after condensing because such a session can take the peer meanwhile. A pull is journaled `completed` in the same transaction as the bus snapshot, never `accepted`; a failed one puts back only that peer's queue and preface and never reloads the snapshot.
17
+ - The `onImportantQueued` nudge for a pull-only peer (#398) is advisory: it never dequeues, steers, journals or settles, and a throw from it never stops an enqueue.
17
18
  - `resolveDelivery` mutates queues in place; a refused or failed resolution puts back only that peer's queue and preface and keeps every pause. Never reload a snapshot on a live bus.
18
19
  - `restore` takes queued work from the journal, never from the committed snapshot once the journal has state (an empty journal, revision 0, is seeded from the commit): from the commit only an empty queue key is carried over, for an offline peer whose key no delivery ever persisted (#234). Never resurrect a non-empty queue from it.
19
20
  - The journal's owner check (`rejectLiveOwner` in `delivery-journal.ts`) judges the manifest pid with `processLiveness` and its `pidSignature`, never a bare probe (rule: `daemon.md`).
@@ -1,5 +1,8 @@
1
1
  # Daemon, control protocol and recovery
2
2
 
3
+ - For explicitly user-authorized live verification, use the per-invocation CLI delegation in `docs/security.md` §Agent CLI identity and conductor authority; keep caller markers and record native evidence separately from fixtures.
4
+ - Keep `export const LIVE_TEST_SUPPORTED = true;` in `src/cli/identity.ts`: delegated recovery staging reads this declaration before any source effect.
5
+
3
6
  - Console attention navigation selects a delivery only by an exact visible row id. A missing id or row prints read-only guidance; never select by peer or fall back to the first Queue row.
4
7
 
5
8
  Scope: the operator console, control WS and its protocol, state files, the dashboard listener and settings, the Claude channel's reconnect, `ahub setup`, git snapshots, upgrade and recovery. Read before editing `src/cli/console.ts`, `src/cli/console-state.ts`, `src/cli/attention.ts`, `src/ui/needs.ts`, `src/hub/daemon.ts`, `src/hub/ui.ts`, `src/hub/settings.ts`, `src/hub/control-client.ts`, `src/adapters/claude-channel.ts`, `src/hub/restart.ts`, `src/hub/recovery-store.ts`, `src/hub/snapshots.ts`, `src/hub/manager.ts`, `src/hub/lifecycle.ts`, `src/hub/crash.ts`, `src/hub/start-mode.ts`, `src/hub/terminal-open.ts`, `src/hub/recovery-error.ts`, `src/hub/db-timeout.ts`, `src/cli/setup.ts`, `src/cli/upgrade*.ts`, `src/cli/terminal-recovery.ts`, `src/cli/recovery-package.ts` or `src/cli/facts-hook.ts`, or before adding a native peer.
@@ -14,5 +14,6 @@ Scope: tests, fakes and the test gate. Read before adding or changing a test or
14
14
  - A request that a test expects a stop or shutdown to cut gets its rejection handler where the request is created, never after the awaited teardown: a late `catch` races the reset and the run fails on an unhandled rejection.
15
15
  - Run `bun scripts/seeded-check.ts` before reporting the seeded-guard gate complete. Keep the `scripts/seeds.json` cases sequential; require the same named test green before its seeded assertion fails. Seed rot, survivors, setup/compiler failures, timeout/watchdog termination and process leaks fail the gate. Never run the full seed runner from a unit test or mutate the source checkout; inspect preserved failed fixtures before removing them. CI runs this in the required Linux `seeded guards` job after the ordinary check, separately from `scripts/check.sh`.
16
16
 
17
+ - `scripts/check.sh` holds the repo's heavy-job slot (`<git common dir>/ahub-heavy.lock`, #398) for the whole run, so a test never runs the real gate; `test/check-lock.test.ts` runs a copy in a scratch repo.
17
18
  - The whole-suite watchdog is `AHUB_CHECK_HANG_S` (default in `scripts/check.sh`, hosted macOS value in `.github/workflows/check.yml`; #378, macOS CI hit it while tests still passed): raise it only when the suite was still progressing at the cutoff, never for a hung test, and keep the per-test 20 s timeout.
18
19
  - A seed's named test must run on Linux, where the seeded job runs: a darwin-only test reports no result there and fails the job (#382). Cover a macOS-only protection with its regression test instead.
@@ -1,8 +1,46 @@
1
1
  # Operations guide
2
2
 
3
- This guide describes ahub 0.12.27 and control protocol 16. Live verification
3
+ This guide describes ahub 0.12.29 and control protocol 16. Live verification
4
4
  results and remaining prerequisites are recorded separately in [the smoke ledger](smoke.md).
5
5
 
6
+ ## Agent-operated live verification
7
+
8
+ When the user explicitly authorizes a live test, its agent may run console
9
+ commands using `ahub --live-test [--project <path|id>] <command> [args...]`.
10
+ For example, `ahub --live-test --project <scratch-path> ui --no-open` starts the
11
+ real dashboard listener and prints its one-time link without opening a browser.
12
+ `ahub --project <scratch-path> --live-test reset --all --yes` exercises reset on
13
+ that selected disposable project. The global options precede the command and
14
+ may appear in either order; a flag after the command is not delegation.
15
+
16
+ This grants console authority for operational console-class and peer-lifecycle conductor-class commands, including destructive actions, for one
17
+ invocation and its ahub continuations. Use only the user-authorized targets and
18
+ commands; destructive live checks belong in disposable projects. Existing
19
+ project discovery still applies: initialize the scratch folder as its own Git
20
+ repository before `ahub init`, then confirm `status --json` reports that exact
21
+ `cwd` before any destructive check.
22
+ Existing confirmations, process ownership checks, native identity fences and recovery
23
+ locks still apply. Do not remove agent markers. The initiating peer and command
24
+ label are audited before effects; an unavailable audit blocks delegation. A new
25
+ unflagged invocation has ordinary peer authority again. Native tools launched
26
+ by the command keep their own peer identity and receive no delegation flag.
27
+ Allowed-class commands keep peer identity and permissions even with the flag:
28
+ `--live-test say` sends as the peer. Peer starts, pause and resume may use
29
+ delegated console authority. Flagged task assign/escalate refuse; omit the flag
30
+ to use the ordinary actor-preserving conductor path when the peer has that role.
31
+ Person verdicts and user-authored workflow writes are not delegated. Dashboard
32
+ sessions issued through the flag retain operational controls but refuse message
33
+ and task/planning content writes. Use native peer tools for agent-authored work.
34
+
35
+ Use a CLI/coordinator containing this feature throughout the experiment. Older
36
+ daemons do not understand the new delegated audit outcome; run the candidate
37
+ daemon to capture its delegated event and console notice. This policy does not
38
+ change external computer-use restrictions. Recovery staging refuses old targets
39
+ without live-test support before source effects. Delegated headless recovery restores through the ordinary target CLI, carrying
40
+ its operationId on the delegated console connection; existing native ownership
41
+ and session-identity checks remain. Record actual observations in the
42
+ smoke ledger; the presence of this option proves no outstanding #273 live leg.
43
+
6
44
  ## Command output
7
45
 
8
46
  `ahub status`, `board`, `budget`, `doctor`, `projects`, `queue list`, `turns` and `report` print shared console tables and labelled details.
@@ -1289,7 +1327,9 @@ reporting, and shares results explicitly with `hub_send`. Status, the console an
1289
1327
  the dashboard show `pull-only`, the waiting count and the last inbox read. Messages
1290
1328
  and important markers do not push or interrupt it. There is no hub busy state,
1291
1329
  watchdog, console approval, hub permission mode, context reading, automatic quota
1292
- pause/handoff, shared final answer or session resume. Read quota and approve tools
1330
+ pause/handoff, shared final answer or session resume. When important messages are
1331
+ waiting, every other hub tool result ends with a line saying how many, so the model
1332
+ reads `hub_inbox` before starting long local work (#398). Read quota and approve tools
1293
1333
  in Kimi's own TUI; a person can pause the hub queue by hand. End the native terminal
1294
1334
  session there, not with `ahub stop kimi`.
1295
1335
 
@@ -1619,21 +1659,21 @@ section is what they run.
1619
1659
 
1620
1660
  Upgrade running projects with the target release's own coordinator. It accepts
1621
1661
  a running source on control protocol 9 (0.6.x), 10 (0.7.0 through 0.12.0),
1622
- 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.27), and only
1662
+ 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.29), and only
1623
1663
  a target on its own protocol, so the target's coordinator fits every supported
1624
1664
  source and carries every recovery fix released up to it. Protocol 8 and older
1625
1665
  (0.5.x and earlier) are refused as `manual-bootstrap-required`. Run from the
1626
1666
  project directory, without replacing the global CLI first:
1627
1667
 
1628
1668
  ```bash
1629
- bunx --package @staix/agent-hub@0.12.27 ahub upgrade --to 0.12.27 --dry-run
1630
- bunx --package @staix/agent-hub@0.12.27 ahub upgrade --to 0.12.27 --yes
1669
+ bunx --package @staix/agent-hub@0.12.29 ahub upgrade --to 0.12.29 --dry-run
1670
+ bunx --package @staix/agent-hub@0.12.29 ahub upgrade --to 0.12.29 --yes
1631
1671
  ```
1632
1672
 
1633
1673
  | Running now | Coordinator to use |
1634
1674
  | --- | --- |
1635
1675
  | 0.6.x (protocol 9) | the target's, through `bunx` as above |
1636
- | 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.27 (protocol 16) | the target's, through `bunx` as above |
1676
+ | 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.29 (protocol 16) | the target's, through `bunx` as above |
1637
1677
  | any supported source, with the installed CLI already at the target | `ahub upgrade` below, which is the same coordinator |
1638
1678
  | 0.5.x or earlier (protocol 8 and older) | not supported: bootstrap by hand with the matching CLI |
1639
1679
 
@@ -1665,14 +1705,14 @@ projects first:
1665
1705
 
1666
1706
  ```bash
1667
1707
  ahub restart --dry-run
1668
- ahub upgrade --to 0.12.27 --dry-run
1708
+ ahub upgrade --to 0.12.29 --dry-run
1669
1709
  ```
1670
1710
 
1671
1711
  Apply only after reviewing the plan:
1672
1712
 
1673
1713
  ```bash
1674
1714
  ahub restart --yes
1675
- ahub upgrade --to 0.12.27 --yes
1715
+ ahub upgrade --to 0.12.29 --yes
1676
1716
  ahub recovery status [<operation-id>]
1677
1717
  ahub recovery resume [<operation-id>]
1678
1718
  ahub recovery abort [<operation-id>]
@@ -2354,6 +2394,13 @@ test files twenty times on macOS, in its own concurrency group; it does not repl
2354
2394
  `scripts/check.sh` stops a suite still running after `AHUB_CHECK_HANG_S` seconds
2355
2395
  (600 by default); hosted macOS CI sets 780 inside the unchanged 15-minute job
2356
2396
  limit (#378).
2397
+ The gate holds `<git common dir>/ahub-heavy.lock` across every worktree of a
2398
+ repository. A second gate waits up to `AHUB_CHECK_LOCK_WAIT_S` (1800 seconds by
2399
+ default; 0 fails immediately) and names the holder. A holder whose PID is gone
2400
+ is reaped. This filesystem slot works without a running hub; it covers this
2401
+ gate, not arbitrary build commands. PID reuse can retain a stale slot, and two
2402
+ waiters reaping the same dead owner can race; broader scheduling remains an
2403
+ operator responsibility (#398).
2357
2404
 
2358
2405
  ## Preview initialization and native launch
2359
2406
 
@@ -2453,6 +2500,31 @@ terminal exits, a requested stop (`ahub stop pi`), requested shutdown and
2453
2500
  recovery operations suppress this restart. Crash recovery's #66
2454
2501
  recorded-session/fresh-start choices are unchanged.
2455
2502
 
2503
+ ### Explicit Pi history replacement
2504
+
2505
+ If an offline Pi owner has no verified persisted resume state, inspect the old
2506
+ session and any partial work, then select a preserved file explicitly:
2507
+
2508
+ ```sh
2509
+ ahub pi --replace-session --session-file <managed-file>
2510
+ ```
2511
+
2512
+ The file must be inside this project's `.agenthub/state/pi-sessions/` and its
2513
+ session header must identify the same project. The selected session keeps its
2514
+ existing identity. This is a person-only recovery action; default restart never
2515
+ selects another session or infers that missing history was empty. A session id
2516
+ alone is insufficient. Add `--headless` to run the selected history in background.
2517
+ `--print-command` validates flags without checking the live owner or changing it.
2518
+
2519
+ Replacement requires an existing offline owner whose native process is proven
2520
+ gone, with settled tools, receipts and approvals, outside a recovery operation.
2521
+ An unclaimed pending TUI launch uses the ordinary restart path instead. Before
2522
+ revoking the old owner, the hub durably saves private previous/selected session
2523
+ metadata in `pi-session-replacements/` beside `pi-sessions/`. Failed validation or
2524
+ record storage leaves the old owner intact. All session files, queued work and
2525
+ journal records remain. Uncertain effects are never retried by this selection;
2526
+ inspect and reconcile them before continuing.
2527
+
2456
2528
  ### Pi/local unanswered approvals
2457
2529
 
2458
2530
  An expired Pi/local request says "approval expired: no person answered". The
@@ -2522,8 +2594,10 @@ An idle Pi with no message/file yet records its live empty-session proof before
2522
2594
  stopping, so its next start resumes that identity. A Pi stopped after its first
2523
2595
  prompt was accepted but before history was persisted is not treated as empty:
2524
2596
  its delivery is held, and another start refuses until resume history is verified.
2525
- Inspect and settle the held delivery before deliberately replacing that unpersisted
2526
- session by restarting the hub; the stop never silently chooses a fresh session.
2597
+ Inspect and settle the held delivery before selecting preserved history through
2598
+ [explicit Pi history replacement](#explicit-pi-history-replacement). The stop
2599
+ never silently chooses a fresh session; replacement requires an offline, settled
2600
+ owner and a validated managed session file.
2527
2601
 
2528
2602
  A pull-only Kimi TUI has no controlled restore or resume. While it is attached,
2529
2603
  upgrade/restart planning stops before effects and asks the person to end Kimi in
@@ -17,7 +17,7 @@ ahub setup # installs the Claude Code channel plu
17
17
  Or use the matching GitHub release:
18
18
 
19
19
  ```bash
20
- bun add -g github:STAIxBWLB/agent-hub#v0.12.27
20
+ bun add -g github:STAIxBWLB/agent-hub#v0.12.29
21
21
  ahub setup
22
22
  ```
23
23
 
package/docs/security.md CHANGED
@@ -71,10 +71,35 @@ or the native Claude/Codex shell marker when the hub marker is absent. It connec
71
71
  as that peer in tools mode. Messages and task changes retain that actor;
72
72
  `say` defaults to status priority and important messages still require the peer's
73
73
  capability. Conflicting or malformed markers fail closed. There is no `--as-user`.
74
- Human-only operations are refused before connecting, including permission answers
74
+ By default, console operations are refused before connecting, including permission answers
75
75
  and permission modes, queue resolution, budget overrides, benchmark runs, research
76
76
  backfill and task labels, stopping a peer (`ahub stop`), lifecycle and recovery
77
77
  operations, and `ask`.
78
+ For live verification explicitly authorized by the user, an agent may invoke
79
+ `ahub --live-test [--project <path|id>] <command> [args...]`. The flag delegates
80
+ the existing console authority for console-class operations and conductor-class peer starts/holds, including approvals,
81
+ settings, roster and lifecycle operations. It does not restrict effects to a
82
+ scratch project: the agent must stay within the authorized commands and targets.
83
+ Malformed or conflicting caller markers still refuse. The original peer and
84
+ closed command label are recorded with outcome `delegated` before execution;
85
+ if that audit cannot be written, the command refuses. The current daemon emits
86
+ `agent_cli` with `delegated: true` and `refused: false`. Allowed-class commands retain the peer identity and capability checks, including
87
+ messages, proposals and reviews. Peer starts, pause and resume may delegate
88
+ operational console authority; task assign/escalate under the flag refuse. `--as-user`, person task labels,
89
+ person-authored planning/release/memory/goal writes, SDLC record, benchmark run
90
+ and the pet composer are refused. No argument text is copied into this audit.
91
+ Delegated dashboard restrictions are bound to its server-issued ticket/session:
92
+ operational settings/start/stop controls remain, but message, proposal and
93
+ workflow-history actions refuse even if the body tries to clear the restriction.
94
+ The flag is not stored in settings or exported to native agent children. Ahub's
95
+ own daemon launch, console subprocesses, recovery runner, interactive follow-up commands and upgrade coordinator
96
+ handover carry it explicitly in argv. Each new top-level invocation needs its
97
+ own flag. An older CLI does not support it; use a candidate with this feature
98
+ for the continuation too. Staging rejects a target without the pinned
99
+ `LIVE_TEST_SUPPORTED` declaration before preparation or commit, including a
100
+ previously cached stage. Delegated headless-native restoration uses the ordinary target CLI with its
101
+ operationId through that operational console authority. Native and TUI
102
+ restoration keep their existing identity and ownership checks. External computer-use restrictions remain unchanged.
78
103
  The operator uses a plain terminal or `ahub console`. A Claude `!` command that
79
104
  inherits the agent markers follows the same rule. The console strips control
80
105
  sequences from agent and daemon text before it quotes forged headers, and its
package/docs/smoke.md CHANGED
@@ -2,6 +2,60 @@
2
2
 
3
3
  `scripts/check.sh` covers everything against fakes. The legs below need real accounts and an interactive terminal, so they are run by hand and recorded here.
4
4
 
5
+ ## Issue #273 operator execution plan (2026-10-16)
6
+
7
+ The [execution plan and blocker record](verification/2026-10-16-273-live-verification.md)
8
+ maps the outstanding issue entries to their procedures and required observations.
9
+ The installed CLI and running project daemon both reported 0.12.28. This is an
10
+ environment readback only. No outstanding live leg passed in this session:
11
+ the installed 0.12.28 CLI refused `ahub ui` from Codex, and LCU refused Terminal access.
12
+ These are dated observations. From 0.12.29, authorized agents use the audited
13
+ `--live-test` route described below and in the execution plan; the external LCU
14
+ restriction remains separate. The operator initially chose procedure preparation;
15
+ #273 remains open.
16
+
17
+ ## Agent-operated verification (#408)
18
+
19
+ For user-authorized live checks, the candidate CLI supports
20
+ `ahub --live-test [--project <path|id>] <command> [args...]`, using audited console
21
+ authority for that invocation. Follow [the operating procedure](operations.md#agent-operated-live-verification)
22
+ and record each actual result below. References to a person in historical
23
+ procedures describe their original authority requirement; an explicitly
24
+ authorized agent may now execute those CLI steps through this option. Native
25
+ account readiness, real terminal/browser observations, sign-off requirements and
26
+ external computer-use restrictions still apply. No pending #273 item is checked
27
+ by adding this path.
28
+
29
+ 2026-10-16, macOS, candidate CLI/source `40d13bc4`, daemon 0.12.28/protocol 16:
30
+ an actual Codex-marked shell with a separate hub home and disposable Git project
31
+ ran delegated `init`, `up --no-console`, `ui --no-open`, `permission pi ask`,
32
+ `kill` and `reset --all --yes`, all exit 0. Unflagged `status --json` reported
33
+ the exact scratch cwd. The dashboard URL returned HTTP
34
+ 200 and HTML; no browser or ticket/session exchange was performed in that shell run. The daemon recorded
35
+ `agent_cli` events for init/up/daemon/ui/permission with peer `codex`,
36
+ `delegated: true` and `refused: false`. The reset archive mode was 0700 and the
37
+ scratch daemon was stopped. This verifies the delegated CLI path, without
38
+ claiming a model turn, terminal look, conversation restoration or the complete
39
+ #214/#273 live criteria. The automated console-subprocess and recovery-target
40
+ checks remain separate fixture evidence.
41
+
42
+ 2026-10-16 review follow-up, source `fcbb18ec`: the same isolated Git scratch
43
+ project was started from a Codex-marked shell. Flagged `say` produced a bus
44
+ envelope from `codex`; person task-label writing refused. A delegated dashboard
45
+ ticket exchanged for a session with HTTP 200, its snapshot returned HTTP 200,
46
+ and a send action trying `liveTest: false` returned HTTP 403. The scratch daemon
47
+ was stopped (kill exit 0). This was an actual CLI/HTTP run, without a model turn
48
+ or browser visual inspection.
49
+
50
+ Task #65 follow-up, source `5fbe50b6`: operational peer starts, pause and resume
51
+ may delegate console authority; allowed-class messages/proposals/reviews retain
52
+ the peer, while flagged task assign/escalate refuse. The temporary headless
53
+ staging ceiling is removed. The recovery driver -> real target CLI -> scripted
54
+ control server regression verifies headless Pi mode, saved sessionId,
55
+ operationId, console hello and initiating-peer audit (225 related tests passed).
56
+ This is fixture/CLI proof, not an actual native Pi restoration; that live leg
57
+ remains owed in #273.
58
+
5
59
  ## Hub memory (#258)
6
60
 
7
61
  Not run yet (2026-10-12). Source and fakes cover tiers, the graph, retrieval, sync between two simulated homes and a bare remote, leases, import and suggestions (`test/memory-*.test.ts`).
@@ -1947,10 +1947,17 @@ task list polling does not. `hub_status` stays conductor-only.
1947
1947
  proposer as the actor with reason `manual` (on the `reassigned` or `reserved`
1948
1948
  entry), and writes no conduct audit event; during a PII turn it is refused
1949
1949
  like the conductor's.
1950
+ ## Amendment: delegated agent live verification (#408)
1951
+
1952
+ - Decision, 2026-10-16: an agent explicitly authorized by the user to perform a live test may use the global `--live-test` flag, before the command and in either order with `--project`. Duplicate global options refuse. Default command classification and malformed/conflicting identity refusals stay unchanged.
1953
+ - Console-class operations and conductor-class peer starts/pause/resume may use console authority after the original caller is validated; allowed-class commands retain peer identity and capability checks. Flagged task assign/escalate refuse rather than writing user-attributed history. A mandatory ids-only audit records its peer, closed command label and `delegated` outcome before execution. The daemon emits an `agent_cli` event with `delegated: true`, `refused: false`, and a console notice naming the peer. User impersonation, person labels and person-authored workflow writes refuse. Delegated dashboard tickets/sessions allow operational controls but refuse user-attributed content and history actions on both project and unified surfaces; request bodies cannot widen the session.
1954
+ - This is a user-authorized operating policy, not a sandbox or authenticated grant. It includes console mutations and requires the agent to remain within the authorized targets and operations. Command-specific confirmations, process ownership, provider identity and recovery locks still apply.
1955
+ - No settings/environment opt-in persists. Native argv does not receive the flag. Ahub's own daemon launch, console subprocesses, recovery runner, interactive continuation commands and newer-version coordinator handover carry it explicitly; older CLIs cannot accept it. The recovery driver's target CLI environment preserves the initiating peer for its delegation audit. Staging checks the target's pinned LIVE_TEST_SUPPORTED declaration before its cached-stage return and before prepare/commit; unsupported old targets refuse without source effects. Headless-native restoration uses the ordinary target CLI with the operationId on its delegated console connection; no headless staging ceiling is added. External computer-use policies remain outside this change. No #273 live success is inferred from this implementation.
1956
+
1950
1957
  ## Amendment: ahub reset (issue #214)
1951
1958
 
1952
1959
  `ahub reset [--all] [--yes]` returns a project's hub to a clean state. It is
1953
- human-only (the CLI identity gate refuses it from an agent shell) and a dry run
1960
+ console-only by default (explicit authorized delegation is described in #408) and a dry run
1954
1961
  unless `--yes`: the dry run reads `hub.db` read-only (with `immutable=1` when
1955
1962
  `hub.db-wal` or `-shm` is absent, so it creates neither) and prints delivery ids,
1956
1963
  peer names and counts per category, never task or message text. With `--yes`
@@ -2879,3 +2886,38 @@ open detail; disappearance/project reset closes it. Back restores compact mode,
2879
2886
  and state/peer/release filters remain active in focus. Attention targets exact
2880
2887
  visible row ids with heading guidance when absent. No new route, API request,
2881
2888
  timer, source text/ref/history projection or external asset is introduced.
2889
+
2890
+
2891
+ ## Explicit offline Pi history selection (#403)
2892
+
2893
+ A person may run `ahub pi --replace-session --session-file <managed-file>` only
2894
+ for an existing offline, settled Pi owner with a proven-gone native process.
2895
+ Pending tools, receipts, approvals and recovery hold replacement. The console
2896
+ control path alone authorizes this operation; peer and conductor tools cannot
2897
+ supply that authority. Validate the selected managed path and project/session
2898
+ header before any prior owner teardown, then durably write private previous
2899
+ and selected metadata. Retain all session files, queues and journal records.
2900
+ Start the selected persisted identity through the existing permission policy
2901
+ and verified teardown. There is no automatic fallback, implicit empty-session
2902
+ proof or effect retry; ordinary restart and captureResume remain strict.
2903
+
2904
+ ## Amendment: pull-only latency (#398)
2905
+
2906
+ A pull-only peer learns of important work only when its model calls a hub tool,
2907
+ and repo-heavy work was coordinated over chat it read too late.
2908
+
2909
+ - When an `important` envelope is queued for a pull-only peer, the bus calls the
2910
+ advisory `onImportantQueued` hook and the daemon sends that peer's control
2911
+ socket `{t:"queued", queued, important}`, as it does when a pull-only session
2912
+ attaches with important work already queued. It is not a delivery: nothing is
2913
+ dequeued, steered, journaled or settled, and the queue still waits for
2914
+ `hub_inbox`. The `inbox` reply adds `waitingImportant`.
2915
+ - The plugin caches the counts and appends one line naming the important count
2916
+ to every hub tool result except `hub_inbox` until a read reports none. An older
2917
+ plugin ignores the unknown push; an older hub never sends it.
2918
+ - `scripts/check.sh` takes a heavy-job slot, a directory in the git common dir
2919
+ shared by every worktree, before any step. A second gate waits up to
2920
+ `AHUB_CHECK_LOCK_WAIT_S` (1800 s; 0 fails at once) and names the holder; a
2921
+ holder whose pid is gone is reaped. The slot works with no hub running. It is
2922
+ not bus-visible; moving it into the hub is the upgrade if pid reuse or reap
2923
+ races bite.
@@ -0,0 +1,25 @@
1
+ # 0.12.29 release verification
2
+
3
+ This record covers release preparation and source review. Publication and installation receipts are recorded separately after their gates succeed.
4
+
5
+ ## Candidate
6
+
7
+ 0.12.29 carries PR #409 (#408), the site correction in PR #406 and the #273 execution-plan corrections in PR #407. Control protocol remains 16.
8
+
9
+ - Explicit `--live-test` delegation permits operational console and peer lifecycle actions with a mandatory initiating-peer audit. Allowed agent commands retain their peer identity; person-attributed writes refuse under delegation.
10
+ - Dashboard delegation is bound to the issued session and checked server-side. Recovery refuses unsupported target packages before effects; supported headless restores use the ordinary target CLI with the recovery operation id.
11
+ - The #273 ledger includes the current native checks and makes machine-wide upgrade isolation explicit. No native leg is marked passed by these preparation changes.
12
+
13
+ ## Document review
14
+
15
+ Security, Operations and the design specification describe the reviewed delegation boundary. README, Quickstart and the current Operations examples name 0.12.29. The stale area notes are checked against the CLI identity, console, recovery, dashboard and audit changes; their existing rules remain applicable. Document stamps name the release preparation commit, which must remain an ancestor of the merge commit.
16
+
17
+ ## Recorded checks
18
+
19
+ - PR #409 head a8b9a56b: independent source review and board tasks #64/#65 approved. Exact-head Ubuntu and macOS full gates passed (`check: OK`); the headless restoration regression is fixture/CLI proof, not native Pi restoration.
20
+ - Original PR #407 head c637a088: Ubuntu, macOS and seeded guards passed in CI run 38791043404. The corrected execution plan was independently reviewed at 780853b6.
21
+ - The final release head requires its own Ubuntu/macOS `scripts/check.sh` and seeded guards before merging. Committed document freshness and stamp ancestry are checked again before tagging. The release workflow requires green CI for the identical tree before npm publication.
22
+
23
+ ## Not verified by this record
24
+
25
+ Native, account, visual and research checks remain tracked in #273 and #1. Package publication, global CLI/plugin installation and running-hub upgrade are separate operational results; this preparation record does not claim them.
@@ -0,0 +1,150 @@
1
+ # Issue #273 operator execution plan
2
+
3
+ ## Scope and dated observations
4
+
5
+ - Date: 2026-10-16, Asia/Seoul.
6
+ - Initial observation source: main `426bab99`, release 0.12.28, protocol 16. The following CLI refusals describe that installed version, before #408.
7
+ - Issue #273 was read live, including its 2026-10-14 additions at initial preparation; the matrix below was refreshed for the five 2026-10-16 additions before release. Every checkbox remained unchecked.
8
+ - `ahub --version` returned `0.12.28`.
9
+ - `ahub status --json` returned daemon version `0.12.28`, protocol `16`, `stopping: false`, Claude idle, Codex busy, Kimi offline and Pi idle. These are status observations, not model-delivery or restoration receipts.
10
+ - `ahub ui` exited 1 with `ahub: codex cannot run ahub ui; the person runs it in ahub console or a terminal`.
11
+ - LCU app selection for `com.apple.Terminal` returned `Computer Use is not allowed to use the app 'com.apple.Terminal' for safety reasons.` No Terminal inspection or input occurred.
12
+ - The operator selected procedure and blocker preparation before live execution. No identity markers were removed, no console connection was impersonated, and no lifecycle, reset, roster, quota or provider experiment was run.
13
+
14
+ ## Supported execution route and remaining boundaries
15
+
16
+ From 0.12.29, an explicitly authorized agent runs operational CLI steps with
17
+ `ahub --live-test <command> [args...]`, including `init`, `up`, `console`,
18
+ `settings`, `reset`, `upgrade`, `recovery` and roster operations. Follow
19
+ [Agent-operated live verification](../operations.md#agent-operated-live-verification).
20
+ Record the initiating peer and the mandatory delegation audit (`agent_cli`
21
+ event or retained CLI audit), alongside the command and operational receipts.
22
+ The original 0.12.28 refusal above is historical evidence, not a current CLI
23
+ blocker. Identity markers remain intact; the supported option supplies authority.
24
+
25
+ Allowed-class commands retain the agent's peer identity, including messaging
26
+ and review verdicts. The flag refuses person-attributed writes, including
27
+ `--as-user`, task labels, task assign/escalate and planning/memory writes.
28
+ Delegated dashboard sessions permit operational controls but refuse sending,
29
+ proposals and person-attributed planning/history actions; changing a request body
30
+ cannot remove that restriction. Exercises requiring those actions or a person's
31
+ sign-off need the ordinary authorized actor path and cannot be completed merely
32
+ by adding the flag.
33
+
34
+ LCU's Terminal denial is a separate external computer-use restriction and remains
35
+ in force. CLI delegation does not grant Terminal app access or prove native
36
+ visual, account or accessibility observations. Record any inaccessible native
37
+ surface as unverified while continuing reachable authorized CLI checks.
38
+
39
+ ## Execution order
40
+
41
+ Use a disposable Git project under the workspace scratchpad, outside this
42
+ checkout, and initialize its own Git boundary before `ahub init`. An authorized
43
+ agent runs `ahub --live-test init`, reviews the resulting configuration and starts
44
+ it with `ahub --live-test up`. Record its absolute path, project id and delegation
45
+ audit. Keep destructive recovery/reset experiments separate from the project
46
+ used for browser and model checks. Recovery can hold a machine-wide lock, so
47
+ inspect `ahub --live-test recovery status` before starting an operation and wait
48
+ for unrelated operations to finish. Upgrade isolation has the additional
49
+ machine-wide and shared-configuration requirements below.
50
+
51
+ Use installed, authenticated native tools. Record each version before its first
52
+ turn. Do not change credentials, buy access or exhaust quota to produce a result.
53
+ Do not run another session's stop or reset. Keep identity fencing in effect and
54
+ use the documented delegation route rather than removing identity markers.
55
+
56
+ 1. Run reachable operational checks through `ahub --live-test`; retain their delegation audits and readbacks. Inspect terminal/dashboard rendering only through an available permitted native surface.
57
+ 2. Run native messaging and role/planner exercises on the disposable project using the ordinary peer or person path as required by attribution; the delegation flag does not authorize person-content writes.
58
+ 3. Run roster and recovery experiments with disposable conversations only, using the delegated operational CLI route and recording native continuity separately.
59
+ 4. Run the real repository SDLC cycle only with an explicitly selected issue and release window, retaining required person verdicts.
60
+ 5. Record each result in `docs/smoke.md`, retaining any unverified remainder and external blocker.
61
+
62
+ ## Required observations by issue entry
63
+
64
+ All rows below are pending. A procedure reference is not evidence of execution.
65
+ Section names refer to [the smoke checklist](../smoke.md).
66
+
67
+ | Entry | Procedure or setup | Evidence required before checking the issue box |
68
+ | --- | --- | --- |
69
+ | #201 AC2/AC7, #213 AC7 | Console layout and readability | Light/dark terminal, stream and panels; terminal name, dimensions, readable text and observed clipping |
70
+ | #205 AC3 | Claude without channel evidence | Managed Claude push and settlement beside plain Claude tools-only; correlated message and settlement ids |
71
+ | #206 AC4 | Upgrade procedure below | Two distinct releases, unmanaged Claude marked reconnect-only, same native conversation after reconnect |
72
+ | #214 AC6 | ahub reset on a scratch project | Both reset scopes, queue/board checks, archive permissions and restored board, same project id |
73
+ | #215 AC6 | Expired-lease procedure below | Real expired lease and missing transcript, daemon/CLI/lock/project/archive outcomes, completion or audited disposition |
74
+ | #225 AC9 | Target-crash procedure below | Target killed after peers-restored, supported resume, original conversation and restart count readback |
75
+ | #269 AC10 | Settings from the dashboard and the terminal, parts 1-2 | Light/dark, phone width and keyboard path; actual Orca and terminal.open launches with native Pi attached |
76
+ | #285 phase 1 | Record table, #285 live item 1 | Real Kimi turn, status context source/value, usage_update timing relative to correlated prompt result |
77
+ | #284 phase 1 | One-shot command output | status/board/budget/doctor, light/dark, 80 and wider columns, console rendering and full suggested ids |
78
+ | #298 | Unified dashboard slow start | Real browser unconfirmed text, 30-second hold and keyboard focus after Start; a deterministic slow native start is a prerequisite |
79
+ | #296 | Ending Codex turn | Correlated native turn/steer response, elapsed time and exact refusal; a successful steer alone does not prove refusal matching |
80
+ | #315 Codex | Live roster return | Removal exit, printed resume command, restored same thread and peer reattachment |
81
+ | #315 Pi | Live roster return | Retained terminal/process, admission refused off roster, same TUI reattaches; prepare blocked until retained TUI ends |
82
+ | #316 trust and ingestion | Kimi TUI pull mode | Actual trust screen, project MCP tools and model-visible managed instructions/tool descriptions |
83
+ | #316 messaging/discovery | Kimi TUI pull mode | Correlated hub_inbox/hub_send exchange with another peer; trusted project and overlay discovery |
84
+ | #316 headless return | Kimi TUI pull mode | TUI to headless to TUI, session/config restoration readback; argv fixtures are insufficient |
85
+ | #256 identity/modes | Qwen Code 0.25.0 production peer | Real ACP supported identity and advertised modes; stop on CLI/ACP mismatch |
86
+ | #256 native provider | Qwen Code 0.25.0 production peer | Actual model identity, delivery, exact tool call/result and mode confirmation |
87
+ | #256 stop/recovery | Qwen Code 0.25.0 production peer | Owned stop and controlled/crash recovery retain the recorded conversation |
88
+ | #256 quota | Observe an organic refusal only | Version and exact sanitized native refusal; unknown remains failed delivery |
89
+ | #259 AC11 | Research-profile exercise | Two native agents, three sources, configured routing/classes, plans, role/tool ingestion, deterministic citations and person sign-off |
90
+ | #259 converters | Intended formats and configured converters | Actual conversion, review and undo previews; timing, caps and named-only fallback |
91
+ | #259 guidance | Same native profile sessions | Native profile/custom-stage guidance retention; preserve separate #295 and research measurements |
92
+ | #257 AC6 | SDLC gates | Real repository issue through merge/release under advise; issue/PR/head ids, gate blockers and release report |
93
+ | #295 AC16 | Native role/task cycle | Role text ingestion, retention after actual compaction, assignment/reassignment notice and review duty |
94
+ | #280 AC11 | Console attention, Global attention status, Approved character, Dashboard character | Per-phase light/dark, tmux, colour off, blocks/ascii and actual dashboard look |
95
+ | #263 AC11 | Planning and release controls | Native planner creates two releases; planned/actual dates read back |
96
+ | #263 board/intake | Project board | Desktop/phone browser against real hub, permission/state readback and actual GitHub issue intake |
97
+ | #306 | Observe an organic Kimi weekly/monthly refusal only | CLI version and exact sanitized prefix; do not deliberately consume quota |
98
+ | #403 | Offline Pi preserved-history recovery | Actual selected native session restored with identity/queue retained; a live owner refused |
99
+ | #398 | Pull-only important-message advisory | Real Kimi TUI and plain Claude see the tool-result advisory; hub_inbox drains it |
100
+ | #391 pet lifecycle | Standalone pet window | Actual stop changes it to Offline and host exits; native screenshots of states |
101
+ | #391 dashboard CSP | Split dashboard views | Browser-console capture of CSP behavior, separate from the earlier owner browser look |
102
+ | #394 VoiceOver | Office desk More control | Native VoiceOver traversal; DOM/click/Enter/Space regressions remain separate |
103
+
104
+ ## Upgrade with unmanaged Claude (#206)
105
+
106
+ 1. An authorized operator starts the disposable project on a known older release, records its version/project id and attaches an unmanaged Claude session using the documented plain-Claude tools-only setup. Record its native session id and a harmless conversation marker.
107
+ 2. Use an isolated test environment for the hub home/registry and shared Claude plugin setup. Upgrade is machine-wide, even when invoked from the scratch cwd: it plans all registered running projects and changes the shared package/plugin; `--project` does not scope it. Run the target coordinator with `ahub --live-test upgrade --to 0.12.29 --dry-run` and retain the complete plan. Verify every planned root is a disposable fixture, record the shared CLI/plugin fate, and confirm the intended unmanaged Claude is reconnect-only. Stop without applying if any non-disposable project or shared setup is in scope. A separate AGENTHUB_HOME alone does not isolate the shared plugin; use a dedicated native configuration/test environment too.
108
+ 3. The authorized agent applies that same target with `ahub --live-test upgrade --to 0.12.29 --yes` after reviewing the plan (a person may use the ordinary interactive path). Retain the delegation audit. Record operation id, source and target versions, terminal fate and plugin reconnect outcome. Do not substitute a restart at the same version.
109
+ 4. Read back `ahub status`, the original native session id and marker, and one correlated hub message receipt. Record whether a second terminal appeared or a conversation was replaced.
110
+ 5. Capture final operation and lock status. A refusal or failed reconnect is a failed leg, with its exact wording; it is not a pass based on the dry-run plan.
111
+
112
+ ## Expired preparation lease with missing Codex transcript (#215)
113
+
114
+ This needs an isolated failure-injection setup before it is executable. There is
115
+ no public `ahub recovery prepare` CLI. Do not invent one or edit production
116
+ recovery JSON to claim a native reproduction. `test/upgrade.test.ts`,
117
+ `expiredLease`, is a scripted-driver fixture and is only a setup reference.
118
+
119
+ 1. Give disposable Codex its own native session store and complete a harmless turn so its transcript exists. Record project id, daemon instance, native thread id and transcript path. Keep the original transcript outside the fixture's missing-path condition; never remove a production transcript.
120
+ 2. In a controlled scratch-only harness, stop the coordinator after real source preparation and before commit, preserving its operation receipt. Record the daemon's preparation, terminal close receipts and runner identity. The harness and its pause point must be reviewed before use.
121
+ 3. Make only the disposable transcript unavailable and allow the real preparation lease to expire. Confirm expiry from the daemon log/readback rather than changing a clock or receipt timestamp.
122
+ 4. The authorized agent runs `ahub --live-test recovery status <operation-id>` and the supported next action it offers. Capture the exact missing-session refusal. Restore the disposable transcript and resume, or use the offered audited disposition with a reason. Do not force a fresh conversation and label it restoration.
123
+ 5. Record daemon and CLI outcomes, operation/lock state, project id before/after, archive paths and modes, and the final continuity or lostContinuity disposition. Preserve failed intermediate receipts.
124
+
125
+ ## Target crash after peers-restored (#225)
126
+
127
+ 1. In a separate disposable project, establish native conversations with harmless markers and start a controlled recovery. Save its operation id and source conversation ids.
128
+ 2. Observe the real `peers-restored` phase before release. A controlled pause at that boundary is required: if the operation already completed, this run cannot demonstrate this failure point. Do not fabricate the phase by editing a receipt.
129
+ 3. Verify the target pid belongs to this disposable project's daemon and record its instance id. The authorized operator ends only that target daemon through a permitted process-control surface. Record native launcher/process state after the exit.
130
+ 4. Run `ahub --live-test recovery status <operation-id>`, then its offered `ahub --live-test recovery resume <operation-id>`. Retain the delegation audits. If a surviving launcher blocks it, end the identified disposable launcher as instructed and retry the supported action.
131
+ 5. Verify the new target instance, recorded restart count, same native conversations and markers, no duplicate terminal, final operation status and lock release. A missing snapshot or failed native resume remains a failure, with the precise refusal and the supported disposition recorded.
132
+
133
+ ## Recording and closure
134
+
135
+ For each execution record: date/time, source commit, hub/native versions, project
136
+ id, exact command or interaction, expected observation, actual observation,
137
+ correlated ids, sanitized evidence path and pass/fail/unverified verdict. Record
138
+ partial success at the substep level. Keep raw tokens, cookies, private task text
139
+ and account details out of committed evidence.
140
+
141
+ On a confirmed defect, preserve its failure wording and open a linked defect
142
+ issue within the user's authorized scope. Check a #273 item only after its dated
143
+ record covers the entire item, or a failed run is recorded with a linked defect.
144
+ Environment/tool restrictions remain unverified prerequisites. They do not meet
145
+ the issue's failed-product-run alternative. #273 cannot close from this plan.
146
+
147
+ The initial preparation ran no full check or native model turn. Its original
148
+ commit c637a088 subsequently passed Ubuntu/macOS full gates and seeded guards
149
+ in CI run 38791043404. The release candidate must earn its own exact-head checks;
150
+ none of those automated results completes a live leg.