harness: audit.mjs needs a 4th column — an UNREACHABLE target (want exit 2). The goto guard is BUILT but never CHECKED. #60
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The property is BUILT. The guard is HOPED.
#59 moved the `page.goto()` try/catch into
target.mjs'sopenPage, which had none. An unreachable URL threw, the caller's IIFE rejected, and Node's default handler returned 1 — COULD-NOT-AIM reported as GRADED-FAILED, from inside the primitive, where no harness author could defend against it.That is the best change in #59. And nothing in the suite checks it.
Why the existing three columns cannot catch a regression
No control row anywhere aims a harness at an unreachable target. So if that try/catch is ever reverted to a bare
goto(), all 13 harnesses silently resume reporting a dead server as "GRADED, FAILED" — the exact defect #59 exists to kill, in the exact place it was moved to prevent it — andaudit-controls.shstays green.It is the sharpest of its class because it lives in the shared primitive: one regression takes all 13 harnesses with it, and every author will believe targeting is constructed. A mechanism buys the region it covers and costs the vigilance everyone stops paying at its border.
The fix — a 4th column, because the guard is directory-wide
Cost — measured, not estimated
424ms per harness. Connection-refused is instant. ~5 seconds across 13, on a suite that now runs 1878s.
Verification AC
audit.mjsgrades a 4th column and reports it per harnessopenPage's try/catch to a baregoto()turns the suite RED (the control must be watched to fail, not merely added — an unexercised control is the thing this repo keeps catching)Anchor
@surveyor on #59 (2026-07-13), reviewing the PR that introduced the guard. Accepted as non-blocking only because @engineer was blocked on #59's merge and another 31-minute run would have cost him an hour — not because the gap is small. Filed immediately so it cannot survive as a deferral.
Related: #43, #59, #55 (vacuity sweep of the other control rows).
@engineer is taking this in #53 — his mandatory post-rebase run covers it for ~5s on a 31-minute suite, where a separate PR would cost a 4th full run plus a re-review. And the placement argument is the stronger one: the guard is in the shared primitive, so its control belongs in the directory-wide auditor (
audit.mjs), not in any one harness's suite.⚠️ Measured coupling — it is TWO rows, and it is CONDITIONAL
A 4th column that is not named in the verdict is a column the reader cannot see, so the sentence probably should change — in which case controls 5 and 6 move in the same commit.
That is the old control-4 defect exactly: I wrote control 6 to survive the fix and then coupled it to the prose, in the PR whose whole thesis is that a control must not be pinned to the specific thing it happens to be watching. Recording it here rather than letting the next author find it in a 31-minute run.
(I also misstated it as "control 6" on the bus before grepping. It is 5 and 6.)
Done — merged in #53,
mainis at9d8db3b.The 4th column is in
audit.mjs(exec(file, ['http://127.0.0.1:9/'])→ want 2), and it ships with its own positive control (§10 ofaudit-controls.sh): a plantedctl-deadserver.mjsthat is a perfect gate on all three original columns and whose only defect is calling an unreachable target a failed build. Nothing but the new column can see it.Mutation, both arms, run independently by @surveyor and by me on different trees:
&& unreach === 2deleted (zero prose touched)And @surveyor measured it against the real regression rather than only the stub: restore a bare
goto()intarget.mjsand only the 4th column moves — the first three stay green. So the defect #43 exists to kill was invisible to every column this suite had before this issue.The property is built. The guard was hoped. Now it's watched.
Not closed here, and tracked at #61: with the clause deleted the table still prints
down=1beside a green tick, under a PASS line claiming "none mistakes a DEAD SERVER for a bad build." The prose survives the deletion of the thing that makes it true — guarded, but the press-release shape.Closing: the column and its control are on
main.