diff --git a/docs/plans/2026-09-26_lead-decisions.md b/docs/plans/2026-09-26_lead-decisions.md index c62c69d09..2a32cf771 100644 --- a/docs/plans/2026-09-26_lead-decisions.md +++ b/docs/plans/2026-09-26_lead-decisions.md @@ -2838,3 +2838,22 @@ which stay with him. Each item names who decided it and what happened. owned. The harness suite was already in the gate. - The brief is re-pinned to the edited section, with the old section byte-identical at 51085ddd and HEAD before the edit. + +127. **Row 90 round 2 adds row 92's sandbox file (2026-10-12).** Decision + 125's rebase changed two files. Dewey's gate on the rebase failed cli + (8) and seat (4): row 92 (57948a81) landed between the two bases, and + its bwrap sandbox binds only `RUNNER_FILES`. Row 90's `broker.mjs` + imports `packages/tasks/src/requirements.mjs`, which the runner then + loads through `client.mjs`, so every sandboxed role session would have + died at the next bus restart. No row 90 path changed, so the path + drift check couldn't see it. + - Round 2 is 21 paths. `packages/seat/src/sandbox.mjs` gains the one + `RUNNER_FILES` line. `requirements.json` stays out of the sandbox: + only `loadRequirements()` reads it, from the Broker constructor and + `verbs(ctx)`, and the runner calls neither. The seat test still + holds the list equal to the import walk. + - The full gate on a rebased candidate is what caught this, so it + stays required. A path drift check is not enough when a row in + between changed what a file's imports are allowed to load. + - Harness runs on the 21-path candidate in Filbert's review and in + Sage's landing gate, not in a separate Dewey slot.