# SPRINT 16 — TEETH: YOUR WORK FOLLOWS YOU

*⚠️ PRE-SPECED, FIRES AFTER SPRINT 15 INTEGRATES. Sprint 15 (the post ruling,
the iterative editor, the honest edges) re-measures numbers this sprint pins —
do not start these gates on a pre-15 tree, and treat every number below that
S15's gate-1 re-measure moves as "re-measure first". Written 2026-07-18 at
John's direction (ROADMAP.md — gate 4 of S14 resolved: all three branches,
sequenced, teeth first).*

*The week grows consequences — reputation on the letterhead, warranty on the
job sheet, a sixth night, the swing lawn in the rotation, and the first night
where the default fabric is the wrong answer. Baseline selftest: whatever
Sprint 15 lands (409/0/0 pre-15 plus S15's additions). Keep it green;
mutation-check anything you'd call coverage.*

**The one-variable rule is LAW this sprint (ROADMAP principle 5):** six nights,
exactly one flies the new storm, exactly one is the new site, and they are NOT
the same night. A player who loses night 6 must be able to say whether the yard
beat them or the weather did.

## Gate 1 — THE LEDGER (A owns: week.js, hud.js surfaces, main.js wiring)

Reputation and warranty, hung off the paperwork that already exists. No new
phase, no new sim — this is week-state plus three surfaces telling the truth.

1. **The work history.** Every committed rig is recorded on the week: corners,
   hardware, effective ratings, what broke, what was repaired by dawn. This is
   data the night already computes — the ledger just keeps it.
2. **Warranty.** A corner of YOURS that broke and was still broken at dawn books
   a warranty item: the NEXT morning's job sheet carries it as a line —
   "warranty — q3, shackle, no charge to the client" — and its cost (the
   hardware's shop price, unpaid labour is the point) comes off that night's
   fee AT QUOTE TIME. week.js's own invariant is non-negotiable: the sheet and
   the invoice never diverge — the quote already carries the deduction, so
   settle pays exactly what was quoted. A repair you made mid-storm is NOT a
   warranty item; riding it out broken is.
3. **Reputation.** One number on the letterhead (pick the unit — stars read as
   client-speak; whatever it is, it appears under the ABN on job sheet AND
   invoice, E's letterhead contract). Clean night (no breaks, no collateral):
   up. Warranty item: down. Collateral event: down harder. It MOVES PAY at
   quote time — a trusted outfit's callout fee multiplier, printed on the
   sheet, so the player watches their number become money. Start neutral;
   night 5's beyond-saving garden must NOT cost rep (the flag exists — read it;
   a designed loss the ledger punishes is the verdict lying again).
4. **Aftermath teaches it.** The invoice's verdict line and the end-of-week
   card both speak rep: a week that ends broke-but-clean and a week that ends
   rich-with-warranties are different endings and should read as such.
5. Tests, a.test: warranty fires only on unrepaired breaks (repaired = no
   item); quote==settle holds with a warranty line on the sheet; rep never
   moves on gardenBeyondSaving nights for garden reasons; the multiplier is on
   the sheet the night it applies. Negative control: a clean week books zero
   warranty items and ends rep-positive.

## Gate 2 — THE HEAL + THE PAPER TRAIL + THE PIN (B owns)

1. **Divergence heal.** The review landed the break (a NaN corner now lets go,
   reason:'divergence', production path) — but the freed node then integrates
   from NaN forces and the cloth renders ugly after one. Sanitize on the break:
   any non-finite node position resets from its nearest finite neighbour (or
   the corner's anchor), prev matched so verlet doesn't invent velocity, and
   non-finite water zeroed (a NaN pond re-poisons the heal through the weight
   term). Assert: poison → break → every node finite within 1 s of sim.
   Mutation: heal off, assert red. The existing divergence test must keep
   passing untouched — the heal is IN ADDITION to the break, not instead.
2. **Fabric on the paperwork.** The chosen fabric prints in the prep summary,
   on the invoice, and in the aftermath verdict when it mattered (a membrane
   night survived in cloth should say what the leak cost). The FORECAST half is
   C's (gate 3.3) — yours is that the choice the player made is on the record.
3. **Pin site_02's separation — AFTER S15's re-measure.** The SCORE IT card
   says NONE PINNED and calls it out. Once the post ruling has settled the
   numbers, run gardenfly, pick the honest target, pin the block in site_02's
   JSON, assert it like backyard_01's. If the honest answer is "this yard
   cannot separate held from bare at $80", that is a FINDING about the yard —
   post it in THREADS; the balance fight starts there, not at a fudged pin.
   Same pass, same rule for `site_03_swing_lawn` if S15 left it unpinned.

## Gate 3 — THE MEMBRANE NIGHT + THE SEEDED STORM (C owns)

1. **storm_06 — the pea-hail soaker.** Small stones (under the 2 mm-weave
   ruling's blocking threshold), heavy rain, mild wind. The night the bet
   flips: cloth leaks fine hail onto the bed all night; membrane stops
   everything and the mild wind means its doubled load is affordable — but it
   PONDS, so the broom matters. Author it so both lines exist and the membrane
   line is genuinely better: measure with gardenfly/site_audit (funnel state in
   the header, per the discipline; post-ruling numbers only), pin
   membrane-vs-cloth garden separation in the storm's own selftest, and make
   sure a $80 wallet affords the membrane line on the night's site. If the
   measured numbers say cloth still wins, retune the hail spectrum until the
   bet is real — the storm exists to make the F key matter, and a decoration
   night is worse than no night.
2. **makeStorm(seed) — groundwork, not a shipped night.** A seeded generator
   inside authored envelopes (base curve, gust budget, direction change window,
   rain/hail ranges as data), producing storm defs that pass the schema
   validator and the storm_envelope harness. Deterministic from seed —
   ROADMAP arc 4's roguelite eats this. Selftest: same seed → byte-equal def;
   100 seeds → all schema-valid, all inside the envelope; a seed that violates
   the envelope is a red test, not a shrug.
3. **The forecast argues the bet.** Hail stone size and rain rate join wind on
   the job sheet's forecast block (the data is in the storm JSON; A prints
   what you expose). The band-not-a-promise rule holds — forecast bands, real
   values inside them.

## Gate 4 — THE SIX-NIGHT WEEK (D owns)

1. **The swing lawn enters the rotation.** Your site_03_swing_lawn landed in
   S14 — authored cold, scored, played, inert. Re-score it on the post-ruling
   tree with S15's faster loop (the numbers that made it winnable-but-mean may
   have moved), fix what moved, then wire it into NIGHTS. If S15's edges work
   added a separation field or B pinned one for it, carry it; otherwise gate
   2.3 covers it.
2. **The week becomes six nights.** Wire the swing lawn and storm_06 into
   NIGHTS under the one-variable rule: the new site debuts on a storm the
   player has already survived; storm_06 flies over a yard they already know.
   You own the order and the two new briefs (client flavour is data — the
   corner block got a name and a reason; the swing set's kid deserves one
   too). Night 5's beyond-saving flag and going-broke-never-on-the-final-night
   must both survive re-ordering — the a.test week asserts will tell you.
3. **Cold-play the whole six**, wallet from night 1, and file the verdict:
   does a warranty callout read as FAIR when it lands on your sheet? Does rep
   moving pay feel earned or arbitrary? Is night 6's bet legible from the
   forecast alone? Your play IS the acceptance test for gates 1–3.
4. Pool (yours): the phantom-sail seam if S15 didn't close it.

## Gate 5 — THE NEXT TEMPTATIONS (E owns)

Arc 2 needs yards this palette cannot dress yet. Two of these three, factory-
built, byte-stable, negative-control-proven (build the wrong one on purpose,
watch red) — and every anchor-bearing node passes the S15 gate-1 mechanism
(a baked hint that cannot reach a JSON-declared anchor is the bug class that
cost the posts their truth):
1. **The glasshouse** — the collateral apex. Priced high, wreck variant,
   collateral_key wired so a SECOND one placed in the editor still bills (the
   carport's five-sprint lesson). Panes that read as fragile at a glance;
   nothing about it may adopt as an anchor.
2. **The pool kit** — pool + compliant fence ring. The fence posts are the
   temptation: honest `tie_off:false` on every one (silence is not neutral —
   adoptAnchor's `?? 1` makes an unrated node the best steel in the game),
   because the pool yard's whole puzzle is that the legal tie-offs are all in
   the wrong places.
3. **The trampoline + tie-down kit** — typed honestly in the checked enum;
   the tie-down is the prep-phase counter to the storm's opening projectile,
   priced like it matters.
Flag D in THREADS as each lands.

## Gate 6 — JOHN: PLAY, THEN AIM ARC 2

Six nights at partly.party/hardyards (deploy after integration — ROADMAP: the
live gap never exceeds one sprint). Three sentences in THREADS. Then one
ruling for arc 2's first sprint: **emergency mid-storm callout or the cowboy
audit** — which job type leads THE BOOK OF CLIENTS?

Pool, spread by ownership: whatever S15's pool leaves standing, plus:
membrane pricing the day rain's drain weight moves (B, rigging.js's comment
names the start); the >83 ms determinism bound gets a pinning test or a
documented waiver (B).

```
gate 1: ledger — warranty on the sheet, rep on the letterhead, quote==settle
        holds, a designed loss costs nothing
gate 2: divergence heal (finite in 1s, mutation-proof); fabric on the record;
        separations pinned post-ruling or honestly refused
gate 3: storm_06 makes membrane the right answer, measured not asserted;
        makeStorm(seed) deterministic inside envelopes; forecast argues the bet
gate 4: swing lawn re-scored and wired; six nights, one-variable rule;
        the whole week cold-played and judged
gate 5: two temptation assets, honest extras, negative controls, S15-clean
gate 6: John's three sentences + the arc-2 job-type ruling
```
