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

4.9 KiB
Raw Permalink Blame History

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.