Commit Graph

3 Commits

Author SHA1 Message Date
m3ultra
aac1030131 Gate 0: name the harness dispute's cause; make skips real (testkit)
THE CAUSE, and it is not a winner: balance.test.js built skyfx with no camera,
and skyfx.step() opens `if (!camera) return;` — so the hail shadow grid was
never rebuilt across all 5400 calls and every loadout was scored as though it
had no sail. hp 36 IS the bare-bed number. Measured with the camera as the only
variable: hailShadowOver(bed) peaks 0.000 vs 1.000, hp 36 vs 69. Neither harness
was lying; one was flying a yard with no cloth in it. Camera + wind shelters
added — the suite must drive what the game drives.

MY ERROR, named: the hp-58 win was measured at tension 1.0 and I never declared
it. At the shop's default 0.9 my own end-to-end also loses 2 corners.

STILL OPEN: this suite says 2 corners lost, my end-to-end says 1 at tension 1.0.
Ruled out by measurement, each worth <=0.02 kN: shelters, frozen vs live tree
sway, the scripted repair. Next suspects named in the skip: session.commit() vs
rigSail(), and main.js passing debris as rig.step's 4th arg (debris ADDS load,
so it should break MORE here, not less — that inversion is the thread).

And the find that explains how this survived a merge: Suite.test() ignored its
return value, so `return "SKIPPED — ..."` was recorded as a PASS. The
integrator's storm_02 skip was a fake pass; so was mine for storm_01; `skip: 0`
in every report we ever printed was the tell and nobody read it, me included — I
misread one of those fakes as my win reproducing. test() now honours the string,
and rejects async fns outright (they hand back a Promise that cannot throw
synchronously, passing forever while proving nothing).

That guard immediately caught its own author: BOTH my wind-router tripwire tests
were async and have asserted nothing for two sprints — including the sprint where
I reported the tripwire "caught its first real omission". It had, in a hand-run
probe, never in the suite. Awaits hoisted into run(); they asserted for the first
time today, and pass.

Selftest 261 pass / 0 fail / 2 honest skips.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 10:21:01 +10:00
m3ultra
676b58a2bb Merge Sprint 6 lanes; wire hidden_by_default; document the balance harness dispute
Selftest on merged main: 263 pass / 0 fail (winnable-line assert self-skips
pending SPRINT7 gate 0 harness convergence).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 09:47:29 +10:00
m3ultra
98bc11f033 Add balance.test.js — SPRINT6 gate 1. It is RED, and that is the point
The gate asks the only question no per-lane suite can: can the night be
won through the real $80 shop. It buys loadouts via RiggingSession, flies
the real storm JSON over the real yard, integrates skyfx's real hail/rain
exposure into main.js's real garden drain, and judges with main.js's own
win rule.

Status: storm_01 warm-up PASS, cheap-rig-punished PASS, decision-13
miss-the-bed control PASS, and **storm_02's winnable line FAILS** at
hp=36, 2/4 lost. That reproduces the integrator's finding exactly and is
the gate doing its job — SPRINT6 says everything waits on gate 1.

Two things I got wrong on the way, both worth the comments they now
carry:

- The first draft hardcoded the anchor table from a THREADS entry and
  was badly wrong (the dressed yard has the house at x=±3, not ±5). It
  flew a fictional yard. It now reads the yard from world.js and freezes
  only the sway — the yard IS the balance, so it cannot be a copy. Same
  failure as Sprint 3's 16.7° reference rig.

- The asserts were async. testkit's Suite.test() calls fn() WITHOUT
  awaiting, so every one would have passed forever while proving nothing
  — the exact vacuous-test pattern I've flagged three times. Storms are
  now flown up front in run() (which runAll does await) and the asserts
  are synchronous judgements over the results.

Registers as a sixth 'BAL' entry in selftest.html. A: your "nobody
touches this file" rule guards against five lanes conflicting here; one
jointly-owned entry is the case it makes room for. Revert if you disagree.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 09:25:53 +10:00