From 624a72e458d57f565a6a922330ffa0a0aaf5ac41 Mon Sep 17 00:00:00 2001 From: m3ultra Date: Fri, 17 Jul 2026 01:11:16 +1000 Subject: [PATCH] Add Sprint 3 plan and lane prompts: close the game loop Co-Authored-By: Claude Fable 5 --- LANE_PROMPTS.md | 57 ++++++++++++++++++++++++ SPRINT3.md | 115 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 SPRINT3.md diff --git a/LANE_PROMPTS.md b/LANE_PROMPTS.md index bef1a2a..5308eb4 100644 --- a/LANE_PROMPTS.md +++ b/LANE_PROMPTS.md @@ -158,3 +158,60 @@ re-deciding them. > washing line, garden gnome — same one-script determinism + contact-sheet > acceptance; (4) when Lane A's yard is dressed, render a contact sheet of the > assembled yard from the game camera for DESIGN.md. + +--- +--- + +# SPRINT 3 prompts (the game loop — fire all five; B+C pair on item 1) + +Same rules: own clone, own branch, rebase onto latest main FIRST (Sprint 2 is +merged; main.js passes debris into rig.step; downdraft data reverted to 0.3 +with B's assert self-skipping — THREADS' last [I] entry explains why). Read +SPRINT3.md in full; decisions 7/8/9 are made. + +## Lane A — Sprint 3 +> You are Lane A on SHADES 3D, Sprint 3. Rebase onto main, read SPRINT3.md +> §Lane A. Priority 1 is world.shedTable (unblocks D, ~15 lines). Then the +> decision-2 anchor rework with the quad-area assert, the playable prep phase +> (wire B's picking adapter, take their preview-rig force-arrows offer), the +> HUD (kN bars, telegraph, garden HP via skyfx.rainShadowOver per decision 7, +> plant damage-state swaps), forecast card + aftermath screen (score the gnome), +> and finish the yard dressing with E's GLBs and sway handles. Retitle the page. +> Merge shepherd duties continue. Small commits, selftest green after each. + +## Lane B — Sprint 3 +> You are Lane B on SHADES 3D, Sprint 3. Rebase onto main and read SPRINT3.md +> §B+C and THREADS' last [I] entry — the integrator measured that gust-only +> downdraft cannot satisfy your 60% bar and §7 together (0.45→42% + twisted +> loses a corner; 0.58→48% + still loses one), so decision 8 adopts your +> fraction-of-TOTAL semantics. Pair with C in THREADS: when their weather.core +> change lands, re-run your 8-direction sweep, delete the <0.5 self-skip from +> your decision-3 assert, and confirm all three §7 legs on the SAME storm JSON. +> Log final constants. Then sail UVs with E's sail_weave.png per their recipe. +> Also: A may take your preview-rig offer for prep force arrows — support them. + +## Lane C — Sprint 3 +> You are Lane C on SHADES 3D, Sprint 3. Rebase onto main and read SPRINT3.md +> §B+C and THREADS' last [I] entry. Decision 8: change weather.core downdraft +> to a fraction of TOTAL wind speed (keep the own-RNG determinism guarantee, +> keep speedAt() horizontal, update the validator; rename the JSON field if the +> semantics warrant it), then pair with B to land values where their 60% bar +> AND the §7 gates are green on the same data. Retune storm_01/storm_02, and +> author storm_03 between them so the campaign has a ramp. Decision 7 landed +> garden HP on your rainShadowOver — coordinate the API with A as they wire it. + +## Lane D — Sprint 3 +> You are Lane D on SHADES 3D, Sprint 3. Rebase onto main, read SPRINT3.md +> §Lane D. The moment A posts world.shedTable in THREADS: close the §7 loop BY +> HAND — pickup → carry through gusts (brace when needed) → hold-E repair → +> ≥3/4 corners at storm end — and RECORD the run (SHADES.step + screenshots); +> that artifact is the sprint's definition of done. Retune stumble/knockdown +> thresholds against real storm_02 gusts now that the downdraft is live. +> Stretch: the ladder loop (carry, place, ClimbLadder to fascia anchors) — +> flag early in THREADS if it's bigger than the sprint. + +## Lane E — Sprint 3 +> You are Lane E on SHADES 3D, Sprint 3. Rebase onto main, read SPRINT3.md +> §Lane E. Small juice pass: tear-decal hookup recipe for B (like your weave +> recipe), broken-gnome + snapped-fence-panel variants for the aftermath +> screen, and refresh the assembled-yard contact sheet once A's dressing lands. diff --git a/SPRINT3.md b/SPRINT3.md new file mode 100644 index 0000000..aab4189 --- /dev/null +++ b/SPRINT3.md @@ -0,0 +1,115 @@ +# SPRINT 3 — THE GAME LOOP (instructions for Opus 4.8 lanes) + +*Sprint 2 verdict: the storm is real. Merged main boots into a yard with live +weather, a walking ped, a rendered sail that cascades believably, debris that +dents both cloth and player, rain that stops at the cloth, and 169/0/0 green. +What's missing is the GAME around it: you can't rig with the mouse in the shell, +can't pick up a spare, can't see loads without the console, and nothing scores +the aftermath. Sprint 3 closes the loop so a stranger could play it.* + +Read THREADS.md from the last [I] entry down before starting. Two integrator +facts you must absorb: (1) main.js now passes `debris` as rig.step's 4th arg; +(2) the downdraft data is back at C's 0.3/0.18 and B's decision-3 assert +self-skips below 0.5 — item 1 below is why. + +## Decisions (made) + +7. **Garden HP is driven by `skyfx.rainShadowOver(bed)` during storms.** + B and C both recommended it and they're right — at night the sun shadow is a + number about nothing. `rig.coverageOver(bed, sunDir)` stays as the daytime + shade readout (and becomes the heatwave scorer later). Lane A wires it. +8. **Downdraft semantics change to fraction-of-TOTAL wind speed** (B's + preference, C's code). Gust-only semantics measurably cannot satisfy both + the no-free-lunch bar and §7 survival (numbers in THREADS [I] 2026-07-17). +9. **`world.shedTable` is Lane A's, this sprint, first.** It gates D's §7 + hand-play and it's ~15 lines of dressing. + +## Lane A — finish the shell (the sprint's spine) + +In priority order: +1. **`world.shedTable`** — place `shed_01_v1.glb` + `shed_table_v1.glb`, expose + `{pos}` (use E's `pickup_anchor` empty if present). Unblocks D immediately. +2. **Decision 2 anchor rework** (carried from Sprint 2): posts in to ~(−4.5,5.5) + and (4.0,6.0), add p3 near (0,7), register E's tree `branch_anchor_*` + (they carry `rating_hint`). New a.test assert: ≥3 pickable quads in 18–45 m² + covering the bed. This also fixes B's "cascade at t=0.4 s from pre-tension + alone" finding — the yard currently teaches the wrong lesson. +3. **Prep phase playable**: wire B's picking adapter (it exists on their branch + contract — coordinate in THREADS) to anchor markers + hardware cycling + + tension dial + spare purchase, with budget $80. Take B up on their offer of + a **preview rig for live force arrows during prep** — DESIGN.md calls this + the core teaching tool. +4. **HUD**: per-corner load bars in kN vs rating (world-anchored), wind meter + + gust telegraph banner, garden HP (decision 7) driving E's + plants_full/tattered/dead swaps, phase banner. +5. **Forecast card** (storm JSON summary: peak wind, gust character, change + time — sell the dread) and **aftermath screen** (garden %, corners lost, + hardware bill, verdict line). Enter-to-advance is fine. +6. Yard dressing completion: swap graybox house for `house_yardside_v1.glb` + (decision 6 — read fascia_anchor_* from the GLB), fence set, washing line + (head spins in gusts — E gave you `sway_amp` handles too, use them for the + canopy telegraph), wheelie bin into the debris pool, gnome placed in sail + range (`collateral_value` 25 — score it in aftermath). +7. Retitle the page — it still says M0. + +## Lane B + Lane C — the downdraft semantic (JOINT, do it first, pair in THREADS) + +1. **C**: `weather.core.js` — downdraft becomes a fraction of TOTAL wind speed + (sustained + gust), keeping the own-RNG-stream determinism guarantee and the + storm-JSON validator (rename the field if semantics change enough to warrant + it — e.g. `downdraftOfTotal` — a silently re-meaning field is worse than a + rename). Keep `speedAt()` horizontal. +2. **B**: re-run the 8-direction sweep at C's proposed values, re-enable the + decision-3 assert (delete the <0.5 self-skip — it documents *gust-only* + semantics and dies with them), confirm §7 all three legs (cheap cascades / + twisted survives / twisted+repair survives) against the SAME data. Log the + final constants in THREADS. Both asserts green on the same storm JSON is + this item's definition of done. +3. **B**: sail UVs + E's `sail_weave.png` per their recipe (uv attribute, + repeat 6×6, sRGB) — the membrane should read as fabric, and the tear decal + strip is waiting for M3 tearing. +4. **C**: storm_03 — author a third storm between gentle and wildnight so the + campaign has a ramp (and the forecast card has range to sell). + +## Lane D — close the §7 loop by hand (gate 3) + +1. The moment A posts `world.shedTable`: verify the full loop live — pick up + spare (PickUp → Carry/CarryIdle), run it through gusts (shelter on C when + needed), hold-E repair at the blown corner (Crank/repair, spare consumed), + rig finishes ≥3/4. **Record the run** (SHADES.step + screenshots, or a + screen capture) — this artifact is the sprint's definition of done. +2. Wire `StumbleBack` vs full knockdown thresholds against real storm_02 gusts + with C's downdraft — the brace mechanic (hold C) changes the tuning you did + pre-merge. +3. Ladder: E shipped `ladder_01_v1.glb` with base/top nodes and you have + ClimbLadder — if fascia repairs are meant to need it (DESIGN.md says yes), + land carry-ladder + place + climb as the stretch goal; flag early if it's + bigger than this sprint. + +## Lane E — juice pass (small) + +1. Sail tear decals hookup notes for B (you shipped the atlas; write the + two-line recipe like you did for the weave). +2. Aftermath props: broken-gnome variant (`garden_gnome_01_broken`), snapped + fence panel — the aftermath screen wants wreckage to point at. +3. Assembled-yard contact sheet refresh once A's dressing lands (your Sprint 2 + item 4, still open — the yard finally looks like the game this week). + +## Gates + +``` +gate 1: A-1 lands → D starts closing the loop +gate 2: B+C downdraft semantic → both physics gates green on one storm JSON +gate 3: prep→storm→aftermath playable start to finish with the mouse, + §7 scenario ON RECORD, selftest green +``` + +Definition of done = gate 3. That is also the moment SHADES stops being a tech +demo — get there and the next conversation is about content (storms, sites, +the landscaper campaign), not systems. + +## For John + +- Nothing blocks on you this sprint. The M1 stays an asset-build box. +- When gate 3 lands you'll want to actually play it: `python3 server.py` in the + repo, http://localhost:8801/ (or --port anything), WASD/shift/E/C/Enter.