Row 95 follow-up: Board tests fail fast, README lists every redirect #1591

Open
opened 2026-10-12 21:59:31 +00:00 by jarvis · 2 comments
Contributor

Follow-up to #1589 (landed 17ad6f35). These are Darkwing's notes N1-N3 from comment 27953 on #1589:

  • N1: a toggle-on regression hangs browser-edge.test.mjs at its await boardRequested instead of failing it, which stalls the webui suite.
  • N2: test 2 in board-held.test.mjs claims no further request on the poll, but it never reaches the 10 s poll, so mutants 13 and 27 survive.
  • N3: the webui README's test paragraph lists three redirected requests. The test redirects six.

Brief: docs/plans/2026-10-12_pm-test-fixes.md, "Row 95 follow-up: Board tests fail fast, README lists every redirect". Tests and README only. Reviewer: Darkwing. Waits on row 77, which also edits the webui README.

Follow-up to #1589 (landed 17ad6f35). These are Darkwing's notes N1-N3 from comment 27953 on #1589: - N1: a toggle-on regression hangs browser-edge.test.mjs at its `await boardRequested` instead of failing it, which stalls the webui suite. - N2: test 2 in board-held.test.mjs claims no further request on the poll, but it never reaches the 10 s poll, so mutants 13 and 27 survive. - N3: the webui README's test paragraph lists three redirected requests. The test redirects six. Brief: docs/plans/2026-10-12_pm-test-fixes.md, "Row 95 follow-up: Board tests fail fast, README lists every redirect". Tests and README only. Reviewer: Darkwing. Waits on row 77, which also edits the webui README.
Author
Contributor

Review request for queue row 97, round 1: Row 95 follow-up: Board tests fail fast, README lists every redirect

  • Owner: researcher
  • Reviewers: darkwing, filbert
  • Gate: darkwing and filbert approve on 1591 naming the candidate manifest; Sage's gate rerun of webui, control-board and every scripts/test-*.sh (sage)
  • Brief: docs/plans/2026-10-12_pm-test-fixes.md § Row 95 follow-up: Board tests fail fast, README lists every redirect @dff83c098aaf
  • Candidate: manifest bdeca38dc8897b711b68f055cf346fc0ba6c04721e22720906c6b8fddc97902a

The manifest:

5014e8bc86c0ec48ed30599d9511c26d511ffa0315a57b088d32fca7e8e33f89  packages/webui/README.md
44e66867b376e2e170fedc24b232960c09bba62219a5699d9bdb671d8a05e0e3  packages/webui/tests/board-held.test.mjs
fc3cc8fa7388a6bae669bbaf60c21947f803620ff140af7e33d798a326716fc4  packages/webui/tests/browser-edge.test.mjs

Check a tree against it with scripts/mosaic queue review verify-commit 97 REF.

Post your verdict as a comment here, then record it:

scripts/mosaic queue review record 97 --verdict approve|changes --comment COMMENT_ID --candidate bdeca38dc8897b711b68f055cf346fc0ba6c04721e22720906c6b8fddc97902a --op OP --by SEAT
<!-- mosaic-queue-op: sage-r97-review-req-20261012 --> <!-- mosaic-queue-round: row=97 round=1 candidate=bdeca38dc8897b711b68f055cf346fc0ba6c04721e22720906c6b8fddc97902a --> Review request for queue row 97, round 1: Row 95 follow-up: Board tests fail fast, README lists every redirect - Owner: researcher - Reviewers: darkwing, filbert - Gate: darkwing and filbert approve on 1591 naming the candidate manifest; Sage's gate rerun of webui, control-board and every scripts/test-*.sh (sage) - Brief: `docs/plans/2026-10-12_pm-test-fixes.md` § Row 95 follow-up: Board tests fail fast, README lists every redirect @dff83c098aaf - Candidate: manifest `bdeca38dc8897b711b68f055cf346fc0ba6c04721e22720906c6b8fddc97902a` The manifest: ```text 5014e8bc86c0ec48ed30599d9511c26d511ffa0315a57b088d32fca7e8e33f89 packages/webui/README.md 44e66867b376e2e170fedc24b232960c09bba62219a5699d9bdb671d8a05e0e3 packages/webui/tests/board-held.test.mjs fc3cc8fa7388a6bae669bbaf60c21947f803620ff140af7e33d798a326716fc4 packages/webui/tests/browser-edge.test.mjs ``` Check a tree against it with `scripts/mosaic queue review verify-commit 97 REF`. Post your verdict as a comment here, then record it: ``` scripts/mosaic queue review record 97 --verdict approve|changes --comment COMMENT_ID --candidate bdeca38dc8897b711b68f055cf346fc0ba6c04721e22720906c6b8fddc97902a --op OP --by SEAT ```
Member

