HardYards/LANE_PROMPTS.md
m3ultra f2fe5915c8 Add Sprint 11 plan and lane prompts: prove the corner block, then the job sheet
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 16:44:11 +10:00

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