From db5ee820f2caa82fa844d4af8f07670b2307e316 Mon Sep 17 00:00:00 2001 From: Kyle Isom Date: Sat, 3 Oct 2026 20:38:54 -0700 Subject: [PATCH] docs: M6a device check on straylight Spec 7: subagent child on slot 2; parent's next turn cache_n 1787 of 1788. Private $HOME, production untouched. Co-Authored-By: Grok 4.6 --- CLAUDE.md | 5 +++-- docs/implementer-lessons.md | 6 ++++++ docs/implementer-log.md | 26 ++++++++++++++++++++------ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 72186f2..58434df 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -41,8 +41,9 @@ promoted only a trusted note). M6 (subagents and cloud consult) is approved (`docs/specs/2026-10-04-m6-subagents-consult.md`). M6a (`subagent` tool, isolated child on `slots.background`, scheduler skip, `brokerd` taint inherit; spec `docs/specs/2026-10-04-m6-subagents-consult.md` sections 3, 5, 6, 7 M6a and 8; plan -`docs/plans/M6a/`) is done on branch `m6a`, reviewed in `docs/implementer-log.md`; no finding -is open; spec 7 device check on straylight is next. M6b (consult) is later. +`docs/plans/M6a/`) is done, reviewed in `docs/implementer-log.md`; no finding is open; spec 7 +device-checked on straylight (child `sub-m6a-live-2` on slot 2; following slot-0 turn `cache_n` +1787 of 1788). M6b (consult) is later. P22 (proposed, not applied) makes Boxmaker a fleet of independent agents, one per host, deployed with Nix in a last milestone, M8; `flake.nix` builds every binary, the tool image and a dev shell. Work happens on titan (macOS, no Nix); build and run diff --git a/docs/implementer-lessons.md b/docs/implementer-lessons.md index 50487ab..33a5524 100644 --- a/docs/implementer-lessons.md +++ b/docs/implementer-lessons.md @@ -188,3 +188,9 @@ passed spec 7: heartbeat on slot 2, then a following slot-0 turn with `cache_n` `jobs/tier.toml` promoted only the trusted note. A long idle gap after the first live turn lost the prefix (unified pool / other occupancy), which is P9, not a mixed-slot bug. `every_s = 20` with `last_heartbeat` at tick start re-fired immediately after a long pulse. + +M6a was Ornith through the driver, five tasks, first-gate pass in every row, no stop. The only +code difference from the reference is cosmetic in `subagent.rs`. Device check passed spec 7: +child `sub-m6a-live-2` on slot 2, then a following slot-0 turn with `cache_n` 1787 of 1788. The +same-turn continuation after a busy-slot wait on 2 lost the prefix (`CacheLoss` 0 of 1672), +which is P9; the immediate next turn held it. diff --git a/docs/implementer-log.md b/docs/implementer-log.md index 3e848e6..f40eb07 100644 --- a/docs/implementer-log.md +++ b/docs/implementer-log.md @@ -1159,7 +1159,7 @@ Accepted. No product finding. Ornith-1.5-35B-A3B through `tools/run-plan.sh` on `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. +other delta. Spec 7 device check on straylight passed (below). | Check | Result | |---|---| @@ -1178,11 +1178,25 @@ later. `holds_prefix("sub-")` is any held id starting `sub-`, including a live ` turn. `run` rebuilds `sub--` 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. +Device check, 2026-10-04 UTC, on straylight (`target/debug` of `m6a` at `9f252c3`; Ornith slot 0 +live, slot 2 background; a private `$HOME` at `/home/kyle/boxmaker-m6a-check`, production daemons +untouched, no `gatewayd`). Empty `grants/` (spawn is not a grant; no `[runner]`). Heartbeat +`every_s = 0`. `bxctl chat --session m6a-live --no-thinking`: find_tool then call_tool `subagent` +with task "Reply with exactly the single word PING"; then an immediate following turn "PONG". + +At the first live turn, slot 2 was processing ~108k (`[waiting: slot busy]`); the parent's +same-turn continuation after the child's `ToolResult` logged `CacheLoss` 0 of 1672 (P9). The +following turn, sent immediately, held the prefix. Requests used `id_slot` 0 and 2 only. + +| Check | Result | +|---|---| +| Child log on the background slot | `sessions/sub-m6a-live-2/0.jsonl` `SessionStart.slot` is 2; user line is the time line then the task; assistant `PING`; `Usage` `cache_n` 0, `prompt_n` 1412, `predicted_n` 23 | +| Parent's next turn `cache_n` near previous total | `m6a-live` after the child: `cache_n` 0, `prompt_n` 1698, `predicted_n` 90, `CacheLoss` 0 of 1672; turn 2: `cache_n` 1787, `prompt_n` 26 (expected 1788). Slot 0. | +| Parent result names the child | `ToolResult` call 2: `sub-m6a-live-2 completed` then `PING` | + +Taint-copy (untrusted parent, child's identity `add` lands in `notes.md`) was not re-run on the +device; task 05's given tests already cover inherit, including a missing middle parent. No +Mattermost. The stack was stopped after turn 2. 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