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 <noreply@anthropic.com>
This commit is contained in:
m3ultra 2026-07-17 15:12:07 +10:00
parent d3258baaa8
commit 855106d37e
2 changed files with 17 additions and 2 deletions

View File

@ -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.

View File

@ -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,
};
}