RELEASE
planning/2.8.0/plans/ROADMAP_REBASELINE.md
sha256 96fb6ab3cf3ffa76 · 40125 bytes ·
original held in the private archive
# ROADMAP_REBASELINE.md — Perfect-Order Backlogs for Steps 2 / 3 / 4
> **ANALYSIS ONLY. Nothing implemented, committed, or pushed. No served code written. No parked plan modified.**
> Started clean from `origin/dev` (`git fetch && git checkout dev && git reset --hard origin/dev`).
> Grounded on `dev` @ `027be1b` (v2.7.0, cache `robco-terminal-v2.7.0-r5`, 1557 tests / 130 suites).
> `planning/` is gitignored — this file is untracked.
>
> **Purpose.** Re-validate the parked Steps 2/3/4 (written against v2.6.0) against the SHIPPED v2.7.0, strip what
> already shipped, and produce a clean **dependency-ordered backlog per step** — ready to feed a synthesis →
> parallelization pass where each step becomes ONE coordinated MASTER_PLAN.
>
> **Inputs re-read this pass:** `ROADMAP_AUDIT.md` (the prior re-baseline + 15 enhancements), `WASTELAND_UPLINK_SPEC.md`
> (the unified ambient engine, U0–U5), `FEATURE_REMAKES.md` (4 screen rebuilds), `IMMERSION_AUDIT.md` (15 immersion
> enhancements), and `MASTER_PLAN.md` (the shipped v2.7.0 phase tracker). Load-bearing claims were **spot-verified
> against live code** (see §0.2).
---
## 0. Re-baseline preamble
### 0.1 Naming reconciliation (Steps ↔ Rounds ↔ versions)
`MASTER_PLAN.md` never says "Step 2/3/4" or "v2.8.0/2.9.0/3.0.0" — it uses **Phases** (A–H, N, T, R, G) for the shipped
2.7.0 program and **"Round 2 / Round 3"** for the forward buckets. The parked-plan docs and the owner brief use
**Steps**. They map cleanly:
| Owner "Step" | Version | MASTER_PLAN bucket | Theme |
|---|---|---|---|
| **Step 2** | v2.8.0 | Round 2 (Phase G residue + B1 SPEC-FIRST caps + infra) | AI-residue + ambient living-world + client infra |
| **Step 3** | v2.9.0 | Round 3 | Gameplay-system overhauls + hacking/debug console |
| **Step 4** | v3.0.0 | Round 4 (FO4-as-data) | Fallout 4 as 3rd game + moved-in heavies |
### 0.2 Load-bearing facts verified against live code (`dev` @ 027be1b)
| Claim | Verdict | Evidence |
|---|---|---|
| **App Check is DISABLED (placeholder key)** | **FALSE — it initializes.** The gap is console + rules, NOT code. | `cloud.js:36` holds a real reCAPTCHA-v3-format key (`6LdEhzct…`); the guard `cloud.js:125` is `KEY !== 'REPLACE_WITH_RECAPTCHA_SITE_KEY'` → **true** → `initializeAppCheck` runs. The comment at :31–35 ("replace placeholder / init skipped") is **stale/misleading.** |
| **`getSystemDirective()` is a ~190-line monolith with GA-5 two-game ternaries** | **TRUE** | Spans `api.js:23–218` (~195 lines); `ctx === 'FO3' ?` tracker-directive ternaries live at `api.js:179` (+ FNV at 187/195). This is the last Protocol-38 residual. |
| **`window.onload` boot block is a ~540-line monolith** | **TRUE (~568 lines)** | `ui-core.js:330–898`. |
| **Per-vendor `VENDOR_STOCK` does not exist** | **TRUE** | Only `getTradeCatalog()` (full-DB stock) exists (`db_nv.js:998`, `db_fo3.js:652`); per-vendor stock explicitly deferred "WU-D4d". |
| **FNV DLC quest lines are absent** | **MOSTLY TRUE** | The `dlc` schema is applied to all 154 FNV quests, but only **5 real DLC quests exist (all Old World Blues)**. Dead Money / Honest Hearts / Lonesome Road quest lines are **absent** (their weapons/items exist). ~30–35 quests missing. |
| **`autoImportState` has no behavioral test** | **PARTLY TRUE** | `tests/test.html` exercises it **in-browser** at runtime; there is **no Node VM-sandbox behavioral test** (TS-GAP-7). The AI→state write path has no headless behavioral guard. |
| **Step-3 systems already exist as stubs (extend, not greenfield)** | **TRUE** | Present: `renderSquad`, `renderQuests`, `renderCraft`/`doCraft`, `renderFactionRep` (2D matrix), `renderInventory`, `recomputeVATS`, `renderThreat`, `renderLoot`, `state.karma`, `state.squad`. Absent (greenfield): build planner, perk planner, loadout manager, dialogue helper, combat log, karma timeline. |
### 0.3 The single most important framing
**Every parked "BUILD-NOW" item that shipped in the 2.7.0 program is now DONE and Suite-guarded.** The genuine
remainder is the UN-BUILT residue only. Each step below opens with a **DONE-ALREADY / STRIP** list, then the
re-validated **PERFECT-ORDER backlog**.
### 0.4 Owner decisions applied throughout (all 2026-06-30)
1. **WASTELAND UPLINK = ONE engine.** Radio (S3-1) + map-encounters (S3-4) + INTERCEPT (S2) + Remote Transmissions
(S2) all merge into it. **DAY/NIGHT cycle REMOVED** (can't track in-game time). Hard invariant: writes nothing
durable, never mutates `state`/`state.rads`, disjoint `ambient-*` classes, no-persist render path; a gate guard
fails if it ever gains a persistence/stat call.
2. **IN-GAME vs IN-TERMINAL clarity.** Every ambient/broadcast feature must read as **terminal-side**, never confuse
the player about game events. **Dev/staging must be able to force-fire every time/probability-gated ambient feature.**
3. **ONE map** — the geographic per-game SVG map (S3-9) using the **Phosphor Cartography** inline-SVG approach as its
low-risk first iteration; **DROP "Recon Grid."** S3-4 exploration = the data/journal layer on top.
4. **Move to Step 4:** Streaming Two-Phase Narrator, COMPANION MEMORY, Web Workers, DLC map zones (+ FO4 itself).
5. **Step-2 foundations first:** decompose `getSystemDirective()` + `window.onload` BEFORE piling features on them;
ship the `autoImportState` VM behavioral test BEFORE any AI-residue; run the DATA LANE (VENDOR_STOCK, DLC quests)
early (only parallelizable work); App Check first (precondition — **verified client-side; gap is console
registration, not code**).
6. **Approved enhancements** folded into the ordered backlogs (see each step).
7. **Hacking minigame (Step 3)** unlocks a **DEV/DEBUG PANEL that MUST BE BUILT** — a comprehensive in-terminal
debug/test console (force-fire every ambient/UPLINK feature = the dev-testability affordance from #2; inspect+edit
state; dump save/version/checksum; toggle every optic/audio/effect; simulate rad/faction/karma thresholds + CRT
condition; force boot variants; view telemetry/Overseer log). Additive/confirm-gated writes only — can't corrupt
saves.
---
# STEP 2 — v2.8.0
## S2.A — DONE-ALREADY (strip from Step 2)
These shipped in the 2.7.0 program; the parked plan's "BUILD-NOW" for them is closed.
| Shipped | Evidence | Consequence for Step 2 |
|---|---|---|
| All 6 native calculators (VATS/TRADE/THREAT/CONSULT/BIO-SCAN/LOOT) | Suites 105–110 | The 3 AI cores B3 pulled to native are DONE; only the **AI-augment garnish** on top (INTERCEPT, trade/bio banter) remains. |
| All 9 device capabilities pulled into 2.7.0 (Wake Lock, Haptic, Web Share, Badge, Radio synth bed, Cold-Start/Degraded boot, Overseer Log, High-Lumen, TERMLINK) + F10 session-stats merge + F11 mark-visited | Suites 115–126 | Step-2 device cluster shrinks to the **5 SPEC-FIRST caps NOT pulled in** (§S2.B tier V). |
| Per-game theming GT-1/GT-2/GT-3 (`THEMES` table + `GAME_DEFS[ctx].theme` + per-game default optics + identity strings) | Suites 124/127/130 | Theming remainder = **GT-4 + GT-5 only** (folded into per-game EXPERIENCE, §S2.B tier E). |
| App Check **client wiring** (initializes with a real reCAPTCHA key) | `cloud.js:125–127` | The precondition is ~90% done in code. Remaining = **console registration + `firestore.rules` enforcement + stale-comment cleanup** (§S2.B F1). |
| `loadUI` dirty-diff perf; a11y baseline (`:focus-visible`, reduced-motion, aria-live, sysModal focus-trap) | Suites 60/91/92/94 | PERFORMANCE_AUDIT headline + a11y baseline resolved; the **a11y DEEP pass (R2-e)** is the only a11y residue. |
| WU-B5 cloud-pull round-trip VM test | Suite 46/101 | This is the **cloud-pull** VM test; the **`autoImportState` (AI-path) VM test (TS-GAP-7) is still missing** (§S2.B F4). |
**Also removed from Step 2 by owner decision #4** (moved to Step 4): Streaming Two-Phase Narrator, COMPANION MEMORY,
Web Workers, DLC map zones. **Moved to Step 3** (owner brief): the RobCo hacking minigame (now the debug-panel unlock).
**Dropped** (ROADMAP_AUDIT Obj 10): SW background-sync (no workload) — re-evaluate only if a workload appears.
## S2.B — Perfect-order backlog (v2.8.0)
Ordered into tiers; within a tier, items marked **∥** can run in parallel (they touch disjoint files). Later tiers
depend on earlier ones.
### TIER 0 — Preconditions & foundations (MUST come first — unblock everything else)
| ID | Unit | Why first / depends on | File(s) | Risk |
|---|---|---|---|---|
| **S2-F1 ∥** | **App Check verification unit.** Confirm console registration + enforce `firestore.rules` App-Check + replace the stale placeholder comment; register a `remoteTransmissions`/`aiIntercept`-adjacent posture note. (ROADMAP #3) | Gates ALL AI-residue + Remote Transmissions. **Verified: code already initializes** — this is verification + rules + comment, not new wiring. | `cloud.js`, `firestore.rules` | Low |
| **S2-F2 ∥** | **Decompose `getSystemDirective()`** into per-section / per-game builders + **retire the GA-5 `ctx==='FO3'?` ternaries** (`api.js:179`) → `GAME_DEFS[ctx].ai`. (ROADMAP #4) | Blocks every new AI directive (INTERCEPT/OVERSEER/SCAN inject here) **and FO4**. Closes the last Protocol-38 residual. Protocol 14 AI-contract test in the SAME commit. | `api.js`, `state.js` | Medium |
| **S2-F3 ∥** | **Decompose the `~568-line window.onload`** (`ui-core.js:330–898`) into named boot seams (`_hydrateStateFromStorage` / `_restoreMuteToggles` / `_wirePanelPersistence` / `_wireKeyboardShortcuts` / `_startSessionTimers`). (ROADMAP #11) | Step 2 piles Boot-MOTD, ambient-init, attract, standby-extension, wake/radio restore directly onto this block. Decompose BEFORE. Protocol 8 plan-audit (every boot path) + Suite 56 load-order. | `ui-core.js` | Medium |
| **S2-F4 ∥** | **`autoImportState` VM-sandbox behavioral test (TS-GAP-7)** + decide numeric clamping (TS-COV-1). (ROADMAP #5) | The AI→state write path every AI-residue feature depends on has **no headless behavioral guard**. Establishes the behavioral-test tier. Before ANY AI-residue. | `tests/*` (both runners at parity) | Medium |
| **S2-F5 ∥** | **Per-suite parity check + merge-time full-gate discipline.** (ROADMAP #15) | The gate compares only TOTAL counts across runners (H1-7b) — they can drift per-suite. Step 2/3 add hundreds of tests. Tighten before the volume lands. | `scripts/gate.js` | Low–Med |
*All five are mutually parallel (disjoint files). F2 + F3 are hard prerequisites for the feature tiers; F1/F4/F5 are
gating infra. Land Tier 0 as a single coordinated foundation wave.*
### TIER 1 — DATA LANE (fully parallel, data-only, no `APP_VERSION`/UI collision — start immediately, runs the whole window)
| ID | Unit | Unblocks | File(s) |
|---|---|---|---|
| **S2-D1 ∥** | **Per-vendor `VENDOR_STOCK` dataset (WU-D4d).** fallout.wiki-sourced per Protocol 3. | Step-3 TRADE realism + Faction vendor lock/unlock (S3 #5) + Build-Planner economy. | `db_nv.js`/`db_fo3.js` + `VENDORS.CSV`, Suite 78 sync |
| **S2-D2 ∥** | **FNV DLC quest lines** — Dead Money / Honest Hearts / Lonesome Road (OWB's 5 already exist). ~30–35 quests, `dlc` schema already present. | Step-3 Quest Tracker overhaul (S3 #6) — otherwise ships half-empty. | `reg_nv.js`, Suite 82 sync |
*(ROADMAP #14. This is the **only genuinely parallelizable lane** — zero collision with UI/api/cloud. Formally a
v2.9.0 content dependency, but START it in the v2.8.0 window so Step 3 isn't blocked. No `APP_VERSION` bump.)*
### TIER 2 — The WASTELAND UPLINK substrate (owner decision #1 — the ONE engine)
Build **substrate-up** per WASTELAND_UPLINK_SPEC §11, **revised for owner decision #1 (day/night REMOVED)**.
| ID | Unit | Revision vs spec | Depends on |
|---|---|---|---|
| **S2-U0** | **Seeded-roll engine + no-write gate guard.** `js/ambient.js` skeleton: mulberry32 PRNG + `rollTable(seed,table)`, zero side-effects. Establish the **permanent static "writes-nothing-durable" Suite** NOW so every later phase inherits it. | The spec's "world-clock (ticks→hour→phase)" is **dropped** — owner removed in-game day/night. U0 is now a pure terminal-side scheduler + PRNG. | F2/F3/F4 |
| **S2-U1** | **UPLINK push channel + static broadcast bank** (`GAME_DEFS[ctx].ambient.broadcasts`) via `appendToChat(…,'sys',true)` (no-persist); focused-only 45 s tick; master toggle + intensity device prefs; **+ the dev/staging force-fire hook (owner decision #2).** | Broadcasts template on **place + deeds + terminal-side facts**, not in-game time-of-day. | U0 |
| **S2-U2** | **Rad-storm / interference weather** (cosmetic `ambient-radstorm` + transient geiger blip + real-hazard suppression at `rads ≥ 200`). | Day/night tint substrate **removed** (owner #1). Weather stays as a **terminal-side random ambient event** (no time-of-day weighting). ⚠ **OPEN Q1** — does weather survive without day/night? | U1 |
| **S2-U3** | **Radio tuner (PULL)** — extend the shipped `startRadio()` synth bed (WU-F5, Protocol 22) with the shared `bulletins` bank. One radio, two directions (push/pull). | DJ **day/night greetings removed**; greeting becomes terminal-side (uptime / "operator returned"). | U1 bank |
| **S2-U5** | **INTERCEPT AI-augment (optional, flagged).** `enrichSignal()` seam + `aiIntercept` kill-switch + fail-safe fallback to the static bank. Injection-hardened, Tri-Node contract, pull-only. | Unchanged. | F1 (App Check), F2 (directive), F4 (test), U1 |
*U4 (map-encounter rolls) is **deferred to Step 3** — the roll engine ships here (U0); the map **consumes** it in
S3-M2. This is consolidation **C1** (one seeded-roll engine, many consumers).*
### TIER 3 — Immersion consumers of UPLINK (owner decision #6 immersion list — all ride the substrate)
| ID | Unit (IMMERSION #) | Terminal-side compliance (owner #2) | Depends on |
|---|---|---|---|
| **S2-I1** | **Session-Resume Continuity Readout** (#2) — boot MOTD block: time-since-last-uplink + boot count + active directives + location + rad buffer. | ✅ Real elapsed + terminal telemetry. (Days-in-wasteland line → gated on OPEN Q2.) | F3 (boot seams) |
| **S2-I2** | **Location-Aware Ambience** (#3) — zone-type → ambience profile (vault drone / settlement chatter / wilderness wind), reads `state.loc`. | ✅ Place-based, not clock-based. | U1/U2 |
| **S2-I3** | **Personal-Legend News Callbacks** (#4) — deterministic milestone → templated bulletin (quests/factions/kills). | ✅ Deed-based. | U1/U3 bank + seeded-roll |
| **S2-I4** | **INTERCEPT Inbox** (#10) — `[INTERCEPT]` native command + static distress/numbers bank + occasional ambient intercepts. | ✅ Static core offline; AI-augment = U5. | U1; AI layer = U5 |
| **S2-I5** | **Focused-Idle Attract Mode w/ telemetry** (#6) — focused-idle timer + drifting `#attractLayer` of live telemetry (burn-in guard). | ✅ Terminal-side. | F3, standby subsystem |
| **S2-I6** | **Standby "Powered-Down Watch"** (#15) — extend `enterStandby`/`exitStandby`; on return report real elapsed + optional intercept. | ✅ Real wall-time. | standby subsystem |
| **S2-I7** | **Chassis Feedback Choreography** (#14) — signature table over shipped haptic (WU-F2) + synth SFX for world-crossings. | ✅ Transient; opt-in toggles. | WU-F2 (shipped) + UPLINK events |
| **S2-I8** | **Diegetic Cold-Boot Onboarding** (#11) + **Playthrough/RNG UX clarity (R2-k, ROADMAP #13).** First-cold-boot handshake reusing the WU-E2 idle banner template; explain Playthrough Type inline. | ✅ First-boot only; must NOT regress WU-F6 boot flavors (Suite 122). | F3, WU-F6 boot, WU-E2 template |
| **S2-I9 ⚠** | **Wasteland Calendar & Anniversaries** (#1) — date-keyed observances from the in-world calendar. | ⚠ **OPEN Q2** — reads **in-game date** (ticks-derived), which owner decision #1 flags as untrackable. HOLD for owner ruling. | UPLINK bank; calendar helpers |
| **~~S2-I10~~ DROP** | ~~Dusk/Dawn That Lands + Voice (#8)~~ | ❌ **DROP** — built entirely on in-game day/night, removed by owner decision #1. | — |
### TIER 4 — Per-game EXPERIENCE data seam (the connective tissue for Tier 3)
| ID | Unit | Notes | Depends on |
|---|---|---|---|
| **S2-E1** | **Per-game EXPERIENCE as `GAME_DEFS` data** (=R2-m, ONE item; ROADMAP #12 + IMMERSION #12). Extend `GAME_DEFS[ctx].voice`/`.ambient`: terminology, faction framing, ambient bank, CRT character. **Folds in deferred GT-4** (per-game accent CSS) **+ GT-5** (game-styled save layout; GT-5 partly shipped via WU-T3 saveLabel). Suite-89-style guard fails the build on any new `=== 'FO3'` literal. | Makes I1–I8 game-authentic (Mojave vs Capital Wasteland). FO4 = a new block. Scope-guard: keep to terminology/faction-framing/ambient/CRT-character — do NOT expand to "all 10." | F2 (per-game AI voice), U1 (ambient seam) |
### TIER 5 — Remote Transmissions (online content-drop layer of UPLINK — owner decision #1 + ROADMAP #2)
| ID | Unit | Notes | Depends on |
|---|---|---|---|
| **S2-R1** | **Remote Transmissions = the online content-drop source** feeding the SAME offline UPLINK bank (third source alongside static + AI-INTERCEPT). Read-only public Firestore + `remoteTransmissions` kill-switch + graceful offline fallback (Protocol 32/33). | The offline bank is the fail-safe. One push channel, three sources. This is the only genuinely-undesigned Step-2 item — needs a data model + security rules spec before build. | F1 (App Check), U1 bank |
### TIER 6 — SPEC-FIRST device capabilities NOT pulled into 2.7.0
| ID | Unit | Notes |
|---|---|---|
| **S2-V1** | **CRT-tilt / gyro parallax** (DeviceOrientation) — subtle phosphor-layer parallax; reduced-motion + permission-gated fallback. |
| **S2-V2** | **`share_target` receiver** (PWA manifest share target) — receive shared text/image into the terminal. Pairs with S2-A5 (SHARE-TARGET→AI parse). |
| **S2-V3** | **TTS audio-log** (SpeechSynthesis) — read narrative aloud; opt-in; pairs with AI-B narration (S2-A3). |
| **S2-V4** | **Ambient-light optic calibration** (AmbientLightSensor) — auto-nudge High-Lumen; graceful fallback where unsupported. |
*(The 5th SPEC-FIRST cap — the hacking minigame — **moved to Step 3**, owner brief + decision #7.)*
### TIER 7 — AI generative-residue (all gated behind F1 + F2 + F4; each needs a kill-switch flag + static fallback, Protocol 32/33)
| ID | Unit | Notes |
|---|---|---|
| **S2-A1** | INTERCEPT AI-augment — **= U5** (already ordered). |
| **S2-A2** | RADIO banter (AI-A) — optional online garnish on the Personal-Legend news bank (S2-I3). |
| **S2-A3** | AUDIO-LOG / TTS narration (AI-B) — ties to S2-V3. |
| **S2-A4** | SCAN-AREA encounter generation — optional AI enrichment feeding the map encounter table (consumed in Step 3). |
| **S2-A5** | OVERSEER quest hook (AI directive) — injects via the decomposed `getSystemDirective` (F2). |
| **S2-A6** | SHARE-TARGET → AI vision parse — ties to S2-V2. |
| **S2-A7** | TRADE / BIO-SCAN banter (WU-G-TRADEBANTER / WU-G-BIOPHRASE) — optional flavor over the shipped natives. |
*(COMPANION MEMORY (AI-K) and the HACK-FAIL AI taunt (AI-C) **moved to Step 4 / Step 3** respectively. AI-E AI-routed
console commands remain permanently SKIPPED — redundant, highest injection surface.)*
### TIER 8 — Client-infra bundle (standalone units; some deferred per ROADMAP Obj 10)
| ID | Unit | Notes |
|---|---|---|
| **S2-C1** | **IndexedDB migration as a standalone reversible unit** (dual-read shadow + checksum/version + rollback). (ROADMAP #7, owner #6) — **HIGH risk; test-first; NOT bundled.** Must preserve the beforeunload-flush guard (Suite 95). |
| **S2-C2** | Migration test harness (R2-h) — supports C1; build alongside. |
| **S2-C3** | Cloud-save conflict resolution + version history (R2-b). |
| **S2-C4** | Full backup export/import (R2-c). |
| **S2-C5** | Diagnostics export (R2-j). |
| **S2-C6** | Unified settings / profile hub — SETUP hub merging onboarding + settings (R2-g; ROADMAP Obj 4). Reuses `_openSysModal`. |
| **S2-C7** | a11y DEEP pass (R2-e) — beyond the shipped baseline. |
| **S2-C8** | Native procedural flavor-text engine (R2-f). |
| **S2-C9** | Offline shell hardening (R2-a). |
| **S2-C10** | **New-game-readiness / game-agnostic audit (R2-l)** — validate the seam is FO4-ready. Run LATE in Step 2 (de-risks Step 4). |
*Moved out (→ Step 3): **list virtualization (R2-d)** folds into the Manifest & Loadout remake (ROADMAP #8).
Deferred/dropped: **Web Workers** (no workload survives the shipped dirty-diff — ROADMAP Obj 10), **SW background-sync**
(needs IndexedDB C1 + a defined queue). Onboarding tour (R2-i) folds into S2-I8.*
## S2.C — Step-2 dependency notes & consolidations
- **The api.js serial cluster** (three-way-merge hazard): `F2 (directive decomp + GA-5) → U5 (INTERCEPT) → A5 (OVERSEER)
→ A7 (banter)`. Serialize all api.js edits; full gate after each merge (owner #6 merge-gate).
- **The ui-core.js boot cluster:** `F3 (onload decomp) → I1 (MOTD) → I5 (attract) → I6 (standby watch) → I8 (onboarding)`.
All attach to the boot/standby seams F3 creates. Serialize.
- **The `state.js` GAME_DEFS additive sequence:** `F2 (ai block) → E1 (voice/ambient block) → U1 (ambient bank consumed)`.
- **Consolidations (ROADMAP C1–C8):** C1 seeded-roll (U0, consumed by Step-3 map+loot); C2 one radio (U3 = the pull side
of U1's bank); C3 Remote Transmissions = third source on U1's channel (R1); C8 App Check done once (F1). Day/Night
(C4) is **removed**, not consolidated.
- **Force-fire testability (owner #2)** threads through every Tier-3 item — the dev/staging force-fire hook lands in U1
and is later subsumed by the Step-3 debug console (S3-HK2). Every ambient feature must expose a force-fire entry.
---
# STEP 3 — v2.9.0
## S3.A — DONE-ALREADY / PARTIAL (strip or mark extend-not-greenfield)
Step 3 is **mostly overhaul, not greenfield** (Protocol 25 risk — preserve muscle memory; keep the existing view as a
fallback).
| System | Shipped state | Step-3 work = |
|---|---|---|
| VATS (#2) | Native calculator + AP-strike + GA-7/GA-10 (Suite 105) | **Extend**: "Targeting Silhouette" SVG front-end + AP-across-turns + auto-DT from bestiary. Math core stays. |
| THREAT / LOOT | Native (Suites 107/110) | **Reuse** inside the unified Combat Encounter loop. |
| Radio (#1) | Synth bed (WU-F5) + tuner extension (Step-2 U3) | Radio is **fully absorbed into UPLINK** (owner #1). No standalone v2.9.0 radio. **STRIP as a separate item.** |
| Crafting (#7) | `renderCraft`/`doCraft` + recipe registry (Suite 83) | **Extend**: workbench stations UI on the Manifest & Loadout base. |
| Faction rep | 2D matrix `getFactionStanding`/`adjustFaction` (Suites 77/88) | **Extend**: Consequence Engine (mechanical) + ambient layer. |
| Quests (#6) | `renderQuests` + DLC schema | **Extend**: overhaul + consume Step-2 DLC quest data (S2-D2). |
| Squad (#8) | `renderSquad` + `state.squad` | **Extend**: companion management. (AI COMPANION MEMORY → Step 4.) |
| Inventory | `renderInventory` + `lookupItemInDb` + carry-weight math | **Rebuild** as Manifest & Loadout (the FOUNDATION). |
| Map | Fog-of-war (`recordLocationVisit`/`markLocationVisited`) + coordinate guards (Suites 74/114/126) | **Rebuild** as ONE Phosphor-Cartography SVG map (owner #3). |
| Karma | `state.karma` field + editable input | **Add** the timeline/cause-log (greenfield on existing field). |
| Aid (#12) | Chems in inventory | **Merge** into Manifest & Loadout (consolidation C6). |
**Stripped by consolidation:** standalone Radio (#1 → UPLINK); Recon Grid map design (owner #3 — dropped); separate
loadout manager (#11) and aid manager (#12) → folded into the Manifest & Loadout foundation (C6); separate VATS
resolver / THREAT / combat-log / LOOT → folded into ONE Combat Encounter flow (C5/ROADMAP #9).
## S3.B — Perfect-order backlog (v2.9.0)
### TIER 0 — Cross-cutting foundation (codify FIRST)
| ID | Unit | Notes |
|---|---|---|
| **S3-F0** | **"Native input path required" protocol** (ROADMAP #6, owner #6). Every gameplay data system must have a native, no-AI way to enter/edit its data. Codify once; every system below inherits it. | Process/protocol; no code. Prevents re-litigation per feature. |
| **S3-F1** | **FOUNDATION: Inventory "Manifest & Loadout" overhaul** (FEATURE_REMAKES Ambitious; ROADMAP #8). Sort/search/inspect-drawer/loadout-header + **list virtualization (R2-d)** + per-row equip. **Keep `state.inventory` schema unchanged** (no Protocol 4 surface). Consolidates R3-11 loadout + R3-12/aid (#12). | **Base for #7 crafting + #11 loadout + #12 aid.** Ship early — owner listed it as the foundation. Suites 40/61/75 stay green. |
### TIER 1 — The ONE map (owner decision #3)
| ID | Unit | Notes |
|---|---|---|
| **S3-M1** | **Geographic per-game SVG map** (S3-9) via **Phosphor Cartography** inline-SVG (low-risk first iteration). Consolidates R3-4 + R3-5 + R3-11 + FEATURE_REMAKES map; **DROP Recon Grid.** Reuse shipped fog-of-war + coordinate guards. Retire/repurpose `state.mapView` (migration note, Protocol 25). | Render-check 360/412/desktop (Protocol 10). Suites 74/114/126/68/79 must pass + new SVG-contract guards. |
| **S3-M2** | **World-Map Exploration overhaul** (S3-4) = the **data/journal layer ON TOP** of S3-M1. Travel-time model + encounter journal; **on-arrival encounter roll consumes the Step-2 U0 seeded-roll engine** (C1). Encounters that mutate state apply in the **map layer** (allowed to write), never in `ambient.js`. | Depends on S3-M1 + S2-U0. |
### TIER 2 — Unified Combat Encounter loop (owner #6; ROADMAP #9; consolidation C5)
One loop: **assess (THREAT) → queue shots (VATS) → log kill (combat log) → loot (LOOT).**
| ID | Unit | Notes |
|---|---|---|
| **S3-CE1** | **VATS "Targeting Silhouette"** (FEATURE_REMAKES Medium; folds #2) — SVG body-part picker + AP-across-turns budget bar + weapon picker + **auto-DT from bestiary** (manual fallback, Protocol 3). Reuse `recomputeVATS` math (Suites 104/105 stay green). No new persisted state. | Full Opus→Sonnet→Opus (medium UI over a coefficient contract). |
| **S3-CE2** | **Combat log / kill feed** (#13) — manual + registry autocomplete; native input (S3-F0). | Depends on S3-F0. |
| **S3-CE3** | **Wire the loop:** THREAT → Silhouette → combat log → LOOT as one encounter surface, sharing `GAME_DEFS[ctx].vats` coefficients + the U0 roll engine for drops. | Depends on CE1/CE2 + shipped THREAT/LOOT + S2-U0. |
### TIER 3 — Character build systems (share the Manifest & Loadout base)
| ID | Unit | Notes |
|---|---|---|
| **S3-B1** | **Build Planner / Respec** (#3) — SPECIAL + skills + perks. | Greenfield; reads shipped SPECIAL/skill/perk data. |
| **S3-B2** | **Perk planner / build-up timeline** (#14) — extends B1. | Depends on B1. |
| **S3-B3** | **Build-code sharing via Web Share** (ROADMAP #10, owner #6) — encode a build as a shareable/importable string, reusing shipped WU-F3 (Eject Holotape) + clipboard fallback. Versioned format. | Depends on B1 + WU-F3 (shipped). |
### TIER 4 — Faction & progression
| ID | Unit | Notes |
|---|---|---|
| **S3-FC0** | **Faction Consequence — ambient layer** (IMMERSION #9, owner #6) — the sensory half (UPLINK pushes friendly/hostile signals on threshold crossings; map ping). Can **precede** the mechanical engine. | Depends on Step-2 UPLINK push + rep matrix (shipped). |
| **S3-FC1** | **Faction Consequence Engine (mechanical)** (#5) — rep thresholds → vendor lock/unlock (**needs S2-D1 VENDOR_STOCK**), bounty hunters, map markers (needs S3-M1). | Depends on S2-D1 + S3-M1. |
| **S3-KR1** | **Karma & rep timeline** (#10 / R3-12) — native cause-logging, NO AI. Extends `state.karma`. | Native input (S3-F0). |
### TIER 5 — Quest & crafting (need the Step-2 data lane + Manifest base)
| ID | Unit | Notes |
|---|---|---|
| **S3-Q1** | **Quest Tracker overhaul** (#6) — extend `renderQuests`; **consumes S2-D2 DLC quest lines.** | Depends on S2-D2. |
| **S3-CR1** | **Crafting & Workbench Stations** (#7) — extend `renderCraft`/`doCraft` on the Manifest & Loadout base; recipe data shipped (Suite 83). | Depends on S3-F1. |
### TIER 6 — Companion & dialogue
| ID | Unit | Notes |
|---|---|---|
| **S3-CO1** | **Companion / Squad Management** (#8) — extend `renderSquad` + `state.squad`. (AI COMPANION MEMORY → Step 4.) | Native input (S3-F0). |
| **S3-DL1** | **Dialogue / speech-check helper** (#15) — native + optional AI; native input path required. | Depends on S3-F0. |
### TIER 7 — Immersion polish (need earlier layers)
| ID | Unit | Notes |
|---|---|---|
| **S3-IM1** | **Overseer's Incident Log** (IMMERSION #5, owner #6) — **MERGE with the existing session-stats / Overseer telemetry (WU-F7/F10), NOT a parallel system.** Device-local milestone ring + purge control. | Depends on the S2-I3 milestone-detection layer. |
| **S3-IM2** | **Emergent CRT "Condition"** (IMMERSION #7, owner #6) — cumulative-condition `ambient-*` layer; **toggleable OFF; dev-testable** (via S3-HK2). Highest gimmick risk — ship after the UPLINK arbiter is proven. | Depends on Step-2 UPLINK arbiter + THEMES. |
### TIER 8 — Hacking minigame + DEV/DEBUG PANEL (owner decision #7 — the big one)
| ID | Unit | Notes |
|---|---|---|
| **S3-HK1** | **RobCo Hacking Minigame as a locked subsystem** (IMMERSION #13, owner #6/#7) — self-contained DOM module (garbage grid + candidate words + likeness scoring + keyboard nav). Surfaced by rare UPLINK/INTERCEPT "ENCRYPTED PARTITION" events. Success unlocks flavor **and** the debug panel; failure → diegetic taunt (AI-C static, optional AI-augment). | Reduced-motion + keyboard-nav + 360/412 render. Unlocks are additive device-prefs/flavor, never campaign-state writes. |
| **S3-HK2** | **DEV/DEBUG PANEL (MUST BE BUILT)** — comprehensive in-terminal debug/test console: **force-fire every ambient/UPLINK feature** (the dev-testability affordance, owner #2), inspect+edit state, dump save/version/checksum, toggle every optic/audio/effect, simulate rad/faction/karma thresholds + CRT condition, force boot variants, view telemetry/Overseer log. **Additive/confirm-gated writes only** (can't corrupt saves — Protocol 34). | **Dev/staging bypass:** reachable directly in staging (Protocol 43 staging flag) without playing the minigame, so devs can test; prod requires the hack. **Sequencing note:** Step-2 ambient features need force-fire BEFORE this exists → Step 2 ships a minimal staging force-fire hook (S2-U1) that this console subsumes. |
## S3.C — Step-3 dependency notes & consolidations
- **Critical path:** `S3-F1 (Manifest base) → {CR1 crafting, B1 build, CE1 VATS}`; `S3-M1 (map) → {M2 exploration, FC1
markers}`; `S2-D1/D2 (Step-2 data lane) → {FC1 vendors, Q1 quests}`.
- **Manifest & Loadout (S3-F1) is the tallest pole** — crafting, loadout, and aid all sit on it. Build it first after the
native-input protocol.
- **Consolidations:** C5 (one Combat Encounter loop, not 4 panels); C6 (one inventory overhaul = loadout + aid);
Radio/map/INTERCEPT already consolidated into the Step-2 UPLINK engine (C1/C2/C3).
- **Overhaul discipline (Protocol 25):** every rebuild (map, inventory, quests, squad, VATS) must keep the existing
workflow as a fallback/zoom view and pass its existing suites.
---
# STEP 4 — v3.0.0 (Fallout 4)
## S4.A — DONE-ALREADY (what makes FO4 a near data-only drop-in)
| Shipped | Consequence |
|---|---|
| Game-agnostic seam (Protocol 38, Suite 89, `GAME_FILES` boot manifest) + the A9 refactor (GA-1…4/6/7/10) | FO4 = a new `GAME_DEFS` block + two data files + one manifest line. **No feature-code search-and-replace.** |
| FO3 already added as the 2nd game | Proves the two-game → N-game path works end to end. |
| Per-game theming foundation (`THEMES` + `GAME_DEFS[ctx].theme`, data-driven) | FO4 theme = one `THEMES` row + one `GAME_DEFS.FO4.theme` entry. |
| The 6 native calculators read per-game `databaseCSVs` + registry via `lookupItemInDb()` | They extend to an FO4 data set with **zero logic change**. |
**Prerequisites that MUST be delivered in Step 2** (verify before Step 4 starts): `getSystemDirective` decomposition
(S2-F2) so FO4 injects directive text via `GAME_DEFS[ctx].ai`; per-game EXPERIENCE seam (S2-E1); new-game-readiness
audit (S2-C10).
## S4.B — Perfect-order backlog (v3.0.0)
### TIER 0 — Prereq verification
| ID | Unit |
|---|---|
| **S4-P1** | Confirm S2-F2 (directive decomp + GA-5 retired), S2-E1 (EXPERIENCE seam), S2-C10 (readiness audit) all landed. Any residual two-game literal is a Step-4 blocker. |
### TIER 1 — FO4 data lane (fully parallel, data-only)
| ID | Unit | File(s) |
|---|---|---|
| **S4-D1 ∥** | `db_fo4.js` — WEAPONS/ARMOR/AMMO/CHEMS/MISC/QUEST_ITEMS/etc CSVs (fallout.wiki, Protocol 3). | new `db_fo4.js` + CSVs |
| **S4-D2 ∥** | `reg_fo4.js` — quests / items / perks / locations / companions / collectibles. | new `reg_fo4.js` |
| **S4-D3 ∥** | `GAME_DEFS.FO4` entry — theme, seedInventory, calendar epoch, combatSkills, vats, barter, `ambient` bank. | `state.js` |
| **S4-D4 ∥** | FO4 no-data warning template (WU-E2-style) for features FO4 lacks (e.g. skill books). | `index.html` template |
### TIER 2 — FO4 model specifics (depend on the data lane)
| ID | Unit | Notes |
|---|---|---|
| **S4-M1** | **FO4 skill-less model** — FO4 has no skills (perk-chart based). The agnostic seam must handle `getSkillKeys() === []` cleanly (skills panel, VATS combat-skill resolution, syncStateFromDom). | The one genuine architecture stretch — verify every `getSkillKeys()` consumer degrades. |
| **S4-M2** | Settlements system (FO4-specific panel). |
| **S4-M3** | Perk chart (SPECIAL-perk grid, replaces skill books). |
| **S4-M4** | Legendary effects. |
| **S4-M5** | FO4 theme + boot wiring (`GAME_FILES.FO4` manifest line + one `THEMES` row). |
### TIER 3 — Moved-in heavies (owner decision #4)
| ID | Unit | Notes / risk |
|---|---|---|
| **S4-H1** | **Streaming Two-Phase Narrator** (FEATURE_REMAKES MEGA) — split the single Tri-Node JSON call into (A) streamed narrative + (B) strict-validated state/modal delta. **New persisted context-summary state field** (Protocol 4). **Keep the single-JSON path as fallback.** | **HIGH** — AI-contract change (Protocol 14 test same commit); real-device mobile verify of the stream reader. |
| **S4-H2** | **COMPANION MEMORY** (AI-K) — persistent operator-linked Firestore; needs schema + eviction policy + `PRIVACY.md` update + App Check. Extends S3-CO1 squad. | HIGH — the only new operator-linked persistent cloud system. AI_SLATE flags it "heaviest, last." |
| **S4-H3** | **Web Workers offload** — **build ONLY if a concrete workload exists** (e.g. FO4's larger data joins or the streaming assembly). No workload survived the shipped dirty-diff. | Re-justify before scheduling. |
| **S4-H4** | **DLC map zones** (FNV Sierra Madre/Zion/Big MT/Divide; FO4 DLC) — zone-grid extension beyond the 6×6 Mojave. | A grid-design decision, not a data add. |
## S4.C — Step-4 dependency notes
- **Critical path:** `S2 prereqs (F2/E1/C10) → S4-D1/D2/D3/D4 (parallel data) → S4-M1 (skill-less model) → M2–M5`.
- **S4-M1 (skill-less model) is the only real architectural risk** — everything else is data. Front-load a spike that
proves `getSkillKeys() === []` degrades cleanly across the skills panel, VATS, and `syncStateFromDom`.
- **H1/H2 are independent of FO4 data** — they could ship in a v2.10.x interim if FO4 data lags, but owner decision #4
parks them here; keep them behind kill-switches (Protocol 32) and the single-JSON / offline fallbacks.
---
# CROSS-STEP: consolidations, conflicts, open questions
## Consolidations (the "one engine, many consumers" theme)
- **UPLINK is the substrate for Radio + map-encounters + INTERCEPT + Remote Transmissions** (owner #1). Radio and
map-encounter items are **struck from Step 3 as standalone** — they consume the Step-2 engine.
- **One seeded-roll engine (S2-U0)** feeds UPLINK broadcasts, Step-3 map encounters (S3-M2), and Combat Encounter loot
drops (S3-CE3).
- **One inventory overhaul (S3-F1)** = loadout + aid + crafting base.
- **One Combat Encounter loop (S3-CE1–3)** = VATS + THREAT + combat-log + LOOT.
- **App Check done once (S2-F1)** gates all networked residue across Steps 2–4.
- **Overseer Incident Log MERGES with existing telemetry (S3-IM1)** — never a parallel logger.
## Conflicts / open questions for the owner
1. **OPEN Q1 — Rad-storm weather without day/night.** Owner decision #1 removes the day/night cycle. The UPLINK spec's
U2 bundled weather **with** day/night. Does the cosmetic rad-storm/interference weather event **survive as a
standalone terminal-side random event** (recommended: yes, it's place/RNG-driven, not clock-driven), or is all of
U2 dropped?
2. **OPEN Q2 — Wasteland Calendar / anniversaries (IMMERSION #1) + "days-in-the-wasteland" boot line (part of S2-I1).**
These read the **in-game date** derived from `state.ticks`. Owner decision #1 removed day/night because in-game time
"can't be tracked." The calendar is the same class of in-game-time inference. **Ruling needed:** (a) drop all
in-game-date flavor (safest, fully consistent with #1); (b) keep date-keyed flavor as explicitly terminal-side
("per your logged ticks"), accepting it's an inference; or (c) keep the calendar but gate anniversaries behind an
explicit user opt-in. **Default assumption if no ruling: DROP (option a)** to stay consistent with #1. This also
fully drops IMMERSION #8 (already dropped).
3. **OPEN Q3 — Remote Transmissions data model.** The only genuinely undesigned Step-2 item. Needs an owner-approved
Firestore schema (doc shape, read-only public rule, cache/offline behavior, render surface) before it can be built.
Recommend a thin spec pass before scheduling S2-R1.
4. **OPEN Q4 — `APP_VERSION` bumps.** Each step is framed as a MINOR release (2.8.0 / 2.9.0 / 3.0.0). Per Protocol 2,
MINOR is automatic, but **3.0.0 (MAJOR, FO4) requires explicit owner confirmation.** Also confirm whether the many
additive Step-2 features accumulate under one 2.8.0 bump (recommended: yes — batch per the memory note on changelog
batching) or ship as incremental 2.7.x patches.
5. **OPEN Q5 — Web Workers (S4-H3).** No workload currently justifies it. Confirm whether to **drop entirely** or hold
as conditional-on-a-workload.
6. **OPEN Q6 — Debug-panel unlock model (S3-HK2).** Confirm the **staging bypass** (dev opens the console directly via
the Protocol-43 staging flag; prod requires the hack). Without a bypass, testing Step-2 ambient features in dev
would require playing the minigame each time.
## What changed vs the parked (v2.6.0-era) plans — summary
- **Struck as SHIPPED:** all 6 native calculators, all 9 device caps + F10/F11, GT-1/2/3 theming, the agnostic seam,
dirty-diff perf, a11y baseline, App Check client wiring, WU-B5 cloud-pull VM test.
- **Struck by consolidation:** standalone Radio, Recon Grid map, separate loadout/aid managers, separate
VATS-resolver/combat-log/THREAT/LOOT panels, Day/Night cycle, Dusk/Dawn (#8).
- **Moved to Step 4:** Streaming Narrator, COMPANION MEMORY, Web Workers, DLC map zones.
- **Moved to Step 3:** hacking minigame (+ its debug-panel unlock), list virtualization (into Manifest & Loadout).
- **New foundations inserted first (owner #5):** getSystemDirective decomposition, window.onload decomposition,
autoImportState VM test, per-suite parity gate, App Check verification, the data lane.
- **Held for owner ruling:** Wasteland Calendar (#1), rad-storm weather standalone (Q1), Remote Transmissions schema (Q3).
---
*END — analysis only. Nothing implemented, committed, or pushed. Baseline `dev` @ `027be1b` untouched; parked plans
untouched; `planning/` is gitignored. Awaiting owner review + explicit approval before anything folds into a
MASTER_PLAN.*
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).