# 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 shipped yards (a third — the swing lawn — authored
and inert), 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 0 — THE TRUE BASELINE (SPRINT15, already speced — the fork's gift)

*This roadmap and SPRINT15 were written in parallel forks the same day and
reconciled: S15's gates (the post rating_hint ruling, the iterative editor
score, the honest edges) re-measure the very numbers arc 1 pins, so S15 runs
FIRST and TEETH fires as SPRINT16. The fork was the process working — D's
cold-authoring pass found a shipped balance bug nobody reasoning from the
code would have caught.*

## ARC 1 — TEETH (SPRINT16, speced in full in SPRINT16.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). D's swing lawn
enters the rotation, 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 4–6 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 (SPRINT16
  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).
