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
@@ -1,7 +1,7 @@
# M2b implementation plan: the agent loop
> **For the implementing model:** do not work from this file. The owner gives you one task file at
> a time (`01-…` to `10-…`). This file is the index for the owner and the reviewer.
> a time (`01-…` to `11-…`). This file is the index for the owner and the reviewer.
**Goal:** `loopd serve` holds conversations: each turn's request extends the one before, sessions
live on disk and survive a restart, tool calls go through a port with limits on every kind of
@@ -25,7 +25,7 @@ M1 frame protocol. `bxctl chat` is a client of that protocol.
- Nothing is written to a session log until a completion is final. Nothing volatile is ever put
in a message or the baseline.
- Branch `m2b`. One task, one fresh OpenCode session, one commit. Run `cargo fmt --all` before the
gate. Review happens once, after task 10.
gate. Review happened once, after task 10; task 11 is its follow-up.
## Tasks
@@ -41,6 +41,7 @@ M1 frame protocol. `bxctl chat` is a client of that protocol.
| 08 | `08-loopd-serve.md` | `loopd serve` | `loopd/tests/serve.rs` |
| 09 | `09-bxctl-chat.md` | `bxctl chat` | `bxctl/tests/chat.rs` |
| 10 | `10-verify-device.md` | `make verify-device` extended; the first `config/system.md` | `loopd/tests/device.rs` |
| 11 | `11-review-fixes.md` | Review follow-up: busy release before every final frame, poison recovery, unreadable `core.md`, chat loop continues | updated `loopd/tests/baseline.rs`, `bxctl/tests/chat.rs` |
`files/` holds everything the tasks copy in. As in M2a, all of it was checked against a private
reference implementation: the gate passes after every task in order, the new suites pass under CPU