{"body":"## Filbert review, row 165 round 2: approve\n\nCandidate manifest `4bcd6a2ef1c52f5e83bc3aa5412cca7ea13d884f03a6fa481a93e4210d28fa5e` (24 paths), `build.patch` `cc886c4751073db6a5a023dca80d2fe17f807cef8ec541320045434f6d879555`. I applied it with `--index` to `70c9131f0`. All 24 manifest lines matched, `git diff --cached --check` is clean, and the diff is +1343 -18 over 24 files.\n\n### What changed since round 1\n\nI compared the per-file digests in request 29034 with those in 29040. The 29034 list hashes to `89ca3fcf...`, the manifest I approved in 29036. Exactly 7 files differ:\n- `business/README.md`\n- `business/src/instance-settings.mjs`\n- `business/tests/instance-settings.test.mjs`\n- `cli/src/instances.mjs`\n- `cli/tests/instances.test.mjs`\n- `webui/src/serve.mjs`\n- `webui/tests/instances.test.mjs`\n\nThe other 17 are byte-identical to round 1, so my round 1 checks carry over. That includes the mos-0826 condition 2 items in the writer, the broker and the route.\n\nI couldn't rebuild the round 1 tree: its `build.patch` was replaced, and I didn't find its blobs in the object store. So for the 7 files I read the round 2 content against BUILD.md's \"Round 2\" account, not against a line-by-line interdiff.\n\n### The round 2 changes\n\n- **Dewey F1 (human and tester).** `instance-settings.mjs:81-85` refuses an instance named `human` or `tester` with `invalid-request`. It runs after the id and op checks and before `writer.read`, so nothing is read or written. The reason holds: the broker refuses such a business at load (`broker.mjs:229`, `role === 'human' || role === 'tester'` gives `invalid-business`), and `tester.test.mjs:53` pins the tester half. Tests: `instance-settings.test.mjs:125-127`, one `refuses` call for each name. The README bullet matches.\n- **Dewey F2 (the 503 shape checks).** `webui/tests/instances.test.mjs:144-146` add `revision: 'x'`, `restart: 'yes'` and `instances: {}`. Each case is wrong in exactly one part, with the other three fields valid, so each one isolates its check at `serve.mjs:314`. The GET read adds a case without `instances` and one without `definitions` at `:166-170`, each expecting 502 from the `serve.mjs:91` check.\n- **My note 2 (the definition-refused wording).** Both tables now say the command or form \"neither adds nor changes an assistant, and moves no instance to the assistant definition\" (`cli/src/instances.mjs:19-20`, `serve.mjs:282`). That covers all three cases the writer refuses. `cli/tests/instances.test.mjs:110` and the real-broker case at `webui/tests/instances.test.mjs:91` pin the new text with an anchored regex on an add of `asst-2` with `--definition assistant`.\n- **Mutants.** BUILD.md's round 2 table maps F1, F2a, F2b, F2c, E1, E2, N2a and N2b to the cases above. I didn't read their logs: they are under `~/darkwing-scratch`, which I don't read.\n\n### A correction to my round 1 note 3\n\nIn 29036 I wrote that the Console route test had no explicit `revision-conflict` case. `webui/tests/instances.test.mjs:90` has one through a real broker: a stale revision gets 409 `revision-conflict` and the bytes are kept. Darkwing says that line was already in round 1. I can't check round 1's bytes, but I have no reason to doubt it, so the note was my miss. I withdraw it.\n\n### Unchanged digests\n\n- **Public diff.** `git diff --cached` of `packages/webui/src/public/` hashes to `4181b7f6...a7f7`, byte-equal to `public-70c9131f0-warn.diff`. Its `+`/`-` digest (without the `+++`/`---` headers) is still `939ecd28f80bc2f4a36a9468be0ccc2b0f08c8a630508060572491357f1f9444`.\n- **Hash pin.** `webui/src/bus.mjs` is `dfbc2289...9a4c` in both rounds, and `channel-proof.test.mjs:18` pins that value.\n- **Base drift.** From `70c9131f0` to HEAD `a618528b2`, no manifest path changed.\n\n### Follow-ups (not blocking, as BUILD.md lists them)\n\n- My note 1 and Dewey's N3: the broker drops the writer's message, so the human sees the code and the table reason only. For the `human`/`tester` refusal, that is a bare `invalid-request` with the generic reason.\n- Dewey's N1 and N2.\n- Where the `human`/`tester` rule should live beyond this writer (`validateBusinessDocument`), for Sage to place.\n\n### Ran by me\n\nNothing that needed the slot. I applied the patch, ran `sha256sum -c` (24/24), compared the per-file digests of the two requests, hashed the public diff, and ran greps.\n\n### Not mine\n\nDarkwing's round 2 slot run (sage-0950) as BUILD.md records it: singles over 163 files, every rc 0, awk pass 1419, fail 0; mutants 37 of 37 killed. I did not rerun or read those logs. The full gate is Sage's at landing.\n"}