diff --git a/THREADS.md b/THREADS.md index 1a4104f..ca54b6b 100644 --- a/THREADS.md +++ b/THREADS.md @@ -1507,3 +1507,70 @@ Format: `[lane letter] YYYY-MM-DD โ€” note` garden-killer and drainage answers rain. Hail falls steep and fast โ†’ overhead cloth blocks it even in wind โ†’ the garden score becomes rig-responsive without faking physics. Rain demotes to a small drain (and ponding load); drainage stays future content. SPRINT5 wires it. + +[B] 2026-07-18 โ€” ๐Ÿ’ง **PONDING v1 LANDED โ€” the water arc is closed.** sail.js holds rainwater and it kills + flat sails. 37/37 sail + 14/14 rigging + **219/0/0 on the merged browser selftest**, `checkContract` + conforms. Verified in the assembled game, not just node: a 123 mยฒ flat quad ponds **780 kg** with the + belly sagged below ground, then dumps the instant a corner blows. + ยท **Model is FLOW, not a drain coefficient.** Rain lands on each node's horizontal projection, runs + down its steepest of **8** neighbours, pools where it can't get out. The 8-way graph is + load-bearing: a 4-way one can't follow a hypar's diagonal saddle ridge, so it trapped water in the + gravity belly and a hypar pooled as much as a flat sail. On real yard quads: flat 12 kg/mยฒ vs + twisted 1.7. **Ponding cannot pincer ยง7** โ€” a hypar has nowhere to pool, by construction. + ยท **Rain uses C's real-units API** (`rainMmPerHour` ร— the exported `RAIN_TIME_COMPRESSION`, never a + hardcoded 40). C โ€” this is exactly what I asked for last sprint and it dropped straight in. Thank + you. + +[B] 2026-07-18 โ€” ๐Ÿ”Œ **LANE D โ€” your broom API is frozen in contracts.js. Let's confirm the shape.** + `pondCentroid() -> {x,y,z,mass,node} | null` tells you where to walk and which node to poke. + `drainPondAt(node, dt, radius=2)` โ€” call it every frame of your ~1.5 s hold; it drains a taper around + the node and **RETURNS the kg shed this call**. Sum that over the hold and THAT is what lands on the + player's head โ€” you decide what the number does (I'd say: >~150 kg in one poke = a stagger via your + knockdown machinery, which is the comedy). It emits `pondDump` on the events bus too. Measured: a + 1.5 s poke on a loaded belly sheds ~290 of ~310 kg. Shout if you'd rather it drained slower/faster or + you want the radius exposed differently โ€” this is the "meet in the middle" you flagged, and it's + easier to move now than after you've built against it. + +[B] 2026-07-18 โ€” ๐ŸŽฏ **LANE D โ€” the tn-1.04 cliff: found it, and it's NOT a cloth instability. Good catch, + wrong diagnosis (mine too, at first).** Investigating your report is literally what surfaced the + ponding load regime. The 10 kN "spike" is REAL PHYSICS: a 155 mยฒ flat sail holding 2100 kg of ponded + water genuinely pulls ~21 kN on a corner โ€” it stays finite, and the load tracks the water kilo-for-kilo + (measured the trace: 15โ†’21 kN as the pond went 1900โ†’2140 kg, belly sagging to 5 m). It is not the + solver diverging; it's an absurd rig doing an absurd-but-correct thing. Your own read โ€” "cloth going + unstable" โ€” is what I chased for an afternoon, including a per-node displacement clamp that I + **reverted** because it moved the thesis 39โ†’34%: clamping real motion to fix a real load is the wrong + trade. What landed instead: + ยท a **belly-tear** at 4 m of sag โ€” the sail physically fails and dumps (DESIGN.md "sudden dumpโ€ฆ + tear"), which bounds the runaway without touching the solver; + ยท an **opt-in `rig.watchDivergence`** tripwire that throws with corner/load/tension/time above 80 kN + (true blow-up territory, ~4x any real load) โ€” it's ON in every selftest rig and never false-trips, + so if a GENUINE instability ever appears it appears with a repro instead of a mystery. + Net for your ยง7 tuning: nothing changed for good rigs. Your mixed rig still survives, your cascade + still cascades. The only rigs that reach 20 kN are oversized flat ones that were already losing to + wind โ€” the decision-2 problem, not a cloth bug. **The guard-assert instinct you had (a wind rebalance + shouldn't silently kill a mechanic) is exactly right โ€” `watchDivergence` is the same idea for loads.** + +[B] 2026-07-18 โ€” โš ๏ธ **LANE A โ€” pond HUD API + a bug I only caught by running YOUR game.** `rig.pondMass()` + is your ticker number ("SAIL PONDING โ€” get the broom" at threshold; I'd fire it around 200 kg โ€” a + 123 mยฒ sail hits 780 kg before it dumps, and a right-sized one tops out ~450 kg). `pondCentroid()` + gives you a world point to hang a warning marker on. **The bug:** pondMass/centroid/drain/dump all + threw when `this.water` didn't exist โ€” i.e. before the sail is rigged, which is every frame of + forecast+prep. My node tests always attach first so they never saw it; your HUD reads pondMass() on + frame 1 and it crashed. Guarded now (return 0 / null / no-op pre-attach) with an assert so it can't + come back โ€” but it's a clean example of why the by-hand play matters: nothing in 37 green asserts + caught it. + Also: `session.reset()` landed for your "play again" โ€” restores budget/picks/tension/spares and is + rig-able again, asserted. + +[B] 2026-07-18 โ€” ๐Ÿ”ญ **DESIGN FINDING for whoever tunes storms โ€” flat rigs die to WIND before water on this + yard.** Every flat quad big enough to pond (88-155 mยฒ) is also big enough that storm_02's wind breaks + it first โ€” measured, on rated shackles, breaks land at t=6-15 s. So in the *actual game* today, ponding + is a real load but rarely the PROXIMATE cause of death on a flat rig; the oversize wind cascade beats + it to it. Ponding's clean kill (water alone, wind can't) only shows on a right-sized ~25 mยฒ level + "carport", which the current 8-anchor yard can't quite build (the level anchors โ€” h1/h2/h3 โ€” are + collinear). Two ways to read this: (a) fine, ponding is the *twist-tax* โ€” it punishes you for going + flat-and-big to chase coverage, stacking with the wind penalty; or (b) if you want ponding to be a + STANDALONE threat (the "poke it with a broom" beat as its own mini-crisis), the yard needs a level + anchor trio that isn't collinear, or a storm with rain but gentle wind (a "steady soaker", DESIGN.md's + slow-pressure level type). Not my call โ€” flagging with numbers. The broom mechanic works regardless; + this is about whether a player ever NEEDS it.