GENERATED VIEW · PRIVATE ARCHIVE · DO NOT SERVE
RobCo Industries · Archive Museum

module-bay-rationale.md



RELEASE

planning/2.8.0/mockups/module-bay-rationale.md

sha256 d28671e9de75b252 · 8566 bytes · original held in the private archive

# MODULE BAY — Design Rationale (mockup for owner approval) > **Status:** MOCKUP ONLY — nothing in the app was touched. All files live in the > gitignored `planning/mockups/` folder. Awaiting owner approval before any implementation. ## The concept in a sentence Settings stop being a config panel and become the **inside of the terminal**: you release a service hatch, look at the chassis backplane, and every device preference is a physical part — a board you seat or eject, a chip you pull, a tube you swap, a cell you slot in, a dial you turn. ## Why this works for RobCo U.O.S. - **It's a reframe, not a reskin.** "Mute typing SFX" (a checkbox about software) becomes "pull the CH-01 chip from the Sonic Processor" (an action on hardware). Same one tap, entirely different fiction. - **The app already leans this way.** The live build already calls the wake lock a "SUSTAINED POWER CELL" and haptics a "HAPTIC SOLENOID" — the Module Bay just gives those names the physical home they've been implying. - **State reads at a glance.** An installed module has a lit LED and a solid border; a removed one is a dashed empty socket. You can see your whole configuration the way a technician reads a board — no label-reading required. ## Settings → module mapping (complete — every registered device pref) | Current setting (real key) | Module Bay home | Interaction | | --- | --- | --- | | Optics color, per game (`robco_optic_<ctx>`) | **SLOT 01 · VDU OPTICS DRIVER** — phosphor tube rack, 7 tubes (RobCo Green default, Pip-Boy Green, NV Amber, Vault-Tec Blue, Legion Red, Ghoul Green, Neon Purple) | Tap a tube to seat it; page recolors live | | High-lumen mode (`robco_high_lumen`) | SLOT 01 — **HIGH-LUMEN COIL** module | Install / remove | | Master mute (`robco_master_muted`) | **SLOT 02 · SONIC PROCESSOR** — the board itself | **⏏ REMOVE BOARD = mute all**; reseat = unmute (chips preserved) | | 13 individual mutes (`robco_sfx/hum/geiger/tinnitus/ambient/wake/panelclick/bootdrone/levelup/heartbeat/questcomplete/questfail/factionthreshold_muted`) | SLOT 02 — 13 socketed **DIP channel chips** (CH-01…CH-13) | Pull a chip = mute that channel; reseat = unmute. *(Semantics inverted vs today: chip installed = sound ON — more intuitive than "check to mute")* | | Pip-Boy radio (`robco_radio_on`) | SLOT 02 — **RADIO RECEIVER MODULE** (daughter-board) | Install = radio ON (matches its existing play-toggle, not-a-mute semantics) | | Typer speed (`robco_typer_speed`) | SLOT 02 — **PRINT-RATE TRIM** potentiometer | Slider, 0.25×–3×, same range as today | | Wake lock (`robco_wakelock_enabled`) | **SLOT 03 · POWER CELL BAY** — **SUSTAINED POWER CELL** (name kept from live app) | Cell slides into dock on install | | Haptics (`robco_haptic_enabled`) | SLOT 03 — **HAPTIC SOLENOID** (name kept from live app) | Install / remove | | Immersion dial (`robco_immersion`) | **SLOT 04 · ATMOSPHERIC REGULATOR** — 3-position rotary dial | Tap to rotate FULL → BALANCED → MINIMAL | | Gemini key (`robco_gemini_key`) | **SLOT 05 · AI UPLINK CO-PROCESSOR** — **CIPHER KEY SLOT** | Insert key + HANDSHAKE (= today's validate & fetch) | | Model choice (`robco_gemini_model`) | SLOT 05 — **ENGINE selector** | Same select, populated after handshake | | Key sync (`robco_gemini_key_sync`) | SLOT 05 — **KEY-SYNC JUMPER** | Physical jumper toggle; amber like today's AI-tier controls | | Utility actions (holotape eject, campaign log .txt/.md/.html, changelog viewer, PWA install) | **SVC TRAY · MAINTENANCE TOOLS** | Same buttons, framed as field-service tools (blue, like utility actions today) | **Deliberately NOT moved into the bay:** - **Input mode** (`robco_input_mode`) — the OVERSEER/TERMINAL pill lives inline in the Comm-Link where it's used; moving it to a settings bay would hurt, not help. - **Saves & Account** — data, not device hardware. They stay in their own panels; the tray carries a status line saying exactly that so nobody hunts for them in the bay. - **Internal bookkeeping keys** (`robco_panel_state`, `robco_active_tab`, `robco_overseer_log`, `robco_error_log`, `robco_version`, `robco_booted_before`, `robco_feature_flags`, `robco_sw_installed`) — not user-facing settings; no module needed. - **Campaign settings** (game context, playstyle, RNG mode) — campaign state, not device prefs; they stay where they are. ## Interaction model 1. **Entry:** the Settings surface presents as a closed **SERVICE PANEL** hatch (screws, warning sticker, `▶ RELEASE HATCH` latch). One tap opens it; it stays open for the session — the ceremony happens once, not on every visit. 2. **Toggles = install/remove.** Every boolean is a module with an LED, an INSTALL/REMOVE button, and a status line (kept verbatim from the live app where one exists, e.g. "`> POWER CELL IDLE — DISPLAY MAY DIM`"). Still exactly one tap per change. 3. **Multi-value = physical controls.** Enum → tube rack / rotary dial; number → trim slider. Direct manipulation, no nested menus. 4. **Master mute = board ejection.** The one "big" audio switch is the most physical action in the bay. Ejecting the Sonic Processor dims its chips in place (they keep their state), so reseating restores your exact channel mix — mirroring how `toggleMasterMute` already preserves individual mute prefs. 5. **Service log.** Every change appends a diegetic line ("`> PHOSPHOR TUBE SWAPPED → NEW VEGAS AMBER`") — passive confirmation that a change took, replacing nothing. ## Muscle memory & access preserved - **Same panel location, same tap counts.** The bay replaces the *contents* of Security & Configuration; nothing moves to a new tab. Every current control has exactly one obvious home and no setting takes more taps than today (most are identical: one tap). - **⌕ SCHEMATIC VIEW** — a header button opens a flat, compact list of every module as plain rows (checkbox/select/slider), i.e. today's UI, one tap away, always. The reframe is additive; the old mental model is never removed. - **All labels stay searchable.** Real names ride along as sub-labels (e.g. "KEEP DISPLAY LIT", "MAX CONTRAST") so the fiction never obscures what a module actually does. ## Mobile / desktop - **Mobile (360/412):** single-column stack of boards; chips wrap into a 2–3-per-row grid; tap targets ≥ 28px; no horizontal overflow at 360 (verified headless, see screenshots). - **Desktop (≥1000px):** two-column bay grid — boards side by side like a real backplane, with the service tray spanning full width. - High-lumen install genuinely flattens the mockup to pure black + no glow, and `prefers-reduced-motion` neutralizes all animation — both invariants carried over from the live app (Protocol 17). ## Game-agnostic No FNV/FO3 literals anywhere in the bay itself. Tube names come from the existing THEMES table (which already includes cross-game options); per-game visual identity is deliberately left for the later theming chapter. ## Implementation notes (for AFTER approval — not started) - Pure additive UI reframe: every module's action calls the **existing** setter (`toggleAudio`, `toggleMasterMute`, `changeOpticsColor`, `toggleWakeLock`, `toggleHaptic`, `toggleHighLumen`, `onImmersionChange`, `setGeminiKeySync`, …) — zero new state, zero new MetaStore keys, Protocol 22/23 clean. - Chip semantics invert the stored mute booleans in the render layer only (installed = `!muted`); storage format unchanged. - Would be a served-file change → CACHE_NAME bump, Protocol 10 render verification at 360/412/desktop, and gate guards for the new markup contracts. ## Open questions for the owner 1. **Hatch ceremony:** happy with hatch-once-per-session, or should the bay just be open whenever the panel expands (hatch only on first-ever visit)? 2. **Chip semantics flip:** OK inverting mute checkboxes to "installed = audible"? (More physical, but it flips 13 checkboxes' polarity vs. today.) 3. **Schematic view:** keep it permanently, or treat it as a transition aid to retire later? 4. **AI Uplink styling:** keep the amber "external hardware" identity for SLOT 05 (as today's alert-colored config area), or normalize it to green like the rest of the bay? 5. **Scope of the ceremony sounds:** should installs/ejects get their own SFX (a socket *thunk*, chip *click*)? Cheap to synthesize with the existing WebAudio setup, very satisfying, but adds new audio sources (Protocol 7 checklist each).
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).