diff --git a/THREADS.md b/THREADS.md index 6869998..5a803d7 100644 --- a/THREADS.md +++ b/THREADS.md @@ -909,3 +909,60 @@ Format: `[lane letter] YYYY-MM-DD — note` Selftest on merged main: **169 pass / 0 fail**. Hand-driven check via SHADES.step: storm_02 with the default rig loses p1 (carabiner) + p2 by t=40 with downdraft live — cascade is earlier and meaner than A's pre-downdraft run, as C's numbers predicted. Screenshot of the merged storm going to DESIGN.md. + +[C] 2026-07-17 — **DECISION 8 LANDED — downdraft is now a fraction of TOTAL wind speed. Semantic done; + final VALUE is a joint step still blocked on B.** Selftest **173/0/0** on rebased main. + `weather.core.verticalAt(x,z,t) = -frac · localHoriz(x,z,t)` — the downdraft rides the local horizontal + speed, so it presses a flat roof steadily the whole storm (not just at gust peaks) and a tree's wind + shadow shelters from falling air too. `speedAt()` stays horizontal. Field renamed + `downdraft → downdraftOfTotal`; validator rejects the old name rather than silently re-meaning it. + The vertical now carries **zero** rng draws, so "tuning can't re-time gusts" is structural, not just + a separate stream. storm_03_southerly added (ramp between gentle and wildnight; peak gust 21 / sust 13). + weather_demo.html retired — the game is the bench. + +[C] 2026-07-17 — **The pincer is broken by the semantic, exactly as decision 8 predicted.** I measured + both gates myself with B's SailRig (8-heading flat-vs-16.7°-pitched sweep + §7 legs) on a + PROPERLY-SIZED ~40 m² synthetic twisted quad: + ``` + downdraftOfTotal 60%-bar (flat:pitched) §7 twisted-rated survival + 0.22 45% fail 4/4 (2928 N) + 0.40 63% PASS 4/4 (4617 N) + 0.45 69% of-max / 60% worst-head 4/4 (5142 N, 21% margin) ← TARGET + 0.60 78% PASS 3/4 DIES (6567 > 6500) + ``` + So **0.45 clears the 60% bar AND keeps a well-sized twisted rated rig alive** — the two gates + gust-only could not satisfy together (integrator measured 0.58 → 48% and still broke twisted). Decision + 8 works. (My harness reproduces B's scale: fraction-of-total 0.15 → 37%, matching B's gust-only 0.3 → + 34% at the same ~-4.5 m/s peak. Raising the downdraft lifts the PITCHED load too, so the ratio climbs + slower than a static estimate — you need ~0.4, not B's ~7.3 m/s single-point guess. That's a real note + for your assert, B.) + +[C] 2026-07-17 — ⚠️ **B — A's anchor rework alone does NOT unblock 0.45; your §7 rig is still oversized. + Re-point it and we finish gate 2.** I rebased onto A's decision-2 anchors and re-measured your exact + §7 twisted rig `['h1','t2','p1','t1']` against storm_02: it's **still a 141 m² quad** (h1 is house at + z≈-9.9, t2 at x≈8, p1 at x≈-4.9, t1 at x≈-9 — those four corners span the whole yard), and it dies at + 0.45 (3/4, peak 6410 N). A ADDED small quads (`p3` near (0,7.6), branch anchors `t1b/t2b`, posts moved + in to p1≈(-4.9,5.9)/p2≈(4.3,6.5)) — but `h1,t2,p1,t1` isn't one of them. **Your SPRINT3 item 2: swap + the §7 twisted rig to an 18-45 m² quad, confirm all three legs at 0.45, then bump storm_02 + `downdraftOfTotal` 0.12 → 0.45 (one number).** ❗ Heads-up from my sweep, flag for you + A: from the + near-bed anchors I could NOT find an 18-45 m² quad that both covers the bed ≥50% AND survives 0.45 with + a rated+shackle mix — the bed sits between the house (z≈-9.9) and the posts (z≈+6), so covering it + tends to want a biggish quad. A's a.test says ≥3 small quads DO shade the bed, so they exist and I'm + likely mis-enumerating (I don't own your area calc / tension intent) — but if the target 0.45 turns out + too hot for the real bed-covering rig, that's a joint call: nudge 0.45 down a touch, or accept the §7 + survivable rig is a bigger quad than 45 m². Your rig, your call; I'll match the wind to whatever lands. + +[C] 2026-07-17 — **Held storm_02 at `downdraftOfTotal: 0.12` so main stays GREEN until B re-points.** On + the current yard B's oversized §7 rig starts losing a corner near 0.15 in the exact solver, so 0.45 + would red the §7 assert (I saw it: 1 fail before I held). 0.12 fraction-of-total ≈ the old gust-only + 0.3 in peak downdraft (-4.2 vs -4.5 m/s), so storm_02's feel barely moves, with ~23% load margin on + that rig. storm_01 → 0.25, storm_03 → 0.35 (neither is in a §7 assert, so those are their real values). + Same call the integrator made last sprint: keep green, document the target, converge jointly. + +[C] 2026-07-17 — **A — decision 7 (garden HP on rain shadow): `skyfx.rainShadowOver(bed)` is ready, no + new work on my side.** Returns 0..1 of the bed the cloth is keeping dry, this frame; 0 when no sail or + no rain. It is NOT `rig.coverageOver(bed, sunDir)` — that's the SUN shadow (keep it as the daytime + readout). During a night storm the rain shadow is the one that says whether the bed is getting hit; it + follows the wind, so it walks off the bed at the southerly change. Suggest HP drain ∝ rain intensity × + (1 − rainShadowOver(bed)); the intensity term is yours (`wind.rainAt(t)`). Ping if you want a combined + helper and I'll add it.