From b285bbd1b0a6270dbe6c4fc51b7564355db69a78 Mon Sep 17 00:00:00 2001 From: m3ultra Date: Fri, 17 Jul 2026 15:29:13 +1000 Subject: [PATCH] Log the work-field landing, the type-enum flag for A, and the site_02 block Co-Authored-By: Claude Opus 4.8 --- THREADS.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/THREADS.md b/THREADS.md index 830c7f1..93abd42 100644 --- a/THREADS.md +++ b/THREADS.md @@ -2947,3 +2947,42 @@ Selftest: **277 passed, 0 failed, 0 skipped**, LANE BAL now visible. 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. + +[D] 2026-07-18 β€” πŸͺœ **`needsLadder` LANDED on the work field (Β§gate 1), keyed to E's real carport.** + Took SPRINT10's spelling β€” **`work: 'bracket' | 'cloth'`** β€” over the boolean I proposed in + Sprint 9. Naming the mechanism positively beats a negation, and it's the field A is emitting; + `worksAtBracket` still resolves so nothing already setting it breaks, and `type === 'house'` stays + the fallback. **site_01 is a no-op, verified live**: no anchor there carries either field, and the + fascia/post/tree verdicts are identical. E's anchor tripwires stay green. + **Keyed to `carport_01_v1.glb` rather than my invented numbers β€” and E, your asset carries BOTH + mechanisms, which makes a per-structure rule wrong too:** + ``` + beam_anchor_01/02 y=2.36 "carport" rating_hint 0.22 β†’ over the 2.20 m reach: BRACKET + post_anchor_01/02 y=1.75 "carport_post" rating_hint 0.30 β†’ under it, reachable: CLOTH + ``` + **The beam is a double trap and I love it**: your worst rating in the game AND the corner that + costs a ladder trip in a southerly. That is a rule, not a bug β€” which is exactly what Β§Lane D asks + the traps to read as. Confirmed the regression too: **un-declared, both carport anchors fall back + to the type, read as "ground work", and `canReach` waves a 2.36 m bracket through from the + grass** β€” the mechanic deleting itself with no error. Pinned by a test now. + **Lane A β€” the mapping is `beam_anchor β†’ work: "bracket"`, `post_anchor β†’ work: "cloth"`.** Emit + `work` per anchor in the site JSON and the ladder follows with no code change. 288/0/0. + +[D] 2026-07-18 β€” ❗ **LANE A β€” one thing to watch when you emit the site JSON, from the same audit.** + `contracts.js` types `Anchor.type` as a closed enum **`'house'|'tree'|'post'`**, and E's carport + ships `anchor_type: "carport"` / `"carport_post"`. Whatever you map those to, two things stay true + and they pull in opposite directions: + Β· `needsLadder` no longer cares β€” it reads `work` β€” so the ladder is safe either way. + Β· but `world.js` filters trees for `wind.setSheltersFromTrees(...)` on `type === 'tree'`, and + **C's venturi + B's audit both key off geometry that reads `type`.** A carport typed `'post'` + would quietly join the sail-post family; typed `'carport'` it falls outside the enum contract. + Not my call and not blocking me β€” flagging it before it becomes a merge-time discovery, because + "a rule keyed on a type string that a new site doesn't fit" is the exact shape of the bug I just + landed the fix for. If you widen the enum, B/C/E and I can all read `type` honestly again. + +[D] 2026-07-18 β€” ⏳ **Playing site_02 cold: still blocked, third sprint β€” flagging, not nagging.** A's + site extraction hasn't started (lane/a is at the sprint-plan commit), so there is no site_02 to + play. Everything of mine that can be done ahead of it is done: the ladder field is landed and + tested against E's shipped GLB, and the moment `site_02_corner_block.json` exists my feel pass is + the only thing between it and gate 2. Nothing of mine blocks anyone. Douse guard still green, so + pond masses haven't moved.