HardYards/LANE_PROMPTS.md

50 KiB
Raw Blame History

Lane launch prompts (Opus 4.8, run on the M1 Ultra)

Per lane: clone git@gitea.partly.party:monster/shades.git to ~/Documents/shades-lane<X>, branch lane/<x>, paste the prompt. Lane A starts first; B/C/D/E can start immediately after in parallel (they develop against contracts + selftest mocks until A's M0 merges).


Lane A — world, shell & integration

You are Lane A on SHADES 3D. Read PLAN3D.md fully (you own §5 Lane A), then DESIGN.md, then play prototype/ (python3 -m http.server 8642 --directory prototype). Build the M0 skeleton exactly per PLAN3D §3/§4/§5-A: vendored three.js copied from ~/Documents/90sDJsim/web/world/vendor/, stdlib server.py on 8801, contracts.js, graybox 30×20 m yard with house edge/trees/posts/garden bed, third-person camera, sun lighting, selftest.html harness. Merge M0 to main as fast as possible — every other lane rebases on you. Then build the HUD against mock data, and act as merge shepherd per PLAN3D §6. Log every landing in THREADS.md.

Lane B — sail simulation & rigging

You are Lane B on SHADES 3D. Read PLAN3D.md fully (you own sail.js + rigging.js, §5 Lane B), DESIGN.md §geometry/§hardware, and prototype/game.js — your job is the faithful 3D port of its cloth/load/failure behavior. Build the 3D verlet cloth with per-FACE wind pressure (F ∝ area·dot(wind,normal)²) so hypar twist genuinely sheds load — prove it with the selftest assert (twisted rig peak load < flat rig peak load in the same storm). Corner load = smoothed incident-spring stretch; break after 0.4 s sustained overload; flogging must be emergent from the freed node. Then the prep-phase rigging UI with the prototype's economy. Until Lane A's M0 merges, develop inside selftest.html with a stub wind function; keep every module deterministic (dt,t in — no Date.now, no rAF in sim code). Log in THREADS.md.

Lane C — weather, sky & debris

You are Lane C on SHADES 3D. Read PLAN3D.md fully (you own weather.js, skyfx.js, debris.js, data/storms/, §5 Lane C) and prototype/game.js's gust scheduler — port its telegraph/ramp/hold/fade shape. Implement wind.sample(pos,t) per contracts.js: base curve + gusts + direction change + spatial noise + tree wind-shadow. Storms are data (JSON, PLAN3D §4) — author storm_01_gentle and storm_02_wildnight. Then instanced rain following local wind, storm sky + lightning flash, WebAudio layers (wind bed, gust whoosh, rope creak keyed to max corner load, flog when broken), and hand-rolled debris (crates/tubs from models/debris/) with player knockdown + sail impulse. No physics engine, no deps. Selftest: telegraph lead ≥1.2 s, wind continuity, storm JSON validator. Log in THREADS.md.

Lane D — player character & interaction

You are Lane D on SHADES 3D. Read PLAN3D.md fully (you own player.js + interact.js, §5 Lane D) and 90sDJsim's DEVMANUAL rigged-characters section (~/Documents/90sDJsim/DEVMANUAL.md) — its loading rules are law (SkeletonUtils.clone, head-bone height normalize, never blind setScalar). Copy a ped from ~/Documents/90sDJsim/web/world/models/peds/ into models/ (copies rule), merge Walk/Running/Happy Idle clips via ~/Documents/ character_kit/ pipeline; queue Climbing Ladder / crank / dig on the ~/Documents/mixamo-fetch wishlist for M3. Camera-relative WASD + anim state machine, wind slow/shove/knockdown per PLAN3D, and hold-E interactions via interact.register (re-rig with spare 2.5 s, per-corner turnbuckle trim 1.2 s, carry-one-item from shed table). Selftest: state machine table test. Log in THREADS.md.

Lane E — nature & hardware assets (Blender)

You are Lane E on SHADES 3D. Read PLAN3D.md fully (you own tools/blender/ + models/, §5 Lane E). Study the house Blender-scripting idiom in ~/Documents/3D-STORE/build_booth_room_v23.py and racks_to_glb.py, then write ONE deterministic tools/blender/build_yard_assets.py that generates every deliverable in PLAN3D §5-E (gum trees with named canopy/branch_anchor nodes, fence set, house_yardside with fascia_anchor empties, shed + table, garden bed with 3 damage states, raked sail post, ladder, close-up shackle/ carabiner/turnbuckle, ref_capsule) and exports meter-scale Y-up GLBs, <15 k tris, low-poly stylized to sit beside the 90sDJsim ped fleet. Also copy + scale-check the debris set from ~/Documents/3D-STORE/clean_glbs/ into models/debris/. Verify every export by rendering a contact sheet against the 1.7 m ref capsule (the 3D=models/_thumbnails pattern). Commit script AND GLBs. Log in THREADS.md.



SPRINT 2 prompts (assembly — fire A/B/C/E together, D at gate 1)

Same rules: own clone (~/Documents/shades-lane<X> on m3ultra), branch lane/<x>, rebase onto latest main FIRST (it moved: all lanes merged + importmap + path fixes + M3 clip pack). Read THREADS.md from the [I] integrator entries down, then SPRINT2.md in full — the six decisions at the top are final, stop re-deciding them.

Lane A — Sprint 2

You are Lane A on SHADES 3D, Sprint 2. Rebase onto main, read THREADS.md's [I] entries and SPRINT2.md §Lane A. Your sprint IS the assembly: in main.js swap stub wind → createWind (storm_01 calm phases, storm_02 for the storm), placeholder → await createPlayer (importmap already landed), add the sail view + rig step, skyfx + debris + unlockAudio, dress the yard with Lane E's GLBs (house per decision 6 — read fascia_anchor_* from the GLB), rework anchors per decision 2 (posts in, p3 added, tree branch_anchor_* live, with the new quad-area assert), then HUD (loads in kN) and the four-phase machine. Post "gate 1" in THREADS.md the moment weather+player+sail are live in the yard so Lane D starts. Small commits, selftest green after each, you remain merge shepherd per PLAN3D §6.

Lane B — Sprint 2

You are Lane B on SHADES 3D, Sprint 2. Rebase onto main, read THREADS.md [I] entries and SPRINT2.md §Lane B + decisions 3/4/5. Land in this order: (1) the decision-4 API — repair(i), trim(i,delta), cornerPos(i) — matching Lane D's existing call sites in interact.js, with contract entries + asserts; (2) decision 5 — consume debris.pieces in sail.step() with a momentum assert; (3) the coverageOver ray-origin fix (heightAt, not y=0); (4) the prep-phase picking adapter over RiggingSession once Lane A's anchor markers exist — coordinate in THREADS; (5) the joint tuning session with Lane C against real m/s storms, then re-run the §7 gate against REAL wind and log the constants; (6) after C lands vertical gusts, the decision-3 assert (flat-horizontal no longer dominant).

Lane C — Sprint 2

You are Lane C on SHADES 3D, Sprint 2. Rebase onto main, read THREADS.md [I] entries and SPRINT2.md §Lane C + decision 3. Land: (1) vertical gust component in storm JSON (downdraft fraction, ~0.25 default, validator + asserts) — this closes the flat-horizontal loophole with Lane B; (2) freeze and document the debris.pieces shape in contracts.js for B's integrator; (3) rain-vs-sail occlusion so the garden visibly stays dry under cloth (cheap — coordinate the API with B, don't ray-test every drop); (4) the joint storm-tuning session with B (your THREADS ask — if storm_02 can't break a carabiner rig, raise the curve, it's a data edit); (5) verify skyfx light restoration inside the real main.js phase transitions once Lane A wires it.

