HardYards/web/world/js
m3ultra 576422e1f0 Downdraft as fraction of total wind (decision 8) + storm_03
The gust-only downdraft could not satisfy B's 60% no-free-lunch bar and the §7
twisted-survives gate together: the downdraft peaked at the gust peak, where
the horizontal peaked too, so a flat sail never reached 60% of a pitched one's
load without a spike so violent it also broke the twisted rig. The integrator
measured the pincer (0.58 -> 48% and still breaks twisted).

Fix: the downdraft is now a fraction of the LOCAL total wind speed, not of gust
power (weather.core verticalAt = -frac * localHoriz). It presses a flat roof
steadily across the whole storm — peak total 32.6 m/s dwarfs peak gust power
12.6 — so the ratio clears 60% at a gentle fraction, with no gust-peak spike.
It rides the local speed, so a tree's wind shadow shelters from falling air too.
speedAt() stays horizontal (a wind meter doesn't read falling air).

Field renamed downdraft -> downdraftOfTotal; the validator rejects the old name
rather than silently re-meaning it. The vertical now carries NO rng draws at
all, so the determinism guarantee (tuning can't re-time gusts) is structural,
not just separate-stream.

Measured both gates myself with B's SailRig (8-direction flat-vs-pitched sweep +
§7 legs). Target for storm_02 is 0.45: 69% of-max / 60% worst-heading on the
bar, twisted rated rig survives with ~21% margin. HELD at 0.12 this commit —
the current yard's only twisted quad ('h1,t2,p1,t1', ~190 m2) starts losing a
corner near 0.15 in the exact solver, so 0.45 would red B's §7. 0.12 ~= the old
gust-only 0.3 in peak downdraft (-4.2 vs -4.5 m/s). Bump to 0.45 is a one-number
joint step once A lands decision-2 anchors (18-45 m2 quads) and B re-points §7.

storm_03_southerly: campaign ramp between gentle and wildnight — peak gust 21
m/s, sustained 13, one moderate southerly change. Auto-swept by the suite.

Selftest 170/0/0 (all three §7 legs green). Verified live: downdraft/horizontal
ratio is exactly 0.12 in-game, rain occlusion still covers the bed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 01:48:30 +10:00
..
tests Downdraft as fraction of total wind (decision 8) + storm_03 2026-07-17 01:48:30 +10:00
camera.js Add graybox yard, third-person camera and game shell 2026-07-16 21:33:42 +10:00
contracts.js Merge remote-tracking branch 'origin/lane/b' 2026-07-17 01:01:48 +10:00
debris.js Fix debris ground friction, cloud seam and yard coords 2026-07-16 21:50:41 +10:00
interact.js Lane D: solids collision, the M3 verbs, shelter and stumble 2026-07-17 00:08:46 +10:00
main.js Place the shed and spare table; expose world.shedTable (unblocks Lane D) 2026-07-17 01:20:35 +10:00
player.js Lane D: solids collision, the M3 verbs, shelter and stumble 2026-07-17 00:08:46 +10:00
player.sim.js Lane D: solids collision, the M3 verbs, shelter and stumble 2026-07-17 00:08:46 +10:00
rigging.js Add prep-phase picking UI over RiggingSession (unblocks A step 8) 2026-07-17 00:14:34 +10:00
rigging.selftest.js Align sail lane to contracts.js; free blown corners so they flog 2026-07-16 21:55:37 +10:00
sail.js Re-run the §7 gate against real storm wind; stop allocating per face 2026-07-17 00:25:25 +10:00
sail.selftest.js Merge Sprint 2 lanes; wire debris into sail step; settle downdraft dispute as documented skip 2026-07-17 01:09:51 +10:00
skyfx.js Rain stops at the cloth (SPRINT2 Lane C.3) 2026-07-17 00:10:29 +10:00
testkit.js Add selftest harness with one suite per lane 2026-07-16 21:33:42 +10:00
weather.core.js Downdraft as fraction of total wind (decision 8) + storm_03 2026-07-17 01:48:30 +10:00
weather.js Add debris, skyfx and the Lane C bench; align to landed contracts 2026-07-16 21:38:21 +10:00
world.js Anchor rework + house/tree GLBs: give the yard a real choice (decisions 2 & 6) 2026-07-17 01:30:17 +10:00