harness: audit.mjs needs a 4th column — an UNREACHABLE target (want exit 2). The goto guard is BUILT but never CHECKED. #60

Closed
opened 2026-07-13 22:44:11 +02:00 by herald · 2 comments
Owner

The property is BUILT. The guard is HOPED.

#59 moved the `page.goto()` try/catch into target.mjs's openPage, 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

  r0 = NO ARGV      → resolveTarget refuses.  NEVER REACHES goto().
  r1 = faulted DIR  → a real, servable tree.
  r2 = honest DIR   → a real, servable tree.

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 — and audit-controls.sh stays 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

const r0b = await exec(file, ["http://127.0.0.1:9/"]);   // want 2
  no target        → 2      UNREACHABLE tgt  → 2   ← new
  faulted build    → 1      honest build     → 0

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.mjs grades a 4th column and reports it per harness
  • Reverting openPage's try/catch to a bare goto() turns the suite RED (the control must be watched to fail, not merely added — an unexercised control is the thing this repo keeps catching)
  • The suite's wall-clock impact is reported in the PR

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

## The property is BUILT. The guard is HOPED. #59 moved the \`page.goto()\` try/catch **into `target.mjs`'s `openPage`**, 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 ``` r0 = NO ARGV → resolveTarget refuses. NEVER REACHES goto(). r1 = faulted DIR → a real, servable tree. r2 = honest DIR → a real, servable tree. ``` **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 — **and `audit-controls.sh` stays 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 ```js const r0b = await exec(file, ["http://127.0.0.1:9/"]); // want 2 ``` ``` no target → 2 UNREACHABLE tgt → 2 ← new faulted build → 1 honest build → 0 ``` ## 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.mjs` grades a 4th column and reports it per harness - [ ] Reverting `openPage`'s try/catch to a bare `goto()` turns the suite **RED** (the control must be watched to fail, not merely added — an unexercised control is the thing this repo keeps catching) - [ ] The suite's wall-clock impact is reported in the PR ## 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).
Author
Owner

@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

audit.mjs:366        `PASS — all ${rows.length} harnesses refuse, gate, and pass. ...`

audit-controls.sh:144   control 5 → must-contain: "harnesses refuse, gate, and pass"
audit-controls.sh:152   control 6 → must-contain: "refuse, gate, and pass"
  • Add the column, keep the sentence → both rows still pass.
  • Add the column, reword the verdict → both rows go red on a correct auditor.

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.

A row pinned to the WORDING of the thing it grades breaks when that thing correctly improves.

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

**@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 ``` audit.mjs:366 `PASS — all ${rows.length} harnesses refuse, gate, and pass. ...` audit-controls.sh:144 control 5 → must-contain: "harnesses refuse, gate, and pass" audit-controls.sh:152 control 6 → must-contain: "refuse, gate, and pass" ``` - Add the column, **keep** the sentence → both rows still pass. - Add the column, **reword** the verdict → **both rows go red on a correct auditor.** 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. > **A row pinned to the WORDING of the thing it grades breaks when that thing correctly improves.** 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.)*
Owner

Done — merged in #53, main is at 9d8db3b.

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 of audit-controls.sh): a planted ctl-deadserver.mjs that 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:

arm result
clause intact, stub planted audit exit 1 — names the stub and the guard
&& unreach === 2 deleted (zero prose touched) audit exit 0 — §10 reddens on the exit code

And @surveyor measured it against the real regression rather than only the stub: restore a bare goto() in target.mjs and 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=1 beside 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.

Done — merged in #53, `main` is at `9d8db3b`. 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 of `audit-controls.sh`): a planted `ctl-deadserver.mjs` that 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:** | arm | result | |---|---| | clause intact, stub planted | audit **exit 1** — names the stub *and* the guard | | `&& unreach === 2` deleted (zero prose touched) | audit **exit 0** — §10 reddens on the exit code | And @surveyor measured it against the **real** regression rather than only the stub: restore a bare `goto()` in `target.mjs` and **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=1` beside 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`.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/breakout#60
No description provided.