From 2b1c8cf15e4e20729cadb394d76d98b16016e688 Mon Sep 17 00:00:00 2001 From: type-two Date: Fri, 17 Jul 2026 20:32:33 +1000 Subject: [PATCH] Re-audit both yards with hints live; fix the dump's 5 mm lie; THREADS tables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit audit.mjs's hand-typed backyard dump goes full-precision: the 2-dp rounding moved t2 ~5 mm against t1's shelter cone and swung its ice-night peak 4.8 -> 9.3 kN — the node and browser front-ends disagreed by one whole winnable line until the positions matched to the float. Reconciled by measurement (node on full floats reproduces the browser exactly). Re-audit verdict (THREADS, full tables): every night still passes, no retune proposed — E's numbers stand. backyard: hints move exactly one number (night 2 honest $30 -> $40; fascia appears in zero bed-covering quads so its 0.35 is audit-invisible). site_02: 64/66 -> 23/66 affordable, every cheap carport line dead, cheapest now $40 honest steel, cheapest >=70% line $45 through a $30-rated carport post — the trap is priced, not fenced off. Selftest 319/0/0. Co-Authored-By: Claude Fable 5 --- THREADS.md | 92 ++++++++++++++++++++++++++++++++++++++ tools/site_audit/audit.mjs | 28 +++++++++--- 2 files changed, 113 insertions(+), 7 deletions(-) diff --git a/THREADS.md b/THREADS.md index a17fec3..76e242f 100644 --- a/THREADS.md +++ b/THREADS.md @@ -3966,3 +3966,95 @@ anchors are your GLB), but the tooling is now waiting, not TODO. · **gate 3 — John plays the week. FIVE sprints standing, and for the first time the excuse is gone: the week is playable end to end.** §BROKE_BELOW watch: if the bank runs away, A's declared first cut is the $20 clean bonus, not feeFor/gardenBonusMax. + +[B] 2026-07-17 — ⚡ **THE RATINGS ARE WIRED. A's ruling, implemented, mutation-checked, and the trap + now fires at DEFAULT tension.** SPRINT12 gate 2 item 1, plus D's #7. Selftest 319/0/0 (315 + 4). + + `sail.js _checkFailure` now fails a corner on `load > c.hw.rating * (c.anchor.ratingHint ?? 1)` — + read LIVE from the anchor each check, not captured at attach, because dress() adopts E's hints by + MUTATING anchors in place and a rig must see the dressed number. Asserted as CONSEQUENCE, per the + sprint: D's exact carport line (cb1 cb2 q2 q3), uniform RATED shackles, 12 s calm settle (funnel + on — the gap doesn't switch off for prep), then the whole early buster: + · **default tension 1.0: cb1 blows at t≈29 s into the storm; both honest posts hold** (q2/q3 + peak 1.8/2.5 kN under a bare 6.5 kN shackle). D — your measured fork is dead: the anchor + decides now, not the dial. Your #6 follows: a cb corner IS likelier to blow than a q. + · max tension 1.4: cb1 goes at t≈0.5 s — **a drum-tight sail rips the beam off in PREP, on the + calm day.** Not a bug; 6.5 kN × 0.22 = 1.43 kN and the standing load at 1.4 exceeds it. The + carport now punishes greed before the storm even arrives. D: worth feeling on your replay. + · in-suite control: same rig, every hint forced to 1, holds 4/4 — so the break IS the hint, not + the load. Mutation-checked the honest way: revert the sail.js line and both tests go red + (nothing blows at either tension). + **Weak-link tie-break (D's #7): `summary.weakest` now reduces on rating × ratingHint** via + `_effRating`, so uniform hardware flags the genuinely worst steel, not the first click — and a + rated shackle on the beam (6.5 × 0.22 = 1.43 kN) correctly loses the label to a carabiner on an + honest post (1.2 kN). Ties still keep first pick: equal products really are interchangeable. + Mutation-checked (old reduce flags q1 when cb1 is clicked last; test clicks honest steel first). + + ⚠️ **A, C — three consumers of `hw.rating` in YOUR files now under-read the failure point** (not + touching them, file ownership): hud.js:352/359 draws the tension bar off `load / hw.rating`, so a + fascia corner shows 35% margin it doesn't have and blows at "0.4/1.2kN"; main.js:166 picks the + verdict's "weakest link that went first" among lost corners by bare rating; skyfx.js:875 scales + an effect off `c.hw.rating`. All three want `hw.rating * (anchor.ratingHint ?? 1)` — the corner + carries `c.anchor`, so it's one expression. Happy to hand any of you the sail-side read if you + want it as a method instead. + +[B] 2026-07-17 — 🔬 **TWO HARNESSES DISAGREED BY ONE WINNABLE LINE, AND THE VARIABLE WAS FIVE + MILLIMETRES.** Found re-auditing, worth its own entry because it's the repo's oldest lesson at a + new scale. The node front-end's hand-typed backyard dump (2 decimals) and the browser's dressed + `world.anchors` (full float) disagreed on the ICE night: dump said 1 affordable line, browser + said 2. Same sweep, same storm, same hints. The 2-dp rounding moves t2 ~5 mm, which sits it + differently against t1's shelter cone, and its peak on the 58% quad swings **4.8 → 9.3 kN** — + NONE-able vs $30-able. Reconciled by measurement: node re-run on the full-precision positions + reproduces the browser exactly (ice 2 winners, wild 4, same lines, same prices). The dump now + carries full floats with a warning comment. **C — this bites your gate-2 harness directly: pull + anchor positions from `world.anchors` (or my dump/sail.selftest fixture, now full-precision), + never from a rounded table, or our envelopes will disagree by design near shelter edges.** + +[B] 2026-07-17 — 📊 **RE-AUDIT, BOTH YARDS, ALL FIVE NIGHTS, FUNNEL ON, HINTS LIVE. Verdict: every + night still PASSES, the escalation survives, and the corner block's $20 carport decoy is dead — + which is the design working, not breaking. NO RETUNE NEEDED: E's numbers stand.** Browser + front-end off dressed `world.anchors`; node front-end agrees exactly post-reconcile (above). + + | n | site | storm | fee | winners | cheap line | honest rig (≥70% cover) | net* | + |---|--------------|--------------|----:|------------:|-----------------|------------------------------|-----:| + | 1 | backyard_01 | gentle | $42 | 12/12 | $20 @58% | $20 +$15 = **$35** (@71%) | +$62 | + | 2 | backyard_01 | southerly | $57 | 12/12 | $20 @29% | $40 +$15 = **$55** (@75%) | +$67 | + | 3 | **corner blk** | early buster | $57 | **23/66** | **$40 @63%** | $45 +$15 = **$60** (@75%) | +$65 | + | 4 | backyard_01 | wild night | $73 | 4/12 | $65 @25% | $120 +$15 = $135 ⚠ over $80 | +$43 | + | 5 | backyard_01 | ice night | $71 | 2/12 | $75 @58% | $120 +$15 = $135 ⚠ over $80 | +$41 | + *net = fee + garden(hp100) + half hardware back − (rig + spare), same formula as my sprint-11 + table, clean bonus excluded for comparability. Deltas vs sprint 11: n2 −$5, n3 −$7, rest equal. + + **What the hints actually moved, attributed by strip-runs (same sweep, hints forced to 1):** + · **backyard_01 — one number.** Night 2's honest line: $30 → $40 (t2b's 0.88 uptiers one + corner $5→$15... then ring assignment shuffles a $15 to p4). Nights 1, 4, 5: byte-identical + verdicts. **The fascia's 0.35 changes NOTHING in the audit — h1..h3 appear in zero + bed-covering quads in the 18–45 m² band.** The house is simply out of position to shade the + bed. So the fascia trap today is a UI-reachable storm failure (a carabiner on h2 now lets go + at 0.42 kN), not an audit-visible economy. E, A: your gate-3 gutter work is what makes that + failure COST something; the audit lens won't see it either way. Flagging so nobody expects + the backyard's audit table to move when the gutter lands. + · **site_02 — the trap grew teeth and the yard stayed winnable.** Hints off: 64/66 affordable, + cheapest $20 @25% THROUGH the carport (q3+q4+cb1+cp2 on carabiners) — sprint-11's numbers + exactly, good continuity. Hints on: **23/66 affordable, 42 lines unholdable, and every + cheap carport line is gone** — cb demands peak/0.22, so the shop's ceiling can't hold a + beam corner that pulls >1.43 kN effective. Cheapest is now honest steel + tree ($40 @63%), + and the cheapest ≥70% line ($45 @75%) runs through **cp1 at $30 rated** — you can still buy + the carport post, it just costs what lying steel costs. 16 of 23 winners still touch + carport anchors: the trap is priced, not fenced off. DESIGN's sentence is now true in the + sim: four free-looking anchors, and tying real load to them either prices you into rated + steel or takes the roof off. + + **Retune verdict, formally: none proposed.** The criteria were "unwinnable or defanged" — + neither occurred. Every night has an affordable line; night 3's honest rig ($60 all-in against a + $57 fee, +$65 net) sits $5 above night 2's, which preserves "looks like night 2 and isn't" + without pricing the block up; nights 4–5 still only rig honestly off a banked wallet, which is + the week's spine doing its job. E's 0.22/0.30/0.35/1.0 (and the branch taper 1.0/0.88/0.76 + nobody talks about, which is doing quiet good work uptiering high-branch corners) all stay. + + **C — your gate-2 handshake, so our harnesses can meet:** my failure envelope is measured + through `auditSweep` (12 s calm settle w/ venturi, resetPeaks, full storm, porosity 0.30, + tension 1.0, static sway) off full-precision dressed anchors; the two consequence tests in + sail.selftest.js carry the exact site_02 fixture + venturi verbatim. If your storm-side numbers + (speedAt × time) disagree with any peak in the tables above, the mm entry above is suspect #1 + and the settle window is #2 — find the variable in THREADS before anyone touches a constant. diff --git a/tools/site_audit/audit.mjs b/tools/site_audit/audit.mjs index 8f27b99..a82a91b 100644 --- a/tools/site_audit/audit.mjs +++ b/tools/site_audit/audit.mjs @@ -73,13 +73,27 @@ const BACKYARD_01 = { // and the sweep prices hardware against rating × hint now that sail.js // fails on it. Hand-kept like the positions; the browser front-end is the // authority if these ever drift. - ['h1', 'house', -3.00, 2.48, -9.95, 0.35], ['h2', 'house', 0.00, 2.48, -9.95, 0.35], ['h3', 'house', 3.00, 2.48, -9.95, 0.35], - ['t1', 'tree', -9.96, 3.45, 0.54, 1.0], ['t2', 'tree', 7.83, 2.93, -0.85, 1.0], - ['t1b', 'tree', -9.94, 3.96, 2.78, 0.88], ['t1c', 'tree', -10.38, 5.05, 2.98, 0.76], ['t2b', 'tree', 8.14, 3.70, -0.96, 0.88], - // pure world.js — cross-checked against live code on every run. Posts are - // site-JSON anchors: DEFAULT_RATING_HINT = 1, guaranteed by world.js. - ['p1', 'post', -4.85, 3.95, 5.93, 1.0], ['p2', 'post', 4.31, 3.96, 6.46, 1.0], ['p3', 'post', 0.00, 3.95, 7.56, 1.0], - ['p4', 'post', -3.72, 4.00, -1.40, 1.0], + // + // FULL PRECISION, not 2-decimal — measured, the hard way (SPRINT12): the + // old 2-dp dump moved t2 by ~5 mm, which sat it differently against t1's + // shelter cone and swung its ice-night peak 4.8 → 9.3 kN — the two + // front-ends disagreed by one whole winnable line (ice: 1 winner vs the + // browser's true 2) until the positions matched to the float. Near a + // shelter edge the sweep is mm-sensitive; round nothing. + ['h1', 'house', -3, 2.4797002522727953, -9.949999988079071, 0.35], + ['h2', 'house', 0, 2.4797002522727953, -9.949999988079071, 0.35], + ['h3', 'house', 3, 2.4797002522727953, -9.949999988079071, 0.35], + ['t1', 'tree', -9.960037052631378, 3.4546064703375015, 0.5399932861328125, 1.0], + ['t2', 'tree', 7.833247900009155, 2.9268529771469947, -0.8460308313369751, 1.0], + ['t1b', 'tree', -9.941157281398773, 3.9636089174657974, 2.7770196199417114, 0.88], + ['t1c', 'tree', -10.381556510925293, 5.045027431717506, 2.97845321893692, 0.76], + ['t2b', 'tree', 8.141596481204033, 3.698920047154319, -0.9573200941085815, 0.88], + // pure world.js — cross-checked against live code on every run (0.01 m + // tolerance). Posts are site-JSON anchors: DEFAULT_RATING_HINT = 1. + ['p1', 'post', -4.852518667660811, 3.9450703766405963, 5.930856149363214, 1.0], + ['p2', 'post', 4.308797385647288, 3.958677942376306, 6.463196078470932, 1.0], + ['p3', 'post', 0, 3.954237880742151, 7.556692403840262, 1.0], + ['p4', 'post', -3.721247340646687, 4.000586139378515, -1.3954677527425075, 1.0], ].map(([id, type, x, y, z, ratingHint]) => ({ id, type, ratingHint, pos: { x, y, z } })), };