# 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 75–82 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.

---

# SPRINT 16 prompts (teeth — your work follows you) — ⚠️ FIRE ONLY AFTER SPRINT 15 INTEGRATES

Same rules: own clone, own branch, rebase onto latest main FIRST
(`git fetch origin && git reset --hard origin/lane/<x>` on a clean tree).
Read **ROADMAP.md** (the growth canon — John resolved the S14/S15 branch
question: all three, sequenced, teeth first), THREADS from the last [I],
then SPRINT16.md. Ports: A 8824, B 8825, C 8826, D 8827, E 8828. Baseline:
whatever Sprint 15 landed (409/0/0 pre-15 + S15's additions — read the [I]).
The one-variable rule is law: the new site and the new storm never debut on
the same night. Numbers S15's post ruling moved get RE-MEASURED before they
get pinned — no pre-ruling number survives into a pin.

## Lane A — Sprint 16
> You are Lane A on HARD YARDS, Sprint 16. Rebase onto main, read ROADMAP.md,
> THREADS' last [I], then SPRINT16.md. Gate 1 is yours: THE LEDGER. The week
> records every committed rig (corners, hardware, what broke, what was
> repaired); a corner still broken at dawn books a WARRANTY line on the next
> morning's job sheet — hardware's shop price, off the fee AT QUOTE TIME, so
> week.js's quote==settle invariant holds by construction. Reputation is one
> number on the letterhead (job sheet AND invoice, E's contract): clean
> nights up, warranty down, collateral down harder, and it moves the callout
> fee multiplier ON THE SHEET so trust becomes visible money. Night 5's
> gardenBeyondSaving must not cost rep — a designed loss the ledger punishes
> is the verdict lying again. Aftermath and end-of-week card speak rep.
> a.test: warranty only on unrepaired breaks; quote==settle with a warranty
> line; rep untouched on designed losses; clean-week negative control. You
> also print C's hail-size and rain lines on the forecast block (their gate
> 3.3 exposes them). Do NOT build the job board — arc 2, and gate 6 aims it.

## Lane B — Sprint 16
> You are Lane B on HARD YARDS, Sprint 16. Rebase onto main, read ROADMAP.md,
> THREADS' last [I], then SPRINT16.md. Gate 2 is yours. (a) THE HEAL: after a
> divergence break (landed in the fresh-eyes review — read that [I]), non-
> finite node positions reset from the nearest finite neighbour (prev matched
> — verlet must not invent velocity) and non-finite WATER zeroes (a NaN pond
> re-poisons the heal through the weight term); assert finite within 1 s,
> mutation-proof, and the existing divergence test stays untouched. (b) THE
> RECORD: the chosen fabric prints in prep summary, invoice, and the verdict
> when it mattered — the F key exists, now the paperwork remembers the bet.
> (c) THE PIN, post-ruling numbers only: run gardenfly on site_02 (and the
> swing lawn if unpinned), pin the honest held-vs-bare separation, assert it
> like backyard_01's; if a yard can't separate at $80 that's a FINDING for
> THREADS, not a fudged pin. Pool: the >83 ms determinism bound gets a
> pinning test or a documented waiver.

## Lane C — Sprint 16
> You are Lane C on HARD YARDS, Sprint 16. Rebase onto main, read ROADMAP.md,
> THREADS' last [I], then SPRINT16.md. Gate 3 is yours. (1) STORM_06, the
> pea-hail soaker: stones under your own 2 mm-weave blocking ruling, heavy
> rain, mild wind — the first night membrane is the RIGHT answer. Cloth must
> leak fine hail all night; membrane must pond (the broom matters); the
> membrane line must be affordable at $80 and MEASURABLY better — gardenfly
> and site_audit numbers pinned in your selftest, funnel state in the header,
> post-ruling tree only. If cloth still wins, retune until the bet is real: a
> decoration night is worse than no night. (2) makeStorm(seed): a seeded
> generator inside authored envelopes, deterministic (same seed → byte-equal
> def), schema-valid across 100 seeds, storm_envelope-tested — arc 4's
> roguelite eats this; no shipped night uses it yet. (3) Expose hail stone
> size and rain rate for the forecast block (A prints them) — bands, not
> promises. The one-variable rule binds you to D: storm_06 flies over a yard
> the player already knows.

## Lane D — Sprint 16
> You are Lane D on HARD YARDS, Sprint 16. Rebase onto main, read ROADMAP.md,
> THREADS' last [I], then SPRINT16.md. Gate 4 is yours. (1) Your swing lawn
> enters the rotation: re-score site_03_swing_lawn on the post-ruling tree
> with S15's faster loop (the numbers that made it winnable-but-mean may have
> moved), fix what moved, wire its NIGHTS entry. (2) The week becomes SIX
> nights: you own the order and the two new briefs (client flavour is data —
> the corner block got a name and a reason; the swing set's kid deserves one
> too). One-variable rule: the swing lawn debuts under a storm the player has
> survived; storm_06 flies over a yard they know; never both new at once.
> Night 5's beyond-saving arc and going-broke-never-on-the-final-night must
> survive your re-ordering — a.test will tell you. (3) Cold-play all six on
> one wallet and file the verdict: is a warranty line FAIR when it lands?
> Does rep-moves-pay feel earned? Is night 6's bet legible from the forecast
> alone? Your play is gates 1–3's acceptance. Pool: the phantom-sail seam if
> S15 didn't close it.

## Lane E — Sprint 16
> You are Lane E on HARD YARDS, Sprint 16. Rebase onto main, read ROADMAP.md,
> THREADS' last [I], then SPRINT16.md. Gate 5 is yours: arc 2 needs yards
> this palette cannot dress. Build TWO of three, factory-built, byte-stable,
> negative-control-proven, and every anchor-bearing node passes S15's gate-1
> mechanism (a baked hint that can't reach a JSON-declared anchor is the bug
> class that cost the posts their truth): the GLASSHOUSE (collateral apex —
> priced, wrecked variant, collateral_key wired so a SECOND one placed in
> the editor still bills; nothing about it adopts as an anchor), the POOL
> KIT (pool + compliant fence ring where every fence post is honest
> tie_off:false — adoptAnchor's `?? 1` makes a silent node the best steel in
> the game, and the pool yard's whole puzzle is that the legal tie-offs are
> in the wrong places), the TRAMPOLINE + tie-down kit (typed honestly in the
> checked enum; the tie-down is prep's counter to the storm's opening
> projectile, priced like it matters). Flag D in THREADS as each lands. Axis
> trap stands: measure exported GLBs in three.js coords, look at the render
> in assetcheck, never trust a docstring about orientation.
