Lane D S14: THREADS — gate 3.2 cold authoring pass, and the palette ships both new props inert

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 <noreply@anthropic.com>
This commit is contained in:
type-two 2026-07-18 17:45:13 +10:00
parent 0b858abc9d
commit 0414d34b9e
2 changed files with 204 additions and 1 deletions

View File

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

View File

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