HardYards/web/world/js
m3ultra 2996b092ae Prove the porosity->gardenHailExposure leak end-to-end (answer C's seam)
C asked in THREADS whether to land a one-liner making gardenHailExposure read
sail.porosity. Answer: it is already wired, in merged main — I did it in SPRINT9
(e576f5c): skyfx.step refreshes sailPorosity from world.sail.porosity, and
gardenHailExposure folds hailBlockFor(size, sailPorosity) into what it returns.
No one-liner needed.

But "already wired" was untested end-to-end. The only test of the hail leak,
weather.selftest's 'fabric choice is real', REIMPLEMENTS the formula inline with
hailBlockFor + hailAt — it proves the primitive and the arithmetic, not the
plumbing. A regression in the plumbing (the :738 refresh dropped, the
wind.def.hail.size lookup resolving wrong, hailBlockFor no longer folded in)
would leave that test green while the game quietly stopped leaking hail. That is
the measure-a-copy pattern this whole browser suite exists to avoid.

New assert 'porous cloth leaks pea hail into the garden, membrane blocks it'
drives the real sky.gardenHailExposure. The isolation is exact: ONE settled,
intact rig, sampled at ONE hail instant, porosity flipped 0.30<->0 between reads.
sky.step(0, t, {sail}) refreshes sailPorosity and rebuilds the shadow grid at the
same instant without advancing physics, so shadow geometry is identical across
the two reads and `block` is the only thing that moved. Measured:

    pea (size 0.7):  cloth 0.346 vs membrane 0.292  -> porous leaks +18%
    ice (size 1.4):  cloth 0.458 vs membrane 0.458  -> identical, the no-op

No storm flight, no second rig — deliberately. Two rigs whose corners diverge
share no shadow, and that difference is a cascade not a fabric: membrane cascades
on the ice night, so a naive two-flight version reads a FALSE ice-night
difference. The same-rig swap removes it.

And it can fail: if porosity stops reaching the exposure, both reads collapse to
the membrane value (measured: 0.2917 == 0.2917), cloth > membrane*1.05 is false,
red. The ice check is exact equality — if porous ever starts leaking big ice,
that goes red too.

Selftest 288 passed, 0 failed, 0 skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 15:55:11 +10:00
..
tests Prove the porosity->gardenHailExposure leak end-to-end (answer C's seam) 2026-07-17 15:55:11 +10:00
broom.js Lane D: calibrate the douse to B's real ponds; fix the sagging-belly refusal 2026-07-17 09:23:17 +10:00
camera.js Add graybox yard, third-person camera and game shell 2026-07-16 21:33:42 +10:00
contracts.js Land ponding v1: rainwater pools on flat sails and kills them 2026-07-17 03:25:46 +10:00
debris.js Fix debris ground friction, cloud seam and yard coords 2026-07-16 21:50:41 +10:00
hud.js Merge Sprint 8; the week is live; balance harness stabilized 2026-07-17 14:02:53 +10:00
interact.js Lane D: calibrate the douse to B's real ponds; fix the sagging-belly refusal 2026-07-17 09:23:17 +10:00
ladder.js Site-proof the ladder ahead of site_02, and test the real rule not a copy 2026-07-17 14:32:06 +10:00
main.js Sites are data: extract backyard_01.json; world.js builds from it 2026-07-17 15:34:29 +10:00
player.js Lane D: the broom, greyed prompts, and the label pass 2026-07-17 03:03:02 +10:00
player.sim.js Lane D: the ladder sub-system (decision 12) 2026-07-17 02:34:49 +10:00
rigging.js Fabric + 0.40 as one landing: the wild night has a clean $80 win 2026-07-17 14:25:59 +10:00
rigging.selftest.js Land ponding v1: rainwater pools on flat sails and kills them 2026-07-17 03:25:46 +10:00
sail.js Redesign the settled-at-entry guard: ask the cloth, not the corners 2026-07-17 15:01:09 +10:00
sail.selftest.js Guard pond accessors before attach; caught driving the live game 2026-07-17 03:32:02 +10:00
skyfx.js Fabric + 0.40 as one landing: the wild night has a clean $80 win 2026-07-17 14:25:59 +10:00
testkit.js Gate 0: name the harness dispute's cause; make skips real (testkit) 2026-07-17 10:21:01 +10:00
weather.core.js Venturi: per-site wind personality for site_02 (the corner block funnels the southerly) 2026-07-17 14:26:24 +10:00
weather.js Venturi: per-site wind personality for site_02 (the corner block funnels the southerly) 2026-07-17 14:26:24 +10:00
week.js The week: five nights, one wallet, and an ending that tells the truth 2026-07-17 13:13:44 +10:00
world.js Sites are data: extract backyard_01.json; world.js builds from it 2026-07-17 15:34:29 +10:00