diff --git a/CLAUDE.md b/CLAUDE.md index e5e9111..8ea9946 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -35,8 +35,9 @@ straylight against rift; no finding is open. M5d (scheduler and compaction, spec `docs/specs/2026-10-03-m5d-scheduler.md`) is split: M5d-1 (epochs and compaction) is done, reviewed in `docs/implementer-log.md` and checked on straylight (spec 7); no finding is open. M5d-2 (heartbeat, cron, ToolSummary, live-slot isolation) is done on branch `m5d2`, reviewed in -`docs/implementer-log.md`; finding 1 closed by task 11. The spec 7 device check on straylight is -not yet run. +`docs/implementer-log.md`; finding 1 closed by task 11; spec 7 device-checked on straylight +(heartbeat on slot 2 left a following slot-0 turn's `cache_n` at 1398 of 1399; `jobs/tier.toml` +promoted only a trusted note). 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 0b787ec..51fc8c0 100644 --- a/docs/implementer-lessons.md +++ b/docs/implementer-lessons.md @@ -184,4 +184,7 @@ no commit twice (context exceeded: whole implementer log, then crate exploration after T62/T63. Tasks 07 to 10 then ended cleanly. Finding 1 (`last_heartbeat` only on Ok) was closed by task 11 (I20, T64): first-gate pass, H1 as quoted. Clippy first-gate on 05 and 06, USAGE indent on 10, an extra gate on 04 (I18), and a duplicated 03 log row (I19). Device check -not yet run. +passed spec 7: heartbeat on slot 2, then a following slot-0 turn with `cache_n` 1398 of 1399; +`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. diff --git a/docs/implementer-log.md b/docs/implementer-log.md index 4610b70..b8d889d 100644 --- a/docs/implementer-log.md +++ b/docs/implementer-log.md @@ -1126,4 +1126,24 @@ test is byte-identical to `docs/plans/M5d2/files/`. Trailer | Log row | 1 `done`, first gate pass, under the header | | `make gate` | `gate: ok`, 1575 tests | -The spec 7 device check on straylight is still next. +Device check, 2026-10-04 UTC, on straylight (`target/debug` of `m5d2` at `338df82`; Ornith slot 0 +live, slot 2 background; slot 1 left busy; a private `$HOME` at `/home/kyle/boxmaker-m5d2-check`, +production daemons untouched, no `gatewayd`). Empty `grants/` (memory tools are built-in; no +`[runner]`). `[compact] threshold` stayed 0.85. Heartbeat answers stayed in `sessions/heartbeat/`. + +A first live session (`m5d2-live`) lost its prefix (`cache_n` 0 of 1398) after a long idle gap: +`every_s = 20` plus `last_heartbeat` stamped at tick start made the standing session pulse +repeatedly (11 usages) while slot 1 held ~70k of the unified pool. A tight retry (`m5d2-live3`) +while a heartbeat turn ran on slot 2 then a following main-slot turn immediately afterwards held +the prefix. + +| Check | Result | +|---|---| +| Heartbeat on the background slot | `sessions/heartbeat/0.jsonl` `SessionStart.slot` is 2; first pulse at 01:41:25Z with the time line and `heartbeat.md` | +| Following main-slot turn `cache_n` near previous total | `m5d2-live3` turn 1: `cache_n` 0, `prompt_n` 1377, `predicted_n` 22 on slot 0; turn 2: `cache_n` 1398, `prompt_n` 24 (expected 1399). No `CacheLoss`. Slot 1 stayed busy. | +| `jobs/tier.toml` promotes only a trusted note | Job `job-tier-20261004t0144` on slot 2; `memory` `add` `file=memory` of the amber-kettle line; `memory.md` holds only that fact; `bxctl memory log` `2026-10-04-0001` `add` `memory.md` | +| Journal has the edit; untrusted note is still a note | `memory/edits/2026-10.jsonl` id `2026-10-04-0001`, `untrusted` false, `after` the kettle line; notes.md still has the pewter-spoon entry marked untrusted | + +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.