Lane D — Sprint 2 (start at gate 1)

You are Lane D on SHADES 3D, Sprint 2. Rebase onto main FIRST — the M3 clip pack landed: player_anims.glb now carries 17 clips (ClimbLadder, Crank, Dig, PickUp, Carry/CarryTurn/CarryIdle, StandUp, TakeCover, StumbleBack, PlantSeeds beside your original six; names logged in THREADS). Also note the integrator fixed /world/ → ./ relative paths in player.js and dev_player.html. Wait for Lane A's "gate 1" THREADS entry, then: (1) verify controls + camera feel in the real yard (slopes, world.solids collision), tune speeds to yard scale, gust shove + knockdown from real wind and real debris hits; (2) wire the full spare loop — shed_table pickup_anchor → Carry/CarryIdle while carrying → repair(i) consumes the spare (B is landing repair/trim/cornerPos to your call sites, decision 4); (3) prompts track cornerPos(i) live; (4) wire Crank to trim(i), TakeCover as the storm shelter verb, StumbleBack for gust knockback — your state machine, your call on transitions. The §7 one-mid-storm-repair scenario must be playable by hand before you're done.

Lane E — Sprint 2 (small)

You are Lane E on SHADES 3D, Sprint 2. Rebase onto main, read SPRINT2.md §Lane E. Small sprint: (1) canopy sway handles — verify your canopy_* nodes sway cleanly when Lane A drives them, add sway_hint props if per-tree tuning is needed; (2) a 512² sail cloth weave atlas + tear decal strip so the membrane reads as fabric; (3) storm dressing set: wheelie bin (mass_hint), 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.



SPRINT 4 prompts (face & water — fire all five)

Same rules: own clone, own branch, rebase onto latest main FIRST (Sprint 3 merged; yard has 11 anchors incl. branch anchors; gate 3 was met by hand). Read THREADS' last [I] entry (the dispute ruling) then SPRINT4.md — decisions 10/11/12 are made.

Lane A — Sprint 4

You are Lane A on SHADES 3D, Sprint 4. Rebase onto main, read SPRINT4.md §Lane A — you are the critical path and it's all UI: hud.js (kN corner bars, telegraph, garden HP via rainShadowOver with C's helper, plant damage swaps), mouse-driven prep via B's picking adapter + their force-arrow preview offer, the forecast card (three storms exist — picking one is the difficulty select), the aftermath screen with E's wreckage swaps (broken gnome, snapped fence), and retitle the page. Small commits, selftest green, merge shepherd as always. Gate 1 is A-1+A-2: playable with eyes and mouse, no console.

Lane B — Sprint 4

You are Lane B on SHADES 3D, Sprint 4. Rebase onto main, read THREADS' last [I] ruling and SPRINT4.md §Lane B. Decision 11 first, one afternoon: re-point §7's twisted rig to a real 18-45 m² quad from A's dressed yard, re-run the three §7 legs + the 8-heading 60% sweep at 0.45 and 0.40 on REAL anchors, post the numbers, then either bump storm_02 downdraftOfTotal to the passing value or retire the bar — no third sprint on this. Then ponding v1 per decision 10 (the 40× rain fiat is made): accumulation × flatness → node water mass → weight; pondMass() for the HUD; dump on corner break; asserts that a hypar pools nothing and a flat rig dies of water in storm_02. Then evaluate a per-face force clamp for D's tn-1.04 stability cliff.

Lane C — Sprint 4

You are Lane C on SHADES 3D, Sprint 4. Rebase onto main, read SPRINT4.md §Lane C. Partner B on decision 11 (match the landed storm value, resolve your held-value comment in storm_02 with satisfaction). Make the three storms' rainAt curves tell the ponding story (storm_02 can kill a flat rig by water, storm_01 can't). Support A's HUD (the rainShadowOver drain helper you offered, telegraph feed). Optional night pass: darken wildnight properly, lightning on the biggest gusts.

Lane D — Sprint 4

