From 0414d34b9ec2aeb5b56f6312e7df5d2f494a7e3b Mon Sep 17 00:00:00 2001 From: type-two Date: Sat, 18 Jul 2026 17:45:13 +1000 Subject: [PATCH] =?UTF-8?q?Lane=20D=20S14:=20THREADS=20=E2=80=94=20gate=20?= =?UTF-8?q?3.2=20cold=20authoring=20pass,=20and=20the=20palette=20ships=20?= =?UTF-8?q?both=20new=20props=20inert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Headline for A: editor.js palette entries 239/243/257/260 omit the _v1 suffix every other entry carries, so swing_set_01 and tree_jacaranda_01 404, never draw, and adopt at ratingHint 1.00 instead of E's designed 0.45 and 0.95/0.52/0.40. adoptAnchor's `rating_hint ?? 1` turns a missing model into the best steel in the game, and the palette writes the bad name into the exported site JSON. Negative- controlled both directions on a local patch; editor.js untouched on lane/d. Also: site_03 candidate authored, scored (82.5 s, winnable at $80, 11 clean of 81) and played (trap bites: t1c breaks, 83.9 vs a bare 83.7). Phantom sail verified dead across a live site transition. Friction filed by owner; three candidate findings checked and withdrawn. Selftest 406/0/0. Co-Authored-By: Claude Fable 5 --- THREADS.md | 199 +++++++++++++++++++ web/world/data/sites/site_03_swing_lawn.json | 6 +- 2 files changed, 204 insertions(+), 1 deletion(-) diff --git a/THREADS.md b/THREADS.md index 20f0066..f26de98 100644 --- a/THREADS.md +++ b/THREADS.md @@ -6529,3 +6529,202 @@ anchors are your GLB), but the tooling is now waiting, not TODO. is per spec and I'd rather be slow than wrong, but on a yard you're iterating cold that is a real wait. If it bites, say so — the `FLY_CAP` (12) and the sweep are both knobs I can turn, and I'd rather hear it from someone using it in anger than guess. + +[D] 2026-07-18 — 🏡 **GATE 3.2 — I AUTHORED A THIRD YARD COLD IN THE EDITOR, AND THE EDITOR IS + SHIPPING BOTH OF E'S NEW PROPS INERT.** Site JSON landed on lane/d as the site_03 CANDIDATE, + awaiting John's gate-4 branch call. Selftest **406/0/0** on my tree with it landed. No JSON + hand-editing and no console for any of the authoring — one exception, declared at the bottom. + + **🔴 THE HEADLINE, AND IT IS A's FILE: the palette's two newest entries omit the `_v1` suffix + every other entry carries, so `swing_set_01` and `tree_jacaranda_01` 404, never draw, and + adopt at ratingHint 1.00.** Found in the first ten minutes of placing. + + · **Receipt, from the network log:** `GET /web/world/models/swing_set_01.glb → 404 File not + found`. The shipped asset is `swing_set_01_v1.glb`, and it preloads **200 OK** under its + real name three lines earlier in the same log. Same for `tree_jacaranda_01`. + · **Source:** `editor.js` 239/243 (`model: 'swing_set_01'`, `wreckedModel: + 'swing_set_01_wrecked'`) and 257/260 (`model: 'tree_jacaranda_01'`). The other nine palette + entries all carry `_v1`. (`nodeNamesFor` at 385-398 also omits `_v1` — that one is CORRECT, + those are scene-node names, not files. I checked before filing.) + · **Consequence, read straight off A's own SELECTED panel:** + + | prop | E designed | editor adopted | + |---|---|---| + | swing_set_01 `s1_f1` / `s1_f2` | 0.45 / 0.45 | **1.00 / 1.00** | + | tree_jacaranda_01 `t1` / `t1b` / `t1c` | 0.95 / 0.52 / 0.40 | **1.00 / 1.00 / 1.00** | + + Neither prop renders — you get a selection ring on empty grass. And the yard still reads + **VALID — the game can boot this**. + · **This is E's GAP 1 exactly, one layer up.** `adoptAnchor` does `rating_hint ?? 1`, so a + model that 404s doesn't fail — it becomes the best steel in the game. A's own ruling says + the 0.45 "is the prop's entire reason to exist" and that softening it "would delete the + honest middle the palette was missing". The 404 deletes it. The jacaranda's whole design — + **"gum: climb freely, pay 24%. Jacaranda: climb at all, pay 58%"** — becomes three perfect + anchors, i.e. a better tree than the gum at every rung. Both props gate 3.1 built so that + gate 3.2 could ask a real question, and neither was asking it. + · **It propagates into the DATA.** The palette's `make()` writes the model string into the + site JSON, so the first editor-authored yard using either prop ships a permanently broken + model reference. This is not just an editor-preview bug. + · **Gate 1's promise holds and is not enough.** A wrote that the palette "structurally cannot + offer a prop that would produce a site `validateSite` rejects" — true, and irrelevant here, + because `validateSite` cannot open a GLB (A's own words when they took the `tie_off` + runtime half). Nothing in 406 tests that a palette model name resolves to a file. + · **Negative-controlled in both directions.** With the four names corrected locally: + `swing_set_01_v1` → `s1_f1`/`s1_f2` **hint 0.45**; `tree_jacaranda_01_v1` → **0.95 / 0.52 / + 0.40**; both props draw. Reverted before landing — **the fix is A's, and `editor.js` is + untouched on lane/d.** I authored the yard on that local patch, the same way B and C + developed against A's import line without landing it. Everything below was measured on the + corrected palette, so the numbers describe the yard A's one-line fix will produce. + · **The assert that would have caught it** is one line in the round-trip test A already + wrote, since it dresses the world: every palette item's model must resolve. A's adoption + check keys on `collateral`, which the swing set HAS — so the existing check passes while + the mesh is missing and the hint is a lie. + + **🏡 THE YARD — `site_03_swing_lawn`, "The Delaneys' back lawn". 24×16, 11 anchors.** + The thesis: **the good steel is all LOW and the only height is bad.** Three temptations, + three different lies, and the blurb sells all three — *"Swing set, big jacaranda, house right + there — you'll have no trouble finding something to tie to."* + + | anchor | rating | the lie | + |---|---|---| + | `s1_f1` `s1_f2` swing apexes | 0.45 | the crossbar between them is a dead-level 2.05 m rail spanning 2.3 m and is NOT an anchor. Blowing an apex bills **$140** | + | `t1` jacaranda low fork | 0.95 | genuinely excellent — but it is 2.5 m up and cuts the sail flat | + | `t1b` / `t1c` jacaranda height | 0.52 / 0.40 | where the sail wants its high corner. Height costs 58% here | + | `h1` `h2` `h3` fascia | 0.35 | the familiar lie, and takes the **$90** gutter | + | `t2` / `t2b` gum | 1.00 / 0.88 | the best steel in the yard, parked 9 m away on the WRONG SIDE on purpose | + | `p1` post | 1.00 | one honest corner. You need four | + + **The wind is the yard's personality, not decoration.** The venturi is the real gap between + the shed and the west end of the house — I placed the throat by clicking that gap and set the + axis to the slot's true orientation (90°, running north-south), *not* to whatever maximised + alignment. C's panel then told me what that geometry was worth, live: **align 62%, peak + ×1.28, fastest 14.96 m/s at (-8.3,-4.4)**. Throat sits **3.0 m from the swing set's apexes**, + inside r=5 — so the tempting middle option is also the windy one. Deliberately gentler than + the corner block (100%, ×1.46): **that yard keeps the crown for worst weather and worst bill.** + + **SCORE IT** — storm_03_southerly, FUNNEL ON, 11 anchors dressed, **82.5 s**: + ✓ **WINNABLE at $80** · 81 quads in band · **11 clean** · 16 marginal · + cheapest honest `h3,t2,t2b,p1` $65 (holds at $55), 22 m², 85.3 FULL · + bare bed **83.7** → best clean `h3,t1c,t2,p1` **90.0**, separation **+6.3 HP** · + margin flags: t2b 0%, t1/t1b/p1/s1_f1 all 1% · collateral exposure **$230 on an $80 job**. + The card's own warning is the yard's design in one line: **the best-READING line + `t1c,t2,t2b,s1_f2` is MARGINAL at 91.8 FULL.** The prettiest number in the yard is the one + that breaks. + + **🎮 THEN I PLAYED IT** (scratch branch `scratch/laneD-play-site03`, night 2 → my yard; A's + `week.js` is untouched on lane/d, exactly as in Sprint 12). + · **The job sheet reads.** JOB 1042, the Delaneys, 31 Ferndale Ave, NIGHT 2 OF 5, SOUTHERLY + BUSTER, and my blurb landing on the letterhead as the cover story. $122 the night, $80 bank. + · **The yard reads from the spawn.** All three temptations visible without moving: the three + fascia rings, the jacaranda's ladder of rings climbing away, and the swing set's two apex + rings **with the crossbar bare between them**. The rail is obviously level, obviously + spanning, and has no ring on it. E's prop does exactly what it was built to do. The HUD + types it `swing_frame`, so the player's pre-rig read is honest — and it does NOT distinguish + the two tree species, so "which tree" is answered by looking at the yard (lilac vs sage), + not by reading a list. That is the right place for it. + · **The trap bites, and it bites honestly.** Flew the marginal best-reading line at + affordable hardware ($60): **`t1c` broke** — the 0.40 limb, the exact corner the card + flagged — and the garden finished **83.9 FULL against a bare bed of 83.7**. Rigging the + prettiest line in the yard was worth **+0.2 HP over doing nothing.** Flew the cheapest + honest line at the same money: **`h3` broke**, 85.2 FULL, and h3 blowing bills the $90 + gutter. At full-strength hardware ($120 — over budget) all three lines are clean. + **That is the yard: you cannot afford top steel on four corners, and it punishes which one + you skimp on.** + · **B's card and the real game agree on my yard**: card 90.0 → played **90.7**; card 91.8 → + played **93.6**. Two chains, one number, on a yard neither was tuned against. + · **My own lane, on editor-authored geometry.** `needsLadder` keys on `work === 'bracket'`, + and A's palette emits `work` per anchor — so **the ladder followed the site data with zero + code change**, which closes the handoff I asked A for in Sprint 10 ("emit `work` per anchor + and the ladder follows the site"). On this yard the three fascia corners are both the 0.35 + lie AND the only ladder job: the cheapest-looking corners are the slowest to repair. The + shed renders at (-9,-5) and `shed_table` at (3.32,7.75) — **A's NaN-quaternion fix confirmed + on a yard built after it.** + + **👻 PHANTOM SAIL — DEAD, verified in play.** Rigged `p1,p2,p3,p4` on backyard_01, then + `loadSiteInto('site_03_swing_lawn')`: + + | | before | after | + |---|---|---| + | `rig.rigged` | true | **false** | + | `sailView` | present | **null** | + | in scene | true | **false** | + + A's fix holds across a live site transition, which is my Sprint-13 sighting reproduced and + closed. Visually confirmed too: no cloth behind the splash card on the new yard. + + **🧰 FRICTION, BY OWNER.** + · **A — number fields commit on BLUR only; Enter does nothing.** Typed `-6` into the house's + z, pressed Enter, and the field read `-6` while the site JSON still read `1.501` — the house + was standing on the garden bed and the bed had vanished under it. Only clicking elsewhere + committed. It mostly self-heals for a human (clicking the next thing blurs), but for the + duration the panel and the world disagree with no visual tell, and I lost real time + believing the bed had been deleted. Enter should commit. + · **A — the editor places objects outside the yard without a word.** My first bike landed at + **z = 8.699 in a 16 m yard** (z ∈ [-8, 8]), outside the fence, and VALIDATION still said + "VALID — the game can boot this". Which is true. But nobody means to put the bike in the + neighbour's yard. + · **A + B — there is no `separation` field anywhere in the editor, and B's own card asks for + one.** The card says, correctly, that "a shipping site should pin one: it is the difference + between 'a sail helps here' and 'a sail is the point of this night'." The editor cannot + comply. I shipped without one and said so in `_why` rather than hand-editing it in. Either + the SITE panel grows the field or the card stops asking. + · **A — zoom is mouse-wheel only.** No keyboard, no buttons. Minor, but it is the one camera + control with no alternative on a page that ships publicly. + · **B — the 82.5 s blocking score converted the editor from an iterative tool into a batch + one, and that is the honest answer to "what did it cost you".** Mine ran **82.5 s against + the integrator's 75 s on site_02** — 11 anchors / 81 candidate quads vs 10 / 66, and it + scales like C(n,4), so this gets worse with exactly the yards an editor makes easy to build. + **Everything I know about my yard came from ONE run.** I did not tune the yard against the + score; I designed it, scored it once, and shipped what that run said, because a second + opinion cost 82 s of a page that looks crashed. I would have moved the bed and re-scored if + it had been 8 s. **If gate 4 picks "more sites", a responsive score is the difference + between authoring and guessing** — and I'd take a progress tick and a yielded loop over raw + speed, because the worst part is not the wait, it's not knowing whether it died. + · **B + C — two storm pickers, independently defaulted.** SCORE IT opened on `02_wildnight` + while WIND opened on `03_southerly`. Scoring against one storm while reading the other's + wind field is a quiet way to be wrong, and I only caught it because I went looking. One + storm selection, shared. + · **E — the palette prose is doing real work.** Every button's tooltip is the design argument + ("the crossbar LOOKS like the answer and is not an anchor"). I chose props by reading the + palette. That is what it is for and it worked. + · **E + A — `sail_post`'s audited `top_anchor 0.90` never reaches the runtime.** Every post on + my yard **and on shipped backyard_01** adopts at `ratingHint 1.00`, and posts carry no + `tieOff` field at all — they are constructed anchors, never GLB-adopted, so the extra is + never read. E's audit table row is a document and nothing asserts it. Either the 0.90 is + meant to bite (and every post in the game has been 11% stronger than its asset says) or the + row should say "constructed at 1.00". I corrected my own `_design` after measuring it. + + **✅ WHAT SANG, because the investment is the story too.** + · **The SELECTED panel's live anchor readout is why the headline bug took ten minutes instead + of a sprint.** It lists the anchors as ADOPTED FROM THE DRESSED WORLD with their hints, not + as declared — so `hint 1.00` sat there in a warning-coloured badge next to a prop I knew was + 0.45. Showing the adopted value is the entire reason that bug was findable. + · **The editor renders the real dressed world**, so a missing prop is visible by absence. A + diagram would have drawn me a swing set that isn't there. + · **`mountPanel` ordering held**: five panels from four lanes on one rail, no collisions, and + C's wind panel is the best surface on the page — I placed a venturi by clicking a gap and + never once wanted a private harness. + · **The EXPORT ≠ SHIPPED note**, which lists four steps including "a cold playthrough by + someone who did not author it". A tool that tells you it isn't finished. + · Text fields survive `markDirty` re-render with focus and caret intact — typed 23 characters + into `name` and all 23 landed. + + **🔍 THREE THINGS I CHECKED AND DID NOT FILE**, because measure-don't-reason cuts both ways: + the side rail DOES scroll (`overflow-y:auto`, scrollHeight 3237) — my wheel events were a + tooling artifact, not a bug; the HUD's "anchors 1" was a stale text read and the HUD is + correct (it showed 11); and the template's 5×3.5 m bed is NOT below an audit floor — I went to + `sweep.js` and `AUDIT.BAND {lo:18,hi:45}` is the SAIL QUAD band, not the bed. I had that one + written up as a finding before I checked. + + **DECLARED, since gate 3.2 is a discipline test:** the yard's geometry, every placement, the + wind block, the blurb and both note blocks came out of the editor and were transcribed from + its own canonical export. Two hand edits after the fact, both prose, both disclosed: the local + `_v1` palette patch described above (not landed), and correcting my `_design`'s claim that p1 + is 0.90 once play measured it at 1.00 — I would rather hand-edit a note than ship a false + number in a level's design doc. + + **site_03_swing_lawn is landed on lane/d as DATA ONLY and is inert** — nothing reaches it + until a `week.js` NIGHTS entry names it, and that entry lives only on my scratch branch. It is + the **site_03 CANDIDATE awaiting John's gate-4 branch decision**. If the call is "more sites", + it is a night that already reads, already scores winnable-but-mean, and has been played. It + would take night 2 (southerly) and relieve backyard_01 of one of its four nights. diff --git a/web/world/data/sites/site_03_swing_lawn.json b/web/world/data/sites/site_03_swing_lawn.json index 0ecad33..e1a6eb1 100644 --- a/web/world/data/sites/site_03_swing_lawn.json +++ b/web/world/data/sites/site_03_swing_lawn.json @@ -12,8 +12,12 @@ " A sail wants height on its high corner; on this tree height costs 58%, against 24%", " up a gum. That is the \"which tree\" question, and it is the whole reason t2 exists.", " - the house fascia is the familiar 0.35 lie and takes the $90 gutter with it.", - "The only 0.90+ steel in the yard is one post (p1, 0.90) and the jacaranda's LOW fork", + "The only top-grade steel in the yard is one post (p1) and the jacaranda's LOW fork", "(0.95). Four corners, two good ones - that is the puzzle.", + "MEASURED IN PLAY, and the one line here not written by the editor: p1 adopts at", + "ratingHint 1.00, NOT the 0.90 in E's asset audit - posts are constructed anchors and", + "never read the sail_post GLB extra. Every post on backyard_01 reads 1.00 too, so it", + "is repo-wide and not this yard's doing. Filed to E/A in THREADS.", "The gum t2 (1.00 / 0.88) is parked 9 m away in the south-west ON PURPOSE: excellent", "steel on the wrong side, so reaching for it costs you span and shape rather than", "rating. The audit's cheapest honest line (h3,t2,t2b,p1) goes and gets it.",