# SPRINT 12 — THE STEEL TELLS THE TRUTH, AND THE PAPERWORK LOOKS THE PART *Sprint 11 delivered everything it named: the venturi reconciled (twice — both directions of the same lesson), the enum checked, the carport priced and billing, the job sheet quoting before you spend, the invoice with C's resolving forecast on it, and — the door in front of all of it — B's `setWorld`, so night 3 is playable by mouse. 315/0/0, verified live at integration. What's left is one ruled-but-unwired mechanic (the ratings), one unpriced failure (the gutter), one unpasted kit (E's letterhead), and the five-sprint debt at the top of this file.* Read THREADS from the last [I] entry. ## Gate 1 — JOHN PLAYS THE WEEK (fifth sprint standing — the excuse is gone) The week is reachable end to end for the first time. `cp .claude/launch.example.json .claude/launch.json`, `python3 server.py --port 8823`, play all five nights with the mouse, three sentences in THREADS. - Sprint 13's branch — **more sites vs reputation/warranty vs heatwave days** — is decided by those sentences and by nothing else. Everyone else's gate-2 work below is deliberately branch-independent. - Watch the bank. A competent clean week now banks $485 (§BROKE_BELOW). If it reads as money losing its meaning, A's declared first cut is the $20 clean bonus — newest number, least load-bearing, per-job data. ## Gate 2 — WIRE THE RATINGS (B owns; A's ruling is in THREADS, sprint 11) The trap is priced but not weak: `sail.js` fails a corner on `c.hw.rating` alone, so "the worst steel in the game" is currently just the worst bill, and the lever that decides whether the trap fires is tension, not the anchor (D, measured). 1. **B: land the shape** `load > c.hw.rating * (anchor.ratingHint ?? 1)`. world.js now guarantees the field (DEFAULT_RATING_HINT = 1); the `?? 1` is belt-and-braces. Assert the consequence, not the formula: at max tension through the funnel, a **cb** corner must blow before a **q** corner. 2. **B: re-audit BOTH yards the moment it lands.** E's baked hints (beam 0.22, post 0.30, fascia 0.35, tree 1.0) will move the balance of everything with a GLB anchor — the backyard's fascia and posts included. Post the winnable lines per night like the sprint-11 table. **The numbers are E's**: propose retunes in THREADS with the audit as evidence; don't quietly nudge. 3. **D: replay both yards after the wiring.** Your measured fork (tension 1.0 → q3 blows, carport free; 1.4 → cb1 blows, −$205) should now bite at default tension. The ladder trip should fire by itself (your #6). And your #7: **B fixes the weak-link tie-break** (rigging.js reduces with strict `<` — flag the lowest `rating × hint`, not the first click). 4. **C: second harness on the envelope.** B measures failure thresholds through the audit; you measure the same envelope through the storm (`speedAt` × time, both yards). Two harnesses, one number — the repo rule. If they disagree, find the variable before anyone retunes. ## Gate 3 — THE PAPERWORK AND THE GUTTER (A + E; the invoice earns its ABN) 1. **A: paste E's kit** — `tools/jobsheet/index.html`, between the CUT markers, purely additive by construction. Keep `.void` (the struck-through dead bonus is the invoice teaching the player what to protect). Two rulings while you're in there: the **HARD YARDS** masthead (E's reasoning is in the tool; a surname mark waits for a named player) and the **sequential ABN stays sequential** — it reads as "example" the way 555 numbers do. Don't fix it into a real business's tax identity. 2. **A: wire the bike** — site-JSON key + loader line, the gnome pattern. Read E's lean note first: it leans **−Z in three.js**, toward the fence; bars ~0.10 m off the palings. Rule on E's $60: a bike in a 32 m/s funnelled southerly that ignores the gust is a worse lie than no bike. 3. **E: price the gutter and build its wreck** — the carport pattern, your second time around: propose the number with reasoning baked beside it, ship the torn-gutter wreckage that swaps on the same event. With fascia 0.35 wired (gate 2) and the gutter priced, backyard_01 grows its own honest trap — DESIGN.md's fascia lie ("holds until the first real gust, then rips off taking the gutter with it") finally true in the sim. **A rules the number; `collateralFor('gutter')` stops returning null.** 4. **C: the change announces itself.** The corner block's thesis is "looks like night 2 and isn't" — the 18 s early change. Give the southerly buster its in-world tell (skyfx is yours): the sky darkening from the south, the lull before the shift — readable by a player watching the yard, not the data. Deterministic off `(dt, t)` like everything else. D judges whether it telegraphs without spoiling. ## Gate 4 — SPRINT 13'S BRANCH (integrator + John, end of sprint) Named early so nobody half-builds it: reputation/warranty (DESIGN.md's consequence loop — the invoice now exists to hang it off), site_03 (a third yard is cheap now that sites are data), or the heatwave day (slow-pressure levels, the other half of the design). Decided on John's sentences, not before. Do not start any of the three this sprint. ``` gate 1: John's three sentences in THREADS gate 2: ratings wired · both yards re-audited · retunes proposed not nudged · D confirms the trap fires at default tension · weak-link honest gate 3: letterhead + invoice pasted (.void survives) · HARD YARDS ruled · bike wired and ruled · gutter priced, wrecked, and billing gate 4: Sprint 13 branch chosen, in writing, in THREADS ```