RELEASE
planning/2.8.0/mockups/nv-machine-rationale.md
sha256 6ba67e67ecd69c53 · 11737 bytes ·
original held in the private archive
# NV MACHINE MOCKUP — Rationale
> **Design mockup only.** Companion to `nv-machine-mockup.html`. Nothing here touches app code;
> all interactions are faked. This is machine #1 of the per-game overhaul — the vertical slice
> (DO-N bezel/nav + DO-O Overseer + the dressed OPERATOR) the whole pattern replicates from.
> Grounded in `dev` @ `cd8a824`.
---
## 1. The concept — "a salvaged RobCo desk terminal in the Mojave"
The app stops being a webpage with a CRT filter and becomes a **physical machine you operate**:
- **The casing** wraps the whole viewport — brushed scavenged steel, a riveted RobCo brand
plate, indicator lamps (PWR / UPLINK / FAULT), vent slots, a field-repair tape patch, and an
etched serial plate: *"UNIT RBC-DT-4077 · SALVAGE REFURB — MOJAVE EXPRESS, GOODSPRINGS"* with a
hand-scratched *"property of courier six — hands off"*. That plate is NV's **hero object** — you
see it and know which machine you're on.
- **The glass** is a recessed, rounded CRT with an inset frame, corner vignette, a top-left
reflection sheen, scanlines, and a slow refresh bar. Curvature lives **on the frame layers only**
— no transform ever touches text (legibility + a11y hold).
- **Two phosphors, one fiction.** Everything *local* to the machine is NV green (`#14fdce`, the
shipped canon optic). Everything that comes **over the wire** — the Director's waveform, his
replies, the UPLINK lamp, the telemetry LCD — is **warm amber**. Amber = the remote presence
speaking through your salvaged hardware. This is NV's "warm bias" made structural instead of
decorative.
- **Custom cursor** (fine pointers only): an amber block caret, with an amber crosshair over
controls. Touch devices keep the system cursor (zero cost on mobile).
- **Boot** is the **MOJAVE UPLINK handshake**: RobCo POST → tube/phosphor/sensor checks → *"MOJAVE
UPLINK: DIALING ▂▃▅▂▇▃"* → *"CARRIER ACQUIRED — LUCKY 38 REPEATER (0.417 MHz)"*. Skippable by
tap, instant under reduced-motion.
## 2. Bezel navigation — subsystems, not tabs (DO-N)
The tab bar is replaced by **illuminated hardware keycaps on the bottom bezel** (desktop: the
control strip under the glass; mobile: a sticky thumb-zone cluster):
| Keycap | Hotkey | Maps to today | LED |
|---|---|---|---|
| OPERATOR | [1] | STAT tab | green |
| OPERATIONS | [2] | INV tab | green |
| DATABANK | [3] | DATA + CAMPG tabs | green |
| UPLINK | [4] | Comm-Link / the AI | **amber** |
| CHASSIS | [5] | Module Bay + saves/settings | green |
| DIR | [0] | flat fallback | — |
- Each keycap is a real key: etched number, sub-label with the **old tab name riding along**
(Protocol 25 — real labels as searchable sub-labels), a physical press (translate + shadow), and
a lit LED when active. Switching fires a **SWEEP** — a phosphor smear across the glass, "re-tuning
a channel," not a route change.
- **The telemetry LCD** above the keycaps is the diegetic "you are here": `▸ SUBSYSTEM: OPERATOR ·
VITALS NOMINAL · RAD 12 CPM · CARRIER LOCKED`. It's live — cripple a limb and it flips to
`⚠ 1 LIMB FAULT`.
- **DIRECTORY (the Protocol 25 fallback)**: one key opens a flat plain-label list of every
subsystem ("OPERATOR — character stats · STAT · [1]") — the old tab bar's mental model, one tap
away, exactly like the Module Bay's Schematic View.
- **In the real build** each keycap just calls the existing `switchTab()` router; hotkeys, `#go=`
deep-links, `role=tab` ARIA, and `robco_active_tab` persistence all survive (the mockup models
hotkeys [1]–[5] and roving `aria-selected`).
## 3. The Overseer presence — DIRECTOR UPLINK (DO-O)
The AI stops being a blue text column and becomes **a scratchy amber signal from the Lucky 38**:
- **The face is an oscilloscope**: a canvas trace over a graticule, header lamp, carrier line
(*"LUCKY 38 RELAY · 0.417 MHz"*), and a state tag.
- **[ LISTENING ]** — a slow warm sine with occasional *static scratch bursts* (the NV persona:
characterful, intermittent, field-grade).
- **[ ESTABLISHING DIRECTOR LINK ]** — jagged random spikes while "thinking"; in the real build
this binds to the existing `startThermalLoad()` window, so the wait becomes a diegetic event.
Period-leader readout lines tick in the transcript (`> DECRYPTING TELEMETRY…`) and vanish when
the reply lands.
- **[ TRANSMITTING ]** — the trace pulses while the reply typewrites, then settles to idle.
- **Idle-life**: unprompted, the presence occasionally emits a templated device blip (`▸ CARRIER
DRIFT +0.02 MHz — COMPENSATED`) — a template bank, **not** the AI, so it works keyless/offline.
- **Prominence**: on desktop the Director owns a permanent 390px column under the same glass — the
machine's face, always present (slate A-2). On mobile, UPLINK is the **home surface** and, in
every other subsystem, a persistent **carrier strip** (mini animated waveform + `[ LISTENING ]`)
stays pinned at the top of the glass — the Overseer never fully leaves the screen; tapping it
returns home.
- **VOX** is visibly *"NOT INSTALLED (OPT-IN)"* on the scope meta line — speech stays a deferred
opt-in chip, honestly labeled.
- The input row keeps the mode pill (OVERSEER ▸) and `▷ TRANSMIT` — the Tri-Node contract, opt-in
posture, and transcript (aria-live polite) are presentation-unchanged underneath.
## 4. OPERATOR fully dressed — one finished subsystem end-to-end
Every real STAT-tab surface, reframed as boards on a **biometric telemetry bus** (each block
carries a BUS id, like the Module Bay's part numbers):
| Today | Dressed as |
|---|---|
| HP/XP/caps/karma/rads inputs | **VITAL TELEMETRY** — segmented phosphor HP bar with drain-lag (a demo −DMG/+MED shows the physical transition), XP meter, caps as a mechanical **odometer**, karma as a lit lamp, rads as an amber exposure meter |
| SPECIAL number inputs | **ATTRIBUTE TUNING GAUGES** — seven analog needle gauges with overshoot (the SEAT verb), etched letters, ± steppers (1–10 clamp preserved) |
| BIO-SCAN & LIMB STATUS buttons | **skeletal harness probe** — a phosphor body silhouette with five tappable limb nodes + a mirrored readout list (`[████] OK` / red blinking `[▒░░░] CRPL`); faults propagate to the bezel telemetry LCD |
| SKILL MATRIX | **13-channel VU array** (NV's real 13 skills), tagged skills marked ◆ |
| STATUS EFFECTS | **compound lamps** — lit/dark indicator chips |
| FACTION STANDING | **reputation needle board** — INFAMY◂▸FAME scales with a center detent (NCR / Legion / The Strip) |
Semantics never change: same values, same clamps, same toggles — only the presentation inverts
(the Module Bay precedent, Protocol 25 guardrails).
**Honest scope:** OPERATIONS / DATABANK / CHASSIS render as labeled "SUBSYSTEM ONLINE — current
panels render here unchanged" placards listing their real contents (dressed later at DO-P;
CHASSIS docks the shipped Module Bay untouched). Swapping the nav never requires redesigning every
panel at once.
## 5. Mobile vs desktop
- **Desktop (≥1000px)** — a **desk terminal**: fixed shell (`body{overflow:hidden}`, matching the
app's real desktop gate), casing on all sides, subsystem viewport + permanent Director column
under one glass, keycaps + telemetry LCD + a decorative governor dial on the bottom bezel.
- **Mobile (<1000px)** — **the phone is the device**: the casing fills the screen edges (thin
frame band), the bezel cluster is a **sticky thumb-zone control strip** (telemetry LCD + six
keycaps, all ≥28px), subsystems show one at a time, and UPLINK is the slide-over home with the
carrier strip keeping the Director present everywhere. Serial plate hides; tape patch shrinks.
- Verified headless at **360 / 412 / 1440**: `scrollWidth === innerWidth` at all three (no
horizontal overflow), inputs ≥16px, targets ≥28px.
## 6. How it stays PWA-safe (the hard guardrail)
Everything in this mockup is **CSS chrome + one `<canvas>` + the existing router**, layered over
the working shell:
- The bezel/casing is markup *around* `.main-grid` — not a new shell, no iframe, no new document,
no navigation model change. `index.html` remains the single served page the SW precaches.
- Keycaps call the existing `switchTab()`; hotkeys, `#go=` shortcut deep-links, ARIA tablist, and
`robco_active_tab`/`robco_bezel_subsystem` (MetaStore) persistence keep working — installable /
offline / standalone untouched.
- The Overseer is a canvas driven by the existing thermal-load + typewriter hooks and the Ambient
Runtime heartbeat (a `balanced`-tier observer); it works keyless/offline and is `aria-hidden`
decorative — the transcript keeps the polite live region. No new AI path, no new timers beyond
the runtime.
- **Save boundary clean**: nothing here writes campaign state — view choice + "boot seen" are
MetaStore device prefs only.
- Reduced-motion: boot is instant, SWEEP/needles/blinks collapse to resting states, the scope
draws one static frame per state (modeled in the mockup itself).
## 7. What replicates per game (the `identity` consumption story)
Everything NV-specific here is a **data facet**, not code: casing material (scavenged steel + tape),
hero object (etched serial), phosphor pair (green local / amber remote), persona (scratchy Lucky 38
carrier, blip bank, reply cadence), boot ceremony (Mojave handshake), cursor (amber block), motion
texture (thunk/overshoot). FO3 authors different values (Vault-Tec molded casing, `green3`, an
institutional Overseer, wrist framing) into `GAME_DEFS[ctx].identity` and the same chrome re-skins
via `[data-game]` — zero feature-code branching (Protocol 38).
## 8. Open questions for the owner
1. **CAMPG's home** — this mockup folds CAMPG into DATABANK ([3]) so the bezel holds five keycaps
(+DIR). Alternative: a sixth CAMPAIGN keycap. Which do you want? (Hotkeys [1]–[4] keep their
historical meaning either way; [5] is new.)
2. **The amber split** — is "green = the machine, amber = the Director/the wire" the right NV
read, or should the Overseer stay green with amber reserved for hazards only?
3. **Desktop Director column width** — fixed 390px here (mirrors today's comm-link column). Wide
enough for the presence, or should the scope get taller/wider at the cost of subsystem space?
4. **UPLINK keycap on desktop** — since the Director column is always visible, [4] currently
*pulses* the column and focuses the input rather than swapping the viewport. OK, or should
desktop [4] open a full-screen UPLINK view (scanner/inbox later rides there in DO-W backlog)?
5. **Boot length** — the handshake runs ~4s (tap-to-skip, once-per-flavor nag rules per DO-C).
Comfortable, or trim the POST block?
6. **Telemetry LCD content** — happy with per-subsystem status lines (+ live fault escalation), or
should it also rotate ambient lines (deeds-as-news teaser) ahead of DO-W?
7. **Placeholder tone** — the undressed subsystems say "current panels render here unchanged."
Good for the build sequence, or do you want light teaser dressing on OPERATIONS/DATABANK in the
same slice (scope cost)?
## 9. Artifacts
- `nv-machine-mockup.html` — standalone interactive mockup (open in any browser).
URL params for review: `?skipboot=1`, `?view=operator|operations|databank|uplink|chassis`,
`?demo=thinking`, `?freezeboot=1`.
- Screenshots (all headless-rendered, overflow-verified):
`nv-machine-360.png`, `nv-machine-412.png`, `nv-machine-412-uplink.png`,
`nv-machine-412-operator-full.png`, `nv-machine-desktop.png`,
`nv-machine-desktop-uplink-thinking.png`, `nv-machine-boot-412.png`.
STAMP · generated for RELEASE v2.8.5 commit 06e5180 (06e51801b38a) · archive input-tree hash c07fbfbdd2e1ddeb · 754 files · no wall-clock timestamp (regenerates identically when nothing changed).