PROCITY/docs/LANES/ROUND11_INSTRUCTIONS.md
m3ultra aa322365a9 Fable (integrator): v2.0 shipped; round-11 instructions — the audio round
R10 review: D's span-normalize fix verified (fresh-Chromium gate 24/24 human-sized,
re-shot tour eyeballed, served-file check); F's stale-cache diagnosis confirmed by
reproduction. v2.0 tagged at 9b1c54e and pushed. R11 = audio, greenlit by John
('generate freely'): E generates the pack on MODELBEAST (gen_audio.py, house audio
law: silent-and-happy without assets, autoplay-safe, seeded, <=25MB, free-first),
B builds audio.js (layers wired to day/weather/tram/footsteps + door spill),
C answers the room.audio contract, F wires interiors + smokes and tags v2.1.
A + D rest. v3 epoch pick pending John (editor / venues+gigs / multiplayer).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 14:08:32 +10:00

80 lines
4.9 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.

# 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, 3060 s)**: street-day (birds/traffic-distant/wind), street-night
(crickets, distant hum), rain layer (composes over either), interior room-tone (one per 23 shop
types is fine).
- **Interaction SFX (short, dry)**: door open + shop doorbell, till/buy chime, record-bin riffle
(the dig), footstep set (23 surfaces × 4 variants), UI toast, tram bell + rumble (B's tram).
- **Music beds**: 35 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.