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