Record the second review of task 23 and the findings first left out

The review table gains findings 16 to 20, which the two review agents
reported and the first write-up dropped. The independent review of the fix
commits, and what was changed for it, is recorded; task 23's claims about
its tests are corrected. The spec and decisions record the day-long cap, the
ttl_ms bound, the socket-directory rule and the listener's retry.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-22 21:54:28 -07:00
co-authored by Claude Opus 5.5
parent fc8befaf5b
commit f0b39a4766
4 changed files with 39 additions and 7 deletions
+9 -3
View File
@@ -98,7 +98,7 @@ broker = "/var/lib/boxmaker/run/loop-broker/broker.sock"
admin = "/var/lib/boxmaker/run/owner-broker/admin.sock"
[approvals]
ttl_ms = 900000 # 15 min
ttl_ms = 900000 # 15 min; 1 to 86400000 (a day), else a config error
```
A socket path that is absent or empty means the default under `home`, as in `loopd`.
@@ -553,7 +553,10 @@ Nothing is truncated, rewritten or deleted, ever.
`brokerd` creates each directory if it is missing and sets its mode to 0700 whether it made it or
found it (a failure to do so is a startup error), removes a stale socket file, binds, and sets the
socket to 0600. All of this comes after the audit lock is taken (section 5, "Startup"): the lock
socket to 0600. It refuses a socket whose directory is `/` or a symbolic link, since the mode
change would land on `/` or on the link's target (added after the M3a review). Once serving, a
listener that runs out of file descriptors or memory pauses and retries; any other `accept`
failure stops `brokerd` (`see docs/runbook.md#brokerd-listener-lost`). All of this comes after the audit lock is taken (section 5, "Startup"): the lock
is what proves the socket file is stale and not another `brokerd`'s.
Any other message kind on a socket is answered with `error` `forbidden`, and the connection is
@@ -692,7 +695,10 @@ processes, output size) are M3b's.
`fn call(&self, req: &ToolRequest, on_pending: &mut dyn FnMut(&Pending)) -> ToolResponse`.
`BrokerPort` waits for the first frame until `[broker] timeout_ms` (default 120,000) after the
call began, and after a pending frame until the frame's `expires` plus `timeout_ms`, which
leaves a call approved at the last moment the same time to run as any other. These are
leaves a call approved at the last moment the same time to run as any other. The wait before
that `timeout_ms` is never more than a day (`MAX_PENDING_WAIT`), whatever `expires` says, and
`brokerd` refuses a `ttl_ms` over a day, so the two agree (added after the M3a review: a far
`expires` parked a turn for ever). These are
deadlines, not per-read socket timeouts: a peer that trickles bytes must not hold a turn for
ever. (Unlike the inference path's liveness rule, this is a total limit.) M3b must keep its tool
time limit under `timeout_ms`. If the socket cannot be reached, closes early or times out, the