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>
40 KiB
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_readmerged into existingtrust_level.leverage_heldabsorbssecret_held.secret_confidencerenamed toleverage_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/AvailableActionsembedded 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 membershipdialogue-pool.schema.json— Tagged dialogue lines per D-028/D-035. Role + location based, with access/trust/situation gating and knowledge_grantsmonologue-pool.schema.json— Character-partitioned (D-032). Trigger + prerequisite (AND-only) + priority + cooldown. 160 char max per Stig
Validation pipeline (3-tier):
- Authoring time: IDE with JSON Schema autocomplete
- Build time (
make content-validate): JSON Schema + cross-reference validation - 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). |
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_speedfrom snapshot)
Risks (SI)
- #261 remains critical path root. Every content authoring ticket flows through it. Recommended: assign Paula, time-box 5 days.
- Sprint 3 copy team has 15 tickets. 7 are small/parallelizable. Real load: #261, C1, B2, B4, A11.
- Server Sprint 3 already heavy (10 existing + 4 new). C2/C3 blocked by C1 anyway.
- 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 |
| 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 |
| 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
- Canonical NPC mapping — 17 NPCs with pattern + motivation, through collaborative resolution (Gestalt changed 6 of 10 positions based on Paula's arguments)
- Content architecture — Full directory tree, 3 JSON Schema definitions, 3-tier validation pipeline, dual-format loader
- Interaction architecture — Multi-verb server model with single-action client filter, extensible without server changes
- Pause system — 3-state model with unanimous design convergence across 3 agents
- ObserverSnapshot v3 — Full protocol definition with backward compatibility, produced independently by 2 agents with structural agreement
- PC voice registers — Canonical specifications for both characters with voice anchors, anti-patterns, and comparison examples
- FRIEND content pack template — 91-line Kael Davan pack with phase-by-phase structure, prerequisite progression, and sample YAML
- FriendArc state machine — 4-phase transitions with explicit trigger code and content dependencies
- Wiki fix execution plan — 8 prioritized changes with per-file specifications for top-priority items
- 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.