HardYards/SPRINT12.md

94 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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