diff --git a/THREADS.md b/THREADS.md index b1ed898..bb5a864 100644 --- a/THREADS.md +++ b/THREADS.md @@ -4731,3 +4731,33 @@ anchors are your GLB), but the tooling is now waiting, not TODO. (`TakeCover`) and stagger (`StumbleBack`/`Reaction`) already shipped and are wired, and the lean is root. The sprint asked for three clips; the answer was one already-present clip, two already-wired, and a root pose. Nicely under budget. + +[D] 2026-07-18 — 📋 **STATUS + a harness landmine I nearly stepped in, for whoever measures the garden.** + + **Done and green (340/0/0), all on `lane/d`:** the wind lean (gate 2.4), the ladder-survives-a- + knockdown fix + the fascia/carport label (gate 2.6 pool), the E clip contract, and the C/B + diagnoses (hail sliver, free-infinite-spares). My two remaining items — the **gate-1 garden + verdict** and the **gate-2 visual judging** (storm grade / wall / leaves) — are both blocked on C, + who's still at the integration commit. I'll run them the moment C pushes. + + **⚠️ The landmine, because I nearly filed a false alarm off it and the next person will hit it too.** + I started building a headless garden-separation baseline (held honest rig vs bare bed, per storm) so + my gate-1 verdict would be a clean before/after on C's fix. First cut showed **zero separation on + every storm** — held bed took identical hail damage to a bare bed. That looks like a five-alarm + finding ("the sail casts no garden shadow at all"). **It's a harness artifact, not the game.** Two + variables, both the same species the repo keeps re-learning: + · `sky.step(dt, t, world = {})` — the THIRD param is named `world`, and main.js calls + `sky.step(dt, windT, {sail: rig})`. So `world.sail` inside skyfx is the PASSED `{sail:rig}`, + i.e. the live rig — NOT the global `world`. Grepping `world.sail =` finds nothing and looks + like an unset field; it isn't, it's a parameter shadow. Don't "fix" it. + · The shadow only projects if `rig.pos`/`rig.tris` are built, and those come from `rig.attach()`, + which fires via `rigging.commit()` (UI) → `onCommit` → `rigSail`. I first drove + `rigging.session.commit()` (session-level), which bypasses `onCommit` entirely — so the sail + was never attached and every rig scored as bare. skyfx.js:803 documents this EXACT trap in its + own words: a harness that skips the shadow rebuild "scored every rig as if the sail did not + exist — hp 36 was the bare-bed constant, and it cost gate 0 two sprints of four lanes' time." + **So: the honest way to measure the garden is to PLAY it** (or drive the full commit→attach path), + which is what the QA pass did and what my gate-1 verdict will do. I'm NOT posting baseline numbers — + a bypassed-attach measurement is worse than none. C: when your shadow-geometry fix lands, don't + trust any separation number that didn't go through `rig.attach()`; the bare-bed constant will lie + to you politely.