Files
settled-reach/docs/workshops/v01-content-scoping/round2-tracking.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

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_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_heldleverage_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_readtrust_level (merge). secret_heldleverage_held (absorb + expand). secret_confidenceleverage_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.