From 855106d37e647517017cf328143ec433b6d4e56b Mon Sep 17 00:00:00 2001 From: m3ultra Date: Fri, 17 Jul 2026 15:12:07 +1000 Subject: [PATCH] Merge Sprint 9: clean $80 win asserted; guard redesigned; pyrrhic wired Selftest on merged main: 287 pass / 0 fail. Co-Authored-By: Claude Fable 5 --- THREADS.md | 14 ++++++++++++++ web/world/js/tests/balance.test.js | 5 +++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/THREADS.md b/THREADS.md index 904ec34..830c7f1 100644 --- a/THREADS.md +++ b/THREADS.md @@ -2933,3 +2933,17 @@ Selftest: **277 passed, 0 failed, 0 skipped**, LANE BAL now visible. [D] 2026-07-18 — ⏳ **Still owed by me: play site_02 cold** (blocked — A's site-as-data + E's corner block haven't landed), and the full-week feel pass. Both are queued and neither blocks anyone. My douse guard is still green, so pond masses haven't moved. + +[I] 2026-07-19 — **SPRINT 9 INTEGRATION (main).** All lanes merged; selftest **287/0/0**. The balance + suite now reads like the design doc: CLEAN $80 win on the wild night (porous cloth · dd 0.40 · + p1,p2,p3,p4) · fabric decides p1 (membrane tears the cheap corner off) · the t2 quad stays pyrrhic + (the sacrifice play) · the settled-at-entry guard measures cloth motion and PROVES it can fail. + Merge notes: B and D redesigned the same guard independently (nodeSpeed vs drift) — kept B's (it + reserved D's veto), mapped D's settleDrift field onto it same-unit. Both of my Sprint-8 guard + diagnoses were refuted with measurements (rain curves start at [0,0]; the 2 s window was the flake) + — proper. The pyrrhic ruling is wired with its own verdict mode and E's third card. + **Still open, carried to SPRINT10:** A's site extraction (data/sites/*.json — not started; the week + ate Sprint 8 and the ruling ate Sprint 9's A-capacity), D's needsLadder site-field (specced, fails + open on carports until landed), C's venturi (landed, waiting on site JSON shape), E's carport + (landed as a data-driven trap, waiting on site_02), B's site_audit tool (from the quad sweep). + Gate 3 (John plays the week) remains open — the game has never been more ready for it. diff --git a/web/world/js/tests/balance.test.js b/web/world/js/tests/balance.test.js index 82533c7..b4da692 100644 --- a/web/world/js/tests/balance.test.js +++ b/web/world/js/tests/balance.test.js @@ -323,8 +323,9 @@ async function fly(yard, session, stormName, { repair = false, broom = false, se lost: rig.corners.filter((c) => c.broken).length, spent: START_BUDGET - session.budget, pond: Math.round(pond), - /** mm/s the cloth was still drifting when the storm started — the settled-at-entry guard. */ - settleDrift: settleDriftMmPerSec, + /** mm/s the cloth was still moving when the storm started — the settled-at-entry guard. + * (Merge note: B's nodeSpeed guard kept; D's drift metric mapped onto it, same unit.) */ + settleDrift: entrySpeed * 1000, }; }