HardYards/ROADMAP.md
m3ultra 3dee2a7c83 Merge origin/main: S14 lane integration + review fixes; TEETH becomes SPRINT16
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>
2026-07-19 10:34:21 +10:00

10 KiB
Raw Blame History

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 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 (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).