HardYards/LANE_PROMPTS.md
m3ultra 3dee2a7c83 Merge origin/main: S14 lane integration + review fixes; TEETH becomes SPRINT16
Two same-day integrations reconciled: their SPRINT15 (post ruling, editor
iterative, honest edges) stands and runs first because it re-measures the
numbers TEETH pins; the TEETH plan moves to SPRINT16 with a fires-after-15
banner, its D gate rewired to the landed swing lawn. ROADMAP arc 0 records
the fork. THREADS keeps both sides chronologically.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 10:34:21 +10:00

1015 lines
57 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Lane launch prompts (Opus 4.8, run on the M1 Ultra)
Per lane: clone `git@gitea.partly.party:monster/shades.git` to
`~/Documents/shades-lane<X>`, branch `lane/<x>`, paste the prompt.
Lane A starts first; B/C/D/E can start immediately after in parallel
(they develop against contracts + selftest mocks until A's M0 merges).
---
## Lane A — world, shell & integration
> You are Lane A on SHADES 3D. Read PLAN3D.md fully (you own §5 Lane A), then
> DESIGN.md, then play prototype/ (`python3 -m http.server 8642 --directory
> prototype`). Build the M0 skeleton exactly per PLAN3D §3/§4/§5-A: vendored
> three.js copied from ~/Documents/90sDJsim/web/world/vendor/, stdlib server.py
> on 8801, contracts.js, graybox 30×20 m yard with house edge/trees/posts/garden
> bed, third-person camera, sun lighting, selftest.html harness. Merge M0 to
> main as fast as possible — every other lane rebases on you. Then build the HUD
> against mock data, and act as merge shepherd per PLAN3D §6. Log every landing
> in THREADS.md.
## Lane B — sail simulation & rigging
> You are Lane B on SHADES 3D. Read PLAN3D.md fully (you own sail.js +
> rigging.js, §5 Lane B), DESIGN.md §geometry/§hardware, and prototype/game.js —
> your job is the faithful 3D port of its cloth/load/failure behavior. Build the
> 3D verlet cloth with per-FACE wind pressure (F ∝ area·dot(wind,normal)²) so
> hypar twist genuinely sheds load — prove it with the selftest assert (twisted
> rig peak load < flat rig peak load in the same storm). Corner load = smoothed
> incident-spring stretch; break after 0.4 s sustained overload; flogging must
> be emergent from the freed node. Then the prep-phase rigging UI with the
> prototype's economy. Until Lane A's M0 merges, develop inside selftest.html
> with a stub wind function; keep every module deterministic (dt,t in — no
> Date.now, no rAF in sim code). Log in THREADS.md.
## Lane C — weather, sky & debris
> You are Lane C on SHADES 3D. Read PLAN3D.md fully (you own weather.js,
> skyfx.js, debris.js, data/storms/, §5 Lane C) and prototype/game.js's gust
> scheduler — port its telegraph/ramp/hold/fade shape. Implement
> wind.sample(pos,t) per contracts.js: base curve + gusts + direction change +
> spatial noise + tree wind-shadow. Storms are data (JSON, PLAN3D §4) — author
> storm_01_gentle and storm_02_wildnight. Then instanced rain following local
> wind, storm sky + lightning flash, WebAudio layers (wind bed, gust whoosh,
> rope creak keyed to max corner load, flog when broken), and hand-rolled
> debris (crates/tubs from models/debris/) with player knockdown + sail impulse.
> No physics engine, no deps. Selftest: telegraph lead ≥1.2 s, wind continuity,
> storm JSON validator. Log in THREADS.md.
## Lane D — player character & interaction
> You are Lane D on SHADES 3D. Read PLAN3D.md fully (you own player.js +
> interact.js, §5 Lane D) and 90sDJsim's DEVMANUAL rigged-characters section
> (~/Documents/90sDJsim/DEVMANUAL.md) — its loading rules are law
> (SkeletonUtils.clone, head-bone height normalize, never blind setScalar).
> Copy a ped from ~/Documents/90sDJsim/web/world/models/peds/ into models/
> (copies rule), merge Walk/Running/Happy Idle clips via ~/Documents/
> character_kit/ pipeline; queue Climbing Ladder / crank / dig on the
> ~/Documents/mixamo-fetch wishlist for M3. Camera-relative WASD + anim state
> machine, wind slow/shove/knockdown per PLAN3D, and hold-E interactions via
> interact.register (re-rig with spare 2.5 s, per-corner turnbuckle trim 1.2 s,
> carry-one-item from shed table). Selftest: state machine table test. Log in
> THREADS.md.
## Lane E — nature & hardware assets (Blender)
> You are Lane E on SHADES 3D. Read PLAN3D.md fully (you own tools/blender/ +
> models/, §5 Lane E). Study the house Blender-scripting idiom in
> ~/Documents/3D-STORE/build_booth_room_v23.py and racks_to_glb.py, then write
> ONE deterministic tools/blender/build_yard_assets.py that generates every
> deliverable in PLAN3D §5-E (gum trees with named canopy/branch_anchor nodes,
> fence set, house_yardside with fascia_anchor empties, shed + table, garden
> bed with 3 damage states, raked sail post, ladder, close-up shackle/
> carabiner/turnbuckle, ref_capsule) and exports meter-scale Y-up GLBs, <15 k
> tris, low-poly stylized to sit beside the 90sDJsim ped fleet. Also copy +
> scale-check the debris set from ~/Documents/3D-STORE/clean_glbs/ into
> models/debris/. Verify every export by rendering a contact sheet against the
> 1.7 m ref capsule (the 3D=models/_thumbnails pattern). Commit script AND
> GLBs. Log in THREADS.md.
---
---
# SPRINT 2 prompts (assembly — fire A/B/C/E together, D at gate 1)
Same rules: own clone (`~/Documents/shades-lane<X>` on m3ultra), branch `lane/<x>`,
rebase onto latest main FIRST (it moved: all lanes merged + importmap + path
fixes + M3 clip pack). Read THREADS.md from the [I] integrator entries down,
then SPRINT2.md in full — the six decisions at the top are final, stop
re-deciding them.
## Lane A — Sprint 2
> You are Lane A on SHADES 3D, Sprint 2. Rebase onto main, read THREADS.md's
> [I] entries and SPRINT2.md §Lane A. Your sprint IS the assembly: in main.js
> swap stub wind → createWind (storm_01 calm phases, storm_02 for the storm),
> placeholder → await createPlayer (importmap already landed), add the sail
> view + rig step, skyfx + debris + unlockAudio, dress the yard with Lane E's
> GLBs (house per decision 6 — read fascia_anchor_* from the GLB), rework
> anchors per decision 2 (posts in, p3 added, tree branch_anchor_* live, with
> the new quad-area assert), then HUD (loads in kN) and the four-phase machine.
> Post "gate 1" in THREADS.md the moment weather+player+sail are live in the
> yard so Lane D starts. Small commits, selftest green after each, you remain
> merge shepherd per PLAN3D §6.
## Lane B — Sprint 2
> You are Lane B on SHADES 3D, Sprint 2. Rebase onto main, read THREADS.md [I]
> entries and SPRINT2.md §Lane B + decisions 3/4/5. Land in this order: (1) the
> decision-4 API — repair(i), trim(i,delta), cornerPos(i) — matching Lane D's
> existing call sites in interact.js, with contract entries + asserts; (2)
> decision 5 — consume debris.pieces in sail.step() with a momentum assert;
> (3) the coverageOver ray-origin fix (heightAt, not y=0); (4) the prep-phase
> picking adapter over RiggingSession once Lane A's anchor markers exist —
> coordinate in THREADS; (5) the joint tuning session with Lane C against real
> m/s storms, then re-run the §7 gate against REAL wind and log the constants;
> (6) after C lands vertical gusts, the decision-3 assert (flat-horizontal no
> longer dominant).
## Lane C — Sprint 2
> You are Lane C on SHADES 3D, Sprint 2. Rebase onto main, read THREADS.md [I]
> entries and SPRINT2.md §Lane C + decision 3. Land: (1) vertical gust
> component in storm JSON (downdraft fraction, ~0.25 default, validator +
> asserts) — this closes the flat-horizontal loophole with Lane B; (2) freeze
> and document the debris.pieces shape in contracts.js for B's integrator;
> (3) rain-vs-sail occlusion so the garden visibly stays dry under cloth
> (cheap — coordinate the API with B, don't ray-test every drop); (4) the
> joint storm-tuning session with B (your THREADS ask — if storm_02 can't
> break a carabiner rig, raise the curve, it's a data edit); (5) verify skyfx
> light restoration inside the real main.js phase transitions once Lane A
> wires it.
## Lane D — Sprint 2 (start at gate 1)
> You are Lane D on SHADES 3D, Sprint 2. Rebase onto main FIRST — the M3 clip
> pack landed: player_anims.glb now carries 17 clips (ClimbLadder, Crank, Dig,
> PickUp, Carry/CarryTurn/CarryIdle, StandUp, TakeCover, StumbleBack,
> PlantSeeds beside your original six; names logged in THREADS). Also note the
> integrator fixed /world/ → ./ relative paths in player.js and dev_player.html.
> Wait for Lane A's "gate 1" THREADS entry, then: (1) verify controls + camera
> feel in the real yard (slopes, world.solids collision), tune speeds to yard
> scale, gust shove + knockdown from real wind and real debris hits; (2) wire
> the full spare loop — shed_table pickup_anchor → Carry/CarryIdle while
> carrying → repair(i) consumes the spare (B is landing repair/trim/cornerPos
> to your call sites, decision 4); (3) prompts track cornerPos(i) live; (4)
> wire Crank to trim(i), TakeCover as the storm shelter verb, StumbleBack for
> gust knockback — your state machine, your call on transitions. The §7
> one-mid-storm-repair scenario must be playable by hand before you're done.
## Lane E — Sprint 2 (small)
> You are Lane E on SHADES 3D, Sprint 2. Rebase onto main, read SPRINT2.md
> §Lane E. Small sprint: (1) canopy sway handles — verify your canopy_* nodes
> sway cleanly when Lane A drives them, add sway_hint props if per-tree tuning
> is needed; (2) a 512² sail cloth weave atlas + tear decal strip so the
> membrane reads as fabric; (3) storm dressing set: wheelie bin (mass_hint),
> washing line, garden gnome — same one-script determinism + contact-sheet
> acceptance; (4) when Lane A's yard is dressed, render a contact sheet of the
> assembled yard from the game camera for DESIGN.md.
---
---
# SPRINT 3 prompts (the game loop — fire all five; B+C pair on item 1)
Same rules: own clone, own branch, rebase onto latest main FIRST (Sprint 2 is
merged; main.js passes debris into rig.step; downdraft data reverted to 0.3
with B's assert self-skipping — THREADS' last [I] entry explains why). Read
SPRINT3.md in full; decisions 7/8/9 are made.
## Lane A — Sprint 3
> You are Lane A on SHADES 3D, Sprint 3. Rebase onto main, read SPRINT3.md
> §Lane A. Priority 1 is world.shedTable (unblocks D, ~15 lines). Then the
> decision-2 anchor rework with the quad-area assert, the playable prep phase
> (wire B's picking adapter, take their preview-rig force-arrows offer), the
> HUD (kN bars, telegraph, garden HP via skyfx.rainShadowOver per decision 7,
> plant damage-state swaps), forecast card + aftermath screen (score the gnome),
> and finish the yard dressing with E's GLBs and sway handles. Retitle the page.
> Merge shepherd duties continue. Small commits, selftest green after each.
## Lane B — Sprint 3
> You are Lane B on SHADES 3D, Sprint 3. Rebase onto main and read SPRINT3.md
> §B+C and THREADS' last [I] entry — the integrator measured that gust-only
> downdraft cannot satisfy your 60% bar and §7 together (0.45→42% + twisted
> loses a corner; 0.58→48% + still loses one), so decision 8 adopts your
> fraction-of-TOTAL semantics. Pair with C in THREADS: when their weather.core
> change lands, re-run your 8-direction sweep, delete the <0.5 self-skip from
> your decision-3 assert, and confirm all three §7 legs on the SAME storm JSON.
> Log final constants. Then sail UVs with E's sail_weave.png per their recipe.
> Also: A may take your preview-rig offer for prep force arrows — support them.
## Lane C — Sprint 3
> You are Lane C on SHADES 3D, Sprint 3. Rebase onto main and read SPRINT3.md
> §B+C and THREADS' last [I] entry. Decision 8: change weather.core downdraft
> to a fraction of TOTAL wind speed (keep the own-RNG determinism guarantee,
> keep speedAt() horizontal, update the validator; rename the JSON field if the
> semantics warrant it), then pair with B to land values where their 60% bar
> AND the §7 gates are green on the same data. Retune storm_01/storm_02, and
> author storm_03 between them so the campaign has a ramp. Decision 7 landed
> garden HP on your rainShadowOver — coordinate the API with A as they wire it.
## Lane D — Sprint 3
> You are Lane D on SHADES 3D, Sprint 3. Rebase onto main, read SPRINT3.md
> §Lane D. The moment A posts world.shedTable in THREADS: close the §7 loop BY
> HAND — pickup → carry through gusts (brace when needed) → hold-E repair →
> ≥3/4 corners at storm end — and RECORD the run (SHADES.step + screenshots);
> that artifact is the sprint's definition of done. Retune stumble/knockdown
> thresholds against real storm_02 gusts now that the downdraft is live.
> Stretch: the ladder loop (carry, place, ClimbLadder to fascia anchors) —
> flag early in THREADS if it's bigger than the sprint.
## Lane E — Sprint 3
> You are Lane E on SHADES 3D, Sprint 3. Rebase onto main, read SPRINT3.md
> §Lane E. Small juice pass: tear-decal hookup recipe for B (like your weave
> recipe), broken-gnome + snapped-fence-panel variants for the aftermath
> screen, and refresh the assembled-yard contact sheet once A's dressing lands.
---
---
# SPRINT 4 prompts (face & water — fire all five)
Same rules: own clone, own branch, rebase onto latest main FIRST (Sprint 3
merged; yard has 11 anchors incl. branch anchors; gate 3 was met by hand).
Read THREADS' last [I] entry (the dispute ruling) then SPRINT4.md — decisions
10/11/12 are made.
## Lane A — Sprint 4
> You are Lane A on SHADES 3D, Sprint 4. Rebase onto main, read SPRINT4.md
> §Lane A — you are the critical path and it's all UI: hud.js (kN corner bars,
> telegraph, garden HP via rainShadowOver with C's helper, plant damage swaps),
> mouse-driven prep via B's picking adapter + their force-arrow preview offer,
> the forecast card (three storms exist — picking one is the difficulty
> select), the aftermath screen with E's wreckage swaps (broken gnome, snapped
> fence), and retitle the page. Small commits, selftest green, merge shepherd
> as always. Gate 1 is A-1+A-2: playable with eyes and mouse, no console.
## Lane B — Sprint 4
> You are Lane B on SHADES 3D, Sprint 4. Rebase onto main, read THREADS' last
> [I] ruling and SPRINT4.md §Lane B. Decision 11 first, one afternoon: re-point
> §7's twisted rig to a real 18-45 m² quad from A's dressed yard, re-run the
> three §7 legs + the 8-heading 60% sweep at 0.45 and 0.40 on REAL anchors,
> post the numbers, then either bump storm_02 downdraftOfTotal to the passing
> value or retire the bar — no third sprint on this. Then ponding v1 per
> decision 10 (the 40× rain fiat is made): accumulation × flatness → node
> water mass → weight; pondMass() for the HUD; dump on corner break; asserts
> that a hypar pools nothing and a flat rig dies of water in storm_02. Then
> evaluate a per-face force clamp for D's tn-1.04 stability cliff.
## Lane C — Sprint 4
> You are Lane C on SHADES 3D, Sprint 4. Rebase onto main, read SPRINT4.md
> §Lane C. Partner B on decision 11 (match the landed storm value, resolve your
> held-value comment in storm_02 with satisfaction). Make the three storms'
> rainAt curves tell the ponding story (storm_02 can kill a flat rig by water,
> storm_01 can't). Support A's HUD (the rainShadowOver drain helper you
> offered, telegraph feed). Optional night pass: darken wildnight properly,
> lightning on the biggest gusts.
## Lane D — Sprint 4
> You are Lane D on SHADES 3D, Sprint 4. Rebase onto main, read SPRINT4.md
> §Lane D — decision 12 green-lights your ladder spec exactly as you wrote it:
> carry-ladder as a second carry type with hands-full rules, placement with a
> valid-surface test + fascia-anchor snap, code-driven climb height with
> ClimbLadder on top, work stance at height where hold-E fascia repairs land
> in shoving wind. Selftest the state legs + a scripted climb-repair-descend.
> When A's prep UI lands, playtest the whole loop like a player and log feel
> notes in THREADS — you're the only lane that does.
## Lane E — Sprint 4
> You are Lane E on SHADES 3D, Sprint 4. Rebase onto main, read SPRINT4.md
> §Lane E. Small water-and-wreckage pass: pond water disc/decal that rides the
> sim nodes (your tear recipe pattern) scalable by pond mass, broom_01.glb
> (the prop waits for the mechanic), fence_panel_snapped if not shipped, and
> refresh the assembled-yard contact sheet for DESIGN.md — the yard finally
> looks like the game.
---
---
# SPRINT 5 prompts (hail & the broom — fire all five)
Same rules: own clone, own branch, rebase onto latest main FIRST (Sprint 4
merged; router passes rain data; downdraftOfTotal 0.45; decision 13 ruled).
Read THREADS' last [I] entry then SPRINT5.md.
## Lane A — Sprint 5
> You are Lane A on SHADES 3D, Sprint 5. Rebase onto main, read SPRINT5.md
> §Lane A. Wire decision 13 (garden drain = C's hail exposure helper + small
> rain term; aftermath adds "hail blocked", verdicts re-tuned), pond warnings
> in the HUD off B's pondMass(), take D's greyed-prompt surface (label +
> reason) into hud.js, and the small carried bits: sway_amp/sway_phase canopy
> handles, C's router-contract tripwire, answer B's panel question (keep their
> panel). Keep 60 fps with hail + rain + ponding live. Shepherd as always.
## Lane B — Sprint 5
> You are Lane B on SHADES 3D, Sprint 5. Rebase onto main, read SPRINT5.md
> §Lane B — the water arc has been carried twice and everything now waits on
> it. Ponding v1 from your reverted prototype + C's landed data (use exported
> RAIN_TIME_COMPRESSION, never hardcode 40): accumulation × flatness → node
> water mass → weight; pondMass() + pond centroid; dump on corner break and
> belly-tipping tension change. Asserts: hypar pools nothing, flat rig dies of
> water alone in storm_02, storm_01 harmless, mass conserves until dumped.
> Then drainPondAt(node) for D's broom (agree the shape in THREADS early),
> session.reset() for A, and the tn-1.04 stability clamp (post §7 deltas
> before landing).
## Lane C — Sprint 5
> You are Lane C on SHADES 3D, Sprint 5. Rebase onto main, read SPRINT5.md
> §Lane C — hail is yours and it's decision 13's engine. Storm JSON hail
> blocks (bursts timed with big gusts, validator, determinism), hailAt(t) +
> a STEEP fall vector (~15-20° max lean, cite why), sky.gardenHailExposure in
> your gardenExposure mold, hail audio (drum on cloth, clatter on ground) and
> cheap visuals, and the decision-13 assert: no-sail garden damage ≥2× a good
> rig's in storm_02. storm_02 gets its burst at the change; storm_03 mild;
> storm_01 none.
## Lane D — Sprint 5
> You are Lane D on SHADES 3D, Sprint 5. Rebase onto main, read SPRINT5.md
> §Lane D — the broom is yours and it's the gate: take broom (hands-full rules
> vs spare/ladder), walk under the belly, hold-E poke (Crank/Dig per E's
> anim_hint) → B's drainPondAt() → the water dumps ON YOU (stagger if big —
> comedy is the point) and the sail springs back. Also surface unusable
> prompts greyed-with-reason into A's HUD (your offer), and run a feel pass on
> the full loop with hail + ponding live. Log everything in THREADS.
## Lane E — Sprint 5
> You are Lane E on SHADES 3D, Sprint 5. Rebase onto main, read SPRINT5.md
> §Lane E. Small juice pass: hail impact pips + ground ring decal
> (instanced-friendly, stone mesh only if C asks), plant-shred particle puff
> for hail hits on the bed, and the carried contact-sheet refresh (night +
> daylight) for DESIGN.md.
---
---
# SPRINT 6 prompts (winnable, then a week of nights)
Same rules: own clone, own branch, rebase onto latest main FIRST (Sprint 5
merged; decision 13 wired with integration-guess weights; the balance gap is
measured in THREADS' last [I] entry). Gate 1 is JOINT and comes first.
## Lane A — Sprint 6
> You are Lane A on SHADES 3D, Sprint 6. Rebase onto main, read THREADS' last
> [I] (the balance numbers) and SPRINT6.md. Gate 1 first, jointly with B+C:
> your levers are the drain weights in main.js, possibly ONE new close anchor
> for a bed-covering small quad (re-run your own smallest-full-coverage assert
> after), and verdict truthfulness (a 4/4 clean hold must never read "you
> skimped"). Then gate 2, the week: five escalating nights, money persists,
> broke = game over, survive = win screen, "play again" becomes "next night".
> Also: lift E's screenshot POST into server.py (delete tools/yardshot/),
> decide the grass atlas (take the recipe or delete it), and land the pond
> ticker + hail banner if Sprint 5 didn't. Shepherd as always.
## Lane B — Sprint 6
> You are Lane B on SHADES 3D, Sprint 6. Rebase onto main, read THREADS' last
> [I] and SPRINT6.md. You hold the pen on balance.test.js: for each storm, an
> enumerable $80 REAL-shop loadout on an in-band quad must end hp≥50 with <2
> corners lost — and storm_02's line must genuinely need the repair or the
> broom (assert it fails without them). Then fabric choice in prep: porous
> shade cloth vs waterproof membrane (porosity exists in the sim) — agree the
> hail-vs-porosity rule with C in THREADS before coding, price the tradeoff.
> And post D the typical storm_02 belly-pond mass for their douse tuning.
## Lane C — Sprint 6
> You are Lane C on SHADES 3D, Sprint 6. Rebase onto main, read THREADS' last
> [I] and SPRINT6.md. Gate 1 partner: downdraft (0.40 also passes both physics
> gates per your own sweep) and hail-burst data are your levers. Then author
> the week's two storm variants (same JSON language, one new trick each) and
> forecast uncertainty: the card shows seeded ± ranges that resolve as the
> night approaches — DESIGN.md's partial-information canon, cheaply.
## Lane D — Sprint 6
> You are Lane D on SHADES 3D, Sprint 6. Rebase onto main, read SPRINT6.md.
> Calibrate the douse comedy to B's real pond masses (thresholds vs ~450 kg
> belly ponds), then play the balanced storms end to end as gate 1 lands and
> file feel notes in THREADS before it ships — you are the playtest lane, and
> after gate 2 you play the whole week.
## Lane E — Sprint 6
> You are Lane E on SHADES 3D, Sprint 6. Rebase onto main, read SPRINT6.md.
> Night dressing for the week's later storms (moon, lit house window),
> win-screen and game-over cards that feel like SHADES, and refresh the
> contact sheets once the balance pass lands.
---
---
# SPRINT 7 prompts (one truth, then the week)
Same rules: own clone, own branch, rebase onto latest main FIRST. Read THREADS'
last [I] entry (the harness dispute) then SPRINT7.md. Gate 0 is A+B jointly
and NOTHING else lands before it.
## Lane A — Sprint 7
> You are Lane A on SHADES 3D, Sprint 7. Rebase onto main, read THREADS' last
> [I] and SPRINT7.md. Gate 0 first, paired with B on balance.test.js: reproduce
> your hp-58 win there or find why it doesn't (tension? repair timing? drain
> path?) — post the cause like B post-mortemed decision 11, delete the
> integrator skip. Then gate 1, the week: five nights (C's icenight is night
> five), persistent money, broke = game over, survive = E's win card with your
> text. Wire window_glow + moon for the night storms. Close the carried grass
> and screenshot-POST decisions — do them or write "won't do".
## Lane B — Sprint 7
> You are Lane B on SHADES 3D, Sprint 7. Rebase onto main, read THREADS' last
> [I] and SPRINT7.md. Gate 0 first, paired with A on balance.test.js — your
> suite is the single truth now; make it reproduce or refute A's win, name the
> cause. Then fabric choice per C's ruling: honest pricing + stone-size hail
> pass-through (ask C for hailBlockFor), fabric economics posted in THREADS
> before UI so A can slot prep.
## Lane C — Sprint 7
> You are Lane C on SHADES 3D, Sprint 7. Rebase onto main, read SPRINT7.md.
> Land hailBlockFor(size, porosity) when B asks; forecast uncertainty bands
> (carried — seeded ±, resolving toward the real numbers as the night nears);
> stand by on gate 0 in case the drain-wiring path is the discrepancy.
## Lane D — Sprint 7
> You are Lane D on SHADES 3D, Sprint 7. Rebase onto main, read SPRINT7.md.
> When gate 0 closes: the feel pass on the final balanced storms — it's the
> last read before John plays the week — plus the douse re-measure if pond
> masses moved (your guard assert is the tripwire). Until then, hold.
## Lane E — Sprint 7
> You are Lane E on SHADES 3D, Sprint 7. Rebase onto main, read SPRINT7.md.
> Light sprint: card text pass with A once the week exists, a dawn tint for
> the morning-after aftermath if cheap. You've earned the short one.
---
---
# SPRINT 8 prompts (ship the week)
Same rules: own clone, own branch, rebase onto latest main FIRST. Read THREADS'
last [I] entry then SPRINT8.md. Gate 0' is B+D's this time — A builds the week
uninterrupted.
## Lane A — Sprint 8
> You are Lane A on SHADES 3D, Sprint 8. Rebase onto main, read SPRINT8.md.
> THE WEEK, uninterrupted, from day one — it has slipped twice and it ships
> this sprint: five nights (01→03→03b→02→02b), persistent money (pay = base by
> severity + garden bonus + hardware refund collateral), broke = game over,
> survive = win card. E's cards, words, and dawn-tint CSS are all on disk.
> "Play again" becomes "next night". Close the carried grass-atlas and
> screenshot-POST decisions — do or "won't do" in THREADS. You answer gate-0'
> questions but you do not work it. If gate 0' outcome B lands (the pyrrhic
> win), you rule on the win wording as part of the week's scoring.
## Lane B — Sprint 8
> You are Lane B on SHADES 3D, Sprint 8. Rebase onto main, read THREADS' last
> [I] and SPRINT8.md. Gate 0' with D: three candidate variables, in order —
> settle under LIVE calm wind with sway running (not t=0 held), frozen vs live
> sway re-measured settled, repair timing at a real walk. Stop at the first
> that flips the corner count; land D's settled-at-entry guard; post numbers
> either way. If the live game honestly loses 2, say so and hand the win rule
> to A as the pyrrhic-win design question. Then: fabric economics post +
> prep-UI slot with A (C's hailBlockFor is landed on their branch).
## Lane C — Sprint 8
> You are Lane C on SHADES 3D, Sprint 8. Rebase onto main, read SPRINT8.md.
> Forecast uncertainty bands (carried twice — the week gives you five
> forecasts to make them matter on); move your skyfx camera guard below the
> shadow rebuild so headless callers can never fly a cloth-less yard again.
## Lane D — Sprint 8
> You are Lane D on SHADES 3D, Sprint 8. Rebase onto main, read THREADS' last
> [I] and SPRINT8.md. Gate 0' with B — your settle finding is one fidelity
> step from closing the repo's longest thread; drive the suite the way a
> player drives the game (live calm settle, real repair walk timing) and land
> your settled-at-entry guard. Then the full-week feel pass — the last read
> before John plays.
## Lane E — Sprint 8
> You are Lane E on SHADES 3D, Sprint 8. Rebase onto main, read SPRINT8.md.
> Light: support A's five aftermath cards as the week wires them. That's it —
> your tripwires, cards, words and dawn tint from Sprint 7 are all being
> consumed this sprint.
---
---
# SPRINT 9 prompts (the pyrrhic call, the $80 win, the second site)
Same rules: own clone, own branch, rebase onto latest main FIRST. Read
THREADS' last [I] entry then SPRINT9.md.
## Lane A — Sprint 9
> You are Lane A on SHADES 3D, Sprint 9. Rebase onto main, read SPRINT9.md.
> Rule the pyrrhic win (B and D both recommend WIN = hp>=50 with corners
> priced in aftermath — your call, wire it, give the pyrrhic ending its own
> verdict), answer C's two flagged calls in THREADS (25%-cover squeak-win,
> clean-win-without-repair), then gate 2: extract the yard into
> data/sites/backyard_01.json so world.js builds from data, and load E's
> site_02. The week gains a site per night.
## Lane B — Sprint 9
> You are Lane B on SHADES 3D, Sprint 9. Rebase onto main, read THREADS' last
> [I] and SPRINT9.md. Ship fabric choice (C's hailBlockFor + honest pricing)
> PAIRED with C's 0.40 flip in one landing; re-point balance.test's THE LINE
> to C's p1,p2,p3,p4 and assert the $80 clean win, keeping the t2-quad
> pyrrhic assert as the sacrifice-play control. With D: redesign the demoted
> settled-at-entry trend guard (held-clock windows pond forever — advance
> real storm seconds or probe rainless; integrator measurements are in the
> comment). Then build tools/site_audit/ from your quad/coverage/afford sweep
> and run it on site_02 before it ships.
## Lane C — Sprint 9
> You are Lane C on SHADES 3D, Sprint 9. Rebase onto main, read SPRINT9.md.
> Pair the 0.40 downdraft flip with B's fabric landing (your condition,
> arrived). Then site_02's wind personality: shelters/venturi as site-JSON
> data — the corner block funnels the southerly.
## Lane D — Sprint 9
> You are Lane D on SHADES 3D, Sprint 9. Rebase onto main, read SPRINT9.md.
> With B: the trend-guard redesign, and bless or amend the integrator's 600 N
> floor. Then play site_02 cold and log where the verbs break (ladder assumes
> fascia height; a carport may not have one). You remain the playtest lane.
## Lane E — Sprint 9
> You are Lane E on SHADES 3D, Sprint 9. Rebase onto main, read SPRINT9.md.
> The second site: the corner block — smaller, paling-fenced, one tree, a
> carport — anchor-poor on purpose; its personality is "nowhere to tie off".
> Deterministic factory, contact sheet, and pyrrhic-ending card support when
> A rules.
---
---
# SPRINT 10 prompts (sites are data)
Same rules: own clone, own branch, rebase onto latest main FIRST. Read
THREADS' last [I] entry then SPRINT10.md. Gate 1 is A's, uninterrupted —
everyone else's site work is already on disk waiting for it.
## Lane A — Sprint 10
> You are Lane A on SHADES 3D, Sprint 10. Rebase onto main, read SPRINT10.md.
> ONE headline, from day one: extract the yard into data/sites/backyard_01.json
> (world.js builds from data; byte-identical yard proven by the existing
> anchor tripwires and quad-band asserts), then author site_02_corner_block
> from the pieces already waiting (E's carport GLB, C's venturi schema — give
> C their two gap coordinates, D's work:"cloth"|"bracket" anchor field). The
> week gains a site per night; night 3 moves to the corner block. Nothing
> else until this lands.
## Lane B — Sprint 10
> You are Lane B on SHADES 3D, Sprint 10. Rebase onto main, read SPRINT10.md.
> Build tools/site_audit/ from your quad/coverage/afford sweep — one command,
> any site JSON, reports the winnable lines or names the blocking corner.
> Run it on site_02 the moment A's JSON exists; if there's no $80 line, tell
> E to move the tree (their standing offer). Answer C's porosity-into-
> gardenHailExposure question in THREADS.
## Lane C — Sprint 10
> You are Lane C on SHADES 3D, Sprint 10. Rebase onto main, read SPRINT10.md.
> Wire venturi from A's site JSON when it lands; decide the week's storm/site
> pairing so the corner block teaches the venturi (southerly on night 3?);
> land the porosity/gardenHailExposure one-liner if B says yes.
## Lane D — Sprint 10
> You are Lane D on SHADES 3D, Sprint 10. Rebase onto main, read SPRINT10.md.
> Land needsLadder on A's work-field (mechanism, not type — your own audit),
> then play site_02 cold and log feel notes. The carport traps should read
> tempting, not buggy.
## Lane E — Sprint 10
> You are Lane E on SHADES 3D, Sprint 10. Rebase onto main, read SPRINT10.md.
> Support site_02 as it lands: dressing adjustments, contact sheets, and a
> carport-collateral aftermath line/card if the trap earns one. If B's audit
> says the site has no winnable line, moving the tree is yours.
---
---
# SPRINT 11 prompts (the corner block is mean, then the job sheet)
Same rules: own clone, own branch, rebase onto latest main FIRST. Read
THREADS' last [I] entry then SPRINT11.md.
## Lane A — Sprint 11
> You are Lane A on SHADES 3D, Sprint 11. Rebase onto main, read SPRINT11.md.
> Gate 1 rulings first (carport collateral number — E proposes $180 with
> reasoning in the asset; widen the Anchor.type enum D flagged; answer C's
> venturi-gap question). Then gate 2, the job sheet: each night gains client
> + brief + pay schedule as data; forecast card becomes the job sheet,
> aftermath becomes the invoice. No reputation system yet — one week, five
> jobs, the framing. Shepherd as always.
## Lane B — Sprint 11
> You are Lane B on SHADES 3D, Sprint 11. Rebase onto main, read SPRINT11.md.
> Fix site_audit's headless false-negative (your setWorld ask), run it on
> site_02 WITH the venturi, and post the winnable lines. If the funnel kills
> every $80 line, C drops the gain before E moves the tree. Then support A's
> pay schedule with numbers (what does a good night on each site actually
> bank — your audit already knows).
## Lane C — Sprint 11
> You are Lane C on SHADES 3D, Sprint 11. Rebase onto main, read SPRINT11.md.
> Reconcile the venturi with A (site ships axis 2.1/gain 1.5; you measured
> 1.08/1.35 — one exchange, one edit), tune the gain to B's audit verdict,
> and land per-night forecast lead on the job sheet (your forecastLines lead
> param, waiting two sprints).
## Lane D — Sprint 11
> You are Lane D on SHADES 3D, Sprint 11. Rebase onto main, read SPRINT11.md.
> Play site_02 cold at last — the carport traps should read tempting, the
> funnelled southerly should make the ladder trip the site's thesis. File
> feel notes in THREADS. Then playtest the job-sheet week as A lands it.
## Lane E — Sprint 11
> You are Lane E on SHADES 3D, Sprint 11. Rebase onto main, read SPRINT11.md.
> Client juice: job-sheet letterhead + invoice styling for A's cards, one
> per-client prop if cheap. Stand by on the tree-move if B's audit demands
> it (C's gain drop goes first).
---
# SPRINT 12 prompts (the steel tells the truth, the paperwork looks the part)
Same rules: own clone, own branch, rebase onto latest main FIRST. Read
THREADS' last [I] entry then SPRINT12.md. New this sprint: launch.json is
untracked — `cp .claude/launch.example.json .claude/launch.json` once per
clone and pick your own port (suggested: A 8824, B 8825, C 8826, D 8827,
E 8828; integration holds 8823).
## Lane A — Sprint 12
> You are Lane A on SHADES 3D, Sprint 12. Rebase onto main, read SPRINT12.md.
> Gate 3 is yours: paste E's letterhead/invoice kit from tools/jobsheet
> (between the CUT markers; keep .void), rule on the HARD YARDS masthead and
> keep the ABN sequential, and wire the kid's bike (site-JSON key + loader
> line — read E's Z lean note FIRST) with a ruling on its $60. Do NOT start
> reputation, site_03, or heatwave — gate 4 decides the branch at sprint end.
> Shepherd as always; B's re-audit may route retune proposals through you.
## Lane B — Sprint 12
> You are Lane B on SHADES 3D, Sprint 12. Rebase onto main, read SPRINT12.md.
> Gate 2 is yours: wire ratingHint into the failure threshold (A's ruling,
> THREADS sprint 11 — `load > c.hw.rating * (anchor.ratingHint ?? 1)`), with
> an assert on the CONSEQUENCE (cb blows before q at max tension through the
> funnel). Then re-audit BOTH yards — E's baked hints move everything with a
> GLB anchor — and post winnable lines per night. Numbers are E's: propose
> retunes in THREADS, don't nudge. Also fix the weak-link tie-break D flagged
> (strict < keeps first click; flag lowest rating × hint).
## Lane C — Sprint 12
> You are Lane C on SHADES 3D, Sprint 12. Rebase onto main, read SPRINT12.md.
> Two jobs: (1) be the second harness on B's post-wiring failure envelope —
> measure it through the storm while B measures it through the audit; if the
> two disagree, find the variable before anyone retunes. (2) Give the
> southerly buster's early change an in-world tell (skyfx): sky darkening
> from the south, the lull before the shift — deterministic (dt, t), readable
> without spoiling. D judges it.
## Lane D — Sprint 12
> You are Lane D on SHADES 3D, Sprint 12. Rebase onto main, read SPRINT12.md.
> Replay both yards AFTER B's ratingHint wiring lands: the trap should fire
> at default tension now (your measured fork), the ladder trip should fire by
> itself (your #6), the weak-link label should point honestly (your #7).
> Judge C's change-tell — does it telegraph without spoiling? — and re-read
> the backyard blurb A changed under you ("worked it for years" vs "your own
> place"). Feel notes in THREADS, receipts as always.
## Lane E — Sprint 12
> You are Lane E on SHADES 3D, Sprint 12. Rebase onto main, read SPRINT12.md.
> The gutter, the carport pattern, second time around: propose its collateral
> price with the reasoning baked beside it, and build the torn-gutter wreck
> that swaps on the same event. Expect retune proposals against your
> 0.22/0.30/0.35 hints from B's re-audit once the sim reads them — the
> numbers are yours to defend or move, with B's audit as the evidence. The
> tree-move stays cancelled.
---
# SPRINT 13 prompts (the garden matters, the night looks like a night)
Same rules: own clone, own branch, rebase onto latest main FIRST (your local
branch may be BEHIND origin after integration fast-forwards — start with
`git fetch origin && git reset --hard origin/lane/<x>` on a clean tree). Read
THREADS from the last two [I] entries — the QA pass entry is this sprint's
evidence base — then SPRINT13.md. Per-clone launch.json: copy the example,
pick your port (A 8824, B 8825, C 8826, D 8827, E 8828). Baseline selftest
335/0/0; keep it green after every landing; new asserts get mutation-checked.
The game is PUBLIC now (partly.party/hardyards) — main must always be
shippable.
## Lane A — Sprint 13
> You are Lane A on SHADES 3D, Sprint 13. Rebase onto main, read THREADS'
> last two [I] entries, then SPRINT13.md. Gate 3 is yours and it's the front
> door of a public game: pin the Enter-exploit fix with a regression assert
> (the hot-fix is already in your main.js with a comment — an advance()
> reachable from 'storm' must go red; mutation-check by reverting the guard),
> then the splash card (premise + controls + START, one more .card, not a
> menu system), P pause / M mute, and the touch-visitor notice. Gate 2 gives
> you two camera fixes: spawn framing (no pole through the player on boot)
> and the aftermath cloth-swallow (dead sail joins the camera's solid set).
> Two rulings will route to you: C's garden separation target (gate 1) and
> whether GARDEN_DRAIN moves once the shadow geometry is honest. Move the dev
> fps line out from under the anchor panel. Do NOT start reputation, site_03,
> or heatwave — gate 4 decides Sprint 14. Shepherd as always.
## Lane B — Sprint 13
> You are Lane B on SHADES 3D, Sprint 13. Rebase onto main, read THREADS'
> last two [I] entries, then SPRINT13.md. Gate 1.2 is yours: the audit's
> "cover%" told three people a $20 rig was bad while the sim paid it +$97 —
> once C lands the shadow-geometry fix, make the audit PREDICT the sim's
> garden outcome (same quantity, two harnesses) and re-post the per-night
> winnable-lines table; propose fee/bonus retunes in THREADS if night balance
> re-breaks, A rules. Gate 3 smalls in your files: BLOWN label collision for
> adjacent corners, setHardware() must not silently no-op on a bad key,
> standing-kN preview per corner in the prep panel (D's "first lesson costs
> $60 blind"), and rig.t must reset between nights. Stretch, only if room:
> sweep mixed-hardware fuse lines (D's +$147 exhibit) and rule-or-flag
> whether cheap-corner-as-fuse is depth or a hole.
## Lane C — Sprint 13
> You are Lane C on SHADES 3D, Sprint 13. Rebase onto main, read THREADS'
> last two [I] entries, then SPRINT13.md. You carry this sprint. Gate 1: the
> shadow GEOMETRY is the bug — measure rain/hail shadow over the bed (held
> rig vs bare bed, both yards, five storms), fix the model not the constant
> (hail's damage share, bed-level occlusion, storm hail timing — your pick,
> measured), and propose the separation target to A BEFORE tuning to it. The
> sim must make "sail up" vs "sail dead" read alive-vs-dead on wild nights.
> Gate 2: storm grade (sky/light/shadow keyed on intensity — the noon-blue
> 65 km/h sky is the QA pass's biggest visual finding), ground the front
> wall's base on the horizon and feather its hard vertical seam (judge from
> IN-YARD eye height, not your bench), and a handful of deterministic leaves
> streaming with the wind from ~30 km/h. Everything (dt, t) as always.
## Lane D — Sprint 13
> You are Lane D on SHADES 3D, Sprint 13. Rebase onto main, read THREADS'
> last two [I] entries, then SPRINT13.md. You are the verdict on both big
> gates. Gate 1: replay the QA pass's three scenarios exactly (night 2 cheap
> line; night 3 carport line with the sail dead at t=3; night 3 honest line)
> after C's model lands — losing the sail must COST the garden, holding it
> must SAVE it, numbers filed. Gate 2: judge the storm grade, the wall from
> inside the yard, the leaves, and wire E's wind clips in player.js
> (thresholds off wind.speedAt(player.pos), brace on the existing C key).
> Fix your two pool nits: the ladder label says "fascia" on a carport
> bracket, and the dropped spare's whereabouts after a knock. Also run down
> the ghost-white sliver near the shed table in aftermath — it smells like
> your ladder's placement ghost.
## Lane E — Sprint 13
> You are Lane E on SHADES 3D, Sprint 13. Rebase onto main, read THREADS'
> last two [I] entries, then SPRINT13.md. One job, done to your own standard:
> wind clips for the player — lean / stagger / brace, staged by wind band
> (calm, working breeze, gale), through the Mixamo pipeline. Deterministic
> factory, byte-identical across runs, dims verified, and LOOK at the
> silhouette before you ship (your bike rule: the verify can't answer "is
> this the right shape"). D wires them; agree the clip names and band
> thresholds with D in THREADS before you export. Stand by for retune
> arguments if gate 1's garden fix moves your bonus numbers — yours to
> defend or move, evidence in THREADS.
---
# SPRINT 14 prompts (the yard editor — make sites makeable)
Same rules: own clone, own branch, rebase onto latest main FIRST
(`git fetch origin && git reset --hard origin/lane/<x>` on a clean tree —
your local branch is BEHIND after integration fast-forwards). Read
**docs/MANUAL.md** (new — the cookbook this sprint automates), THREADS from
the last [I] entry, then SPRINT14.md. Ports: A 8824, B 8825, C 8826, D 8827,
E 8828 (untracked launch.json, copy the example). Baseline selftest
**362/0/0**; the editor's export must be deterministic (same yard in,
byte-identical JSON out) even though its UI needn't be.
## Lane A — Sprint 14
> You are Lane A on SHADES 3D, Sprint 14. Rebase onto main, read
> docs/MANUAL.md, THREADS' last [I], then SPRINT14.md. Gate 1 is yours: the
> yard editor core — web/world/editor.html + js/editor.js, rendering the REAL
> dressed world through the same loadSite/createWorld path the game uses.
> Place/drag/delete posts, trees, structures, bed, props via ground-plane
> raycast, writing the SAME named-key site-JSON shapes the loader reads (no
> parallel schema). Live validateSite in a panel; visible _design/_why
> authoring fields; canonical stable-key-order export; the round-trip assert
> (template → place → export → loadSite → boots). The export panel must say
> "a site is playable when a NIGHTS entry names it" — export ≠ shipped.
> B and C build INTO your page (score button, wind authoring) — agree the DOM
> seams with them in THREADS early, like the .letterhead contract. Pool: one
> look at the dev-line visibility default; re-check your phantom-sail view
> fix if it hasn't landed. Do NOT build reputation/site content/heatwave —
> gate 4 chooses.
## Lane B — Sprint 14
> You are Lane B on SHADES 3D, Sprint 14. Rebase onto main, read
> docs/MANUAL.md, THREADS' last [I], then SPRINT14.md. Gate 2.1 is yours: the
> SCORE IT button — your site_audit + gardenfly engines run in-page against
> A's in-memory edited yard (feed the site object, not a fetched JSON) and
> render a card: winnable lines at $80 funnel-ON, cheapest honest line,
> held-vs-bare separation, 15%-margin flags. Slow-on-demand is fine; a
> private harness is not — everything through windForSite() and the real
> commit→attach chain, and the gate-2.3 pin proves it: editor-scored wind ==
> game-played wind at one probe point, one storm second, exact. Agree DOM
> seams with A in THREADS. Pool: the invoice line for night 5's
> beyond-saving garden (your S13 offer, A accepted — land it).
## Lane C — Sprint 14
> You are Lane C on SHADES 3D, Sprint 14. Rebase onto main, read
> docs/MANUAL.md, THREADS' last [I], then SPRINT14.md. Gate 2.2 is yours:
> wind authoring in A's editor — venturi placement with the axis drawn as a
> LINE through the gap (both ends; it's mod π and the UI should teach that),
> gain/radius sliders, tree-shelter cones as translucent volumes, and a
> wind-field overlay (arrows sampling speedAt across the yard at a chosen
> storm+time, deterministic, same seed path as the game). You co-own the
> gate-2.3 pin with B: editor wind == game wind, exact, asserted. Agree DOM
> seams with A in THREADS. Your windForSite() is the only wind the editor
> may ever build — that rule is one sprint old and already load-bearing.
## Lane D — Sprint 14
> You are Lane D on SHADES 3D, Sprint 14. Rebase onto main, read
> docs/MANUAL.md, THREADS' last [I], then SPRINT14.md. Gate 3.2 is yours and
> it's the sprint's real acceptance test: author a complete third yard COLD,
> editor only — no JSON hand-editing, no console. Your design instincts, any
> theme E's palette supports. Score it with B's button until it's
> winnable-but-mean, export it, wire its night in a scratch branch, play it,
> and file the whole experience in THREADS: every friction is gate-1/2
> feedback, every delight is proof. Your yard is the site_03 CANDIDATE for
> gate 4 — make it one you'd defend. Pool: re-test the phantom-sail seam
> against A's view fix. Wait for A's gate-1 push before starting; judge B's
> score card and C's wind overlay as you use them in anger.
## Lane E — Sprint 14
> You are Lane E on SHADES 3D, Sprint 14. Rebase onto main, read
> docs/MANUAL.md, THREADS' last [I], then SPRINT14.md. Gate 3.1 is yours:
> audit the placeable set — every GLB the editor offers carries honest extras
> (rating_hint, collateral, collateral_key), gaps fixed in the factory — then
> build TWO new temptation props for D's palette: pick from the trampoline
> (typed honestly in the checked enum), the kids' swing set (two honest posts
> + a crossbar that is NOT an anchor and must not adopt), or a second tree
> species with a different branch ladder. Baked reasoning beside every
> number, a wreck where priceable, negative-control asserts (your bike
> discipline — build the wrong one on purpose and watch it go red). Flag D
> in THREADS the moment the palette is ready — their cold yard waits on it.
---
# SPRINT 15 prompts (the posts tell the truth, the editor stops being batch)
Same rules: own clone, own branch, `git fetch origin && git reset --hard
origin/lane/<x>` on a clean tree first. **The remote was RENAMED mid-Sprint-14
— it is `monster/hardyards.git` now, not `monster/shades`. All six checkouts
are already repointed; if a push ever 404s, check for a rename before assuming
loss.** Read docs/MANUAL.md, THREADS' last [I], then SPRINT15.md. Ports: A
8824, B 8825, C 8826, D 8827, E 8828. Baseline **406/0/0**.
## Lane A — Sprint 15
> You are Lane A on SHADES 3D (the game is HARD YARDS, public at
> partly.party/hardyards), Sprint 15. Rebase onto main, read docs/MANUAL.md,
> THREADS' last [I], then SPRINT15.md. **Gate 1 ruling is yours and comes
> FIRST, before anyone measures**: the factory bakes `rating_hint = 0.9` on
> sail_post's top_anchor, but JSON-declared posts never run adoptAnchor and
> default to 1.00, so every honest post in the shipped game is 10% stronger
> than designed. Rule 0.90 (design intent reaches the sim) or 1.00 (the
> shipped, balanced-against value becomes canon and E corrects the bake) —
> both defensible, and every played verdict in THREADS measured 1.00. Then
> fix the MECHANISM either way: a baked hint must never again fail to reach a
> JSON-declared anchor silently. Gate 3 is also yours: Enter commits number
> fields, out-of-bounds placement must stop reading VALID, zoom beyond the
> wheel, and the separation-field question with B. Do NOT start
> reputation/site_03/heatwave — gate 4 is John's.
## Lane B — Sprint 15
> You are Lane B on SHADES 3D, Sprint 15. Rebase onto main, read
> docs/MANUAL.md, THREADS' last [I], then SPRINT15.md. Gate 2 is yours: D's
> verdict is that your 7582 s fully-blocked SCORE IT "made the editor batch,
> not iterative — I scored once and shipped that run rather than tuning."
> Fix it in D's priority order: a progress tick that actually paints first
> (D thinks that matters more than raw speed), then yielding so the page stays
> responsive, then speed (cost scales like C(n,4) in candidate quads — a
> coarse ranking pass before flying is likely worth more than micro-optimising
> the sim). **Pin the current site_02 and site_03 scores before you start and
> reproduce them exactly after** — a faster score that moved a number is a
> regression. Also with C: one storm picker, not two independently-defaulted
> ones. Gate 1.3: re-measure both yards once A rules the post hint, post the
> deltas as a table, propose retunes with evidence.
## Lane C — Sprint 15
> You are Lane C on SHADES 3D, Sprint 15. Rebase onto main, read
> docs/MANUAL.md, THREADS' last [I], then SPRINT15.md. Lighter sprint for you
> by design — gate 1 is a post-rating ruling and gate 2 is B's performance
> work. Yours: (1) with B, collapse the two independently-defaulted storm
> pickers into one shared selection (D scored the wildnight while viewing the
> southerly — two harnesses disagreeing inside a single page, which is the
> exact class of bug this repo keeps paying for). (2) Second-harness B's
> re-measure once A rules the post hint: if every post moves 10%, the storm
> side should predict the same shift your envelope tool would. (3) Your call
> on anything the wind panel revealed that you filed and didn't land — D
> called it "the best surface on the page", so if there's polish you wanted,
> this is the sprint with room for it.
## Lane D — Sprint 15
> You are Lane D on SHADES 3D, Sprint 15. Rebase onto main, read
> docs/MANUAL.md, THREADS' last [I], then SPRINT15.md. Two judgements, both
> yours alone. (1) Gate 1.4: once A rules the post hint and B re-measures,
> re-play the affected nights and say whether the change is FELT — if 0.90
> makes the honest line stop holding, that is a design change wearing a
> bugfix's clothes and you are the one who says so. (2) Gate 2.3: re-author or
> re-tune a yard with B's faster score loop and say whether it changed how you
> work — your "batch, not iterative" line is what bought this sprint, so you
> are the acceptance test for the fix. Your `site_03_swing_lawn` stays inert
> until gate 4 picks the more-sites branch; don't wire it to a night.
## Lane E — Sprint 15
> You are Lane E on SHADES 3D, Sprint 15. Rebase onto main, read
> docs/MANUAL.md, THREADS' last [I], then SPRINT15.md. Gate 1.2 is yours and
> it's short: once A rules the sail_post hint (0.90 or 1.00), make the factory
> agree, and PIN it — an assert that a JSON-declared anchor of a type the
> factory rates carries that rating at runtime. This is the third member of
> the family your Sprint 14 audit started (no silent anchors, no unpriced
> collateral, and now no baked hint that never arrives), and it is the general
> fix for the bug class that shipped both the free carport and the perfect
> posts. With the sprint's spare room: your call on palette gaps D hit while
> authoring cold — read their gate-3.2 entry and propose what the next yard
> needs, with reasoning baked beside the numbers as always.
---
# 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 13'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.