You are Lane D on SHADES 3D, Sprint 4. Rebase onto main, read SPRINT4.md §Lane D — decision 12 green-lights your ladder spec exactly as you wrote it: carry-ladder as a second carry type with hands-full rules, placement with a valid-surface test + fascia-anchor snap, code-driven climb height with ClimbLadder on top, work stance at height where hold-E fascia repairs land in shoving wind. Selftest the state legs + a scripted climb-repair-descend. When A's prep UI lands, playtest the whole loop like a player and log feel notes in THREADS — you're the only lane that does.

Lane E — Sprint 4

You are Lane E on SHADES 3D, Sprint 4. Rebase onto main, read SPRINT4.md §Lane E. Small water-and-wreckage pass: pond water disc/decal that rides the sim nodes (your tear recipe pattern) scalable by pond mass, broom_01.glb (the prop waits for the mechanic), fence_panel_snapped if not shipped, and refresh the assembled-yard contact sheet for DESIGN.md — the yard finally looks like the game.



SPRINT 5 prompts (hail & the broom — fire all five)

Same rules: own clone, own branch, rebase onto latest main FIRST (Sprint 4 merged; router passes rain data; downdraftOfTotal 0.45; decision 13 ruled). Read THREADS' last [I] entry then SPRINT5.md.

Lane A — Sprint 5

You are Lane A on SHADES 3D, Sprint 5. Rebase onto main, read SPRINT5.md §Lane A. Wire decision 13 (garden drain = C's hail exposure helper + small rain term; aftermath adds "hail blocked", verdicts re-tuned), pond warnings in the HUD off B's pondMass(), take D's greyed-prompt surface (label + reason) into hud.js, and the small carried bits: sway_amp/sway_phase canopy handles, C's router-contract tripwire, answer B's panel question (keep their panel). Keep 60 fps with hail + rain + ponding live. Shepherd as always.

Lane B — Sprint 5

You are Lane B on SHADES 3D, Sprint 5. Rebase onto main, read SPRINT5.md §Lane B — the water arc has been carried twice and everything now waits on it. Ponding v1 from your reverted prototype + C's landed data (use exported RAIN_TIME_COMPRESSION, never hardcode 40): accumulation × flatness → node water mass → weight; pondMass() + pond centroid; dump on corner break and belly-tipping tension change. Asserts: hypar pools nothing, flat rig dies of water alone in storm_02, storm_01 harmless, mass conserves until dumped. Then drainPondAt(node) for D's broom (agree the shape in THREADS early), session.reset() for A, and the tn-1.04 stability clamp (post §7 deltas before landing).

Lane C — Sprint 5

You are Lane C on SHADES 3D, Sprint 5. Rebase onto main, read SPRINT5.md §Lane C — hail is yours and it's decision 13's engine. Storm JSON hail blocks (bursts timed with big gusts, validator, determinism), hailAt(t) + a STEEP fall vector (~15-20° max lean, cite why), sky.gardenHailExposure in your gardenExposure mold, hail audio (drum on cloth, clatter on ground) and cheap visuals, and the decision-13 assert: no-sail garden damage ≥2× a good rig's in storm_02. storm_02 gets its burst at the change; storm_03 mild; storm_01 none.

Lane D — Sprint 5

You are Lane D on SHADES 3D, Sprint 5. Rebase onto main, read SPRINT5.md §Lane D — the broom is yours and it's the gate: take broom (hands-full rules vs spare/ladder), walk under the belly, hold-E poke (Crank/Dig per E's anim_hint) → B's drainPondAt() → the water dumps ON YOU (stagger if big — comedy is the point) and the sail springs back. Also surface unusable prompts greyed-with-reason into A's HUD (your offer), and run a feel pass on the full loop with hail + ponding live. Log everything in THREADS.

Lane E — Sprint 5

You are Lane E on SHADES 3D, Sprint 5. Rebase onto main, read SPRINT5.md §Lane E. Small juice pass: hail impact pips + ground ring decal (instanced-friendly, stone mesh only if C asks), plant-shred particle puff for hail hits on the bed, and the carried contact-sheet refresh (night + daylight) for DESIGN.md.



SPRINT 6 prompts (winnable, then a week of nights)

