Unclaimed files left in the canonical checkout. Inventory: canonical-cleanup-inventory.md (commit-as-evidence groups). detect-secrets scan clean on 2026-11-02: hits are sha256 pins, git object ids, test sentinels already in tracked tests and unit-file lines.
1 line
7.1 KiB
JSON
1 line
7.1 KiB
JSON
{"body":"## Filbert review, row 170 round 1: approve\n\nCandidate manifest `401bb0b7174419a39ea37ee6c1c3eb892e2b32c298cba8b0627ee3355cd693b9` (6 paths), `build.patch` `0f4f1b0baaa0173c94125c17222f6a6cae39ef5c2d2332b2a1ae74685aabf3fd`, which equals `git diff 000730949 0b6ff260f`. I applied it with `--index` to `000730949`. All 6 manifest lines match, `git diff --cached --check` is clean, and the diff is +123 -16. I read it against the brief anchor \"Brief: a tester message to a role nobody runs is refused, not queued\" (blob `70e49393`, mos-0854) and BUILD.md.\n\n### Bus\n\n- `broker.mjs:1855`: `if (s.tester && !this.#recipient(s.business, to, thread)) fail('tester-target-not-running')`. It sits right after `#threadFor` (:1850) and before the `INSERT INTO messages`, so a refusal writes no message, delivery or notice. Everything before it in `message.send` is a read: `#named`, the tester key, role and prefix checks, `#checkMessaging`, the class and `in_reply_to` lookups. `#decision` and `#checkBlock` don't apply, since the tester's `keys` call refuses `decision` and `#checkBlock` refuses a tester sender.\n- `#recipient` (:305-308) returns a holder only when `op === 'claim'`, so a launched but unclaimed run counts as no holder, as the brief asks.\n- A tester can only address a key in `b.roles` (:1803), so `human` and `tester` targets, which no run holds, can't hit the new refusal.\n- Human and agent sends don't pass the `s.tester` gate, so they are unchanged.\n- The `#waiting` comment (:2491-2500) now says the tester case can't reach it with no holder. The `sender !== 'tester'` term stays, unreachable, as BUILD.md says. That matches the brief, which changes only the comment.\n\n### CLI\n\n- `cli.mjs:384-388`: the branch needs both `e.code === \"tester-target-not-running\"` and `parsed.flags.has(\"--tester\")`, and throws the brief's exact string with exit 3. It sits after the `thread-required` branch, and `--thread` with `--tester` is refused earlier (:359), so the `to` it prints is the role. `transport.mjs` is untouched, and its pin at `channel-proof.test.mjs:13` still holds.\n- The `!w.told` line and its comment are gone from `waitingLines`, and no test or doc still has the old \"tells nobody to launch it\" text (grep of `packages` and `docs/TOOLS.md`).\n- README :130-131 points `--tester` to its paragraph, and that paragraph (:171-175) gives the code, the printed line, exit 3 and the launched-unclaimed case. `docs/TOOLS.md` is unchanged, and its tester lines (:431-433) cover only the switch.\n\n### The five tests\n\n1. bus `tester.test.mjs`, \"...refuses tester-target-not-running and stores nothing\": counts of messages, deliveries and `_bus` notices are equal before and after, with notices at 0. It also shows the prefix check still runs first.\n2. \"...refused while the run is only launched, and routes once it claims\": `bindLaunch` without a claim refuses with counts unchanged. After `role.claim` the send has no `waiting`, one `routed` delivery to `cto-run`, and cto receives it.\n3. \"a human message to a role no run holds still waits and tells launch.by\": with `launch.by: pm` and pm claimed, the human's send to cto stores, returns `waiting` `{told: true, launcherRunning: true, launchable: true}`, and writes exactly one notice to pm in reply to it. Its first step is a tester refusal, which is why M1 fails it too.\n4. cli `tester.test.mjs`, \"talk --tester to a stopped role exits 3, prints no sent line and stores nothing\": exit 3, the exact message, empty stdout, zero messages, and one tester call. It replaces the row 146 test at :130-136.\n5. \"only a --tester send refused tester-target-not-running is rewritten\": stand-in tester transports refusing `tester-off`, `tester-required`, `tester-refused` and `unknown-role` keep their code and message, and a human `talk` whose stand-in refuses `tester-target-not-running` keeps the bus error. A dropped `--tester` term fails the human case, and a branch that rewrote every code fails the loop.\n\n### The two adapted existing tests\n\n- `launch-notice.test.mjs:190-195`: the tester send to the stopped pm now asserts the refusal and an unchanged message count. The title change says so, and the tester send to the claimed coder after it is unchanged. That's the same claim with the new outcome, not a weaker one.\n- bus `tester.test.mjs`, the tester-cli runtime test: pm gets a launch record with `pid: process.pid` and `startTime: '1'`. The ancestor check in `tester.mjs:58` needs both pid and start time to match, so `'1'` keeps this process from looking like a managed run, and the `under` runtime later in the test still uses the real start time for the refusal case. The new first step proves the refusal through the real shim (`status 2`, which is the EXIT map's default for an unlisted code), and pm claims before the send that must succeed.\n\n### Other checks\n\n- **Other tester sends.** Besides the files BUILD.md lists, `bindTester`, `--tester` or `testerTransport` appear in cli `mark-read`, `other-tree`, `thread-cli` and seat `sandbox.test.mjs`. thread-cli uses `--tester` only in a usage refusal, and sandbox sends only `agents`. Dewey's bus and cli suite run covers the rest. I didn't run anything.\n- **Hash pins.** The only 64-hex pins near these paths are `channel-proof.test.mjs:11-13` on `human.mjs`, `human-cli.mjs` and `transport.mjs`. None is a manifest path.\n- **Path readers.** `project-runtime.test.mjs:13` reads `broker.mjs` (no import changed) and `host.test.mjs:826` reads the cli README for the unit file name (text unchanged).\n- **Base drift.** From `000730949` to HEAD `e0bf9960d`, no manifest path changed, and `build.patch` passes `git apply --cached --check` on HEAD in a temporary index.\n\n### Notes (not blocking)\n\n1. **Thread instances.** The refusal also covers a tester message that `#threadFor` puts in a thread (a reply up a thread's chain) when no run holds that thread. Before, `#waiting` returned null for it and the message was stored for row 121's launcher. The brief's rule has no thread exception, and a PM test authorizes nothing, so I read this as intended. No test covers that case, and the brief doesn't ask for one.\n2. **BUILD.md's pin line.** \"Path readers\" says the only pin is `channel-proof.test.mjs:12` on `human-cli.mjs`. The block at :11-13 also pins `human.mjs` and `transport.mjs`. This is packet text only.\n3. **Item 5 and exit codes.** The test checks code and message but not `exitCode`. The CLI rethrows the same error object, so a matching message means the exit is unchanged too.\n\n### Ran by me\n\nStatic only, no slot: the worktree build, `sha256sum -c` (6/6), `--check`, the `build.patch` digest against `git diff 000730949 0b6ff260f`, the reads above, the greps and the HEAD apply check. I ran no test and no mutant.\n\n### Not mine\n\nDewey's run on the sage-1025 slot (18:34:29Z to 18:37:12Z), as BUILD.md records it:\n- five files singly: 74/74 (bus tester 14, launch-notice 8, cli tester 8, project-runtime 3, host 41);\n- suites: bus 423/423, cli 345/345;\n- mutants: 2 killed, M1 failing items 1 to 4 and the tester-cli runtime test, M2 failing item 4;\n- `scripts/test-*.sh` not run. The full gate is Sage's.\n"} |