diff --git a/THREADS.md b/THREADS.md index 9f5700f..deed8a5 100644 --- a/THREADS.md +++ b/THREADS.md @@ -1788,3 +1788,17 @@ Format: `[lane letter] YYYY-MM-DD — note` rigSail/attach) so Lane-D systems that need the rig but are built by createPlayer — the broom needs `ponds`/`drainPondAt` — can read it without main.js threading it through. Same pattern and same reason as `interact.ladder`. B/C/E: if you ever need the current rig from an interact-wired system, it's there. + +[I] 2026-07-18 — **SPRINT 5 INTEGRATION (main).** Lanes b/c/d/e merged; selftest **240/0/0**. Wired + decision 13 into A's one-term seam (hail×5.0 + rain×0.25 feeding garden.step; weights are integration + guesses, tune freely). B's ponding + D's broom, built independently against the agreed shape, lit up + together on merge exactly as designed. C's router edit was correct (A's tripwire caught it, C followed + the standing instruction). E's texture-consumption audit stands: A takes the grass recipe in SPRINT6 + or the atlas gets deleted; ditto lifting the screenshot POST into server.py. + **BALANCE, measured live in the merged game (storm_02, real $80-shop loadouts):** bare bed 36% · + bed-covering rigs (cover .29-.67) all lost 2-3 corners and ended 36% or dead · B's 23 m² twisted quad + with the exact-$80 loadout held 4/4 but covers 0% of the bed → 39%. Win bar is hp≥50 && lost<2: + **the wild night currently has no winnable line through the real shop.** Nothing is broken — C + flagged exactly this joint call when holding 0.45 — but it is now measured and it is SPRINT6 gate 1. + Also: scoreRun's verdict text blames "what you skimped on" on a 4/4 no-break run — verdicts must + read the actual failure mode. diff --git a/web/world/js/main.js b/web/world/js/main.js index 1b2db23..33c25c5 100644 --- a/web/world/js/main.js +++ b/web/world/js/main.js @@ -546,7 +546,15 @@ export async function boot(opts = {}) { // extends exactly this shape (+ gardenHailExposure) — so when hail lands // this is one added term here, not a rewrite. if (game.phase === 'storm') { - garden.step(dt, sky?.gardenExposure ? sky.gardenExposure(world.gardenBed, windT) : 0); + // Decision 13 (SPRINT5): hail is the headline garden threat — it falls + // steep, so the sail blocks it and the score finally rewards rigging + // (C proved 4.4× separation). Rain stays as the small honest drain that + // walks under a sail in a gale. Weights chosen so storm_02 unprotected + // loses ~50 HP to its hail bursts (11.4 hail-seconds × 5.0 × 0.9/s) and + // ~10 to rain, while a bed-covering rig cuts the hail term ~4.4×. + const rainExp = sky?.gardenExposure ? sky.gardenExposure(world.gardenBed, windT) : 0; + const hailExp = sky?.gardenHailExposure ? sky.gardenHailExposure(world.gardenBed, windT) : 0; + garden.step(dt, hailExp * 5.0 + rainExp * 0.25); } }