Sprint 15 plan: TEETH — ledger/warranty/rep, the membrane night, site_03, six nights

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>
This commit is contained in:
m3ultra 2026-07-18 19:10:14 +10:00
parent f179d6c25e
commit 4a5e5bc037
4 changed files with 434 additions and 1 deletions

View File

@ -832,3 +832,105 @@ byte-identical JSON out) even though its UI needn't be.
> number, a wreck where priceable, negative-control asserts (your bike
> discipline — build the wrong one on purpose and watch it go red). Flag D
> in THREADS the moment the palette is ready — their cold yard waits on it.
---
# SPRINT 15 prompts (teeth — your work follows you)
Same rules: own clone, own branch, rebase onto latest main FIRST
(`git fetch origin && git reset --hard origin/lane/<x>` on a clean tree —
your local branch is BEHIND after integration fast-forwards). Read
**ROADMAP.md** (new — the growth canon; John resolved S14's gate 4: all three
branches, sequenced, teeth first), THREADS from the last [I] entry (the
fresh-eyes review landed six fixes on main — the fabric key, the divergence
break and the pond clamp are news your lane builds on), then SPRINT15.md.
Ports: A 8824, B 8825, C 8826, D 8827, E 8828 (untracked launch.json, copy
the example). Baseline selftest **409/0/0**. The one-variable rule is law:
the new site and the new storm never debut on the same night.
## Lane A — Sprint 15
> You are Lane A on HARD YARDS, Sprint 15. Rebase onto main, read ROADMAP.md,
> THREADS' last [I], then SPRINT15.md. Gate 1 is yours: THE LEDGER. The week
> records every committed rig (corners, hardware, what broke, what was
> repaired); a corner still broken at dawn books a WARRANTY line on the next
> morning's job sheet — hardware's shop price, off the fee AT QUOTE TIME, so
> week.js's quote==settle invariant holds by construction. Reputation is one
> number on the letterhead (job sheet AND invoice, E's contract): clean
> nights up, warranty down, collateral down harder, and it moves the callout
> fee multiplier ON THE SHEET so trust becomes visible money. Night 5's
> gardenBeyondSaving must not cost rep — a designed loss the ledger punishes
> is the verdict lying again. Aftermath and end-of-week card speak rep.
> a.test: warranty only on unrepaired breaks; quote==settle with a warranty
> line; rep untouched on designed losses; clean-week negative control. You
> also print C's hail-size and rain lines on the forecast block (their gate
> 3.3 exposes them). Pool: dev-line visibility default, second carry. Do NOT
> build the job board — that's arc 2, and gate 6 aims it.
## Lane B — Sprint 15
> You are Lane B on HARD YARDS, Sprint 15. Rebase onto main, read ROADMAP.md,
> THREADS' last [I] (the review touched YOUR files: the divergence break in
> _checkFailure, the post-flow pond clamp, the F key in your rigging UI, and
> a fixed tautology in your own suite — read the receipts), then SPRINT15.md.
> Gate 2 is yours. (a) THE HEAL: after a divergence break, non-finite node
> positions reset from the nearest finite neighbour (prev matched — verlet
> must not invent velocity); assert finite within 1 s, mutation-proof, and
> the existing divergence test stays untouched. (b) THE RECORD: the chosen
> fabric prints in prep summary, invoice, and the verdict when it mattered —
> the F key exists, now the paperwork remembers the bet. (c) THE PIN: site_02
> declares no separation block and the SCORE IT card calls it out — run
> gardenfly, pin the honest held-vs-bare target, assert it; if the yard
> can't separate at $80, that's a FINDING for THREADS, not a fudged pin.
> Pool: the >83 ms determinism bound gets a pinning test or a documented
> waiver; membrane pricing stays parked until rain's drain weight moves.
## Lane C — Sprint 15
> You are Lane C on HARD YARDS, Sprint 15. Rebase onto main, read ROADMAP.md,
> THREADS' last [I], then SPRINT15.md. Gate 3 is yours. (1) STORM_06, the
> pea-hail soaker: stones under your own 2 mm-weave blocking ruling, heavy
> rain, mild wind — the first night membrane is the RIGHT answer. Cloth must
> leak fine hail all night; membrane must pond (the broom matters); the
> membrane line must be affordable at $80 and MEASURABLY better — gardenfly
> and site_audit numbers pinned in your selftest, funnel state in the header.
> If cloth still wins, retune until the bet is real: a decoration night is
> worse than no night. (2) makeStorm(seed): a seeded generator inside
> authored envelopes, deterministic (same seed → byte-equal def), schema-
> valid across 100 seeds, storm_envelope-tested — arc 4's roguelite eats
> this; no shipped night uses it yet. (3) Expose hail stone size and rain
> rate for the forecast block (A prints them) — bands, not promises. The
> one-variable rule binds you to D: storm_06 flies over a yard the player
> already knows.
## Lane D — Sprint 15
> You are Lane D on HARD YARDS, Sprint 15. Rebase onto main, read ROADMAP.md,
> THREADS' last [I], then SPRINT15.md. Gate 4 is yours and it's the sprint's
> acceptance test again. (1) site_03 SHIPS this time: author it cold in the
> editor (no JSON hand-editing, no console — the S14 discipline), any theme
> E's palette supports, winnable-but-mean at $80, separation pinned,
> collateral priced, _design/_why filled; file every editor friction in
> THREADS. (2) The week becomes SIX nights: you own the NIGHTS order and the
> two new briefs (client flavour is data — the corner block got a name and a
> reason; match that bar). One-variable rule: site_03 debuts under a storm
> the player has survived; storm_06 flies over a yard they know; never both
> new at once. Night 5's beyond-saving arc and going-broke-never-on-the-
> final-night must survive your re-ordering — a.test will tell you. (3)
> Cold-play all six on one wallet and file the verdict: is a warranty line
> FAIR when it lands? Does rep-moves-pay feel earned? Is night 6's bet
> legible from the forecast alone? Your play is gates 13's acceptance.
> Pool: the phantom-sail seam, third sprint — verify A's fix or keep the
> repro honest.
## Lane E — Sprint 15
> You are Lane E on HARD YARDS, Sprint 15. Rebase onto main, read ROADMAP.md,
> THREADS' last [I], then SPRINT15.md. Gate 5 is yours: arc 2 needs yards
> this palette cannot dress. Build TWO of three, factory-built, byte-stable,
> negative-control-proven (build the wrong one on purpose, watch red): the
> GLASSHOUSE (collateral apex — priced, wrecked variant, collateral_key
> wired so a SECOND one placed in the editor still bills; nothing about it
> adopts as an anchor), the POOL KIT (pool + compliant fence ring where
> every fence post is honest tie_off:false — adoptAnchor's `?? 1` makes a
> silent node the best steel in the game, and the pool yard's whole puzzle
> is that the legal tie-offs are in the wrong places), the TRAMPOLINE + tie-
> down kit (if S14's pick didn't land it — typed honestly in the checked
> enum). Flag D in THREADS as each lands; site_03's theme may want one.
> Axis trap stands: measure exported GLBs in three.js coords, look at the
> render in assetcheck, never trust a docstring about orientation.

