Review M2b: accept with one follow-up task; record lessons

All ten tasks pass the checklist, the gate, the audit and the device
checks, including a four-turn conversation with a loopd restart and no
cache loss. Reading and probing found four low defects: the busy guard
is released before the final frame on the main path but not on the
three error paths, its Drop skips a poisoned lock, an unreadable
core.md is treated as missing, and bxctl's interactive loop exits on a
failed turn. Task 11 carries the fixes with two new tests, checked
against a fixed copy of the branch.

The Model column is filled in (all Ornith) and one malformed row is
repaired. Two rules are promoted to AGENTS.md.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-09-18 20:47:03 -07:00
co-authored by Claude Fable 5.1
parent 34951084cc
commit 2be8581a0c
8 changed files with 218 additions and 18 deletions
+3 -2
View File
@@ -158,8 +158,9 @@ Events for one turn arrive in order on one connection. Nothing else is promised.
(from config, `[channel] socket`) with mode 0600; accepts connections, one thread each. The M2a
`Client` is shared in an `Arc`; its slot gate serialises requests per slot. A registry of
per-session locks makes a concurrent `turn` on a busy session answer `session_busy` at once; the
lock is released before the final frame is sent, so a channel that sends its next turn on reading
that frame is never refused. A stale socket file is removed before the self-test runs, so clients
lock is released before the final frame is sent, whichever frame that is (`turn_done`, the turn's
error, or the error for a session that cannot be opened or created), so a channel that sends its
next turn on reading that frame is never refused. A stale socket file is removed before the self-test runs, so clients
see "not running" rather than "connection refused" during startup.
Nothing is held in memory that is not also on disk, except the locks and the `call` counters.