## Row 131 round 2 review (Filbert): approve Candidate: manifest sha256 `466c835f7dce79d20c7ab74c197a52b70e7fdeb0efae0456222dc6d0a633f219` (14 paths, now including organization.mjs), base 0bdd573ff, packet agents/dewey/work/queue-131/r2/ in 80797a539. Rebuild: a fresh worktree at 0bdd573ff with the r2 build.patch applied. Every manifest hash matched, the packet manifest matched and `git diff --check` was clean. The added lines have no dash, curly-quote or control characters. No commit from 0bdd573ff to HEAD touches a candidate path. ### Round 1 findings | Finding | Status | How I checked | |---|---|---| | F1 setter publishes a non-JSON value | Fixed (F1a and F1b) | I reran my round 1 probe on the candidate. `set()` refuses a `Date`, a `Map` and an object with a non-null custom prototype, each with `invalid-plugins`. A document with a `Date` in `plugins` and another in `vars`, sent straight to `writer.write`, throws BusinessError. File bytes unchanged and no changes.jsonl. | | F2 I/O errors reject `load()` unlogged | Fixed | I reran my round 1 probe: with `limit-check` at chmod 000, `load()` resolves with one refusal `[limit-check, cap, unreadable, kept [cap]]`, `log` runs once and usage-source switches to the new list. `fsCall` wraps the lstat and both realpath calls. | | Doc-only: top-level code runs before the export checks | Done | packages/plugins/README.md:105 | | Note: no unmutated control | Done | MUTANTS.md Control: six test sets on the unmutated candidate, all exit 0, 0 skipped. | The writer change (F1b) also closes the same hole for launch-settings, which I flagged as unchecked in round 1. My `vars` Date case goes through the same writer path. Keeping the in-memory validate before `JSON.stringify` is right: a BigInt or circular value still gets a coded refusal. I agree that `changes(old, written)` can't be told apart from `changes(old, document)` for a document that passes both validations, so no mutant is needed for it. Mutant 47 covers the check that refuses. organization.mjs is row 122's writer. Its consumers pass as single files on the candidate: bus limits, cli limits, cli launch-limits and webui settings-write (see below). ### Notes (non-blocking) - A writer refusal from the parsed-bytes check is a BusinessError with no `code`, the same as the writer's existing validation refusals. The setter's own refusals are coded, so ruling 2 holds for the setter. ### What I ran and what I took from receipts **I ran**, as single files with TMPDIR set and Docker disabled, all at 0 failures and 0 skipped: | Test file | Result | |---|---| | plugins kinds | 5/5 | | plugins loader (the chmod tests ran) | 16/16 | | business plugin-settings | 4/4 | | business business | 15/15 | | business launch-settings | 8/8 | | bus limits | 3/3 | | cli limits | 3/3 | | cli launch-limits | 1/1 | | webui settings-write | 3/3 | I also reran the F1 and F2 probes above. **From Dewey's receipts, not rerun by me:** - the targeted gate: plugins 21, business 92, bus 171, webui 112 and cli 195, all at 0 failures and 0 skipped (591 total). The five gate/ logs agree. - 47 of 47 mutants killed. mutants/results.json has 47 entries, all KILLED, including 43 to 47 for this round. The six control runs are in mutants/control.json. I took no slot. Sage's full gate at the landing target is still to come.