Same rules: own clone, own branch, rebase onto latest main FIRST (Sprint 5 merged; decision 13 wired with integration-guess weights; the balance gap is measured in THREADS' last [I] entry). Gate 1 is JOINT and comes first.

Lane A — Sprint 6

You are Lane A on SHADES 3D, Sprint 6. Rebase onto main, read THREADS' last [I] (the balance numbers) and SPRINT6.md. Gate 1 first, jointly with B+C: your levers are the drain weights in main.js, possibly ONE new close anchor for a bed-covering small quad (re-run your own smallest-full-coverage assert after), and verdict truthfulness (a 4/4 clean hold must never read "you skimped"). Then gate 2, the week: five escalating nights, money persists, broke = game over, survive = win screen, "play again" becomes "next night". Also: lift E's screenshot POST into server.py (delete tools/yardshot/), decide the grass atlas (take the recipe or delete it), and land the pond ticker + hail banner if Sprint 5 didn't. Shepherd as always.

Lane B — Sprint 6

You are Lane B on SHADES 3D, Sprint 6. Rebase onto main, read THREADS' last [I] and SPRINT6.md. You hold the pen on balance.test.js: for each storm, an enumerable $80 REAL-shop loadout on an in-band quad must end hp≥50 with <2 corners lost — and storm_02's line must genuinely need the repair or the broom (assert it fails without them). Then fabric choice in prep: porous shade cloth vs waterproof membrane (porosity exists in the sim) — agree the hail-vs-porosity rule with C in THREADS before coding, price the tradeoff. And post D the typical storm_02 belly-pond mass for their douse tuning.

Lane C — Sprint 6

You are Lane C on SHADES 3D, Sprint 6. Rebase onto main, read THREADS' last [I] and SPRINT6.md. Gate 1 partner: downdraft (0.40 also passes both physics gates per your own sweep) and hail-burst data are your levers. Then author the week's two storm variants (same JSON language, one new trick each) and forecast uncertainty: the card shows seeded ± ranges that resolve as the night approaches — DESIGN.md's partial-information canon, cheaply.

Lane D — Sprint 6

You are Lane D on SHADES 3D, Sprint 6. Rebase onto main, read SPRINT6.md. Calibrate the douse comedy to B's real pond masses (thresholds vs ~450 kg belly ponds), then play the balanced storms end to end as gate 1 lands and file feel notes in THREADS before it ships — you are the playtest lane, and after gate 2 you play the whole week.

Lane E — Sprint 6

You are Lane E on SHADES 3D, Sprint 6. Rebase onto main, read SPRINT6.md. Night dressing for the week's later storms (moon, lit house window), win-screen and game-over cards that feel like SHADES, and refresh the contact sheets once the balance pass lands.



SPRINT 7 prompts (one truth, then the week)

Same rules: own clone, own branch, rebase onto latest main FIRST. Read THREADS' last [I] entry (the harness dispute) then SPRINT7.md. Gate 0 is A+B jointly and NOTHING else lands before it.

Lane A — Sprint 7

You are Lane A on SHADES 3D, Sprint 7. Rebase onto main, read THREADS' last [I] and SPRINT7.md. Gate 0 first, paired with B on balance.test.js: reproduce your hp-58 win there or find why it doesn't (tension? repair timing? drain path?) — post the cause like B post-mortemed decision 11, delete the integrator skip. Then gate 1, the week: five nights (C's icenight is night five), persistent money, broke = game over, survive = E's win card with your text. Wire window_glow + moon for the night storms. Close the carried grass and screenshot-POST decisions — do them or write "won't do".

Lane B — Sprint 7

You are Lane B on SHADES 3D, Sprint 7. Rebase onto main, read THREADS' last [I] and SPRINT7.md. Gate 0 first, paired with A on balance.test.js — your suite is the single truth now; make it reproduce or refute A's win, name the cause. Then fabric choice per C's ruling: honest pricing + stone-size hail pass-through (ask C for hailBlockFor), fabric economics posted in THREADS before UI so A can slot prep.

Lane C — Sprint 7

You are Lane C on SHADES 3D, Sprint 7. Rebase onto main, read SPRINT7.md. Land hailBlockFor(size, porosity) when B asks; forecast uncertainty bands (carried — seeded ±, resolving toward the real numbers as the night nears); stand by on gate 0 in case the drain-wiring path is the discrepancy.

Lane D — Sprint 7

You are Lane D on SHADES 3D, Sprint 7. Rebase onto main, read SPRINT7.md. When gate 0 closes: the feel pass on the final balanced storms — it's the last read before John plays the week — plus the douse re-measure if pond masses moved (your guard assert is the tripwire). Until then, hold.

Lane E — Sprint 7

You are Lane E on SHADES 3D, Sprint 7. Rebase onto main, read SPRINT7.md. Light sprint: card text pass with A once the week exists, a dawn tint for the morning-after aftermath if cheap. You've earned the short one.



SPRINT 8 prompts (ship the week)

Same rules: own clone, own branch, rebase onto latest main FIRST. Read THREADS' last [I] entry then SPRINT8.md. Gate 0' is B+D's this time — A builds the week uninterrupted.

Lane A — Sprint 8

You are Lane A on SHADES 3D, Sprint 8. Rebase onto main, read SPRINT8.md. THE WEEK, uninterrupted, from day one — it has slipped twice and it ships this sprint: five nights (01→03→03b→02→02b), persistent money (pay = base by severity + garden bonus + hardware refund collateral), broke = game over, survive = win card. E's cards, words, and dawn-tint CSS are all on disk. "Play again" becomes "next night". Close the carried grass-atlas and screenshot-POST decisions — do or "won't do" in THREADS. You answer gate-0' questions but you do not work it. If gate 0' outcome B lands (the pyrrhic win), you rule on the win wording as part of the week's scoring.

Lane B — Sprint 8

You are Lane B on SHADES 3D, Sprint 8. Rebase onto main, read THREADS' last [I] and SPRINT8.md. Gate 0' with D: three candidate variables, in order — settle under LIVE calm wind with sway running (not t=0 held), frozen vs live sway re-measured settled, repair timing at a real walk. Stop at the first that flips the corner count; land D's settled-at-entry guard; post numbers either way. If the live game honestly loses 2, say so and hand the win rule to A as the pyrrhic-win design question. Then: fabric economics post + prep-UI slot with A (C's hailBlockFor is landed on their branch).

Lane C — Sprint 8

You are Lane C on SHADES 3D, Sprint 8. Rebase onto main, read SPRINT8.md. Forecast uncertainty bands (carried twice — the week gives you five forecasts to make them matter on); move your skyfx camera guard below the shadow rebuild so headless callers can never fly a cloth-less yard again.

Lane D — Sprint 8

You are Lane D on SHADES 3D, Sprint 8. Rebase onto main, read THREADS' last [I] and SPRINT8.md. Gate 0' with B — your settle finding is one fidelity step from closing the repo's longest thread; drive the suite the way a player drives the game (live calm settle, real repair walk timing) and land your settled-at-entry guard. Then the full-week feel pass — the last read before John plays.

Lane E — Sprint 8

You are Lane E on SHADES 3D, Sprint 8. Rebase onto main, read SPRINT8.md. Light: support A's five aftermath cards as the week wires them. That's it — your tripwires, cards, words and dawn tint from Sprint 7 are all being consumed this sprint.



SPRINT 9 prompts (the pyrrhic call, the $80 win, the second site)

Same rules: own clone, own branch, rebase onto latest main FIRST. Read THREADS' last [I] entry then SPRINT9.md.

Lane A — Sprint 9

You are Lane A on SHADES 3D, Sprint 9. Rebase onto main, read SPRINT9.md. Rule the pyrrhic win (B and D both recommend WIN = hp>=50 with corners priced in aftermath — your call, wire it, give the pyrrhic ending its own verdict), answer C's two flagged calls in THREADS (25%-cover squeak-win, clean-win-without-repair), then gate 2: extract the yard into data/sites/backyard_01.json so world.js builds from data, and load E's site_02. The week gains a site per night.

Lane B — Sprint 9

You are Lane B on SHADES 3D, Sprint 9. Rebase onto main, read THREADS' last [I] and SPRINT9.md. Ship fabric choice (C's hailBlockFor + honest pricing) PAIRED with C's 0.40 flip in one landing; re-point balance.test's THE LINE to C's p1,p2,p3,p4 and assert the $80 clean win, keeping the t2-quad pyrrhic assert as the sacrifice-play control. With D: redesign the demoted settled-at-entry trend guard (held-clock windows pond forever — advance real storm seconds or probe rainless; integrator measurements are in the comment). Then build tools/site_audit/ from your quad/coverage/afford sweep and run it on site_02 before it ships.

