# Round 2 Tracking — Qatux (Documenter) ## v0.1 Content Scoping Workshop — CLOSING ROUND **Status:** All 7 responses received (Gestalt, Paula, Tyre, Dudley, Stig, Mellanie, SI). Workshop complete. **Date:** 2026-02-12 --- ## 1. Lead Decisions (Round 2 Brief) Four lead decisions were issued at the start of Round 2, resolving the major disagreements from Round 1: | ID | Decision | Round 1 Disagreement Resolved | |----|----------|-------------------------------| | **D-NPC** | Gestalt's mechanical mapping is canonical for v0.1. Paula's emotional/narrative layer becomes v0.2 annotations. | D-02 (10 of 17 NPC mapping disagreements) | | **D-FORMAT** | YAML for content files. RON converter available as optional build-time tool. | D-01 (YAML vs RON) | | **D-INTERACT** | Single context-sensitive action for v0.1. Multi-verb architecture modeled underneath from day one. | D-04 (Examine vs Talk: separate or combined) | | **D-PAUSE** | Spacebar always pauses (0% speed). UI overlays (knowledge panel, dialogue) trigger 50% sim speed. 3-state system. | D-05 (Knowledge panel pause behavior) | **Additionally resolved by lead direction:** - **D-03 (EntityKnowledge keys):** 16 total keys. 4 new generic role-perspective keys. `trust_read` merged into existing `trust_level`. `leverage_held` absorbs `secret_held`. `secret_confidence` renamed to `leverage_confidence`. (See Section 5.) - **R2-06 (PC voice registers):** Assigned to Mellanie as Round 2 task. - **R2-07 (Triangle fork cascade):** Self-contained forks confirmed. - **R2-09 (ObserverSnapshot v3):** Assigned to Tyre as Round 2 task. **Closing round additions (post-Round 2 responses):** - **Q-012 resolved:** 16 EntityKnowledge keys finalized (see Section 5). - **Q-013 resolved:** Server-authoritative pause. Client is a dumb renderer. NEW-12 (client pause state machine) killed. - **Q-016 resolved:** `actions[]` → `verbs[]` rename confirmed across server code, client code, YAML content, wiki docs, decision files. Folded into NEW-7. - **Process rule:** No ticket merges across domain teams. Shared epics are fine; each team gets its own ticket with its own definition of done. --- ## 2. Round 1 Disagreement Resolutions ### D-02 Resolved: NPC Pattern/Motivation Mapping Gestalt reviewed all 10 disagreements from Round 1 and **changed his position on 6 of 10**, adopting Paula's reads. Both agents converged on a single canonical mapping. | NPC | Round 1 Gestalt | Round 1 Paula | Round 2 Final | Who Prevailed | Gestalt's Rationale for Change | |-----|----------------|--------------|---------------|---------------|-------------------------------| | **Maret** (pattern) | SYSTEM | WITNESS | **WITNESS** | Paula | Story function > job description | | **Maret** (motivation) | WITNESS | SKEPTIC | **SKEPTIC** | Paula | WITNESS+SKEPTIC creates compositional tension | | **Resha** (motivation) | SKEPTIC | CIVILIAN | **CIVILIAN** | Paula | Innocent disruption > deliberate questioning | | **Harek** (pattern) | GHOST | ANCHOR | **ANCHOR** | Paula | Harek is physically present; contentment, not absent power | | **Drin** (pattern) | REMNANT | SYSTEM | **SYSTEM** | Paula | Station too young for REMNANT; SYSTEM+TURNCOAT = institutional rot | | **Sabel** (pattern) | THRESHOLD | GHOST | **GHOST** | Paula | Off-station = absent power, not gatekeeper | | **Olin** (motivation) | SKEPTIC (dual) | CIVILIAN | **CIVILIAN** | Paula | Dropped dual designation; 1 pattern + 1 motivation per NPC | | **Voss** (motivation) | OPERATOR | HANDLER | **OPERATOR** | Gestalt | Voss RUNS the schedule; middle management operating machinery | | **Devra** (motivation) | HANDLER | OPERATOR | **HANDLER** | Gestalt | Devra conveys Nils's strategy; pressure from above | | **Sess** (pattern) | ANCHOR | NOBODY | **ANCHOR** | Gestalt | NOBODY deferred to v0.2; ANCHOR at T3 = contentment as texture | **Paula's response:** Accepted the versioned approach. Annotated all 10 disagreement NPCs with v0.2 emotional layer descriptions. Each annotation specifies what content the v0.2 motivation/pattern unlocks (~30-50 lines per NPC). ### D-01 Resolved: YAML Format **Dudley accepts YAML.** One-line change: `serde_yaml::from_str()` replaces `ron::from_str()`. Multi-line YAML blocks (`|`) improve author experience. RON crate retained for potential future use. ### D-04 Resolved: Examine vs Talk **Converged on: conceptually separate, v0.1 ships single action.** The server models both verbs internally; priority resolution determines which surfaces as the `[E]` prompt. Post-contradiction, Examine can become primary (detective investigating a flagged NPC). The v0.2 client reads the full action list — no server changes needed. ### D-05 Resolved: Pause System **3-state system adopted by all respondents.** Gestalt, Stig, and Dudley each independently designed compatible state machines. --- ## 3. Definitive v0.1 NPC Mapping The canonical mapping, produced by Gestalt with 6 changes from Paula's input: | # | Name | Tier | Pattern | Motivation | Composition Read | |---|------|------|---------|-----------|-----------------| | 1 | **Kael Davan** | **T1** | **FRIEND** | **OPERATOR** | Trust anchor running ring cargo | | 2 | **Sera Venn** | **T1** | **FRIEND** | **WITNESS** | Trust anchor carrying unreported evidence | | 3 | **Naia Tamm** | **T1*** | **MIRROR** | **CIVILIAN** | Honest transparency, no secrets | | 4 | **Voss** | T2 | **SYSTEM** | **OPERATOR** | Institutional authority operating the schedule | | 5 | **Lera Sessik** | T2 | **ANCHOR** | **OPERATOR** | Contentment embodied, running a bar on willful ignorance | | 6 | **Torek Lintar** | T2 | **CATALYST** | **CIVILIAN** | Spending disrupts equilibrium | | 7 | **Devra** | T2 | **THRESHOLD** | **HANDLER** | Ring gatekeeper, manages operations from above | | 8 | **Maret Korr** | T2 | **WITNESS** | **SKEPTIC** | Accidentally observed discrepancies, doubts the numbers | | 9 | **Resha** | T2 | **CATALYST** | **CIVILIAN** | New hire forcing defensiveness with innocent questions | | 10 | **Drin** | **T2** | **SYSTEM** | **TURNCOAT** | Inspector whose compromise corrupts the institution | | 11 | **Renn** | T2 | **THRESHOLD** | **OPERATOR** | Courier controlling cargo flow | | 12 | **Pell** | T2 | **CATALYST** | **TURNCOAT** | Wavering member forcing potential crisis | | 13 | **Harek** | T2 | **ANCHOR** | **HANDLER** | Complacent contentment whose comfort creates a tool | | 14 | **Sess** | T3 | **ANCHOR** | **CIVILIAN** | Quiet contentment behind the bar | | 15 | **Olin** | T3 | **CATALYST** | **CIVILIAN** | New arrival forcing evaluation | | 16 | **Sabel** | T3 | **GHOST** | **OPERATOR** | Off-station absent power running the supply chain | | 17 | **Tav** | T3 | **SYSTEM** | **CIVILIAN** | Ring lookout following procedure | **Off-stage:** Nils Davan — GHOST + HANDLER **Distribution:** 8 of 9 patterns present (REMNANT correctly absent; NOBODY deferred to v0.2). All 6 motivations present. CIVILIAN at 6/17 (35%) matches D-029 noise floor (~30%). --- ## 4. Key Architecture Convergences ### 4.1 Multi-Verb Interaction Architecture Tyre, Dudley, and Stig independently produced compatible designs: | Agent | Contribution | Compatible? | |-------|-------------|-------------| | **Tyre** | `AvailableActions` per entity with priority-sorted `ActionOption` list; `ActionKind` enum; `InteractPrimary` vs `InteractWith` PlayerAction variants | Canonical design | | **Dudley** | `EntityInteractions` with `AvailableAction` list; server-side `rank_actions()` priority system; `PlayerAction::InteractWith` for v0.2 | Compatible — naming differs, structure identical | | **Stig** | `InteractionOptions` with `primary`/`secondary` fields; v0.2 extension reads `actions[]` array; world-space prompt renderer | Client-side compatible | **Minor naming divergence:** Tyre uses `AvailableActions`/`ActionOption`, Dudley uses `EntityInteractions`/`AvailableAction`. These are the same concept. **Lead confirmation (closing round):** `actions[]` → `verbs[]` rename confirmed. Scope: server code, client code, YAML content files, wiki docs, decision files. Folded into NEW-7 ticket description. **Key design principles (unanimous):** - Server computes N available verbs per entity every tick - v0.1 client shows only priority-0 verb (single `[E]` prompt) - v0.2 client renders full list — no server changes needed - Context-sensitive priority (post-contradiction: Examine rises above Talk) - `InteractionOptions`/`AvailableActions` embedded in ObserverSnapshot, not separate message - Server is authoritative; client never queries content files ### 4.2 Pause System (3-State) | State | Speed | Trigger | All 3 Agree? | |-------|-------|---------|-------------| | **Normal** | 100% (1.0) | Default | Yes | | **Overlay** | 50% (0.5) | Knowledge panel, dialogue | Yes | | **Paused** | 0% (0.0) | Spacebar (always) | Yes | **Gestalt:** Multiplicative toggle model (`effective_speed = if pause_override { 0.0 } else { base_speed * ui_modifier }`). Multiple overlays don't stack (50% stays 50%). v0.2 extension: panel + dialogue could = 25%. **Stig:** GDScript `PauseManager` with `SimState` enum, `_pre_pause_state` tracking for resume, overlay count tracking. Spacebar from OVERLAY_ACTIVE goes to PAUSED (not RUNNING). Questions for Dudley: does server need pause signals, or does client control? **Dudley:** `SimSpeed` enum resource with `speed_stack` (priority-based). `SimSpeed::Overlay` ticks every 2nd frame. Server is authoritative over tick advancement. `sim_speed: f32` field in ObserverSnapshot tells client the current rate. **Resolved (closing round):** Server-authoritative pause. Tick rate is a server simulation concern. Client is a dumb renderer — it renders ObserverSnapshots at whatever rate the server sends them. Client sends a pause IPC command to the server; that's it. Stig's `PauseManager` GDScript is reduced to sending IPC commands and reading `sim_speed` from the snapshot for visual feedback. **NEW-12 (client pause state machine) killed** — client doesn't manage time. ### 4.3 ObserverSnapshot v3 Tyre and Dudley independently produced v3 definitions. They are structurally identical: | Field | Tyre's Proposal | Dudley's Proposal | Status | |-------|----------------|-------------------|--------| | `sim_speed: f32` | Yes (default 1.0) | Yes | Agreed | | `nearby_interactions` | `Vec` | `Vec` | Agreed (naming differs) | | `active_dialogue` | `Option` | `Option` | Agreed | | `monologue` | `Vec` | `Vec` | Agreed | | `overheard` | `Vec` | `Vec` | Agreed (naming differs) | | `knowledge_updates` | `Vec` | Not in Dudley's R2 snapshot | Tyre adds delta updates | | `examine_result` | `Option` | Not in Dudley's R2 snapshot | Tyre adds | | `ticker_headlines` | `Vec` | Not in Dudley's R2 snapshot | Tyre adds | **Wire size estimate (Tyre):** v3 adds ~50-1500 bytes per tick on top of v2's 2-8 KB. Total: ~2-10 KB/tick at 10 tps = 20-100 KB/s. Well within IPC budget. **Backward compatibility:** MessagePack serializes by field name. New fields use `#[serde(default)]`. v2 client reading v3 snapshot ignores unknown fields. v3 client reading v2 snapshot gets empty defaults. ### 4.4 Content Directory + Schema Tyre produced the definitive directory tree and JSON Schema definitions: **Directory structure:** `content/content.yaml` (manifest) + `content/schema/` (JSON Schema files) + `content/global/` (facts, factions, enums, entity-schema) + `content/districts/sova-transit/` (npcs/, locations/, triangles/, dialogue/, monologue/, routines/). **Schemas defined:** - `npc-profile.schema.json` — Full NPC profile with tier-conditional fields, pattern/motivation enums, axes, tells, access tiers, trust levels, friend_arc, triangle membership - `dialogue-pool.schema.json` — Tagged dialogue lines per D-028/D-035. Role + location based, with access/trust/situation gating and knowledge_grants - `monologue-pool.schema.json` — Character-partitioned (D-032). Trigger + prerequisite (AND-only) + priority + cooldown. 160 char max per Stig **Validation pipeline (3-tier):** 1. Authoring time: IDE with JSON Schema autocomplete 2. Build time (`make content-validate`): JSON Schema + cross-reference validation 3. Load time: serde_yaml deserialization + semantic validation (StableId assignment, relationship wiring) ### 4.5 YAML + RON Converter | Aspect | Tyre | Dudley | Status | |--------|------|--------|--------| | Content format | YAML | YAML (accepted) | Agreed | | RON converter location | `tooling/content-tools/` | `tooling/content-converter/` | Minor naming difference | | When converter runs | Build-time optional | Build-time optional, low priority | Agreed | | Development loading | YAML direct | YAML direct | Agreed | | Production loading | RON cache preferred, YAML fallback | YAML (RON is insurance) | Agreed — YAML in v0.1, RON as future optimization | Tyre provides dual-format loader (~20 lines) with `load_with_cache()` fallback pattern. `content/.cache/` is gitignored. --- ## 5. EntityKnowledge Keys — RESOLVED: 16 Keys Both Gestalt and Paula independently arrived at the same conclusion: **generic perspective keys, not per-archetype keys.** This resolves D-03 from Round 1. ### Convergence (Round 2 Responses) | Point | Gestalt | Paula | Converged? | |-------|---------|-------|-----------| | Per-archetype keys are unsustainable | Yes (32 archetype-specific + 14 shared = 46 total) | Yes (same conclusion) | **Yes** | | Generic keys work for all 8 archetypes | Yes | Yes | **Yes** | | Interpretation lives in content, not schema | Yes (monologue pools provide character-specific meaning) | Yes (archetype brief + voice register + moral arc) | **Yes** | | `social_debt` deferred to v0.2 | Yes | Accepts | **Yes** | | `loyalty_conflict` deferred to v0.2 | Yes (inferable from `behavior_flags` + `reliability`) | Accepts | **Yes** | ### Final Resolution (Closing Round Lead Decision) **16 total EntityKnowledge keys.** 12 existing shared keys + 4 new generic role-perspective keys. Key merges and renames applied: #### 4 New Role-Perspective Keys (observer→target, all archetypes) | Key | Value Enum | What It Stores | |-----|-----------|---------------| | `risk_assessment` | `none`, `low`, `moderate`, `high`, `critical` | How this NPC threatens the observer's position (exposure, obstruction, liability, competition — archetype-dependent) | | `loyalty_assessment` | `solid`, `dependable`, `uncertain`, `wavering`, `hostile` | How predictably this NPC serves the observer's interests | | `position_integrity` | `solid`, `thin`, `cracking`, `blown`, `N/A` | Status of active deception involving this NPC (cover, reputation, facade) | | `moral_weight` | `innocent`, `peripheral`, `complicit`, `compromised`, `willing` | Observer's subjective moral assessment within their ethical framework | **Key names adopt Paula's naming** (`risk_assessment` over `threat_to_position`, `position_integrity` over `facade_status`). **Value enums adopt Gestalt's archetype-neutral vocabulary.** #### Key Merges and Renames | Action | Old | New | Rationale | |--------|-----|-----|-----------| | **Merge** | `trust_read` | `trust_level` (existing) | "Read is the action, level is the end state." Same key, per-character interpretation. | | **Absorb** | `secret_held` | `leverage_held` (existing, renamed) | "Secret is a subtype of leverage." Value space expanded: secrets, debts, promises, obligations, compromising positions. | | **Rename** | `secret_confidence` | `leverage_confidence` | Follows `secret_held` → `leverage_held` rename. | | **Defer** | `social_debt` | v0.2 | 30-minute session doesn't develop favor economy. | | **Defer** | `loyalty_conflict` | v0.2 | Inferable from `behavior_flags` + `loyalty_assessment`. | | **Not added** | `tell_observed`, `contradiction_flagged` | — | Tracked in `behavior_flags` (existing). No 7th key needed. | #### Final Key Inventory (16 total) | # | Key | Category | New/Existing | |---|-----|----------|-------------| | 1 | `name` | Identity | Existing | | 2 | `role` | Identity | Existing | | 3 | `faction` | Identity | Existing | | 4 | `species` | Identity | Existing | | 5 | `location` | Spatial | Existing | | 6 | `routine_pattern` | Behavioral | Existing | | 7 | `trust_level` | Relational | Existing (absorbs `trust_read`) | | 8 | `leverage_held` | Relational | Existing (renamed from `secret_held`, expanded value space) | | 9 | `leverage_confidence` | Relational | Existing (renamed from `secret_confidence`) | | 10 | `relationship_state` | Relational | Existing | | 11 | `behavior_flags` | Behavioral | Existing (tracks tells + contradictions) | | 12 | `known_associates` | Social | Existing | | 13 | `risk_assessment` | **Role-perspective** | **NEW** | | 14 | `loyalty_assessment` | **Role-perspective** | **NEW** | | 15 | `position_integrity` | **Role-perspective** | **NEW** | | 16 | `moral_weight` | **Role-perspective** | **NEW** | **This scales to all 8 archetypes without modification.** Interpretation lives in content (monologue pools, voice registers, archetype briefs), not schema. The smuggler reads `risk_assessment: "high"` as exposure risk; the detective reads it as obstruction risk; the administrator reads it as political liability. Same key, same enum, different meaning. --- ## 6. FriendArc Phase Transitions (Dudley) Dudley produced the definitive 4-phase state machine with explicit trigger code: | Phase Transition | Trigger | Content Dependency | |-----------------|---------|-------------------| | **Warmth → Trust** | Interaction count (>=3) + time elapsed (>=600 ticks / 1 game-hour) | 5-8 casual dialogue + 3-5 positive monologue | | **Trust → Doubt** | Knowledge threshold — observer learns a doubt-triggering fact at KnowsOf+ | 5-8 deeper dialogue + 3-5 questioning monologue | | **Doubt → Conflict** | Direct observation of contradiction (`contradiction_discovered` flag) | **1 critical monologue line** (wow moment #3) + 8-12 confrontation dialogue | **Contradiction spatial staging:** Server schedules NPC routine deviation (Kael in Corridor B-7 during shift transition). The `check_contradiction_observation` system checks: (1) FRIEND at contradiction location, (2) within time window, (3) bonded character has Direct confidence (LOS). All 5 state changes must happen atomically within one tick: knowledge graph updated, FriendArc phase advanced, RelationshipState changed (Friendly → PersonOfInterest), monologue triggered (urgent), entity color shifted (green → amber). **Content required per FRIEND NPC:** ~35-46 authored lines minimum. Both FRIEND NPCs: ~70-92 lines. Aligns with D-034 estimate. **New component:** `InteractionLog` — BTreeMap tracking (target_stable_id, tick) pairs. Supports Warmth→Trust transition and future NOBODY tier promotion. --- ## 7. PC Voice Registers (Mellanie) Mellanie produced canonical voice register specifications for both playable characters: ### Smuggler — Internal Voice Register **One-line summary:** Watches people, not systems. Thinks in fragments. Worries about friends practically, physically, with the knot in the stomach. | Parameter | Value | |-----------|-------| | Sentence length | Short. Fragments welcome. Rarely >2 sentences. | | Vocabulary | Concrete, physical, sensory. Trade jargon without explanation. | | Emotional register | Feeling-first, analysis second. | | Relationship mode | First-name basis. People defined by connection, not role. | | Observation priority | People > environment > objects. | | Self-reference | Rare. Through physical sensation, not emotional vocabulary. | | Humor | Dry, situational, understated. Dark when stressed. | **5 voice anchors provided:** Baseline warm, Operational, Concerned, Hurt, Atmospheric. **4 anti-patterns defined:** Too clinical, institutional vocabulary, analytical distance, explaining known facts. ### Detective — Internal Voice Register **One-line summary:** Categorizes first, feels second. Thinks in complete sentences. Institutional training runs in the background. | Parameter | Value | |-----------|-------| | Sentence length | Complete but not long. More structured than smuggler. | | Vocabulary | Institutional layer over plain speech. "Noted," "flagged," "filed it." | | Emotional register | Analysis-first. Personal breaks through as notable cracks. | | Relationship mode | Surname-first for targets. First-name for allies. The shift IS a marker. | | Observation priority | Patterns > people > environment. Counts things, tracks frequencies. | | Self-reference | More common, always through professional lens. | | Humor | Wry, observational. Appreciates irony at a distance. | **5 voice anchors provided.** 4 comparison examples (same trigger, two characters) demonstrating voice distinctness. ### Display Constraints (Mellanie confirms Stig's R1 proposal) | Constraint | Value | |-----------|-------| | Max length | ~160 characters (hard ceiling) | | Target range | 80-120 characters (most lines), 40-80 (ideal) | | Max visual lines | 2 | | Word target | 10-18 words (14 average) | | Display time | 4-6 seconds (length-adjusted) | | Character tint | Smuggler: amber-white `#f0e0c8`, Detective: blue-white `#c8d8f0` | --- ## 8. THE FRIEND Content Pack — Kael Davan (Mellanie) Mellanie mapped the complete Kael Davan content pack structure: | Content Type | Lines | Phase Distribution | |-------------|-------|-------------------| | Kael dialogue | 36 | Terminal: 17, Bar: 13, Corridor: 6 | | Smuggler monologue about Kael | 18 | 5 phases (Comfort 4, First Crack 4, Contradiction 3, Confrontation 3, Contaminated Trust 4) | | Detective monologue about Kael | 10 | Identification 2, Behavioral 3, Suspicion 3, Informant 2 | | Tell observation lines | 8 | Lattice 2, Shortened 2, Looks-left 2, Spatial 2 | | Trust-gated lines | 13 | Insider 6, Close colleague 4, Secret hints 3 | | Unprompted lines | 6 | Early warmth 3, Late warnings 3 | | **PACK TOTAL** | **91** | Within D-034 range (70-100) | **Phase distribution analysis:** - Phase 1 (Comfort): 21 lines (23%) — heavy on dialogue, light on monologue - Phase 2 (First Crack): 13 lines (14%) — tells ramp up - Phase 3 (Contradiction): 7 lines (8%) — fewest lines, highest stakes - Phase 4 (Confrontation): 16 lines (18%) — dialogue-heavy - Phase 5 (Contaminated Trust): 16 lines (18%) — voice discipline critical - Cross-phase: 16 lines (18%) **Sample YAML lines provided** for each phase demonstrating prerequisite progression. Format aligns with Tyre's `monologue-pool.schema.json`. **695 total validation (Mellanie clarifies):** 695 is the authored floor. Does not include generation-expanded output (D-028: "write 10, generate 40" for dialogue). Does not include engine-generated content (routine greetings, time-of-day variations). --- ## 9. UI Specifications Confirmed (Stig) ### Updated Bill of Materials | System | Scenes | Scripts | Shaders | Priority | |--------|--------|---------|---------|----------| | Monologue renderer | 1 | 1 | 0 | P0 | | Interaction prompt | 1 | 1 | 0 | P0 | | Dialogue panel | 1 | 1 | 0 | P0 | | Entity color system | 0 | 1 | 1 | P0 | | Pause manager | 0 | 1 | 0 | P0 | | HUD bar | 1 | 1 | 0 | P1 | | Minimap | 1 | 1 | 1 | P1 | | Knowledge panel | 1 | 1 | 0 | P1 | | News ticker | 1 | 1 | 0 | P1 | | Fog rendering | 0 | 0 | 1 | P0 | | **TOTAL** | **7** | **9** | **3** | | **Changes from Round 1:** Reduced from 9 scenes to 7. Added 1 shader (fog rendering). Pause manager added (P0, new in R2). ### Monologue Display Parameters (Stig, confirmed by Mellanie) | Parameter | Value | |-----------|-------| | Max characters | 160 | | Max lines | 2 | | Base duration | 4.0s | | Short duration (<80 chars) | 3.0s | | Urgent chime duration | 5.0s | | Fade in | 0.3s | | Fade out | 0.5s | | Interruption fade | 0.15s | | Cooldown between lines | 2.0s minimum | | Max queue depth | 1 (drop lower-priority) | **Priority ordering:** observe_anomaly (1) > witness_interaction (2) > discover_evidence (3) > post_conversation (4) > hear_sound (5) > observe_npc (6) > enter_location (7) > return_visit (8) > time_idle (9). **Critical UI interaction:** Monologue fires during dialogue (for wow moment #3). Monologue sits in world layer; dialogue sits in HUD layer. Two voices simultaneously — one external, one internal. ### Interaction Prompt — Single-Action Extensible v0.1: `[E] Talk` / `[E] Examine` — single keybind, context-sensitive verb. v0.2: `[E] Talk [F] Observe` — horizontal label row, same prompt position. The `verbs[]` field (renamed from `actions[]` per D-060) exists in the protocol from day one. The v0.1 client ignores it. The v0.2 client reads it. No protocol change needed. --- ## 10. Ticket Analysis — Finalized (SI) ### Lead Decision Impact on Tickets | Decision | Ticket Impact | |----------|---------------| | D-NPC | NEW-1 simplified to "apply Gestalt's mapping." Paula's layer → v0.2 annotation. | | D-FORMAT | Confirms C-series as YAML. Adds NEW-8 (RON converter). | | D-INTERACT | NEW-7 reframed. Adds NEW-9 (server InteractionOptions) + NEW-10 (client extensible prompt). | | D-PAUSE | Adds NEW-11 (server tick rate scaling). ~~NEW-12 (client pause state machine)~~ **killed in closing round** — client is a dumb renderer. | ### Final Ticket Count | Category | Count | Teams | |----------|-------|-------| | Wiki fixes (A-series) | 8 | copy | | Style guides & specs (B-series) | 5 | copy | | Content directory & schema (C-series) | 10 | copy (1), server (8), ci (1) | | Design specs (D-series) | 2 | server (1), copy (1) | | Round 1 new tickets (NEW 1-7) | 7 | copy | | Round 2 new tickets (NEW 8-13) | 5 | server (4), client (1) | | **Total new tickets** | **37** | **copy (21), server (13), client (1), ci (1)** | | Existing ticket updates | 10 | — | **Delta from Round 1:** +5 tickets (NEW-8 through NEW-13 from lead decisions, minus NEW-12 killed in closing round). Removed: D3 (killed), A5 (deferred), D1 (deferred), NEW-12 (killed — client doesn't manage time). Merged: A3 into #319, #310 into B4. ### Sprint 3 Allocation **Copy team (15 tickets):** - P0: #261 (Dual Lens Guide, **critical path root**), C1 (Content directory design), A1 (canonical names), A2 (Naia Tamm rename), A7 (smuggler attributes) - P1: B2 (MIRROR spec), B4 (smuggler voice + moral arc), NEW-1 (NPC mapping), NEW-5 (wow moment checklist), A10 (Nils stub), A11 (Triangle 1 fix) - P2: B3 (PC-as-NPC), A8 (shortcode fix), NEW-2 (Drin expansion), NEW-7 (interaction verb spec) **Server team (4 additions):** C2 (directory skeleton), C3 (schemas), NEW-9 (InteractionOptions), NEW-11 (tick rate scaling) **Client team (1 addition):** NEW-10 (extensible prompt). ~~NEW-12 killed~~ — client sends pause IPC command; server manages tick rate. ### Critical Path (Revised) Two parallel chains: **Chain 1 — Content Authoring:** ``` #261 (Dual Lens Guide) [P0, ROOT] -> B4 (Smuggler voice + moral arc) -> A6 (Smuggler FactId text) [Sprint 4] -> NEW-4 (Monologue pool ~200 lines) [Sprint 5] -> #297 (FRIEND: Kael) [Sprint 5] -> #298 (FRIEND: Sera) [Sprint 5] -> #190, #191, #192 (Content packs) [Sprint 5] ``` **Chain 2 — Content Architecture:** ``` C1 (Content dir design) [P0] -> C2 (skeleton) + C3 (schemas) [Sprint 3] -> C4-C8 (YAML population) [Sprint 4] -> NEW-3 (wiki->YAML conversion) [Sprint 4] -> #326 (YAML loader) [Sprint 4] -> C9 (validator) [Sprint 4] ``` **Independent chains (Sprint 3):** - A10 (Nils stub) → A11 (Triangle 1 fix) - NEW-9 (InteractionOptions, server) → NEW-10 (extensible prompt, client) - NEW-11 (tick rate scaling, server) — no client counterpart (client reads `sim_speed` from snapshot) ### Risks (SI) 1. **#261 remains critical path root.** Every content authoring ticket flows through it. Recommended: assign Paula, time-box 5 days. 2. **Sprint 3 copy team has 15 tickets.** 7 are small/parallelizable. Real load: #261, C1, B2, B4, A11. 3. **Server Sprint 3 already heavy** (10 existing + 4 new). C2/C3 blocked by C1 anyway. 4. **Content conversion (NEW-3) is Sprint 4 bottleneck.** Start with 3 Tier 1 NPCs as soon as C2 lands. --- ## 11. Wiki Fix Execution Plan (Paula) Paula produced execution-ready content changes for each priority level: | Priority | Change | Files | Status | Effort | |----------|--------|-------|--------|--------| | P0-1 | Naia Tamm rename | 16 files | Exact per-file changes specified | ~2 hours | | P0-2 | Nils Davan stub | 1 new + 3 cross-ref | Full draft ready | ~30 min | | P0-3 | Drin Tier 2 expansion | 1 rewrite + index | Full draft ready | ~1 hour | | P1-1 | Canonical names | 10 headers + index | Name table ready; 3 need Miri validation | ~1 hour | | P1-2 | Triangle 1 escalation fork | index + 2 NPC notes | Self-contained version (v0.1) | ~1 hour | | P2-1 | Smuggler-lens sections (17 NPCs) | 17 profiles | Template ready; per-NPC content needed | ~8-10 hours | | P2-2 | PC-as-NPC profiles | 2 new files | Gap identified; not yet drafted | ~3-4 hours | | P2-3 | FactId catalog smuggler entries | 1 file | Gap identified; not yet drafted | ~2 hours | **P0-1 and P0-2 can start immediately.** P0-3 blocked by A-01 formalization (consensus confirmed). P1-1 blocked by Miri validation (3 names). P1-2 depends on P0-2. **P1-2 (Triangle 1) — self-contained revision:** Cross-triangle cascade removed per D-INTERACT. Path B no longer triggers Maret's discovery. Path C no longer makes detective investigation easier. Emotional weight preserved within Triangle 1. --- ## 12. Dependencies Matrix | Agent | Waiting On | From | Blocks | Status | |-------|-----------|------|--------|--------| | **Stig** | IPC message format (ObserverSnapshot v3 struct) | Dudley/Tyre | All client UI | Open | | ~~**Stig**~~ | ~~Pause architecture decision~~ | ~~Dudley~~ | ~~Pause manager~~ | **Resolved** — server-authoritative | | **Stig** | Font selection, diegetic styling | Araminta | Knowledge panel visual | Open | | **Stig** | First monologue content (5-10 lines) | Mellanie | Monologue renderer testing | Open | | **Dudley** | ObserverSnapshot v3 sign-off | Tyre | Protocol implementation | Open | | **Dudley** | FactId catalog (machine-readable) | Gestalt/Paula | Prerequisite evaluation | Open | | **Dudley** | FRIEND content packs (phase-tagged) | Mellanie | FriendArc integration testing | Open | | **Dudley** | Contradiction spatial data (location, time window) | Paula | Spatial staging system | Open | | **Mellanie** | Content directory confirmed | Tyre | File structure for packs | Open | | **Mellanie** | FactId catalog stabilized | Gestalt/Paula | Prerequisite placeholders | Open | | ~~**Mellanie**~~ | ~~EntityKnowledge key resolution~~ | ~~Lead~~ | ~~Prerequisite vocabulary~~ | **Resolved** — 16 keys, 4 role-perspective | | **Paula** | Miri validation (3 NPC surnames) | Miri | Canonical name application | Open | --- ## 13. Decisions Ready to Formalize ### From Lead's Round 2 Decisions | Proposed ID | Decision | Source | |-------------|----------|--------| | D-049 | **YAML is the content file format for v0.1.** RON converter available as optional build-time tool in `tooling/`. Server loads YAML directly in development; RON cache is a production optimization. | D-FORMAT lead decision; Tyre design; Dudley acceptance | | D-050 | **Gestalt's NPC pattern/motivation mapping is canonical for v0.1.** Paula's emotional/narrative layer becomes v0.2 annotations. Version-toggle approach: same NPCs, different analytical depth per version. | D-NPC lead decision; Gestalt definitive table; Paula versioned layer | | D-051 | **v0.1 ships single context-sensitive action; multi-verb architecture modeled underneath.** Server computes N available actions per entity. v0.1 client shows priority-0 only. v0.2 client reads full list. No server changes for v0.2 multi-verb. | D-INTERACT lead decision; Tyre architecture; Dudley implementation; Stig client design | | D-052 | **3-state pause system: Normal (100%), Overlay (50%), Paused (0%). Server-authoritative.** Spacebar always pauses from any state. UI overlays (knowledge panel, dialogue) trigger 50% speed. Multiple overlays don't stack below 50%. Spacebar resumes to pre-pause state. **Server controls tick rate; client is a dumb renderer.** Client sends pause IPC command to server. Client reads `sim_speed` from ObserverSnapshot for visual feedback. NEW-12 (client pause state machine) killed. | D-PAUSE lead decision + closing round resolution; Gestalt mechanical design; Dudley server SimSpeed authoritative | | D-053 | **Self-contained triangle forks for v0.1.** Independent decision state machines, shared NPC state. No cross-triangle cascade. Players observe cross-triangle effects emergently through NPC behavior. v0.2 adds storyteller-managed cascade. | Gestalt confirmation; Tyre recommendation (R1); Paula revised Triangle 1 | | D-054 | **ObserverSnapshot v3 protocol.** Extends v2 with: sim_speed, nearby_interactions, active_dialogue, monologue, overheard, knowledge_updates, examine_result, ticker_headlines. Backward compatible via serde defaults. Wire overhead ~50-1500 bytes/tick. | Tyre full definition; Dudley compatible definition | | D-055 | **16 EntityKnowledge keys total. 4 new generic role-perspective keys: `risk_assessment`, `loyalty_assessment`, `position_integrity`, `moral_weight`.** All observer→target. `trust_read` merged into existing `trust_level`. `secret_held` renamed to `leverage_held` with expanded value space (secrets, debts, promises, obligations, compromising positions). `secret_confidence` renamed to `leverage_confidence`. `social_debt` and `loyalty_conflict` deferred to v0.2. `tell_observed` and `contradiction_flagged` tracked in existing `behavior_flags` — no dedicated keys. Scales to all 8 archetypes without schema changes. | Gestalt generic architecture; Paula generic architecture; closing round lead resolution | | D-056 | **PC voice registers defined.** Smuggler: feeling-first, fragments, concrete/physical, first-name basis. Detective: analysis-first, complete sentences, institutional vocabulary, surname-first for targets. Both characters have 5 voice anchors, 4 anti-patterns, and 4 comparison examples. | Mellanie canonical specifications | | D-057 | **Content directory structure: `content/` with `schema/`, `global/`, `districts/` top-level split.** JSON Schema validation at build time. Dialogue by location + role (not NPC). Monologue partitioned by character. `canonical_id` format: `npc:{slug}`, `loc:{district}:{location}`. | Tyre finalized tree + schema definitions | | D-058 | **THE FRIEND content pack template: Kael Davan.** 91 lines across 5 arc phases + cross-phase. Pack validates tag taxonomy, load correctness, trigger appropriateness. Structure becomes template for all subsequent content packs. | Mellanie pack structure + sample YAML | | D-059 | **Monologue display constraints.** 160 char max, 2-line max, 4-6s display time, 2s cooldown, queue depth 1 (drop lower priority), 9-level priority ordering with observe_anomaly highest. | Stig constraints; Mellanie adoption | | D-060 | **`actions[]` renamed to `verbs[]` across all surfaces.** Scope: server code, client code, YAML content files, wiki docs, decision files. Folded into NEW-7 ticket description. | Closing round lead decision | | D-061 | **No ticket merges across domain teams.** Shared epics are fine, but each team gets its own ticket with its own definition of done. | Closing round lead decision (process rule) | ### From Round 1 (Carried Forward — Unchanged) | Proposed ID | Decision | Source | |-------------|----------|--------| | D-042 | Drin promoted from Tier 3 to Tier 2 | Round 1 consensus (A-01) | | D-043 | THE NOBODY mechanic deferred to v0.2; hidden data ships in v0.1 | Round 1 consensus (A-02) | | D-044 | v0.1 interaction model: 7 interactions (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear) | Round 1 consensus (A-04) | | D-045 | v0.1 scope: add News ticker, PC-as-NPC, Time progression, Relationship state transitions to IN list | Round 1 consensus (A-14, A-15, A-16) | | D-046 | v0.1 scope: add Inventory, Stealth, Combat, Player-facing save/load, Lattice modification to explicit OUT list | Gestalt (Round 1) | | D-047 | v0.1 triangles: 3 active forks (T1, T2, T4), 2 passive tensions (T3, T5) | Round 1 consensus (A-07) | | D-048 | Client receives all text from server via state updates; client does not load or evaluate content files | Round 1 consensus (A-12) | --- ## 14. Open Items ### Resolved in Closing Round | # | Item | Resolution | Decision | |---|------|-----------|----------| | Q-012 | EntityKnowledge generic key count: 4 vs 6 | **16 total keys.** 4 new role-perspective (`risk_assessment`, `loyalty_assessment`, `position_integrity`, `moral_weight`). `trust_read` → `trust_level` (merge). `secret_held` → `leverage_held` (absorb + expand). `secret_confidence` → `leverage_confidence` (rename). `tell_observed`/`contradiction_flagged` tracked in `behavior_flags`. No 7th key. | D-055 | | Q-013 | Pause authority: client vs server | **Server-authoritative.** Client is a dumb renderer. Sends pause IPC command. Reads `sim_speed` from snapshot. NEW-12 killed. | D-052 (updated) | | Q-016 | `actions[]` → `verbs[]` scope | **Confirmed across all surfaces:** server code, client code, YAML content, wiki docs, decision files. Folded into NEW-7. | D-060 | ### Still Open | # | Item | Owner | Status | Priority | |---|------|-------|--------|----------| | Q-014 | 3 NPC surnames awaiting Miri validation: Drin Vassar, Sess Torin, Tav Lenn. | Miri | Blocked on world-building | Low | | Q-015 | Interaction struct naming: `AvailableActions`/`ActionOption` (Tyre) vs `EntityInteractions`/`AvailableAction` (Dudley). Trivial — needs one canonical choice. | Tyre/Dudley | Sprint 3 implementation | Low | | Q-017 | Mellanie's 695 authored items — validated by SI as scope input but not independently verified by other agents. | SI/Mellanie | Informational | Low | --- ## 15. Workshop Summary ### What This Workshop Produced 1. **Canonical NPC mapping** — 17 NPCs with pattern + motivation, through collaborative resolution (Gestalt changed 6 of 10 positions based on Paula's arguments) 2. **Content architecture** — Full directory tree, 3 JSON Schema definitions, 3-tier validation pipeline, dual-format loader 3. **Interaction architecture** — Multi-verb server model with single-action client filter, extensible without server changes 4. **Pause system** — 3-state model with unanimous design convergence across 3 agents 5. **ObserverSnapshot v3** — Full protocol definition with backward compatibility, produced independently by 2 agents with structural agreement 6. **PC voice registers** — Canonical specifications for both characters with voice anchors, anti-patterns, and comparison examples 7. **FRIEND content pack template** — 91-line Kael Davan pack with phase-by-phase structure, prerequisite progression, and sample YAML 8. **FriendArc state machine** — 4-phase transitions with explicit trigger code and content dependencies 9. **Wiki fix execution plan** — 8 prioritized changes with per-file specifications for top-priority items 10. **37 new tickets + 10 updates** — Full Sprint 3-5 roadmap across copy, server, client, and CI teams (NEW-12 killed in closing round) ### What Remains Unresolved - 3 NPC surnames awaiting Miri validation (Q-014) - Interaction struct naming — trivial, resolved at implementation time (Q-015) - 695 authored items scope validation (Q-017, informational) ### Critical Path Unchanged **#261 (Dual Lens Authoring Guide) remains the single biggest blocker.** Blocks 9 downstream tickets. Recommended: assign Paula, Sprint 3 P0, time-box 5 days. --- *Qatux, Round 2 tracking (updated with closing round resolutions). For the record: all 7 Round 2 responses cataloged. 4 lead decisions implemented + 3 closing round resolutions (Q-012: 16 keys, Q-013: server-authoritative pause, Q-016: verbs[] rename confirmed). 10 Round 1 disagreements resolved (6 changed to Paula, 3 kept Gestalt, 1 deferred by design). 20 decisions ready to formalize (D-042 through D-061: 13 new from Round 2 + closing, 7 carried from Round 1). 37 new tickets proposed + 10 updates (NEW-12 killed). 3 minor items remain open. Workshop complete.*