@staix/agent-hub 0.25.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +12 -6
  3. package/docs/agent-notes/README.md +12 -0
  4. package/docs/agent-notes/adapters.md +1 -1
  5. package/docs/agent-notes/daemon.md +7 -5
  6. package/docs/agent-notes/tasks.md +7 -6
  7. package/docs/agent-notes/tests.md +1 -0
  8. package/docs/dogfood.md +7 -1
  9. package/docs/operations.md +160 -17
  10. package/docs/profiles.md +1 -0
  11. package/docs/quickstart.md +18 -4
  12. package/docs/sdlc.md +3 -3
  13. package/docs/security.md +52 -9
  14. package/docs/specs/2026-09-19-agent-hub-design.md +1 -1
  15. package/docs/specs/2026-11-01-research-campaigns-design.md +21 -7
  16. package/docs/verification/2026-11-01-0.26.0.md +54 -0
  17. package/docs/verification/2026-11-01-0.27.0.md +49 -0
  18. package/docs/verified.json +28 -16
  19. package/package.json +1 -1
  20. package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
  21. package/plugins/agent-hub/server.js +190 -101
  22. package/src/adapters/channel-peer.ts +4 -2
  23. package/src/adapters/definitions/builtin-metadata.ts +6 -6
  24. package/src/adapters/definitions/qwen.ts +2 -0
  25. package/src/adapters/registry-types.ts +2 -0
  26. package/src/adapters/registry.ts +1 -0
  27. package/src/cli/conductor-recovery.ts +3 -2
  28. package/src/cli/help.ts +9 -8
  29. package/src/cli/identity.ts +5 -5
  30. package/src/cli/main.ts +68 -24
  31. package/src/cli/recovery-package.ts +94 -4
  32. package/src/cli/reset.ts +14 -4
  33. package/src/cli/runtime-version-warning.ts +28 -0
  34. package/src/cli/start-agents-run.ts +125 -0
  35. package/src/cli/study-output.ts +56 -0
  36. package/src/cli/study.ts +26 -3
  37. package/src/cli/task-output.ts +5 -0
  38. package/src/cli/upgrade-interactive.ts +4 -4
  39. package/src/cli/upgrade-runtime.ts +105 -57
  40. package/src/cli/upgrade.ts +90 -28
  41. package/src/hub/action-policy.ts +5 -3
  42. package/src/hub/autonomy-defaults.ts +32 -7
  43. package/src/hub/board.ts +129 -13
  44. package/src/hub/budget.ts +3 -4
  45. package/src/hub/child-process.ts +4 -3
  46. package/src/hub/conductor.ts +3 -4
  47. package/src/hub/config-apply.ts +13 -2
  48. package/src/hub/config-edit-host.ts +1 -0
  49. package/src/hub/config-tier.ts +3 -0
  50. package/src/hub/config-trust.ts +10 -2
  51. package/src/hub/control-client.ts +30 -10
  52. package/src/hub/daemon.ts +103 -26
  53. package/src/hub/db-schema.ts +143 -0
  54. package/src/hub/delivery-journal.ts +3 -4
  55. package/src/hub/events.ts +2 -1
  56. package/src/hub/execution-budget.ts +3 -4
  57. package/src/hub/folder-trigger.ts +3 -4
  58. package/src/hub/hub-tools.ts +7 -5
  59. package/src/hub/invocations.ts +3 -4
  60. package/src/hub/lifecycle.ts +87 -29
  61. package/src/hub/manager.ts +49 -33
  62. package/src/hub/no-writes.ts +1 -1
  63. package/src/hub/orca-env.ts +19 -0
  64. package/src/hub/project-runtime-state.ts +164 -0
  65. package/src/hub/project-runtime.ts +62 -0
  66. package/src/hub/protocol-window.ts +19 -0
  67. package/src/hub/recovery-store.ts +102 -12
  68. package/src/hub/registry.ts +5 -0
  69. package/src/hub/research-experiments.ts +33 -4
  70. package/src/hub/research-runner.ts +172 -0
  71. package/src/hub/restart.ts +9 -0
  72. package/src/hub/runtime-capture-prune.ts +415 -0
  73. package/src/hub/runtime-prune-health.ts +112 -0
  74. package/src/hub/schedules.ts +3 -4
  75. package/src/hub/sdlc-merge.ts +7 -0
  76. package/src/hub/sdlc-queue.ts +13 -1
  77. package/src/hub/sdlc-release-authorization.ts +11 -5
  78. package/src/hub/session-identity.ts +1 -1
  79. package/src/hub/settings.ts +4 -0
  80. package/src/hub/snapshots.ts +3 -4
  81. package/src/hub/start-agents.ts +44 -0
  82. package/src/hub/task-approval.ts +23 -0
  83. package/src/hub/tasks.ts +133 -34
  84. package/src/hub/usage-rollup.ts +3 -4
  85. package/src/pi/tool-receipts.ts +3 -4
  86. package/templates/presets/confirmation-matrix.json +5 -5
  87. package/templates/release-guard.block.md +2 -1
