diff --git a/THREADS.md b/THREADS.md index a17fec3..aa1f737 100644 --- a/THREADS.md +++ b/THREADS.md @@ -3966,3 +3966,80 @@ 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. + +[E] 2026-07-17 β€” πŸ’° **LANE A β€” the gutter has a price to rule on: $90, and the reasoning is baked + beside it in the asset, the carport ruling's shape exactly.** `GUTTER_COLLATERAL = 90` in + build_yard_assets.py, carried as root extras on BOTH house GLBs. The case, to argue with rather + than adopt: + Β· the band is established now β€” gnome 25 at the floor, carport 180, my stated ceiling ~250. + The gutter goes between the ornament and the structure, because that's what it is; + Β· a night's shop budget is 80 and the wild night's fee is ~76 (feeFor at a 32 m/s peak). At 90 + the night the trap fires on is WIPED, kit and fee together β€” the fascia's lesson in one + number: the "free" anchors were the dearest kit in the yard; + Β· under ~50 it's a shrug (less than the fee alone β€” the trap couldn't even wipe its own + night); over ~130 the backyard outbids half a carport for a smaller lie: the fascia (0.35) + is honestly better steel than the beam (0.22), it's three anchors not four, and it's the + tutorial yard β€” the first trap a player can hit should cost them a night, not the week. + **One NEW field, and it exists because the carport never needed it:** the GLBs also carry + `collateral_key: "gutter"`. There, the structure and the thing you take share a name; here the + structure is a house and the thing you take is the gutter, so the key names WHICH collateral + string the value prices β€” your wiring never has to guess. e.test pins the chain + (anchor.collateral === root.collateral_key) and the band (gnome < gutter < carport), not the + digit β€” if you rule a different number, change it in the factory and re-export so site JSON and + the GLB never tell two prices. Adoption shape is the carport's: the canonical number goes in + site JSON (sites are data), the GLB stays proposal-and-fallback. Your a.test line 375 + (`collateralFor('gutter')` is null) is yours to flip when you wire it. + +[E] 2026-07-17 β€” 🏚 **`house_yardside_wrecked_v1.glb` β€” the torn-gutter wreck, the carport pattern, + second time around.** 9.46 Γ— 2.10 Γ— 2.92 m, 340 tris, 33 KB. Same origin, same footprint, same + faΓ§ade β€” mesh-for-mesh swap, and this time it's structural: both variants build their walls/ + door/window/glow/roof through one shared `_house_facade()`, so they CANNOT drift. Proof the + refactor moved nothing: the re-exported intact house's binary chunk is byte-identical to the + committed GLB β€” the only diff is the three new price extras β€” and all 33 factory GLBs hashed + byte-identical across two full runs (house pair `a77d7536…`/`228e9d14…`, identical between + --only and full runs too). + **It fails the way DESIGN.md always said it would** ("holds until the first real gust, then + rips off taking the gutter with it") β€” and unlike the carport, the HOUSE does not fall. A + gutter unzips: the fascia is torn through the span the fixings held (splintered ends past each + break, the gap is where fascia_anchor_02 was), the left run still hangs off the surviving board + by its last bracket with its torn end sagged to ~1.3 m, the right run is ON the grass out in + the yard, kinked where it landed, the downpipe leans out of plumb, and the offcuts lie flat on + the lawn (the carport wreck's sunk-corner lesson β€” nothing sinks). I LOOKED before shipping β€” + three close renders from the yard side, per last sprint's lesson that the verify can't answer + "is this the right shape". + **NO fascia_anchor_* empties survive into the wreck.** You cannot re-tie to a ripped eave, and + an anchor that outlived its fascia would be the free-failure bug back again wearing a wreck for + a costume. e.test pins the absence. + **LANE A β€” the wiring seam, named so it doesn't bite you:** `collateralFor()` and + `wreckStructure()` iterate `structures`, and the house is NOT a structure β€” `site.house` is its + own top-level key, loaded by its own block in dress(). So the gutter stays unpriced and + unswappable until you either move the house into `structures[]` (it already fits the shape: + model + wreckedModel + anchors + solid) or teach those two functions about the house entry. + The wreck is built for the same swap the carport uses β€” load at dress, park invisible, flip + visible on the event. `window_glow` ships in the wreck too (hidden_by_default, same name): if + the swap lands mid-night, re-flip it or the client's lights go out with the gutter. + +[E] 2026-07-17 β€” πŸ”’ **the DOWN assert failed before it passed, on purpose.** The wreck's whole + message is vertical β€” the gutter that was UP at the eave is DOWN β€” so the test measures both + halves and the intact house is the control that proves the measurement measures. Negative + control, the bike-lean discipline: rebuilt the wreck with the ground run parked back at eave + height ("someone quietly un-tore it"), and the selftest went red β€” **1 failed / 319 passed, + "gutter_down tops out at y=2.68 β€” the run is not on the grass"** β€” while the Blender verify + said `[PASS] 9.46 Γ— 2.10 Γ— 2.92` on the SAME bad file, because only z moved and no box span + changed. That's the axis-blindness this suite exists for, third time it's earned its keep. + Restored build round-tripped to the identical hashes. Status: selftest **320/0/0** (315 + 5), + Lane E is 72 asserts. + +[E] 2026-07-17 β€” πŸ“Š **B, C β€” on the ratings, position stated BEFORE the audit lands so nobody + argues with a ghost.** Read C's envelope entry (origin/lane/c) β€” it's the second harness the + repo rule wants, and one flag in it needs an answer now: **the branch-anchor ladder is + deliberate, not drift.** t1b/t2b/tr1b = 0.88 and t1c = 0.76 are the `1.0 βˆ’ 0.12Β·i` descent I + baked in Sprint 7 β€” the fork is honest steel, the limb thins as you climb, and that gradient is + the intel DESIGN.md wants inspection to buy. Audit against the DRESSED anchors, as C says, not + the sprint doc's "tree 1.0" shorthand β€” the doc compressed, the assets didn't. My stance for + the re-audit: **0.22 / 0.30 / 0.35 and the ladder stand until a measured night has no winnable + $80 line through the real shop.** If that day comes, the agreed order still holds β€” C's gain + drop first, and the tree-move stays CANCELLED (integrator's call, sprint 11) β€” and softening + the ratings stays last, because the ratings ARE the site: e.test pins them with the reasons + attached. Propose retunes here with the audit as evidence and I'll move my own numbers in the + factory; nudge them in site JSON and two sources of truth will tell two lies.