Files
settled-reach/docs/workshops/v01-content-scoping/SUMMARY.md
T
jpmschweitzerandClaude Opus 4.6 3944b4e79f docs(workshops): archive v0.1 content scoping workshop (2 rounds + closing)
Scoped the vertical slice: 16 EntityKnowledge keys, v0.1 mechanical
NPC mapping, YAML content format, 7-verb interaction model, server-
authoritative pause, 38 tickets created across copy/server/client/ci.
20 decisions (D-042 through D-061). 8 agents, 2 rounds + closing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 16:19:05 +01:00

326 lines
16 KiB
Markdown

# 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.*