Files

7.0 KiB

Filbert review, row 170 round 1: approve

Candidate 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.

Bus

  • 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.
  • #recipient (:305-308) returns a holder only when op === 'claim', so a launched but unclaimed run counts as no holder, as the brief asks.
  • 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.
  • Human and agent sends don't pass the s.tester gate, so they are unchanged.
  • 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.

CLI

  • 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.
  • 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).
  • 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.

The five tests

  1. 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.
  2. "...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.
  3. "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.
  4. 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.
  5. "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.

The two adapted existing tests

  • 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.
  • 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.

Other checks

  • 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.
  • 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.
  • 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).
  • 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.

Notes (not blocking)

  1. 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.
  2. 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.
  3. 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.

Ran by me

Static 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.

Not mine

Dewey's run on the sage-1025 slot (18:34:29Z to 18:37:12Z), as BUILD.md records it:

  • five files singly: 74/74 (bus tester 14, launch-notice 8, cli tester 8, project-runtime 3, host 41);
  • suites: bus 423/423, cli 345/345;
  • mutants: 2 killed, M1 failing items 1 to 4 and the tester-cli runtime test, M2 failing item 4;
  • scripts/test-*.sh not run. The full gate is Sage's.