diff --git a/docs/LANES/ROUND11_INSTRUCTIONS.md b/docs/LANES/ROUND11_INSTRUCTIONS.md new file mode 100644 index 0000000..27dd1b1 --- /dev/null +++ b/docs/LANES/ROUND11_INSTRUCTIONS.md @@ -0,0 +1,79 @@ +# PROCITY — Round 11 lane instructions (from Fable, integrator) + +Date: 2026-07-15 · **v2.0 is TAGGED AND SHIPPED** (`9b1c54e`, pushed with main). Round-10 review: +D's span-normalize fix verified three independent ways (fresh-Chromium gate 24/24 figs human-sized, +re-shot tour eyeballed, served-file check); F's stale-cache diagnosis of the 3.83 m re-measure was +correct — I reproduced the same trap and proved it (browser cache held pre-fix rigs.js while the +server served the fix). Clean round, both lanes. + +**Theme: AUDIO.** John has answered the standing question: **"generate freely."** v2.1 makes the +town audible. A and D have the round off. B, E, F work; C answers one contract question. + +## House audio law (same spirit as the asset law) + +1. **The game runs silent-and-happy with zero audio assets** — missing/blocked audio must produce + silence, never errors. `?mute=1` forces it. The `?noassets=1` gate now also implies no audio fetches. +2. **Autoplay policy**: nothing plays before the first user gesture (pointer-lock click is the + natural anchor). No console warnings on boot. +3. **Deterministic flavour**: what a shop plays is seeded (citySeed + shopId), like everything else. +4. **Budget**: total shipped audio ≤ 25 MB, lazy-loaded; no per-frame allocations in the audio path. +5. **Free-first**: generate on MODELBEAST (local MusicGen / stable-audio-open / procedural synthesis + — E picks the tool and documents it in the pipeline README). Flag any paid need BEFORE spending; + default budget is $0. + +## Lane E — generate the audio pack (lead) + +Stand up `pipeline/gen_audio.py` (mirror the gen_skins.py pattern: promptable, seeded, `--dry-run`, +harvest step, always eyeball — well, *ear*-ball — before shipping). Deliver `web/assets/audio/` + +a manifest section (`audio: { ambience, sfx, music }` with files, loop points, gain hints). + +Pack v1 (keep it tight — ~25 files max): +- **Ambience beds (loopable, 30–60 s)**: street-day (birds/traffic-distant/wind), street-night + (crickets, distant hum), rain layer (composes over either), interior room-tone (one per 2–3 shop + types is fine). +- **Interaction SFX (short, dry)**: door open + shop doorbell, till/buy chime, record-bin riffle + (the dig), footstep set (2–3 surfaces × 4 variants), UI toast, tram bell + rumble (B's tram). +- **Music beds**: 3–5 instrumental 90s-flavoured loops for shop interiors (record shop must play + music; milk bar radio vibe; video store synth hum). Parody-safe: instrumental originals only, no + real-song imitations of specific recordings. +- Format: mono/stereo OGG (+ M4A fallback if trivial), 44.1 kHz, loudness-normalized (state LUFS). +- Licence/provenance line per file in AUDIT.md (generated-local = fine, just say so). + +## Lane B — the WebAudio engine (street side) + +`web/js/world/audio.js` (B-owned): one AudioContext, unlocked on first gesture; layers with +crossfades wired to systems that already exist — day-segment (street beds), weather (rain layer +gain follows intensity), tram proximity, player footsteps from the movement code. Shop-door +**spill**: standing near an open shop door leaks its interior bed at low gain (simple +distance-gain, no HRTF needed for v2.1). Respect all house-law points; expose `setMasterGain`, +`mute()`, and a tiny `window.PROCITY.audio` surface for F's smokes. + +## Lane C — one contract answer + optional hook + +Where should the interior bed + room-tone attach? Cleanest is C exposing `room.audio = { musicKey, +toneKey }` (seeded per shop) on buildInterior's return so F's interior_mode just plays it. Confirm +or propose better — one note in docs/LANES/. Optional: a `places`-tagged radio/hifi prop as the +visual source in music-playing shops (v2.2 candidate if it doesn't fit the round). + +## Lane F — integration + smokes + v2.1 + +1. Wire interior beds via C's contract into interior_mode (enter → fade in, exit → fade out, + dispose clean); street layer via B's audio.js. +2. New smokes: boot-with-audio (no console errors, nothing plays pre-gesture), `?mute=1`, + `?noassets=1` (zero audio fetches), enter/exit leak check (AudioNodes released). +3. Soak once with audio on; then tag **v2.1** and push (you own the tag this round — push it with + main; no hold needed unless something's ugly). +4. Verification hygiene, now standing law: **verify in a fresh browser context** (the Playwright + gates already do) — a reused tab's module cache burned two of us this round. + +## Lanes A + D — rest day + +Nothing assigned. (D: F flagged that a visible outdoor night queue at the late shop is wanted for +the night money shot someday — it's a v3 mechanic, parked in V2_IDEAS, no action now.) + +## For John + +- **v3 epoch pick** (audio round buys us time): ① editor/overrides · ② venue district + gig system + · ③ multiplayer presence. One word kicks off v3 planning next round. +- Night-scene *visual* readability (streetlamp pools, window spill at distance) is a recurring + polish candidate — cheap to bundle into whichever v3 epoch you pick.