RELEASE
planning/2.8.0/audits/FEATURE_PHILOSOPHY_AUDIT.md
sha256 b7b5a7d34cf4e90b · 72382 bytes ·
original held in the private archive
# RobCo U.O.S. — FEATURE PHILOSOPHY AUDIT
> **FILED UNDER 2.8.0 — PRODUCED-BY, NOT MEASURED-VERSION.** This document *measures* an earlier codebase
> (see its baseline stamp below), but it was *produced* as part of the audit/planning phase that became the
> 2.8.0 overhaul. Planning artifacts are filed by the release whose work produced them, never by the version
> they discuss. The version in the title or baseline is the code it examined, not the folder it belongs in.
> (A 2.5.0 and 2.6.0 folder do exist, holding feature designs for features that shipped in those releases. There
> is no 2.7.0 folder because no artifact has been identified as produced during 2.7.0.)
> **Date:** 2026-07-01 · **Baseline:** `dev` @ `2bd28aa` (v2.7.0, cache `robco-terminal-v2.7.0-r9`, 1557 tests / 130 suites)
> **Mode:** ANALYSIS / PLANNING ONLY. Nothing implemented, nothing committed, nothing pushed. This doc lives in gitignored `planning/`.
> **Authority order:** (1) The CURRENT DESIGN STATE supplied by the owner (guiding principles, core OS architecture, identity anchors, 3-step roadmap) — NEWER than every repo planning doc. (2) The actual codebase. (3) The repo's planning docs (MASTER_PLAN, ROADMAP_REBASELINE, WASTELAND_UPLINK_SPEC, IMMERSION_AUDIT, FEATURE_REMAKES, etc.) as historical inventory.
>
> Companion to the completed Design Philosophy. Where the Design Philosophy locked *how the terminal looks and speaks*, this audit locks *what the terminal IS made of* — its systems, their connections, and the order they should be completed in.
---
## 0. Method & Evidence Base
Every claim below was grounded in a full read of: `index.html`, `js/state.js`, `js/api.js`, `js/ui-core.js`, `js/ui-render.js`, `js/ui-saves.js`, `js/ui-account.js`, `js/ui-audio.js`, `js/cloud.js`, `js/db_nv.js`/`db_fo3.js`, `js/reg_nv.js`/`reg_fo3.js`/`registry-core.js`, `sw.js`, `firestore.rules`, `manifest.json`, both test runners' suite map, and all 30 `planning/` docs. Contested findings were re-verified directly against source. Corrections to first-pass findings (recorded so later sessions don't re-import the errors):
| First-pass claim | Verified reality |
| --- | --- |
| `getAmmoCalibers()` is dead code | **Wrong** — consumed by `initAmmoDatalist()` (`ui-saves.js:657`). |
| FNV companions registry is empty | **Wrong** — `reg_nv.js:1073` has a `companions:` category. Both games have companion registry data. |
| Crossroads Record is a dead placeholder | **Wrong** — `renderCampaignStatus()` (`ui-render.js:1146+`) renders the last 20 auto-logged `[T#]` entries from `campaign_notes`. It is *wired*, but it is a **regex-filtered view over a string array** — the architectural finding is different (see SYS-3). |
| Campaign Status is stale until reopened | **Wrong** — `renderCampaignStatus()` is called from `loadUI()` (`ui-core.js:2245`) under the dirty-check. |
| FNV DLC quests are fully absent | **Partially wrong** — 5 DLC-tagged quests exist (Old World Blues). Dead Money / Honest Hearts / Lonesome Road quest lines (~30–35 quests) are genuinely missing. |
| FO3 `WEAPON_MODS` 0 rows is an authoring gap | **Genuine game difference** — weapon mods were introduced in FNV; FO3 has no weapon-mod system. The residual issue is UI-side (see GI-11). |
---
## 1. Philosophy Verdict — How the Codebase Measures Against the Five Principles
**The short version: v2.7.0 is a *feature-complete collection of well-guarded parts* that has not yet become an *operating system*.** Almost nothing is broken; almost everything is siloed. The audit's center of gravity is therefore CONNECTION and CONSOLIDATION, not construction.
### P1 — Player Authority: **STRONG, with one class of gap**
The AI is opt-in, validated field-by-field (`autoImportState` clamps everything), forbidden from `gameContext`/`campaignMode`, and six former AI features are now native deterministic terminals. RNG mode is correctly the lone sanctioned exception.
**Gap class:** a handful of state fields are still *AI-writable but not natively editable* — squad `affinity` renders a bar but has no native input; `stats` deltas (kills/caps/damage) have RESET but no native adjust; per-limb DT on squad members. The roadmap's "native input path required" protocol exists but is scheduled for v2.9.0; the *audit* of which fields violate it should happen now (FP-AI-5).
### P2 — OS-First / Campaign-Second: **THE BIGGEST GAP**
The campaign layer is excellent. The OS layer is embryonic: there is no state machine (boot → ready → standby is scattered across `window.onload`, blur/visibility handlers, and per-feature timers), no scheduler (≥8 independent `setInterval`/timeout loops: uptime clock, memory cycle, geiger Poisson scheduler, radio motif scheduler, tinnitus swell, heartbeat, standby dimming, planned UPLINK tick), no filesystem, no launcher beyond TERMLINK's static menu, and settings are scattered across four homes. "Would RobCo have built this into the terminal in 2077?" currently has no structural place to put the answer.
### P3 — Diegetic-First: **STRONG at panel level, INCOMPLETE at system level**
Panel headers, boot, errors, and the six native terminals are excellently diegetic. But several *features* still exist as features rather than as COMMAND/DOCUMENT/DEVICE/SERVICE: settings are checkboxes (not installed MODULE BAY boards), help is a modal (not SYSTEM/MANUALS/ documents), sign-in is an account panel (not OPERATOR CLEARANCE), the update prompt is a modal (not a DISTRIBUTION NETWORK firmware payload), and ~30 `alert()`/`confirm()` calls break the frame entirely.
### P4 — Clean Boundary (campaign save vs terminal meta-store): **ARCHITECTURALLY CORRECT, INFORMALLY MAINTAINED**
The split already exists and is honored: `robco_v8` (campaign container, synced/exported) vs ~24 `robco_*` device keys (audio, optics-per-game, wake lock, haptics, overseer log, error ring, panel state, backups…). But it is maintained by convention — there is no meta-store module, no accessor API, and no gate guard asserting a campaign field can't leak into a device key or vice versa (FP-SYS-5, FP-PER-4). The Overseer's Log panel already correctly renders the two stores under separate UNIT TELEMETRY / CAMPAIGN LOG dividers — the pattern is proven, just not enforced.
### P5 — Free / Offline / Game-Agnostic: **STRONG**
Zero paid infra, BYO key, ~95% of features work in airplane mode, SW precaches everything, Protocol 38 + Suite 89 guard agnosticism, and the GA-1…GA-11 literal purge landed. The remaining agnosticism debt is exactly one item: the GA-5 tracker-directive ternaries inside `getSystemDirective()` (sanctioned-pending). The *data* side is less equal than the *code* side: FO3's databases are 40–60% the depth of FNV's (see §2.4) — which is a **game-identity** problem as much as a data problem.
### Core-OS subsystem scorecard (against the owner's architecture)
| Owner subsystem | Exists today as | Completeness |
| --- | --- | --- |
| Ambient Runtime (state machine + scheduler) | Scattered: `window.onload` (~900 lines), blur/visibility standby, ≥8 independent timers | **~15%** — states exist implicitly (boot/active/standby); no machine, no scheduler, no IDLE, no SHUTDOWN |
| Launcher + Command Language | `NATIVE_COMMAND_ROUTER` + `PANEL_NAV_ALIASES` + `COMMAND_REGISTRY` + TERMLINK console (WU-F9) | **~45%** — routing hierarchy is real and guarded (Suite 113); grammar is bracket-token, not a language; no macros; autocomplete only on add-inputs |
| Filesystem | Nothing (tabs + panels) | **0%** — pure greenfield view layer |
| MODULE BAY + Data Cartridges | Settings scattered across Security & Config, Audio Systems, Power Management, CAMPG; games split across `GAME_FILES` manifest + `GAME_DEFS` + db/reg pairs | **~30%** — all the *content* of the Module Bay exists; the bay does not. Cartridge concept: the per-game file trio is already cartridge-shaped, unlabeled |
| PERIPHERAL BUS | WU-F1…F11 shipped as individual device features (wake lock, haptics, share, badge, radio) | **~50%** — devices exist; the bus (one registration/status/fallback frame) does not; share-target absent from manifest; Pip-Boy sync framing absent |
| ROBCO DISTRIBUTION NETWORK | SW update modal + changelog viewer + kill-switch config read; Remote Transmissions UNDESIGNED (old OPEN Q3) | **~35%** — three of the payload types ship through three unrelated mechanisms |
| TERMINAL RECORD | `campaign_notes` string array with `[T#]` prefix tags; Crossroads = regex filter view; Overseer log = separate device JSON | **~25%** — auto-logging works (factions, quests, locations) but the "one canonical history" is a 200-cap string array; hardware history is a separate store (correctly!) but there is no unifying view layer |
| SYSTEM STATUS | Overseer's Log panel (F7/F10) + `[LOGS]` error ring + boot flavors | **~40%** — telemetry and diagnostics exist in two homes; no condition/quirks/maintenance lanes |
---
## 2. Current-State Findings (grounded inventory)
### 2.1 What is genuinely COMPLETE (do not re-plan)
- Six native deterministic terminals (VATS SIM, TRADE/BARTER UPLINK, THREAT, CONSULT/DATABANK, BIO-SCAN, LOOT) — offline, coefficient-driven from `GAME_DEFS`, suite-guarded (104–110).
- Nine device capabilities (wake lock, haptics, holotape share, badging, synth radio, cold/degraded boot, overseer log, high-lumen, TERMLINK) — Suites 115–123.
- Per-game theming foundation (THEMES table, per-game default + persisted optics, identity strings, save-archive header) — Suites 124, 127, 130.
- Save integrity chain (checksum envelope, rolling backups, cloud additive writes, sanitize→migrate round-trip) — Suites 46, 51.
- Kill-switch/remote-config with LKG + fail-open + circuit breaker; App Check enforced (per owner: DONE).
- The routing hierarchy (panel-nav → native command → WAIT regex → AI) with Suite 113 registry↔router↔help lock.
- Auto-logging of faction deltas, quest transitions, and location discovery into `campaign_notes` with audio/haptic side-effects.
- The dirty-check render system (`_isDirty` slices) and `_updateContextPanels()` game gating.
### 2.2 What is PARTIAL (built, but stopped short)
| # | Finding | Evidence |
| --- | --- | --- |
| P-1 | **Terminal Record exists as a string hack.** Auto-logs are `[T<ticks>]`-prefixed strings pushed into `campaign_notes` (cap 200, oldest dropped). Crossroads Record is a regex filter over it. Events have no type, no payload, no queryability; the 200-cap silently eats old history that the planned Incident Log / karma-rep timeline / "previously on" recaps will want. | `api.js` faction/quest loggers; `ui-render.js:1146` |
| P-2 | **Projected Timeline panel is a stub pointer.** `#timelineDisplay` renders a static "[TIMELINE] command in COMM-LINK" note — a panel whose content lives only in an AI chat reply. Isolated functionality by definition. | `index.html:1330` |
| P-3 | **Squad affinity is render-only.** `renderSquad()` draws an affinity bar when `member.affinity` is defined, but no native control sets it — AI-only mutation path (violates the coming native-input-path protocol). | `ui-render.js:183–195` |
| P-4 | **Session duration stored, never shown.** `stats.sessionStart` persists but the campaign panel shows cumulative CAMPAIGN TIME only from ticks; no "this sitting" readout. | `state.js:579` |
| P-5 | **THREAT computes ammo burn but never checks reserves.** `_threatCompute` returns `ammoBurn`; `state.ammo[caliber]` is right there; no INSUFFICIENT RESERVES advisory. | `ui-render.js:2313+` |
| P-6 | **VATS and THREAT don't share a target.** VATS takes manual `#vatsTargetDT`; THREAT has the bestiary DT for the same enemy. The v2.9.0 ENCOUNTER merge fixes this — noted here as the concrete missing link. | WU-N1/N3 |
| P-7 | **Chem/magazine boosts are cosmetic.** The Active Chem Visualizer highlights skill rows and VATS folds a chem term into hit-%, but there is no single "effective skill" resolver — TRADE, craft soft-gates, and the future dialogue helper each see raw skill only. | `ui-render.js:456`, VATS formula |
| P-8 | **CONSULT can't see the trackers.** `_CONSULT_CATS` = items/perks/quests/locations/companions. Collectibles, skill books, magazines, Lincoln items, traits — all registry-backed — are invisible to the databank. | `ui-render.js:2405` |
| P-9 | **~30–40% of authored DB columns unconsumed.** Ammo subtype modifiers (DMG mult, DT mod), bestiary `Perception`/`Speed_Factor`, armor `Min_CND_Threshold`, quest-item `Tradeable`/`Special_Property`, vendor `Repair_Skill`/`Restock_Days`/`Accepted_Currencies`, chem `family` (read but unused for grouping), registry `dlc` tag (returned, never displayed). Most are *reserved for v2.9.0 systems* — but nothing records which, so each new feature re-discovers them. | db_* schemas vs consumer greps |
| P-10 | **Remote Transmissions is still undesigned** (the one genuinely blank spec, old OPEN Q3) — now resolvable as a payload type of the DISTRIBUTION NETWORK rather than its own system. | ROADMAP_REBASELINE |
| P-11 | **Onboarding/manuals/help split across three surfaces**: [FEATURES] modal (Suite 113), SAVE MENU "?" (Suite 103), boot-time changelog. No MANUALS home. | ui-core.js |
| P-12 | **`beforeunload` flush is the only SHUTDOWN.** No shutdown state, no ritual, no clean "powering down" write of the overseer log (it flushes on visibilitychange/pagehide — good — but the *experience* ends with a browser close). | ui-core.js:884 |
### 2.3 What is DUPLICATED / SCATTERED (consolidation targets)
| # | Finding | Evidence |
| --- | --- | --- |
| D-1 | **Settings live in 4 homes:** Security & Config top level (key/model/optics/high-lumen), AUDIO SYSTEMS sub-panel (16 toggles + typer speed), POWER MANAGEMENT sub-panel (wake/haptic), CAMPG (game/playstyle/playthrough/RNG — correctly campaign-side, but visually identical to device prefs). The MODULE BAY is the designed answer; nothing has begun. | index.html:1388–2019 |
| D-2 | **Three modal patterns:** `#updateModal` (blocking, bespoke), `#sysModal` (shared by 6+ features via `_openSysModal`), changelog `changelog-wide` variant. Each wires its own focus/esc handling variants. | index.html:82/136, ui-core.js |
| D-3 | **≥8 independent ambient timers** (uptime, memory cycle, geiger, radio motif, tinnitus swell, heartbeat, standby dim, planned UPLINK tick) each with their own visibility/mute logic. The Ambient Runtime scheduler is the designed answer. | ui-core.js / ui-audio.js |
| D-4 | **Threshold detection is inlined per consumer:** faction Vilified/Idolized crossing computed in `autoImportState` (fires audio+haptic), critical-HP crossing computed in ui-core (haptic), level-up detected in autoImportState (jingle+haptic). Terminal Record, UPLINK news, badges, and incident log will each need the same crossings. No shared event emitter. | api.js:752, ui-core.js |
| D-5 | **~30+ `alert()`/`confirm()` sites** — main-thread-blocking, frame-breaking, and each phrased ad hoc (QA-CONS-10, still open). | all ui-*.js |
| D-6 | **List-renderer markup families differ** (inventory flex rows vs notes-list rows vs tracker-rows) — mostly fine post-WU-B8 (`_renderReadTracker` proved the shared-driver pattern) but inventory/perks/quests never got the same treatment. | ui-render.js |
### 2.4 Per-game DATA asymmetry (gap vs genuine)
| Category | FNV | FO3 | Verdict |
| --- | --- | --- | --- |
| Weapons | 192 | 115 | **Gap** — FO3 base+DLC roster is larger than 115; enrichment pass warranted |
| Armor | 103 | 61 | **Gap** (FO3 DLC + variants thin) |
| Chems/consumables | 76 | 33 | **Gap** |
| Ammo | 56 | 24 | **Mostly gap** (FO3 has fewer calibers genuinely, but not 24-few) |
| Quests (registry) | 154 (only OWB DLC) | 64 (all 5 DLCs ✅) | **FNV gap** — DM/HH/LR ~30–35 quests missing; FO3 is the *complete* one here |
| Perks | 146 | 62 | Partially genuine (FNV+DLC has more), partially gap |
| Items (registry) | 511 | 186 | **Gap** |
| Locations | 108 | 90 | Near parity ✅ |
| Bestiary | 66 | 66 | Parity ✅ |
| Weapon mods | 424 | 0 | **Genuine** — FO3 has no weapon-mod system (but see GI-11: UI shows a MODS filter to FO3 anyway) |
| Vendors | 39 | 31 | Near parity; verify row counts |
| Traits / Magazines | FNV-only | — | Genuine |
| Lincoln / Karma Center | — | FO3-only | Genuine |
| Companions (registry) | present | 6 | Verify FNV count ≥ 8 (Arcade/Boone/Cass/Lily/Raul/Veronica/ED-E/Rex) |
**Reading:** FO3 is data-thinner across items/chems/ammo/armor while FNV is quest-thinner. "Each game feels like its own native terminal" fails quietly when one game's DATABANK answers half as many CONSULT queries. Data depth **is** game identity (FP-GI-9).
### 2.5 Missing interconnects (systems that should feed each other and don't)
1. THREAT ammo burn ↔ `state.ammo` reserves (P-5).
2. THREAT bestiary DT ↔ VATS target DT (P-6 → ENCOUNTER).
3. Chem/magazine boosts ↔ one effective-skill resolver ↔ VATS/TRADE/craft/dialogue (P-7).
4. Trackers (collectibles/books/magazines/Lincoln/traits) ↔ CONSULT search (P-8).
5. Threshold crossings ↔ one event emitter ↔ audio/haptic/record/news/badges (D-4).
6. Auto-log history ↔ Crossroads *and* the five other planned views (P-1).
7. Vendor faction affiliation ↔ faction standing (FNV faction vendors refuse Vilified couriers — no warning today; needs VENDOR_STOCK).
8. `locationHistory` ↔ map exploration/travel (fog-of-war exists; nothing consumes it beyond display — v2.9.0 exploration is the consumer).
9. Registry `dlc` tags ↔ quest log/CONSULT display (data present, invisible).
10. Session briefing (boot) ↔ Terminal Record ("previously on" recaps planned for v2.9.0 should read the same store — if the store exists by then).
11. Overseer device telemetry ↔ Hardware Life (condition/quirks want boot count & power-on hours — the data is already there).
12. Weather/day-night (planned) ↔ geiger rate/radio DJ/map — specced in UPLINK; listed to keep the dependency visible.
---
## 3. RECOMMENDATION BACKLOG (by philosophy category)
> Schema per item: **Title** · Description · Why it improves completeness · Connects to · Classification · Complexity (S/M/L/XL) · Dependencies · Roadmap placement.
> IDs are stable for future reference: `FP-<CAT>-<n>`.
> Priority lens used throughout: complete existing → complete implementations → connect systems → eliminate isolation → per-game behavior → architecture → future-dev simplification → new features last.
### 3.A SYSTEMS (the OS layer)
**FP-SYS-1 · Ambient Runtime: terminal state machine + single scheduler**
One module owning the canonical state (`OFF → COLD BOOT → READY → ACTIVE → IDLE → STANDBY → SHUTDOWN`) and one heartbeat; every ambient system (uptime clock, memory cycle, geiger scheduling, radio motifs, tinnitus swell, heartbeat, standby dim, idle attract, UPLINK tick) registers as an *observer* with a desired cadence and required states, instead of owning a timer.
*Why:* eliminates ≥8 duplicated timer/visibility/mute wirings (D-3); creates the IDLE state the attract mode needs and the SHUTDOWN state the ritual needs; makes "focused-only, paused on blur" a property of the runtime instead of a per-feature promise; UPLINK's no-write tick becomes one more observer instead of a ninth timer.
*Connects to:* standby system, all of ui-audio's ambient loops, WU-F7 overseer clock, planned UPLINK U0, attract mode, shutdown ritual, immersion dial (a dial the *runtime* enforces, not each feature).
*Classification:* Refactor + Completion. *Complexity:* L. *Dependencies:* FP-SYS-6 (boot decomposition) strongly recommended first. *Placement:* v2.8.0 Phase 1 (see §5).
**FP-SYS-2 · OS Event Bus (one emitter for state crossings)**
A tiny `emit(event, payload)` with typed events (`faction.threshold`, `hp.critical`, `level.up`, `quest.status`, `location.discovered`, `rad.tier`, `limb.crippled`, `collectible.acquired`, `trade.completed`, `craft.completed`, `boot.completed`, `update.installed`). `autoImportState` and the native mutators emit; audio, haptics, Terminal Record, UPLINK news, badges, and incident log subscribe.
*Why:* today each consumer re-implements crossing detection inline (D-4); every planned v2.8.0/2.9.0 consumer (news callbacks, incident log, chassis choreography, karma timeline) would otherwise add a fourth and fifth copy. This is the single highest-leverage piece of shared infrastructure in the whole program.
*Connects to:* autoImportState, ui-audio jingles, triggerHaptic, _updatePanelBadges/_updateAppBadge, FP-SYS-3, UPLINK personal-legend news, session briefing.
*Classification:* Refactor + Integration. *Complexity:* M. *Dependencies:* none hard. *Placement:* v2.8.0 Phase 0/1 boundary — before UPLINK and before Terminal Record consumers.
**FP-SYS-3 · TERMINAL RECORD: structured event store (one history, many views)**
Replace the `[T#]`-string auto-log *carrier* with a structured event log (`{t: ticks, rt: wallclock?, type, payload}`), fed by FP-SYS-2, stored per-campaign (rides `robco_v8` → cloud/export automatically per Protocol 34's serialized-whole path). `campaign_notes` returns to being purely the player's manual notebook. Views become cheap filters: **Crossroads** (decision events — already exists, re-pointed), **Incident Log** (hardware+campaign milestones), **Faction timeline**, **Quest history**, **Calendar view**, **Session view**, and (from the meta-store, never merged) **Hardware view**. Kill the silent 200-cap for events, or make the cap type-aware (keep all decision-grade events, cap chatter).
*Why:* P-1 is the deepest completion gap in the app — six planned features (incident log, karma/rep timeline, combat log, recaps, calendar, news callbacks) all want to read a history that currently can't answer questions. Retrofitting structure *after* UPLINK and Hardware Life start writing strings means a migration; doing it first means they're born structured.
*Connects to:* Crossroads Record (existing view #1), session briefing, v2.9.0 SESSIONS/recaps, karma/rep timeline, combat log, UPLINK news, Hardware Life.
*Classification:* Completion + Refactor. *Complexity:* L (schema S; migration of `[T#]` strings M; views incremental). *Dependencies:* FP-SYS-2; Protocol 4 wiring for the new state field; sanitizer entry. *Placement:* v2.8.0 Phase 1 (schema + Crossroads/Incident re-point); further views ride their features.
**FP-SYS-4 · SYSTEM STATUS: one machine-health home**
Fold into a single DATA-tab (or shell-level) surface: Overseer telemetry (uptime/boots/longest session), Diagnostics (`[LOGS]` error ring + a `RUN DIAGNOSTIC` self-test readout), Condition (Hardware Life quirks/wear when they land), Maintenance history (update installs, cache revs seen, migrations run — the Distribution Network's receipt log). Panel already half-exists as OVERSEER'S LOG (F10 merged session stats in).
*Why:* completes the F7/F10 consolidation to its designed end-state; gives Hardware Life a home *before* it ships; turns `[LOGS]` from an orphan command into a drawer of a coherent surface.
*Connects to:* Overseer log, error ring buffer, boot flavors (boot codes), Distribution Network receipts, Hardware Life.
*Classification:* Completion + Integration. *Complexity:* M. *Dependencies:* none hard; Hardware Life fills it later. *Placement:* v2.8.0 Hardware Life phase (skeleton can come earlier cheaply).
**FP-SYS-5 · Terminal meta-store accessor module**
One `MetaStore.get/set(key)` wrapper owning the `robco_*` device namespace (24+ keys today), with a registered-key manifest (name, type, default, owner feature). Campaign code may not call it for campaign data; device features may not write `robco_v8`.
*Why:* P4 boundary is convention-only today; IndexedDB migration (FP-PER-1) needs a single choke point to swap storage engines behind; Hardware Life triples the meta-store's importance.
*Connects to:* every device pref, FP-PER-1, FP-PER-4 (boundary guard suite).
*Classification:* Refactor (architecture). *Complexity:* M (mechanical, wide). *Dependencies:* none. *Placement:* v2.8.0 Phase 0 (foundation) — before IndexedDB, before Hardware Life.
**FP-SYS-6 · Decompose the `window.onload` boot block into named seams**
(Existing plan S2-F3, re-affirmed and re-ordered.) `_hydrateStateFromStorage / _restoreDevicePrefs / _wirePanelPersistence / _wireKeyboardShortcuts / _startAmbientObservers / _wireUnloadFlush` etc. The block is now ~900 lines (it has *grown* past the documented 568 since F-phase landed).
*Why:* every v2.8.0 organizing-layer feature (state machine, MOTD, onboarding, clearance restore, Module Bay init) lands in boot; the monolith is the single highest regression surface in the app.
*Connects to:* FP-SYS-1 (COLD BOOT→READY is this decomposition's product), onboarding, MOTD.
*Classification:* Refactor. *Complexity:* M–L. *Dependencies:* none. *Placement:* v2.8.0 Phase 0, first or second unit.
**FP-SYS-7 · Decompose `getSystemDirective()` + retire GA-5 ternaries**
(Existing plan S2-F2, re-affirmed.) Per-section builders (`_directivePersona/_directiveContract/_directiveCombat/_directiveTrackers(ctx)…`) with tracker text moving to `GAME_DEFS[ctx].ai.trackerDirectives`. Protocol 14 AI-contract test in the same commit.
*Why:* last Protocol-38 residue; blocks FO4; every AI-residue feature (overseer hooks, INTERCEPT augment) injects here; also the precondition for token-budgeting the directive per feature.
*Connects to:* Protocol 38, FO4, AI residue features, FP-AI-3.
*Classification:* Refactor. *Complexity:* M. *Dependencies:* none. *Placement:* v2.8.0 Phase 0.
**FP-SYS-8 · One modal driver**
Single `openModal({title, body, mode, blocking, onClose})` consolidating `#sysModal`, `#updateModal`, and the changelog-wide variant; focus trap/ESC/ARIA wired once (WU-C4's work becomes the shared core).
*Why:* D-2; three focus-trap implementations is three places to regress; the Distribution Network and MANUALS will both open documents in modals.
*Connects to:* all six native terminals, update flow, changelog, manuals.
*Classification:* Refactor + QoL. *Complexity:* M. *Dependencies:* none. *Placement:* v2.8.0, opportunistic (before MANUALS).
**FP-SYS-9 · ROBCO DISTRIBUTION NETWORK: one update channel, many payloads**
A client-side payload abstraction: `{channel: 'firmware'|'cartridge'|'broadcast'|'roadmap'|'intercept-pack', version, body}`. Firmware = existing SW update (unchanged mechanics, reframed presentation + receipt logged to SYSTEM STATUS). Changelog + roadmap panel = locally-shipped payloads rendered by the same viewer. Remote Transmissions = the one *live* channel (read-only public Firestore doc + `remoteTransmissions` kill-switch + App Check), which **closes old OPEN Q3 by design**: a transmission is just a broadcast/intercept-pack payload, so its data model is the payload schema.
*Why:* turns three unrelated mechanisms (SW modal, changelog fetch, undesigned remote drops) into one diegetic service; gives intercept packs and future data-cartridge patches a delivery path without new infra each time.
*Connects to:* sw.js update flow, changelog viewer (Suite 62), kill-switch config, UPLINK/INTERCEPT, roadmap panel, FP-DATA-7 cartridge manifest.
*Classification:* Integration + New Feature (thin). *Complexity:* L (design M, client S–M, live channel M). *Dependencies:* UPLINK static core (broadcast bank) for the broadcast payload type; kill-switch registration (Protocol 32). *Placement:* v2.8.0 after UPLINK core; design doc early.
**FP-SYS-10 · Purge `alert()`/`confirm()` → diegetic modal confirm helper**
`confirmAction({title, warning, confirmLabel})` on the FP-SYS-8 driver; ~30 call sites swept in batches (destructive ops keep explicit confirm semantics per Protocol 34).
*Why:* D-5; last big frame-breaker; also unblocks styling confirm flows per-game.
*Classification:* Refactor + Immersion. *Complexity:* M (wide, mechanical). *Dependencies:* FP-SYS-8. *Placement:* v2.8.0, batched sweep.
### 3.B NAVIGATION (launcher, command language, filesystem)
**FP-NAV-1 · Command Language v1 (bare-word grammar)**
Promote routing from bracket-token matching to a small grammar: `VERB [ARG]` with bare words (`INV`, `QUEST`, `MAP`, `STATUS`, `SCAN <target>` → THREAT, `CONSULT <topic>`, `TRADE`, `CRAFT`, `SLEEP`, `WAIT 4`), keeping every existing `[TOKEN]` alias (Protocol 25 — muscle memory preserved). One parse function; router table becomes data.
*Why:* the DOS-shell feel is the identity anchor of the launcher; `PANEL_NAV_ALIASES` + `NATIVE_COMMAND_ROUTER` + the WAIT regex are already 80% of the machinery — this is completion, not construction.
*Connects to:* NATIVE_COMMAND_ROUTER, COMMAND_REGISTRY/Suite 113, TERMLINK, MANUALS (`HELP <cmd>`).
*Classification:* Completion. *Complexity:* M. *Dependencies:* none. *Placement:* v2.8.0 Phase 1.
**FP-NAV-2 · Command autocomplete in COMM-LINK**
Extend the proven `#acPanel` autocomplete singleton (currently add-inputs only) to the chat input for command tokens + registry args (`CONSULT deathcl…`).
*Why:* discoverability is the weakest part of the command surface; reuses existing machinery (Protocol 22).
*Connects to:* initRegistryAutocomplete, COMMAND_REGISTRY.
*Classification:* Completion + QoL. *Complexity:* S–M. *Dependencies:* FP-NAV-1 helpful. *Placement:* v2.8.0 with NAV-1.
**FP-NAV-3 · Local MACROS**
User-defined named command sequences (`MACRO REST = SLEEP; BIO-SCAN; STATUS`), stored in the meta-store (device-side, never synced, never AI-visible).
*Why:* designed feature of the launcher; trivially safe (replays existing commands through the same router = same confirm gates).
*Connects to:* FP-NAV-1, MetaStore.
*Classification:* New Feature (small). *Complexity:* S–M. *Dependencies:* FP-NAV-1. *Placement:* v2.8.0 late.
**FP-NAV-4 · Filesystem skin (SYSTEM/ ARCHIVES/ INTERCEPTS/ MANUALS/ USER/ LOGS/)**
A navigation *view* — `DIR`/`OPEN` commands + a browsable tree modal — mapping onto existing surfaces: ARCHIVES/→ saves, INTERCEPTS/→ intercept inbox, MANUALS/→ help docs, USER/→ campaign notes + holotape exports, LOGS/→ error ring + record views, SYSTEM/→ Module Bay + status. No storage change; purely resolution of paths to panels/documents.
*Why:* the diegetic navigation identity anchor; cheap because it is a skin — but it must come *after* its targets exist (manuals, intercept inbox, module bay), which drives its placement.
*Connects to:* everything above. *Classification:* New Feature (view layer). *Complexity:* M. *Dependencies:* FP-NAV-1, MANUALS, Module Bay, INTERCEPT inbox. *Placement:* v2.8.0 late (after its targets), explicitly *not* first despite being listed first in the organizing layer — see §5 justification J-2.
**FP-NAV-5 · RobCo MANUALS (HELP as documents)**
Move [FEATURES] content, SAVE-MENU help, onboarding chapters, and per-terminal usage notes into MANUALS/ documents (static, precached, one renderer). `HELP` opens the index; `HELP VATS` opens a page.
*Why:* roadmapped (v2.8.0 "RobCo Manuals"); consolidates three help surfaces (P-11); gives onboarding its persistent home ("skippable-persistent").
*Connects to:* COMMAND_REGISTRY (generated command reference page keeps Suite 113 honest), onboarding, filesystem.
*Classification:* Completion + Integration. *Complexity:* M. *Dependencies:* FP-SYS-8 (viewer). *Placement:* v2.8.0 mid.
**FP-NAV-6 · Deep-link routes for all panels**
Extend the `#go=` allow-list (currently 4 shortcuts) to every panel/terminal, shared by PWA shortcuts, filesystem, macros, and MANUALS cross-links.
*Classification:* QoL. *Complexity:* S. *Dependencies:* none. *Placement:* v2.8.0 anytime.
### 3.C FEATURE (finishing what exists)
**FP-FEAT-1 · Resolve the Projected Timeline stub** — either render a native projection from Terminal Record (active quests + faction trajectories) or retire the panel and leave [TIMELINE] purely as an AI command surfaced in COMM-LINK. Recommendation: retire panel now (S), revisit as a Terminal Record view in v2.9.0. *Classification:* Completion. *Complexity:* S. *Placement:* v2.8.0 early sweep.
**FP-FEAT-2 · Surface session duration** — "CURRENT SITTING" line in OVERSEER'S LOG campaign section from `stats.sessionStart`. *Classification:* Completion. *Complexity:* S. *Placement:* v2.8.0 sweep.
**FP-FEAT-3 · Native affinity control** — add affinity input to the squad add/edit row (P-3), satisfying the native-input-path rule for the one field that violates it today. *Classification:* Completion. *Complexity:* S. *Placement:* v2.8.0 sweep (don't wait for the v2.9.0 companion overhaul to fix an authority-principle violation).
**FP-FEAT-4 · THREAT ammo-adequacy advisory** — compare computed `ammoBurn` vs `state.ammo[caliber]`; render `⚠ RESERVES INSUFFICIENT — 24/60 ROUNDS` line. *Classification:* Integration (quick win). *Complexity:* S. *Placement:* v2.8.0 sweep.
**FP-FEAT-5 · CONSULT covers trackers + surfaces reserved columns** — add collectibles/skillBooks/magazines/traits/lincolnMemorabilia categories to `_CONSULT_CATS` (registry data already exists), and show quest-item `Special_Property`/`Tradeable` + registry `dlc` tag in detail lines (P-8, P-9 partial). *Classification:* Completion. *Complexity:* S–M. *Placement:* v2.8.0 sweep.
**FP-FEAT-6 · Effective-skill resolver** — one `getEffectiveSkill(key)` = base skill + active chem boosts + active magazine (+10, FNV) with a breakdown object; consumed by VATS (replacing its inline chem term), TRADE, craft soft-gates, and later the dialogue helper. Display-only in panels ("45 (+10 MAG)"); never writes back to `state.skills` (player authority: recorded skill stays the player's number). Skill *books* deliberately excluded (their +3/+4 is permanent and already in the player's recorded totals — double-counting hazard, documented).
*Classification:* Integration. *Complexity:* M. *Dependencies:* none. *Placement:* v2.8.0 late or v2.9.0 opener (before dialogue helper + ENCOUNTER).
**FP-FEAT-7 · Kill-switch registration audit for v2.8.0 networked features** — Remote Transmissions channel, INTERCEPT augment, any new live payloads each register a flag + fallback per Protocol 32 (checklist item, not code). *Classification:* Architecture hygiene. *Complexity:* S. *Placement:* standing checklist.
**FP-FEAT-8 · "?"-affordance rollout** — extend the SAVE MENU "?" pattern (Suite 103) as MANUALS deep-links on the four most complex panels (WORLD MAP, BARTER UPLINK, CRAFTING, CAMPAIGN CONFIG). *Classification:* QoL. *Complexity:* S. *Dependencies:* FP-NAV-5. *Placement:* with MANUALS.
### 3.D DATA
**FP-DATA-1 · Parity ledger (intentional-vs-gap register)** — commit the §2.4 table (extended per category) into ARCHITECTURE.md or a tracked doc, so every asymmetry is either `GENUINE` (guarded — like Suite 87's FO3-exclusion checks) or `GAP` (with a target). *Why:* prevents re-litigating the same asymmetries every audit; makes FO4 authoring scope estimable. *Classification:* Architecture hygiene. *Complexity:* S. *Placement:* v2.8.0 Phase 0.
**FP-DATA-2 · FNV DLC quest lines** — Dead Money / Honest Hearts / Lonesome Road (~30–35 quests, `dlc` tags; schema already supports it). Blocks the v2.9.0 QUEST DATABASE from shipping half-empty. *Classification:* Completion (data). *Complexity:* M (authoring). *Placement:* v2.8.0 data lane, parallel from day one.
**FP-DATA-3 · VENDOR_STOCK dataset** — per-vendor inventories + faction affiliation consumed by TRADE (vendor-specific stock is already on the owner roadmap) and later the faction-consequence engine (vendor lockouts). *Classification:* Completion (data). *Complexity:* M–L (authoring). *Placement:* v2.8.0 data lane.
**FP-DATA-4 · FO3 depth pass** — items/chems/ammo/armor/perks enrichment toward genuine parity (§2.4). Frame it as a **game-identity** unit, not a chores unit: the Capital Wasteland terminal should answer as many queries as the Mojave one. *Classification:* Completion (data). *Complexity:* L (authoring). *Placement:* v2.8.0–2.9.0 data lane, chunked.
**FP-DATA-5 · localStorage → IndexedDB migration** — dual-read shadow, checksum + version, rollback path; behind the FP-SYS-5 accessor so the swap is invisible to features. *Why now:* Terminal Record growth, MANUALS, version history, and FO4's third data set all add weight; 5MB localStorage is the ceiling the program will hit mid-flight if this waits. *Classification:* Architecture. *Complexity:* L (highest-risk infra item — Protocol 8 full pipeline). *Dependencies:* FP-SYS-5. *Placement:* v2.8.0 data-infra phase, before Terminal Record accumulates volume.
**FP-DATA-6 · Save version history** — retained per-save revision ring (extends the rolling-backup pattern from 3 device-wide slots to per-save lineage). *Classification:* Completion. *Complexity:* M. *Dependencies:* FP-DATA-5 (space). *Placement:* v2.8.0 data infra.
**FP-DATA-7 · Data Cartridge manifest** — formalize each game's trio (`db_<g>.js` + `reg_<g>.js` + `GAME_DEFS.<G>`) as a declared cartridge `{id, label, dataVersion, files[]}` surfaced in the MODULE BAY ("CARTRIDGE: MOJAVE — REV 12"). GAME_FILES boot manifest becomes generated-from/checked-against it. *Why:* makes "new game = data" literal and inspectable; gives Distribution Network cartridge-patch payloads an addressing scheme; FO4 becomes "author cartridge 3." *Classification:* Architecture. *Complexity:* M. *Placement:* v2.8.0 Module Bay; proof in v3.0.0.
**FP-DATA-8 · Reserved-column register** — annotate unconsumed DB columns (P-9) with their intended consumer (`Perception/Speed_Factor → S3 encounters`, `ammo subtype modifiers → ENCOUNTER ammo picker`, `Restock_Days → TRADE v2`, `Min_CND → parked condition system`) in the db file headers + ARCHITECTURE.md. Anything with *no* intended consumer gets an explicit PARKED note instead of silent weight. *Classification:* Architecture hygiene. *Complexity:* S. *Placement:* v2.8.0 Phase 0.
### 3.E AI
**FP-AI-1 · Directive decomposition** — see FP-SYS-7 (listed here for category completeness; it is the AI-layer keystone).
**FP-AI-2 · AI-as-OVERSEER design pass (two voices, enforced)** — the SYSTEM voice (cold RobCo) must never be AI-generated; the OVERSEER/GM voice is summoned. Concretely: audit every `appendToChat` source; SYSTEM lines come only from native code; AI errors speak *about* the DIRECTOR link, not *as* the system ("⚠ DIRECTOR LINK RETURNED MALFORMED TELEMETRY" — the old MJ-5 fixes fold in here); directive persona section updated to match. *Classification:* Immersion + Architecture. *Complexity:* M. *Placement:* v2.9.0 (as roadmapped) with the copy-level MJ-5 subset pulled into v2.8.0's diegetic sweep.
**FP-AI-3 · Directive token budget via Terminal Record** — extend the inventory keyword-triage pattern: send event *summaries* (recent record slice) instead of raw `campaign_notes` strings; per-section token accounting once FP-SYS-7 gives sections seams. Full bounded-context/summarization stays with the v3.0.0 Streaming Narrator as planned. *Classification:* Integration. *Complexity:* M. *Dependencies:* FP-SYS-3, FP-SYS-7. *Placement:* v2.9.0.
**FP-AI-4 · `autoImportState` behavioral test (TS-GAP-7)** — the AI→state write path is the single most interconnected function and has zero behavioral coverage; VM-sandbox test with malformed/hostile/partial payloads. *Classification:* Architecture (test). *Complexity:* M. *Placement:* v2.8.0 Phase 0 (as roadmapped).
**FP-AI-5 · Native-input-path audit (pull the protocol's *audit* forward)** — enumerate every AI-writable state field and confirm a native edit path exists; fix the two known violations (affinity FP-FEAT-3; stats adjust — decide native adjust vs RESET-only and document). The *protocol* still lands v2.9.0; the *audit* is cheap and closes authority gaps two versions earlier. *Classification:* Completion. *Complexity:* S. *Placement:* v2.8.0 Phase 0 checklist.
**FP-AI-6 · AI residue features stay flagged garnish** — INTERCEPT augment, radio banter, TRADE/BIO-SCAN banter, SCAN-AREA, OVERSEER hooks, HACK-FAIL taunts: each optional, kill-switched, static-fallback-first (per AI_SLATE/B3 doctrine — reconfirmed, no change). *Placement:* v2.8.0 late / v2.9.0 as respective hosts land.
### 3.F WORLD-SIMULATION
**FP-WS-1 · UPLINK engine on the Ambient Runtime** — U0's world-clock + seeded rolls + **no-durable-write invariant** (gate-guarded) built as *observers of FP-SYS-1's scheduler*, not as `ambient.js`-with-its-own-tick as the older spec drafted. The spec's subsystems (broadcast push, day/night + dusk/dawn, rad-storm weather, radio pull, INTERCEPT) are unchanged; only the substrate moves. *Classification:* New Feature on shared infra. *Complexity:* L overall. *Dependencies:* FP-SYS-1, FP-SYS-2. *Placement:* v2.8.0 UPLINK phase.
**FP-WS-2 · Weather as a PERIPHERAL BUS device** — the "environmental sensor" peripheral reports weather (rad-storm etc.); UPLINK generates it, the bus *frames* it, geiger/CRT/map consume it. *Why:* gives weather a diegetic source and a settings home (sensor board in Module Bay) instead of being free-floating ambience. *Classification:* Integration + Immersion. *Complexity:* S on top of UPLINK U2. *Placement:* with UPLINK.
**FP-WS-3 · INTERCEPT inbox + Signal Scanner command** — static bank core (offline), inbox surface (feeds INTERCEPTS/ in the filesystem), `SCAN` command inside it as designed; unread count feeds app badge (FP-AUTO-4). *Classification:* New Feature (roadmapped). *Complexity:* M. *Dependencies:* UPLINK core. *Placement:* v2.8.0.
**FP-WS-4 · Chained transmissions** — multi-part intercepts/broadcasts over days (state machine per chain, seeded, no-write until player acts). *Placement:* v2.8.0 UPLINK late, as designed.
**FP-WS-5 · Personal-legend news reads the Terminal Record** — the deterministic "your deeds echo as news" templates should consume record events, not re-derive from raw state. *Classification:* Integration. *Dependencies:* FP-SYS-3. *Placement:* v2.8.0 UPLINK consumers.
**FP-WS-6 · Per-location ambience profiles** — zone-type (vault/settlement/wilderness) shifts hum/geiger/UPLINK bias; data lives in registry location `type` (already authored — a P-9 column put to work). *Placement:* v2.8.0 UPLINK consumers.
**FP-WS-7 · Per-location world state (faction control, event flags)** — the one *expansion* in this category; defer until v2.9.0 map exploration proves the need; if built, it rides the map's data layer, not core state. *Classification:* Expansion. *Placement:* v2.9.0, conditional.
### 3.G IMMERSION (identity anchors)
**FP-IMM-1 · Two voices + once-only corporate handshake** — cold-boot pre-war corporate greeting (once per device, meta-store flag, extends the existing first-boot POST gate); voice separation enforced per FP-AI-2. *Complexity:* S. *Placement:* v2.8.0 Hardware Life / identity phase.
**FP-IMM-2 · SHUTDOWN ritual** — `SHUTDOWN` command → FP-SYS-1's SHUTDOWN state → overseer-log flush + CRT collapse-to-dot animation (reduced-motion: instant) → OFF splash. The terminal finally *ends* instead of being abandoned. *Complexity:* S–M. *Dependencies:* FP-SYS-1. *Placement:* v2.8.0 Hardware Life.
**FP-IMM-3 · OPERATOR CLEARANCE** — reframe auth: establish clearance once, persist, never re-prompt; ACCOUNT panel becomes CLEARANCE status (`CLEARANCE: OPERATOR — UPLINK ACTIVE`); folds the old MJ-2/MJ-3 diegetic copy fixes. Mechanics untouched (popup-only, Protocol 30/31). *Complexity:* S–M. *Placement:* v2.8.0 diegetic sweep.
**FP-IMM-4 · HARDWARE SHELL / bezel** — the physical chrome around the screen; home for Module Bay access, hardware-life indicators (condition lamp, cartridge slot), and the per-game shell variants (GT-4 framing becomes *the shell*, not page CSS). Desktop-first where space exists; mobile gets a minimal band. Protocol 10/17 verification heavy. *Classification:* New Feature (presentation). *Complexity:* L. *Dependencies:* design pass; GT-4 folds in. *Placement:* v2.8.0 GAME IDENTITY phase.
**FP-IMM-5 · IMMERSION-LEVEL dial (Full/Balanced/Minimal)** — global dial in the Module Bay that the *Ambient Runtime enforces* (observers declare their tier; the runtime mutes below threshold). Must exist **before** the UPLINK consumers ship so every ambient feature is born dial-aware — cheaper than retrofitting 10 features. *Classification:* New Feature (small) + Architecture. *Complexity:* S–M. *Dependencies:* FP-SYS-1. *Placement:* v2.8.0 Phase 1 (pulled ahead of UPLINK — see J-6).
**FP-IMM-6 · Diegetic naming completion sweep** — `>` prefix uniformity on sub-panels; remaining plain-web labels (VENDOR STOCK → MERCHANT LEDGER-class renames *only where HOUSE_STANDARD comfort is clear*); ARIA stays literal (TN-13). *Complexity:* S–M. *Placement:* v2.8.0 sweep.
**FP-IMM-7 · Attract mode + standby watch as runtime observers** — the focused-idle screensaver (IDLE state) and "STANDBY — MONITORING FREQUENCIES" (STANDBY state) become the showcase consumers of FP-SYS-1's two new states. *Complexity:* M. *Dependencies:* FP-SYS-1. *Placement:* v2.8.0 after runtime.
**FP-IMM-8 · Boot MOTD / session-resume readout** — as specced (I2); reads overseer log + campaign state; extend later to Terminal Record recap line. *Complexity:* S. *Placement:* v2.8.0 after boot decomposition.
**FP-IMM-9 · Emergent CRT condition** — cosmetic wear/warmth classes fed by Hardware Life data; always loses to real hazards; reduced-motion honored. *Complexity:* M. *Placement:* v2.8.0 Hardware Life (visuals may slip to v2.9.0).
**FP-IMM-10 · PLAY-ALONG / QUICK-ENTRY mode** — fast state-entry surface (bulk stat/inventory/quest updates without narrative round-trips) for players using the terminal *beside* a real playthrough. *Classification:* New Feature (roadmapped). *Complexity:* M–L. *Placement:* v2.8.0 late, as designed.
### 3.H PERSISTENCE
**FP-PER-1 · IndexedDB** — see FP-DATA-5 (cross-listed).
**FP-PER-2 · Full backup bundle** — one-file export/import of campaign container + (optionally) device prefs, distinct from per-save export. *Complexity:* M. *Placement:* v2.8.0 data infra.
**FP-PER-3 · Save version history** — see FP-DATA-6.
**FP-PER-4 · Boundary gate guard** — new suite asserting: no campaign-shaped field is written to a bare `robco_*` device key; ambient layer contains no `saveState`/`setItem('robco_v8'…)`/state mutation (the UPLINK no-write invariant, generalized); MetaStore is the only device-key writer. *Classification:* Architecture (test). *Complexity:* S–M. *Dependencies:* FP-SYS-5. *Placement:* v2.8.0 with the accessor.
**FP-PER-5 · Offline cloud queue** — queue a manual push made while offline; retry on connectivity; still never auto-push (Prohibited Patterns honored). *Complexity:* M. *Placement:* v2.8.0 data infra, optional.
### 3.I AUTOMATION
**FP-AUTO-1 · Scheduler consolidation** — see FP-SYS-1 (cross-listed; the automation category's keystone).
**FP-AUTO-2 · Auto-log expansion** — emit (via FP-SYS-2) events for level-ups, collectible acquisitions, crafts, trades, sleeps — today only factions/quests/locations auto-log; the Terminal Record views are only as good as what's recorded. *Complexity:* S–M. *Placement:* v2.8.0 with the event bus.
**FP-AUTO-3 · Session briefing → record-driven; "previously on" recaps** — re-point the boot briefing at Terminal Record; v2.9.0 SESSIONS feature then extends the same reader. *Dependencies:* FP-SYS-3. *Placement:* v2.8.0 re-point; v2.9.0 recaps.
**FP-AUTO-4 · Badge sources unified** — app badge = pending directives (exists) + unread intercepts (new), both through `_updateAppBadge`'s single source per Protocol 22. *Complexity:* S. *Placement:* with INTERCEPT.
**FP-AUTO-5 · New-feature highlight protocol** — post-update, SYSTEM STATUS/changelog flags newly-installed "boards" once (meta-store seen-set). Roadmapped; ride the Distribution Network receipts. *Placement:* v2.8.0 late.
### 3.J GAMEPLAY (v2.9.0 systems — connection-focused notes)
**FP-GP-1 · ENCOUNTER super-button** — merge VATS+THREAT+combat log+LOOT around a shared **combat-context object** (`{target, bestiaryEntry, weapon, distanceClass?}`): THREAT fills it, VATS reads DT from it (kills the manual `#vatsTargetDT` default path, keeps manual override), resolution appends combat-log events to the Terminal Record, LOOT closes the loop. Individual terminals stay independently pressable (additive super-button, per the design state). *Dependencies:* FP-SYS-3 (combat log lane), FP-FEAT-6. *Complexity:* XL. *Placement:* v2.9.0 after Manifest + map.
**FP-GP-2 · MANIFEST & LOADOUT** — as specced (schema untouched, derive-at-render, virtualization); the v2.9.0 tallest pole; crafting stations + aid merge sit on it. *Complexity:* L–XL. *Placement:* v2.9.0 first.
**FP-GP-3 · Geographic SVG map** — generic renderer + per-game world data (cartridge content); consumes locationHistory fog + collectible coords; exploration/travel + encounter rolls (consuming UPLINK U0 seeds) follow. *Complexity:* L. *Placement:* v2.9.0 second.
**FP-GP-4 · BESTIARY BROWSER** — browse surface over BESTIARY.CSV (currently lookup-only); puts `Perception`/`Speed_Factor` (P-9) to work. *Complexity:* M. *Placement:* v2.9.0 with ENCOUNTER.
**FP-GP-5 · Faction consequence engine + preview** — mechanical layer on the event bus + VENDOR_STOCK affiliations; preview = "this action would cross X threshold." *Dependencies:* FP-SYS-2, FP-DATA-3. *Placement:* v2.9.0.
**FP-GP-6 · QUEST DATABASE overhaul** — needs FP-DATA-2 first (or ships half-empty for FNV). *Placement:* v2.9.0.
**FP-GP-7 · Build planner** — budgets/prereqs/shareable codes/perk timeline; reads registry perks + GAME_DEFS skill model; FO4 perk-chart variant lands v3.0.0. *Placement:* v2.9.0.
**FP-GP-8 · Karma/rep timeline** — implemented as a Terminal Record *view* with native cause-logging (events already carry causes) — NOT a new store. *Dependencies:* FP-SYS-3. *Placement:* v2.9.0 (cheap once the record exists).
**FP-GP-9 · Companion management** — affinity/loadout/perk tracking; FP-FEAT-3 gives the native input early. *Placement:* v2.9.0.
**FP-GP-10 · Dialogue/speech-check helper** — consumes FP-FEAT-6's effective skill. *Placement:* v2.9.0.
**FP-GP-11 · Hacking minigame → DEV/DEBUG console** — as designed (staging bypass; debug writes confirm-gated). The debug console should ship with force-fire hooks for every ambient observer (the UPLINK force-fire hook generalized). *Placement:* v2.9.0 late.
**FP-GP-12 · Aid & consumables merge** — folds into Manifest per the rebaseline consolidation. *Placement:* v2.9.0 with GP-2.
### 3.K INTEGRATION (cross-cutting; deduplicated pointers)
The integration category's items are deliberately embedded above where they belong to a host system — the standalone list is: FP-FEAT-4/5/6 (quick-win connectors), FP-SYS-2/3 (the two integration keystones), FP-WS-5 (news←record), FP-AUTO-2/3 (log/briefing), FP-GP-1's combat context, and vendor-faction lockout warnings (with FP-DATA-3). **Rule adopted:** no integration item ships as its own isolated feature; each lands inside the system that hosts it.
### 3.L EXPANSION (v3.0.0 and the N-game seam)
**FP-EXP-1 · FO4 as cartridge proof** — db_fo4/reg_fo4/GAME_DEFS.FO4 + one GAME_FILES line, validated against FP-DATA-7's manifest; target: zero feature-code edits except declared model stretches. *Placement:* v3.0.0.
**FP-EXP-2 · Skill-less model handling** — `getSkillKeys()` consumers must degrade to `[]` (FO4 has no skills); audit is cheap and should run as a **v2.8.0 checklist** so two versions of new features are born compatible, even though FO4 lands in v3.0.0. *Placement:* audit v2.8.0; implementation v3.0.0.
**FP-EXP-3 · FO4 unique systems** — settlements, perk chart, legendaries, power armor, bobbleheads+magazines — each as GAME_DEFS-flagged panels (the tracksLincoln/hasTraits pattern scales). *Placement:* v3.0.0.
**FP-EXP-4 · Parity retrofit to FNV/FO3** — whatever presentation/system upgrades FO4 forces (e.g., perk-chart-style browsing) get retrofitted per the roadmap. *Placement:* v3.0.0.
**FP-EXP-5 · Deferred heavies stay deferred** — Streaming Two-Phase Narrator, Companion Memory, Web Workers, DLC map zones: v3.0.0 placement re-affirmed; no findings argue for moving them up.
**FP-EXP-6 · New-game-readiness audit** — the S2-C10 checklist runs at v2.8.0 close: every feature added in v2.8.0 shows its GAME_DEFS seam. *Placement:* v2.8.0 close-out gate.
### 3.M GAME-IDENTITY
**FP-GI-1 · Per-game framing/shell (GT-4 → HARDWARE SHELL)** — FO3 heavy/riveted, FNV warmer/vegas, FO4 clean — implemented as the bezel's variants (FP-IMM-4), driven by `GAME_DEFS[ctx].theme.framing` (data already shipped in WU-T1). *Placement:* v2.8.0 GAME IDENTITY.
**FP-GI-2 · Game-styled save manager (GT-5)** — visual restyle on the shipped saveLabel hooks. *Placement:* v2.8.0 GAME IDENTITY.
**FP-GI-3 · Per-game radio character** — synth station parameters (motif scale, static color, DJ-greeting text bank) move into `GAME_DEFS[ctx].theme/ambient` — GNR-flavored motifs for FO3, Mojave-flavored for FNV; zero audio files. *Placement:* v2.8.0 GAME IDENTITY.
**FP-GI-4 · Per-game boot POST content** — extend the shipped per-game model/flavor line to a small per-game line bank (degraded/cold variants included). *Complexity:* S. *Placement:* GAME IDENTITY.
**FP-GI-5 · Per-game ambient banks** — `GAME_DEFS[ctx].ambient` (broadcasts/bulletins/encounters/greetings) — the UPLINK data seam; FO4 = author a bank. *Placement:* with UPLINK.
**FP-GI-6 · Terminology preset layer** — one `term(key)` lookup for per-game strings (COURIER vs LONE WANDERER, MOJAVE vs CAPITAL WASTELAND) consumed by panels/AI directive/UPLINK templates; the "one presentation-preset layer" from the design state. *Complexity:* M. *Placement:* GAME IDENTITY phase, before UPLINK banks multiply strings.
**FP-GI-7 · Per-game CRT character** — scanline weight/flicker rate/hum frequency as theme data (reduced-motion honored). *Complexity:* S–M. *Placement:* GAME IDENTITY.
**FP-GI-8 · Signature-panel emphasis** — per-game default panel prominence (FNV: FACTION STANDING up top; FO3: KARMA CENTER) via a GAME_DEFS-ordered panel priority, respecting the user's saved panel state (Protocol 25). *Complexity:* S–M. *Placement:* GAME IDENTITY.
**FP-GI-9 · FO3 data depth = identity** — FP-DATA-4 cross-listed here deliberately: the single biggest "FO3 feels like a skin, not a terminal" factor is data thinness, not theming.
**FP-GI-10 · Per-game empty states/copy** — empty-state and status strings pull from the terminology layer where game-flavored ("NO ENTRIES IN MOJAVE ARCHIVE"). *Complexity:* S. *Placement:* GAME IDENTITY sweep.
**FP-GI-11 · Hide inapplicable UI per game** — add `GAME_DEFS.hasWeaponMods`; hide the inventory MODS filter + mod-type affordances for FO3 (which has no weapon mods — currently a two-game UI leak in reverse: FNV features shown to FO3). Same pattern check for any future flag. *Classification:* Completion + Game-Identity. *Complexity:* S. *Placement:* v2.8.0 sweep.
---
## 4. VALIDATION PASSES (each run against the backlog above; revisions applied in place)
**Pass 1 — Completeness.** Swept the owner design state line-by-line: every named element now has a home (launcher/command language → NAV-1/2/3; filesystem → NAV-4; Module Bay + cartridges → SYS-9/DATA-7 + §5 Module Bay unit; Peripheral Bus → §5 unit + WS-2; Distribution Network → SYS-9; Terminal Record → SYS-3; System Status → SYS-4; clearance/shell/voices/handshake/shutdown → IMM-1..4; dial → IMM-5; play-along → IMM-10; manuals/vendor stock/FNV DLC/settings/onboarding/a11y/roadmap-panel → NAV-5/DATA-3/DATA-2/Module Bay/NAV-5+IMM/standing/SYS-9 payload). **Found missing and added:** FP-GI-11 (MODS filter leak), FP-FEAT-2 (session duration), FP-EXP-2's early audit, roadmap panel explicitly as a Distribution payload. Onboarding's "skippable-persistent" requirement is satisfied by MANUALS persistence (NAV-5) — noted.
**Pass 2 — Connectivity.** Re-checked every §2.5 missing link against the backlog: all 12 are owned (1→FEAT-4, 2→GP-1, 3→FEAT-6, 4→FEAT-5, 5→SYS-2, 6→SYS-3, 7→DATA-3+GP-5, 8→GP-3, 9→FEAT-5, 10→AUTO-3, 11→SYS-4, 12→WS-1). **Revision:** promoted FEAT-4/5 and AUTO-2 into a named early "connection sweep" in the revised roadmap so cheap connectors don't queue behind big phases. Also added the explicit rule in §3.K that integration items ship inside host systems.
**Pass 3 — Architecture.** Stress-tested the foundation order. **Finding:** the owner roadmap builds the organizing layer *first* and decomposes the monoliths *second* — but the launcher, Module Bay, state machine, and MOTD all physically land inside `window.onload` and `getSystemDirective`. Building on the monoliths then decomposing = touching everything twice. **Revision applied:** §5 swaps Phase order (foundations → organizing layer). Second finding: the UPLINK spec's `ambient.js`-owns-its-own-tick design predates the Ambient Runtime concept; WS-1 now explicitly subordinates UPLINK to the runtime's scheduler. Third: added FP-PER-4 (boundary suite) because three new writers (Hardware Life, record, dial) touch the meta-store this version.
**Pass 4 — Game Identity.** Asked "after v2.8.0, does FO3 feel like a different machine?" With theming/framing/radio/boot/terminology: presentation yes. **Finding:** data depth (§2.4) undermines it — CONSULT/DATABANK/TRADE/THREAT answer visibly less on FO3; and one reverse-leak exists (MODS filter). **Revisions:** FP-DATA-4 reframed as identity work (FP-GI-9); FP-GI-11 added; parity ledger (DATA-1) made a Phase-0 item so identity gaps are tracked, not vibes.
**Pass 5 — UX.** Walked the four personas (new player, returning player, play-along player, FO3 player). New player: onboarding + MANUALS + command autocomplete cover the entry cliff. Returning: MOTD + briefing + recaps. Play-along: IMM-10 is their whole experience — **revision:** noted quick-entry must be reachable in ≤1 action from boot (launcher pin). Settings-seeker: today 4 homes (D-1) → Module Bay must be *the* answer; **revision:** §5 explicitly merges "unified settings" INTO the Module Bay unit (they were separate roadmap lines — doing settings twice would be waste). Modal inconsistency (D-2) handled by SYS-8 before MANUALS ships documents in modals.
**Pass 6 — Scalability.** Simulated "add FO4" against the post-v2.8.0 architecture: cartridge manifest (DATA-7) + terminology layer (GI-6) + ambient banks (GI-5) + skill-less audit (EXP-2) + GAME_DEFS flags mean FO4 = data + declared stretches. Simulated "add a 4th game" (FO1/2-class, no VATS regions?): GAME_DEFS coefficient blocks are per-game already; flags cover absence. Simulated "add a new tracker type": `_renderReadTracker` + registry + Protocol 4 checklist — fine. **Finding:** panel *layout* is the least scalable surface (index.html static panels per feature); the signature-panel priority (GI-8) partially addresses; full dynamic panel registry judged NOT worth it now (rewrite risk > benefit) — recorded as a parked observation, not a recommendation.
**Pass 7 — Roadmap structure.** Re-derived the dependency graph from scratch (see §5 justifications). Confirmed: data lane must start day one (longest lead time, zero conflicts); IndexedDB before record volume; dial before UPLINK consumers; runtime before attract/standby/shutdown; event bus before record; record before news/recaps/incident; MANUALS before filesystem; Module Bay before filesystem; SYS-8 before MANUALS. The owner's phase *contents* survive almost intact — the surgery is ordering and three merges (settings↔Module Bay, GT-4↔shell, Remote-Transmissions↔Distribution-Network).
**Pass 8 — Future maintenance.** Every structural rec was checked for "does this reduce future diffs?": state machine (−8 timer wirings), event bus (−N crossing re-implementations), record (−5 future stores), modal driver (−2 focus traps), MetaStore (−24 raw key sites), terminology layer (−string sprawl before UPLINK multiplies it), cartridge manifest (−FO4 integration risk), parity ledger + reserved-column register (−re-audit cost). **Finding:** the program adds several new suites (boundary, no-write, dial-compliance, record-schema) — test-authoring cost is real given dual runners; recommend the long-standing runner-parity efficiency item (demote PS1 to thin parity checker) be *decided* before v2.8.0's test volume lands; flagged as an owner decision, not assumed.
---
## 5. ROADMAP OPTIMIZATION — Proposed Revised Roadmap
**The vision is unchanged.** Same three steps, same themes, same endpoints. Changes are ordering, three merges, and two early pulls — each justified (J-#).
### v2.8.0 — THE TERMINAL OS & LIVING MACHINE (revised internal order)
**Phase 0 · FOUNDATIONS (moved to front — J-1)**
1. Boot decomposition (FP-SYS-6) → named seams.
2. Directive decomposition + GA-5 retirement (FP-SYS-7) + Protocol 14 test.
3. `autoImportState` behavioral test (FP-AI-4); gate/per-suite-parity tightening.
4. MetaStore accessor (FP-SYS-5) + boundary suite (FP-PER-4).
5. OS Event Bus (FP-SYS-2) + auto-log expansion (FP-AUTO-2).
6. Cheap **connection sweep** (J-5): FEAT-1 (retire timeline stub), FEAT-2 (session duration), FEAT-3 (affinity input), FEAT-4 (THREAT ammo check), FEAT-5 (CONSULT trackers + reserved columns), GI-11 (MODS filter), AI-5 (native-input audit).
7. Hygiene ledgers: parity ledger (DATA-1), reserved-column register (DATA-8), EXP-2 skill-less audit checklist.
**Data lane (parallel from day one — J-4):** FNV DLC quests (DATA-2) → VENDOR_STOCK (DATA-3) → FO3 depth pass chunks (DATA-4).
**Phase 1 · ORGANIZING LAYER (was first; now on decomposed ground)**
8. Ambient Runtime state machine + scheduler (FP-SYS-1), absorbing existing timers.
9. IMMERSION dial (FP-IMM-5) — before any new ambient consumer exists (J-6).
10. Terminal Record schema + `[T#]` migration + Crossroads re-point + Incident view (FP-SYS-3).
11. Command Language v1 + chat autocomplete (NAV-1/2); TERMLINK becomes the launcher.
12. Modal driver (SYS-8) → alert/confirm purge begins (SYS-10, batched).
13. **MODULE BAY = unified settings** (merged unit — J-3): all device prefs as installed boards; cartridge manifest (DATA-7) surfaces here; campaign config stays in CAMPG (boundary preserved).
14. PERIPHERAL BUS framing over WU-F devices + share-target manifest slot + Pip-Boy sync framing (presentation layer; Pip-Boy is the diegetic *source* of campaign data).
**Phase 2 · DATA INFRASTRUCTURE**
15. IndexedDB migration behind MetaStore (DATA-5) — before record volume (J-7).
16. Backup bundle (PER-2), save version history (DATA-6), offline cloud queue (PER-5, optional).
**Phase 3 · WASTELAND UPLINK (as designed, on the runtime)**
17. U0 seeds/clock as runtime observers + no-write guard (WS-1).
18. Broadcasts; day/night + dusk/dawn; rad-storm weather via Peripheral-Bus sensor framing (WS-2).
19. Radio pull; per-game ambient banks (GI-5) via terminology layer (GI-6 lands just before — J-8).
20. INTERCEPT inbox + Signal Scanner + badge (WS-3, AUTO-4); chained transmissions (WS-4); personal-legend news from the record (WS-5); location ambience (WS-6).
21. **DISTRIBUTION NETWORK** (SYS-9): payload abstraction; firmware receipts to SYSTEM STATUS; roadmap panel as payload; Remote Transmissions live channel (kill-switched) — closes OPEN Q3 (J-9).
**Phase 4 · HARDWARE LIFE**
22. SYSTEM STATUS consolidation (SYS-4): telemetry + diagnostics + maintenance receipts.
23. Boot codes / per-game POST bank (GI-4); corporate handshake (IMM-1); quirks/condition data + emergent CRT (IMM-9); sound layer polish.
24. SHUTDOWN ritual (IMM-2). Hardware events → record's hardware view (meta-store lane, never merged with campaign).
**Phase 5 · GAME IDENTITY**
25. Terminology preset layer if not landed at 19 (GI-6); HARDWARE SHELL + per-game framing (IMM-4/GI-1); game-styled saves (GI-2); per-game radio character (GI-3); CRT character (GI-7); signature-panel emphasis (GI-8); per-game empty states (GI-10). FO3 depth (GI-9/DATA-4) continues in the data lane.
**Phase 6 · EXPERIENCE & CLOSE-OUT**
26. MANUALS (NAV-5) + "?" rollout (FEAT-8) → then FILESYSTEM skin (NAV-4) + MACROS (NAV-3) (J-2).
27. PLAY-ALONG/QUICK-ENTRY (IMM-10) with launcher pin; onboarding (diegetic registration, skippable-persistent via MANUALS); OPERATOR CLEARANCE reframe (IMM-3); new-feature highlights (AUTO-5); a11y deep pass; diegetic naming sweep (IMM-6); effective-skill resolver (FEAT-6) as the v2.9.0 bridge.
28. New-game-readiness audit (EXP-6) as the version's exit gate.
### v2.9.0 — GAMEPLAY SYSTEMS (order refined, contents unchanged)
1. "Native input path required" protocol formalized (audit already done in 2.8).
2. MANIFEST & LOADOUT (GP-2) + aid merge (GP-12) → crafting stations on top.
3. Geographic SVG map (GP-3) → exploration/travel + encounter rolls (UPLINK U0 consumers).
4. BESTIARY BROWSER (GP-4) → ENCOUNTER super-button (GP-1) with shared combat context; combat log = record lane.
5. QUEST DATABASE (GP-6 — FNV DLC data already landed in 2.8), faction consequence engine + preview (GP-5, on event bus + VENDOR_STOCK).
6. Build planner (GP-7), companion management (GP-9), dialogue helper (GP-10, on effective-skill), karma/rep timeline (GP-8, as a record view), SESSIONS/recaps (AUTO-3 extension).
7. AI-as-OVERSEER design pass (AI-2) + directive token budget (AI-3); AI garnish features as hosts allow (AI-6).
8. Hacking minigame → DEV/DEBUG console with universal force-fire hooks (GP-11).
### v3.0.0 — FALLOUT 4 (unchanged, with the proof framing)
FO4 cartridge (EXP-1) validating DATA-7's manifest; skill-less model (EXP-2); FO4 systems (EXP-3); parity retrofit (EXP-4); Streaming Two-Phase Narrator, Companion Memory, Web Workers, DLC map zones (EXP-5).
### Justifications for every structural change
- **J-1 (Foundations before organizing layer — reorder):** launcher/Module Bay/state-machine/MOTD all wire into `window.onload` and the directive. Building them on monoliths then decomposing means re-touching every new feature. Decompose-first is strictly less work and lower regression risk (Protocol 27 spirit: confirm the ground before building).
- **J-2 (Filesystem moved late within v2.8.0 — reorder):** the filesystem is a *view over targets* (MANUALS, INTERCEPTS inbox, Module Bay, record views). Built first it would be a skin over empty directories; built last it snaps onto real content with zero rework.
- **J-3 (Unified settings MERGED into Module Bay — merge):** they are the same deliverable at different diegesis levels. Two units = the settings get rebuilt twice. One unit, one migration of D-1's four homes.
- **J-4 (Data lane starts day one — parallelize):** DATA-2/3/4 are pure-data, no code conflicts (proven parallel lane in the old plan), and have the longest authoring lead time; v2.9.0's QUEST DATABASE and faction engine hard-depend on them. Starting them at Phase 3 would make data the v2.9.0 critical path.
- **J-5 (Connection sweep added to Phase 0 — new prerequisite step):** seven S-complexity connectors (FEAT-1..5, GI-11, AI-5) close real completeness gaps for days of work total; queuing them behind L-sized phases buys nothing and leaves authority/isolation violations live for months.
- **J-6 (Immersion dial pulled ahead of UPLINK — reorder/promote):** ~10 ambient consumers ship in Phases 3–4. If the dial exists first (enforced by the runtime), each is born compliant; retrofitting a dial across 10 shipped features is the expensive alternative. Same logic the old plan applied to the U0 no-write guard.
- **J-7 (IndexedDB before Terminal Record accumulates — reorder):** the record, manuals, version history, and a third game's data all add storage weight; migrating storage engines *under* a growing event log is the riskiest possible timing. Migrate while the record is young.
- **J-8 (Terminology layer before ambient banks — insert):** UPLINK banks and per-game copy multiply strings; if `term(key)` exists first, banks are born per-game (Protocol 38); after, it's a sweep.
- **J-9 (Remote Transmissions folded into Distribution Network — merge):** the old OPEN Q3 ("no data model") dissolves when a transmission is just a payload type; one channel abstraction serves firmware/cartridge/broadcast/roadmap/intercepts, so the live channel inherits schema, kill-switch, and viewer instead of needing bespoke design.
- **J-10 (Terminal Record promoted into Phase 1 — promote):** six later features are views over it (Crossroads today; incident, news, recaps, karma timeline, combat log). Every phase that ships *before* the record writes strings that need migrating; every phase after writes structured events for free. Earliest-possible placement minimizes total migration surface.
- **J-11 (Event bus added as shared infra — new prerequisite):** three inline crossing-detectors exist today (D-4) and at least four new consumers arrive in 2.8/2.9. One emitter now = each consumer is a subscription, not a re-implementation.
- **J-12 (UPLINK subordinated to the Ambient Runtime — architecture refinement):** the older spec's self-ticking `ambient.js` predates the runtime concept; two heartbeats (runtime + UPLINK) would recreate the timer sprawl the runtime exists to kill. Spec contents unchanged; substrate swapped.
- **J-13 (v2.9.0 internal order):** Manifest first (tallest pole, most dependents), map second (exploration + encounters depend), ENCOUNTER after both (loot→inventory, encounters→map), heavy AI/design passes after the systems they describe exist, debug console last (it force-fires everything, so everything must exist).
---
## 6. Additional Observations
1. **The test gate is the project's superpower and its tax.** 130 suites guard everything above — and every recommendation here costs dual-runner test authoring. The runner-parity efficiency decision (thin PS1 parity-wrapper vs full duplication) should be made *before* v2.8.0's volume, not during. (Owner decision; both options preserve Protocol 15's intent.)
2. **The two-store boundary is the best-kept architectural decision in the app** — Hardware Life and the Terminal Record both *want* to blur it (hardware events feel like history). Hold the line: hardware history stays meta-store; the record's Hardware *view* reads it read-only; the suites (FP-PER-4) make it structural.
3. **`campaign_notes` cap behavior deserves a decision** — today the 200-cap silently drops the oldest entries, including decision-grade auto-logs. The record migration (SYS-3) is the moment to decide retention policy per event class.
4. **Panel HTML is the least scalable surface** (static per-feature `<details>` in index.html). Judged not worth a dynamic panel registry now; revisit only if FO4's unique panels (settlements, perk chart) make the pattern painful. Recorded as parked, with the trigger condition.
5. **The Pip-Boy framing is free identity.** Nothing technical changes if the campaign store is *narrated* as "synced from your Pip-Boy" — one MANUALS page, boot MOTD phrasing, and the Peripheral Bus listing the Pip-Boy as the marquee device deliver the anchor at copy-cost.
6. **Suite-list mega-paragraph in CLAUDE.md/RULES.md** keeps growing per suite (~10K tokens duplicated ×2 files); consider a generated appendix before v2.8.0 adds ~15 suites.
7. **Old planning docs should be re-baselined once** after this doc is accepted: MASTER_PLAN's pending list is stale (items marked pending have shipped — B5/B9/B10/C13/E2/E3/D4/D5 all show landed suites), and WASTELAND_UPLINK_SPEC/PLANNED_FEATURES_DETAILED predate the runtime/record/distribution concepts. One consolidation pass prevents future sessions from planning against superseded specs.
---
*END OF AUDIT — analysis only; no source files, docs, or tests were modified; nothing was committed or pushed.*
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).