not-tonight/lanes/LANE_CONTENT.md

75 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LANE-CONTENT — Door depth & the moral layer (Phase 3, parallel)
**Executor:** Opus 4.8. **Branch:** `lane/content` (from main after Phase 2).
**Owns:** `src/scenes/door/`, `src/rules/`, `src/data/strings/` (door-related
files), tests. **Prereq reading:** CLAUDE.md → `docs/GAME_DESIGN.md` §3.1/§4 →
the Phase-2 REVIEW block in `LANEHANDOVER.md`.
## Phase-2 reality (read before coding)
- The night is now a real flow: `NightScene` owns clock/meters/audio/save and a
`NightContext` (see its interface — `sfx`, `requestLocation`, `beatIntervalMs`
are new since Phase 1). Door and Floor run concurrently ALL night; the player
toggles via the doorway ("step inside") and the floor's entry exit.
- While the player is on the floor, **Kayden rules the real queue** in
`DoorScene.kaydenRule()` (admit 80%, same `judge()`, no UV stamp 1-in-7 —
stamp accuracy is decided in `NightScene.onVerdict`).
- Heat is run-scoped and saved; 3rd strike ends the night AND the run
immediately (`endReason: 'licence'`). Nights chain Thu→Fri→Sat via
`NightSummaryScene.nextAction()`; `save.ts` carries `GameState`.
- `ui/Stamp` + sfx are live in the deny path; `data/strings/door.ts` has
`FAIL_TEXT.licence`.
## Deliverables (in priority order)
### 1. The Guest List clipboard (design §3.1 — specced, never built)
A desk clipboard panel: tonight's list (generated, 814 names, some misspelled
versions of real patron names). Patrons with `claimsGuestList` get a "'m on the
list" line when they step up; player cross-checks. `knowsOwner` patrons who are
DENIED trigger the existing furious-Dazza path (judge already scores this —
surface it: their step-up line should drop hints ("Terry said swing by"), and
`data/strings/dazza.ts` has the `owner-scare` text to foreshadow).
Misspelling rule: a name that ALMOST matches is usually legit (bad handwriting);
an exact-match name on a confident patron is sometimes a lift. Tells, not
certainty. Pure logic in `rules/guestList.ts` + tests.
### 2. Scripted moral encounters (design §4.3 — the heart)
23 scripted patrons injected per night by the generator override hook
(`generatePatron(ctx, clockMin, archetypeOverride)` + a new scripted-encounter
scheduler in `rules/` or `data/`): the girl who needs back in to grab her mate
(no stamp, over capacity), the freshly-dumped regular who just wants one quiet
beer (already `loose`). Multi-beat dialogue via the existing toast/dialogue
patterns. Doing the human thing costs Vibe or risks Heat; the game never says
which choice was right. NO achievement chimes, no morality meter — the design
doc is explicit that this stays unscored.
### 3. The Inspector (archetype exists, does nothing yet)
Activate `inspector`: reads as a boring `punter` at the rope (their doll is
deliberately unremarkable). If admitted, they observe for ~30 clock-min:
any live breach in that window (capacity over licensed, a `maggot` on the floor,
underage inside) converts its deferred strike to IMMEDIATE. Then they leave and
Dazza texts "that was the INSPECTOR you muppet". If denied — nothing happens,
ever (they were just a quiet person; paranoia is the tax). Pure logic
`rules/inspector.ts` + tests; wiring via bus events only.
### 4. The Incident Report (design §3.3 — lying groundwork)
On the Night Summary: a short form (34 incidents sampled from
`NightState.incidents`) where the player picks a written account per incident —
truthful or flattering. Store both truth and account in
`GameState.pastReports`. Cross-night audit (contradictions → strikes) is
Phase 4; THIS lane only builds the form + storage + one taste: a lie about a
`kayden` incident can be contradicted by Kayden's own log line next morning
(Dazza text). Keep the form fast — 20 seconds, not homework.
### 5. Sobriety line-walk (stretch)
The third challenge: cursor-follow line at the desk. Only if 14 land clean.
## Constraints
- All scoring through `judge()`/`meters:delta`/`heat:strike` — no new direct
meter paths. New events need a CONTRACT CHANGE REQUEST (declaration-merge
bridges are BANNED now — request and wait for the fold).
- Kayden must interact sanely with everything you add (e.g. he auto-admits
guest-list liars — that's fine and funny; make sure it can't crash).
- Every pure module tested; play a full 3-night run before your handover and
report what the run FELT like — the economy findings from Phase 1 are still
open and your content changes the mix.