# v0.1 Content Scoping Workshop — Summary **Date:** 2026-02-12 **Called by:** Jeroen **Participants:** Gestalt (Systems Design), Paula (Narrative), Tyre (Architecture), Mellanie (Copywriter), Stig (UI), Dudley (Server), SI (Project Manager), Qatux (Documenter) **Rounds:** 2 + closing round (lead resolutions) **Purpose:** Scope and prioritize content work for v0.1 vertical slice. Apply Wiki Review long-term strategy (300-world generator model) to the hand-authored Sova Transit District proof. **Key constraint:** v0.1 proves the interaction model. All structures must be generator-compatible for the 300-world future. **Source files:** - `docs/workshops/v01-content-scoping/round1-tracking.md` - `docs/workshops/v01-content-scoping/round2-tracking.md` - `docs/workshops/v01-content-scoping/si-ticket-changes.md` - `docs/workshops/v01-content-scoping/v01-content-scoping-workshop-brief.md` - Round 1 responses: `round1-gestalt.md` through `round1-si.md` - Round 2 responses: `round2-gestalt.md` through `round2-si.md` --- ## 1. Workshop Overview **Round 1** — 7 responses across 6 topics (wiki fixes, NPC architecture, content directory, interaction model, scope boundary, tickets). Produced 17 consensus items, 5 disagreements, 7 wiki gaps, 7 decisions ready to formalize, 26 surviving tickets + 7 new proposals. **Round 2** — Lead issued 4 decisions resolving the major disagreements (NPC mapping, content format, interaction model, pause behavior). 7 responses addressed remaining convergence work. Gestalt changed 6 of 10 NPC mapping positions to Paula's reads. Tyre and Dudley independently produced structurally identical ObserverSnapshot v3 definitions. Mellanie delivered canonical PC voice registers and the Kael Davan content pack template. **Closing round** — Lead resolved 3 remaining questions: Q-012 (16 EntityKnowledge keys), Q-013 (server-authoritative pause, NEW-12 killed), Q-016 (`verbs[]` rename confirmed). Established process rule: no ticket merges across domain teams. --- ## 2. Decisions Made (D-042 through D-061) ### From Round 1 Consensus (7) | ID | Decision | |----|----------| | D-042 | Drin promoted from Tier 3 to Tier 2. | | D-043 | THE NOBODY mechanic deferred to v0.2; hidden pattern+motivation data ships in v0.1 content files. | | D-044 | v0.1 interaction model: 7 interactions (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear). | | D-045 | v0.1 scope IN additions: News ticker, PC-as-NPC, Time progression, Relationship state transitions. | | D-046 | v0.1 scope OUT additions: Inventory, Stealth, Combat, Player-facing save/load, Lattice modification. | | D-047 | v0.1 triangles: 3 active forks (T1, T2, T4), 2 passive tensions (T3, T5). | | D-048 | Client receives all text from server via state updates; client does not load or evaluate content files. | ### From Round 2 + Closing (13) | ID | Decision | |----|----------| | D-049 | YAML is the content file format for v0.1. RON converter available as optional build-time tool. Server loads YAML directly; RON cache is a future production optimization. | | 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. | | D-051 | v0.1 ships single context-sensitive action; multi-verb architecture modeled underneath. Server computes N available verbs per entity. v0.1 client shows priority-0 only. v0.2 client reads full list — no server changes. | | D-052 | 3-state pause: Normal (100%), Overlay (50%), Paused (0%). Server-authoritative — client is a dumb renderer. Client sends pause IPC command; reads `sim_speed` from ObserverSnapshot. | | D-053 | Self-contained triangle forks for v0.1. No cross-triangle cascade. v0.2 adds storyteller-managed cascade. | | 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. | | D-055 | 16 EntityKnowledge keys. 4 new generic role-perspective keys. `trust_read` merged into `trust_level`. `secret_held` renamed to `leverage_held` (expanded value space). `secret_confidence` → `leverage_confidence`. `social_debt` and `loyalty_conflict` deferred to v0.2. | | D-056 | PC voice registers defined. Smuggler: feeling-first, fragments, concrete/physical. Detective: analysis-first, complete sentences, institutional vocabulary. | | D-057 | Content directory: `content/` with `schema/`, `global/`, `districts/` top-level split. JSON Schema validation at build time. Dialogue by location+role. Monologue partitioned by character. | | D-058 | THE FRIEND content pack template: Kael Davan. 91 lines across 5 arc phases. Becomes template for all subsequent packs. | | D-059 | Monologue display: 160 char max, 2-line max, 4-6s display, 2s cooldown, queue depth 1, 9-level priority ordering. | | D-060 | `actions[]` renamed to `verbs[]` across all surfaces (server, client, YAML, wiki, decisions). | | D-061 | No ticket merges across domain teams. Shared epics fine; each team gets own ticket with own definition of done. | --- ## 3. EntityKnowledge — 16 Keys **Architecture:** All keys are observer-to-target. Interpretation lives in content (monologue pools, voice registers, archetype briefs), not schema. Same key, same enum, different meaning per archetype. ### 12 Existing Keys | # | Key | Category | |---|-----|----------| | 1 | `name` | Identity | | 2 | `role` | Identity | | 3 | `faction` | Identity | | 4 | `species` | Identity | | 5 | `location` | Spatial | | 6 | `routine_pattern` | Behavioral | | 7 | `trust_level` | Relational (absorbs `trust_read`) | | 8 | `leverage_held` | Relational (renamed from `secret_held`; expanded: secrets, debts, promises, obligations, compromising positions) | | 9 | `leverage_confidence` | Relational (renamed from `secret_confidence`) | | 10 | `relationship_state` | Relational | | 11 | `behavior_flags` | Behavioral (tracks tells + contradictions) | | 12 | `known_associates` | Social | ### 4 New Role-Perspective Keys | # | Key | Values | What It Stores | |---|-----|--------|---------------| | 13 | `risk_assessment` | none / low / moderate / high / critical | How this NPC threatens observer's position | | 14 | `loyalty_assessment` | solid / dependable / uncertain / wavering / hostile | How predictably this NPC serves observer's interests | | 15 | `position_integrity` | solid / thin / cracking / blown / N/A | Status of active deception involving this NPC | | 16 | `moral_weight` | innocent / peripheral / complicit / compromised / willing | Observer's subjective moral assessment | **Deferred to v0.2:** `social_debt` (no favor economy in 30-min session), `loyalty_conflict` (inferable from `behavior_flags` + `loyalty_assessment`). **Not added:** `tell_observed`, `contradiction_flagged` — tracked in existing `behavior_flags`. --- ## 4. NPC Mapping ### v0.1 Canonical (Gestalt's Mechanical Mapping) | # | Name | Tier | Pattern | Motivation | |---|------|------|---------|-----------| | 1 | Kael Davan | T1 | FRIEND | OPERATOR | | 2 | Sera Venn | T1 | FRIEND | WITNESS | | 3 | Naia Tamm | T1* | MIRROR | CIVILIAN | | 4 | Voss | T2 | SYSTEM | OPERATOR | | 5 | Lera Sessik | T2 | ANCHOR | OPERATOR | | 6 | Torek Lintar | T2 | CATALYST | CIVILIAN | | 7 | Devra | T2 | THRESHOLD | HANDLER | | 8 | Maret Korr | T2 | WITNESS | SKEPTIC | | 9 | Resha | T2 | CATALYST | CIVILIAN | | 10 | Drin | T2 | SYSTEM | TURNCOAT | | 11 | Renn | T2 | THRESHOLD | OPERATOR | | 12 | Pell | T2 | CATALYST | TURNCOAT | | 13 | Harek | T2 | ANCHOR | HANDLER | | 14 | Sess | T3 | ANCHOR | CIVILIAN | | 15 | Olin | T3 | CATALYST | CIVILIAN | | 16 | Sabel | T3 | GHOST | OPERATOR | | 17 | Tav | T3 | SYSTEM | CIVILIAN | **Off-stage:** Nils Davan — GHOST + HANDLER **Distribution:** 8 of 9 patterns present (REMNANT correctly absent; NOBODY deferred). All 6 motivations present. CIVILIAN at 6/17 (35%) matches D-029 noise floor (~30%). ### v0.2 Emotional Layer (Paula's Annotations) Paula annotated all 10 disagreement NPCs with emotional/narrative depth descriptions specifying what content each v0.2 motivation/pattern unlocks (~30-50 lines per NPC). The version-toggle approach: same NPCs, same schema, deeper analytical lens. ### Resolution Process Gestalt changed 6 of 10 Round 1 disagreement positions to Paula's reads (Maret pattern+motivation, Resha motivation, Harek pattern, Drin pattern, Sabel pattern, Olin motivation). Gestalt held on 3 (Voss motivation, Devra motivation, Sess pattern). Tav was a design-choice change (NOBODY deferred = SYSTEM+CIVILIAN instead). --- ## 5. Content Architecture ### Format YAML for all content files (D-049). RON converter in `tooling/` as optional build-time optimization. Server loads YAML directly via `serde_yaml`. JSON Schema validation at authoring and build time. ### Directory Structure ``` content/ content.yaml # manifest _schema/ # JSON Schema files _meta/ # infrastructure global/ facts.yaml factions.yaml enums/ # situations, topics, moods, triggers, access-tiers, activities knowledge/ entity-attributes.yaml regions/ districts/ sova-transit/ district.yaml npcs/ # per-NPC YAML (tier-conditional fields) locations/ triangles/ # 5 triangle definitions lines/ dialogue/ # by location + role (not NPC) monologue/ # partitioned by character routines/ templates/ ``` **Canonical ID format:** `{system}.{station}.{district}.{type}.{slug}` ### Validation Pipeline (3-tier) 1. **Authoring time:** IDE with JSON Schema autocomplete 2. **Build time:** `make validate-content` — JSON Schema + cross-reference validation 3. **Load time:** serde_yaml deserialization + semantic validation (StableId assignment, relationship wiring) ### Schemas Defined - `npc-profile.schema.json` — tier-conditional fields, pattern/motivation enums, axes, tells, access tiers, trust levels, friend_arc, triangle membership - `dialogue-pool.schema.json` — tagged per D-028/D-035, role+location based, access/trust/situation gating, knowledge_grants - `monologue-pool.schema.json` — character-partitioned (D-032), trigger+prerequisite (AND-only)+priority+cooldown, 160 char max --- ## 6. Interaction Model ### 7 Verbs (D-044) Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear. ### Architecture - Server computes N available verbs per entity every tick via `verbs[]` field (D-060 rename from `actions[]`) - Priority-sorted: context determines which verb surfaces as `[E]` prompt - Post-contradiction: Examine can rise above Talk (detective investigating flagged NPC) - `verbs[]` embedded in ObserverSnapshot via `nearby_interactions`, not separate message ### v0.1 Client Single context-sensitive action. `[E] Talk` / `[E] Examine`. One keybind. `InteractPrimary` PlayerAction variant sends priority-0 verb. ### v0.2 Extension `[E] Talk [F] Observe` — horizontal label row. `InteractWith` PlayerAction variant. Client reads full `verbs[]` list. **No server changes needed.** ### Convergence Tyre (`AvailableActions`/`ActionOption`), Dudley (`EntityInteractions`/`AvailableAction`), and Stig (`InteractionOptions`) independently produced structurally identical designs. Naming unification deferred to implementation (Q-015). --- ## 7. Pause System ### 3 States (D-052) | State | Speed | Trigger | |-------|-------|---------| | Normal | 100% (1.0) | Default | | Overlay | 50% (0.5) | Knowledge panel, dialogue | | Paused | 0% (0.0) | Spacebar (always) | ### Authority **Server-authoritative.** Tick rate is a server simulation concern. Client is a dumb renderer — renders ObserverSnapshots at whatever rate the server sends them. Client sends pause IPC command to server. Client reads `sim_speed` from ObserverSnapshot for visual feedback. Spacebar from any state goes to Paused. Spacebar from Paused resumes to pre-pause state. Multiple overlays don't stack below 50% in v0.1. **NEW-12 (client pause state machine) killed** — client doesn't manage time. Stig's `PauseManager` reduced to sending IPC commands and reading `sim_speed`. --- ## 8. Scope Boundary ### IN (v0.1) - WASD movement + collision - Context-sensitive interaction (7 verbs, single-action prompt) - Monologue system (tagged triggers, FactId prerequisites, AND-only) - Knowledge graph (player learns facts, relationships change) - 2 playable characters (smuggler, detective) - THE FRIEND arc (Kael for smuggler, Sera for detective) - 5 triangles: 3 active forks (T1, T2, T4), 2 passive tensions (T3, T5) - 6 wow moments (D-039) - 3 social sites (Terminal, Last Shift, Maintenance Corridors) - NPC routines (schedule-based movement) - News ticker (world-space at bar) - PC-as-NPC (other character exists as NPC) - Time progression (DayPhase) - Relationship state transitions (Friendly → PersonOfInterest) - Self-contained triangle forks (no cross-triangle cascade) - ~695 authored content items (~200 monologue + ~350 dialogue + ~50 environmental + ~20 ticker + ~50 UI + ~25 PC-as-NPC) ### OUT (v0.1) - THE NOBODY / dynamic tier promotion (data ships, mechanic deferred) - Archetype transitions - Multiple FRIEND candidates per character - Secondary contraband variation - Gate network / multi-world - Content generation / randomization - Modding support (mod-compatible conventions ship; overlay implementation doesn't) - Inventory system (evidence is knowledge, not physical items) - Stealth mechanics (social stealth, not mechanical) - Combat system - Player-facing save/load (session-based 30-minute slice) - Lattice modification/upgrade - Cross-triangle cascade (storyteller-managed, v0.2) - `social_debt` / `loyalty_conflict` EntityKnowledge keys --- ## 9. Ticket Summary ### Counts | 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) | | Workshop tickets (NEW 1-7) | 7 | copy | | Lead decision tickets (NEW 8-14, excl. killed NEW-12) | 6 | server (4), client (2) | | **Total new tickets** | **38** | **copy (21), server (13), client (2), ci (1)** | | Existing ticket updates | 10 | — | ### Sprint 3 Allocation **Copy team (15 tickets):** - P0: #261 (Dual Lens Guide — **critical path root**, blocks 9 tickets), C1 (content dir 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 spec), A8 (shortcode fix), NEW-2 (Drin expansion), NEW-7 (interaction verb spec) **Server team (6 additions to existing 10):** - C2 (directory skeleton), C3 (schemas), C9 (validate-content CLI), NEW-9 (proximity + InteractionOptions), #326-P1 (loader skeleton), NEW-11 (tick rate scaling) **Client team (1 addition):** - NEW-10 (extensible interaction prompt) ### Critical Paths **Chain 1 — Content Authoring:** `#261` → B4 → A6 (Sprint 4) → NEW-4 (Sprint 4) → content packs (Sprint 5) **Chain 2 — Content Architecture:** C1 → C2+C3 (Sprint 3) → C4-C8+NEW-3 (Sprint 4) → #326-P2 (Sprint 4) **Chain 3 — Interaction Pipeline:** NEW-7 (soft) → NEW-9 (server) → NEW-10 (client) **#261 (Dual Lens Authoring Guide) is the single biggest blocker.** Blocks 9 downstream tickets across the entire content pipeline. Recommended: Paula as owner, 5-day time-box. ### Key Existing Ticket Updates - #368: Close (wiki delivered) - #369: Repurpose as parent epic - #326: Split into Phase 1 (Sprint 3, skeleton) + Phase 2 (Sprint 4, real content) - #86: Update ECS component list to workshop output - #88: Add #237 (A* pathfinding) dependency --- ## 10. Open Items Carried Forward | ID | Item | Owner | Priority | |----|------|-------|----------| | Q-014 | 3 NPC surnames awaiting Miri validation: Drin Vassar, Sess Torin, Tav Lenn | Miri | Low | | Q-015 | Interaction struct naming: `AvailableActions` (Tyre) vs `EntityInteractions` (Dudley). Trivial — resolved at implementation time. | Tyre/Dudley | Low | | Q-017 | 695 authored items validated as scope input but not independently verified by other agents. | SI/Mellanie | Low (informational) | None of these block Sprint 3 work. --- *Compiled by Qatux. Workshop produced 20 decisions (D-042 through D-061), 38 new tickets + 10 updates, canonical NPC mapping for 17 NPCs, 16-key EntityKnowledge spec, full content architecture, and Sprint 3-5 roadmap. 3 minor open items carried forward. #261 is the critical path root.*