60 lines
3.2 KiB
Markdown
60 lines
3.2 KiB
Markdown
# 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.
|