3.2 KiB
LANE-JUICE2 — The night has a sound (Phase 3, parallel)
Executor: Opus 4.8. Branch: lane/juice2 (from main after Phase 2).
Owns: src/audio/, src/ui/, tests. Prereq reading: CLAUDE.md →
LANE_JUICE.md (your Phase-1 spec) → Phase-2 REVIEW block in LANEHANDOVER.md.
Phase-2 reality (read before coding)
TechnoEngine+Sfxnow live inside the actual night (NightScenecreates them; unlock on first pointerdown;StubBeatClockhands over onaudio:unlocked). The location filter sweeps on every doorway/exit toggle.audio:unlocked.atMsnow carries the ANCHORED beat-0 origin (your open question, ruled and implemented).MeterHudhasinitialHeat(ruled: read run-scoped strikes at construction — wired in the floor's night mode).ui/Stampis the door's stamp, withstampSlam/stampInkwired. The decal is destroyed ~900ms post-slam by DoorScene.- Your
ui/juiceEvents.tswas deleted at review — its events live indata/types.tsnow. Extensions go via CONTRACT CHANGE REQUEST only.
Deliverables (in priority order)
1. Ear pass with John (the debt from Phase 1: "verified by ear: NOTHING")
Sit a human in front of the JuiceDemo AND a real night. Tune: does the kick
read as a kick, is the bassline musical, typeTick level (it fires per
character), stamp slam vs music balance, the door→floor sweep (does it feel
like a door opening). Document every constant you change and why. This is THE
deliverable — everything below is secondary.
2. Ambience layer
rainLoopat the door (start/stop onaudio:location— rain is outside).- A crowd-murmur bed INSIDE (filtered noise, level follows
NightState.capacity.inside— read via a bus listener onmeters:changed? No — capacity isn't in that payload; request what you need or derive fromdoor:clicker/door:verdictcounting. State your approach in the handover). - The kebab-shop fluoro hum if you're feeling artistic (tiny, dry, mono).
3. The night has an arc
Track intensity should rise across the night: thin kick+hat at 9 PM, bassline
enters ~10, pads and full mix by midnight, strip back at Last Drinks. Drive it
from clock:tick (you know the clock minute). Keep every parameter externally
settable — this surface IS the future DJ role's control panel (BUILD_PLAN
Phase 4 rule).
4. Widget debts
Phonethread: scroll instead of truncating the newest over-tall message.DialogueBoxdrunk-typo mode: wire into the floor cut-off overlay (it currently renders plain text — coordinate via handover, LANE-FLOOR2 owns the call site; you own the widget).- Optional:
MeterHudvariant sized for the door's top bar, so DoorScene can drop its bespokeMeterBars (currently duplicated look). Only if clean — the door HUD works and this is cosmetic unification, not a rescue.
Constraints
- Location filter architecture is non-negotiable: music through the lowpass, SFX and ambience around it (rain is OUTSIDE — it belongs on the sfx bus but only audible at the door; that's a routing decision, justify yours).
- No imports from door/floor scenes. Bus + constructor config only.
- Pure-testable math tested; everything else honestly listed as ear-checked or not, per your own Phase-1 standard.