review: M6a subagents

This commit is contained in:
2026-10-03 20:26:49 -07:00
parent 1afa7397dc
commit 9f252c30ed
3 changed files with 45 additions and 3 deletions
+38
View File
@@ -1152,3 +1152,41 @@ the prefix.
The listing in the job prompt was the `bxctl memory tiers` text (loopd does not special-case
tiering). A leftover `started` for `job-tier-20261004t0145` is from `* * * * *` firing the next
minute; the stack was stopped there. No Mattermost.
### M6a, tasks 01 to 05 — reviewed 2026-10-03 by the design model (Grok 4.6)
Accepted. No product finding. Ornith-1.5-35B-A3B through `tools/run-plan.sh` on straylight, branch
`m6a`. The branch differs from the reference (`~/boxmaker-refs/m6a-ref.bundle`, `87c3fa7`) only in
`crates/loopd/src/subagent.rs`: unused `Dispatch` import dropped, types written as `bxcore::…` /
`crate::tools::…`, a doc comment on `RUNBOOK`, rustfmt wrapping. Same behaviour. Log rows are the
other delta. Spec 7 device check on straylight is not in this review; it is next.
| Check | Result |
|---|---|
| 5 done task commits, each with `Co-Authored-By: ornith-1.5-35b-a3b <agent@wntrmute.dev>` | pass (plus the plan commit `25278b4`) |
| Given tests byte-identical to `docs/plans/M6a/files/` (the runbook fragment is appended into `docs/runbook.md`) | pass |
| Protected files (`docs/design.md`, `docs/decisions.md`, `docs/inference-contract.md`, `docs/specs/`, `docs/plans/`, `AGENTS.md`, `CLAUDE.md`) untouched by Ornith | pass |
| Log rows | 5 `done`, newest first, first-gate pass, one gate each, deviations none. Rows match the diffs. |
| No `unwrap`, `expect`, `panic!`, `#[allow]` or `unsafe` in new library code; every source file ≤ 500 lines; no new crate | pass |
| `make gate` on this host (rustc 1.98.1 / clippy 0.1.98) | `gate: ok`, 1590 tests, the plan's count |
| Independent review of `git diff 25278b4 HEAD -- crates docs/runbook.md` against spec sections 3, 5, 6, 7 (M6a) and 8 | `subagent` is not core; `call_tool` does not send it to the port; overflow names `subagent-id` before hold; child uses `slots.background` and the time line; speaker `None`; thinking is not in the summary; `task` is capped; nested `sub-sub-…` returns through the middle `ToolResult`; a child that ends on a tool call is `failed`; heartbeat and cron skip while any `sub-*` is held; missing `sub-*` state inherits via `raise`; a plain `chat-*` read still creates nothing. |
No numbered product finding. Spec 3.3's five-level background order is still SlotGate FIFO plus the
two scheduler skips (heartbeat after due, cron after heartbeat returns), the same shape as M5d-2.
A tool-output summary already waiting on the gate can still run before a child that starts waiting
later. `holds_prefix("sub-")` is any held id starting `sub-`, including a live `--session sub-foo`
turn. `run` rebuilds `sub-<parent>-<n>` instead of calling `child_id`. None of those is a miss
against the tasks; they match the reference.
Device check, spec 7 for M6a, is not in this review. It needs straylight, slot 0 live / slot 2
background, slot 1 left busy, a private `$HOME`, and production daemons untouched: a `bxctl`
session calls `subagent` with a short task; the child log is on slot 2; the parent's next turn has
`cache_n` near its previous total. Spec 7's taint-copy case (untrusted parent, child's identity
`add` lands in `notes.md`) is the same setup.
What was good: five tasks, five first-gate passes, no stops, given tests unedited, every
review-focus case in the plan is covered by a given test and holds, `subagent-id` has a pointer
and a runbook entry, no new crate.
Known M6a limits, left as the README lists them: no Mattermost delivery of the child's log; one
background slot (nested children serialise); `brokerd` does not see the spawn; `consult` is M6b.