@@ -218,14 +218,14 @@ Protocol approval:
218
218
  - This block lives only in the untracked `.agenthub/config.local.json`. A tracked or shared file naming it throws at load, the `checks.remote` precedent.
219
219
  - It is added to `ALL_MACHINE_LOCAL` and is a structural tier-2 key for `ahub settings edit`. Its writes are person only.
220
220
  - `name` follows the id rule. At most 16 runners.
221
- - Revocation sets `revoked: true`. The key is kept, so old receipts still show who signed them, but a revoked key verifies nothing new.
221
+ - Revocation sets `revoked: true`. The key is kept, so old receipts still show who signed them, but a revoked key verifies nothing new. Readback retains the key identity that verified the stored receipt and reports its current status separately (active, revoked, replaced or unavailable); a later config change never rewrites the receipt's as-of-signing provenance.
222
222
  - The hub stores no private key.
223
223
 
224
224
  ### AttemptReceiptV1
225
225
 
226
226
  The runner signs `"agent-hub.runner-receipt/v1\0" + canonical JSON of the receipt body` with Ed25519. The hub verifies with `node:crypto`.
227
227
 
228
- The body is `{ receiptId, runner, projectId, attemptId, protocolHash, codeCommit, imageDigest, containers: [{ id, role: "candidate" | "evaluator" | "other" }], mounts: [{ container, path, readOnly }], network: "none" | "restricted" | "open", resourceLimits, startedAt, endedAt, exitStatus, outputs: [{ name, sha256 }], metricsFile?: { name, sha256 } }`.
228
+ The body is `{ receiptId, runner, projectId, attemptId, protocolHash, codeCommit, imageDigest, containers: [{ id, role: "candidate" | "evaluator" | "other" }], mounts: [{ container, path, readOnly }], network: "none" | "restricted" | "open", resourceLimits, startedAt, endedAt, exitStatus, outputs: [{ name, sha256 }], metricsFile?: { name, sha256 } }`. The identity fields `receiptId`, `runner`, `projectId`, `attemptId` and `protocolHash` are required; all observed fields are optional and an omitted observation remains `unknown`.
229
229
 
230
230
  Verification refuses before any write when any of these holds:
231
231
  - the runner is unknown or revoked;
@@ -236,7 +236,7 @@ Verification refuses before any write when any of these holds:
236
236
 
237
237
  Each mount also carries `purpose: "evaluator-code" | "evaluator-data" | "candidate-output" | "other"`.
238
238
 
239
- A verified receipt appends one `attestation` event, and its fields are `runner-attested`. `sealed` becomes verified only when every condition holds:
239
+ A verified receipt appends one host-generated `attestation` event, and its fields are `runner-attested`. The declared event parser refuses caller-supplied attestation events. Runner fields are projected per receipt, separately from declared and host-observed evidence; missing fields remain `unknown`. A matching `codeCommit` may attest the match only when the protocol names that exact commit. For a deliverable-based protocol, the signed commit remains an independent runner claim and the code-to-deliverable match stays `unknown`; it is never a host observation. `sealed` becomes verified only when every condition holds:
240
240
  - at least one container has role `candidate` and at least one has role `evaluator`, and their ids are disjoint and unique;
241
241
  - every mount's `container` names a listed container;
242
242
  - at least one mount has purpose `evaluator-code` or `evaluator-data` and is on an evaluator container;
