HardYards/web/world/js
m3ultra 756994d98e Ship forecast uncertainty to the card (carried twice — now visible)
The model landed in Sprint 6 and nothing ever called it, which is why this kept
getting carried: `forecastFor` existed while the card went on estimating inline.
So this is the wiring, not more API.

`forecastLines(def, lead)` turns a storm into the card's two stat lines, already
worded in A's voice. lead 0 = tonight = exact numbers (reads exactly as the card
always has); further out it hedges into ranges and prints a confidence line. The
bands always contain the truth — a forecast may be vague, never wrong, or a
player who rigs for the top of the stated range gets ambushed.

Two things the card gains beyond the bands:
- The numbers are now MEASURED. The inline estimate (`baseCurve peak + powBase
  + powRamp`) read 30 m/s for storm_02; it really gusts to 32.3, because gust
  power is drawn per gust and rides a ramp. The wild night now says 116 km/h
  because that is what hits you.
- The card finally MENTIONS HAIL. Hail has been the garden score since decision
  13 and the forecast never said so — you were being scored on something the
  card didn't tell you was coming. Now: "hail likely" on the wild night, silent
  on the gentle one, "possible" when it's too far out to promise.

hud.js is Lane A's file and A is meant to build the week uninterrupted, so this
is deliberately a 3-line swap that keeps their markup, classes and wording — the
week's card rewrite can carry it or drop `forecastLines` and call `forecastFor`
directly. `lead` defaults to 0, so nothing changes until the week passes one.

Verified live at both ends: tonight renders exact; five nights receding into the
week render 0%-confidence hedges ("16–28 m/s · gusts ~72–144 km/h · hail
possible"). Selftest 265/0/0 + gate 0's 2 skips.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 13:10:53 +10:00
..
tests Ship forecast uncertainty to the card (carried twice — now visible) 2026-07-17 13:10:53 +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 Ship forecast uncertainty to the card (carried twice — now visible) 2026-07-17 13:10: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 Lane D: the broom, greyed prompts, and the label pass 2026-07-17 03:03:02 +10:00
main.js Verdicts read the actual failure mode (SPRINT6 gate 1) 2026-07-17 09:15:02 +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 Land ponding v1: rainwater pools on flat sails and kills them 2026-07-17 03:25:46 +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 Guard pond accessors before attach; caught driving the live game 2026-07-17 03:32:02 +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 Kill the headless-zero-shadow trap at its source (skyfx) 2026-07-17 13:10:53 +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 Land hailBlockFor(size, porosity) — the honest fabric-hail rule for B 2026-07-17 11:30:37 +10:00
weather.js Ship forecast uncertainty to the card (carried twice — now visible) 2026-07-17 13:10:53 +10:00
world.js Merge Sprint 6 lanes; wire hidden_by_default; document the balance harness dispute 2026-07-17 09:47:29 +10:00