@staix/agent-hub 0.12.42 → 0.12.44
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 +30 -0
- package/README.md +5 -4
- package/docs/adding-an-ai-tool.md +140 -0
- package/docs/agent-notes/README.md +5 -0
- package/docs/agent-notes/adapters.md +11 -4
- package/docs/agent-notes/budget.md +2 -2
- package/docs/agent-notes/bus.md +2 -0
- package/docs/agent-notes/daemon.md +15 -6
- package/docs/agent-notes/tasks.md +7 -2
- package/docs/agent-notes/tests.md +6 -2
- package/docs/operations.md +159 -26
- package/docs/quickstart.md +11 -3
- package/docs/sdlc.md +1 -1
- package/docs/security.md +7 -5
- package/docs/specs/2026-09-19-agent-hub-design.md +209 -13
- package/docs/verification/2026-10-21-0.12.43.md +50 -0
- package/docs/verification/2026-10-21-0.12.44.md +54 -0
- package/docs/verification/2026-10-21-agy-1.4.3-t0.md +65 -0
- package/docs/verification/2026-10-21-grok-config-acp-t0.md +30 -0
- package/docs/verification/2026-10-21-pii-screen.md +14 -0
- package/docs/verified.json +34 -19
- package/package.json +1 -1
- package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
- package/plugins/agent-hub/server.js +808 -255
- package/src/adapters/acp-owned-group.ts +124 -0
- package/src/adapters/acp.ts +92 -25
- package/src/adapters/agy/definition.ts +1 -3
- package/src/adapters/agy/entry.ts +4 -1
- package/src/adapters/agy/hooks.ts +7 -2
- package/src/adapters/channel-peer.ts +143 -0
- package/src/adapters/claude-channel.ts +7 -7
- package/src/adapters/codex-appserver.ts +16 -2
- package/src/adapters/configured-acp.ts +124 -0
- package/src/adapters/definitions/builtin-metadata.ts +37 -33
- package/src/adapters/definitions/native-channel-state.ts +41 -0
- package/src/adapters/definitions/native-cli-entry-kimi.ts +3 -1
- package/src/adapters/definitions/native-cli-preview-qwen.ts +1 -1
- package/src/adapters/definitions/native-identity-defaults.ts +14 -0
- package/src/adapters/definitions/qwen.ts +3 -8
- package/src/adapters/definitions/reviewer-variants.ts +3 -7
- package/src/adapters/jcode.ts +4 -0
- package/src/adapters/local-worker.ts +4 -0
- package/src/adapters/pi.ts +50 -16
- package/src/adapters/registry-types.ts +18 -16
- package/src/adapters/registry.ts +68 -6
- package/src/adapters/reviewer-print.ts +4 -0
- package/src/cli/agy-mcp.ts +3 -2
- package/src/cli/completion.ts +173 -0
- package/src/cli/configured-acp-entry.ts +58 -0
- package/src/cli/console-state.ts +116 -24
- package/src/cli/console.ts +9 -6
- package/src/cli/facts-hook.ts +2 -1
- package/src/cli/help.ts +8 -1
- package/src/cli/identity.ts +8 -7
- package/src/cli/launch.ts +5 -4
- package/src/cli/main.js +5 -1
- package/src/cli/main.ts +84 -27
- package/src/cli/memory.ts +13 -10
- package/src/cli/output.ts +1 -0
- package/src/cli/preview.ts +9 -0
- package/src/cli/recovery-guidance.ts +1 -1
- package/src/cli/terminal-recovery.ts +33 -21
- package/src/cli/upgrade-restore-state.ts +3 -2
- package/src/cli/upgrade-runtime.ts +21 -6
- package/src/cli/upgrade.ts +3 -2
- package/src/hub/board.ts +9 -6
- package/src/hub/budget.ts +9 -2
- package/src/hub/bus.ts +6 -2
- package/src/hub/claude-state.ts +2 -37
- package/src/hub/conductor.ts +8 -6
- package/src/hub/config-apply.ts +26 -14
- package/src/hub/config-reload.ts +39 -11
- package/src/hub/config-trust.ts +1 -1
- package/src/hub/context-window.ts +6 -0
- package/src/hub/control-client.ts +1 -1
- package/src/hub/crash.ts +8 -6
- package/src/hub/daemon.ts +471 -338
- package/src/hub/hub-tools.ts +37 -1
- package/src/hub/instance-config.ts +20 -11
- package/src/hub/instance-execution.ts +4 -4
- package/src/hub/instances.ts +45 -21
- package/src/hub/lifecycle-schema.ts +5 -3
- package/src/hub/main-checkout.ts +2 -2
- package/src/hub/manager.ts +10 -2
- package/src/hub/memory-profile.ts +16 -3
- package/src/hub/no-writes.ts +50 -0
- package/src/hub/permission-mode.ts +9 -7
- package/src/hub/roster.ts +7 -4
- package/src/hub/routing.ts +21 -20
- package/src/hub/settings.ts +51 -17
- package/src/hub/snapshots.ts +276 -17
- package/src/hub/start-mode.ts +10 -8
- package/src/hub/task-sweep.ts +8 -2
- package/src/hub/tasks.ts +101 -19
- package/src/memory/capture.ts +2 -1
- package/src/ui/index.html +5 -0
- package/templates/AGENTS.block.md +1 -1
- package/templates/profiles/general.json +1 -1
- package/templates/profiles/research.json +1 -1
- package/templates/profiles/writing.json +1 -1
|
@@ -1045,7 +1045,11 @@ session modes (`default`, `plan`, `auto`, `yolo`) but nothing per server or tool
|
|
|
1045
1045
|
- Snapshots are taken inside the state transition, before the peer is handed its
|
|
1046
1046
|
prompt. Turn records (`turns` table in hub.db) keep the last `snapshots.keep`
|
|
1047
1047
|
per peer. `DEFAULT_CONFIG` has snapshots off, like approvals.notify; a project
|
|
1048
|
-
config turns them on.
|
|
1048
|
+
config turns them on. The daemon shares a monotonic 250 ms Git budget across a
|
|
1049
|
+
synchronous boundary burst, including repository/HEAD probes and end diffs. Each
|
|
1050
|
+
subprocess timeout uses only the remaining budget. Exhaustion or failed diff
|
|
1051
|
+
evidence records an unknown boundary, emits a diagnostic once per burst and
|
|
1052
|
+
grants no undo/attribution; I/O gets a turn before a new budget is available (#576).
|
|
1049
1053
|
- `ahub undo` refuses the whole turn when any of its files changed since it
|
|
1050
1054
|
ended (a file-by-file partial undo would leave a mixed state).
|
|
1051
1055
|
- Codex: the method is `thread/revert {threadId, beforeTurnId}` (codex-cli
|
|
@@ -1332,7 +1336,7 @@ session modes (`default`, `plan`, `auto`, `yolo`) but nothing per server or tool
|
|
|
1332
1336
|
- `hub_delivery_retry { delivery_id }` lets an authenticated recipient retry only its own current `needs_review` row. This option is offered only to transports with an independent tool turn (Claude channel/pull, Codex and Pi). The delivery-only local worker and headless ACP peers cannot start a tool turn through their own hold, so they do not advertise this tool and the daemon refuses a manual call before mutation. Their held hints ask the person to resolve the row; ordinary messages never bypass the hold. Kimi TUI remains pull-only and keeps the recipient option. An ephemeral delivery-only MCP marker controls exposure and hint copy only; the current adapter class is the authority. There is no action or reason input: `completed` and `discard` remain person-only. Any explicit retry in that recipient's lineage, including a person's retry, consumes this allowance; a redelivery held again stays for the person. The existing resolution transaction records `peer:<id>` and a fixed reason, keeps original envelopes unchanged and requeues them through the existing put-back path. A busy recipient may consent to this queue-only operation, but delivery waits for idle and all pause/recovery and active-delivery fences remain. The rendered clone reserves the existing journal body cap for the warning, clipping only the clone at a Unicode character boundary with an explicit cut marker when needed; originals remain unchanged. Jcode project MCP entries carry the same delivery-only exposure marker as other headless ACP peers, preserving their own configuration and peer identity rules. Final rendered output, after condensation and on pull or steer, starts with the fixed sanitized header `Hub redelivery warning: An earlier attempt of this delivery is uncertain; check for its effects before acting.` Explicit retry history is scoped by recipient and original envelope ids. A separate monotone consumed-proof projection records one proof id and warning provenance per original, leaving resolution audit rows unchanged. Explicit resolution and coalesced handoff inherit that proof atomically for every grouped non-context original; a rejected checkpoint consumes no fresh allowance. Hub presence originals carry mutable recall/shared context whose id survives merging, so their ids never participate in retry proof lookup, inheritance, warnings or unknown marking. A preface shared with earlier work cannot consume an unrelated new message's retry allowance; actual task/chat originals retain their consumed lineage. Safe-failure requeue, withdrawal of an earlier original, terminal-state changes, pruning, restart or older-writer audit replacement cannot renew the allowance. Older attempt-bearing rows backfill this projection on return. Recovery snapshots without history and unmappable pruned pre-feature retry records mark only their affected recipient/original ids unknown: those lineages require a person, while unrelated new messages keep their allowance. Tool results expose held metadata only (total count, ids, senders, kinds and age), at most 32 rows/4 KiB with explicit truncation; no body or task text enters the hint. These hints work independently of channel mode and do not wait behind the held queue (#434).
|
|
1333
1337
|
- Local attach and idle model/route replacement require a reachable authenticated gateway, served models and successful minimal availability calls. Busy workers refuse replacement; validation failure leaves the current worker intact. Controlled recovery can reconstruct a manually paused local worker without gateway availability, but manual resume validates its restored choice before lifting the pause. Doctor checks the fixed model against the inventory.
|
|
1334
1338
|
- Reviewer routing appends attached peers holding `roles.reviewer` after the review class's candidates. Without a reviewer, task results and console notices explain direct approval and the skipped candidates.
|
|
1335
|
-
- Conflict detection includes `in_review` work. Completed overlapping snapshots that share files
|
|
1339
|
+
- Conflict detection includes `in_review` work. Completed overlapping snapshots that share files compute one concurrent-edit change set across the completed overlapping turns and publish at most one conditional notice per affected task, containing both turn ids and attributing the changes to neither peer. Per-task-pair events remain research evidence, while notice persistence grows linearly in the affected tasks (#576). A bounded, per-worktree HEAD reflog cursor classifies moves appended during the turn. Incoming checkout, merge, pull and proven fast-forward reset paths are excluded from attributed changes and undo paths; normal peer commit, amend and cherry-pick paths remain attributed, as do sequencer pick/reword/edit/squash/fixup/continue/finish paths under native command prefixes. The start checkout of rebase or pull --rebase is incoming; overlapping replay paths are ambiguous, not attributed as upstream work. Paths still dirty between end HEAD and the end workspace snapshot are never excluded (including autostash and checkout -m). Independent working-tree edits remain attributed. Fast-forward reset follows this incoming policy even if its descendant target contains commits made by the peer elsewhere. Missing, rotated, truncated, unrecognized or ambiguous move evidence is unknown, never an exclusion; paths shared by own and incoming moves are ambiguous. A HEAD change during snapshot capture makes that capture unknown. Status probes the checkout branch once per synchronous burst, then screens the cached raw branch through the current privacy policy for every rendering; the cache ends before the next control turn. Pi terminal reconciliation reads an owner observation maintained by the existing 500 ms monitor and expiring after 1 s; fresh signature checks remain mandatory at tool/effect admission and teardown. Private tasks and sensitive file names remain redacted.
|
|
1336
1340
|
- Pi assistant usage is forwarded through the authenticated bridge and recorded before settlement, without counting the same message both at `message_end` and `agent_end`.
|
|
1337
1341
|
- An idle peer with no open owner/reviewer task and no queued or active delivery skips the quota checkpoint turn; the pause proceeds immediately and the log records the skip.
|
|
1338
1342
|
- Control protocol 11 adds queue hold metadata; the current coordinator supports authenticated protocol 9, 10 and 11 recovery sources.
|
|
@@ -1542,9 +1546,10 @@ or Home/End sequences is that many key presses, never a paste. Home or `<` selec
|
|
|
1542
1546
|
the first row of a panel and End or `>` the last (Home tops an open view); the
|
|
1543
1547
|
Events panel follows new events while its selection is on the last row, keeps a
|
|
1544
1548
|
row the person moved to, and opening it or changing its filter selects the newest
|
|
1545
|
-
row (#441).
|
|
1546
|
-
|
|
1547
|
-
|
|
1549
|
+
row (#441). Outside the Peers panel, `w` opens the project dashboard (`ahub ui`);
|
|
1550
|
+
in Peers it opens the selected peer's WIP limit edit (#532 W1-W3). `o` opens the
|
|
1551
|
+
pet window (`ahub pet --window`) as a person's console command; the `:` line
|
|
1552
|
+
also accepts `ui` and `pet` (#452). An Events row's header is
|
|
1548
1553
|
tokenized by the stream's own tokenizer on the same tab-flattened text, with the
|
|
1549
1554
|
event's tone and kind; body lines stay plain, and selection changes only the
|
|
1550
1555
|
`>` marker. The tail prints a peer's context reading once and repeats it only
|
|
@@ -1630,9 +1635,37 @@ console emits no box-drawing or other ambiguous-width glyph. The active tab is
|
|
|
1630
1635
|
bracketed; the Approvals and Queue tabs count pending requests and
|
|
1631
1636
|
`needs_review` deliveries. Peers, Approvals, Tasks and Queue are tables: a
|
|
1632
1637
|
header row, columns two spaces apart sized with `Bun.stringWidth` from every
|
|
1633
|
-
row (at most a third of the width), the last column taking the rest. Peers'
|
|
1634
|
-
|
|
1635
|
-
|
|
1638
|
+
row (at most a third of the width), the last column taking the rest. Peers'
|
|
1639
|
+
columns are PEER, STATE, MODE, LINK, Q, !, WIP, REVIEW, PAUSE, QUOTA and MODEL;
|
|
1640
|
+
MODE appears only when at least one peer has a non-`ask` mode. WIP reads
|
|
1641
|
+
`wip/limit` from the peer's `taskWip` entry, preserving zero (for example `0/2`),
|
|
1642
|
+
or `-` when absent. It uses the attention tone at `wip >= wipLimit`. WIP is
|
|
1643
|
+
optional at narrow widths and drops before PEER, STATE and QUOTA, with or
|
|
1644
|
+
without MODE. The Peers hint includes `w WIP limit`, shortened to `w WIP`
|
|
1645
|
+
through the existing width adaptation alongside `m permission mode`/`m mode`.
|
|
1646
|
+
Tasks has a `b` toggle between open work and backlog (#532 B1-B5), using the
|
|
1647
|
+
same public board response. Backlog rows sort by rank (missing last), then id;
|
|
1648
|
+
the heading counts them. Its columns are ID, PRI (priority/rank), RESERVED,
|
|
1649
|
+
DEPS (ready or unapproved dependency ids), CLASS, AGE and TITLE. PII titles stay
|
|
1650
|
+
stubs. Narrow widths drop metadata before ID, RESERVED and TITLE.
|
|
1651
|
+
|
|
1652
|
+
Backlog row keys prefill the existing person CLI: `p` is
|
|
1653
|
+
`backlog pull-ready <id> <planningRevision> <reason>`, `a` is `backlog plan`
|
|
1654
|
+
with a reservation JSON object, `e` is `backlog plan` with priority/rank/deps,
|
|
1655
|
+
and `c` is the existing flow-revision-bound `task cancel`. `n` in either Tasks
|
|
1656
|
+
view adds backlog work (`backlog add <class> <title...>`, or the command line's
|
|
1657
|
+
`task propose --backlog` with paths/deps). On proposed or in-progress open work,
|
|
1658
|
+
`R` returns an ownerless proposal with `backlog return <id>` or accepted,
|
|
1659
|
+
untouched work with the planning-revision-and-reason form. The hub retains its
|
|
1660
|
+
execution-evidence refusal. Row commands preserve id and revision through
|
|
1661
|
+
editing and confirmation, reject stale rows, and execute only after explicit
|
|
1662
|
+
confirmation; Esc sends nothing. Backlog mutations on the `:` line confirm too,
|
|
1663
|
+
while `backlog list` is read-only. Refusal notices preserve the hub's reason.
|
|
1664
|
+
There is no new write path or actor authority; person CLI and planner revision
|
|
1665
|
+
checks remain authoritative. Hints follow the selected row's available actions.
|
|
1666
|
+
|
|
1667
|
+
LINK reads `tools-only` when the optional `toolsOnly` status field (#205) is
|
|
1668
|
+
present. Other zero counters read `-`, durations `45s`, `12m`, `3h05m` or `2d03h`, and
|
|
1636
1669
|
resets and pauses are relative. Detail views and the Approvals panel's request
|
|
1637
1670
|
block put labels at column 0 and values one column past the longest label; a
|
|
1638
1671
|
list puts `- ` before each item, and every other line of a value (its own
|
|
@@ -3231,7 +3264,14 @@ later turn; a running turn retains its capture decision and is never stopped.
|
|
|
3231
3264
|
|
|
3232
3265
|
The console's sixth Settings tab reads the same registry as the dashboard. It edits
|
|
3233
3266
|
through the authenticated daemon client: value, preview, nonempty bounded reason,
|
|
3234
|
-
then explicit y; undo also previews and confirms.
|
|
3267
|
+
then explicit y; undo also previews and confirms. In the Peers tab, `w` enters
|
|
3268
|
+
this same editor in place on Peers for `tasks.wip_limits.<peer>`, prefilled
|
|
3269
|
+
with the selected peer's current limit. Bounds (currently 0..32), the `raises` risk label and
|
|
3270
|
+
`applies: live` come from the setting definition. A missing `taskWip` entry
|
|
3271
|
+
produces a notice and opens no edit. Esc cancels without a write; `6`, then
|
|
3272
|
+
`u` invokes the existing Settings undo preview/confirmation operation. The shortcut creates no
|
|
3273
|
+
write path or authority: Settings remain person-only and `ahub settings` keeps
|
|
3274
|
+
its agent-shell refusal. Stale preview replies cannot arm a
|
|
3235
3275
|
write, and pasted confirmation text never executes one. The daemon accepts additive
|
|
3236
3276
|
settings_reload and undo-preview requests only from console roles. The dashboard's
|
|
3237
3277
|
setting_reload action uses its existing authenticated session; manager forwarding
|
|
@@ -3453,9 +3493,9 @@ load daemon config or infer executable commands from environment text.
|
|
|
3453
3493
|
the host still performs each probe, while definitions validate or display it.
|
|
3454
3494
|
`cli.authority` and `cli.personOnlyFlags` can only restrict existing authority;
|
|
3455
3495
|
identity.ts stays authoritative and missing/unknown metadata retains today's
|
|
3456
|
-
rule. `start.passthrough` is data only.
|
|
3457
|
-
existing
|
|
3458
|
-
|
|
3496
|
+
rule. `start.passthrough` is data only. MCP installation, ordering fences and
|
|
3497
|
+
finally cleanup remain in the existing CLI host; A2b removes the unconsumed
|
|
3498
|
+
`init.mcpPlan` sketch instead of advertising another installation path.
|
|
3459
3499
|
|
|
3460
3500
|
### A2 internal native host projections (2026-10-18)
|
|
3461
3501
|
|
|
@@ -3618,6 +3658,70 @@ import/reexport bindings through lexical symbols before classifying comparisons.
|
|
|
3618
3658
|
Shadowed and unrelated bindings remain independent; named non-peer enum exceptions
|
|
3619
3659
|
keep their exact scope. It performs no filesystem or package lookup.
|
|
3620
3660
|
|
|
3661
|
+
### A2b consumed contracts and conformance (2026-10-21, #451, #625 phases 2-3)
|
|
3662
|
+
|
|
3663
|
+
Runtime `start.launch` is optional and supplies only real native argv planners.
|
|
3664
|
+
Kimi, Pi, local, Jcode and fresh-review children use verified host startup ports,
|
|
3665
|
+
not unused CLI-wrapper plans. The frozen A1 export retains its old compatibility
|
|
3666
|
+
shape under a separate legacy type and is never selected by runtime consumers.
|
|
3667
|
+
Remove unused `start.ownsTerminal`, `init`, `QuotaReader.resetOnWindow` and hooks
|
|
3668
|
+
`agentIdentity`, `onAttach`, `onDetach`, `conversationRevert`, `replaceSession`.
|
|
3669
|
+
Actual terminal ownership, identity, revert, replacement and MCP writes retain
|
|
3670
|
+
their existing transport/host paths. The consumed native facts hook remains.
|
|
3671
|
+
Remove unconsumed runtime `permission.modes` and `permission.readOnly`; native mode
|
|
3672
|
+
mappings, host approval gates and fresh-review isolation receipts remain
|
|
3673
|
+
unchanged and authoritative. Missing metadata never grants permission.
|
|
3674
|
+
|
|
3675
|
+
`attach.externalHello` explicitly admits an authenticated external process.
|
|
3676
|
+
`instances.mode` separately selects external or headless declaration policy,
|
|
3677
|
+
with an optional fixed role ceiling. MCP configuration shape grants neither.
|
|
3678
|
+
Claude keeps human-owned external planner/reviewer instances and its fresh
|
|
3679
|
+
headless reviewer exception; agy now refuses ordinary extra instances at config load (older declarations could load as inert pull-only extras).
|
|
3680
|
+
Qwen context is now unknown because it has no verified occupancy source; it no
|
|
3681
|
+
longer borrows Kimi's context parser.
|
|
3682
|
+
Declaration admission never proves execution-root ownership or isolation.
|
|
3683
|
+
|
|
3684
|
+
Daemon normalization dispatches through the resolved definition's `budget.reader`
|
|
3685
|
+
and `budget.context`. Preserve source timestamps and current session, launch,
|
|
3686
|
+
generation and privacy fences. Missing readers stay unknown, including ACP kinds
|
|
3687
|
+
without a verified occupancy source; never borrow another kind's parser or
|
|
3688
|
+
manufacture empty quota readings or zero occupancy.
|
|
3689
|
+
|
|
3690
|
+
The fixed-builtin restrictions above remain ceilings: `acpCommand` selects the
|
|
3691
|
+
Kimi-specific host startup path; `attach.admission` consumes its native TUI launch
|
|
3692
|
+
receipt; `resetSoftTokensOnResume` resets host-owned soft accounting;
|
|
3693
|
+
`crashIdentity` validates released native recovery records; `pi-rpc` owns the
|
|
3694
|
+
verified relay, sandbox and process-monitor lifecycle. Configured definitions
|
|
3695
|
+
cannot opt into these host-global assumptions. Their upgrade path is typed,
|
|
3696
|
+
kind-neutral host ports before external loading, not removal of scope guards.
|
|
3697
|
+
|
|
3698
|
+
Registry coherence validates base and reviewer-variant attach, factory and reader
|
|
3699
|
+
structure without invoking a reader or performing I/O. Conformance enumerates
|
|
3700
|
+
every definition and variant with distinct enrollment or an unsupported reason
|
|
3701
|
+
naming dedicated coverage. Driven fixtures use `definition.start.create`; Claude
|
|
3702
|
+
uses its real external channel. Jcode exercises its owned-ACP watchdog and Kimi
|
|
3703
|
+
separately exercises TUI pull-only queue behavior. Unsupported native permission
|
|
3704
|
+
or quota legs never imply readiness.
|
|
3705
|
+
|
|
3706
|
+
The AST guard additionally checks native defaults, source-proven peer/kind call
|
|
3707
|
+
arguments, exact native regexes, startsWith/includes/hasOwn predicates (including
|
|
3708
|
+
constant bracket spellings), and adapter-origin native instanceof dispatch.
|
|
3709
|
+
Aliases and shadowing remain source-bound; generic hub classes, dynamic keys and
|
|
3710
|
+
prose are not native identity policy. Keep the frozen core baseline empty and
|
|
3711
|
+
existing seed entries unchanged except the reviewed search/replacement-only
|
|
3712
|
+
reanchors of `roster-detached-pi-recovery` and `kimi-watch-live-owner` from
|
|
3713
|
+
instanceof to the equivalent native predicates. Their identity and named tests
|
|
3714
|
+
stay unchanged, with green-to-named-assertion proof through the seed runner. Add a
|
|
3715
|
+
registry START_MODE_PEERS membership mutation seed.
|
|
3716
|
+
Native type predicates and the external channel implementation live in adapters;
|
|
3717
|
+
authentication and lifecycle authority remain in the daemon. Stable hub leaf
|
|
3718
|
+
exports preserve source compatibility for native state readers.
|
|
3719
|
+
|
|
3720
|
+
After unidentifiable Codex cancellation, status carries a fixed
|
|
3721
|
+
`unidentified-cancellation` notice while its existing offline latch holds. Late
|
|
3722
|
+
completion cannot clear it; verified native reattachment does. No native ids or
|
|
3723
|
+
provider text reach the notice.
|
|
3724
|
+
|
|
3621
3725
|
## Amendment: playbook lifecycle and criteria checklist, 2026-10-18 (#481 S0/S8)
|
|
3622
3726
|
|
|
3623
3727
|
- The AI-Native SDLC Playbook supplies the built-in stage model of an enabled lifecycle: intent (Plan), spec (Design), plan and build (Build), test (Test), review, merge and release (Deploy), maintain (Maintain). `mode` advise or enforce without `stages` selects this list. Off (no file, or `mode = "off"`) keeps the seven #257 stages, so its config, receipts, `hub_sdlc_record` schema and status output stay byte for byte. An explicit #257 list still loads: off keeps it as written, and an enabled lifecycle keeps its order under canonical ids (spec, plan, build, review, test, merge, release). Any other list needs definitions.
|
|
@@ -3684,7 +3788,7 @@ ahub builds the review brief that the workspace gate used to take from `ocr dele
|
|
|
3684
3788
|
|
|
3685
3789
|
## Claude peer instances I3 amendment (#450)
|
|
3686
3790
|
|
|
3687
|
-
-
|
|
3791
|
+
- Superseded by A2b `instances.mode` and explicit role policy (MCP shape grants no instance admission): a declared instance of a channel-plugin kind (Claude) was admitted when its declaration names `roles`, reviewer and/or planner only. `start_mode` and `worktree` are refused: the instance starts only from the person's terminal with `ahub claude --as <id>`, so the hub never starts, watches or owns writes for it, and it is neither startable nor reserved from external admission.
|
|
3688
3792
|
- The launcher sets the child's `AGENTHUB_PEER_ID` to the instance id; the channel plugin and the statusline tee already key on it. Launch, session and context state files stay `claude-launch.json`, `claude-session.json` and `claude-context.json` for the builtin and become `<base>.<id>.json` for an instance (`src/hub/claude-state.ts`). Account usage stays shared. The daemon's context and usage readers, the permission-launch check, the facts handler, terminal recovery (project root, no worktree), the upgrade blocker check and `ahub reset` read each instance's own files.
|
|
3689
3793
|
- The Claude version probe stays on the builtin peer (ponytail: instances are reviewers started by hand); zero-turn detection reads each peer's own evidence, as below.
|
|
3690
3794
|
- Status, which the console and dashboard read, lists each declared instance right after its kind. `ahub <kind> --as <id>` starts only an instance the running daemon bound at startup (status `activeInstances`); otherwise it asks for a restart or an upgrade before any effect.
|
|
@@ -3883,3 +3987,95 @@ The P1 host introduces additive `native_hook_launch` and `native_facts` control
|
|
|
3883
3987
|
The collected T0 proves the plugin, hook codec and read transport, not a native prompt override. P1 therefore keeps all runtime modes unmanaged and refuses unattended/headless/resume selectors until those individual mappings are proved. The old daemon refuses the additive launch request rather than silently weakening hook identity. An actual project TUI launch requires a running daemon with this feature; source/fixture verification does not claim that live rollout.
|
|
3884
3988
|
|
|
3885
3989
|
Version line (#589, owner decision 2026-10-20): agy updates itself, so the launcher accepts the 1.4.x line instead of exactly 1.4.2. 1.4.2 launches silently; another 1.4.x patch launches with one stderr warning naming the observed version and the 1.4.2 receipt; any other version, unparseable output or a failing `--version` is refused before a hub connection or plugin write. A T0 re-run on a newer patch is a separate follow-up.
|
|
3990
|
+
|
|
3991
|
+
|
|
3992
|
+
## Amendment: no-write owner advisories (#498)
|
|
3993
|
+
|
|
3994
|
+
- A completed native owner turn on an accepted `in_progress` `implement` or `bulk_edit` task counts only when its snapshot diff is known empty, HEAD and shared local/remote branch refs (`refs/heads/*`, `refs/remotes/*`) are known unchanged, and it has no task-tool effect. `task_sweep.no_writes_turns` is a live nonnegative safe integer, default 2; 0 disables it independently of the disabled-by-default time sweep. A change, successful mutation (including accept with a plan), pending or uncertain mutation, or unknown capture breaks the streak. Read-only tools do not reset it. Owner/acceptance changes start a new generation. Counters are run-local; structured threshold stalls persist through the existing stall store and deduplicate notices per cause. The planner notice names the public task title and consecutive count.
|
|
3995
|
+
- Done remains advisory. For writing classes only, the review request adds the exact line `no writes recorded since acceptance` when there are no branch refs, review heads (`refs.commit`, `sdlc.head`, `sdlc.localHead`) or recorded PR, no owner touches for this task since the first acceptance after its current ownership boundary, and a proven empty diff from that acceptance snapshot to now. Canonical-root D2 evidence is unknown when recorded elsewhere hints or the current worktree scope cannot exclude work elsewhere. Re-acceptance to revise a plan preserves this D2 baseline and earlier touches; D1 still fences each turn against the latest acceptance. The host records the resulting boolean on the done history entry; models cannot supply it. Other classes are exempt. Existing privacy screening and review authority remain unchanged.
|
|
3996
|
+
- The first explicit acceptance/self-claim of the ownership span captures its baseline through the guarded host `ownerAccepted` callback; later re-acceptance cannot move it. An acceptance manufactured by done has no pre-work baseline and leaves D2 unknown; it adds no capture ahead of the existing review projection. Acceptance and done snapshots use the existing hardened snapshot machinery and shared 250 ms burst budget. Declared instances require their current execution adapter/root binding; canonical-checkout dirtiness cannot substitute for an instance's evidence. Unknown, disabled, private, missing/pruned or restart-lost captures never become empty evidence. Native writing-turn boundaries hash shared branch refs with one budgeted `for-each-ref` probe, without exposing names. HEAD or any shared branch-ref movement is progress, including commit-only turns in ignored worktrees. A canonical-root turn with recorded branch/commit, `.worktrees` paths or SDLC PR/head evidence remains unknown when its visible tree/refs are empty; a canonical tree cannot disprove work elsewhere. Even without recorded hints, negative canonical evidence additionally requires a bounded `git worktree list --porcelain -z` proof of a sole worktree at both boundaries and no ignored `.worktrees` directory. Uncommitted/detached work elsewhere therefore remains unknown before its first ref movement. The shadow repository compares its own private Git directory as the registered bare main-worktree path, preserving the same metadata validation and unknown-on-failure rules. Builtin-owner D1 is deliberately inert while `.worktrees` exists; the upgrade path is binding each owner to its actual execution worktree. Both probes cap output at 1 MiB and share the same snapshot deadline; no raw ref names or worktree paths escape. Check start/cancel, escalation and memory correction are task-tool effects alongside existing mutations; read-only check results are not. No snapshot is added during a private snapshot window; a PII notice, if trusted evidence is available, uses only `publicTitle`. Capturing private evidence and restoring acceptance baselines across daemon restarts remain outside this advisory.
|
|
3997
|
+
- Structured `no-writes` stalls feed the S9 grooming digest and status. S7 consumers receive additive `stalls.noWrites` and `stalls.doneWithoutWrites` counts from cost reporting over that report's existing bounded, public, repository/PR-scoped tasks; they are not a count of every board row. No model call, automatic reassignment, done gate or new write endpoint is added.
|
|
3998
|
+
|
|
3999
|
+
## Amendment: config-only ACP adapters, A3 (#451, #486)
|
|
4000
|
+
|
|
4001
|
+
A3 adds declarative ACP definitions. It does not add A4 module loading, executable
|
|
4002
|
+
callbacks or config-selected imports. `adapters.<kind>` is accepted only from a
|
|
4003
|
+
Git-confirmed untracked `.agenthub/config.local.json`; the entire declaration is
|
|
4004
|
+
machine-local authority, not just its command and arguments. A tracked local file
|
|
4005
|
+
or a shared `config.json` cannot introduce one. Validate plain own-data objects
|
|
4006
|
+
and bounded arrays before constructing definitions. Unknown fields, accessors,
|
|
4007
|
+
inherited authority and collisions with builtin or reserved identities refuse.
|
|
4008
|
+
|
|
4009
|
+
Each declaration names `transport: "acp"`, `command`, optional `args`,
|
|
4010
|
+
`displayName` and `roles`, with optional `identity: { name, version }`,
|
|
4011
|
+
`permission` (hub-mode to native-mode mapping) and `readOnly` (native mode id).
|
|
4012
|
+
Adapter role defaults cannot appoint a conductor; a person can still select one through explicit project role policy and its existing authority checks. Other kind-meaning capabilities remain builtin-only. A project captures one
|
|
4013
|
+
immutable catalog at startup; declared kinds and their explicitly declared
|
|
4014
|
+
instances resolve through that catalog, never a mutable global registry. Adapter
|
|
4015
|
+
changes, including removal and their derived defaults, require a restart.
|
|
4016
|
+
|
|
4017
|
+
Configured kinds are optional, cloud and headless-only, off roster by default.
|
|
4018
|
+
They do not change default routing or inherit another kind's identity, quota,
|
|
4019
|
+
context parser or privileged capability. A configured kind may join the roster
|
|
4020
|
+
through the existing person-controlled path. Roles, exact nominations and
|
|
4021
|
+
reservations, family independence, instance execution-root admission and PII
|
|
4022
|
+
refusal use the same host routing rules as builtin definitions. Kind preferences
|
|
4023
|
+
may expand to declared instances; an explicit instance or canonical id remains
|
|
4024
|
+
exact. Absence of a permission map means unmanaged native policy. Absence of a
|
|
4025
|
+
budget block exempts the registered kind from quota accounting; it is not a zero
|
|
4026
|
+
reading, while unknown external ids retain existing manual accounting.
|
|
4027
|
+
|
|
4028
|
+
The identity pin is optional in the declaration schema so an unverified adapter
|
|
4029
|
+
can be described, but a start without it refuses before a prompt. Initialize must
|
|
4030
|
+
return the pinned agentInfo name and version. A resumed `session/load` must echo
|
|
4031
|
+
the requested sessionId; a missing or different echo refuses before a prompt.
|
|
4032
|
+
No implicit fresh-session fallback repairs an identity failure. Explicit session selectors must be nonblank, bounded and control-free. A configured start in progress refuses another start rather than joining its result; an attached peer accepts an already-running result only for the same requested native session (or no selector). Config argv that
|
|
4033
|
+
selects a leader or attaches to another native process is refused at load.
|
|
4034
|
+
|
|
4035
|
+
Owned-process admission has a deliberately bounded proof. The pinned native
|
|
4036
|
+
foreground contract must be supported by a T0 receipt; the spawned pid, original
|
|
4037
|
+
process group and process signature must have positive current evidence before
|
|
4038
|
+
admission and before stop. Unknown ownership refuses. Stop signals only that
|
|
4039
|
+
original verified owned group, never a pre-existing leader or any process outside
|
|
4040
|
+
it. ACP provides no generic kernel-bound responder attestation, and A3 adds no
|
|
4041
|
+
protocol extension pretending to provide one. A native agent that delegates its
|
|
4042
|
+
responses to an unowned process is unsupported by this boundary.
|
|
4043
|
+
|
|
4044
|
+
The Grok proof target is the config-only `grok agent stdio` command, with no
|
|
4045
|
+
leader or attach flags and with explicit `--no-leader`. Config load refuses a Grok kind, Grok executable or Grok native-identity pin without that standalone opt-out before argv termination; valued forms such as `--no-leader=false` also refuse. Native `--leader` and `--leader-socket` remain refused even alongside the opt-out. This is necessary because the native default inherits `[cli] use_leader` from ambient config. Its T0 must record that default and run under isolated HOME and Grok home in a
|
|
4046
|
+
scratch project, preserve the person's config bytes, record the pinned build's
|
|
4047
|
+
process tree, and inspect sockets/IPC while a prompt runs for links to processes
|
|
4048
|
+
outside the owned group. It must separately record initialize identity, load echo,
|
|
4049
|
+
native mode support or absence, usage unknowns and an actual hub tool receipt.
|
|
4050
|
+
If in-process service and the no-external-IPC boundary cannot be established,
|
|
4051
|
+
Grok remains explicitly unsupported; the generic ACP path may still ship with a
|
|
4052
|
+
fake ACP transport receipt. This amendment describes the implementation contract,
|
|
4053
|
+
not completed Grok live verification. Fixture results are not a native T0 receipt.
|
|
4054
|
+
|
|
4055
|
+
The optional definition `readOnly` capability names a native mode; it does not
|
|
4056
|
+
select that mode for every instance. An instance selects it explicitly with
|
|
4057
|
+
`readOnly: true`. Admission requires the native mode to be advertised and its
|
|
4058
|
+
selection acknowledged before a prompt, plus the host's read-only kind/tool gate
|
|
4059
|
+
and MCP mutation refusal. The selection is non-raisable: runtime and stored
|
|
4060
|
+
permission changes cannot lift it. A missing mode, failed acknowledgement or
|
|
4061
|
+
unknown policy refuses rather than falling back to an ordinary permission mode.
|
|
4062
|
+
Mapped ordinary modes likewise require advertised native support and an
|
|
4063
|
+
acknowledged selection; no map remains unmanaged and grants no hub sandbox claim.
|
|
4064
|
+
|
|
4065
|
+
Configured ACP crash resume reads only a bounded, control-free session id and requires exact session/load echo; it never imports a model override from old launch metadata. Controlled recovery remains explicitly refused for configured ACP because no terminal/recovery driver has been verified. Recovery source and target capability checks require `configured_acp` before reinterpreting configured identities or taking recovery effects. The initial Grok 1.0.62 isolated receipt found no initialize agentInfo and a refused session/new, so it does not establish native readiness; see `docs/verification/2026-10-21-grok-config-acp-t0.md`.
|
|
4066
|
+
|
|
4067
|
+
MCP publication appends project start targets only from authenticated daemon catalog metadata, preserving the builtin default enum. Read-only instances publish only the R2 read/review tool set; every mutation remains independently refused at the host boundary. Incomplete catalog metadata withholds configured start targets. If active lifecycle metadata is unavailable, tool discovery may retain the ordinary list until current status arrives; the host still independently refuses read-only mutations, and discovery never grants authority. A malformed generic session/new identity refuses before admission, and failed spawns are released only on positive no-process/empty-group evidence.
|
|
4068
|
+
|
|
4069
|
+
Task/conductor MCP refusals retain their existing error text and also set the optional `isError: true` result flag, so SDK consumers observe an unsuccessful tool call instead of an ordinary text result.
|
|
4070
|
+
|
|
4071
|
+
Configured ACP permission requests never use hub-tool titles for automatic approval. Requests use the ordinary person approval path unless the explicit permission-mode policy authorizes them, even when a title spells a known hub tool; builtin Kimi/Qwen title handling stays confined to those verified contracts. Owned-group identity across exec is the live child plus PID, parent, process group and start time; command/comm changes are evidence, not a new owner. Group teardown deliberately freezes, re-verifies and kills the original group; unreadable re-verification sends no further signal and retains the owner for an explicit retry.
|
|
4072
|
+
|
|
4073
|
+
## Adding an AI tool guide and adapter definitions (#451 A5)
|
|
4074
|
+
|
|
4075
|
+
- Human-oriented guide `docs/adding-an-ai-tool.md` documents today's builtin Adapter API 1 path (`AdapterDefinition` in `src/adapters/registry-types.ts` and `src/adapters/registry.ts`), covering:
|
|
4076
|
+
- Architecture and core independence: one frozen definition per kind; the core daemon, tasks, and routing inspect definition fields rather than hard-coded vendor name comparisons.
|
|
4077
|
+
- Transport selection: `acp` (stdio JSON-RPC), `codex-appserver`, `claude-channel`, `ws-pull` (pull-only workspace MCP plugin), and `hub-native`.
|
|
4078
|
+
- Conformance kit (`test/conformance/`): enrollment invariants, delivery occupancy, watchdog expiry, process-group teardown, and explicit reasons in `UNSUPPORTED` (per kind) and `UNSUPPORTED_LEGS` (per ACP leg).
|
|
4079
|
+
- Review and verification checklist: T0 receipt, path protection (`AGENT_CONFIG_SEGMENTS`), PII safety (`trust.onPrem`), process isolation, and documentation freshness.
|
|
4080
|
+
- Config-only generic ACP adapters (#451 A3, board task #217) follow the A3 amendment above, including its isolated native-proof boundary. External adapter modules (#451 A4, board task #135) remain planned; their hash-pinning and module trust rules land with A4.
|
|
4081
|
+
- `docs/agent-notes/adapters.md` keeps only the per-adapter rules that bind code, pointing to `docs/adding-an-ai-tool.md` and `src/adapters/registry-types.ts` for conceptual architecture and definitions.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# 0.12.43 release verification
|
|
2
|
+
|
|
3
|
+
This record covers release preparation and source review. It does not claim publication, installation, a running-hub restart or a live TUI launch.
|
|
4
|
+
|
|
5
|
+
## Candidate
|
|
6
|
+
|
|
7
|
+
Version 0.12.43, control protocol 16 (unchanged; no control message added), from merged main. The person directed on 2026-10-21 to finish the open PRs, merge and ship.
|
|
8
|
+
|
|
9
|
+
- Hot paths under HEAD movement (#576, PR #608): snapshot Git calls in one burst share a 250 ms budget, an exhausted or failed boundary is unknown, concurrent-edit notices go once per affected task, and HEAD moves are classified from the HEAD reflog so incoming checkouts, merges and fast-forwards are excluded while a peer's own commits, amends, rebase replays and cherry-picks stay attributed. Scratch burst: `status` 21.3 s -> 0.27 s, false conflicts 144 -> 0, CPU 13 s -> 0.37 s.
|
|
10
|
+
- Restore mapping retry (#599, PR #600), named-owner refusal (#601, PR #602), `ahub completion` (#603, PR #604), agy read facts for 1.4.2 and 1.4.3 (#555, PR #605), agy 1.4.3 T0 receipt with 1.4.3 kept unverified (#267, PR #606), console Peers WIP column and `w` (PR #615) and the Tasks backlog view and row actions (PR #620) (#532), manager open stops a losing spawn (#584, PR #614).
|
|
11
|
+
- Contributor gate: per-PR CI concurrency groups and `scripts/check.sh --changed` with a pinned test environment (#609, #610, PR #611); two timing-dependent tests fixed (#617, #618, PR #619); live PII screen calibration recorded (#198, PRs #613 and #616).
|
|
12
|
+
- Still open: the agy TUI first-turn tools gap (#607), the #612 attribution-cost follow-ups, #428 (a facts test that fails in a full Linux container run), and every live leg listed in [the 0.12.40 record](2026-10-20-0.12.40.md).
|
|
13
|
+
|
|
14
|
+
## Reviews
|
|
15
|
+
|
|
16
|
+
| PR | Final head | Review | CI |
|
|
17
|
+
| --- | --- | --- | --- |
|
|
18
|
+
| #600 (#599) | 729ec0b6 | Reviewer read of both paths; terminal-recovery tests 27/0 run by the reviewer. codex-connector: no findings | exact head, success |
|
|
19
|
+
| #602 (#601) | da3cf17b | Author self-review plus two codex-connector findings (self-claim note, enforce-mode refusal) fixed and answered | exact head, success |
|
|
20
|
+
| #604 (#603) | 40795529 | Three codex-connector findings (fish empty word, placeholder values, positional subcommands) fixed and answered; live fish and bash checks | exact head, success |
|
|
21
|
+
| #605 (#555) | b07e7f02 | Reviewer read; changes requested once for agy 1.4.3 `read_file`; connector P1 on ranged reads answered; agy tests 16/0 | exact head, success |
|
|
22
|
+
| #606 (#267) | 2ddcc915 | Reviewer read of the receipt; reference fix requested and applied | exact head, success |
|
|
23
|
+
| #608 (#576) | 4e6adb6e | Three review rounds, each with an independent read-only reviewer probing real git 2.56 reflog forms; R3 no Important finding; follow-ups in #612 | exact head, success |
|
|
24
|
+
| #611 (#609, #610) | 9af81d4b | Author review; first head was an invalid workflow (`queue: max` with `cancel-in-progress`), fixed; two connector findings on `--changed` fixed | exact head, success |
|
|
25
|
+
| #613 (#198) | 994d02cc | Docs only. A connector thread on the mutable model alias was answered after merge and fixed in #616 | exact head, success |
|
|
26
|
+
| #614 (#584) | b330ad32 | Reviewer codex approved; merger read the manager change | exact head, success |
|
|
27
|
+
| #615 (#532) | 0fb5c8c8 | Reviewer read; one change request (declared-instance WIP keys) fixed; `--changed` 463/0 and a full Linux exact-commit gate green except #428 | exact head, success (one rerun of the #618 flake) |
|
|
28
|
+
| #616 (#198) | 200adb70 | Served-model recording; connector finding on the probe cache fixed and answered | exact head, success |
|
|
29
|
+
| #620 (#532) | 42272f93 | Reviewer read: row actions bound to id and planning/flow revision, rechecked at Enter and y, no new write path; 37 new tests. codex-connector: no findings | exact head, success |
|
|
30
|
+
| #619 (#617, #618) | 534d9ebf | Reviewer read; macOS 20/20 and 100/100 reruns by the author | exact head, success |
|
|
31
|
+
|
|
32
|
+
## Document review
|
|
33
|
+
|
|
34
|
+
Thirteen documents were stale against the 0.12.42 stamps. Each was checked against `git log <stamp>..HEAD` over its paths by a read-only reviewer per group, and the edits were applied on the release branch. All thirteen are restamped to the release branch commit `53743efd`, which includes #616 and #620.
|
|
35
|
+
|
|
36
|
+
| Document | Result | Checked claims and correction |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| `README.md` | corrected | Status 0.12.43; agy read facts and 1.4.3 second-turn tools; console WIP limits; verification link. |
|
|
39
|
+
| `docs/quickstart.md` | corrected | Install pin `v0.12.43`; "Upgrading to 0.12.43"; plugin restart names 0.12.43; agy 1.4.3 second-turn note. |
|
|
40
|
+
| `docs/operations.md` | corrected | Version line, protocol 16 range, upgrade commands; restore mapping re-read (#599); unknown turn boundaries and reflog HEAD-move rules (#576); named-owner refusal (#601); agy read facts and 1.4.3 receipt (#555, #267); per-PR CI groups and `--changed` (#609, #610); per-instance WIP keys (#532). |
|
|
41
|
+
| `docs/security.md` | corrected | Snapshot budget (250 ms per burst, 10 s per call, unknown on exhaustion) (#576); a losing manager open stops its spawn (#584). |
|
|
42
|
+
| `src/cli/help.ts` | corrected | `task assign` says a peer that cannot take the task is refused with the reason (#601); `ahub completion` already listed; no other command, subcommand or flag changed. |
|
|
43
|
+
| `docs/agent-notes/daemon.md` | corrected | Settings editor bound to its opening panel incl. the Peers `w` shortcut (#532); console backlog row actions bound to id and revision (#532, PR #620); restore mapping re-read (#599); `openManager` keeps only the answering manager (#584). |
|
|
44
|
+
| `docs/agent-notes/adapters.md` | corrected | agy read decoding and Pre/PostToolUse facts (#555). |
|
|
45
|
+
| `docs/agent-notes/tests.md` | corrected | Captures yield an I/O turn when a test is not about the snapshot budget (#617). |
|
|
46
|
+
| `docs/agent-notes/README.md`, `benchmarks.md`, `budget.md`, `bus.md`, `tasks.md` | no change | Rules checked against the diffs (#601 and #608 rules already added in their PRs); no contradiction. |
|
|
47
|
+
|
|
48
|
+
## Release mechanics
|
|
49
|
+
|
|
50
|
+
Merge the release PR with a merge commit (the stamps name release-branch commits), run `node scripts/check-docs.mjs --require-fresh` on the merged main, then tag `v0.12.43`.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# 0.12.44 release verification
|
|
2
|
+
|
|
3
|
+
This record covers release preparation and source review. It does not claim publication, installation, a running-hub restart or a live TUI launch.
|
|
4
|
+
|
|
5
|
+
## Candidate
|
|
6
|
+
|
|
7
|
+
Version 0.12.44, control protocol 16 (unchanged), from merged main. The person directed on 2026-10-21 to finish the work in progress and release it.
|
|
8
|
+
|
|
9
|
+
- Config-only ACP adapters (#451 A3, PR #638): `adapters.<kind>` in an untracked `.agenthub/config.local.json` declares a headless, off-roster ACP kind with a pinned native identity, a strict `session/load` echo, owned process-group proof at start and stop, no title-based auto-approval, a required project catalog on every instance and roster resolver, and an explicit `--no-leader` for Grok. Grok 1.0.62 itself stays unsupported (no `initialize` agentInfo; T0 receipt in `2026-10-21-grok-config-acp-t0.md`). The CLI no longer stops `permission` and `settings` on an unreadable local config, and `settings undo` resolves configured keys (PR #642).
|
|
10
|
+
- Adapter definitions are the dispatch point for quota and context readers, admission and instance policy, with registry-driven conformance enrollment and a widened vendor-literal guard (#451 A2b, PRs #630 and #631); the "Adding an AI tool" guide (PR #633).
|
|
11
|
+
- agy no longer reads Claude's state files (#624, PR #627); the agy first-turn tools gap is documented and the init block updated (#607, PR #623).
|
|
12
|
+
- No-write owner advisories (#498, PRs #626 and #629), the headless watch pane (#286 AC10, PR #628), the Kimi admission release on an invalid `kimi_cmd` (#549, PR #622), the recovery lease log nits (#479, PR #632), the injected memory store alias (#237 follow-up, PR #640), and two macOS-only test flakes (#634, PR #639).
|
|
13
|
+
- Still open: #558 (a checks-runner test that fails on hosted macOS after an earlier `upstream reset`), the #230 S10 rulings and their implementation (spec PR #641, PRs #643 and #644, merged after this release), #612, and every live leg listed in [the 0.12.40 record](2026-10-20-0.12.40.md).
|
|
14
|
+
|
|
15
|
+
## Reviews
|
|
16
|
+
|
|
17
|
+
| PR | Final head | Review | CI |
|
|
18
|
+
| --- | --- | --- | --- |
|
|
19
|
+
| #622 (#549) | 356db622 | Board review before this release window (details in the PR) | exact head, success |
|
|
20
|
+
| #623 (#607) | 71ac68e9 | Author change; connector finding (profile templates) fixed and answered | exact head, success |
|
|
21
|
+
| #626 (#498) | 661183cc | Two rounds with independent read-only reviewers; R0 false-stall finding fixed; follow-ups in #279 | exact head, success |
|
|
22
|
+
| #627 (#624) | 44543a7e | OCR delegation review (no Important finding); two red-first daemon tests reproduce the field symptom | exact head, success |
|
|
23
|
+
| #628 (#286) | a0478105 | Reviewer read: fixed argv, no caller text, provider failure never fails the start | exact head, success |
|
|
24
|
+
| #629 (#498) | 507a4be2 | Reviewer read and affected tests 121/0; connector finding (case-insensitive `.worktrees` hint) fixed | exact head, success |
|
|
25
|
+
| #630 (#451) | b0be266f | Two independent read-only reviews (runtime; tests and guard) and 356 affected tests run by the reviewer; follow-ups in #280 | exact head, success |
|
|
26
|
+
| #631 (#451) | 5011c25d | Reviewer read and 525 affected tests; one macOS rerun of the #558 flake | exact head, success |
|
|
27
|
+
| #632 (#479) | 721c6514 | Reviewer read and 340 affected tests; one macOS rerun of the #558 flake | exact head, success |
|
|
28
|
+
| #633 (#451 A5) | 809b5264 | Two rounds: sections describing unshipped A3/A4 turned into planned notes; connector findings fixed | exact head, success |
|
|
29
|
+
| #638 (#451 A3) | d1d06f58 | Two rounds with independent trust-boundary and runtime reviews; title auto-approval, roster removal, optional-catalog fallback and exec ownership fixed; a surviving seed fixed (#283); a connector finding (empty permission map) fixed | exact head, success |
|
|
30
|
+
| #639 (#634) | 97feb6e0 | Reviewer read; connector finding (a gate that never opens) fixed | exact head, success |
|
|
31
|
+
| #640 (#237) | 1c080d15 | Codex review; a connector P1 (stale injected-store shard) fixed and re-read by the merger | exact head, success |
|
|
32
|
+
| #642 (#638 follow-up) | see release PR | Independent read-only review; its findings applied | exact head, success |
|
|
33
|
+
|
|
34
|
+
## Document review
|
|
35
|
+
|
|
36
|
+
Fourteen documents were stale against the 0.12.43 stamps. Each was checked against `git log <stamp>..HEAD` over its paths by read-only reviewers, in three passes (user docs, area notes, and the #638/#640 delta), and the edits were applied on the release branch. All fourteen are restamped to the release branch commit `e185b9e6`, which includes #642, and the notes' stamp paths gained the new sources they describe.
|
|
37
|
+
|
|
38
|
+
| Document | Result | Checked claims and correction |
|
|
39
|
+
| --- | --- | --- |
|
|
40
|
+
| `README.md` | corrected | Status 0.12.44; watch pane, no-write advisories, agy extra-instance refusal and config-only ACP adapters in the 0.12.44 summary; verification link. |
|
|
41
|
+
| `docs/quickstart.md` | corrected | Install pin `v0.12.44`; "Upgrading to 0.12.44" (init refresh, agy fix, watch pane, no-write notice, config-only ACP, `configured_acp` upgrade floor, stricter `peers.<id>`); plugin restart wording. |
|
|
42
|
+
| `docs/operations.md` | corrected | New "Configured ACP adapters" operator section; automatic watch pane; Qwen context unknown; agy extra-instance refusal. |
|
|
43
|
+
| `docs/security.md` | corrected | Watch pane under the fixed-words rule; configured ACP trust boundary; no title auto-approval for configured kinds; agy extra-instance refusal. |
|
|
44
|
+
| `src/cli/help.ts` | no change | The configured-kind usage row matches the CLI parser; no other command, subcommand or flag changed. |
|
|
45
|
+
| `docs/agent-notes/adapters.md` | corrected | Configured-kind roles, error withholding and CLI flags; no title auto-approval and the read-only kind filter; `AcpOwnedGroup` stop rules. |
|
|
46
|
+
| `docs/agent-notes/daemon.md` | corrected | `configured_acp` recovery floor; project adapter catalog binding and locked rows; configured ACP start rules; injected-store memory alias. |
|
|
47
|
+
| `docs/agent-notes/tasks.md` | corrected | Project catalog resolution; hub tool publication never authority; `no-writes.ts` in scope. |
|
|
48
|
+
| `docs/agent-notes/budget.md` | corrected | Declared reader dispatch; `Budget.report` resolves through the project catalog. |
|
|
49
|
+
| `docs/agent-notes/tests.md` | corrected | Conformance enrollment maps; gated fake actions; owned-group test ports. |
|
|
50
|
+
| `docs/agent-notes/README.md`, `benchmarks.md`, `bus.md`, `local-worker.md` | no change | Rules checked against the diffs; no contradiction. |
|
|
51
|
+
|
|
52
|
+
## Release mechanics
|
|
53
|
+
|
|
54
|
+
Merge the release PR with a merge commit (the stamps name release-branch commits), run `node scripts/check-docs.mjs --require-fresh` on the merged main, then tag `v0.12.44`.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Antigravity 1.4.3 T0 re-run (#267)
|
|
2
|
+
|
|
3
|
+
Status: the 1.4.2 P1 T0 receipt ([2026-10-19-agy-p1-t0.md](2026-10-19-agy-p1-t0.md)) was re-run on 2026-10-21 against `agy 1.4.3`. **1.4.3 is not marked verified.** Most observations match, but the native tool names and the model-facing `call_mcp_tool` schema changed, the unmodified 1.4.2 probes no longer reach the hub, and in the interactive TUI the plugin MCP server is attached lazily on the first prompt, so the first model turn has no hub tools. No code changed. The live TUI leg was done separately in #268 (see below).
|
|
4
|
+
|
|
5
|
+
## Environment and isolation
|
|
6
|
+
|
|
7
|
+
- Observed CLI version: `agy 1.4.3`.
|
|
8
|
+
- Executable SHA-256: `836c446f6118140e86679ec6966a785eeedbf56b3711a8eb1f41947483e9802a` (the person's `~/.local/bin/agy`, unchanged before and after).
|
|
9
|
+
- Bun 1.4.3 ran the probes. The 1.4.2 receipt used Bun 1.4.2, so the plugin MCP server and hook scripts also ran on a newer Bun. This is a second variable, not separated from the agy change.
|
|
10
|
+
- Probe scripts are copies of the 1.4.2 scripts (`actual-hub.ts`, `native-hooks.ts`, `workspace-plugin*.ts`), re-pointed at a clean worktree of main. The originals were not edited. Adapted variants (below) are separate copies.
|
|
11
|
+
- Same isolation as the receipt: a new temporary HOME with its own `.gemini`, workspace and temporary directory per run, an explicit environment, the Seatbelt profile from `src/local/sandbox.ts` denying the person's home except the executable, and a loopback Gemini protocol fixture. No real account or cloud model call is part of this receipt. The scratch hub had memory, inference, snapshots and auto-start disabled and explicit agy roster admission.
|
|
12
|
+
- SHA-256 of the person's Gemini CLI files (`antigravity-cli/settings.json`, `config/config.json`, `config/hooks.json`, `config/mcp_config.json`, `config/skills.json`, legacy `settings.json`) taken before the first run and after the last run are equal. The probes' own before/after hash (a subset) was equal on every completed run. The project's `.agents/` directory was not written; owned process groups were stopped and temporary roots removed.
|
|
13
|
+
- A first pass ran the unmodified `actual-hub.ts` with the agent scratch directory (under the person's home) as the temporary directory. It loaded no plugin hooks and made no MCP call. That run is not execution evidence and is not used below. All receipt runs use the per-user temporary directory, as the 1.4.2 run did.
|
|
14
|
+
- Real-HOME contact: the agent ran `agy --version` and `agy --help` (print and exit, no session, no plugin load) under the person's real HOME at about 03:49 and 04:01 KST before switching to a fresh HOME for every other call. The person's `~/.gemini/antigravity-cli/log/` has a `/usage` print-mode run from cwd `/` at 04:01:38 KST (`cli-20261021_040138.log`). It is one of a file series at a five minute cadence (`:01:38`, `:56:38`, `:51:38`, `:41:38` and so on), started by something outside these probes, none of which was a probe call: the probes only started agy with a temporary HOME and `--log-file` in a temporary directory.
|
|
15
|
+
- Raw bounded receipts and scripts remain in the local scratch workspace; they are not public artifacts.
|
|
16
|
+
|
|
17
|
+
## Per-item comparison with 1.4.2
|
|
18
|
+
|
|
19
|
+
| Item | 1.4.3 observation | vs 1.4.2 |
|
|
20
|
+
| --- | --- | --- |
|
|
21
|
+
| `--version` | prints `1.4.3`, exit 0 | same (new number) |
|
|
22
|
+
| `--help` flags | still advertises `--conversation`, `--continue`, `--dangerously-skip-permissions`, `--mode`, `--new-project`, `--input-format`/`--output-format` stream JSON; no `--new` | same for every listed flag. A full diff is not possible: the 1.4.2 binary is not retained |
|
|
23
|
+
| `--acp` refusal | exit 2, `flags provided but not defined: -acp`; no ACP subcommand in the list | same. Refusal of the tested flag only, as before |
|
|
24
|
+
| `--new` | exit 2, undefined flag | same |
|
|
25
|
+
| Workspace plugin discovery | `.agents/plugins/agent-hub/` is loaded without install or global write; server name `agent-hub_agent-hub`; the unprefixed name still fails with `tool ... is not enabled for server agent-hub`; `agy mcp list` still prints `No MCP servers configured.` | same |
|
|
26
|
+
| Plugin-local `hooks.json` | the six hooks run from `.agents/plugins/agent-hub/hooks.json` | same |
|
|
27
|
+
| Hook stdin shared fields | `conversationId`, `workspacePaths`, `transcriptPath`, `artifactDirectoryPath`, `modelName`; transcript `transcript_full.jsonl` | same |
|
|
28
|
+
| `PreInvocation`/`PostInvocation` fields | adds `initialNumSteps`, `invocationNum` | same |
|
|
29
|
+
| Tool hook stdin | `toolCall: { name, args }`, `stepIdx`; `PostToolUse` has empty `error` on success; tool hooks still need `matcher: ".*"` with a nested `hooks` array | same shape |
|
|
30
|
+
| Native read tool in the tool hook | `read_file` with `Path`, `StartLine`, `EndLine` | **changed** (1.4.2: `view_file` with `AbsolutePath`) |
|
|
31
|
+
| `injectSteps` | `SessionStart` and `PreInvocation` `ephemeralMessage` accepted and shown to the model | same |
|
|
32
|
+
| Pre-tool `{ "decision": "allow" }` | accepted for the tested calls | same (still no override proof) |
|
|
33
|
+
| `Stop` fields | `executionNum`, `terminationReason` (`NO_TOOL_CALL`), `error`, `fullyIdle` | same |
|
|
34
|
+
| `call_mcp_tool` arguments | `ServerName`, `ToolName`, `Arguments` only. `toolSummary` and `toolAction` are now rejected: `additional properties 'toolAction', 'toolSummary' not allowed` | **changed** (1.4.2 required both) |
|
|
35
|
+
| Model-facing tool declarations | 15 tools: `read_file`, `write_file`, `edit_file`, `search_web` replace `view_file`, `write_to_file`, `replace_file_content`, `read_url_content`. A call to `view_file` fails with `unknown tool` although the stream-JSON `init` event still lists 60 tools including `view_file` | **changed** (1.4.2: 16 tools) |
|
|
36
|
+
| `init` event | 60 tools, `permission_mode: request-review`; no name added or removed | same |
|
|
37
|
+
| Unmodified 1.4.2 probes | every call that used `toolSummary`/`toolAction` or `view_file` is rejected before execution. `native-hooks.ts`: no `PreToolUse`/`PostToolUse` rows, no `tools/call` at the fixture MCP. `actual-hub.ts`: the single `hub_inbox` call is rejected, nonce not seen by the provider | **changed** |
|
|
38
|
+
| Actual scratch-hub `hub_inbox` with nonce, probes adapted to the 1.4.3 schema | exit 0, empty stderr, `hub_inbox` called once through the shipped bundle and the workspace plugin, the random nonce held only in the scratch bus preface appeared in the following fixture-provider request, all six hooks ran from the plugin-local file, native output SHA-256 `f1970aa687f0661c23e0f84924f2ff603d5f1c9edf9f718cc5e435448c862f3c` | same outcome, but only after fixture adaptation |
|
|
39
|
+
|
|
40
|
+
Adaptation used for the passing 1.4.3 runs: drop `toolSummary` and `toolAction` from `call_mcp_tool` arguments, and use `read_file` with `Path` for the native read. Nothing else was changed in the fixtures.
|
|
41
|
+
|
|
42
|
+
## Late plugin MCP start: print mode versus the interactive TUI
|
|
43
|
+
|
|
44
|
+
The task owner saw hub tools missing on an early first turn of the person's own `ahub agy` TUI on 1.4.3 and present about ten minutes later in the same process. The isolated runs reproduce that as a startup-order effect, not a permanent failure. Times are seconds after spawn, taken from fixture timestamps (provider requests and the MCP fixture log), same Seatbelt profile and plugin files, fresh HOME each run:
|
|
45
|
+
|
|
46
|
+
- **Print mode (`-p`)**: the plugin MCP server is started during the first turn. The first provider request is the title generation (0 tools). The first agent request already carries 15 tools including `call_mcp_tool`, `list_resources` and `read_resource`, and the tool call succeeds.
|
|
47
|
+
- **Interactive TUI**: the plugin MCP server is not started at launch and not during the onboarding or idle time. In four runs (30 s, 13 s, 3 s and 3 s of idle after the trust prompt) it was started only when the first prompt was submitted: `server/discover`, `initialize` and `tools/list` ran in the same second as the first prompt. The first agent request after that prompt carried 12 tools and no `call_mcp_tool`. The next agent request carried 15 tools including `call_mcp_tool`, and every later request kept them. In the runs that sent prompts in quick succession that next request came 0.4 s to 1.7 s after the first prompt. A single-prompt run never made a second agent request, so whether the attach is driven by elapsed time or by the next request cannot be separated at this resolution. Waiting longer before the first prompt did not change the first request (30 s idle: still 12 tools).
|
|
48
|
+
- Consequence: on 1.4.3 the TUI attaches the plugin MCP server lazily on the first prompt, and the first model turn has no hub tools. A prompt that needs a hub tool on that turn fails. The tools are available from the following turn. The roughly ten minute delay seen in the person's session is longer than anything measured here and is not explained (the person's HOME also loads a global MCP server and global hooks, which the isolated HOME does not). In the isolated runs a second prompt had the tools within two seconds.
|
|
49
|
+
- Plugin hooks fire in the TUI from `SessionStart`, including `PreToolUse` and `PostToolUse` for the MCP call.
|
|
50
|
+
- The agy log prints `hooks_manager ... loaded 0 named hooks from 0 hooks.json file(s)` in both modes while the plugin hooks run, and print mode adds a line for the plugin file. The line is not a reliable signal of plugin hook loading.
|
|
51
|
+
- A fresh HOME makes the TUI stop at onboarding (theme, terms, workspace trust). The runs answered those with key presses (Enter, Down, Right, Enter, Enter).
|
|
52
|
+
- **Not established: whether 1.4.2 behaved the same.** The 1.4.2 receipt never observed the TUI and no 1.4.2 binary is retained anywhere on this machine, so time-to-tools cannot be measured there. This is a 1.4.3 mode difference, not a proven 1.4.2 to 1.4.3 regression.
|
|
53
|
+
|
|
54
|
+
## Consequences
|
|
55
|
+
|
|
56
|
+
- `agyVersionGate` is not changed: 1.4.3 keeps the one-line stderr warning and is not added to the verified set.
|
|
57
|
+
- `src/adapters/agy/hooks.ts` classifies a native read only when `toolCall.name === "view_file"` and `args.AbsolutePath` is a string. On 1.4.3 the native read is `read_file` with `Path`, so the decoder passes the call through as an unclassified tool and no `Read` fact is attributed. This is a follow-up for a separate task. It was not changed here because the task forbids code changes when anything differs.
|
|
58
|
+
- Any hub-side prompt or fixture that tells the model to call `call_mcp_tool` with `toolSummary`/`toolAction` is invalid on 1.4.3.
|
|
59
|
+
- The launcher's plugin namespace assumption (`agent-hub_agent-hub`) still holds.
|
|
60
|
+
- Do not rely on `hub_*` tools on the first TUI turn of a 1.4.3 session. A launcher or preface that needs the hub on turn one has to wait for the second turn (or the person submits any first prompt). The live TUI leg (#268, agy's own TUI on hub 0.12.42 and agy 1.4.3, which superseded the cancelled #251) passed `hub_inbox`, 42 hub tools, a `hub_send` round trip and a board read from the second turn on, and also had no hub tools on its first turn, as the timing above explains. The close-cleanup check is still open.
|
|
61
|
+
|
|
62
|
+
## Unchanged limits
|
|
63
|
+
|
|
64
|
+
- Permission prompt mappings, `allow` versus native approval prompts, Stop continuation and post-invocation termination overrides remain unverified. Keep the peer unmanaged.
|
|
65
|
+
- Not a sandbox claim for the proposed agy peer. Documentation alone is not native proof.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Grok config-only ACP T0, 2026-10-21
|
|
2
|
+
|
|
3
|
+
This receipt separates the generic ACP implementation from native Grok readiness. It does not establish #486 AC1-AC6 or #451 AC3 as complete.
|
|
4
|
+
|
|
5
|
+
## Observed native build and isolation
|
|
6
|
+
|
|
7
|
+
- Local native binary reports `grok 1.0.62 (1474f9cbdd91)`.
|
|
8
|
+
- Version, agent help and stdio help exited 0 under a temporary HOME, Grok home, XDG config/cache/data directories and project directory outside a Git repository.
|
|
9
|
+
- The protocol probe used `grok agent --no-leader stdio`, with inherited agent markers removed and a probe-specific peer identity. The probe harness copied no personal config or credential files and wrote only to its isolated directories; no production hub was used. The exact native-file check below is bounded, and broader native credential state remains unverified.
|
|
10
|
+
- The saved agent help states that the leader default is `[cli] use_leader` in `config.toml`, rather than a guaranteed foreground default; `--no-leader` forces a new agent. A plain `grok agent stdio` argv therefore does not itself establish foreground ownership in an ambient home. `--leader-socket` is also an attach selector. The config compiler therefore requires explicit standalone `--no-leader` for recognized Grok declarations before any process starts, and still refuses `--leader` and `--leader-socket`; isolated HOME alone is not substituted for the opt-out.
|
|
11
|
+
- Before/after SHA-256 values of the exact real Grok `config.toml` and `version.json` matched. The additionally checked `config.json`, `settings.json` and `mcp.json` were absent before and after. This bounded check is not a claim about every native configuration path.
|
|
12
|
+
|
|
13
|
+
## Protocol result
|
|
14
|
+
|
|
15
|
+
- Initialize replied and advertised `loadSession: true`, image/audio prompt support false, embedded context true, HTTP/SSE MCP support and session list/resume/close capabilities.
|
|
16
|
+
- Initialize did not provide `agentInfo`. The config-only adapter requires the observed native name/version pin to match initialize before creating a session or prompting. The native build therefore has no usable runtime identity pin under this contract.
|
|
17
|
+
- The separate raw protocol probe attempted `session/new` in the isolated project with an empty MCP server list. It received an RPC error. Its raw error payload was neither logged nor published; the cause remains unclassified.
|
|
18
|
+
- No model prompt or native MCP tool ran. Session/load echo, session/set_mode, usage/occupancy and a real hub-tool result are unverified. Advertising load or MCP support is not proof of those operations.
|
|
19
|
+
- Because no prompt ran, no process-tree and socket/IPC observation while a prompt was active exists. The required no-detached-leader evidence is unverified.
|
|
20
|
+
|
|
21
|
+
## Owned group and teardown
|
|
22
|
+
|
|
23
|
+
- The runtime ownership helper positively verified the direct child, its original process group and shared process signature at start and immediately before teardown.
|
|
24
|
+
- The first probe's teardown returned `unconfirmed`. A fresh process-table read after the probe exited showed no Grok process. This is not recorded as a confirmed stop receipt.
|
|
25
|
+
- A post-SIGKILL defunct-row observation edge was fixed and covered by deterministic regression tests: after the last signal, wait for the original group to disappear within the bound, tolerating command/parent changes of a dying row while preserving PID/start/group identity. Pre-signal ownership checks remain strict, and no process outside the spawned group is signalled.
|
|
26
|
+
- A second isolated probe with the same native build again lacked initialize identity and had session/new refused. With the corrected observation fence, start and pre-stop group checks passed, group disappearance was confirmed, and a separate fresh process-table read found no Grok process. The exact real-config hashes again matched. This confirms teardown for this refused attempt, not foreground behavior during a model prompt.
|
|
27
|
+
|
|
28
|
+
## Readiness decision
|
|
29
|
+
|
|
30
|
+
Grok remains unsupported by this receipt. The generic config-only ACP path is covered independently with the repository's fake ACP transport, including identity mismatch, load-echo refusal, owned-group checks, permission ACKs, read-only ceilings, task delivery and project isolation. Native Grok admission still needs a build with matching initialize identity plus successful isolated session creation, actual hub-tool execution, load-echo evidence and foreground tree/IPC proof during a prompt. No permission, quota, sandbox, planner or reviewer claim is inferred from these observations.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# PII screen calibration (issue #198), 2026-10-20
|
|
2
|
+
|
|
3
|
+
- Screen: campus gateway, model coding
|
|
4
|
+
- Served model (as the gateway reported it): qwen3.8-flash-next
|
|
5
|
+
- Fixtures: 78 synthetic items (38 positives, 40 hard negatives), test/fixtures/pii-screen.json
|
|
6
|
+
- Recall (pii labels only): 100.0%; bound 90.0%, fixed before measuring: met
|
|
7
|
+
- Recall as handled (pii or unknown): 100.0%
|
|
8
|
+
- Precision (pii labels): 100.0%
|
|
9
|
+
- Unknown rate: 0.0%
|
|
10
|
+
- Hard negatives held as PII (pii or unknown): 0.0%
|
|
11
|
+
- Category agreement on true positives: 100.0%
|
|
12
|
+
- Latency: p50 246 ms, p95 301 ms, max 869 ms
|
|
13
|
+
- Missed positives: none
|
|
14
|
+
- Negatives not cleared: none
|