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>
595 lines
40 KiB
Markdown
595 lines
40 KiB
Markdown
# 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<NearbyInteraction>` | `Vec<EntityInteractions>` | Agreed (naming differs) |
|
|
| `active_dialogue` | `Option<ActiveDialogue>` | `Option<ActiveDialogue>` | Agreed |
|
|
| `monologue` | `Vec<MonologueDisplay>` | `Vec<MonologueDisplay>` | Agreed |
|
|
| `overheard` | `Vec<OverheardFragment>` | `Vec<OverheardDisplay>` | Agreed (naming differs) |
|
|
| `knowledge_updates` | `Vec<KnowledgeUpdate>` | Not in Dudley's R2 snapshot | Tyre adds delta updates |
|
|
| `examine_result` | `Option<ExamineResult>` | Not in Dudley's R2 snapshot | Tyre adds |
|
|
| `ticker_headlines` | `Vec<TickerHeadline>` | 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.*
|