# 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
```
