From 97ea1b668cc0b9816d00824989d19e2c96527c6f Mon Sep 17 00:00:00 2001 From: m3ultra Date: Fri, 17 Jul 2026 03:32:55 +1000 Subject: [PATCH] Log ponding v1, broom API, cliff resolution, and a yard finding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Freezes the pond API for D (broom) and A (HUD), resolves D's tn-1.04 cliff as real ponding load rather than solver instability, and flags that flat rigs die to wind before water on the current yard — so ponding is a twist-tax today unless the yard gets a non-collinear level anchor trio. Co-Authored-By: Claude Opus 4.8 --- THREADS.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) 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.