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

PHASE3_DATABANK_PLAN.md



RELEASE

planning/2.8.0/plans/PHASE3_DATABANK_PLAN.md

sha256 77922035e91615b7 · 25058 bytes · original held in the private archive

# Phase 3 · Piece 3 — DRESS the DATABANK subsystem into the NV "machine" language **Branch:** `dev` · **HEAD:** `89dfb1e` · **APP_VERSION:** `2.7.0` (`[Unreleased]`) **Flow:** plan → **Fable mockup** → owner approve → build (same as OPERATOR / OPERATIONS / Settings-tab). **Scope:** PLAN ONLY. No code edits, no commits, no gate. Implementation + the mockup are later passes. **Bezel target:** `[3] DATABANK · DATA·CAMPG` (`_DATABANK_TABS = ['data','campg']` — selecting DATABANK shows BOTH panel groups together, ui-core L3206). --- ## 0. Owner hard directive this cycle — "light-frame ≠ done" Every board / list / graph / map / indicator in DATABANK gets a **ground-up redesign with its own identity**, not a `.bay-board` frame wrapped around legacy markup. Each one must answer: *is this the coolest, clearest, most immersive RobCo version possible?* **No board is left light-framed.** The bar is the now-shipped floor — Comm-Link (Director Uplink) + Settings (Module Bay) + the fully-dressed OPERATOR (BUS-01…09) + the OPERATIONS freight console (BUS-10…15). DATABANK must read as the **same machine** and be its own bold 1-of-1. **The machine language is fully built and shipped** (nothing to invent — this is dressing). Confirmed reusable in `css/terminal.css` today: - `.panel.bay-board` / `details.bay-board` — board frame (+ `::after` copper connector strip via `background-repeat: round`, Suite 160) - `.bay-slot-tag` (`BUS-NN` chip) · `.bay-part-no` (`PN RBC-… · SUB-LABEL` + `.real-label` plain-English ride-along, Protocol 25) - `.board-led` (summary lamp) · `.panel-substatus` (the **collapsed one-line status row** — the 0i standard) - **`.drawer-bank` / `button.drawer` (+ `.pulled`/`.active`, `.d-count` badge)** — the OPERATIONS one-open-at-a-time selector - **`.tray-head` (`.t-title` + `input[type=search]`) / `.tray-scrollwrap` / `.tray-list` / `.slot-list`** — the **bounded scroll + search + numbered-slot** pattern the shipped **PERK LOADOUT** (BUS-06) already reuses for 90+ perks (ui-render + index L1662). This is the exact mechanism a long QUEST LOG needs. - `.bay-board.span2` (two-up desktop) · `.uplink`/`.tray`/`.dangerboard` accents · `.campg-stat-box`/`-label`/`-value`/`-sub` (already used by CAMPAIGN STATUS) **Part-number series continues:** OPERATOR = BUS-01…09, OPERATIONS = BUS-10…15 → **DATABANK = BUS-16…21** so the whole device shares one PN series. --- ## 1. The bold DATABANK identity — "THE RECORDS BAY: an archival cartography station" Each subsystem has one organ: OPERATOR = biometric telemetry rack · OPERATIONS = quartermaster freight console · SETTINGS = hardware module bay · Comm-Link = comms oscilloscope. **DATABANK is the machine's memory and maps** — knowledge, history, position. Its 1-of-1 is a **RobCo archival cartography station**: a phosphor **surveyor's plotting table** for the world, a **numbered directive rack** for quests, a **tape-spool chronicle / ledger** for campaign history, and an **index-catalog query** for reference lookups. **Amber-on-phosphor rationale (the DATABANK read):** - **Green = owned / local / charted** — your directives, your campaign record, your field notes, surveyed territory. The machine's own memory. - **Amber (`--bezel-wire`) = active query / scan / reference-retrieval** — pulling reference knowledge from the archive (CATALOG QUERY), the map's live survey-sweep, "over the wire"–flavored knowledge. Matches the Director's amber. - **Red (`--robco-danger`) = failed directives / hazards.** **Motion verbs** (all plain `animation` → the existing global `prefers-reduced-motion` block neutralizes each to a static frame, no bespoke carve-out): **SURVEY-SWEEP** (map radar line), **PLOT-FIX** (you-are-here pulse), **SLOT-SEAT** (directive card seats, reusing the perk-socket SEAT), **REEL** (chronicle retrieval), **QUERY-SCAN** (catalog). --- ## 2. Element-by-element dressing spec (the meat) **EVERY** control/readout on `data-tab="data"` + `data-tab="campg"` today (verified against `index.html` @ `89dfb1e` and the render fns in `js/ui-render.js` / `js/ui-saves.js`). Six panels: **QUEST LOG** (L1605), **DATABANK search** (`#databankPanel` L1639), **CAMPAIGN NOTES** (L1904), **CAMPAIGN LOG** (`#campaignLogPanel` L1967), **WORLD MAP** (`#worldMapPanel` L1982), **CAMPAIGN RECORD** (`#campgPanel` L1992, 3 sub-panels). > Proposed board order (mobile): **CARTOGRAPHY TABLE** (map, hero, open) → **DIRECTIVE REGISTRY** (quests, hero, open) → **CAMPAIGN CHRONICLE** (record, 0i) → **CATALOG QUERY** (search, 0i) → **FIELD NOTES** (notes, 0i) → **SERVICE TALLY** (session log, 0i). ### Board 1 — CARTOGRAPHY TABLE *(WORLD MAP, `#worldMapPanel`)* ⭐ hero #1 — the showpiece Fiction: `BUS-16 · CARTOGRAPHY TABLE`. The single coolest DATABANK instrument; default-open. A phosphor **surveyor's plotting table**, not a grid-in-a-frame. | Element (id) | Handler | Ground-up dressed form | Stays functional | | --- | --- | --- | --- | | `#worldMapDisplay` world grid (registry `FALLOUT_REGISTRY.zones`, 6×6 full / 4×4 core) | `renderWorldMap()`; cells `onclick=zoomMapToZone` | **Plotting table**: the zone grid as a tactical survey map — a slow **SURVEY-SWEEP** radar line, a **compass frame**, sectors rendered as CHARTED (lit green) vs UNSURVEYED (dim/hatched fog), a pulsing **PLOT-FIX "YOU ARE HERE"** on the current sector, collectible pips as amber **"SIGNAL RETURN [?]"** blips. | ✅ same `renderWorldMap()` markup contract; cells keep `zoomMapToZone()`; the `map-cell`/`map-cell--current`/`--visited`/`-pip` class hooks + coord logic unchanged (skin via CSS + a template edit, same ids). | | FULL / CORE toggle | `onclick=setMapView('full'/'core')`, `state.mapView` persisted | A **"CHART SCALE" switch** (STRATEGIC ⇄ CORE) | ✅ `setMapView()` + `state.mapView` persistence unchanged. | | Zoom-to-zone detail view (`_mapActiveZone`) | `zoomMapToZone` / `resetMapZoom` | **"PULL MAP SHEET"** — the sector detail slides in as a surveyed sheet; `< WORLD GRID` back key; per-location CURRENT/VISITED/UNKNOWN rows | ✅ detail render + `resetMapZoom()` back button unchanged. | | LOG VISIT buttons (undiscovered rows) | `onclick=markLocationVisited(loc)` → `recordLocationVisit` (fog-of-war, permanent, no un-mark) | **"MARK SURVEYED"** stamp key on unsurveyed rows | ✅ `markLocationVisited()` → single-source `recordLocationVisit()` unchanged (add-only, dedup'd; Protocol 22). | | Legend | static | Diegetic survey key | ✅ display only. | **Fixed-size by construction** (not infinite): the grid is 6×6/4×4 and the detail view is one zone's location list — inherently bounded on mobile. ### Board 2 — DIRECTIVE REGISTRY *(QUEST LOG)* ⭐ hero #2 — reuses the proven tray+drawer pattern Fiction: `BUS-17 · DIRECTIVE REGISTRY`. Default-open. Quests as a **numbered directive rack** (the PERK LOADOUT/CARGO tray pattern — quests can be many). | Element (id) | Handler | Ground-up dressed form | Stays functional | | --- | --- | --- | --- | | `#questsList` (rows: `[STATUS] name [factions] objective` + X) | `renderQuests()`; `removeQuest(i)` | **Numbered directive slots** (`SLOT 01…`, `.slot-list`) inside a **bounded `.tray-scrollwrap`**, each with a physical **status lamp** — ACTIVE (amber), COMPLETE (green), FAILED (red) — objective as a sub-line, X eject | ✅ `renderQuests()` template edit keeps `removeQuest(i)` + status-color contract; row ids/delegation preserved. | | Status-filter **drawer bank** *(NEW — mobile bound)* | wraps client-side filter over `state.quests` | ALL / ACTIVE / COMPLETE / FAILED **drawers (one open at a time**, `.drawer-bank` + `.d-count` badges) so a long log shows one status at a time — reuses the CARGO drawer mechanic verbatim | ✅ pure display filter over the same array; no state change. Persist last-open via a MetaStore pref (Protocol UI-6). | | In-tray search *(NEW)* | filters the open drawer | `.tray-head` search field (the shipped `#perkSearch` pattern) | ✅ display-only filter. | | Add-quest form (`#newQuestName` [autocomplete `quests`], `#newQuestStatus`, `#newQuestObjective`) | `onclick=addQuest()` | **"FILE DIRECTIVE" slip** | ✅ every id/attr kept; `addQuest()` + `wireInput('newQuestName','quests')` autocomplete + `maxlength` caps unchanged. | **Opportunity (Open Q3):** today a quest's status is set only at add-time + by the AI — there is **no native status-cycle**. Adding a per-slot **status-cycle key** (ACTIVE→COMPLETE→FAILED) is a genuine "track" improvement + fits "bigger ambition" (small new write path → `setQuestStatus(i)` + regression test, Protocol 13). Recommend as a stretch. ### Board 3 — CAMPAIGN CHRONICLE *(CAMPAIGN RECORD, `#campgPanel` — 3 sub-panels)* Fiction: `BUS-18 · CAMPAIGN CHRONICLE`. Default 0i-collapsed on mobile (currently `open` in HTML — see Open Q1). The campaign history as a **tape-spool chronicle / archival ledger**. | Element (id) | Handler | Ground-up dressed form | Stays functional | | --- | --- | --- | --- | | CAMPAIGN STATUS (`#campaignStatusPanel` / `#campaignStatusDisplay`) | `renderCampaignStatus()` | **Status readout head** — quest/effects counter boxes (`.campg-stat-box` kept) + **notable-standings chips** (via `getFactionRegistry()`) + event-count | ✅ `renderCampaignStatus()` reads existing state, no new fields; sub-panel `data-sub-id=campaign_status` persistence kept. | | CROSSROADS RECORD (`#crossroadsDisplay`) | `renderCampaignStatus()` (last 20 `state.eventLog`, `_recordLine`) | **The record spool** — a bounded, REEL-in scrolling chronicle of recent events, in-game–timestamped (`formatGameTime`) | ✅ same eventLog read + `_recordLine()` formatting; `data-sub-id=crossroads_record`. | | INCIDENT LOG (`#incidentDisplay`) | milestone eventLog (level/faction/quest, last 20) | **Stamped milestone entries** — the "big moments" as embossed ledger stamps | ✅ same milestone filter; `data-sub-id=incident_log`. | ### Board 4 — CATALOG QUERY *(DATABANK search, `#databankPanel`)* — amber "reference retrieval" Fiction: `BUS-19 · CATALOG QUERY`. Default 0i-collapsed. **Amber-accented** (pulling reference knowledge from the archive). An **index-catalog query terminal**. | Element (id) | Handler | Ground-up dressed form | Stays functional | | --- | --- | --- | --- | | `#databankSearch` | `oninput=renderDatabankPanel()` | **Query line** with a QUERY-SCAN motif; amber index-card aesthetic | ✅ `renderDatabankPanel()` → `_consultSearch`/`_consultRenderHTML` unchanged; `maxlength`/aria kept. | | `#databankResults` | `_consultRenderHTML` | **Returned catalog cards** (items/perks/quests/locations/companions/creatures/trackers), read-only | ✅ same shared CONSULT engine; results already bounded by the CONSULT cap (confirm N). | ### Board 5 — FIELD NOTES *(CAMPAIGN NOTES)* Fiction: `BUS-20 · FIELD NOTES`. Default 0i-collapsed. A **courier's field ledger**. | Element (id) | Handler | Ground-up dressed form | Stays functional | | --- | --- | --- | --- | | `#campaignNotesList` | `renderCampaignNotes()`; `removeCampaignNote(i)` | **Ledger rows** — hand-filed notes bright, auto-log `[T…]` entries dimmed (existing distinction kept), inside a **bounded scroll** with an optional search (Open Q10) since notes can grow long | ✅ `renderCampaignNotes()` template edit keeps `removeCampaignNote(i)` + the `/^\[T\d+\]/` auto-log dimming. | | Add-note form (`#newCampaignNote`, Enter-to-add) | `onclick=addCampaignNote()` | **"FILE NOTE" slip** | ✅ id/`maxlength=5000`/Enter handler + `addCampaignNote()` unchanged. | ### Board 6 — SERVICE TALLY *(CAMPAIGN LOG, `#campaignLogPanel`)* Fiction: `BUS-21 · SERVICE TALLY`. Default 0i-collapsed. Session stats as a **mechanical counter/odometer bank** (reusing OPERATIONS' odometer language). | Element (id) | Handler | Ground-up dressed form | Stays functional | | --- | --- | --- | --- | | `#sessionStatsList` (KILLS / CAPS EARNED / DMG DEALT / CURRENT SITTING / TICKS / LOCATION VISITS / COLLECTIBLES) | `renderSessionStats()` | **Odometer/counter bank** — each stat a mechanical rolling counter tile | ✅ `renderSessionStats()` reads `state.stats` + derived; template edit only. | | RESET CAMPAIGN STATS | `onclick=resetSessionStats()` | **"ZERO COUNTERS" key** | ✅ `resetSessionStats()` unchanged. | ### Related surfaces NOT owned by DATABANK (documented, not dressed here) - **Collectibles / Lincoln** live on **OPERATIONS (INV)** (`#collectiblesSubPanel` L1518, `#lincolnSubPanel`), dressed there (CURIO ARCHIVE, BUS-15). DATABANK's CARTOGRAPHY TABLE only **cross-references** them read-only for the `[?]` signal-return pips. No DATABANK board dresses them. - **SYSTEM STATUS** (`#systemStatusPanel`, L1932) is `data-tab="chassis"` — CHASSIS subsystem, out of scope. - **ACCOUNT / SECURITY** (L2067+) are `data-tab="settings"` — out of scope. --- ## 3. The load-bearing constraint — the id-preservation contract (Protocol 22) `loadUI()` (ui-core L4838-region) does dirty-checked `render*()` calls and `renderDatabankPanel()` is called every loadUI (input-driven, L5003). The dressing **must keep every id** (wrap/restyle, never rename): `questsList newQuestName newQuestStatus newQuestObjective` · `databankPanel databankSearch databankResults` · `campaignNotesList newCampaignNote` · `campaignLogPanel sessionStatsList` · `worldMapPanel worldMapDisplay` · `campgPanel campaignStatusPanel campaignStatusDisplay crossroadsDisplay incidentDisplay`. Handlers stay: `renderQuests · addQuest · removeQuest · renderDatabankPanel(_consultSearch/_consultRenderHTML) · renderCampaignNotes · addCampaignNote · removeCampaignNote · renderSessionStats · resetSessionStats · renderWorldMap · setMapView · zoomMapToZone · resetMapZoom · markLocationVisited(recordLocationVisit) · renderCampaignStatus · _recordLine`. Where a render fn emits markup, the survey-table / directive-slot / chronicle / odometer skin is a **controlled edit to that function's template**, still emitting the same ids/handlers/coord logic. **No handler forked; no state field changed.** Keeping boards as `<details class="panel bay-board">` preserves `robco_panel_state` open/closed **and** `robco_scroll_positions` scroll restore for free (owner's "everything remembers on reload"). Sub-panels keep their `data-sub-id`s (Protocol UI-2). --- ## 4. Mobile approach — the no-infinite-scroll problem DATABANK's long surfaces are the **quest log**, **campaign notes**, and the **chronicle**; the map is fixed-size. Four bounds: 1. **Short 0i stack.** Default-open only the two heroes (**CARTOGRAPHY TABLE + DIRECTIVE REGISTRY**); everything else opens **collapsed to a live one-line `.panel-substatus` LED row**. Persisted open/closed remembered. - 0i lines (live): `MAP · 14/108 CHARTED · GOODSPRINGS FIX` · `DIRECTIVES · 3 ACTIVE · 5 DONE · 1 FAILED` · `CHRONICLE · 42 EVENTS · 8 INCIDENTS` · `CATALOG · TYPE TO QUERY` · `NOTES · 12 ON FILE` · `TALLY · 24 KILLS · 1,204c · 3h SIT`. 2. **Directive registry = bounded tray + status drawers.** `.tray-scrollwrap` bounds the quest list to a fixed-height scroll; the **status drawer bank** (ALL/ACTIVE/COMPLETE/FAILED, one open) + in-tray search narrow it — reusing the shipped CARGO/PERK mechanic, so the worst case (dozens of quests) is a fixed-height panel, not a mile of rows. 3. **Field notes + chronicle = bounded scroll (+ optional notes search).** Notes get a `.tray-scrollwrap`; crossroads/incident are already `.slice(-20)` capped inside a bounded region. CATALOG QUERY results ride the CONSULT cap. 4. **Map is fixed by construction** — 6×6/4×4 grid; the zoom detail is one zone's list. **Baseline invariants (Protocol 10/17):** - Pure-CSS/SVG survey table + counters, relative units; drawer keycaps / status filters / map compass **wrap and center** (incomplete last row centers). Zero horizontal overflow at 360 (`scrollWidth === innerWidth`) — the map grid already uses `minmax(0,1fr)` tracks + `max-width:100%`. - **Tap targets ≥28px** (map cells, LOG VISIT, drawer keycaps, status lamps if interactive, board summaries 44px); **inputs ≥16px** (quest/note/query search + add fields, all already ≥16px in source). - **Reduced-motion:** SURVEY-SWEEP / PLOT-FIX / SLOT-SEAT / REEL / QUERY-SCAN all plain `animation` → global block collapses each to its resting frame. - **Desktop (≥1000px):** boards two-up under the glass (`.bay-board.span2`) with the permanent Director column; the map takes a wider plotting-table treatment. Desktop-only rules carry the `(hover:hover) and (pointer:fine)` gate (Suite 129 — no bare `min-width`). - **PWA intact:** markup/CSS/SVG + existing handlers over the working shell; no SW/scope change. Cache bump (Protocol 1) on the build commit only. --- ## 5. Game-agnostic story + game-specific identity opportunities (Protocol 38) Data-driven, no game branches: - **Map** from `FALLOUT_REGISTRY.zones` (per-game grid); collectible pips cross-ref `FALLOUT_REGISTRY.collectibles` + `lincolnMemorabilia` (per-game, `tracksLincoln` gated). No literal. *(Minor: `_MAP_ABBREV` is an FNV display-shortening lookup with a `[name] || name` fallback — FO3 zones simply show full names, no branch; harmless, flag only.)* - **Directives** from `state.quests` + `getRegistry('quests')` autocomplete (game-driven). - **CATALOG QUERY** = `_consultSearch` over the active registry/DB — already game-agnostic. - **Faction standings** in CHRONICLE via `getFactionRegistry()`. **Game-specific identity opportunities (owner asked — "feels like NV? adapts to FO3?"):** - **Map region caption** is the standout: `MOJAVE WASTELAND — SURVEY GRID` (NV) vs `CAPITAL WASTELAND — SURVEY GRID` (FO3). Author via a new **`identity.databank`** sub-block (mirroring `identity.overseer`/`operations`) — `mapCaption`, `recordsLabel`, board/BUS captions — with a generic literal fallback for an unauthored game (never another game's borrowed fiction). (Open Q6.) - **Signal-return pip label** already game-aware via `collectibleLabel` (SNOW GLOBE / BOBBLEHEAD). - **Chronicle framing** can lean NV-courier / Mojave vs FO3-wanderer / Capital via the same facet. --- ## 6. Fable mockup brief **Base:** a dedicated **`databank-records-bay.html`** (the map's complexity warrants its own file, mirroring the `operations-freight-console.html` / `tempo-dial.html` split) reusing the established casing / bezel / Director-column chrome. Fake all wiring; MetaStore/device-pref only; **zero campaign write**. **Query params (suggested):** `?game=fnv|fo3` · `?map=world|core|zoom` · `?quests=few|many` · `?qdrawer=all|active|complete|failed` · `?open=default|none|all` · `?catalog=empty|results`. **Screens & states to render (ALL at 360 / 412 / desktop; verify `scrollWidth === innerWidth`, zero console errors):** 1. **DATABANK — healthy default:** all 6 boards; CARTOGRAPHY TABLE + DIRECTIVE REGISTRY open, rest 0i `.panel-substatus` rows. The full-stack reference. 2. **CARTOGRAPHY TABLE:** (a) world grid full 6×6 with YOU-ARE-HERE fix + VISITED + amber `[?]` signal-returns + SURVEY-SWEEP; (b) core 4×4 (CHART SCALE toggle); (c) zoomed sector sheet with CURRENT/VISITED/UNKNOWN rows + MARK SURVEYED keys. 3. **DIRECTIVE REGISTRY:** numbered directive slots with ACTIVE/COMPLETE/FAILED status lamps; the status **drawer bank** (one open, count badges); a `many`-quests frame proving the bounded tray-scroll + search narrowing (`SHOWING n / total`); FILE DIRECTIVE slip; **(if Q3 approved)** a status-cycle key. 4. **CAMPAIGN CHRONICLE:** status counter boxes + notable-standings chips + the crossroads record spool + stamped incident milestones. 5. **CATALOG QUERY:** amber query line — prompt/empty state and a results state (catalog cards). 6. **FIELD NOTES:** ledger rows (manual bright vs auto-log `[T…]` dimmed) + FILE NOTE slip **(+ notes search if Q10)**. 7. **SERVICE TALLY:** odometer/counter bank (all 7 stats) + ZERO COUNTERS key. 8. **360 collapsed view:** every board to its 0i LED row — the short-stack phone proof. 9. **Desktop:** two-up `.span2` boards under the glass + permanent Director column; the map in its wider plotting-table treatment. 10. **Optional FO3 frame** (`?game=fo3`): map caption `CAPITAL WASTELAND`, FO3 zones, BOBBLEHEAD signal-returns, FO3 quest/faction flavor — proves the game-agnostic generalization before FO3 builds. **Deliverables:** `databank-records-bay.html` + PNGs at 360/412/desktop for states 1–9 + a `databank-notes.md` (like `operations-notes.md`) recording the board↔real-control mapping, the id-preservation contract, tap-target/overflow verification, and build invariants. --- ## 7. Recommended hero slice (build order) Per "light-frame ≠ done," **all six boards get their own identity** in the build — none merely framed. Recommended depth order for the first slice: - **Hero-three, deepest, this slice:** **CARTOGRAPHY TABLE** (the showpiece survey table), **DIRECTIVE REGISTRY** (numbered slots + status drawers + bounded tray — reuses shipped mechanics, fast + high-impact), and **CAMPAIGN CHRONICLE** (the record spool). - **The other three, also fully custom (not framed) in the same slice if scope allows:** **CATALOG QUERY** (amber index-catalog), **FIELD NOTES** (ledger), **SERVICE TALLY** (odometer bank). If scope must tighten, these three split to an immediate follow-up — but each still ships with its own identity, never a light frame. This mirrors OPERATOR's hero-three + OPERATIONS' hero-first cadence. --- ## 8. Build touchpoints (for the later implementation pass — not this task) - **Protocol 22/25:** reskin — every id/handler/state semantic preserved; render-fn template edits keep emitted ids + the map coord/fuzzy-match logic. Owner-approved-redesign guardrails hold (same tab/location, no added taps — status drawers are the same single-select as a filter, real labels ride as `.real-label` sub-labels, plain fallback preserved). - **Protocol 10/17:** render-check at 360/412/desktop, zero overflow, ≥28px/≥16px, reduced-motion-safe. - **Protocol 38:** game-agnostic (registry/DB/GAME_DEFS-driven); optional `identity.databank` facet for per-game map/record captions. - **Protocol 20/13/15/2a:** static guards for the new survey-table / directive-slot / drawer markup contract + regression tests in **both** runners at parity; cache bump (Protocol 1) on the build commit. - **Protocol 4/UI-6:** new device prefs only if adopted — last-open quest status-drawer (recommended, MetaStore) and optionally last-map-zoom (Open Q7). New write path only if the quest status-cycle (Q3) is approved (`setQuestStatus` + regression test). --- ## 9. Open questions (owner decisions) 1. **Board granularity.** Keep ~1:1 with today's 6 panels (recommended — preserves per-panel persistence + scope), or consolidate (e.g. fold FIELD NOTES + SERVICE TALLY into CAMPAIGN CHRONICLE as one "records" board)? Also: `#campgPanel` currently defaults `open` — move it into the 0i-collapsed set (heroes = map + quests) per the collapsed-summary standard? 2. **Hero #1 = CARTOGRAPHY TABLE.** Confirm the map is the showpiece and you want the full plotting-table treatment (SURVEY-SWEEP radar line, fog-of-war "UNSURVEYED" sectors, PLOT-FIX pulse), vs a more restrained map (grid + fog only, no sweep)? 3. **Quest status-cycle (track improvement).** Today a quest's status is set only at add + by the AI — no native post-add control. Add a per-slot **status-cycle key** (ACTIVE→COMPLETE→FAILED)? Small new write path; genuine "track" win. Recommend as a stretch. 4. **Quest status drawer bank.** Add ALL/ACTIVE/COMPLETE/FAILED drawers (one open at a time, mirroring CARGO) to bound the log on mobile? Recommend yes. 5. **CATALOG QUERY treatment.** Keep DATABANK search on DATABANK (recommended) and render it **amber** ("reference-retrieval over the wire"), or keep it green like the local records? 6. **`identity.databank` facet.** Add per-game DATABANK flavor now (map region caption `MOJAVE` vs `CAPITAL WASTELAND`, records framing), or keep generic until FO3 builds? 7. **Map zoom persistence.** Persist the last-zoomed sector across reload (MetaStore), or reset to the world grid on reload (current behavior, recommended)? 8. **Motion budget.** Confirm SURVEY-SWEEP + PLOT-FIX + SLOT-SEAT + REEL + QUERY-SCAN are wanted (all reduced-motion-safe), or keep DATABANK motion minimal (static map/records)? 9. **SERVICE TALLY framing.** Odometer/counter-bank treatment for session stats (reusing OPERATIONS' odometer language) — confirm, and confirm "CURRENT SITTING" stays a live duration. 10. **Field notes bound.** Add a bounded scroll + search/filter (manual vs auto-log) over CAMPAIGN NOTES (they can grow long) to bound mobile? Recommend yes. 11. **Amber/green split.** Confirm the proposed rationale: **green** = owned records + charted territory; **amber** = active query/scan + catalog retrieval; **red** = failed directives / hazards.
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).