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

command-cluster-rationale.md



RELEASE

planning/2.8.0/mockups/command-cluster-rationale.md

sha256 bcd7805349a8bdda · 9041 bytes · original held in the private archive

# COMMAND CLUSTER REDESIGN — Rationale > **Design mockups only.** Companions to `command-cluster-option-{a,b,c}.html`. Nothing here > touches app code; all interactions are faked. Open each file in a browser — every option shows > a MOBILE (360–412px) frame and a DESKTOP Director-column frame side by side, with live faked > interactions (tap the tools; they emit a `▸ …LAUNCHED` line into the transcript). > > Scope: the UPLINK "COMMAND CLUSTER" tray (target/item input + THREAT · VATS · TRADE · LOOT · > CONSULT · V.A.T.S. CALCULATOR, plus the D-PAD). **TERMLINK and CROSSROADS are retired and > appear in none of the options.** Aesthetic matched to `nv-machine-mockup.html` (amber = the > wire, keycap hardware language, steel casing, etched labels). --- ## The shared diagnosis (why the current tray feels cluttered) The shipped cluster is **three unrelated visual systems stacked**: a collapsible D-PAD details block, a standing full-width TARGET/ITEM input, and a 2-column grid of seven bracket-buttons of three different widths (half / full / full-with-different-font). Nothing shares a row height, the target input takes standing space even though only 2–3 tools ever read it, and the whole thing reads as a *panel of web buttons* rather than part of the machine. All three options attack the same three problems: **one visual system, no standing target field, fewer/regularized rows.** --- ## Option A — "FUNCTION-KEY RAIL" *(recommended)* **Idea:** the cluster collapses to **one slim row of six mini hardware keycaps** (F1–F6: THREAT, VATS, TRADE, LOOT, CONSLT, CALC) docked under the transcript card — the same keycap language as the DO-N bezel nav, so it reads as more of the machine's bezel, not a panel. Tools that take an argument (THREAT ▸, CONSULT ▸) flip the rail **in place** into an ARM state — `THREAT ▸ [target] [⏎] [✕]` — same row, same height, no second surface. Direct tools launch on one tap. - **Footprint:** ~64px standing (etch line + key row). No collapsed/expanded tray state to manage anymore — it is small enough to simply always be there, on mobile and desktop alike. - **Taps:** direct tools = 1 tap (today: expand tray + tap = up to 2). Argument tools = tap + type + fire (same as today's type + tap, but the field only exists while you need it). - **D-PAD: dropped.** Its four macros survive as typed TERMINAL-mode input; the transcript gets the space back. (If the owner objects, a seventh `PAD` keycap could arm a one-row ▲◄►▼ state the same way THREAT arms — noted as a variant, not mocked.) - **Tradeoffs:** six keycaps at 360px means small (8px) labels — legible in the mockup but near the floor; CONSULT abbreviates to CONSLT. The two-stage ARM interaction is new muscle memory for THREAT/CONSULT users. ## Option B — "TOOL DECK" (single launcher, zero standing footprint) **Idea:** the cluster's standing footprint goes to **zero**. One new dashed **◈ key in the composer toolbar** (next to [+]) raises a bottom-sheet TOOL DECK inside the glass: a shared target/topic field on top, six full-width tool rows — each with a plain-English one-line job description and a `USES TARGET` tag — and the D-PAD tucked at the bottom. Scrim-tap / ✕ / Esc close it. - **Footprint:** 0px — below the composer there is nothing but transcript. The cleanest possible mobile read; the "infinite scroll" complaint cannot recur by construction. - **Taps:** every tool costs exactly 2 (◈, then the row). Argument tools are arguably *better* than today: the field, the description, and the launch live in one focused surface. - **D-PAD: tucked** — kept fully functional but out of the standing layout entirely. - **Discoverability bonus:** the descriptions make the deck double as the tools' help surface — good for a returning player who forgot what [CONSULT] does. - **Tradeoffs:** +1 tap on every use, always; the tools are invisible until you know the ◈ key (mitigate with a first-run hint or keeping the key lit). An overlay sheet is also a slightly bigger build than A (focus trap, scrim, Esc — though `openModal()`/the WU-C13 pattern already exists to reuse). ## Option C — "FIRE-CONTROL SELECTOR" (most diegetic) **Idea:** the six tools become **channels on one piece of hardware**: ◂ ▸ steppers around an amber LCD channel window (with six position LEDs, tappable for direct selection), a one-line channel description, one shared TARGET field, and a single **ENGAGE** key. Channels that take no argument dim the target field to a dashed socket reading `NO ARGUMENT — DIRECT LAUNCH`. The selector remembers its channel, so repeat use of one tool is a single ENGAGE tap. - **Footprint:** ~150px standing (selector + engage row + micro-pad row) — bigger than A, far smaller and *calmer* than today: three regular rows of one visual system. - **Taps:** best-in-class for *repeat* use of one tool (1 tap); worst for *hopping* between tools (dial ◂ ▸ up to 3 steps, or tap a 6px LED — small target). Only one tool is visible at a time, so the other five are hidden from a glance. - **D-PAD: shrunk** to four micro keycaps on one slim etched row (28px targets held). - **Tradeoffs:** the dial interaction is charming but slower for tool-switchers; the position LEDs at 6px are below the 28px tap floor (they're a redundant shortcut — the steppers are the compliant path — but that nuance would need care in a real build). --- ## Comparison at a glance | | A · FUNCTION-KEY RAIL | B · TOOL DECK | C · FIRE-CONTROL | |---|---|---|---| | Standing height (mobile) | ~64px | **0px** | ~150px | | Taps: direct tool | **1** | 2 | 1 (if dialed) / 2–4 | | Taps: argument tool | tap → type → fire | 2 + type | type → ENGAGE | | All tools visible at a glance | **yes** | no (behind ◈) | no (one at a time) | | D-PAD | dropped | tucked in deck | shrunk micro-row | | Diegetic fit | keycap bezel language | sheet = least hardware-like | **strongest** | | Build size | small | medium (overlay) | medium (state machine) | ## Recommendation **Option A.** It is the only option that keeps every tool one tap away *and* visible at a glance while cutting the standing footprint by roughly three quarters — and its keycap language means the cluster stops being "a panel of buttons under the chat" and becomes part of the machine's bezel, which is exactly the DO-N/DO-O direction. It also deletes a whole state axis (the open/collapsed tray and its desktop-exception wiring in `_wirePanelPersistence()`). If the owner's priority is strictly "maximum transcript, minimum chrome," **B is the better pick** — zero standing footprint is unbeatable — and A and B compose naturally later (B's deck could become the long-list home if the tool count ever grows past what one rail row holds). C is the most characterful and worth keeping in the idea bank for a hardware-dense surface (e.g. a future OPERATIONS dressing), but for a quick-launch cluster its one-tool-at-a-time window fights the "fast access" goal. ## Open questions for the owner 1. **D-PAD verdict:** the three options model drop / tuck / shrink. Does anyone actually use `[PAD: …]`? If not, retiring it outright (like TERMLINK/CROSSROADS) simplifies every option. 2. **VATS target:** should the quick [VATS] launch accept the target argument (as A/B/C assume, optional) or stay a plain launcher with targeting done inside the V.A.T.S. panel? 3. **Option A label width:** is CONSLT an acceptable abbreviation at 360px, or should the rail drop to five keys by folding CALC into VATS (long-press or a second tap inside the sim)? 4. **Option B entry point:** is the composer toolbar the right home for ◈, or should it sit on the transcript-card border so the composer stays purely conversational? ## Screenshots (headless-rendered, for mobile review) Each option has a mobile frame shot, an interaction-state shot, and a desktop overview: - **Option A:** `command-cluster-option-a-412.png` (mobile, resting rail) · `command-cluster-option-a-412-armed.png` (THREAT armed — inline target field) · `command-cluster-option-a-desktop.png` (full page: blurb + both frames) - **Option B:** `command-cluster-option-b-412.png` (mobile, zero-footprint resting state) · `command-cluster-option-b-412-deck.png` (◈ deck raised, target filled) · `command-cluster-option-b-desktop.png` - **Option C:** `command-cluster-option-c-412.png` (mobile, THREAT channel) · `command-cluster-option-c-412-dialed.png` (dialed to TRADE — dimmed no-argument socket) · `command-cluster-option-c-desktop.png` ## Verification All three files headless-checked at **360 / 412 / 1200px**: `scrollWidth === innerWidth` (no horizontal overflow), zero console errors, and every faked interaction (arm/fire, deck open/launch, channel dial/engage) exercised. Inputs are 16px (no iOS focus-zoom); all primary controls hold ≥28px targets (C's position LEDs are a flagged exception, redundant to the steppers).
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).