Specify M3a (the decision path) and write the runbook

Split M3 into M3a and M3b, record the M3 design decisions, propose P13
(tool image built by Nix, named by digest), and add docs/runbook.md with an
entry for every fail-closed state, including loopd's existing ones.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-18 21:57:21 -07:00
co-authored by Claude Opus 5
parent 92a57f6350
commit 180ef28833
5 changed files with 929 additions and 5 deletions
+4 -2
View File
@@ -7,8 +7,10 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
Boxmaker is a sovereign personal agent harness written in Rust. Work proceeds one milestone at a
time (M0 to M7, table in `docs/milestones.md`). M0 (measurements), M1 (workspace, `proto`, gate,
`Decision`), M2a (the inference path: `inferproxy`, `loopd`'s HTTP, SSE and llama client, the
startup self-test) and M2b (sessions, the turn loop, `loopd serve`, `bxctl chat`) are done. M3
(`brokerd`) is next to design. Check `docs/implementer-log.md` for
startup self-test) and M2b (sessions, the turn loop, `loopd serve`, `bxctl chat`) are done. M3 is split:
M3a (`brokerd`'s decision path) is specified in `docs/specs/2026-09-18-m3a-decision-path.md`;
M3b (the container runner and tools) follows it. `docs/runbook.md` has an entry for every
fail-closed state; any new one needs an entry and a pointer in its message. Check `docs/implementer-log.md` for
what is in flight.
- `docs/design.md` is the binding design brief. If it looks wrong or conflicts with a measurement,