Two same-day integrations reconciled: their SPRINT15 (post ruling, editor iterative, honest edges) stands and runs first because it re-measures the numbers TEETH pins; the TEETH plan moves to SPRINT16 with a fires-after-15 banner, its D gate rewired to the landed swing lawn. ROADMAP arc 0 records the fork. THREADS keeps both sides chronologically. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
176 lines
10 KiB
Markdown
176 lines
10 KiB
Markdown
# 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).
|