@@ -244,7 +244,9 @@ A verified receipt appends one `attestation` event, and its fields are `runner-a
244
244
 
245
245
  Missing, empty or inconsistent isolation evidence leaves `sealed` declared or unverified, never verified.
246
246
 
247
- A receipt with a known `receiptId` and identical bytes is a no-op. The same `receiptId` with different bytes refuses.
247
+ A receipt with a known `receiptId` and identical canonical signed bytes (canonical receipt body and signature) is a no-op, including after its signing key is revoked, replaced or removed. Replay returns the stored proof without a new verification, event or write. The same `receiptId` with different canonical signed bytes refuses. Any new receipt id must pass verification against the current registration and key status; an unknown or revoked key therefore admits nothing new.
248
+
249
+ The stored receipt, its `attestation` event and the first incompatible database-format marker advance share one transaction. Readers support hub.db format 2 while opening a fresh or legacy database keeps baseline format 1; only the first successful receipt insertion advances it to format 2. A rejected receipt or failed transaction advances nothing. The `research_runners` recovery floor protects both stored receipts and a raw runner config key independently of the earlier research recovery floors. Release-equality integrity includes the stored receipt count and row digest only when receipts exist. Accepted registrations and raw key presence remain config/feature-floor inputs, not board-state equality inputs, so pending file edits and legacy snapshots without runner rows can release normally.
248
250
 
249
251
  ### Delivery
250
252
 
@@ -265,15 +267,16 @@ All new tables live in `hub.db`, created in the `Board` constructor with `CREATE
265
267
  | `research_protocols` | `hash` | campaign id and revision, body JSON, by, at |
266
268
  | `research_plans` | `hash` | campaign id, body JSON, by, at |
267
269
  | `research_attempts` | `attempt_id`, unique `(project, idempotency_key)` | protocol hash, task id, phase, retry_of, reproduces, by, at |
268
- | `research_attempt_events` | `(attempt_id, seq)`, unique `receipt_id` when present | kind, provenance, body JSON, at |
270
+ | `research_attempt_events` | `(attempt_id, seq)`, unique `(project, idempotency_key)` | kind, authority-derived provenance, body JSON (receipt id for an attestation), at |
271
+ | `research_runner_receipts` | `receipt_id`, unique `(attempt_id, event_seq)` | canonical receipt, signature, signing public key, body hash, by, at, private |
269
272
 
270
- `board.hasResearchState()` reports whether any row exists. Readback is paginated: at most 50 rows per call, with a cursor.
273
+ `board.hasResearchState()` reports whether any row exists. Campaign, attempt and event readback is paginated: at most 50 primary rows per page, with a cursor. The runner slice bounds signed receipts to 64 per attempt and projects them separately; a later expansion needs a reviewed receipt-page contract.
271
274
 
272
275
  ## Wire names
273
276
 
274
277
  | Surface | Name | Who |
275
278
  |---|---|---|
