# 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`, branch `lane/`, 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` on m3ultra), branch `lane/`, 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/` 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.