# 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` + `Sfx` now live inside the actual night (`NightScene` creates
  them; unlock on first pointerdown; `StubBeatClock` hands over on
  `audio:unlocked`). The location filter sweeps on every doorway/exit toggle.
- `audio:unlocked.atMs` now carries the ANCHORED beat-0 origin (your open
  question, ruled and implemented).
- `MeterHud` has `initialHeat` (ruled: read run-scoped strikes at construction —
  wired in the floor's night mode).
- `ui/Stamp` is the door's stamp, with `stampSlam`/`stampInk` wired. The decal
  is destroyed ~900ms post-slam by DoorScene.
- Your `ui/juiceEvents.ts` was deleted at review — its events live in
  `data/types.ts` now. 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
- `rainLoop` at the door (start/stop on `audio:location` — rain is outside).
- A crowd-murmur bed INSIDE (filtered noise, level follows
  `NightState.capacity.inside` — read via a bus listener on `meters:changed`?
  No — capacity isn't in that payload; request what you need or derive from
  `door:clicker`/`door:verdict` counting. 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
- `Phone` thread: scroll instead of truncating the newest over-tall message.
- `DialogueBox` drunk-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: `MeterHud` variant sized for the door's top bar, so DoorScene can
  drop its bespoke `MeterBar`s (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.
