Log ponding v1, broom API, cliff resolution, and a yard finding
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 <noreply@anthropic.com>
This commit is contained in:
parent
670443eea0
commit
97ea1b668c
67
THREADS.md
67
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.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user