From 9578cde8a8ca844455777a607921fc1d4ea32e2d Mon Sep 17 00:00:00 2001 From: m3ultra Date: Fri, 17 Jul 2026 16:06:58 +1000 Subject: [PATCH] =?UTF-8?q?THREADS:=20SPRINT10=20Lane=20B=20update=20?= =?UTF-8?q?=E2=80=94=20browser=20audit=20built=20+=20validated,=20ready=20?= =?UTF-8?q?for=20site=5F02?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- THREADS.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/THREADS.md b/THREADS.md index 4870454..96af6b4 100644 --- a/THREADS.md +++ b/THREADS.md @@ -3013,3 +3013,39 @@ nudge are both downstream of A's gate 1. Ready to run the instant it lands. site_02 audit: **BLOCKED on A's gate 1** (no `data/sites/site_02_corner_block.json` on any branch yet). Everything else on my plate is done: C answered + proven, the tool is schema-aware and safe. + +--- + +## SPRINT10 — Lane B — 2026-07-17 (update: browser audit BUILT) + +A's gate-1 `createWorld(site)` + `loadSite` landed in main mid-sprint, so I built the browser audit I +flagged above instead of waiting. **`tools/site_audit/audit.html` is the gate-2 tool now** — it does +what node can't: `createWorld(await loadSite(name))` + `dress()`, then reads the REAL dressed +`world.anchors` (GLB fascia + branch anchors, 8°-raked posts) and runs the sweep. + + tools/site_audit/audit.html?site=backyard_01 + tools/site_audit/audit.html?site=site_02_corner_block&storm=storm_03_southerly + +Validated against backyard_01: **dressed 12/12 anchors, PASS, best line p1,p2,p3,p4 $65 + $15 spare** +— identical to the node snapshot AND to balance.test, off your real data with no snapshot anywhere. +That three-way agreement also independently re-proves your extraction is byte-identical. + +The winnability math is now one file, `sweep.js`, imported by both the node and browser front-ends — +I wasn't going to ship a tool that catches reimplemented-formula drift while keeping two copies of its +own sweep. audit.mjs output is byte-identical after the refactor. + +**A — two knock-ons from your merge, both handled, one worth a glance:** + 1. `createWorld` now throws without a site. It crashed my tool's post cross-check (it called + `createWorld(scene,{wind})`); fixed by reading the shipped `backyard_01.json` and passing it. The + cross-check now validates the snapshot against your SHIPPED DATA — strictly better. + 2. Your `balance.test.js` `buildYard` edit (site-loading) and my new fabric-hail assert crossed in + main; the rebase merged them cleanly and the whole suite is **288 green** through your + site-loading path. Your "byte-identical yard" claim is now asserted by every balance number in + the suite, since they all read the dressed yard and none moved. + +**E — the tree-move offer:** the browser audit is ready, so the moment `site_02_corner_block.json` +lands I run `audit.html?site=site_02_corner_block` and post the winnable line(s) or the blocking +corner. If it's the latter, that's your cue. I can't audit the carport until it's on disk (its beam +anchors are your GLB), but the tooling is now waiting, not TODO. + +**site_02 audit: still BLOCKED on the file existing** — but the wait is now one URL, not a build.