View File

@ -24,9 +24,10 @@ No pip, no npm, no build. Python 3.8+ and a browser.
1. `DESIGN.md` — the design canon (what the game is)
2. `PLAN3D.md` — the build canon (stack, contracts, lane model)
· `docs/MANUAL.md` — the HOW: tool map, asset/site cookbooks, earned gotchas
· `ROADMAP.md` — the growth canon (the arcs from the week to the business)
3. `THREADS.md` — the append-only lane log. **The project's memory.** Read the
last few `[I]` integrator entries to know the current state.
4. `SPRINT12.md` — the current sprint (highest-numbered SPRINTn.md wins)
4. `SPRINT15.md` — the current sprint (highest-numbered SPRINTn.md wins)
5. `LANE_PROMPTS.md` — copy-paste prompts per lane, per sprint (bottom = newest)
## The lane model (how this repo is built)

166
ROADMAP.md Normal file
View File

@ -0,0 +1,166 @@
# HARD YARDS — the growth canon (where the game goes after the week)
*Written 2026-07-18 at John's direction, following the fresh-eyes review (THREADS
[I] same date). DESIGN.md says what the game IS — it remains the design canon and
nothing here overrides it. PLAN3D.md said how to BUILD the first game — done, 14
sprints, live at partly.party/hardyards. This file says how the shipped week
becomes the landscaping business DESIGN.md describes, in arcs that each end with
something playable on the public URL. Sprints draw gates from here; when a sprint
and this file disagree, the sprint is newer — fix this file.*
**John's ruling, 2026-07-18 (this is gate 4 of SPRINT14, resolved):** all three
deferred branches — reputation/warranty, more sites, heatwaves — are wanted. Not
picked between: SEQUENCED. Teeth first, clients and yards second, slow pressure
third. "It doesn't just have to be one night… it's clearly much more than that
now."
---
## Where we are (the honest baseline)
Five 90-second nights, two yards, five storms, one wallet, ~15 minutes of
campaign. Selftest 409/0/0. An editor that makes new yards cheap and scores them
through the real engines. An economy whose own comments say the balance is
unmeasured, and a scorecard that says a bare bed reads 82.6 where the best clean
rig reads 91.3 — **doing nothing scores 90% of doing everything, and that is the
single number this roadmap exists to fix first.** The sim is the strongest thing
in the repo; the thinnest thing is consequence.
## The principles (each one was earned, none is negotiable)
1. **Every arc ends live.** partly.party/hardyards after every integration, a
stranger can play it. No arc is "infrastructure for the next arc" — if it
doesn't change a night a player feels, it isn't an arc, it's a gate inside one.
2. **No mechanic without a surface.** The fabric bet shipped in SPRINT6 and no
key reached it until SPRINT15. A sim feature the player cannot reach and the
job sheet does not argue about does not exist. Every new mechanic lands with
its input, its HUD read, and its line on the paperwork, in the same sprint.
3. **Balance is measured, not reasoned.** The audit gauntlet (site_audit,
gardenfly, storm_envelope, SCORE IT) runs before a night ships, and the pinned
numbers go in THREADS. The bare-beds number is what "reasoned" balance looks
like after eight sprints of everyone being careful.
4. **Sites are data; storms are data; clients are data** (week.js proved the
third). Content arcs must not add code paths per night — they add JSON and
surfaces that read it.
5. **One new variable per night.** A new site, a new storm, and a new mechanic
never debut together — a player who loses must be able to name what beat them.
6. **The full water sim stays a trap until it isn't** (DESIGN.md's own warning).
Slices of water that reuse the pond (runoff aim, clogged inlets) are fair
game; the heightmap flow layer waits for its own PLAN document and its own
proof of fun in a bench, like the cloth had.
---
## ARC 1 — TEETH (SPRINT15, speced in full in SPRINT15.md)
*The week gets consequences. Your work follows you.*
Reputation and warranty hang off the invoice exactly as DESIGN.md drew it: a
corner of yours that blew and stayed blown books an unpaid warranty line on the
next morning's job sheet; a clean night builds the number on the letterhead; the
number moves what clients pay. The fabric bet gets its paper trail (forecast
argues hail size and rain, invoice records the cloth you chose). site_03 finally
ships, the week becomes six nights, and one of them — C's pea-hail soaker — is
the first night where the default fabric is the wrong answer. The bare-beds
separation fight starts here and does not end until held-vs-bare is a pinned,
teeth-bearing number on every shipped site.
## ARC 2 — THE BOOK OF CLIENTS (≈ two sprints)
*From a scripted week to a job board. Variety without new engines.*
- **The job board**: mornings offer N callouts, you take one. Pay, risk, client,
and site visible before you commit — income becomes a choice, replay becomes
real, and BROKE_BELOW starts meaning something because you can chase money
into jobs you shouldn't take. The week structure (five-to-seven nights, one
wallet) survives; what changes is that no two weeks need be the same list.
- **Job types beyond "rig for tonight"** — each is a variation on engines that
already exist, none needs new sim:
- *Emergency callout* — you arrive MID-STORM at double rates to someone
else's failing rig: triage, repair, cut-away. The storm phase already does
everything this needs except spawn you at t=30 with a rig you didn't build.
- *The cowboy audit* — storm-proofing someone else's work 36 hours out: walk
the yard, find what's about to fail (frayed wire, unmoused pins, a carabiner
where a shackle should be — the inspection tells exist as rating hints and
hardware states), fix the worst of it on a budget that cannot fix all of it.
- *Warranty callout* — arc 1's ledger, now as a full night: your own past
work, revisited in weather, unpaid.
- **Client personalities as constraints** (DESIGN.md's soft-constraint idea):
"nothing attached to the house", "the pool fence is off limits", "cheapest
option and I'll sue" — data on the night, enforced by the rigging session,
argued on the job sheet. Cheap to build, huge puzzle variation.
- **Yards 46 out of the editor**: the pool yard (fence compliance + corroded
cheap hardware), the granny-flat alley (the venturi as the whole level), the
glasshouse yard (maximum collateral, E's arc-1 asset). D authors them cold,
the gauntlet prices them, separation pinned before they ship.
## ARC 3 — SLOW PRESSURE (≈ two sprints)
*DESIGN.md's other half: days, sun, and water you can see coming.*
- **Heatwave days**: the sun arcs, the shadow moves, shade-hours-delivered is
the score (coverageOver() already ground-projects; it needs a sun path and an
hourly integral). No storm — the tension is coverage over TIME, a different
brain. Slow days between violent nights is the Overcooked rhythm DESIGN.md
named, and it makes the storms land harder.
- **The seasonal sun**: the same yard needs a different rig in February than
July (sun elev/azim already live in site JSON — make them a season, not a
constant). Seasonal-adjustment callouts fall out for free.
- **Water, the honest slice**: sail runoff has to GO somewhere — one corner low
dumps the pond's drainage where you aimed it (the veggie bed: bad; the path:
fine; the neighbour's side: a bill). Reuses the pond machinery wholesale, adds
aim. Second slice: leaves clog the one drain inlet and the puddle drowns the
bed corner — the leaf layer already exists in debris.js as an ambient tell.
Both slices are legible without a flow sim, and both make yards read as
plumbing, which is the door arc 5 walks through.
- **Heat affects you**: work slows in the blaze, water breaks are real, dawn
and dusk are the smart hours — player.sim already has the shove/stagger
scaffolding for one more environmental pressure.
## ARC 4 — THE SEASON (≈ two sprints)
*The campaign clock, persistence, and the roguelite.*
- **Save the business**: localStorage persistence — wallet, rep, gear, week
number. The week loop closes into a season of weeks with a job-board economy.
- **Storm season (roguelite)**: fixed starting budget, procedurally generated
storm sequences inside authored envelopes (C's makeStorm(seed) groundwork
lands in SPRINT15), survive the season solvent. The seeded weather core was
built for this from day one.
- **Gear that persists**: hardware tiers into TOOL tiers — the petrol auger vs
the shovel (post placement time), the laser level (free grading intel), the
second trailer (carry more spares). DESIGN.md's life-changing-upgrade list.
- **Sandbox**: the storm designer sliders (dev_skyfx.html is 80% of it) plus
the editor, public. Break your own yard for fun; the chaos physics carries it.
## ARC 5 — THE WATER TABLE (the big swing — gated, not scheduled)
*Retaining walls, drainage, the heightmap that flows. DESIGN.md's second game.*
Not scheduled until it passes the same bar the cloth passed: a bench that proves
the fun before a lane builds the feature. The gate to open this arc is a
tools/water_bench/ prototype — coarse-grid flow on a heightmap, one swale tool,
one wall that can blow out, played in a probe page and felt to be a game. Arc 3's
runoff/clog slices will have taught players (and us) how much water legibility
buys at what sim cost. Everything DESIGN.md says about walls, weep holes,
surcharge and the mudslide entering the debris system waits here, intact.
---
## The standing rails (every arc, no gate needed)
- **Perf floor**: the game must hold 60 fps on the M1 Ultra and stay playable on
an Intel MacBook's integrated GPU. The review's 12-fps embedded-pane datum was
the reviewer's harness, not the game — but nobody has MEASURED a low-end
machine, and "measure, don't reason" applies to frame rate too.
- **Sound**: every new mechanic that can kill a corner gets a tell by ear
(DESIGN.md: players learn to defend by ear). The tink of a backing-out pin is
still unbuilt and is the single highest-value audio asset in the design.
- **Touch**: the notice locks phones out honestly. A touch rigging UI is a real
future (the editor's raycast placement is most of one) — parked until arc 4,
named here so nobody half-builds it sooner.
- **Deploy**: tools/deploy_hardyards.sh after every integration; the live site
is currently one sprint behind main and that gap should never exceed one.
- **The sim's debt, tracked**: node-position heal after divergence (SPRINT15
gate 2), the >83 ms frame determinism bound (documented, un-tested), membrane
pricing the day rain's drain weight moves (rigging.js's comment names it).

164
SPRINT15.md Normal file
View File

@ -0,0 +1,164 @@
# 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 13.
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
```