MeridiansMeridians

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"]
  • SetupGameSetup: 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 boardScenarioShell wraps board + tabs + Director dock, surfaces the Generate Panel at Arc Gen, and carries the always-visible phase + timer bar. PokerTable is the felt (seats as avatar + conviction stack, rotating dealer button, centre pedestal, corner Impact). SeatHand / ScenarioCard is 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 /scenario surfaces render the same scene-level AnalysisTimeline; phones use its stacked decision field rather than squeezing the desktop matrix.
  • Home previewLobbyGamePreview is 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.
  • Orchestrationhooks/useScenario threads the pure engine through the store and async generation (flows/scenario-loop). Agents are full participants. Types layer over shipped Perspective / Stream / Merge — see LANGUAGE.md.