Scenario UI — the poker table [UI]
From the Meridians Wiki · Public · Maintained · joint
One metaphor, skinned by the app theme: a poker table. The whole game is a single chrome-less fullscreen window (ScenarioModal); ScenarioShell lays it out like the domain WorkspaceShell so the two feel like one app. The active tab follows the human loop (Brief → Prepare → Commit → Consequence) while the structural read/write/scenario keys remain stable underneath. Showdown locks the table to Round. The turn logic is in flows/scenario-loop.
Screen regions
flowchart TB
subgraph WIN["Scenario window · fullscreen · chrome-less · theme-skinned"]
direction TB
subgraph BODY[" "]
direction LR
RAIL["**Seat rail**<br/>avatars · whose-turn ring ·<br/>AI vs human tell ·<br/>act-as-seat"]
subgraph MAIN["main column"]
direction TB
TABS["**Tab strip** — Round · World · Brief · Prepare · Talk ·<br/>Story · Continuity · Strategy · Impact · Record · Director Log"]
CENTER["**CENTER = active tab**<br/>ROUND: oval felt · seat pods · centre pedestal<br/>SHOWDOWN: full takeover — flips + inline Realism consequence<br/>STRATEGY: per-scene reasoning + Decision Matrices<br/>BRIEF / PREPARE / TALK: orient · author · coordinate"]
end
end
PBAR["**Phase + timer bar** — Brief → Prepare → Commit → Showdown → Consequence → Strategy · clock · +time"]
DOCK["**Bottom dock** — Director deck (Advance · Pause · End · Clear)<br/>⟷ impersonated hand (staked cards · conceal · raise · veto)"]
end
Component tree
flowchart TD
TopBar["TopBar — Play / Resume"] --> Modal["ScenarioModal — routes by lifecycle"]
Modal -->|no room| Setup["GameSetup — seat the table, set rules"]
Modal -->|ended| Report["GameReport — debrief"]
Modal -->|live| Shell["ScenarioShell"]
Shell --> Rail["Seat rail — act-as-seat"]
Shell --> Tabs["Tab strip — auto-advances with phase"]
Shell --> Bar["PhaseBar — stepper + clock"]
Shell --> Dock["GameBottomPanel — Director deck OR hand"]
Tabs --> Board["Round — live table"]
Tabs --> World["World — spatial board + travel"]
Tabs --> Persp["Brief — seat perspective"]
Tabs --> Write["Prepare — Streams + Priors"]
Tabs --> Chat["Talk — global + location whispers"]
Tabs --> Theory["Strategy — generated scenes · reasoning · Decision Matrices"]
Tabs --> Impact["Impact — attributed Fate movement + External"]
Tabs --> Record["Record — committed Stream history"]
Board -->|showdown| Show["Showdown — reveal + inline Realism consequence"]
Board -->|else| Felt["PokerTable — felt · seat pods · Fate odometer"]
Dock -->|impersonating| Hand["SeatHand / ScenarioCard"]
Dock -->|Director, resolve| Gen["GeneratePanel — review merge + generate"]
Show -->|Director steer| Refine["Refine consequence — winner fixed · re-read what follows"]
- Setup —
GameSetup: seat the table off a searchable, prominence-sorted roster (characters · units · locations · artifacts), AI Suggest cast by Characters / Units / Locations / Mixed, per-seat driver (agent / member / Director), then Rules (Showdown + Prepare/Commit clocks; conviction economy under Advanced). - Live board —
ScenarioShellwraps board + tabs + Director dock, surfaces the Generate Panel at Arc Gen, and carries the always-visible phase + timer bar.PokerTableis the felt (seats as avatar + conviction stack, rotating dealer button, centre pedestal, corner Impact).SeatHand/ScenarioCardis the act-as-seat hand. - Latest strategic read — the Strategy tab follows the round-to-Arc record: before a new continuation exists it retains the latest completed Arc analysis; once Arc Gen lands it switches to that generated continuation and preserves the mapping in round history. The Director and
/scenariosurfaces render the same scene-levelAnalysisTimeline; phones use its stacked decision field rather than squeezing the desktop matrix. - Home preview —
LobbyGamePreviewis the compact poker-table projection used by both the Games dashboard and the in-domain player picker. It receives the branch scene count in the cross-domain summary, shows the latest review's decision count, and uses a taller phone aspect so the centre read and seat pods remain legible. - Orchestration —
hooks/useScenariothreads the pure engine through the store and async generation (flows/scenario-loop). Agents are full participants. Types layer over shippedPerspective/Stream/Merge— see LANGUAGE.md.