Row 97 round 1 review (Darkwing): changes, one item

Candidate: candidate-manifest.sha256 from agents/researcher/work/queue-97/ (81c2906c), digest bdeca38dc8897b711b68f055cf346fc0ba6c04721e22720906c6b8fddc97902a. I applied build.patch (sha256 22150cee…) with git apply --index to a detached worktree of 3bd3f85c, and the manifest checks 3/3 OK. Nothing under packages/webui/src/ changes.

What I checked against the code

  • N1. The race in browser-edge.test.mjs rejects after 5 s with the named message, the finally clears the timer, and the outer finally closes the held responses, browser and servers. It answers the stall from the row 95 review.
  • N2. The stub's 10000 ms filter matches the two poll sites and nothing else: app.js:346 setTimeout(refresh, 10000) and bus.js:659 setTimeout(() => render(false), 10000). The other setTimeout calls use other delays (app.js:444 none, bus.js:767 2600, bus.js:875 none). The forced Pause click in test 2 is needed for the reason the build notes give: bus.js:875 defers schedule(), and only the resume reaches it with paused() false.
  • Mutant 14 is equivalent. api() (app.js:303) throws signedOut() when out() before any fetch, so the guard in refresh() (app.js:349) changes nothing observable.
  • N3. The README's six requests match the six redirect paths in test 2, and its poll and 5 s claims match the tests.

What I ran (2026-10-12T23:55:03Z to 23:56:46Z, my worktree, sequential, after a busy check, in the slot Sage cleared)

  • webui node --test tests/: 101 pass, 0 fail, 0 skipped.
  • Researcher's mutants.py with one mutant added, TMPDIR mine, 120 s per run:
mutant result
13 schedule polls with the toggle off killed (7.2 s)
27 bus schedule polls signed out killed (4.9 s)
12 refresh reads with the toggle off killed (6.8 s)
14 refresh without its signed-out guard ALIVE, equivalent
26 bus render without its signed-out guard killed (5.1 s)
13 under an arrow refactor (mine) ALIVE (9.2 s)
19 toggle on reads nothing killed (6.1 s)

Sources were restored byte for byte, and no process with a cwd in my worktree was left.

The change I'm asking for

The stub sorts a 10 s timer by its callback's name: f.name === 'refresh' ? 'board' : 'bus' (board-held.test.mjs:43). Test 1 then asserts boardPolls() === 0 three times (lines 112, 116, 139). Nothing in either test checks that a board poll is ever recorded. So if app.js:346 becomes setTimeout(() => refresh(), 10000), the shape bus.js:659 already uses, every board timer is filed as 'bus' and those three assertions pass whatever the page does. My added mutant is that refactor plus mutant 13 (if (!paused && !out()) timer = setTimeout(() => refresh(), 10000);), and it survives. The same edit without mutant 13 would also pass, so the guard can go vacuous without any test failing to say so.

One positive control closes it. In test 1, after the toggle is turned on (after the wait(SESSIONS) at line 120), wait for a board timer, for example await wait("window.__polls.includes('board')"). A refactor that changes the callback then fails there instead of disarming the assertions. I haven't run this line; my slot had ended.

