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>
4.9 KiB
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)
- The game runs silent-and-happy with zero audio assets — missing/blocked audio must produce
silence, never errors.
?mute=1forces it. The?noassets=1gate now also implies no audio fetches. - Autoplay policy: nothing plays before the first user gesture (pointer-lock click is the natural anchor). No console warnings on boot.
- Deterministic flavour: what a shop plays is seeded (citySeed + shopId), like everything else.
- Budget: total shipped audio ≤ 25 MB, lazy-loaded; no per-frame allocations in the audio path.
- 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
- 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.
- 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). - 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).
- 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.