HardYards/web/world/js/tests
type-two afb61b2926 Lane C S18: the mid-storm entry seam — a crate is a pure function of its event
The emergency callout arrives at t≈30, which makes a NON-ZERO START a first-class
case for the storm clock. Measured before writing anything, and the debris module
failed two ways that had nothing to do with the callout:

  · the same storm flown twice through one module spawned DIFFERENT crates
    (wildnight height 1.582 m then 1.165 m). main.js builds one debris module at
    boot and clear()s it per phase change; clear() rewound the leaf accumulators
    and not the piece PRNG. Live on main today — night 2 of the seven-night week
    never flew night 1's crates, and no test looked.
  · an entry at t=45, past the wildnight's t=38 event, gave every LATER crate the
    skipped crate's height, spin axis and phase — the stream sat 5 draws behind.
    Skipping history corrupted the future, not just the present.

One cause: a crate's jitter came off a shared stream whose POSITION encoded how
much history had happened. Keyed on the event itself now, so a crate is a pure
function of its event — the move weather.core.js's header already argues for.

debris.enterAt(t0, dt) for the one part that is a genuine path integral: the
ambient leaf layer. A t=0 run has 6 leaves crossing the grass at t=30 and a cold
entry has ZERO, staying becalmed ~7 s while the 2.5 s EMA climbs off zero —
DESIGN.md line 149 makes that moving grass the gust front's tell, and gate 1's
whole premise is that the grass is the only briefing a callout gets. It runs the
ladder rather than skipping it, and the ladder ACCUMULATES: i*dt is the more
accurate ladder and therefore the wrong one (1770 of 1800 steps disagree, first
at step six), because main.js, fixedLoop and sail.js all accumulate.

Pins: +5 (522 -> 527). Wind order-independence broadened to every storm and five
scalar observables plus the exact callout ladder, and a BACKWARDS peak scan
cross-checking what the dispatch will quote. All four mutations went red; the
first draft of the stormStats case could not fail (it memoises per def, so it was
comparing an object to itself) and was rewritten rather than shipped.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 19:21:29 +10:00
..
a.test.js Lane A S17 gates 0+1+2: THE JOB BOARD — two offers a morning, the chosen job IS the night 2026-07-21 02:11:16 +10:00
b.test.js Lane B S14 gate 2.3: pin the editor's scored wind to the game's played wind 2026-07-18 16:16:29 +10:00
balance.test.js Lane B S13: kill the marked fake — garden model comes from A's garden.js everywhere 2026-07-18 13:50:15 +10:00
c.test.js Lane C S18: the mid-storm entry seam — a crate is a pure function of its event 2026-07-25 19:21:29 +10:00
d.test.js Lane D S17 gate 3.2: THE POOL YARD — authored cold, in the game only by being chosen 2026-07-21 03:53:20 +10:00
e.test.js Lane E S17 gate 3.1: THE CORRODED TIER — mutations restored, tell verified at 20 m, droop pinned to geometry 2026-07-21 01:51:57 +10:00
run-node.mjs Add wind field, storm timelines and weather selftest 2026-07-16 21:38:12 +10:00
weather.selftest.js Lane C S18: the mid-storm entry seam — a crate is a pure function of its event 2026-07-25 19:21:29 +10:00