Lane C — Sprint 9

You are Lane C on SHADES 3D, Sprint 9. Rebase onto main, read SPRINT9.md. Pair the 0.40 downdraft flip with B's fabric landing (your condition, arrived). Then site_02's wind personality: shelters/venturi as site-JSON data — the corner block funnels the southerly.

Lane D — Sprint 9

You are Lane D on SHADES 3D, Sprint 9. Rebase onto main, read SPRINT9.md. With B: the trend-guard redesign, and bless or amend the integrator's 600 N floor. Then play site_02 cold and log where the verbs break (ladder assumes fascia height; a carport may not have one). You remain the playtest lane.

Lane E — Sprint 9

You are Lane E on SHADES 3D, Sprint 9. Rebase onto main, read SPRINT9.md. The second site: the corner block — smaller, paling-fenced, one tree, a carport — anchor-poor on purpose; its personality is "nowhere to tie off". Deterministic factory, contact sheet, and pyrrhic-ending card support when A rules.



SPRINT 10 prompts (sites are data)

Same rules: own clone, own branch, rebase onto latest main FIRST. Read THREADS' last [I] entry then SPRINT10.md. Gate 1 is A's, uninterrupted — everyone else's site work is already on disk waiting for it.

Lane A — Sprint 10

You are Lane A on SHADES 3D, Sprint 10. Rebase onto main, read SPRINT10.md. ONE headline, from day one: extract the yard into data/sites/backyard_01.json (world.js builds from data; byte-identical yard proven by the existing anchor tripwires and quad-band asserts), then author site_02_corner_block from the pieces already waiting (E's carport GLB, C's venturi schema — give C their two gap coordinates, D's work:"cloth"|"bracket" anchor field). The week gains a site per night; night 3 moves to the corner block. Nothing else until this lands.

Lane B — Sprint 10

You are Lane B on SHADES 3D, Sprint 10. Rebase onto main, read SPRINT10.md. Build tools/site_audit/ from your quad/coverage/afford sweep — one command, any site JSON, reports the winnable lines or names the blocking corner. Run it on site_02 the moment A's JSON exists; if there's no $80 line, tell E to move the tree (their standing offer). Answer C's porosity-into- gardenHailExposure question in THREADS.

Lane C — Sprint 10

You are Lane C on SHADES 3D, Sprint 10. Rebase onto main, read SPRINT10.md. Wire venturi from A's site JSON when it lands; decide the week's storm/site pairing so the corner block teaches the venturi (southerly on night 3?); land the porosity/gardenHailExposure one-liner if B says yes.

Lane D — Sprint 10

You are Lane D on SHADES 3D, Sprint 10. Rebase onto main, read SPRINT10.md. Land needsLadder on A's work-field (mechanism, not type — your own audit), then play site_02 cold and log feel notes. The carport traps should read tempting, not buggy.

Lane E — Sprint 10

You are Lane E on SHADES 3D, Sprint 10. Rebase onto main, read SPRINT10.md. Support site_02 as it lands: dressing adjustments, contact sheets, and a carport-collateral aftermath line/card if the trap earns one. If B's audit says the site has no winnable line, moving the tree is yours.



SPRINT 11 prompts (the corner block is mean, then the job sheet)

Same rules: own clone, own branch, rebase onto latest main FIRST. Read THREADS' last [I] entry then SPRINT11.md.

Lane A — Sprint 11

You are Lane A on SHADES 3D, Sprint 11. Rebase onto main, read SPRINT11.md. Gate 1 rulings first (carport collateral number — E proposes $180 with reasoning in the asset; widen the Anchor.type enum D flagged; answer C's venturi-gap question). Then gate 2, the job sheet: each night gains client

  • brief + pay schedule as data; forecast card becomes the job sheet, aftermath becomes the invoice. No reputation system yet — one week, five jobs, the framing. Shepherd as always.

Lane B — Sprint 11

You are Lane B on SHADES 3D, Sprint 11. Rebase onto main, read SPRINT11.md. Fix site_audit's headless false-negative (your setWorld ask), run it on site_02 WITH the venturi, and post the winnable lines. If the funnel kills every $80 line, C drops the gain before E moves the tree. Then support A's pay schedule with numbers (what does a good night on each site actually bank — your audit already knows).

Lane C — Sprint 11

You are Lane C on SHADES 3D, Sprint 11. Rebase onto main, read SPRINT11.md. Reconcile the venturi with A (site ships axis 2.1/gain 1.5; you measured 1.08/1.35 — one exchange, one edit), tune the gain to B's audit verdict, and land per-night forecast lead on the job sheet (your forecastLines lead param, waiting two sprints).

Lane D — Sprint 11

You are Lane D on SHADES 3D, Sprint 11. Rebase onto main, read SPRINT11.md. Play site_02 cold at last — the carport traps should read tempting, the funnelled southerly should make the ladder trip the site's thesis. File feel notes in THREADS. Then playtest the job-sheet week as A lands it.

Lane E — Sprint 11

You are Lane E on SHADES 3D, Sprint 11. Rebase onto main, read SPRINT11.md. Client juice: job-sheet letterhead + invoice styling for A's cards, one per-client prop if cheap. Stand by on the tree-move if B's audit demands it (C's gain drop goes first).


SPRINT 12 prompts (the steel tells the truth, the paperwork looks the part)

Same rules: own clone, own branch, rebase onto latest main FIRST. Read THREADS' last [I] entry then SPRINT12.md. New this sprint: launch.json is untracked — cp .claude/launch.example.json .claude/launch.json once per clone and pick your own port (suggested: A 8824, B 8825, C 8826, D 8827, E 8828; integration holds 8823).

Lane A — Sprint 12

You are Lane A on SHADES 3D, Sprint 12. Rebase onto main, read SPRINT12.md. Gate 3 is yours: paste E's letterhead/invoice kit from tools/jobsheet (between the CUT markers; keep .void), rule on the HARD YARDS masthead and keep the ABN sequential, and wire the kid's bike (site-JSON key + loader line — read E's Z lean note FIRST) with a ruling on its $60. Do NOT start reputation, site_03, or heatwave — gate 4 decides the branch at sprint end. Shepherd as always; B's re-audit may route retune proposals through you.

Lane B — Sprint 12

You are Lane B on SHADES 3D, Sprint 12. Rebase onto main, read SPRINT12.md. Gate 2 is yours: wire ratingHint into the failure threshold (A's ruling, THREADS sprint 11 — load > c.hw.rating * (anchor.ratingHint ?? 1)), with an assert on the CONSEQUENCE (cb blows before q at max tension through the funnel). Then re-audit BOTH yards — E's baked hints move everything with a GLB anchor — and post winnable lines per night. Numbers are E's: propose retunes in THREADS, don't nudge. Also fix the weak-link tie-break D flagged (strict < keeps first click; flag lowest rating × hint).

Lane C — Sprint 12

You are Lane C on SHADES 3D, Sprint 12. Rebase onto main, read SPRINT12.md. Two jobs: (1) be the second harness on B's post-wiring failure envelope — measure it through the storm while B measures it through the audit; if the two disagree, find the variable before anyone retunes. (2) Give the southerly buster's early change an in-world tell (skyfx): sky darkening from the south, the lull before the shift — deterministic (dt, t), readable without spoiling. D judges it.

Lane D — Sprint 12

You are Lane D on SHADES 3D, Sprint 12. Rebase onto main, read SPRINT12.md. Replay both yards AFTER B's ratingHint wiring lands: the trap should fire at default tension now (your measured fork), the ladder trip should fire by itself (your #6), the weak-link label should point honestly (your #7). Judge C's change-tell — does it telegraph without spoiling? — and re-read the backyard blurb A changed under you ("worked it for years" vs "your own place"). Feel notes in THREADS, receipts as always.

Lane E — Sprint 12

You are Lane E on SHADES 3D, Sprint 12. Rebase onto main, read SPRINT12.md. The gutter, the carport pattern, second time around: propose its collateral price with the reasoning baked beside it, and build the torn-gutter wreck that swaps on the same event. Expect retune proposals against your 0.22/0.30/0.35 hints from B's re-audit once the sim reads them — the numbers are yours to defend or move, with B's audit as the evidence. The tree-move stays cancelled.


SPRINT 13 prompts (the garden matters, the night looks like a night)

Same rules: own clone, own branch, rebase onto latest main FIRST (your local branch may be BEHIND origin after integration fast-forwards — start with git fetch origin && git reset --hard origin/lane/<x> on a clean tree). Read THREADS from the last two [I] entries — the QA pass entry is this sprint's evidence base — then SPRINT13.md. Per-clone launch.json: copy the example, pick your port (A 8824, B 8825, C 8826, D 8827, E 8828). Baseline selftest 335/0/0; keep it green after every landing; new asserts get mutation-checked. The game is PUBLIC now (partly.party/hardyards) — main must always be shippable.

Lane A — Sprint 13

You are Lane A on SHADES 3D, Sprint 13. Rebase onto main, read THREADS' last two [I] entries, then SPRINT13.md. Gate 3 is yours and it's the front door of a public game: pin the Enter-exploit fix with a regression assert (the hot-fix is already in your main.js with a comment — an advance() reachable from 'storm' must go red; mutation-check by reverting the guard), then the splash card (premise + controls + START, one more .card, not a menu system), P pause / M mute, and the touch-visitor notice. Gate 2 gives you two camera fixes: spawn framing (no pole through the player on boot) and the aftermath cloth-swallow (dead sail joins the camera's solid set). Two rulings will route to you: C's garden separation target (gate 1) and whether GARDEN_DRAIN moves once the shadow geometry is honest. Move the dev fps line out from under the anchor panel. Do NOT start reputation, site_03, or heatwave — gate 4 decides Sprint 14. Shepherd as always.

Lane B — Sprint 13

You are Lane B on SHADES 3D, Sprint 13. Rebase onto main, read THREADS' last two [I] entries, then SPRINT13.md. Gate 1.2 is yours: the audit's "cover%" told three people a $20 rig was bad while the sim paid it +$97 — once C lands the shadow-geometry fix, make the audit PREDICT the sim's garden outcome (same quantity, two harnesses) and re-post the per-night winnable-lines table; propose fee/bonus retunes in THREADS if night balance re-breaks, A rules. Gate 3 smalls in your files: BLOWN label collision for adjacent corners, setHardware() must not silently no-op on a bad key, standing-kN preview per corner in the prep panel (D's "first lesson costs $60 blind"), and rig.t must reset between nights. Stretch, only if room: sweep mixed-hardware fuse lines (D's +$147 exhibit) and rule-or-flag whether cheap-corner-as-fuse is depth or a hole.

Lane C — Sprint 13

You are Lane C on SHADES 3D, Sprint 13. Rebase onto main, read THREADS' last two [I] entries, then SPRINT13.md. You carry this sprint. Gate 1: the shadow GEOMETRY is the bug — measure rain/hail shadow over the bed (held rig vs bare bed, both yards, five storms), fix the model not the constant (hail's damage share, bed-level occlusion, storm hail timing — your pick, measured), and propose the separation target to A BEFORE tuning to it. The sim must make "sail up" vs "sail dead" read alive-vs-dead on wild nights. Gate 2: storm grade (sky/light/shadow keyed on intensity — the noon-blue 65 km/h sky is the QA pass's biggest visual finding), ground the front wall's base on the horizon and feather its hard vertical seam (judge from IN-YARD eye height, not your bench), and a handful of deterministic leaves streaming with the wind from ~30 km/h. Everything (dt, t) as always.

Lane D — Sprint 13

You are Lane D on SHADES 3D, Sprint 13. Rebase onto main, read THREADS' last two [I] entries, then SPRINT13.md. You are the verdict on both big gates. Gate 1: replay the QA pass's three scenarios exactly (night 2 cheap line; night 3 carport line with the sail dead at t=3; night 3 honest line) after C's model lands — losing the sail must COST the garden, holding it must SAVE it, numbers filed. Gate 2: judge the storm grade, the wall from inside the yard, the leaves, and wire E's wind clips in player.js (thresholds off wind.speedAt(player.pos), brace on the existing C key). Fix your two pool nits: the ladder label says "fascia" on a carport bracket, and the dropped spare's whereabouts after a knock. Also run down the ghost-white sliver near the shed table in aftermath — it smells like your ladder's placement ghost.

Lane E — Sprint 13

You are Lane E on SHADES 3D, Sprint 13. Rebase onto main, read THREADS' last two [I] entries, then SPRINT13.md. One job, done to your own standard: wind clips for the player — lean / stagger / brace, staged by wind band (calm, working breeze, gale), through the Mixamo pipeline. Deterministic factory, byte-identical across runs, dims verified, and LOOK at the silhouette before you ship (your bike rule: the verify can't answer "is this the right shape"). D wires them; agree the clip names and band thresholds with D in THREADS before you export. Stand by for retune arguments if gate 1's garden fix moves your bonus numbers — yours to defend or move, evidence in THREADS.


SPRINT 14 prompts (the yard editor — make sites makeable)

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 docs/MANUAL.md (new — the cookbook this sprint automates), THREADS from the last [I] entry, then SPRINT14.md. Ports: A 8824, B 8825, C 8826, D 8827, E 8828 (untracked launch.json, copy the example). Baseline selftest 362/0/0; the editor's export must be deterministic (same yard in, byte-identical JSON out) even though its UI needn't be.

Lane A — Sprint 14

You are Lane A on SHADES 3D, Sprint 14. Rebase onto main, read docs/MANUAL.md, THREADS' last [I], then SPRINT14.md. Gate 1 is yours: the yard editor core — web/world/editor.html + js/editor.js, rendering the REAL dressed world through the same loadSite/createWorld path the game uses. Place/drag/delete posts, trees, structures, bed, props via ground-plane raycast, writing the SAME named-key site-JSON shapes the loader reads (no parallel schema). Live validateSite in a panel; visible _design/_why authoring fields; canonical stable-key-order export; the round-trip assert (template → place → export → loadSite → boots). The export panel must say "a site is playable when a NIGHTS entry names it" — export ≠ shipped. B and C build INTO your page (score button, wind authoring) — agree the DOM seams with them in THREADS early, like the .letterhead contract. Pool: one look at the dev-line visibility default; re-check your phantom-sail view fix if it hasn't landed. Do NOT build reputation/site content/heatwave — gate 4 chooses.

Lane B — Sprint 14

You are Lane B on SHADES 3D, Sprint 14. Rebase onto main, read docs/MANUAL.md, THREADS' last [I], then SPRINT14.md. Gate 2.1 is yours: the SCORE IT button — your site_audit + gardenfly engines run in-page against A's in-memory edited yard (feed the site object, not a fetched JSON) and render a card: winnable lines at $80 funnel-ON, cheapest honest line, held-vs-bare separation, 15%-margin flags. Slow-on-demand is fine; a private harness is not — everything through windForSite() and the real commit→attach chain, and the gate-2.3 pin proves it: editor-scored wind == game-played wind at one probe point, one storm second, exact. Agree DOM seams with A in THREADS. Pool: the invoice line for night 5's beyond-saving garden (your S13 offer, A accepted — land it).

Lane C — Sprint 14

You are Lane C on SHADES 3D, Sprint 14. Rebase onto main, read docs/MANUAL.md, THREADS' last [I], then SPRINT14.md. Gate 2.2 is yours: wind authoring in A's editor — venturi placement with the axis drawn as a LINE through the gap (both ends; it's mod π and the UI should teach that), gain/radius sliders, tree-shelter cones as translucent volumes, and a wind-field overlay (arrows sampling speedAt across the yard at a chosen storm+time, deterministic, same seed path as the game). You co-own the gate-2.3 pin with B: editor wind == game wind, exact, asserted. Agree DOM seams with A in THREADS. Your windForSite() is the only wind the editor may ever build — that rule is one sprint old and already load-bearing.

Lane D — Sprint 14

You are Lane D on SHADES 3D, Sprint 14. Rebase onto main, read docs/MANUAL.md, THREADS' last [I], then SPRINT14.md. Gate 3.2 is yours and it's the sprint's real acceptance test: author a complete third yard COLD, editor only — no JSON hand-editing, no console. Your design instincts, any theme E's palette supports. Score it with B's button until it's winnable-but-mean, export it, wire its night in a scratch branch, play it, and file the whole experience in THREADS: every friction is gate-1/2 feedback, every delight is proof. Your yard is the site_03 CANDIDATE for gate 4 — make it one you'd defend. Pool: re-test the phantom-sail seam against A's view fix. Wait for A's gate-1 push before starting; judge B's score card and C's wind overlay as you use them in anger.

Lane E — Sprint 14

You are Lane E on SHADES 3D, Sprint 14. Rebase onto main, read docs/MANUAL.md, THREADS' last [I], then SPRINT14.md. Gate 3.1 is yours: audit the placeable set — every GLB the editor offers carries honest extras (rating_hint, collateral, collateral_key), gaps fixed in the factory — then build TWO new temptation props for D's palette: pick from the trampoline (typed honestly in the checked enum), the kids' swing set (two honest posts

  • a crossbar that is NOT an anchor and must not adopt), or a second tree species with a different branch ladder. Baked reasoning beside every 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 (the posts tell the truth, the editor stops being batch)

Same rules: own clone, own branch, git fetch origin && git reset --hard origin/lane/<x> on a clean tree first. The remote was RENAMED mid-Sprint-14 — it is monster/hardyards.git now, not monster/shades. All six checkouts are already repointed; if a push ever 404s, check for a rename before assuming loss. Read docs/MANUAL.md, THREADS' last [I], then SPRINT15.md. Ports: A 8824, B 8825, C 8826, D 8827, E 8828. Baseline 406/0/0.

Lane A — Sprint 15

You are Lane A on SHADES 3D (the game is HARD YARDS, public at partly.party/hardyards), Sprint 15. Rebase onto main, read docs/MANUAL.md, THREADS' last [I], then SPRINT15.md. Gate 1 ruling is yours and comes FIRST, before anyone measures: the factory bakes rating_hint = 0.9 on sail_post's top_anchor, but JSON-declared posts never run adoptAnchor and default to 1.00, so every honest post in the shipped game is 10% stronger than designed. Rule 0.90 (design intent reaches the sim) or 1.00 (the shipped, balanced-against value becomes canon and E corrects the bake) — both defensible, and every played verdict in THREADS measured 1.00. Then fix the MECHANISM either way: a baked hint must never again fail to reach a JSON-declared anchor silently. Gate 3 is also yours: Enter commits number fields, out-of-bounds placement must stop reading VALID, zoom beyond the wheel, and the separation-field question with B. Do NOT start reputation/site_03/heatwave — gate 4 is John's.

Lane B — Sprint 15

You are Lane B on SHADES 3D, Sprint 15. Rebase onto main, read docs/MANUAL.md, THREADS' last [I], then SPRINT15.md. Gate 2 is yours: D's verdict is that your 7582 s fully-blocked SCORE IT "made the editor batch, not iterative — I scored once and shipped that run rather than tuning." Fix it in D's priority order: a progress tick that actually paints first (D thinks that matters more than raw speed), then yielding so the page stays responsive, then speed (cost scales like C(n,4) in candidate quads — a coarse ranking pass before flying is likely worth more than micro-optimising the sim). Pin the current site_02 and site_03 scores before you start and reproduce them exactly after — a faster score that moved a number is a regression. Also with C: one storm picker, not two independently-defaulted ones. Gate 1.3: re-measure both yards once A rules the post hint, post the deltas as a table, propose retunes with evidence.

Lane C — Sprint 15

You are Lane C on SHADES 3D, Sprint 15. Rebase onto main, read docs/MANUAL.md, THREADS' last [I], then SPRINT15.md. Lighter sprint for you by design — gate 1 is a post-rating ruling and gate 2 is B's performance work. Yours: (1) with B, collapse the two independently-defaulted storm pickers into one shared selection (D scored the wildnight while viewing the southerly — two harnesses disagreeing inside a single page, which is the exact class of bug this repo keeps paying for). (2) Second-harness B's re-measure once A rules the post hint: if every post moves 10%, the storm side should predict the same shift your envelope tool would. (3) Your call on anything the wind panel revealed that you filed and didn't land — D called it "the best surface on the page", so if there's polish you wanted, this is the sprint with room for it.

Lane D — Sprint 15

You are Lane D on SHADES 3D, Sprint 15. Rebase onto main, read docs/MANUAL.md, THREADS' last [I], then SPRINT15.md. Two judgements, both yours alone. (1) Gate 1.4: once A rules the post hint and B re-measures, re-play the affected nights and say whether the change is FELT — if 0.90 makes the honest line stop holding, that is a design change wearing a bugfix's clothes and you are the one who says so. (2) Gate 2.3: re-author or re-tune a yard with B's faster score loop and say whether it changed how you work — your "batch, not iterative" line is what bought this sprint, so you are the acceptance test for the fix. Your site_03_swing_lawn stays inert until gate 4 picks the more-sites branch; don't wire it to a night.

Lane E — Sprint 15

You are Lane E on SHADES 3D, Sprint 15. Rebase onto main, read docs/MANUAL.md, THREADS' last [I], then SPRINT15.md. Gate 1.2 is yours and it's short: once A rules the sail_post hint (0.90 or 1.00), make the factory agree, and PIN it — an assert that a JSON-declared anchor of a type the factory rates carries that rating at runtime. This is the third member of the family your Sprint 14 audit started (no silent anchors, no unpriced collateral, and now no baked hint that never arrives), and it is the general fix for the bug class that shipped both the free carport and the perfect posts. With the sprint's spare room: your call on palette gaps D hit while authoring cold — read their gate-3.2 entry and propose what the next yard needs, with reasoning baked beside the numbers as always.