Candidate db463a7b…ab89 (5 files) on 277d1fa21. Adds the note-2 test for a thread
decision raised before row 121; mutants 6 of 6 killed after fixing the test to
supersede an open decision (first run left M6 alive, recorded). Owner's gate exit 0;
gate.sh now sets COMPOSE_PROJECT_NAME=dewey-r136 and removes its network at exit.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
3.5 KiB
Row 136 (#1630) mutants
One mutant per new check, plus one for the role check that the run check used to back up.
mutants.py applies each to packages/bus/src/broker.mjs in ~/dewey-scratch/r136/wt and runs
approval-binding, single-use and broker tests (33 tests). It restores the file afterwards, and
the run ended with restored True.
There is no separate control step in the harness. The control is the single-file runs on the unmutated candidate before it, all 0 fail: approval-binding 5, single-use 12, broker 16.
Round 1
Run 2026-10-15T22:23:02Z to 22:23:12Z, on e37d6e583. Its logs and console were in the round 1
packet, commit 8e2c5c2d0; round 2's run replaced them here.
| Mutant | Fault | Result | Killed by |
|---|---|---|---|
| M1-authority-thread | #checkAuthority drops #raisedThread(d) !== s.thread |
KILLED, 1 of 33 failed | approval-binding: a thread approval is consumed only by a run holding the same thread |
| M2-supersede-role | supersede drops old.raised_by_role !== s.role |
KILLED, 1 of 33 failed | approval-binding: a later run of the same instance supersedes an open decision; another instance cannot |
| M3-supersede-thread | supersede drops #raisedThread(old) !== s.thread |
KILLED, 1 of 33 failed | approval-binding: a thread decision is superseded only from the same thread |
| M4-authority-role | #checkAuthority drops d.raised_by_role !== s.role |
KILLED, 1 of 33 failed | approval-binding: another instance of the same definition cannot consume an approval |
Round 2
On base 277d1fa21 with the round 2 candidate. The same harness runs the same three files, now 34
tests, with M5 and M6 added for Filbert's note 2. Each mutant's target string occurs exactly
once in the rebased broker.mjs (the harness asserts it).
First run, 2026-10-15T23:44:24Z to 23:44:40Z (mutants-run-first.log): M6 survived. The pre-121
test superseded the approved decision, and #closed refuses that before the thread matters. I
changed the test to supersede an open pre-121 decision (BUILD.md, round 2). approval-binding then
passed 6/6 unmutated.
Rerun, 2026-10-15T23:45:09Z to 23:45:24Z (mutants-run.log, logs in mutants/): 6 of 6 killed,
restored True.
| Mutant | Fault | Killed by (approval-binding) |
|---|---|---|
| M1-authority-thread | #checkAuthority drops #raisedThread(d) !== s.thread |
a thread approval is consumed only by a run holding the same thread; the pre-121 test |
| M2-supersede-role | supersede drops old.raised_by_role !== s.role |
a later run of the same instance supersedes an open decision; another instance cannot |
| M3-supersede-thread | supersede drops #raisedThread(old) !== s.thread |
a thread decision is superseded only from the same thread; the pre-121 test |
| M4-authority-role | #checkAuthority drops d.raised_by_role !== s.role |
another instance of the same definition cannot consume an approval |
| M5-authority-null-any-thread | #checkAuthority reads a null raised thread as the run's thread | the pre-121 test |
| M6-supersede-null-any-thread | supersede reads a null raised thread as the run's thread | the pre-121 test |
Round 1 notes
M4's check is not new. Before this row the run check also refused another instance, so the role check had no test of its own. Now it is the only thing between coder2 and coder's approval, so I added the mutant to show a test holds it.
Single use needs no new check. #consumeAuthority already refuses decision-consumed once an
action.allowed row exists for the decision, whichever run wrote it. The restart test and the
single-use test cover it across runs.