276
- | CLI | `ahub study draft <parent> <contract.json>`, `study revise <id> <revision> <contract.json>`, `study approve <id> <revision>`, `study close <id> <revision> --reason`, `study show [<id> | --after <id>] [--json]`, `study experiments [--campaign <id>] [--json]`, `study attest <attempt> <field> <value>`, `study receipt <file>` | approve, attest and receipt are person only; draft and revise are person or planner; show is anyone |
279
+ | CLI | `ahub study draft <parent> <contract.json>`, `study revise <id> <revision> <contract.json>`, `study approve <id> <revision>`, `study close <id> <revision> --reason`, `study show [<id> | --after <id>] [--json]`, `study experiments (--campaign <id> [--after <n>] | --attempt <ra-id> | --plan <hash> --baseline <ra-id> --variant <ra-id>) [--json]`, `study attest <attempt> <field> <value>`, `study receipt <file>` | approve, attest and receipt are person only; draft and revise are person or planner; show and experiments are anyone. `experiments` ships in #602 in exactly those three closed forms; `attest` and `receipt` are not built yet (see the #602 row) |
277
280
  | Hub tools | `hub_study_draft` and `hub_study_revise` (configured planner only, through `planningAuthority`; they store drafts and never approve), `hub_study_show` (read-only; no id lists this project's campaigns as receipts, one page of at most 50 as `{ campaigns, next? }`, and `after` continues from the `next` of the previous page), `hub_study_handoff` (bound task owner), `hub_experiment_record` (`kind`: `protocol`, `plan`, `attempt`, `event` or `receipt`; task owner), `hub_experiment_show` (read-only) | none of them approves or attests |
278
281
  | CLI (person only) | `ahub study approve-protocol <hash>` | person |
279
282
  | Control | `study` (console role, CLI only) | person |
@@ -296,6 +299,17 @@ Each slice amends this spec in its own PR if it must differ, and updates `docs/d
296
299
  | #601 | #930 T3, AC5 and AC6 | `ahub study` draft, revise, approve, close and show; `hub_study_draft`, `hub_study_revise`, `hub_study_show` and `hub_study_handoff`; the privacy stubs; role guidance in `templates/`; the three-source, two-peer example |
297
300
  | #602 | #932 T3, AC5 and AC6 | `ahub study experiments`, `attest` and `receipt`; `hub_experiment_show`; the synthetic CPU-only fixture; the rerun checklist in `docs/profiles.md` |
298
301
 
302
+ **As built in the #602 PR (amended here, because the build differs from this row).** Built: `ahub study experiments` in its three closed forms, the read-only `hub_experiment_show` (a read for every local peer, in `STUDY_TOOLS`, the read-only tool lists and `SESSION_READ_OPS`), the synthetic CPU-only fixture `test/research-experiments-fixture.test.ts`, and the person-authored rerun checklist, which lives in `docs/operations.md` ("Experiment readback") with a pointer from `docs/profiles.md`. Not built, and not needed for AC5 or AC6: `ahub study attest`, `ahub study receipt` and the `hub_experiment_record` tool. `Tasks.experimentRecord` and its receipt kind exist and are tested, but no tool, daemon case or CLI calls them yet, so until that slice lands the readback shows only what a test or a later slice recorded. Each of those writers needs its own authority review (person-only attest and receipt, task-owner record) and is a separate change.
303
+
304
+ **Task 615 record relay.** `hub_experiment_record` passes the whole inert envelope to
305
+ `Tasks.experimentRecord` with the authenticated caller identity. Its five existing kinds are `protocol`,
306
+ `plan`, `attempt`, `event` and `receipt`. Ordinary records require the current in-progress owner of a bound
307
+ unit in the current approved campaign; the person may relay a signed runner receipt through the existing
308
+ `USER` branch. This is not a new attestation or approval authority. All PII turns refuse before dispatch,
309
+ read-only callers cannot mutate, and arguments/results are excluded from hub-managed memory capture.
310
+ The relay returns the method's bounded record metadata only and performs no execution, signing or
311
+ verification itself. `ahub study attest` and `ahub study receipt` remain separate, unimplemented forms.
312
+
299
313
  ## Departures from the issues
300
314
 
301
315
  - Runner registration is person only in V1. #1018 proposed "the person or conductor". A public key is a trust root, so the conductor path is deferred until a reviewed change gives it the same confirmation as other trust settings.
@@ -0,0 +1,54 @@
1
+ # 0.26.0 release verification
2
+
3
+ This record covers release preparation and source review. It claims no installation, no running-hub upgrade to 0.26.0 and no live TUI launch.
4
+
5
+ ## Candidate
6
+
7
+ Version 0.26.0, prepared from main f14cb83b (6 commits since v0.25.0, 3 of them `feat`; bump rule: minor). The release commits carry the version, the CHANGELOG section, the bundle and the documentation stamps.
8
+
9
+ ## Reviews
10
+
11
+ Pull requests named by the commits since v0.25.0: #1052, #1051, #1050, #1046, #1049, #1045.
12
+
13
+ Each merged after a claude `hub_review` approval with exact-head CI green, no unresolved review thread and no pending change request:
14
+
15
+ - #1045 (task 607, staged upgrades): approved at 54298320, exact-head CI run 41284968505. The board bound the approval to 5b55eaa7, because hub 0.23.1 refuses in_review re-files; the verdict note names the delta to 54298320.
16
+ - #1049 (task 614, re-review an approved task at a new head): approved at c0768919, run 41288118624.
17
+ - #1046 (task 608, default agent set): approved at 855d1c4e, run 41290278469 (the aggregate jobs re-run on attempt 2 to refresh GitHub's rollup). The board bound it to 5bb4d8ca; the verdict note names the delta.
18
+ - #1050 (task 600, signed runner receipts): approved at 1333c1ec, run 41298012917, after two Important findings were fixed. The board bound it to 0be7de7d; the verdict note names the main merge in between.
19
+ - #1051 (task 613, ORCA_* scrub): approved at b9e544ab, run 41304275881, after two Important test-rule findings were fixed.
20
+ - #1052 (task 610, sticky project runtime and capture pruning): approved at de1cf56c, run 41306542595 attempt 2 (attempt 1 stopped at the CI admission step before any test), after three Important findings were fixed.
21
+
22
+ Independent OCR read-only reviews ran on #1045, #1050 and #1052.
23
+
24
+ ## Native acceptance receipts
25
+
26
+ Receipts added under `docs/verification/` since v0.25.0: none.
27
+
28
+ This list is read from the repository, never written by hand. Native acceptance and the person's release consent are separate records: consent is `ahub sdlc authorize-release 0.26.0`, person only, and is not recorded in this file. The tag run refuses without it.
29
+
30
+ ## Document review
31
+
32
+ Stale at preparation (`node scripts/check-docs.mjs`): README.md, docs/agent-notes/{README,adapters,benchmarks,budget,bus,daemon,tasks,tests}.md, docs/operations.md, docs/quickstart.md, docs/security.md and src/cli/help.ts. Most were stamped at aaccc30b; benchmarks.md at ce8da3ec. Three independent read-only reviews read each one against the diff of its covered sources since its stamp. They found:
33
+
34
+ - README.md: control protocol 17 (accepts 16), `ahub up` opening claude and codex, per-project `ahub upgrade` with the CLI and plugin updated separately, and the report link.
35
+ - docs/quickstart.md: the v0.26.0 tag, per-project upgrade, and a new "Upgrading to 0.26.0" section.
36
+ - src/cli/help.ts: `init` inheriting `start.agents`, `research.runners` under `settings edit`, and the doctor pruning rows. src/cli/main.ts gained `--project` in the upgrade usage line.
37
+ - docs/operations.md: the guide header (0.26.0, protocols 16 through 17), the "planned 0.26.0" table row, re-file and withdrawal of approved tasks (#1047), `research_runners` in the upgrade floors, the `start.agents` settings row, and `ALL_MACHINE_LOCAL`.
38
+ - docs/security.md: `start.agents` in the machine-local list.
39
+ - adapters.md: `start.upStart` as a fixed-builtin field. daemon.md: scoped receipts at schema 3, and scope paths for the new runtime, schema, protocol-window and default-agent modules. tasks.md: scope paths for research-runner.ts and task-approval.ts. tests.md: the preload named, and a workstation-only remote-run sentence removed.
40
+ - AGENTS.md "Area notes" and docs/verified.json: the same new paths.
41
+ - README.md (notes), benchmarks.md, budget.md and bus.md: accurate as they were.
42
+
43
+ All 13 were then restamped at 362859ec with `release-prepare.ts restamp --reviewed`.
44
+
45
+ ## Checks
46
+
47
+ On release/0.26.0 after the restamp: `node scripts/check-docs.mjs --require-fresh` printed `docs: OK (0 stale documents)`; `bun x tsc --noEmit` exited 0; `bun scripts/build.mjs --check` exited 0 (the bundle diff is the version string only); `node scripts/check-package.mjs` printed `package: OK (723 files, @staix/agent-hub@0.26.0)`. The release PR's exact-head CI run is the full test gate.
48
+
49
+ ## Known gaps, not blocking
50
+
51
+ - No local full test suite: heavy tests run off the workstation, and the release PR's exact-head CI is the gate. Each merged PR had its own exact-head CI green (see Reviews).
52
+ - No running-hub upgrade to 0.26.0, no live TUI launch and no live check of `ahub up` opening the default agents in a real terminal; those are covered only by tests with stubs.
53
+ - The scoped-upgrade guarantee (a project's recorded runtime survives restart) starts with 0.26.0 CLIs; an older published CLI ignores the record. This ceiling is documented in docs/operations.md.
54
+ - One single non-reproducible failure of test/terminal-launch-daemon.test.ts "#482 ..." was seen in a remote full run of #1051; it passed in reruns, in CI and on main, and is treated as a timing flake.
@@ -0,0 +1,49 @@
1
+ # 0.27.0 release verification
2
+
3
+ This record covers release preparation and source review. It claims no installation, no running-hub upgrade to 0.27.0 and no live TUI launch.
4
+
5
+ ## Candidate
6
+
7
+ Version 0.27.0, prepared from main de08b8e1 (4 commits since v0.26.0, 3 of them `feat`; bump rule: minor). The release commits carry the version, the CHANGELOG section, the bundle and the documentation stamps.
8
+
9
+ ## Reviews
10
+
11
+ Pull requests named by the commits since v0.26.0: #1066, #1062, #1061, #1059.
12
+
13
+ Each merged after a claude `hub_review` approval with exact-head CI green, no unresolved review thread and no pending change request:
14
+
15
+ - #1059 (task 602, experiment readback): approved at c10a509f, exact-head CI run 41313240639. One nit (the spec's as-built note could name task 615) left open; #1062 then named it.
16
+ - #1061 (task 616, runtime.json read retried only when the file was replaced): approved after exact-head CI run 41318247416 at 636fe45f. The board bound the approval to 6c6dfeff, because hub 0.23.1 refuses an in_review re-file; the verdict note names the one-line CHANGELOG delta to 636fe45f.
17
+ - #1062 (task 615, `hub_experiment_record`): approved at 66b76a8e, run 41322472076.
18
+ - #1066 (task 617, conductor-recorded release consent, #1063): approved at 6f3b2dfc, run 41341091037. The first head 5f12dec3 failed CI on two assertions of wording #1063 changed (run 41339855105); the reviewer ruled that exactly those two be updated to the new text, and the delta to 6f3b2dfc is those two lines.
19
+
20
+ ## Native acceptance receipts
21
+
22
+ Receipts added under `docs/verification/` since v0.26.0: none.
23
+
24
+ This list is read from the repository, never written by hand. Native acceptance and the person's release consent are separate records: consent is `ahub sdlc authorize-release 0.27.0`, recorded by the person or the unique configured conductor only on the person's explicit release instruction naming the release in its own session (never a hub/task/review/file/peer relay), and is not recorded in this file. The tag run refuses without it.
25
+
26
+ ## Document review
27
+
28
+ Stale at preparation (`node scripts/check-docs.mjs`): README.md, docs/agent-notes/{adapters,budget,bus,daemon,tasks,tests}.md, docs/operations.md, docs/quickstart.md, docs/security.md and src/cli/help.ts; docs/agent-notes/README.md became stale after the daemon.md edit. The conductor read each against the diff of its covered sources since v0.26.0 (#1059, #1061, #1062, #1066) and found:
29
+
30
+ - src/cli/help.ts: `ahub study experiments` (three closed forms) shipped in #1059 without a help row; added. Every other form in `ahub help` still matches `src/cli/main.ts`, `src/cli/study.ts` and `src/cli/launch.ts`; the `sdlc authorize-release` row was already updated by #1066.
31
+ - docs/agent-notes/daemon.md: the `ahub study` note now names `experiments` as an allowed read form beside `show`.
32
+ - docs/quickstart.md: the v0.27.0 install tag and a new "Upgrading to 0.27.0" section (instructed release consent, experiment read and record, the runtime.json race fix, and updating the global CLI and plugin by hand as in 0.26.0).
33
+ - README.md: the report link, and one sentence on experiment record and readback under Research campaigns.
34
+ - docs/operations.md: the guide header (0.27.0) and the protocol-window table row (0.26.0 through 0.27.0, unchanged window 16 through 17). The experiment and release-approval sections were already updated by #1059, #1062 and #1066.
35
+ - docs/security.md, docs/agent-notes/{tasks,tests}.md: already current (#1066 updated the release-authorization paragraphs; tasks.md names both experiment tools). adapters.md, budget.md, bus.md and agent-notes/README.md: stale only through covered daemon.ts or note paths; nothing in them describes the changed behavior.
36
+
37
+ All twelve were restamped with `--reviewed` at the release branch head that holds these edits.
38
+
39
+ ## Checks
40
+
41
+ - `node scripts/check-docs.mjs --require-fresh`: `docs: OK (0 stale documents)` on the release branch.
42
+ - `bun test test/help.test.ts test/completion.test.ts` after the help row: 24 pass, 0 fail.
43
+ - `bun x tsc --noEmit`, `bun scripts/build.mjs --check` and `node scripts/check-package.mjs`: run by the release PR's exact-head CI, together with the full suite on ubuntu and macOS and the seeded guards (heavy checks run only on CI or dgx02 on this machine).
44
+
45
+ ## Known gaps, not blocking
46
+
47
+ - No installation and no running-hub upgrade to 0.27.0 is claimed here. The running hub on this machine is 0.23.1, so the conductor-recorded consent of #1063 is not live yet; this release's consent is the person's own `ahub sdlc authorize-release 0.27.0`.
48
+ - No live receipt for `hub_experiment_record` or the instructed-consent path; both are covered by daemon-level tests only.
49
+ - Issue #418 was closed with its managed-Pi live leg waived (owner decision 2026-11-02); a post-close Pi smoke on hub 0.23.1 (tasks 618, 619) passed spec read, memory read and one remote isolated check, Linux evidence only.
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": 1,
3
3
  "documents": {
4
4
  "README.md": {
5
- "verifiedAgainst": "aaccc30bd32653ba1925220334445e020be21732",
5
+ "verifiedAgainst": "c3f379ce1ce1c4c1f7b5442c78fd8c534ff12ec0",
6
6
  "paths": [
7
7
  "package.json",
8
8
  "src/",
@@ -11,14 +11,14 @@
11
11
  ]
12
12
  },
13
13
  "docs/security.md": {
14
- "verifiedAgainst": "aaccc30bd32653ba1925220334445e020be21732",
14
+ "verifiedAgainst": "c3f379ce1ce1c4c1f7b5442c78fd8c534ff12ec0",
15
15
  "paths": [
16
16
  "src/",
17
17
  "templates/"
18
18
  ]
19
19
  },
20
20
  "docs/operations.md": {
21
- "verifiedAgainst": "aaccc30bd32653ba1925220334445e020be21732",
21
+ "verifiedAgainst": "c3f379ce1ce1c4c1f7b5442c78fd8c534ff12ec0",
22
22
  "paths": [
23
23
  "package.json",
24
24
  "src/",
@@ -35,7 +35,7 @@
35
35
  ]
36
36
  },
37
37
  "docs/quickstart.md": {
38
- "verifiedAgainst": "aaccc30bd32653ba1925220334445e020be21732",
38
+ "verifiedAgainst": "c3f379ce1ce1c4c1f7b5442c78fd8c534ff12ec0",
39
39
  "paths": [
40
40
  "package.json",
41
41
  "src/",
@@ -43,7 +43,7 @@
43
43
  ]
44
44
  },
45
45
  "docs/agent-notes/adapters.md": {
46
- "verifiedAgainst": "aaccc30bd32653ba1925220334445e020be21732",
46
+ "verifiedAgainst": "c3f379ce1ce1c4c1f7b5442c78fd8c534ff12ec0",
47
47
  "paths": [
48
48
  "src/adapters/",
49
49
  "src/pi/",
@@ -81,7 +81,7 @@
81
81
  ]
82
82
  },
83
83
  "docs/agent-notes/benchmarks.md": {
84
- "verifiedAgainst": "ce8da3ec141f7ef17e2e1cd6a8104ddc36304efe",
84
+ "verifiedAgainst": "362859ec83ca659483423393174a294a5c40bb90",
85
85
  "paths": [
86
86
  "scripts/benchmarks/",
87
87
  "test/benchmarks/",
@@ -93,7 +93,7 @@
93
93
  ]
94
94
  },
95
95
  "docs/agent-notes/budget.md": {
96
- "verifiedAgainst": "aaccc30bd32653ba1925220334445e020be21732",
96
+ "verifiedAgainst": "c3f379ce1ce1c4c1f7b5442c78fd8c534ff12ec0",
97
97
  "paths": [
98
98
  "src/hub/budget.ts",
99
99
  "src/cli/statusline-tee.ts",
@@ -117,7 +117,7 @@
117
117
  ]
118
118
  },
119
119
  "docs/agent-notes/bus.md": {
120
- "verifiedAgainst": "aaccc30bd32653ba1925220334445e020be21732",
120
+ "verifiedAgainst": "c3f379ce1ce1c4c1f7b5442c78fd8c534ff12ec0",
121
121
  "paths": [
122
122
  "src/hub/bus.ts",
123
123
  "src/hub/envelope.ts",
@@ -132,7 +132,7 @@
132
132
  ]
133
133
  },
134
134
  "docs/agent-notes/daemon.md": {
135
- "verifiedAgainst": "aaccc30bd32653ba1925220334445e020be21732",
135
+ "verifiedAgainst": "c3f379ce1ce1c4c1f7b5442c78fd8c534ff12ec0",
136
136
  "paths": [
137
137
  "src/hub/daemon.ts",
138
138
  "src/hub/control-client.ts",
@@ -210,7 +210,16 @@
210
210
  "src/hub/session-identity.ts",
211
211
  "src/hub/provenance.ts",
212
212
  "src/hub/channel-project.ts",
213
- "src/hub/project.ts"
213
+ "src/hub/project.ts",
214
+ "src/hub/project-runtime-state.ts",
215
+ "src/hub/project-runtime.ts",
216
+ "src/hub/runtime-capture-prune.ts",
217
+ "src/hub/runtime-prune-health.ts",
218
+ "src/hub/db-schema.ts",
219
+ "src/hub/protocol-window.ts",
220
+ "src/hub/start-agents.ts",
221
+ "src/cli/start-agents-run.ts",
222
+ "src/cli/runtime-version-warning.ts"
214
223
  ]
215
224
  },
216
225
  "docs/agent-notes/local-worker.md": {
@@ -234,7 +243,7 @@
234
243
  ]
235
244
  },
236
245
  "docs/agent-notes/tasks.md": {
237
- "verifiedAgainst": "aaccc30bd32653ba1925220334445e020be21732",
246
+ "verifiedAgainst": "c3f379ce1ce1c4c1f7b5442c78fd8c534ff12ec0",
238
247
  "paths": [
239
248
  "src/hub/tasks.ts",
240
249
  "src/hub/board.ts",
@@ -276,11 +285,13 @@
276
285
  "src/hub/folder-trigger.ts",
277
286
  "src/hub/handoff.ts",
278
287
  "src/cli/handoff-args.ts",
279
- "src/cli/handoff-output.ts"
288
+ "src/cli/handoff-output.ts",
289
+ "src/hub/task-approval.ts",
290
+ "src/hub/research-runner.ts"
280
291
  ]
281
292
  },
282
293
  "docs/agent-notes/tests.md": {
283
- "verifiedAgainst": "aaccc30bd32653ba1925220334445e020be21732",
294
+ "verifiedAgainst": "c3f379ce1ce1c4c1f7b5442c78fd8c534ff12ec0",
284
295
  "paths": [
285
296
  "test/",
286
297
  "scripts/check.sh",
@@ -304,11 +315,12 @@
304
315
  "scripts/progress-tee.sh",
305
316
  "scripts/release-prepare.ts",
306
317
  "scripts/release-tag.ts",
307
- "scripts/lib/release-plan.ts"
318
+ "scripts/lib/release-plan.ts",
319
+ "src/hub/orca-env.ts"
308
320
  ]
309
321
  },
310
322
  "docs/agent-notes/README.md": {
311
- "verifiedAgainst": "aaccc30bd32653ba1925220334445e020be21732",
323
+ "verifiedAgainst": "c3f379ce1ce1c4c1f7b5442c78fd8c534ff12ec0",
312
324
  "paths": [
313
325
  "src/cli/console-state.ts",
314
326
  "src/cli/attention.ts",
@@ -317,7 +329,7 @@
317
329
  ]
318
330
  },
319
331
  "src/cli/help.ts": {
320
- "verifiedAgainst": "aaccc30bd32653ba1925220334445e020be21732",
332
+ "verifiedAgainst": "c3f379ce1ce1c4c1f7b5442c78fd8c534ff12ec0",
321
333
  "paths": [
322
334
  "src/cli/main.ts",
323
335
  "src/cli/launch.ts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@staix/agent-hub",
3
- "version": "0.25.0",
3
+ "version": "0.27.0",
4
4
  "description": "Native multi-agent hub: Claude Code, Codex, Kimi Code, Pi and local inference as peers in one project",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-hub",
3
- "version": "0.25.0",
3
+ "version": "0.27.0",
4
4
  "description": "Channel between Claude Code and the agent-hub daemon: peer messages from Codex, Kimi and the local worker arrive as channel events; hub_send replies.",
5
5
  "author": {
6
6
  "name": "Young Joon Lee",