Notes, none blocking

  • Six added lines run past 100 characters, the longest 192. The base files already had 32 and 39 such lines, so this matches them.
  • The README's wrapped paragraph has a short line, "again. Since the held roles lead the Board,". A reflow would fix it.
Row 97 round 1 review (Darkwing): changes, one item Candidate: `candidate-manifest.sha256` from `agents/researcher/work/queue-97/` (81c2906c), digest `bdeca38dc8897b711b68f055cf346fc0ba6c04721e22720906c6b8fddc97902a`. I applied `build.patch` (sha256 `22150cee…`) with `git apply --index` to a detached worktree of `3bd3f85c`, and the manifest checks 3/3 OK. Nothing under `packages/webui/src/` changes. **What I checked against the code** - N1. The race in `browser-edge.test.mjs` rejects after 5 s with the named message, the `finally` clears the timer, and the outer `finally` closes the held responses, browser and servers. It answers the stall from the row 95 review. - N2. The stub's 10000 ms filter matches the two poll sites and nothing else: `app.js:346` `setTimeout(refresh, 10000)` and `bus.js:659` `setTimeout(() => render(false), 10000)`. The other `setTimeout` calls use other delays (`app.js:444` none, `bus.js:767` 2600, `bus.js:875` none). The forced Pause click in test 2 is needed for the reason the build notes give: `bus.js:875` defers `schedule()`, and only the resume reaches it with `paused()` false. - Mutant 14 is equivalent. `api()` (`app.js:303`) throws `signedOut()` when `out()` before any fetch, so the guard in `refresh()` (`app.js:349`) changes nothing observable. - N3. The README's six requests match the six redirect paths in test 2, and its poll and 5 s claims match the tests. **What I ran** (2026-10-12T23:55:03Z to 23:56:46Z, my worktree, sequential, after a busy check, in the slot Sage cleared) - webui `node --test tests/`: 101 pass, 0 fail, 0 skipped. - Researcher's `mutants.py` with one mutant added, `TMPDIR` mine, 120 s per run: | mutant | result | |---|---| | 13 schedule polls with the toggle off | killed (7.2 s) | | 27 bus schedule polls signed out | killed (4.9 s) | | 12 refresh reads with the toggle off | killed (6.8 s) | | 14 refresh without its signed-out guard | ALIVE, equivalent | | 26 bus render without its signed-out guard | killed (5.1 s) | | 13 under an arrow refactor (mine) | ALIVE (9.2 s) | | 19 toggle on reads nothing | killed (6.1 s) | Sources were restored byte for byte, and no process with a cwd in my worktree was left. **The change I'm asking for** The stub sorts a 10 s timer by its callback's name: `f.name === 'refresh' ? 'board' : 'bus'` (`board-held.test.mjs:43`). Test 1 then asserts `boardPolls() === 0` three times (lines 112, 116, 139). Nothing in either test checks that a board poll is ever recorded. So if `app.js:346` becomes `setTimeout(() => refresh(), 10000)`, the shape `bus.js:659` already uses, every board timer is filed as 'bus' and those three assertions pass whatever the page does. My added mutant is that refactor plus mutant 13 (`if (!paused && !out()) timer = setTimeout(() => refresh(), 10000);`), and it survives. The same edit without mutant 13 would also pass, so the guard can go vacuous without any test failing to say so. One positive control closes it. In test 1, after the toggle is turned on (after the `wait(SESSIONS)` at line 120), wait for a board timer, for example `await wait("window.__polls.includes('board')")`. A refactor that changes the callback then fails there instead of disarming the assertions. I haven't run this line; my slot had ended. **Notes, none blocking** - Six added lines run past 100 characters, the longest 192. The base files already had 32 and 39 such lines, so this matches them. - The README's wrapped paragraph has a short line, "again. Since the held roles lead the Board,". A reflow would fix it.
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#1591