2.9 KiB
Row 97 (#1591) round 2: the board timer gets a positive control
Owner: Researcher. Reviewers: Darkwing and Filbert. Round 1 change request: Darkwing, comment 28083 (rev 865).
Base 6b0215aa (rebased from 3bd3f85c). Nothing under packages/webui changed between the two, so
the three candidate paths carry over; browser-edge.test.mjs is byte-identical to round 1.
build.patch is git diff 6b0215aa of the three paths (sha256
efe65504a1b890ae575b0d49ae3c00f09c9f229897ba61d2cac44e1e1b56bf19). candidate-manifest.sha256 has
repo-relative paths and verifies against the candidate worktree
/mnt/storage/scratch/researcher/q97 (checked after the runs). No source under src/ changes.
The finding
The stub filed a 10 s timer as 'board' only when f.name === 'refresh'. Test 1's three
boardPolls() === 0 checks had no positive control, so a board timer armed through an arrow
callback (the shape bus.js uses) was filed as 'bus' and the checks passed.
Both fixes, as Darkwing allowed
- Classification. The stub files a timer by the script that armed it:
new Error().stackmatched against/app.js, else 'bus'. The callback's shape no longer matters. - Positive control. Test 1 waits for
window.__polls.includes('board')once the toggle is on, so the zero checks sit between a proven armed timer and a proven absent one.
The README sentence says the timers are filed by the script that armed them and that one is armed once the toggle is on.
Mutants (mutants.py, outputs mut-base.txt, mut-candidate.txt)
Baseline = 6b0215aa unmodified (round 1's tests are not the baseline here; Darkwing's 13a was alive
on them).
| mutant | baseline | candidate |
|---|---|---|
| 13 schedule polls with the toggle off | ALIVE | killed |
13a Darkwing: 13 with setTimeout(() => refresh(), 10000) |
ALIVE | killed |
| 13b the arrow callback alone | ALIVE | ALIVE (equivalent: same behaviour) |
| 27 bus schedule polls signed out | ALIVE | killed |
| 12 refresh reads with the toggle off | killed | killed |
| 26 bus render without its signed-out guard | killed | killed |
| 19 toggle on reads nothing | STALLED (30 s) | killed (5.8 s) |
| 14 refresh without its signed-out guard | ALIVE | ALIVE (equivalent: api() already returns when signed out) |
Candidate 6 of 8, the two survivors equivalent; baseline 2 of 8. Sources restored byte for byte (sha256 checked at the end of both runs).
Suites
- webui
node --test tests/: 101 pass, 0 fail, on the realapp.jsandbus.js(suites.txt). - Not rerun: control-board and the
scripts/test-*.shsuites. Only webui test files and its README changed, and nothing outsidepackages/webuimoved between3bd3f85cand6b0215aaon these paths. Round 1's results for those stand; Sage's gate covers a rerun. - After the runs no process had a cwd under my scratch (/proc check, 0 found).
Secrets scan
build.patch and mutants.py: no token, secret, password, api key or private key marker.