RELEASE
planning/2.8.0/audits/NV_OVERHAUL_DESIGN_AUDIT.md
sha256 d5de286fdf28f580 · 29126 bytes ·
original held in the private archive
# NV_OVERHAUL_DESIGN_AUDIT.md — End-of-New-Vegas-Overhaul Design Gate
> **Analysis / ideation only.** No source was edited; nothing committed. This is the committed
> END-OF-NV-OVERHAUL DESIGN AUDIT the owner must review before the overhaul counts as "finished."
> The owner reads the findings and picks — implement nothing from this doc without sign-off.
>
> **Read against:** `dev` @ `e06d5c2` (v2.8.0 work under `[Unreleased]`, cache `…-r124`). Method:
> the owner-approved `planning/mockups/*` (each board was verified live against its mockup at build),
> deep reads of `css/terminal.css` / `index.html` / the render JS, a live-DOM inspection of the running
> app at mobile + tablet widths, and four focused code-analysis passes (CSS cohesion, render/interaction,
> per-game identity depth, roadmap-gap). Screenshots of the running pane were unavailable (a rasterization
> stall on the heavy continuous-animation page), so visual judgment is grounded in the mockups + live
> DOM/CSS reads rather than fresh captures.
---
## 0. TL;DR — the verdict in five sentences
The **New Vegas machine is genuinely excellent** and the *"light-frame ≠ done"* test is ~90% passed:
nearly every board across OPERATOR / OPERATIONS / DATABANK / UPLINK / CHASSIS is rebuilt from the
ground up in a coherent RobCo hardware language (load-cell weigh bridge, phosphor radar node-map, VU
skill meters, analog SPECIAL gauges, living fusion core, phosphor tube rack), not legacy-in-a-frame.
The design language is **cohesive** — shared casing/bezel chrome, `bay-board` shells, BUS/SLOT part
numbers, status lamps, amber-wire accent — and each subsystem has a **distinct hero instrument**, so
the "same OS, memorable rooms" goal is largely met. **But the overhaul is finished only as a
*one-machine* slice:** the identity keystone was built to carry N machines + a living world, and
roughly **two-thirds of it is authored-but-dead data**; FO3 is "NV chrome + a green tint + a few
strings," there is no living-world layer, and — most urgently for a mobile-primary owner — **the
bezel subsystem nav does not actually gate content on mobile**, so the phone renders all six
subsystems in one interleaved ~19-screen scroll. Fix a short must-list (headed by the mobile-gating
defect) and the NV overhaul is a legitimately shippable, distinctive product; the per-game / living-
world / mobile-casing ambitions are real but are correctly *future* units, not NV-overhaul blockers.
---
## 1. MUST-FIX BEFORE RELEASE (prioritized)
These are defects/inconsistencies **within the shipped NV machine** — not future features. Each is a
"the NV overhaul isn't done until this is addressed" item.
| # | Finding | Why it's must-fix | Effort |
|---|---------|-------------------|--------|
| **MF-1** | **Mobile subsystem nav doesn't gate content — all 6 subsystems render stacked & interleaved.** Live-DOM confirmed: on the sub-1000px layout all 30 `[data-tab]` panels compute `display:block` and lay out simultaneously despite 26 lacking `.tab-visible`; an existing mobile rule overrides the global `.panel[data-tab]{display:none}` gate. Page = **17,127px (~19 screens at 412×915)**. Tapping a keycap only moves the LED/telemetry + jumps scroll — it never switches the view. DOM order also **interleaves** subsystems (stat→inv→stat→data→stat→chassis→data→settings), so a mobile scroll jumbles stats, inventory, skills, quests, map, settings together. | The owner is *almost exclusively* on 360/412. The single headline feature of DO-N (a subsystem selector) is inert on the owner's primary device; the app's daily reality is a jumbled mega-scroll. **Verified fixable:** injecting `@media(max-width:999.98px){.col-left .panel[data-tab]:not(.tab-visible){display:none!important}}` collapses the page **17,127px → 4,218px** and makes the nav switch views. | **S** to restore gating; **+M** to also reorder the DOM so each subsystem's panels are contiguous |
| **MF-2** | **Legacy-in-a-dressed-frame in SETTINGS.** `#savesPanel` (SAVE ARCHIVE) and `#accountPanel` (ACCOUNT) are still plain `.panel`s with the *old* full-bleed `<h2>` bar header and **inline styles** (`index.html:3449–3461`), sitting directly among fully-rebuilt `bay-board` hardware boards. `#savesPanel`'s only dedicated CSS is `position:relative`. | This is the one place the "every board rebuilt in the machine language" claim visibly fails inside NV scope — two boards read as a different, older app. | **M** |
| **MF-3** | **Dead + game-fragile logic that will misbehave.** (a) Dead legacy **AI GPS modal** handler (`api.js:2259–2290`) builds a clickable ASCII move-grid that the system directive now *forbids* the AI from ever emitting (`[GPS]`/`[MAP]` are native) — unreachable-by-contract but live, and a latent inconsistency if the model ever ignores the directive. (b) Two **Protocol-38 game literals**: `ctx === 'FNV' ? … : 'Fallout 3'` at `ui-core.js:3510` and `:3676` — these hard-label any non-FNV game (incl. the FO4 stub) as "Fallout 3." | (a) violates the AI-vs-native contract the overhaul worked to establish; retire it like `[CROSSROADS]`/`[TERMLINK]`. (b) is a design-fragmentation bug the moment a third machine exists — and both sites can just read `GAME_DEFS[ctx].label` (used two functions away). | **S** |
> **Borderline (owner's call, listed as SHOULD below but arguably MF):** the tempo-dial knob renders
> as a central `<button>` that does nothing on tap while the adjacent immersion dial cycles on tap
> (SH-4); the caps "odometer" animates as a spinnable instrument but is a bare non-interactive field
> (SH-1). Both are real "awkward affordance" hits; both were owner-directed, so they're framed as
> reconsiders, not blockers.
---
## 2. THE BIGGEST CROSS-CUTTING THEMES
### Theme A — "The keystone is spent on ⅓ of its consumers." (the defining structural gap)
`GAME_DEFS[ctx].identity` was authored as a rich 10-facet, 3-game data block precisely so later units
could each consume one facet. **Only `theme`, `persona.blipBank`, `overseer`, `databank.mapCaption`,
and (FNV-only) `cursor` are wired.** `machine`, `material`, `structuralMode`, `persona.texture`,
`persona.cadence`, `ceremony.coldStart`, `motionTexture` (data), all of `audio`, all of `voice`, all of
`ambient`, and `databank.recordsLabel` are **fully-authored, zero-reader dead data** for all three
games. `theme.framing` is dead too. The spine exists and validates; most of the body was never built.
This single fact explains FO3's thinness, the missing living world, and the un-textured motion — they
are all "the consumer of facet X was never built."
### Theme B — Strong shared language, but the *shell* is where sameness bites
Every instrument subsystem shares the identical `bay-board` shell (same border alpha, same 26px
scanline, same copper connector-pin strip, same corner tag). Differentiation lives entirely in the
**inner instrument** — which is great for the hero boards (weigh bridge vs radar vs living core) but
means the **text-list boards** (SKILL BOOKS, MAGAZINES, PERKS, STATUS EFFECTS, CAMPAIGN NOTES,
DIRECTIVE REGISTRY, CAMPAIGN LOG) and the **collapsed secondary strips** all read as "the same green
box with a list," giving almost no signal about *which subsystem you're in*. The subsystem identity is
carried by the bezel/casing, not the boards — so once you scroll past the header, rooms blur.
### Theme C — Interaction grammar is fragmented (six ways to set a number)
SPECIAL = ± steppers **and** vertical drag; skills = horizontal drag + arrows (**no** stepper); HP/XP =
drag + buttons; RAD = drag (two surfaces); caps = bare typed field (**no** drag/stepper, and bypasses
the `stat.change` choke point); faction/affinity = ±5 steppers only (**can't** type/drag an exact
value); karma = slider + tiers + drag-needle. Adjacent instruments on the *same* OPERATOR screen use
opposite gestures (SPECIAL steps, sibling skills don't; SPECIAL drags vertically, skills horizontally).
The repeated changelog bug-fixes around RAD-drag `touch-action` are a symptom of too many bespoke drag
surfaces. Persistence itself is consistent (no save-drift) — the inconsistency is purely in *how you
touch a value*.
### Theme D — Mobile is a scroll page, not a device (and the owner lives here)
Beyond MF-1's gating defect: even with gating fixed, mobile is a long stacked scroll with a fixed
bezel dock, not the "phone IS the device / slide-over subsystems" vision (DO-G, unbuilt). Density is
Tier-1 only (owner declined Tier-2). For a mobile-primary owner this is the highest-leverage surface
and the least-finished one.
### Theme E — FO3 has no machine identity yet (the promise of "three reads of one table" is unproven)
`[data-game='FO3']` appears **exactly once** in 13,177 lines of CSS (a stiffer SEAT "clunk"). FO3 gets:
green3 optic ✓, boot POST line ✓, save-archive header ✓, Overseer strings ✓, idle blips ✓, map caption
✓ — and **nothing else**: same bezel steel, same casing gradient, same scanlines, same glass, **no
amber-wire equivalent** (loses the local-green/remote-amber split that is NV's core aesthetic idea), no
cursor, no casing/serial/field-kit flavor. Switching to FO3 today feels like "New Vegas with a duller
green and a couple different labels," not a Vault-Tec Pip-Boy. *This is correctly future work (DO-M),
but it means the keystone architecture is unvalidated by a second real machine.*
### Theme F — The living world is absent (the "emotional core" per the plan)
No deeds-as-news, no rad-storm weather, no ambient broadcasts, no intercept-at-Overseer. `identity.ambient`
(Radio New Vegas / Goodsprings vs GNR / Megaton, fully authored per game) is dead data. The Ambient
Runtime heartbeat that would host these is shipped and idle-capable, so the substrate exists — only the
observers are missing.
---
## 3. TOP RECOMMENDATIONS (what I'd do, in order)
1. **Fix mobile gating now (MF-1) — it's the cheapest, highest-impact change in this whole document.**
Restore `.panel[data-tab]:not(.tab-visible)` hiding at ≤999px, then **reorder the panel DOM so each
subsystem's panels are contiguous** (today they interleave). This delivers ~80% of the DO-G mobile
win for ~5% of DO-G's cost, and makes the bezel nav real on the owner's primary device. *Do this
before shipping the NV overhaul under any definition.*
2. **Light up already-authored dead data before building new machines.** The cheapest immersion wins in
the repo are wiring the facets that already exist: `identity.voice` (per-game empty/loading voice,
DO-Q5), `identity.audio` (per-game hum/boot, DO-Q4), and `identity.ambient` → a first **DO-W** slice
(deeds-as-news reading `eventLog`). These consume the keystone you already paid for and make even
the *NV* machine feel more alive. High ROI, low risk.
3. **Rebuild the two legacy SETTINGS boards (MF-2)** as `bay-board`/`.tray` variants so SETTINGS stops
containing two visibly-older panels.
4. **Pick one numeric-input grammar (Theme C).** Recommended: keep drag as the *expressive* gesture on
every meter, add a consistent ± stepper to *every* meter (SPECIAL, skills, HP/RAD, caps), reserve
typed entry for precision, and route **every** edit through a `_nativeSet*` choke point so all emit
`stat.change` (fixes the caps asymmetry + the Living-Core-burst inconsistency in one move).
5. **Differentiate the shell per subsystem (Theme B).** Give each subsystem a subtle accent token
(OPERATOR green, OPERATIONS amber-wire, DATABANK cyan-edge, CHASSIS warm-amber, etc.) the way
`.wireboard`/`.tray`/`.dangerboard` already vary bay-board — so a text-list board still says which
room it's in. Cheap, big cohesion-without-uniformity payoff.
6. **Retire the dead GPS modal + the two game literals (MF-3).**
7. **Then** invest in the big future units in this order (see §6): **DO-C ceremony** (cheap delight,
consumes `ceremony.coldStart`) → **DO-W living world** (consumes `ambient`) → **DO-M FO3 machine**
(validates the keystone) → **DO-G mobile casing** (after MF-1 has de-risked it).
---
## 4. PER-SUBSYSTEM FINDINGS
Each board's grade is against the *"coolest/clearest/most-immersive RobCo implementation possible"* bar.
### 4.1 OPERATOR (bio-telemetry) — **A− · richest subsystem, mild instrument-idiom sprawl**
Hero instruments are excellent and distinct: segmented CONDITION bar, seven analog SPECIAL needle
gauges ("SEVEN-CHANNEL ANALOG ARRAY"), 13-channel VU SKILL MATRIX with amber peak markers + TAG
diamonds, swing-needle KARMA gauge (+ FO3 Karma Center via `usesKarmaCenter`), reputation console with
channel keycaps + mini-pin strip. Diegetic subtitle "BIOMETRIC TELEMETRY BUS · COURIER SIX" lands.
- **Weak:** (a) **Instrument-idiom count is high** — bar / needle / VU / swing-needle / stepper-console
all on adjacent boards. It reads as a real varied instrument panel *because* they share phosphor
treatment, but it's the closest any subsystem comes to "kitchen sink." (b) **BIO-SCAN uses a crude
stick figure** for the limb map — noticeably lower-fi than everything around it. (c) The
interaction-grammar split (Theme C) is worst *here* (SPECIAL steps + drags vertically; skills drag
horizontally, no stepper).
- **Options:** *Stick figure* → (1) a proper phosphor wireframe torso/silhouette with per-limb hit
zones; (2) a Vault-Boy-style line figure; (3) an X-ray/rad-plate rendering that ties to the existing
#6 X-RAY FLASH feedback. *Idiom sprawl* → (1) accept it (defensible); (2) unify SPECIAL + skills into
one "tuning bank" visual family with identical controls; (3) demote karma's needle to a bar to reduce
needle count. **Triage:** stick figure SHOULD (S–M); idiom/grammar SHOULD (M); rest NICE.
### 4.2 OPERATIONS (quartermaster's freight console) — **A · most consistent internal language**
The strongest *internally-coherent* subsystem: LOAD-CELL WEIGH BRIDGE (live needle mirroring
curWt/maxWeight with nominal/heavy/SEIZED tiers), six-drawer CARGO MANIFEST with per-drawer count
badges + in-drawer search + CARGO-TAG rows (USE/±qty/EQUIP/×), FIELD FABRICATION, BARTER UPLINK
(amber `.wireboard`), SQUAD ROSTER, CURIO ARCHIVE vitrine. BUS-10…15 part numbers unify it.
- **Weak:** (a) The **caps field on the weigh bridge is dressed as a spinnable odometer but is a bare
number input** (Theme C / SH-1). (b) Drawer label "APPAREL" vs the code's `armor` category — cosmetic
mismatch only. (c) On FO3 the MODS drawer correctly disappears (data-driven ✓) — good proof the
manifest is game-agnostic.
- **Options for caps:** (1) make the odometer genuinely drag/scrub-able; (2) add ± steppers; (3) stop
animating it as an instrument if it's read-only-ish. **Triage:** SHOULD (S).
### 4.3 DATABANK (the records bay) — **A · best "wow" board in the app**
CARTOGRAPHY TABLE = inline-SVG phosphor radar node-map (real gridRow/gridCol placement, fog-of-war,
known-route trail, survey-ping, keyboard node traversal) — the standout diegetic surface. DIRECTIVE
REGISTRY (numbered slots + status drawer + CYCLE), CAMPAIGN CHRONICLE (tape spool), CATALOG QUERY,
FIELD NOTES, SERVICE TALLY (odometer bank). BUS-16…21.
- **Weak:** (a) The four **secondary boards** (CHRONICLE/CATALOG/NOTES/TALLY) collapse to identical
strips (Theme B). (b) `identity.databank.recordsLabel` is authored but **unconsumed** — a dead facet
even for NV. (c) Text-list DIRECTIVE REGISTRY vs an OPERATOR text-list board are visually
indistinguishable when scrolled (Theme B).
- **Options:** per-subsystem accent (Theme B fix); give each secondary board a tiny distinguishing
glyph/silhouette in its collapsed strip. **Triage:** SHOULD (M) as part of the Theme-B sweep.
### 4.4 UPLINK / Director presence — **A− · great concept, one stale-mockup evolution**
Phosphor oscilloscope waveform driven by the *real* request lifecycle (idle/thinking/speaking/
listening), `LUCKY 38 RELAY · 0.417 MHz`, TRI-NODE encryption line, self-contained mobile view + carrier
strip. The composer **evolved past its mockup** into a modern rounded `#composer` (`[+] ◈ OVERSEER ? ↑`)
— a healthy improvement, not a defect.
- **Weak:** (a) **Composer placeholder is technical/generic** — `AI> ENTER COMMAND OR ACTION (E.G. '>
[THREAT] GECKOS')…` — not in the Director's voice. (b) The **Quick-Draw Holster "fire" still
round-trips the AI** (`transmitMessage('Deploy …')`) — defensible as a narrative beat but worth a
conscious call. (c) `identity.persona.texture`/`cadence` are authored but **unread** — the waveform
doesn't yet take per-game texture, so FO3's "vault-institutional" persona is invisible.
- **Options for placeholder:** (1) Director-voiced ("> Transmit when ready, Courier…"); (2) mode-aware
(OVERSEER vs TERMINAL) diegetic hint; (3) rotate `identity.voice.loading`-style lines. **Triage:**
placeholder SHOULD (S); persona-texture NICE (ties DO-M).
### 4.5 CHASSIS (self-diagnostic maintenance bay) — **A · the most novel identity**
UNIT POWER PLANT with the LIVING CORE (orbital rings + heart + diagonal 3D ring, mirrored into the
casing-top mini-core), hour-meter odometers, IDENTITY PLATE + breaker-lever read-outs, SERVICE & FAULT
CONSOLE. Strongly unique; the "machine reporting on itself" fiction is the best-realized in-universe
concept in the app.
- **Weak:** (a) The living core has absorbed a *lot* of behaviors (10+ in one batch, then +10 more) —
verify it stays legible rather than busy, and that **all** of its motion is reduced-motion-gated via
JS (`_coreShouldAnimate()` exists — confirm no inline/WAAPI animation escapes). (b) breaker levers are
correctly read-only (good — "users never throw a lever").
- **Triage:** reduced-motion JS-path verification SHOULD (S audit); legibility NICE.
### 4.6 SETTINGS (service access) — **B · two legacy boards drag it down**
Phosphor tube rack (7 optics), Module Bay slots (SLOT 01–05 + SVC tray), CAMPAIGN CONFIGS (cartridge
picker + doctrine rocker + tempo dial + RNG interlock breaker) are all strong, rebuilt hardware.
- **Weak:** (a) **`#accountPanel` + `#savesPanel` are legacy plain `.panel`s** with old bar headers +
inline styles (MF-2) — the clearest light-frame-≠-done hit. (b) **Part-number scheme diverges** —
SETTINGS uses `SLOT 0N`, everyone else uses `BUS-NN` (arguably intentional: slots you seat vs bus
lines — but decide and document). (c) **Tempo knob does nothing on tap** while immersion dial cycles
(SH-4). (d) The hidden-real-input + dressed-control double pattern (immersion/tempo/doctrine/cartridge/
RNG) is sanctioned but is a standing sync-drift risk class (the `#completeRngToggle` bug precedent).
- **Options for MF-2:** (1) rebuild both as `bay-board`; (2) a `.tray`/REG-PORT-style amber variant to
match the ACCOUNT "REG PORT" fiction; (3) at minimum swap the old `<h2>` bar for the `bay-board`
summary header + drop the inline styles. **Triage:** MF-2 must; SLOT/BUS + tempo SHOULD.
---
## 5. CROSS-CUTTING FINDINGS (design-system level)
### 5.1 Visual consistency — **strong, with concrete debt**
One coherent token system (`--robco-green`, `--bezel-wire`, `--bezel-steel-*`, mobile `--d-*` density
tokens, per-instrument scoped tokens). Debt: **dead `.tab-btn` CSS** (tab bar retired, 3 rules remain);
**duplicate copper** (`#d9a24a` hardcoded at `5148` vs tokenized `--curio-copper` at `8568`); **raw rgba
accents** bypassing tokens (`rgba(243,156,18…)`=alert, `rgba(52,152,219…)`=blue, `rgba(231,76,60…)`=
danger at `5238–5266`); **two header conventions** (`.panel h2` bar vs `.panel.bay-board summary h2`
plain) coexisting only because the two legacy SETTINGS panels keep the old one. **Triage:** SHOULD (S)
housekeeping sweep — folds naturally into MF-2 + the Theme-B accent work.
### 5.2 Interaction consistency — see Theme C. **SHOULD (M).**
### 5.3 Accessibility & reduced-motion
- **CSS reduced-motion is genuinely strong** — global `*` block zeroes animation *and* transition
duration + caps iterations (`4759`); 139 keyframes, no `transition:`-only motion escapes, no
`scroll-behavior:smooth`. **Caveat (verify, don't assume):** the block only zeroes duration — any
**JS Web-Animations-API or inline-style animation** bypasses it. The living core, feedback waves, and
Overseer scope drive motion from JS; they *appear* to self-gate (`_coreShouldAnimate`,
`_scopeShouldAnimate`), but this should be spot-checked under an actual `prefers-reduced-motion` OS
setting. **SHOULD (S audit).**
- **Tablet input-zoom seam:** the 16px input floor is forced only at `≤480px`; a **481–999px tablet**
keeps ~14px inputs → iOS focus-zoom risk. **SHOULD (S)** — move the 16px floor onto the base input
rule or widen the query.
- Verify `min-height:10px` at `terminal.css:2898` is a decorative meter, not an interactive control
(would violate the ≥28px floor). **NICE (S).**
- Literal ARIA under diegetic skins is well-maintained (tracker toggles, nav keycaps, status
annunciator all carry literal labels) — no finding.
### 5.4 Diegesis / believability — **a genuine strength**
Subtitles ("QUARTERMASTER'S FREIGHT CONSOLE," "THE RECORDS BAY," "SELF-DIAGNOSTIC MAINTENANCE BAY"),
PN part numbers ("PN RBC-CRT-16"), the casing serial plate ("property of courier six — hands off"), the
carrier/relay strip, BUS/SLOT fiction — this is the most successfully in-universe layer of the whole
app. Opportunities to push further: (1) the composer placeholder (SH-4); (2) a couple of generic empty
states (`NO AMMO TRACKED`, `NO FACTIONS TRACKED`, `NO ENTRIES IN MEMORY`) vs the excellent ones (`NO
INCIDENTS ON RECORD — MILESTONES WILL APPEAR HERE`); (3) consuming `identity.voice.emptyStates` so the
*same* empty state speaks differently on NV vs FO3. **NICE (S).**
### 5.5 Feature philosophy (AI-vs-native, player-authority) — **excellent, one dead relic**
The native/deterministic conversion is thorough (THREAT/CONSULT/BIO-SCAN/LOOT/VATS/GPS/PERKS/SLEEP +
all stat/skill/faction/quest edits + TERMINAL quick-logs). Player authority is well-held. The only
finding is the **dead AI GPS modal** (MF-3a) and the (intentional) holster→AI hand-off. No place found
where a native path would clearly be better but still round-trips.
### 5.6 Game-specific identity & FO3-adaptability — see Themes A + E. The shared language is proven and
*does not fragment* per-game (good) — but FO3 is unbuilt (`DO-M`) and the keystone is unvalidated by a
second machine. The two game literals (MF-3b) are the only spots that would actively *break* a third
machine's labeling.
---
## 6. ROADMAP RE-SEQUENCING (roadmap authority exercised)
**Observed divergence:** the plan's spine ran cleanly through the SLICE GATE (`DO-K → DO-N → DO-O`,
NV, all shipped), then the program **pivoted** into the "Step 2 / Phase 3" board-reskin + feedback +
ceremony + diagnostic-shell track (which over-delivered DO-P-class polish) and **skipped every unit
gated on a second machine or a new atmosphere** (DO-C full ceremony, DO-M, DO-W, DO-G, DO-Q3/Q4/Q5
consumption). Net: a deeply-dressed NV machine, an unbuilt FO3 machine, no living world, a still-reload
game-switch, and ~⅔ of the keystone unconsumed.
**Recommended re-sequence (why each moves):**
1. **NEW #1 — MF-1 mobile gating fix (was: not on the roadmap).** *Promote above everything.* It's a
near-free fix to the owner's primary-device experience and the DO-N nav's core promise. Shipping the
"NV overhaul" with the nav inert on mobile undercuts the whole point.
2. **Pull DO-Q5 (empty/loading voice) + DO-Q4 (per-game audio) forward, ahead of DO-M.** They consume
already-authored dead data, are low-risk, and make even NV feel more finished. The plan slotted them
as post-DO-K momentum units but they never ran — run them now as cheap keystone-activation.
3. **DO-W living-world slice next (before DO-M).** It's NV-only-viable (FO3 banks already authored),
consumes `identity.ambient`, and the plan itself calls it "the emotional core." Higher immersion-ROI
per effort than a second machine, and it exercises the Ambient Runtime that's already shipped and
idle. *Re-sequence: DO-W before DO-M.*
4. **DO-C ceremony before DO-M too.** Cheap-ish, high-delight, consumes `ceremony.coldStart` (authored,
dead). Turns the jarring `location.reload()` game-switch into the eject→seat→boot moment the plan
flagged as "the biggest wasted-ceremony opportunity." Do the motion verbs it needs (WAKE/FAULT/
BREATHE, DO-Q2 remainder) as part of it.
5. **DO-M (FO3 machine) after the above.** It's the biggest single unit and the keystone-validator, but
it's *correctly future* — nothing about the NV overhaul's completeness depends on FO3 existing. When
it runs, most of its work is "wire the ⅔ dead facets + author `[data-game='FO3']` CSS," which the
items above will have partly de-risked.
6. **DO-G (mobile casing) last of the big units — and cheaper now.** MF-1 delivers most of the mobile
win up front; DO-G then becomes "make the phone *feel* like the device" rather than "rescue mobile
from a mega-scroll." Elevated in importance (owner is mobile-primary) but de-risked by MF-1.
**One-line re-sequence:** `MF-1 → DO-Q5/Q4 → DO-W → DO-C(+DO-Q2 verbs) → DO-M → DO-G`, with the §1
must-fixes + §3 Theme-B/C sweeps interleaved as the "finish the NV machine" pass.
---
## 7. FULL TRIAGE TABLE
**Effort:** S ≈ hours · M ≈ a day · L ≈ multi-day · XL ≈ a program.
| ID | Finding | Triage | Effort |
|----|---------|--------|--------|
| MF-1 | Mobile subsystem nav doesn't gate content; 6 subsystems stack + interleave (17,127→4,218px verified) | **MUST** | S (+M reorder) |
| MF-2 | SETTINGS `#accountPanel` + `#savesPanel` are legacy plain `.panel`s (old header + inline styles) | **MUST** | M |
| MF-3a | Dead AI GPS modal (`api.js:2259`) unreachable-by-contract but live | **MUST** | S |
| MF-3b | Two Protocol-38 game literals mislabel non-FNV as "Fallout 3" (`ui-core.js:3510/3676`) | **MUST** | S |
| SH-1 | Caps dressed as spinnable odometer but bare field; typed caps bypasses `stat.change` choke | SHOULD | S |
| SH-2 | Numeric-input grammar fragmentation (6 idioms; SPECIAL steps, skills don't; drag dir flips) | SHOULD | M |
| SH-3 | Text-list boards + collapsed strips are cross-subsystem indistinct (per-subsystem accent) | SHOULD | M |
| SH-4 | Tempo-knob no-op-on-tap vs immersion-dial-cycles-on-tap (owner-directed — reconsider) | SHOULD | S |
| SH-5 | Composer placeholder + a few generic empty states not diegetic | SHOULD | S |
| SH-6 | Tablet (481–999px) input-zoom seam — 16px floor only ≤480px | SHOULD | S |
| SH-7 | Reduced-motion JS-path verification (WAAPI/inline bypass the CSS block) | SHOULD | S (audit) |
| SH-8 | BIO-SCAN stick figure crude vs surrounding polish | SHOULD | S–M |
| SH-9 | CSS housekeeping: dead `.tab-btn`, duplicate copper hex, raw rgba vs tokens, dual header convention | SHOULD | S |
| NI-1 | SLOT vs BUS part-number scheme — decide/document intentional sub-identity | NICE | S |
| NI-2 | Consume `identity.voice.emptyStates`/`loading` (DO-Q5) — per-game voice | NICE→SHOULD | M |
| NI-3 | Consume `identity.audio` (DO-Q4) — per-game hum/boot/wake | NICE | M |
| NI-4 | Verify `min-height:10px` control isn't interactive | NICE | S |
| NI-5 | Living-core legibility as it accretes behaviors | NICE | S |
| ST-1 | DO-M — FO3 machine identity (only 1 `[data-game=FO3]` rule; ⅔ keystone dead) | STRETCH | XL |
| ST-2 | DO-W — living-world layer (deeds-as-news/weather/broadcasts; consumes `ambient`) | STRETCH | L |
| ST-3 | DO-C — full cartridge eject→seat→boot ceremony (still reload+SEAT flash) | STRETCH | M–L |
| ST-4 | DO-Q2 motion verbs 3/5 missing (WAKE/FAULT/BREATHE) | STRETCH | M |
| ST-5 | DO-G — mobile casing / slide-over subsystems (after MF-1) | STRETCH | XL |
| ST-6 | DO-Q3 — per-game cursor consumption (FO3/FO4 authored, unread) | STRETCH | M |
---
## 8. WHAT'S GENUINELY GREAT (don't touch / protect in any refactor)
So the "finish it" pass doesn't sand off what works:
- The **casing + bezel + keycap-nav chrome** (desktop especially) — a convincing physical device.
- **CARTOGRAPHY TABLE** phosphor radar node-map — the best diegetic surface in the app.
- **The living fusion core** + casing-top mini-core mirror — the most novel identity.
- **The weigh-bridge / cargo-manifest** freight language — most internally coherent subsystem.
- **The Director oscilloscope** tied to the real request lifecycle.
- **The native-command conversion** + player-authority discipline.
- **Reduced-motion CSS discipline** and **literal ARIA under diegetic skins**.
- The **shared token/`bay-board` system** — the reason cohesion holds at all; the fixes above should
*extend* it (accents, consumed facets), never fork it.
---
*END — NV_OVERHAUL_DESIGN_AUDIT.md. Analysis/ideation only; nothing implemented. Owner reviews and
picks. `planning/` is gitignored.*
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).