ROADMAP.md is the new growth canon: five arcs from the shipped week to DESIGN.md's landscaping business (teeth → job board/clients → slow pressure → the season → the water table), with the earned principles up front — every arc ends live, no mechanic without a surface, balance is measured, one new variable per night. SPRINT15.md and the lane prompts draw arc 1's gates; John resolved S14 gate 4 as all-three-sequenced. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
165 lines
10 KiB
Markdown
165 lines
10 KiB
Markdown
# SPRINT 15 — TEETH: YOUR WORK FOLLOWS YOU
|
||
|
||
*Sprint 14 built the editor and the editor built the argument: SCORE IT put the
|
||
bare-beds number on a card (bare 82.6 vs best clean 91.3) and nobody can unsee
|
||
it. John played, ruled on gate 4 (ROADMAP.md, 2026-07-18): all three branches,
|
||
sequenced, teeth first. This sprint the week grows consequences — reputation on
|
||
the letterhead, warranty on the job sheet, a sixth night, a third yard, and the
|
||
first night where the default fabric is the wrong answer. Baseline selftest
|
||
**409/0/0** (the fresh-eyes review landed six fixes on main — read THREADS [I]
|
||
2026-07-18 before you start; the fabric key, the divergence break and the pond
|
||
clamp are all news your lane may be building on). 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 five-night 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.
|
||
Assert: poison → break → every node finite within 1 s of sim, render-safe.
|
||
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.** The SCORE IT card says NONE PINNED and calls
|
||
it out — a shipping site should promise held-vs-bare and be held to it. 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 and gate 4's balance fight starts there, not at a fudged pin.
|
||
|
||
## 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), 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 — SITE_03 AND THE SIX-NIGHT WEEK (D owns)
|
||
|
||
1. **site_03 ships.** Your S14 cold-authoring run never landed a yard — the
|
||
editor is a sprint older now and SCORE IT prices collateral. Author it
|
||
cold (editor only, the S14 discipline), any theme E's palette supports,
|
||
winnable-but-mean at $80, separation pinned, collateral priced, _design/
|
||
_why filled. File the friction in THREADS — every place the editor fights
|
||
you is still gate-1/2 feedback one sprint late.
|
||
2. **The week becomes six nights.** Wire site_03 and storm_06 into NIGHTS under
|
||
the one-variable rule: site_03 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 briefs (client flavour is data — write clients worth meeting;
|
||
the corner block got a name and a reason, match that bar). Night 5's
|
||
beyond-saving flag and the went-broke arc 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 re-test, third sprint running — if A's
|
||
view fix landed, verify and close it in THREADS; if not, your repro keeps
|
||
it honest.
|
||
|
||
## Gate 5 — THE NEXT TEMPTATIONS (E owns)
|
||
|
||
Arc 2 needs yards this palette cannot dress yet. Two of these three, factory-
|
||
built, honest extras, negative-control asserts (your discipline — build the
|
||
wrong one on purpose and watch red):
|
||
1. **The glasshouse** — the collateral apex. Priced high, wreck variant,
|
||
collateral_key wired so a second one placed in the editor bills (the
|
||
carport's five-sprint lesson is one sprint old). 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` (silence is not neutral — adoptAnchor's
|
||
`?? 1` makes an unrated node the best steel in the game), because the whole
|
||
point of the pool yard is that the legal tie-offs are all in the wrong
|
||
places.
|
||
3. **The trampoline** — if S14's pick didn't land it: typed honestly in the
|
||
checked enum, plus a tie-down kit prop (the prep-phase counter to the
|
||
storm's opening projectile, priced like it matters).
|
||
Flag D in THREADS as each lands — site_03's theme may want one.
|
||
|
||
## Gate 6 — JOHN: PLAY, THEN AIM ARC 2
|
||
|
||
Six nights at partly.party/hardyards (deploy after integration — the live gap
|
||
is one sprint and ROADMAP says it never exceeds that). 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: dev-line visibility default (A, second carry);
|
||
bench-vs-UI residual cause (open since S13; the margin rule stands in);
|
||
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;
|
||
site_02 separation pinned 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: site_03 cold-authored and shipped; six nights, one-variable rule;
|
||
the whole week cold-played and judged
|
||
gate 5: two temptation assets, honest extras, negative controls
|
||
gate 6: John's three sentences + the arc-2 job-type ruling
|
||
```
|