From 3776443e8adf9e344c55a4c88446d1e54cbcc2ba Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Thu, 12 Feb 2026 16:18:49 +0100 Subject: [PATCH 1/7] docs(wiki): establish Sova Transit District game world glossary 45 files covering the v0.1 vertical slice content: 17 NPC profiles across 3 tiers, 5 triangles, 3 social sites, 7 factions, 6 technology entries, 3 contraband types, knowledge vocabulary (FactIds, entity attributes, relationship states), and monologue authoring guide. Co-Authored-By: Claude Opus 4.6 --- docs/wiki/authoring/monologue-guide.md | 1295 +++++++++++++++++ docs/wiki/contraband/lattice-components.md | 120 ++ .../contraband/medical-grade-replacements.md | 128 ++ docs/wiki/contraband/severance-equipment.md | 121 ++ docs/wiki/factions/concord-assembly.md | 111 ++ docs/wiki/factions/guardians-of-autonomy.md | 127 ++ docs/wiki/factions/lattice-commission.md | 130 ++ docs/wiki/factions/syndics.md | 115 ++ docs/wiki/factions/the-ring.md | 142 ++ docs/wiki/factions/the-unbound.md | 106 ++ docs/wiki/factions/veil-institute.md | 116 ++ docs/wiki/index.md | 121 ++ docs/wiki/knowledge/entity-attributes.md | 301 ++++ docs/wiki/knowledge/fact-catalog.md | 311 ++++ docs/wiki/knowledge/relationship-states.md | 332 +++++ .../krenn-system/maintenance-corridors.md | 192 +++ .../locations/krenn-system/the-last-shift.md | 201 +++ .../locations/krenn-system/the-terminal.md | 191 +++ docs/wiki/npcs/devra.md | 119 ++ docs/wiki/npcs/drin.md | 48 + docs/wiki/npcs/hael.md | 117 ++ docs/wiki/npcs/harek.md | 113 ++ docs/wiki/npcs/index.md | 268 ++++ docs/wiki/npcs/kael-davan.md | 397 +++++ docs/wiki/npcs/lera-sessik.md | 117 ++ docs/wiki/npcs/maret-korr.md | 117 ++ docs/wiki/npcs/olin.md | 47 + docs/wiki/npcs/pell.md | 118 ++ docs/wiki/npcs/renn.md | 115 ++ docs/wiki/npcs/resha.md | 113 ++ docs/wiki/npcs/sabel.md | 45 + docs/wiki/npcs/sera-venn.md | 397 +++++ docs/wiki/npcs/sess.md | 47 + docs/wiki/npcs/tav.md | 49 + docs/wiki/npcs/torek-lintar.md | 113 ++ docs/wiki/npcs/voss.md | 120 ++ docs/wiki/technology/clone-transfer.md | 133 ++ docs/wiki/technology/founder-gates.md | 114 ++ docs/wiki/technology/meridian.md | 129 ++ docs/wiki/technology/neural-lattice.md | 177 +++ docs/wiki/technology/severance-tech.md | 120 ++ docs/wiki/technology/span-gates.md | 107 ++ docs/wiki/world/krenn-system.md | 134 ++ docs/wiki/world/sova-transit-district.md | 257 ++++ docs/wiki/world/station-sova.md | 190 +++ 45 files changed, 7981 insertions(+) create mode 100644 docs/wiki/authoring/monologue-guide.md create mode 100644 docs/wiki/contraband/lattice-components.md create mode 100644 docs/wiki/contraband/medical-grade-replacements.md create mode 100644 docs/wiki/contraband/severance-equipment.md create mode 100644 docs/wiki/factions/concord-assembly.md create mode 100644 docs/wiki/factions/guardians-of-autonomy.md create mode 100644 docs/wiki/factions/lattice-commission.md create mode 100644 docs/wiki/factions/syndics.md create mode 100644 docs/wiki/factions/the-ring.md create mode 100644 docs/wiki/factions/the-unbound.md create mode 100644 docs/wiki/factions/veil-institute.md create mode 100644 docs/wiki/index.md create mode 100644 docs/wiki/knowledge/entity-attributes.md create mode 100644 docs/wiki/knowledge/fact-catalog.md create mode 100644 docs/wiki/knowledge/relationship-states.md create mode 100644 docs/wiki/locations/krenn-system/maintenance-corridors.md create mode 100644 docs/wiki/locations/krenn-system/the-last-shift.md create mode 100644 docs/wiki/locations/krenn-system/the-terminal.md create mode 100644 docs/wiki/npcs/devra.md create mode 100644 docs/wiki/npcs/drin.md create mode 100644 docs/wiki/npcs/hael.md create mode 100644 docs/wiki/npcs/harek.md create mode 100644 docs/wiki/npcs/index.md create mode 100644 docs/wiki/npcs/kael-davan.md create mode 100644 docs/wiki/npcs/lera-sessik.md create mode 100644 docs/wiki/npcs/maret-korr.md create mode 100644 docs/wiki/npcs/olin.md create mode 100644 docs/wiki/npcs/pell.md create mode 100644 docs/wiki/npcs/renn.md create mode 100644 docs/wiki/npcs/resha.md create mode 100644 docs/wiki/npcs/sabel.md create mode 100644 docs/wiki/npcs/sera-venn.md create mode 100644 docs/wiki/npcs/sess.md create mode 100644 docs/wiki/npcs/tav.md create mode 100644 docs/wiki/npcs/torek-lintar.md create mode 100644 docs/wiki/npcs/voss.md create mode 100644 docs/wiki/technology/clone-transfer.md create mode 100644 docs/wiki/technology/founder-gates.md create mode 100644 docs/wiki/technology/meridian.md create mode 100644 docs/wiki/technology/neural-lattice.md create mode 100644 docs/wiki/technology/severance-tech.md create mode 100644 docs/wiki/technology/span-gates.md create mode 100644 docs/wiki/world/krenn-system.md create mode 100644 docs/wiki/world/sova-transit-district.md create mode 100644 docs/wiki/world/station-sova.md diff --git a/docs/wiki/authoring/monologue-guide.md b/docs/wiki/authoring/monologue-guide.md new file mode 100644 index 000000000..899db71c8 --- /dev/null +++ b/docs/wiki/authoring/monologue-guide.md @@ -0,0 +1,1295 @@ +# Monologue and Dialogue Authoring Guide + +How to write tagged monologue and dialogue content for The Settled Reach. Read the knowledge system docs first — this guide assumes you know what a FactId is and how RelationshipState works. + +**Prerequisites:** +- [Fact Catalog](../knowledge/fact-catalog.md) — 24 FactIds with confidence progressions +- [Entity Attributes](../knowledge/entity-attributes.md) — 14 canonical EntityKnowledge keys +- [Relationship States](../knowledge/relationship-states.md) — 5 states, transitions, dialogue access tiers + +**Canonical sources:** D-028 (dialogue architecture), D-032 (separate monologue pools), D-035 (tag taxonomy) + +--- + +## Core Principle + +Internal monologue is **hard-partitioned by playable character** (D-032). The smuggler and detective have completely separate monologue pools. No shared lines. Same trigger, different pool. This is how mirror moments work without either pool knowing about the other. + +Dialogue lines are shared — NPCs say the same words regardless of who's listening. The access tier system filters which lines each character can hear at runtime. + +--- + +## D-035 Tag Taxonomy Reference + +Every line carries structural tags, selection tags, and (for monologue) character-specific tags. Here's the full schema. + +### Structural Tags (required on every dialogue line) + +| Tag | Type | Purpose | +|-----|------|---------| +| `id` | string | `{location}_{d\|m\|e}_{###}` — stable, machine-parseable | +| `text` | string | The authored line | +| `role` | enum | Template-defined role, not NPC name (NPC assignment is runtime) | +| `access` | list\ | Hard filter: `public`, `insider`, `authority`, `peer`, `hostile` | +| `trust` | enum | Hard filter: `surface`, `real`, `secret` | +| `situation` | list\ | Context filter (13 situations for v0.1) | + +### Selection Tags (recommended, defaults apply if empty) + +| Tag | Type | Purpose | +|-----|------|---------| +| `topic` | list\ | Weighted selection (9 topics for v0.1) | +| `mood` | list\ | Weighted selection (8 moods for v0.1) | +| `tags` | list\ | Freeform escape hatch for author intent | + +### Monologue-Specific Tags (added to structural + selection) + +| Tag | Type | Purpose | +|-----|------|---------| +| `character` | enum | `smuggler` or `detective` — hard partition (D-032) | +| `trigger` | enum | What fires this line (9 types — see next section) | +| `prerequisite` | map or null | Knowledge state gate | + +### Authoring-Only Tags (not consumed by engine) + +| Tag | Type | Purpose | +|-----|------|---------| +| `dual_lens` | map | Per-character notes on how the line reads differently | +| `notes` | string | Author intent, context for future editors | + +### Enum Values + +**`situation`** (13 for v0.1): +`arrival`, `shift_start`, `shift_end`, `shift_transition`, `bar_evening`, `night_shift`, `investigation`, `confrontation`, `social`, `alone`, `emergency`, `routine`, `observation` + +**`topic`** (9 for v0.1): +`colleague`, `routine`, `cargo`, `money`, `trust`, `danger`, `institution`, `personal`, `investigation` + +Note: no `crime` or `smuggling` topic. NPCs think of it as `cargo` or `money`. The detective uses `investigation`. + +**`mood`** (8 for v0.1): +`fond`, `comfortable`, `worried`, `suspicious`, `analytical`, `conflicted`, `concerned`, `relieved` + +--- + +## Monologue Trigger Types (9) + +The `trigger` tag determines WHEN a monologue line fires. Each type maps to a game event. + +### 1. `enter_location` + +Fires when the player enters a named area. + +```yaml +- id: hub_m_010 + text: "Morning shift. Recycled air and cargo lubricant. Home sweet home." + character: smuggler + trigger: enter_location + situation: [arrival] + mood: [comfortable] + prerequisite: null +``` + +```yaml +- id: hub_m_011 + text: "Logistics hub. Standard prefab, heavy foot traffic. Let's see what the shift change tells me." + character: detective + trigger: enter_location + situation: [arrival] + mood: [analytical] + prerequisite: null +``` + +**Mirror moment**: Same entry, different register. Smuggler sees home; detective sees a crime scene. + +Use for first impressions, atmosphere, returning-to-familiar-ground observations. Keep short — the player is moving. + +--- + +### 2. `observe_npc` + +Fires when a known entity enters the player's line of sight. + +```yaml +- id: hub_m_020 + text: "Kael's here. Good — I was starting to worry." + character: smuggler + trigger: observe_npc + mood: [fond] + prerequisite: + relationship_state: Friendly + subject: kael_davan +``` + +```yaml +- id: hub_m_021 + text: "Dock worker from the case file. Davan, K. Unremarkable on paper." + character: detective + trigger: observe_npc + mood: [analytical] + prerequisite: + fact: investigation.manifest_discrepancy + confidence: Suspects +``` + +Use for identification, behavioral observations, emotional reactions. The prerequisite controls which version fires — same NPC, different line depending on knowledge. + +--- + +### 3. `hear_sound` + +Fires on audio events — ambient, diegetic, or anomalous. + +```yaml +- id: bar_m_030 + text: "Raised voices from the back room. Devra's in there. That's not a brokering call." + character: smuggler + trigger: hear_sound + mood: [concerned] + prerequisite: + fact: contraband.ring_exists + confidence: KnowsDetails +``` + +```yaml +- id: bar_m_031 + text: "Arguing behind that door. The bartender didn't flinch. Either she's used to it or she knows what it is." + character: detective + trigger: hear_sound + mood: [suspicious] + prerequisite: null +``` + +Audio triggers fire less frequently than visual ones. Make them count. + +--- + +### 4. `observe_anomaly` + +Fires when the player observes something that contradicts expected state — a container in the wrong place, an NPC where they shouldn't be, a door that should be locked. + +```yaml +- id: hub_m_040 + text: "Kael's checking his lattice again. Third time in ten minutes. That's not normal." + character: smuggler + trigger: observe_anomaly + mood: [worried] + prerequisite: + relationship_state: Friendly + subject: kael_davan +``` + +```yaml +- id: hub_m_041 + text: "Dock worker Davan — lattice activity spiked. Expecting a message? Or checking for surveillance?" + character: detective + trigger: observe_anomaly + mood: [analytical] + prerequisite: + known_attributes: + subject: kael_davan + key: behavior_flags + value_contains: lattice_checking +``` + +This is the detective's bread and butter: the gap between expected and observed. + +--- + +### 5. `post_conversation` + +Fires after a dialogue exchange ends. Internal reaction to what just happened. + +```yaml +- id: bar_m_050 + text: "Sera's good to have around. Knows the district, knows the people. Reliable." + character: detective + trigger: post_conversation + mood: [fond] + prerequisite: + relationship_state: Friendly + subject: sera_venn +``` + +```yaml +- id: bar_m_051 + text: "She's not lying. But she's not telling me everything. Sera, what do you know?" + character: detective + trigger: post_conversation + mood: [conflicted] + prerequisite: + relationship_state: PersonOfInterest + subject: sera_venn +``` + +This is where character voice shines — the detective analyzes, the smuggler worries about people. + +--- + +### 6. `discover_evidence` + +Fires when the player finds physical evidence — a document, object, or data point. + +```yaml +- id: hub_m_060 + text: "Container 4471. Manifest says 240 kilos. That crate is closer to 310." + character: detective + trigger: discover_evidence + mood: [analytical] + prerequisite: + fact: investigation.manifest_discrepancy + confidence: Suspects +``` + +```yaml +- id: hub_m_061 + text: "4471's still in temp. Kael routed it there during transition. Standard. Nothing to worry about." + character: smuggler + trigger: discover_evidence + mood: [relieved] + prerequisite: + fact: contraband.ring_exists + confidence: KnowsDetails +``` + +Brief, observational. The fact system handles what the player now knows — the monologue handles what they feel about it. + +--- + +### 7. `witness_interaction` + +Fires when the player observes two NPCs interacting. + +```yaml +- id: bar_m_070 + text: "Sera's headed out. Smart — Torek gets loud after three drinks. Nobody wants to deal with that." + character: smuggler + trigger: witness_interaction + mood: [comfortable] + prerequisite: null +``` + +```yaml +- id: bar_m_071 + text: "That's twice now. Sera leaves when Torek arrives. Coincidence? Filing it." + character: detective + trigger: witness_interaction + mood: [analytical] + prerequisite: + known_attributes: + subject: sera_venn + key: behavior_flags + value_contains: avoidance_pattern +``` + +**Mirror moment**: Same event. Smuggler has the innocent explanation. Detective has the investigative read. On replay: "Wait — WAS it just the noise?" + +--- + +### 8. `time_idle` + +Fires after inactivity — the player is standing still, watching, waiting. The character's mind wanders. + +```yaml +- id: corr_m_080 + text: "Quiet tonight. Good. Nobody using the south access." + character: smuggler + trigger: time_idle + mood: [relieved] + prerequisite: + fact: location.corridor_b7_restricted + confidence: KnowsDetails +``` + +```yaml +- id: corr_m_081 + text: "This corridor should see foot traffic during shift change. It's empty. Why?" + character: detective + trigger: time_idle + mood: [suspicious] + prerequisite: + fact: location.corridor_b7_restricted + confidence: Suspects +``` + +Idle lines reveal what the character cares about when nothing demands attention. The smuggler thinks about the operation; the detective thinks about the case. + +--- + +### 9. `return_visit` + +Fires when the player returns to a location they've visited before. Distinct from `enter_location` — gates on prior visit history. + +```yaml +- id: bar_m_090 + text: "Back at Lera's. Same seats, same faces. Sera's in the corner booth. Good." + character: detective + trigger: return_visit + mood: [comfortable] + prerequisite: + relationship_state: Friendly + subject: sera_venn +``` + +```yaml +- id: bar_m_091 + text: "Back again. Same booth. ...Let's see if Sera leaves when Torek shows up." + character: detective + trigger: return_visit + mood: [suspicious] + prerequisite: + known_attributes: + subject: sera_venn + key: behavior_flags + value_contains: avoidance_pattern +``` + +Return visits build investigation momentum. This is where the detective's pattern recognition fires. + +--- + +## YAML Prerequisite Format + +Prerequisites gate monologue lines on knowledge state. A line only fires if the player's knowledge meets the conditions. + +### No prerequisite (always eligible) + +```yaml +prerequisite: null +``` + +Still filtered by trigger type, character, and location. Use for baseline observations that don't depend on knowledge. + +### Gating on FactId + confidence + +```yaml +prerequisite: + fact: contraband.ring_exists + confidence: KnowsOf +``` + +Fires only if the active character knows the named fact at the specified confidence **or higher**. Confidence levels ordered: `Suspects` < `KnowsOf` < `KnowsDetails` < `Direct`. + +Use exact FactId strings from the [Fact Catalog](../knowledge/fact-catalog.md) — `"contraband.ring_exists"` not `"Ring Exists"`. The 24 v0.1 FactIds are the only valid values. + +### Gating on RelationshipState + +```yaml +prerequisite: + relationship_state: PersonOfInterest + subject: kael_davan +``` + +Fires only if the active character's relationship with the named entity is the specified state. States: `Unknown`, `Known`, `Friendly`, `PersonOfInterest`, `Hostile`. + +### Gating on EntityKnowledge attributes + +**Exact match:** +```yaml +prerequisite: + known_attributes: + subject: kael_davan + key: contradiction_flagged + value: meeting_unknown_contact +``` + +Fires if the active character's `EntityKnowledge` for the target has the exact key-value pair. + +**Partial match** (for comma-separated fields like `behavior_flags`): +```yaml +prerequisite: + known_attributes: + subject: kael_davan + key: behavior_flags + value_contains: lattice_checking +``` + +Matches if `behavior_flags` contains `lattice_checking` anywhere in the comma-separated list. + +### Compound prerequisites + +Combine conditions with `all` (AND) or `any` (OR): + +```yaml +prerequisite: + all: + - fact: contraband.ring_exists + confidence: KnowsDetails + - relationship_state: Friendly + subject: kael_davan + - known_attributes: + subject: kael_davan + key: behavior_flags + value_contains: lattice_checking +``` + +All three must be true. Swap `all` for `any` for OR logic. + +Keep compound prerequisites to 2-3 conditions. If you need more, the line is too narrowly targeted — split it. + +### Character-specific gating + +The `character` tag on monologue lines is already a hard partition. You don't need to gate on character inside `prerequisite`. But some facts are character-specific in practice: + +```yaml +# Detective-only fact — smuggler never reaches this +prerequisite: + fact: investigation.evidence_collected + confidence: KnowsOf +``` + +```yaml +# Both characters can reach this, but from different starting points +prerequisite: + fact: contraband.ring_exists + confidence: KnowsOf + # Smuggler starts here. Detective earns it through investigation. +``` + +--- + +## Access Tier Mapping + +The `access` tag on dialogue lines determines who can hear what. Access is derived from `RelationshipState` plus character type (smuggler/detective). + +### RelationshipState to dialogue access + +| `access` tag | Unknown | Known | Friendly | PersonOfInterest | Hostile | +|--------------|---------|-------|----------|------------------|---------| +| `public` | yes | yes | yes | yes | yes | +| `peer` | -- | yes | yes | -- | -- | +| `insider` | -- | -- | yes | -- | -- | +| `authority` | detective | detective | -- | detective | -- | +| `hostile` | -- | -- | -- | -- | yes | + +**Key rules:** + +- **`public`**: Anyone can hear it. Greetings, small talk, general information. +- **`peer`**: Requires Known or Friendly. Coworker talk, casual gossip. **Locks out at PersonOfInterest** — when trust breaks, peers stop sharing. +- **`insider`**: Requires Friendly only. Ring operations talk, close confidences. The content that vanishes when THE FRIEND turns amber. +- **`authority`**: Detective-only, works at Unknown, Known, and PersonOfInterest. Institutional leverage. Doesn't work on Friendly (too personal) or Hostile (they've stopped cooperating). +- **`hostile`**: Only at Hostile. Threats, demands, final warnings. + +### What this means for THE FRIEND + +When Kael transitions from Friendly to PersonOfInterest: +- `insider` lines disappear. Ring talk stops. Trust-gated confidences lock. +- `peer` lines disappear. Casual warmth dries up. Kael becomes guarded. +- `public` lines remain. Kael still greets the smuggler — but the warmth is gone. + +When Sera transitions from Friendly to PersonOfInterest: +- `insider` lines disappear. Institutional background sharing stops. +- `peer` lines disappear. Bar conversation becomes stilted. +- `authority` lines unlock for the detective. Pressing questions become available. + +This is the mechanical expression of the emotional arc. The content doesn't change — the **filter** changes. Lines that existed before are now locked. That absence IS the narrative. + +### Trust sublayers + +Within each access tier, `trust` further filters content: + +| `trust` | What it gates | +|---------|--------------| +| `surface` | Safe topics, social norms, what anyone would say | +| `real` | Honest opinions, unguarded speech, actual feelings | +| `secret` | Dangerous knowledge, confessions, things that create leverage | + +Trust is orthogonal to access. A `peer` + `surface` line is casual coworker talk. A `peer` + `real` line is a coworker dropping the mask. A `peer` + `secret` line is a coworker confessing something risky. + +### Per-NPC access mapping + +How each character relates to key NPCs: + +| NPC | Smuggler Access | Detective Access | +|-----|----------------|------------------| +| Kael (THE FRIEND) | `insider`, `peer` | `public` → `authority` (after flagging) | +| Sera (THE FRIEND) | `public` (Commission, wary) | `peer` → `authority` (post-contradiction) | +| Voss | `insider` (colleague) | `authority` | +| Lera | `insider` (bar regular) | `public` → `peer` (repeat visits) | +| Hael | `peer` (through Kael) | `public` → `peer` (through Sera) | +| Torek | `insider` or `peer` | `public` | +| Maret | `insider` (hub colleague) | `authority` | +| Drin | `insider` (hub colleague) | `authority` | + +--- + +## Tell Observation Format + +Tells are behavioral signals that update `EntityKnowledge.known_attributes`. When observed, two things happen: the attribute updates in the knowledge graph, and a monologue line fires. + +### Structure + +A tell observation monologue line should: + +1. **Name the behavior** — what the player sees +2. **Interpret through character lens** — what it means to THIS character +3. **Map to an attribute** — note in `notes` which `known_attributes` key updates + +```yaml +- id: hub_m_100 + text: "Kael keeps checking his lattice. Waiting for something." + character: smuggler + trigger: observe_anomaly + mood: [concerned] + topic: [colleague] + prerequisite: + relationship_state: Friendly + subject: kael_davan + notes: "First tell. Updates behavior_flags: lattice_checking. Smuggler notices but doesn't flag yet." +``` + +```yaml +- id: hub_m_101 + text: "Dock worker Davan — lattice activity spiked. Three pings in two minutes. Expecting a message? Or checking for surveillance?" + character: detective + trigger: observe_anomaly + mood: [analytical] + topic: [investigation] + prerequisite: + relationship_state: Known + subject: kael_davan + notes: "Same tell, different read. Updates behavior_flags: lattice_checking." +``` + +### Tell progression + +Tells accumulate. Write them as a sequence, each gated on increasing knowledge: + +**Tell 1 — first observation (no prior flags):** +```yaml +prerequisite: + relationship_state: Friendly + subject: kael_davan + # No behavior_flags gate — this IS the first observation +``` + +**Tell 2 — pattern forming (first flag set):** +```yaml +prerequisite: + known_attributes: + subject: kael_davan + key: behavior_flags + value_contains: lattice_checking + # Requires tell 1 to have fired and set the attribute +``` + +**Tell 3 — conclusion (multiple flags):** +```yaml +prerequisite: + all: + - known_attributes: + subject: kael_davan + key: behavior_flags + value_contains: lattice_checking + - known_attributes: + subject: kael_davan + key: behavior_flags + value_contains: evasive +``` + +Each tell should feel like a natural observation, not a checklist. The player doesn't know they're accumulating evidence. + +### Canonical tell attributes + +| Attribute key | What it captures | Example values | +|--------------|-----------------|----------------| +| `behavior_flags` | Comma-separated observations | `"nervous,lattice_checking"`, `"avoidance_pattern,evasive"` | +| `tell_observed` | Specific personal tell | `"looks_left_when_lying"`, `"leaves_when_torek_arrives"` | +| `contradiction_flagged` | THE FRIEND arc trigger | `"meeting_unknown_contact"`, `"avoidance_inconsistency"` | +| `secret_held` | What observer believes target hides | `"ring membership"`, `"unreported evidence"` | +| `secret_confidence` | Certainty level | `"suspected"`, `"likely"`, `"confirmed"` | + +### THE FRIEND tell arcs + +**Kael (smuggler observes):** + +| Phase | Tell | Behavior flag | Line tone | +|-------|------|---------------|-----------| +| First crack | Increased lattice checking | `lattice_checking` | Concern: "Kael's distracted today." | +| Pattern | Shortened conversations, evasive | `distracted,evasive` | Worry: "Kael's been quiet lately." | +| Contradiction | Unauthorized spatial presence | `contradiction_flagged: meeting_unknown_contact` | Alarm: "That wasn't anyone from our rotation." | +| Confirmation | Looks left when answering | `tell_observed: looks_left_when_lying` | Hurt: "He always looks left when he's making something up." | + +**Sera (detective observes):** + +| Phase | Tell | Behavior flag | Line tone | +|-------|------|---------------|-----------| +| First departure | Leaves when Torek arrives (once) | `avoidance_pattern` (begins) | Barely noticed: "Sera headed out. Long day." | +| Second departure | Different excuse, same trigger | `avoidance_pattern` (accumulating) | Noted: "Sera left again. She's been tired lately." | +| Third departure | Pattern confirmed | `contradiction_flagged: avoidance_inconsistency` | Analytical: "Three times. Three excuses. That's data." | +| Deflection | Controlled redirect when asked | `tell_observed: controlled_deflection` | Conflicted: "She's not lying. But she's not telling me everything." | + +--- + +## Voice Discipline: Writing for Dual-Lens + +Every NPC line must work for both character perspectives. Same words, different meaning. + +### The rule + +Monologue pools are separate (D-032). But dialogue is shared — the NPC says the same thing to both characters. The `access` tier filters which lines each character can hear, but `public` and `peer` lines reach both. When an NPC speaks, the words must land differently depending on who's listening. + +### How to write dual-lens lines + +**Step 1: Write the line.** Concrete, in the speaker's voice. The NPC doesn't know who's listening. + +```yaml +- id: hub_d_044 + role: dock_worker + text: "Container 4471 sat in temp storage overnight. Scheduling backed up again." + access: [public, peer] + trust: surface + situation: [shift_start] +``` + +**Step 2: Check both readings.** Document the split. + +```yaml + dual_lens: + smuggler: "Operational context — part of the ring pipeline. 'Backed up' is cover language." + detective: "Anomaly — overnight exceeds standard procedure. Flag for investigation." +``` + +**Step 3: Verify neither reading breaks.** If it only works for one character, use a different `access` tier or rely on character-specific monologue to recontextualize. + +### Dual-lens patterns + +**Innocuous surface / operational subtext:** +> "Voss adjusted the night shift again. Two workers short." +- Smuggler: coverage gap for tonight's run +- Detective: scheduling irregularity worth tracking + +**Social warmth / threat assessment:** +> "Sera left early. Headache, she said." +- Detective: pattern forming — third time when Torek's here +- Smuggler: Commission person leaving, less oversight + +**Emotional resonance / clinical data:** +> "Kael's been quiet lately. Not like him." +- Smuggler: concern for a friend +- Detective: behavioral change in a subject + +**Casual disclosure / institutional intelligence:** +> "I ran the usual calibration checks today." +- Detective: routine work, mundane +- Smuggler: Commission is still active in the district + +### What to avoid + +- **One-character lines in shared pools.** If only the smuggler gets it, it needs `insider` access, not `public`. +- **Telegraphing.** "I'm definitely not doing anything illegal" — nobody talks like that. +- **Breaking NPC voice for the lens.** The NPC doesn't know who's listening. They talk like themselves. +- **Over-explaining.** If you need a paragraph of `dual_lens` notes to explain the split, the line isn't doing its job. The best dual-lens lines work on surface for one character and subtext for the other. + +--- + +## Concrete Examples: Full Tagged Pools + +Three pools, one per v0.1 social site. Each shows file structure, progression through THE FRIEND arc, and full tag usage. + +### The Terminal (Logistics Hub) — Smuggler Monologue + +```yaml +# File: content/terminal/monologue-smuggler.yaml +# Location: The Terminal (Logistics Hub) +# Character: Smuggler + +lines: + + # --- ARRIVAL --- + + - id: terminal_m_001 + character: smuggler + trigger: enter_location + prerequisite: null + text: "Morning shift. Recycled air and cargo lubricant. Home sweet home." + mood: [comfortable] + topic: [routine] + situation: [arrival, shift_start] + access: [insider] + trust: surface + tags: [baseline] + + - id: terminal_m_002 + character: smuggler + trigger: enter_location + prerequisite: + fact: contraband.ring_exists + confidence: KnowsDetails + text: "Shift transition in thirty minutes. If Voss kept the schedule thin, the route's clear." + mood: [analytical] + topic: [cargo] + situation: [shift_transition] + access: [insider] + trust: real + tags: [ring, operational] + + # --- KAEL: THE FRIEND ARC --- + + # Phase 1: Comfort + - id: terminal_m_010 + character: smuggler + trigger: observe_npc + prerequisite: + relationship_state: Friendly + subject: kael_davan + text: "Kael's already at the dock. Good. The day's better when he's on shift." + mood: [fond] + topic: [colleague] + situation: [shift_start] + access: [insider, peer] + trust: surface + tags: [kael, baseline, pre_contradiction] + notes: "Phase 1 warmth. Establishes the bond before it gets tested." + + # Phase 2: First crack + - id: terminal_m_011 + character: smuggler + trigger: observe_anomaly + prerequisite: + all: + - relationship_state: Friendly + subject: kael_davan + - known_attributes: + subject: kael_davan + key: behavior_flags + value_contains: lattice_checking + text: "Kael keeps checking his lattice. Waiting for a message? Not like him to be jumpy." + mood: [concerned] + topic: [colleague] + situation: [routine] + access: [insider] + trust: real + tags: [kael, tell, first_crack] + notes: "Phase 2. Smuggler notices, doesn't flag it. Updates behavior_flags." + + - id: terminal_m_012 + character: smuggler + trigger: post_conversation + prerequisite: + known_attributes: + subject: kael_davan + key: behavior_flags + value_contains: evasive + text: "Kael cut lunch short again. 'Things to take care of.' Since when does Kael have things to take care of that don't involve me?" + mood: [worried] + topic: [colleague] + situation: [routine] + access: [insider] + trust: real + tags: [kael, tell, pattern_forming] + + # Phase 3: The contradiction + - id: terminal_m_013 + character: smuggler + trigger: witness_interaction + prerequisite: + relationship_state: Friendly + subject: kael_davan + text: "Kael? By the service hatch? And that's — I don't know them. Not crew, not ring. Who is that?" + mood: [concerned] + topic: [colleague] + situation: [observation] + access: [insider] + trust: real + tags: [kael, the_friend, contradiction, critical_moment] + notes: > + THE CONTRADICTION. Kael in restricted area with unknown contact. + Sets contradiction_flagged: meeting_unknown_contact. + RelationshipState: Friendly -> PersonOfInterest. Green -> amber. + + # Phase 4: Confrontation aftermath + - id: terminal_m_014 + character: smuggler + trigger: post_conversation + prerequisite: + all: + - relationship_state: PersonOfInterest + subject: kael_davan + - known_attributes: + subject: kael_davan + key: tell_observed + value: looks_left_when_lying + text: "He looked left. He always looks left when he's making something up. Two years I've known that tell. Kael is lying to me." + mood: [conflicted] + topic: [trust] + situation: [confrontation] + access: [insider] + trust: real + tags: [kael, the_friend, tell_confirmation] + notes: "The tell pays off. Established early in casual observation, confirmed under pressure." + + # Phase 5: Contaminated trust + - id: terminal_m_015 + character: smuggler + trigger: observe_npc + prerequisite: + all: + - relationship_state: PersonOfInterest + subject: kael_davan + - known_attributes: + subject: kael_davan + key: contradiction_flagged + value: meeting_unknown_contact + text: "Same old Kael. Same jokes, same routine. ...What are you not telling me?" + mood: [conflicted] + topic: [colleague] + situation: [routine] + access: [insider] + trust: real + tags: [kael, the_friend, contaminated_trust] + notes: "Phase 5. Warmth and doubt simultaneously. Every smile now has a question mark." + + # --- OPERATIONAL --- + + - id: terminal_m_020 + character: smuggler + trigger: observe_anomaly + prerequisite: + fact: investigation.cargo_anomaly + confidence: Suspects + text: "That container's been in temp since yesterday. Someone forgot to process it, or someone's stalling." + mood: [concerned] + topic: [cargo] + situation: [routine] + access: [insider] + trust: real + tags: [investigation, cargo] + + - id: terminal_m_021 + character: smuggler + trigger: time_idle + prerequisite: + fact: world.shift_schedule + confidence: KnowsDetails + text: "Thirteen-forty. Transition window opens in fifty minutes. After that, twenty minutes of reduced oversight." + mood: [analytical] + topic: [routine] + situation: [routine] + access: [insider] + trust: real + tags: [ring, timing, operational] +``` + +--- + +### The Last Shift (Bar) — Detective Monologue + +```yaml +# File: content/bar/monologue-detective.yaml +# Location: The Last Shift (Bar) +# Character: Detective + +lines: + + # --- ARRIVAL --- + + - id: bar_m_001 + character: detective + trigger: enter_location + prerequisite: null + text: "The Last Shift. Grain spirit and low conversation. Only place in this district that doesn't smell like freight lubricant." + mood: [comfortable] + topic: [routine] + situation: [arrival, bar_evening] + access: [public] + trust: surface + tags: [baseline, atmosphere] + + - id: bar_m_002 + character: detective + trigger: return_visit + prerequisite: + fact: progress.initial_suspicion + confidence: KnowsOf + text: "Back again. People talk here. And people who don't talk are talking too — just not out loud." + mood: [analytical] + topic: [investigation] + situation: [bar_evening] + access: [authority] + trust: real + tags: [investigation, atmosphere] + + # --- SERA: THE FRIEND ARC --- + + # Phase 1: Trust + - id: bar_m_010 + character: detective + trigger: observe_npc + prerequisite: + relationship_state: Friendly + subject: sera_venn + text: "Sera's in her usual booth. Good. One familiar face in a district that doesn't want me here." + mood: [relieved] + topic: [colleague] + situation: [bar_evening] + access: [peer] + trust: surface + tags: [sera, baseline, trust] + notes: "Phase 1. Sera is the detective's anchor. Establish this warmth — it has to hurt later." + + # Phase 2: Background + - id: bar_m_011 + character: detective + trigger: post_conversation + prerequisite: + relationship_state: Friendly + subject: sera_venn + text: "Sera's connected here. Knows the regulars, knows the routines. And she's got diagnostic access. Useful." + mood: [comfortable] + topic: [colleague] + situation: [social] + access: [peer] + trust: surface + tags: [sera, background, pre_contradiction] + notes: "Phase 2. The detective notes Sera's access level without realizing it's the source of the conflict." + + # Phase 3: Pattern — first departure + - id: bar_m_012 + character: detective + trigger: witness_interaction + prerequisite: + relationship_state: Friendly + subject: sera_venn + text: "Sera headed out. Early shift tomorrow, she said. Fair enough." + mood: [comfortable] + topic: [colleague] + situation: [bar_evening] + access: [peer] + trust: surface + tags: [sera, avoidance, departure_1] + notes: "First Torek departure. Detective barely notices." + + # Phase 3: Pattern — second departure + - id: bar_m_013 + character: detective + trigger: witness_interaction + prerequisite: + known_attributes: + subject: sera_venn + key: behavior_flags + value_contains: avoidance_pattern + text: "Sera left again. Headache. Right after Torek walked in. ...Noted." + mood: [suspicious] + topic: [colleague] + situation: [bar_evening] + access: [peer] + trust: real + tags: [sera, avoidance, departure_2] + notes: "Second departure. Detective notes it. Not yet a pattern." + + # Phase 3: Pattern — the third (contradiction) + - id: bar_m_014 + character: detective + trigger: witness_interaction + prerequisite: + known_attributes: + subject: sera_venn + key: contradiction_flagged + value: avoidance_inconsistency + text: "That's the third time. Early shift, headache, kiosk check. Three excuses, one result. Sera leaves when Torek arrives. That's not coincidence." + mood: [analytical] + topic: [colleague] + situation: [bar_evening, observation] + access: [peer] + trust: real + tags: [sera, the_friend, contradiction_discovery] + notes: > + THE CONTRADICTION. Three data points make a conclusion. + Sets contradiction_flagged: avoidance_inconsistency. + RelationshipState: Friendly -> PersonOfInterest. Green -> amber. + Different from Kael's — cumulative, not sudden. + + # Phase 4: The question asked + - id: bar_m_015 + character: detective + trigger: post_conversation + prerequisite: + all: + - relationship_state: PersonOfInterest + subject: sera_venn + - known_attributes: + subject: sera_venn + key: tell_observed + value: controlled_deflection,topic_change + text: "She deflected. Smooth — 'he's just loud.' Technically true. But her shoulders shifted. Sera, what do you know about Torek?" + mood: [conflicted] + topic: [trust] + situation: [confrontation] + access: [authority] + trust: real + tags: [sera, the_friend, post_confrontation] + notes: "Phase 4. The detective hears the non-lie. Deflection IS the tell." + + # Phase 5: Contaminated trust + - id: bar_m_016 + character: detective + trigger: return_visit + prerequisite: + relationship_state: PersonOfInterest + subject: sera_venn + text: "Same booth. Same warm smile. Same offer to buy me a drink. ...Everything except whatever she's not saying." + mood: [conflicted] + topic: [trust] + situation: [bar_evening] + access: [authority] + trust: real + tags: [sera, the_friend, contaminated_trust] + notes: "Phase 5. Every kindness now has a question mark. The past is retroactively contaminated." + + # --- TOREK --- + + - id: bar_m_020 + character: detective + trigger: observe_npc + prerequisite: + relationship_state: Unknown + subject: torek_lintar + text: "Loud one at the bar. Buying rounds he probably can't afford. Worth watching." + mood: [analytical] + topic: [money] + situation: [bar_evening] + access: [public] + trust: surface + tags: [torek, first_observation, spending] + + # --- ATMOSPHERE --- + + - id: bar_m_030 + character: detective + trigger: time_idle + prerequisite: + fact: progress.initial_suspicion + confidence: KnowsOf + text: "Everyone's friendly enough. Drinks, jokes, the usual complaints about shift schedules. But friendly and honest aren't the same thing." + mood: [suspicious] + topic: [routine] + situation: [bar_evening] + access: [public] + trust: real + tags: [atmosphere, investigation, early_game] +``` + +--- + +### Corridor B-7 — Smuggler Monologue + +```yaml +# File: content/corridor/monologue-smuggler.yaml +# Location: Corridor B-7 (Maintenance / Smuggling Route) +# Character: Smuggler + +lines: + + # --- ENTRY --- + + - id: corridor_m_001 + character: smuggler + trigger: enter_location + prerequisite: + fact: location.corridor_b7_restricted + confidence: KnowsDetails + text: "B-7. Old prefab, minimal coverage. The route works because nobody updated the surveillance map." + mood: [analytical] + topic: [routine] + situation: [night_shift] + access: [insider] + trust: real + tags: [ring, operational, spatial] + + - id: corridor_m_002 + character: smuggler + trigger: enter_location + prerequisite: + fact: location.corridor_b7_restricted + confidence: Suspects + text: "Maintenance corridor. Quiet. Shouldn't be this quiet during shift change." + mood: [suspicious] + topic: [routine] + situation: [shift_transition] + access: [public] + trust: surface + tags: [exploration, spatial] + notes: "Lower confidence — smuggler who doesn't know B-7's significance yet." + + # --- ENVIRONMENTAL --- + + - id: corridor_m_003 + character: smuggler + trigger: hear_sound + prerequisite: + fact: location.corridor_b7_restricted + confidence: KnowsOf + text: "Footsteps. Wrong cadence for maintenance crew. Someone's being careful." + mood: [concerned] + topic: [danger] + situation: [night_shift] + access: [insider] + trust: real + tags: [tension, spatial_awareness] + + - id: corridor_m_004 + character: smuggler + trigger: time_idle + prerequisite: + fact: location.surveillance_gaps + confidence: KnowsDetails + text: "No Meridian signal down here. No eyes, no ears. Whatever happens in B-7 stays in B-7." + mood: [relieved] + topic: [routine] + situation: [alone] + access: [insider] + trust: real + tags: [ring, surveillance, operational] + + # --- THE CONTRADICTION --- + + - id: corridor_m_010 + character: smuggler + trigger: witness_interaction + prerequisite: + relationship_state: Friendly + subject: kael_davan + text: "Kael? Down here? And that's — I don't know them. Not crew, not ring. Who the hell is that?" + mood: [concerned] + topic: [colleague] + situation: [observation] + access: [insider] + trust: real + tags: [the_friend, contradiction, kael, critical_moment] + notes: > + THE CONTRADICTION. The moment the smuggler's world shifts. + Kael in a restricted corridor with an unknown contact. + Sets contradiction_flagged: meeting_unknown_contact. + RelationshipState: Friendly -> PersonOfInterest. + Color: green -> amber. This moment is the emotional core of the arc. + + - id: corridor_m_011 + character: smuggler + trigger: post_conversation + prerequisite: + all: + - relationship_state: PersonOfInterest + subject: kael_davan + - known_attributes: + subject: kael_davan + key: tell_observed + value: looks_left_when_lying + text: "He looked left. Always looks left when he's making something up. Two years, Kael. I know your tells." + mood: [conflicted] + topic: [trust] + situation: [confrontation] + access: [insider] + trust: real + tags: [the_friend, kael, tell_confirmation] + notes: "Tell payoff. Established early in casual dialogue, confirmed here under pressure." + + # --- EVIDENCE --- + + - id: corridor_m_020 + character: smuggler + trigger: discover_evidence + prerequisite: + fact: location.dead_drop_location + confidence: Direct + text: "Locker 47. Registered to someone who transferred out eighteen months ago. Convenient." + mood: [analytical] + topic: [cargo] + situation: [investigation] + access: [insider] + trust: real + tags: [dead_drop, evidence] + + - id: corridor_m_021 + character: smuggler + trigger: observe_anomaly + prerequisite: + fact: location.smuggling_route + confidence: KnowsDetails + text: "Fresh marks on the service hatch. Kosse's been through here. Right on schedule." + mood: [comfortable] + topic: [cargo] + situation: [night_shift] + access: [insider] + trust: real + tags: [ring, route, operational] + + # --- RETURN --- + + - id: corridor_m_030 + character: smuggler + trigger: return_visit + prerequisite: + all: + - fact: location.corridor_b7_restricted + confidence: KnowsDetails + - relationship_state: PersonOfInterest + subject: kael_davan + text: "B-7 again. Last time I was here, Kael was talking to someone he shouldn't have been. The corridor feels different now." + mood: [suspicious] + topic: [colleague] + situation: [alone] + access: [insider] + trust: real + tags: [kael, the_friend, post_contradiction, return] + notes: "The space is contaminated by what happened here. Location memory." +``` + +--- + +## File Naming and Directory Structure + +Content is organized by location and character. Location is implicit from directory — don't duplicate it in per-line tags. + +``` +content/ + terminal/ + monologue-smuggler.yaml + monologue-detective.yaml + dialogue.yaml + bar/ + monologue-smuggler.yaml + monologue-detective.yaml + dialogue.yaml + corridor/ + monologue-smuggler.yaml + monologue-detective.yaml + dialogue.yaml +``` + +Monologue files are hard-partitioned by character (D-032). One file per character per location. Dialogue files are shared — access-tier filtering happens at runtime. + +### ID Convention + +`{location}_{type}_{###}` + +- **location**: `terminal`, `bar`, `corridor` (or `hub`, `corr` as shorthand) +- **type**: `m` (monologue), `d` (dialogue), `e` (environmental) +- **number**: Sequential per file, starting at 001 + +--- + +## Authoring Checklist + +Before submitting a line: + +1. **Who is speaking?** Monologue: which character? Dialogue: which role? +2. **What do they know?** Does the prerequisite reference a real FactId, RelationshipState, or attribute key from the catalogs? +3. **What triggers it?** One of 9 types. Does the trigger match the game moment? +4. **Dual-lens check.** If dialogue, does it read differently for smuggler vs detective? Document in `dual_lens`. +5. **Brevity.** Monologue competes with gameplay. If it's longer than one breath, cut it. +6. **Voice.** Does it sound like the character? The detective analyzes. The smuggler worries about people. NPCs talk like themselves, not like game designers. +7. **Show don't tell.** "The lock's been forced" not "Someone has broken into this room." +8. **Access tier.** Is the line available to the right people? Does PersonOfInterest correctly lock out trust content? + +--- + +**Cross-References:** +- [D-028](../../../decisions/content.md#d-028-dialogue-architecture--tagged-line-pools-with-four-relational-layers): Dialogue architecture, four relational layers +- [D-032](../../../decisions/content.md#d-032-separate-monologue-pools-per-character): Separate monologue pools per character +- [D-035](../../../decisions/content.md#d-035-converged-tag-taxonomy-for-dialogue-and-monologue-line-pools): Converged tag taxonomy +- [Fact Catalog](../knowledge/fact-catalog.md): All 24 FactIds for prerequisites +- [Entity Attributes](../knowledge/entity-attributes.md): 14 canonical known_attributes keys +- [Relationship States](../knowledge/relationship-states.md): 5 states, transitions, access tier mapping + +*If this guide contradicts a decision file, the decision file wins.* diff --git a/docs/wiki/contraband/lattice-components.md b/docs/wiki/contraband/lattice-components.md new file mode 100644 index 000000000..c88cad109 --- /dev/null +++ b/docs/wiki/contraband/lattice-components.md @@ -0,0 +1,120 @@ +# Lattice Components (Contraband) + +**Type:** Primary Contraband +**Status:** Canonical +**Legality:** Category 3 violation (unauthorized lattice modification) +**Source:** Aftermarket manufacturers, Syndic-adjacent supply chains +**Moved By:** The ring (Sova Transit District smuggling operation) + +--- + +## Overview + +Unlicensed lattice components are the primary contraband in the v0.1 smuggling scenario. These are aftermarket neural lattice modifications — processing nodes, capability packages, interface upgrades — that bypass [Lattice Commission](../technology/neural-lattice.md#commission-regulation) certification. + +They are not defective. They are not dangerous. They are unauthorized. And that distinction is the moral core of the smuggling operation. + +--- + +## What They Are + +**Aftermarket processing nodes:** Replacement or supplementary lattice nodes that enhance processing speed, expand perception mode capability, or add professional toolkit functions. Manufactured by independent producers outside the Commission certification pipeline. Technically identical to certified components — same materials, same specifications — but without the paperwork. + +**Capability upgrade packages:** Software-equivalent modifications that unlock lattice functions normally restricted by tier authorization. A Baseline lattice user could, with the right aftermarket package, access Enhanced-tier perception processing — camera feed interpretation, audio analysis, improved sensory augmentation — without institutional sponsorship. + +**Interface modifications:** Adjustments to how the lattice communicates with the Meridian network and external systems. These can improve connectivity, reduce latency, or — critically — modify what data the lattice reports back to institutional monitoring systems. + +--- + +## Why People Want Them + +**Professional capability:** A freight scheduler with an aftermarket processing upgrade handles manifests faster, catches errors sooner, becomes more valuable at work. A maintenance technician with enhanced diagnostic capabilities works more efficiently. The upgrade pays for itself in job performance. + +**Perception access:** The Commission's tier system means most people on Station Sova are locked into Baseline perception — natural vision and basic Meridian access. Enhanced perception modes (camera access, audio analysis, tracking) require institutional sponsorship. People who want to see more of their own world must either get institutional approval or go to the aftermarket. + +**Economic calculation:** Commission-certified upgrades cost 3-5x more than aftermarket equivalents and take 6-12 months to process. For a dock worker making 2,400 credits per month with 200 credits margin, the choice between waiting a year for certification or buying aftermarket this month is not a difficult calculation. + +**Agency:** Let me complicate this by noting that the desire for aftermarket lattice components isn't just economic. It's about who gets to decide what you can perceive. The Commission's tier system gates perception capability behind institutional approval. Aftermarket components let people make that choice for themselves. This is the same impulse that drives the Guardians of Autonomy — the belief that perception shouldn't require permission. + +--- + +## The Supply Chain + +From `contraband.supply_chain` (fact catalog): + +1. **Manufacturing:** Syndic-adjacent independent manufacturers produce lattice components outside Commission jurisdiction. Quality is professional-grade — these aren't garage operations. +2. **Interstellar transit:** Components move through [Founder Gate](../technology/founder-gates.md) networks to distribution nodes. +3. **Off-station coordination:** Sabel (off-station) manages incoming shipments, coordinates timing with ring operations. +4. **Gate arrival:** Contraband arrives mixed with legitimate freight through [span gates](../technology/span-gates.md) on scheduled cargo cycles. +5. **Inspection bypass:** Containers with doctored manifests pass through inspection. Weight discrepancies are the primary forensic evidence (logged weight vs. actual weight). +6. **Ring coordination:** Devra or Nils coordinate local distribution. Kael and Kosse handle physical cargo. Voss provides scheduling cover. +7. **Local distribution:** Components reach buyers through informal networks, facilitated through The Last Shift as a social clearing house. + +--- + +## Investigation Vectors + +**For the detective:** +- `investigation.manifest_discrepancy` — Weight-to-volume mismatches in cargo manifests. The detective's Analytical lattice flags these automatically at Suspects confidence. +- `investigation.cargo_anomaly` — Containers sitting in temporary storage longer than standard procedure allows. +- `investigation.shift_mismatch` — Night shift schedules inconsistent with freight volume (Voss creating coverage gaps). +- `contraband.lattice_components` — At KnowsOf: "Unlicensed lattice components. Aftermarket mods that bypass Commission certification." At Direct: "I'm looking at a crate of lattice components right now. Serial numbers don't match any certified batch." + +**For the smuggler:** +- The smuggler knows what's in the containers — they handle them. The question isn't "what is this?" but "is this worth the risk?" +- `contraband.lattice_components` at KnowsDetails: "Medical-grade neural lattice replacements diverted from Syndic supply chains, plus enhanced capability mods." + +--- + +## Moral Complexity + +The ring is smuggling *access*, not weapons. People want aftermarket lattice components because: +- The Commission certification system is too slow and too expensive +- Professional capability enhancement improves their economic position +- Perception access shouldn't be gated by institutional approval +- The aftermarket components are functionally identical to certified ones + +But also: +- Uncertified components bypass safety protocols (even if the components themselves are safe, the installation process matters) +- Aftermarket lattice mods can include interface modifications that obscure institutional monitoring — useful for privacy, also useful for hiding criminal activity +- The supply chain that delivers lattice components also delivers [medical-grade replacements](medical-grade-replacements.md) and [Severance equipment](severance-equipment.md) — the morally sympathetic cargo shares infrastructure with the politically dangerous cargo + +**The honest truth:** The player — whether smuggler or detective — must decide how they feel about a community that smuggles healthcare and capability upgrades through the same channels that move counter-surveillance equipment for political dissidents. The ring doesn't separate its cargo into "sympathetic" and "dangerous" categories. It's all the same operation. + +--- + +## Mechanical Integration + +**Knowledge Graph FactIds:** +- `contraband.lattice_components` — primary contraband identification (4 confidence levels) +- `contraband.ring_exists` — meta-knowledge that a smuggling operation exists +- `contraband.supply_chain` — network knowledge tracing the full chain +- `world.commission_regulations` — institutional context that explains the black market + +**Perception Connection (D-017):** +- Lattice components connect directly to the perception system — a smuggled upgrade could theoretically change what the player perceives +- This connection is referenced in lore and dialogue, not mechanically implemented in v0.1 +- Future scope: aftermarket lattice upgrade as player progression mechanic + +**Investigation Mechanics:** +- Manifest discrepancies are the primary forensic evidence +- Weight-to-volume cross-referencing (detective's Analytical lattice) +- Serial number mismatches against Commission certified batch database +- Container processing delays in temporary storage + +--- + +**Cross-References:** +- [Neural Lattice](../technology/neural-lattice.md) — The technology being modified +- [Medical-Grade Replacements](medical-grade-replacements.md) — Secondary contraband (healthcare dimension) +- [Severance Equipment](severance-equipment.md) — Tertiary contraband (political dimension) +- [Sova Transit District](../world/sova-transit-district.md) — The ring's operational infrastructure +- [Fact Catalog](../knowledge/fact-catalog.md) — FactId confidence progressions +- D-037: Contraband specification +- D-017: Perception modes (lattice tier determines available modes) + +--- + +**Status:** Canonical — primary contraband type +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/contraband/medical-grade-replacements.md b/docs/wiki/contraband/medical-grade-replacements.md new file mode 100644 index 000000000..977cab53a --- /dev/null +++ b/docs/wiki/contraband/medical-grade-replacements.md @@ -0,0 +1,128 @@ +# Medical-Grade Replacements (Contraband) + +**Type:** Secondary Contraband +**Status:** Canonical +**Legality:** Category 3 violation (unauthorized lattice modification) + controlled medical device distribution +**Source:** Diverted from Syndic supply chains +**Moved By:** The ring (Sova Transit District smuggling operation) + +--- + +## Overview + +Medical-grade neural lattice replacements are the ring's morally complicated cargo. These are professional-quality replacement components for people whose [neural lattices](../technology/neural-lattice.md) are degrading — nodes failing, processing slowing, perception overlays flickering. The same components available through Commission-certified medical channels, diverted from Syndic manufacturing supply chains and sold at prices working people can afford, without the 6-12 month institutional approval cycle. + +This is healthcare, not just profit. + +--- + +## The Medical Reality + +Neural lattices are biotech. They degrade over time. For most people in the Settled Reach, lattice degradation is the most serious medical issue they'll face — because it affects everything. A degrading lattice means: + +- Perception overlays lag, flicker, or fail +- Meridian connectivity becomes unreliable (missed messages, dropped connections) +- Professional toolkit functions produce errors (a freight scheduler whose manifest overlay glitches misses container data) +- In advanced degradation: headaches, sensory artifacts, disorientation, reduced cognitive processing +- In severe cases: effective disability — the person can no longer perform lattice-dependent work + +**Treatment through legitimate channels:** +1. Diagnosis at a Commission-certified medical facility +2. Replacement component requisition (Commission approval required) +3. 6-12 month approval cycle for component sourcing and certification +4. Installation at a certified facility +5. Post-installation compliance verification + +**Cost:** Prohibitive for most workers on Station Sova. A full lattice replacement through legitimate channels costs 8-12 months of a dock worker's total salary. Component-by-component replacement (replacing only the failing nodes) is cheaper but still requires the full approval cycle for each component. + +**Wait time:** The approval cycle exists because the Commission certifies each replacement component individually. For someone whose lattice is degrading now — whose professional capability is declining this month, whose perception overlays are failing this week — "6-12 months" is not an acceptable medical timeline. + +--- + +## What the Ring Provides + +The ring's medical-grade replacements are the same components available through legitimate channels — same Syndic manufacturing, same specifications, same quality. The difference is distribution: + +- No Commission certification process +- No institutional medical authorization required +- No 6-12 month wait +- Available at approximately 30-40% of institutional pricing +- Installation handled through informal medical networks (retired technicians, sympathetic medics) + +**Quality:** These are not bootleg components. They are legitimate medical-grade products that have been diverted from authorized supply chains. The ring doesn't manufacture anything — it redirects what already exists. + +**Risk:** Installation outside certified facilities carries genuine medical risk. Not because the components are inferior, but because installation is a medical procedure that requires precision. The informal installation network varies in quality. Most procedures go well. Some don't. The ring doesn't advertise the risk, and buyers don't ask. + +--- + +## Who Needs Them + +**Aging workers:** Long-term Sova residents whose lattices were installed 15-20+ years ago. Nodes degrade. Processing slows. These workers need replacements to maintain professional capability and daily function. + +**Economically locked-out workers:** People who could get Commission approval but can't afford the certified pricing or can't afford to wait. Their lattices are degrading now. Their jobs depend on lattice function now. The black market serves them because the legitimate market won't — not on their timeline, not at their price point. + +**Unsponsored civilians:** People without institutional employment (freelancers, small business operators, dependents) who don't have employer-subsidized lattice maintenance. The Commission system assumes institutional sponsorship. People outside institutions fall through the cracks. + +**The hidden demand:** Lattice degradation is not discussed openly. People don't announce that their perception overlays are failing or that they can't process data as fast as they used to. There's a stigma — lattice degradation reads as aging, declining capability, becoming less useful. The black market serves this hidden demand quietly, through social networks and trusted referrals. + +--- + +## Why This Matters Narratively + +Medical-grade replacements are the smuggling ring's moral shield. When the ring moves [aftermarket capability upgrades](lattice-components.md), the moral case is ambiguous — desire, not need. When the ring moves [Severance equipment](severance-equipment.md), the moral case is complicated — political ideology, not community service. But medical-grade replacements are healthcare. People need these components. The legitimate system isn't providing them at accessible cost or speed. + +**For the smuggler:** Medical-grade cargo is the justification. "We're helping people" is not just rationalization — it's true. The ring serves a real medical need. This knowledge sustains the smuggler through the moral ambiguity of the rest of the operation. When the smuggler learns about Severance equipment in the cargo, the medical-grade components are the counterweight: "Yes, the cargo includes scary things, but it also includes this." + +**For the detective:** Medical-grade replacements are the complication. The detective's institutional mandate is clear: contraband is contraband. But confiscating medical-grade replacements means confiscating healthcare from people who need it. Every container of medical lattice components the detective seizes is a person whose degrading lattice won't get fixed — at least not for another 6-12 months, at a price they can't afford. + +**The convergence:** Both characters must reckon with the same fact: the ring's medical cargo serves a genuine need that legitimate institutions fail to meet. The smuggler uses this to justify the operation. The detective must confront what enforcement actually costs in human terms. + +--- + +## Knowledge Graph Integration + +**FactId: `contraband.medical_grade`** +- **Suspects:** "Some of this cargo doesn't feel like luxury goods." +- **KnowsOf:** "Medical-grade lattice replacements. For people whose lattices are degrading and who can't afford Syndic pricing." +- **KnowsDetails:** "The ring moves medical replacements for people locked out of the institutional system. It's not just profit — it's healthcare." +- **Direct:** N/A (conceptual understanding) + +**Mechanical Purpose:** Moral complexity gate. Smuggler monologue shifts tone when this reaches KnowsDetails — from justification to conviction. Detective dialogue with humanitarian-focused NPCs requires KnowsOf — understanding the medical dimension changes available conversation options. + +**Related FactIds:** +- `world.commission_regulations` (KnowsDetails: "Commission monopoly prices most citizens out of enhanced capability. Medical-grade replacements require 6-12 month approval cycles.") +- `contraband.supply_chain` (KnowsDetails includes medical-grade components in the full chain description) + +--- + +## Mechanical Integration + +**Dialogue Impact:** +- Medical-grade knowledge gates humanitarian dialogue options +- NPCs with degrading lattices (referenced in backstory, not visible as game mechanic) are more sympathetic to the ring +- Trust-tier dialogue shifts when the detective demonstrates awareness of the medical dimension — some NPCs become more forthcoming, others more defensive + +**Monologue Impact:** +- Smuggler monologue at KnowsDetails: conviction that the ring serves the community +- Detective monologue at KnowsOf: recognition that enforcement has human costs +- Both character monologues shift in tone when medical-grade knowledge is established + +**v0.1 Scope:** +- Medical-grade replacements are dialogue and monologue content — not a visible gameplay mechanic +- No player character experiences lattice degradation in the vertical slice +- The moral dimension is expressed through NPC conversations and internal monologue, not through systems + +--- + +**Cross-References:** +- [Neural Lattice](../technology/neural-lattice.md) — The technology being replaced (degradation section) +- [Lattice Components](lattice-components.md) — Primary contraband (capability dimension) +- [Severance Equipment](severance-equipment.md) — Tertiary contraband (political dimension) +- [Fact Catalog](../knowledge/fact-catalog.md) — `contraband.medical_grade` confidence progression +- D-037: Contraband specification (moral dimension confirmed) + +--- + +**Status:** Canonical — secondary contraband type (healthcare dimension) +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/contraband/severance-equipment.md b/docs/wiki/contraband/severance-equipment.md new file mode 100644 index 000000000..b5d3f77d4 --- /dev/null +++ b/docs/wiki/contraband/severance-equipment.md @@ -0,0 +1,121 @@ +# Severance Equipment (Contraband) + +**Type:** Tertiary Contraband +**Status:** Canonical +**Legality:** Highest-severity violation — intelligence-level enforcement response +**Source:** Guardians of Autonomy supply chain +**Moved By:** The ring (Sova Transit District smuggling operation — not all members aware) + +--- + +## Overview + +Severance equipment is the ring's most dangerous cargo — physical [Severance technology](../technology/severance-tech.md) devices that create counter-surveillance capability: Meridian jammers, lattice disruptors, signature masking hardware. Its presence in the ring's inventory transforms a local grey-market operation into something connected to interstellar political movements. + +This is the cargo that makes the ring scary. Not because it's weapons — it's not. Because it means someone with institutional-level ambitions is using a small station's smuggling network as a distribution channel. + +--- + +## What's in the Containers + +The specific Severance equipment in the ring's cargo is not fully cataloged in v0.1 — it lives in sealed containers that most ring members don't open and Nils doesn't discuss. What's known: + +**Hardware:** +- Meridian signal jammers (localized blackout devices, portable) +- Lattice function disruptors (area-effect devices that degrade lattice processing) +- Signature masking units (individual-wear devices that suppress lattice tracking signatures) + +**Characteristics:** +- Heavier than lattice components (the sealed containers Nils won't discuss are "heavier than lattice components" per fact progression) +- Professionally manufactured — not improvised or garage-built +- Sourced through Guardians of Autonomy supply networks +- Transit through the same interstellar routes as the ring's other cargo + +--- + +## The Guardians Connection + +The Guardians of Autonomy are a decentralized political movement spread across multiple systems in the Settled Reach. They oppose lattice-mediated institutional surveillance and advocate for individual control over perception technology. Severance technology is their tool of choice — the mechanism for opting out of the information architecture. + +**What this means for the ring:** The ring didn't set out to be part of a political movement. They started as a local commercial operation — moving lattice components to serve community demand. The Severance equipment arrived through the same supply chain, managed by the same off-station coordinator (Sabel), distributed through the same infrastructure. The ring became a Guardians distribution node by logistics, not ideology. + +**What this means for the story:** The Guardians connection is the contamination seed. It transforms the ring from "local grey market, community immune system" into "local node in an interstellar political network." Not because the ring members are political actors — most of them aren't — but because their infrastructure serves political purposes they didn't choose and may not fully understand. + +--- + +## Who Knows What + +**Ring members who know:** Nils (manages the sealed containers directly), Devra (coordinates with off-station contact Sabel, likely aware). The sealed containers are Nils's domain — he handles them personally, doesn't discuss contents, stores them separately from lattice cargo. + +**Ring members who suspect:** Kael (has noticed the sealed containers, hasn't asked), Voss (provides scheduling cover for all cargo, doesn't differentiate). Others in the ring handle lattice components and medical-grade replacements; the Severance cargo moves through a tighter channel. + +**Ring members who don't know:** Kosse, Lera, Pell, and other peripheral members. They know the ring moves lattice cargo. The Severance equipment is compartmentalized. + +**The smuggler (player):** Starts without knowledge of the Severance cargo. Discovery follows the fact progression — suspicious sealed containers, Nils's evasion, eventually the truth. This discovery is the contamination moment that complicates the smuggler's moral position. + +**The detective (player):** Discovers Severance equipment through investigation — either by identifying the containers, by following the supply chain, or through NPC testimony. The discovery transforms the case. + +--- + +## Why This Cargo Changes Everything + +**For the smuggler:** +Lattice components? Serving community demand. Medical-grade replacements? Providing healthcare. Severance equipment? Enabling political actors to undermine institutional infrastructure. The moral progression is: justified → sympathetic → unsettling. The smuggler must decide whether the Guardians' cause is worth the risk, whether the ring's other cargo justifies its role as a Severance distribution point, and whether they can continue participating once they know the full picture. + +**For the detective:** +Manifest fraud and unlicensed lattice components are a local enforcement matter. Severance equipment distribution is an intelligence-level concern. The detective's case changes from "file a report with the Commission" to "flag this for system-level authorities." The stakes of every decision — who to confront, who to protect, what to report — increase dramatically. Turning an informant isn't just building a smuggling case anymore; it's potentially exposing a Guardians network. + +**For the narrative:** +Severance equipment is the thing that prevents the v0.1 story from being small. A smuggling ring on a freight station is a local story. A smuggling ring unknowingly serving as a node in an interstellar political movement is a story that points beyond its setting. The Severance cargo is the promise that this story has roots and branches the player can't see yet. + +--- + +## Knowledge Graph Integration + +**FactId: `contraband.severance_tech`** +- **Suspects:** "Sealed containers Nils won't discuss. Heavier than lattice components." +- **KnowsOf:** "Severance equipment. Counter-surveillance tech. Illegal across most of the Reach." +- **KnowsDetails:** "Guardians of Autonomy supply chain. This isn't local — it's connected to something bigger." +- **Direct:** N/A (not directly visible in v0.1) + +**Mechanical Purpose:** Contamination seed for storyteller expansion. The thing that makes the smuggler question how deep the ring goes. The thing that transforms the detective's case from local to systemic. + +**Progression design:** Note the deliberate knowledge gap — neither character reaches Direct confidence with Severance tech in v0.1. They know it exists, they know where it comes from, but they never handle it directly or see it deployed. The technology remains slightly abstract, slightly ominous. This is intentional: Severance equipment is a thread to pull in future content, not a puzzle to solve in the vertical slice. + +--- + +## Mechanical Integration + +**Narrative Function:** +- Contamination seed (D-023 tier model: storyteller activates new content based on player proximity and engagement) +- Escalation mechanism within the contraband portfolio (lattice → medical → Severance) +- Trust fracture trigger for the smuggler +- Case transformation trigger for the detective + +**Dialogue Impact:** +- Discovery of Severance equipment changes available dialogue options with Nils, Devra, and Sabel-related threads +- Smuggler confrontation with Nils about sealed containers is a relationship-testing moment +- Detective reporting options bifurcate: local enforcement vs. intelligence escalation + +**v0.1 Scope:** +- Severance equipment is knowledge content — discovered, discussed, worried about +- No Severance technology is deployed or used in the vertical slice +- The equipment's significance is narrative (what it implies about the ring's connections) not mechanical (what it does) +- Future scope: Severance deployment as gameplay mechanic, Guardians faction as content expansion + +--- + +**Cross-References:** +- [Severance Technology](../technology/severance-tech.md) — What the equipment does and why it matters +- [Lattice Components](lattice-components.md) — Primary contraband (commercial dimension) +- [Medical-Grade Replacements](medical-grade-replacements.md) — Secondary contraband (healthcare dimension) +- [Fact Catalog](../knowledge/fact-catalog.md) — `contraband.severance_tech` confidence progression +- [Sova Transit District](../world/sova-transit-district.md) — Ring operational infrastructure +- D-037: Contraband specification +- D-023: Three-tier content model (contamination seed for storyteller) + +--- + +**Status:** Canonical — tertiary contraband type (political dimension) +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/factions/concord-assembly.md b/docs/wiki/factions/concord-assembly.md new file mode 100644 index 000000000..08edf2bea --- /dev/null +++ b/docs/wiki/factions/concord-assembly.md @@ -0,0 +1,111 @@ +# The Concord Assembly + +**Type:** Faction — Legislative Government +**Status:** Canonical +**Scope:** Reach-wide +**Governance Role:** Legislative / Executive +**Headquarters:** Core Systems (TBD) +**Structure:** Representative legislature, proportional delegation by settled system + +--- + +## Overview + +The Concord Assembly is the Settled Reach's representative governing body. Every settled system sends delegates proportional to population. The Assembly debates policy, regulates gate access, funds institutions, and maintains the legal framework that holds the Reach together. Sessions are held in the Core Systems and broadcast across the Meridian. + +The Assembly is the closest thing the Reach has to a legitimate government — and legitimacy is its only real power. It doesn't control the gates (the [Veil Institute](veil-institute.md) does). It doesn't control identity technology (the [Lattice Commission](lattice-commission.md) does). It doesn't control the economy (the [Syndics](syndics.md) do). What it controls is the law, the budget, and the fragile consensus that the Reach is better off unified than fragmented. + +--- + +## What They Control + +- **Legal framework** for the entire Settled Reach +- **Gate activation approvals** (though the Institute performs the actual work) +- **Institutional funding** (Institute, Commission, military) +- **Trade regulation and dispute mediation** between systems +- **Citizenship law** (who qualifies for lattice implantation, re-embodiment rights) + +--- + +## Internal Tensions + +**Core vs. Frontier:** The Assembly's defining fault line. Core system delegates prioritize stability, institutional power, and centralized governance. Frontier delegates want local autonomy, resource sovereignty, and reduced taxation. Every major vote splits along this axis. The frontier delegates are outnumbered by population but loud enough to be heard. + +**Institutionalists vs. Reformers:** Some delegates believe the current system — slow, consensus-driven, deliberately cautious — is the only thing preventing the Reach from fragmenting. Others believe the system is corrupt, captured by Syndic lobbying, Perpetual influence, and institutional inertia. Both sides have evidence. + +**Transparency vs. Security:** Assembly votes are public. Institutional budgets are not. The Commission and Institute classify everything. The Assembly funds institutions it cannot fully monitor. How much oversight should elected representatives have over organizations they created but can no longer control? + +--- + +## What They Want + +- **Short-term:** Prevent the Reach from fragmenting along Core-Frontier lines +- **Long-term:** Maintain legitimacy as the governing body while real power — gate control, lattice access, economic infrastructure — is held by institutions and Syndics they can influence but not command + +--- + +## Power & Vulnerability + +| Power | Vulnerability | +|-------|---------------| +| Legal authority (universally recognized) | Depends on institutions it can't directly control | +| Control over institutional funding | Lobbyists (Syndics, Perpetuals, Institute) shape outcomes | +| Cultural legitimacy (represents the social contract) | Slow decision-making means reactive, not proactive | +| Dispute mediation (the alternative is conflict) | Frontier systems questioning the contract itself | + +--- + +## Faction Relationships + +| Faction | Relationship | Dynamic | +|---------|-------------|---------| +| [Lattice Commission](lattice-commission.md) | Conditional ally | Legal backing; Commission enforces Assembly law but resists oversight | +| [Veil Institute](veil-institute.md) | Conditional ally | Assembly funds Institute; Institute resists disclosure | +| [Syndics](syndics.md) | Rival / Dependent | Assembly regulates commerce; Syndics lobby to weaken regulation | +| [Guardians of Autonomy](guardians-of-autonomy.md) | Antagonist | Guardians undermine Assembly authority; Assembly dismisses Guardian concerns | +| [The Unbound](the-unbound.md) | Ambivalent | Unbound citizenship rights are an unresolved legal question | + +--- + +## Mechanical Hooks for Gameplay + +- **Legislative events:** Player actions can trigger Assembly debates. Expose a conspiracy and an emergency session follows. Destabilize a frontier system and Separatist delegates push for autonomy. +- **Access to institutional data:** Assembly investigators can request (but not compel) data from the Commission or Institute. Legal authority with institutional resistance. +- **Public vs. private information:** Assembly debates are broadcast. What's said publicly differs from what's said in backrooms. The player might attend a session and overhear the real conversation afterward. +- **Vote manipulation:** Lobbyists, Perpetuals, and factions all try to swing votes. The player can participate — gather leverage, offer information, make deals. + +--- + +## NPC Archetypes + +- **The Idealist Delegate:** Believes the system can work, fights for reform from within +- **The Pragmatist Delegate:** Keeps the lights on through compromise, distasteful but functional +- **The Captured Delegate:** In someone's pocket (Syndics, Perpetuals, Institute) — useful if you know who holds the leash +- **The Assembly Investigator:** Legal authority meets institutional obstruction + +--- + +## v0.1 Relevance + +The Concord Assembly is **referenced but not directly present** in the v0.1 vertical slice. Its influence is felt through: +- The legal framework that gives the detective jurisdictional authority +- News ticker headlines about Assembly proceedings (background texture) +- The institutional hierarchy that assigns Commission investigators to districts like Sova +- NPC dialogue referencing "the Assembly" as distant governance — recognized, not loved + +The Assembly is the water the v0.1 fish swim in. Nobody in Sova Transit District thinks about the Assembly day-to-day, the same way nobody thinks about the legislature that passed the labor laws governing their shift schedule. But the Assembly's decisions created the Commission, funded the Institute, and wrote the regulations that make lattice smuggling illegal. Every tension in the district traces back to Assembly policy, however distantly. + +--- + +**Cross-References:** +- [Lattice Commission](lattice-commission.md) — Regulatory body the Assembly funds +- [Veil Institute](veil-institute.md) — Research institution the Assembly funds +- [Syndics](syndics.md) — Commercial interests that lobby the Assembly +- D-036: Sova Transit District setting (Concord Assembly as governance) +- Round 16: Full faction development + +--- + +**Status:** Canonical +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/factions/guardians-of-autonomy.md b/docs/wiki/factions/guardians-of-autonomy.md new file mode 100644 index 000000000..41b957597 --- /dev/null +++ b/docs/wiki/factions/guardians-of-autonomy.md @@ -0,0 +1,127 @@ +# Guardians of Autonomy + +**Type:** Faction — Counter-Institutional Resistance Movement +**Status:** Canonical +**Scope:** Reach-wide (decentralized) +**Governance Role:** Subversive / Counter-institutional +**Headquarters:** None (decentralized cells and safe houses) +**Structure:** Loose network of individuals and autonomous cells +**Colloquial Name:** "Severance" (after their counter-surveillance technology) + +--- + +## Overview + +The Guardians of Autonomy are a decentralized network of individuals and groups who believe the Settled Reach's institutional infrastructure — the neural lattice, the Meridian, the imprint system — constitutes a surveillance and control apparatus so pervasive that meaningful freedom is impossible. They are not anti-technology. They are anti-*centralized* technology. + +The Guardians occupy a precarious position in Reach society. They are dismissed as paranoid conspiracy theorists by institutional authorities, admired as civil libertarians by sympathizers, and feared as subversives by those who depend on institutional stability. The complicating factor is that the Guardians are occasionally, verifiably *right* — their intelligence networks have exposed real institutional crimes, real surveillance overreach, real cover-ups. The problem is separating the signal from the noise, because the Guardians' paranoia generates enormous quantities of both. + +--- + +## What They Do + +- **Develop countermeasures:** Lattice spoofing, Meridian dead zone generators, signal masking, encrypted off-Meridian communication. This is "Severance" technology — the colloquial name for both the tech and, by extension, the movement. +- **Maintain off-grid communities** that operate outside institutional oversight +- **Run intelligence networks** that monitor institutional activities — the most extensive informal intelligence apparatus in the Reach (because paranoid people who watch institutions notice things) +- **Investigate conspiracies, institutional overreach, and Founder-related anomalies** — with varying degrees of credibility +- **Support whistleblowers and political dissidents** who flee institutional retaliation + +--- + +## What They Control + +- Counter-surveillance technology (Severance tech) +- Intelligence networks that operate outside the Meridian +- Safe houses, dead drops, off-grid infrastructure +- Knowledge of institutional vulnerabilities +- Popular support among civil libertarians, [Unbound](the-unbound.md) communities, and frontier populations + +--- + +## Internal Tensions + +**Paranoia Spectrum:** Some Guardians are rational skeptics — trained analysts with institutional backgrounds who turned whistleblower. Others see conspiracies everywhere, in every lattice update, every Commission policy, every Institute classification. The faction's credibility suffers because it's genuinely hard to distinguish signal from noise, even internally. + +**Collaboration vs. Isolation:** Some Guardians work with Separatists, Unbound groups, or even sympathetic [Assembly](concord-assembly.md) members. They believe in building coalitions. Others trust no one outside the cell — and some don't even trust their own cell members. The organizational culture varies wildly between groups. + +**Violence vs. Exposure:** Some Guardians believe the best weapon is information — expose institutional crimes publicly, let public opinion do the work. Others believe direct action (sabotage of surveillance infrastructure, targeted disruption of Commission operations) is the only language institutions understand. Both wings claim to represent the movement's true purpose. + +--- + +## What They Want + +- Decentralized technology that cannot be used for mass surveillance +- Transparency in institutional operations (especially the [Veil Institute](veil-institute.md) and [Lattice Commission](lattice-commission.md)) +- Protection for whistleblowers and political dissidents +- Proof of what they suspect: that the institutions are hiding something fundamental about the Builders, the gates, or the lattice + +--- + +## Power & Vulnerability + +| Power | Vulnerability | +|-------|---------------| +| Counter-surveillance expertise (Severance tech) | Targeted by Commission as subversives | +| Intelligence networks outside Meridian | Internal paranoia makes coordination difficult | +| Popular support among civil libertarians | Public perception as conspiracy theorists | +| The fact that they're occasionally *right* | Small, resource-poor, organizationally fragmented | + +--- + +## Faction Relationships + +| Faction | Relationship | Dynamic | +|---------|-------------|---------| +| [Lattice Commission](lattice-commission.md) | Primary antagonist | Commission IS the centralized surveillance the Guardians exist to oppose | +| [Veil Institute](veil-institute.md) | Antagonist | Institute classification = institutional secrecy = Guardian target | +| [Concord Assembly](concord-assembly.md) | Hostile / Conditional | Guardians undermine Assembly authority; occasional sympathetic delegates | +| [Syndics](syndics.md) | Hostile | Guardians disrupt Syndic commerce and expose exploitative practices | +| [The Unbound](the-unbound.md) | Ideological allies | Shared skepticism of centralized technology; different methods | +| [The Ring](the-ring.md) | Supply chain | Severance tech flows through criminal distribution networks like the ring | + +--- + +## Mechanical Hooks for Gameplay + +- **Information asymmetry:** Guardians know things nobody else does — and they're dismissed as paranoid. Access to Guardian intelligence gives the player information that may be true, may be paranoid extrapolation, or may be both. +- **Counter-surveillance gameplay:** Guardians teach the player how to spoof lattice tracking, avoid Meridian surveillance, create dead zones, operate invisibly. Essential for stealth and investigation builds. +- **Trust dynamics:** Guardians don't trust institutions. They might not trust the player. Building relationships requires proving you're not compromised — and proving a negative is the hardest thing in the Reach. +- **Conspiracy validation:** The storyteller (D-005) can make Guardian paranoia *justified*. Sometimes the conspiracy is real. Sometimes the Guardians were right all along. The player doesn't know which until they investigate. + +--- + +## NPC Archetypes + +- **The Rational Skeptic:** Legitimate investigator with credible sources and measured conclusions +- **The True Believer:** Sees conspiracies everywhere — occasionally correct, which reinforces the pattern +- **The Whistleblower:** Former institutional insider who fled with evidence and is now hunted by their former employer +- **The Off-Grid Hermit:** Untraceable, unchipped, free — and perhaps more lonely than liberated + +--- + +## v0.1 Relevance + +The Guardians are **indirectly present** in the v0.1 vertical slice through their technology: + +- **[Severance counter-surveillance equipment](../contraband/severance-equipment.md)** is the ring's tertiary contraband. Devra uses a handheld Meridian dead zone generator during sensitive meetings in [Corridor B-7](../locations/krenn-system/maintenance-corridors.md). This technology originates from Guardian supply chains. +- **The `contraband.severance_tech` FactId** represents the moment when the investigation touches something larger than a local smuggling ring. Discovering Severance tech in the ring's inventory raises the question: who is the end user? Is the ring just a distribution node in a Guardian supply chain? +- **NPC references:** Workers in the district are aware of the Guardians as a cultural phenomenon. The [Unbound](the-unbound.md) residents are sympathetic. Mainstream workers dismiss Guardian claims the way people dismiss conspiracy theories — unless they've personally experienced Commission overreach. +- **The Guardians are rumored** to operate in the Krenn System but are not a visible presence in Sova Transit District. This rumor is itself information: it means Guardian infrastructure exists somewhere nearby, and the ring has access to it. + +The Guardians function in v0.1 as a narrative thread that extends beyond the vertical slice's boundaries. The Severance tech in the ring's inventory is a loose end — a reminder that the district's smuggling operation connects to something larger, something political, something the detective wasn't sent to investigate but might stumble into. + +--- + +**Cross-References:** +- [Lattice Commission](lattice-commission.md) — Primary institutional antagonist +- [The Ring](the-ring.md) — Severance tech distribution channel +- [The Unbound](the-unbound.md) — Ideological alignment +- [Severance Equipment](../contraband/severance-equipment.md) — Guardian-sourced technology +- D-037: Contraband specification (Severance as tertiary contraband) +- Round 16: Full faction development + +--- + +**Status:** Canonical +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/factions/lattice-commission.md b/docs/wiki/factions/lattice-commission.md new file mode 100644 index 000000000..0d7480f6b --- /dev/null +++ b/docs/wiki/factions/lattice-commission.md @@ -0,0 +1,130 @@ +# The Lattice Commission + +**Type:** Faction — Regulatory Institution +**Status:** Canonical +**Scope:** Reach-wide (universal jurisdiction) +**Governance Role:** Regulatory / Enforcement +**Headquarters:** Core Systems (TBD) +**Structure:** Bureaucratic-hierarchical, semi-autonomous from Assembly +**Public Perception:** "Necessary but intrusive. The tax authority of neural technology." + +--- + +## Overview + +The Lattice Commission is the regulatory body governing neural lattice technology, imprint protocols, re-embodiment standards, and the Meridian information network. They set rules, investigate violations, certify lattice tiers, and mediate the boundary between individual privacy and institutional access. + +The Commission is the institution most citizens interact with directly — and the one they have the most complicated feelings about. Everyone agrees lattice regulation is necessary (the alternative is uncontrolled neural modification and identity fraud). Everyone resents the Commission's intrusiveness. The tension between "we need them" and "we hate what they do" defines the Commission's position in Reach society. + +In the v0.1 vertical slice, the Commission is the detective's employer and the smuggler's adversary. Commission regulation is what makes lattice smuggling profitable — and what makes lattice smuggling morally ambiguous, because Commission certification costs price most citizens out of enhanced lattice capability. + +--- + +## What They Regulate + +- **Lattice implantation standards** and tier certification +- **Imprint facility licensing** and backup protocols +- **Re-embodiment ethics** (body matching, continuity verification, clone transfer standards) +- **Forking prohibition** — the biggest legal and cultural taboo in the Reach. Unauthorized duplication of an imprint is the Commission's primary enforcement focus. +- **Meridian access and data privacy** standards +- **[Unbound](the-unbound.md) rights** — citizens who refuse lattice technology fall outside the Commission's direct regulatory framework, creating jurisdictional ambiguity + +--- + +## What They Enforce + +- **Anti-forking laws:** Unauthorized imprint duplication is the Reach's most severe crime +- **Imprint theft and lattice tampering** investigations +- **Re-embodiment protocol violations** (body trafficking, continuity fraud) +- **Unauthorized lattice modification** — Category 3 violation. Fines and potential lattice restriction. This is the law the v0.1 smuggling ring violates. +- **Meridian surveillance** when legally authorized (requires jurisdictional approval) + +--- + +## Internal Tensions + +**Privacy vs. Security:** The Commission's defining contradiction. The neural lattice is simultaneously a personal cognitive tool and the most powerful surveillance infrastructure ever created. Commissioners who prioritize citizen privacy clash with those who prioritize societal security. Every major case tests this boundary. Neither side is wrong. + +**Institutional Independence vs. Political Pressure:** The Commission is nominally independent. In practice, the [Assembly](concord-assembly.md) controls their budget, the [Syndics](syndics.md) lobby for deregulation that would increase profits, and the [Veil Institute](veil-institute.md) shares jurisdiction on matters touching gate technology and Builder research. The Commission's decisions have massive economic and political consequences, and everyone wants to influence them. + +**Unbound Rights:** The Commission enforces laws that apply to lattice-bearing citizens. The [Unbound](the-unbound.md) — those who refuse lattice technology — fall outside that framework. How much authority should the Commission have over people who've opted out of the system it regulates? This question has no settled answer and generates recurring political conflict. + +--- + +## What They Want + +- Functional regulation of the most powerful technology in the Reach +- Institutional legitimacy and public trust +- Prevention of forking (existential risk to identity continuity) +- Balance between individual privacy and societal security + +--- + +## Power & Vulnerability + +| Power | Vulnerability | +|-------|---------------| +| Universal jurisdiction (every lattice-bearing citizen) | Hated by [Guardians](guardians-of-autonomy.md) (Big Brother) | +| Legal authority to request lattice data | Resented by [Syndics](syndics.md) (want less regulation) | +| Investigative resources + institutional backing | Pressured by [Assembly](concord-assembly.md) (clearance rates) | +| Cultural authority (most citizens accept regulation) | Vulnerable to corruption (access to everyone's lattice data is immense leverage) | + +--- + +## Faction Relationships + +| Faction | Relationship | Dynamic | +|---------|-------------|---------| +| [Concord Assembly](concord-assembly.md) | Conditional ally | Assembly provides legal authority; Commission resists oversight | +| [Veil Institute](veil-institute.md) | Shared jurisdiction | Both study lattice technology; Institute classifies findings Commission needs | +| [Syndics](syndics.md) | Rival | Commission regulates Syndic operations; Syndics lobby for deregulation | +| [Guardians of Autonomy](guardians-of-autonomy.md) | Primary antagonist | Guardians' core mission is counter-surveillance; Commission IS the surveillance | +| [The Unbound](the-unbound.md) | Jurisdictional tension | Unbound refuse Commission's technological basis; Commission's authority doesn't cleanly extend to them | +| [The Ring](the-ring.md) | Enforcement target | Commission regulation creates the conditions for smuggling; Commission investigators pursue the consequences | + +--- + +## Mechanical Hooks for Gameplay + +- **Investigations:** Commission investigators are the Reach's closest equivalent to police. Playing as one provides legal authority, institutional resources, and political obstruction in equal measure. +- **Lattice data as evidence:** With legal authorization, the Commission can access imprint records, lattice tracking data, Meridian activity logs. Incredibly powerful — and incredibly intrusive. +- **Forking as high-stakes crime:** If the storyteller seeds a forking conspiracy, the Commission is the primary investigative body. The player might be hunting the same conspiracy from a different angle. +- **Privacy as a resource:** Characters who value privacy fear the Commission. Characters who value security trust them. The player's relationship depends on build, faction, and playstyle. + +--- + +## NPC Archetypes + +- **The Idealist Commissioner:** Believes in privacy rights, resists institutional overreach +- **The Authoritarian Commissioner:** Security above all other considerations +- **The Corrupt Commissioner:** Sells lattice data, takes bribes, leverages access +- **The Field Investigator:** Boots on the ground, navigating impossible politics + +--- + +## v0.1 Presence + +The Commission is **directly present** in the v0.1 vertical slice: + +- **The detective** is a Commission field investigator (or Commission-licensed operative), assigned to Sova Transit District to investigate suspected smuggling +- **[Sera Venn](../npcs/sera-venn.md)** (THE FRIEND, detective path) is a Commission field tech stationed at Sova +- **Commission kiosk** on Level 3 of the district — unmanned, for compliance reporting. The most recent liaison rotated out 3 months ago; replacement delayed. This institutional gap is what allowed the ring's operations to escalate. +- **Inspection schedule:** Quarterly lattice compliance sweeps, announced 2 weeks in advance. The ring times operations around these. + +Commission presence in Sova is intermittent by design: the system is established enough not to warrant permanent enforcement, not important enough for a dedicated office. This gap — the lag between oversight visits — is what makes small-scale smuggling viable. The detective's arrival represents an unscheduled enforcement action that disrupts the district's carefully balanced equilibrium. + +--- + +**Cross-References:** +- [Concord Assembly](concord-assembly.md) — Legal authority, funding +- [Guardians of Autonomy](guardians-of-autonomy.md) — Primary opposition +- [The Ring](the-ring.md) — v0.1 enforcement target +- [Sera Venn](../npcs/sera-venn.md) — THE FRIEND, Commission field tech +- D-037: Contraband specification (Commission regulation as root cause) +- D-017: Perception modes (lattice tiers as Commission-regulated capability) + +--- + +**Status:** Canonical +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/factions/syndics.md b/docs/wiki/factions/syndics.md new file mode 100644 index 000000000..69c841dd8 --- /dev/null +++ b/docs/wiki/factions/syndics.md @@ -0,0 +1,115 @@ +# The Syndics + +**Type:** Faction — Commercial Network +**Status:** Canonical +**Scope:** Reach-wide +**Governance Role:** Commercial / Economic +**Headquarters:** Distributed (no central authority) +**Structure:** Network of competing commercial interests — shipping combines, re-embodiment consortia, span gate construction firms, Meridian service providers, information brokers + +--- + +## Overview + +The Syndics are not a faction in the ideological sense. They are a network of commercial interests that operate across the Settled Reach. They don't have a manifesto. They have portfolios. + +Shipping combines, re-embodiment consortia, span gate construction firms, Meridian service providers, information brokers — the Syndics are the economic infrastructure of the Reach. They build the span gates, manufacture the bodies, run the freight networks, and operate the commercial layer of the Meridian. If you move between systems, buy a new body, access entertainment, or receive a shipment, you're touching Syndic infrastructure. + +The Syndics' power comes not from ideology or legal authority but from the fact that the Reach cannot function without them. They are the reason re-embodiment is widely accessible — and the reason it's commodified. The player navigates that tension. + +--- + +## What They Control + +- **Re-embodiment infrastructure:** Most body manufacturing and imprint facilities are Syndic-operated. The [Lattice Commission](lattice-commission.md) regulates them, but the Syndics own the means of resurrection. +- **Span gate construction:** Local infrastructure (interplanetary gates) is built by Syndic firms under [Assembly](concord-assembly.md) contract. This gives them leverage over system development. +- **Meridian commercial layer:** Advertising, entertainment, commerce, data brokerage. If you access the Meridian, you're using Syndic infrastructure. +- **Shipping and logistics:** Moving goods between systems requires gate access, which requires Syndic shipping networks. Sova Transit District exists because Syndic logistics demands exist. + +--- + +## Internal Tensions + +**Stability vs. Disruption:** Some Syndics profit from stability — logistics, bodies, established markets. Others profit from disruption — frontier speculation, new gate activations, crisis arbitrage. These competing interests lobby the Assembly for opposite policies. + +**Monopoly vs. Competition:** Syndic combines compete with each other for contracts, gate access, and system dominance. Alliance structures are transactional and temporary. Today's partner is tomorrow's competitor if the margins shift. + +**Regulation vs. Deregulation:** The Commission's regulatory authority limits Syndic profit in re-embodiment and Meridian data access. Some Syndics want deregulation to increase margins. Others want regulation to lock out smaller competitors who can't afford compliance costs. Both sides frame their position as being about public welfare. + +--- + +## What They Want + +- Predictable returns on infrastructure investments +- Access to new markets (frontier systems, new gate activations) +- Favorable regulatory environments (or regulators they can influence) +- Perpetual clients (literally — long-lived citizens are their best customers) + +--- + +## Power & Vulnerability + +| Power | Vulnerability | +|-------|---------------| +| Economic: control over resurrection, infrastructure, logistics | Dependent on gate access they don't control | +| Information: commercial data flows across the Reach | Vulnerable to Assembly regulation | +| Influence: lobbyists in Assembly, relationships with Perpetuals | Public backlash if re-embodiment becomes inaccessible or exploitative | +| Indispensability: the Reach can't function without them | Competition — Syndics undercut each other constantly | + +--- + +## Faction Relationships + +| Faction | Relationship | Dynamic | +|---------|-------------|---------| +| [Concord Assembly](concord-assembly.md) | Rival / Client | Assembly awards contracts, regulates commerce; Syndics lobby to shape regulation | +| [Lattice Commission](lattice-commission.md) | Rival | Commission regulates Syndic operations; Syndics push for deregulation | +| [Veil Institute](veil-institute.md) | Collaborative / Competitive | Syndics want access to gate technology for commercial exploitation | +| [Guardians of Autonomy](guardians-of-autonomy.md) | Antagonist | Guardians disrupt Syndic commerce and expose exploitative practices | +| [The Unbound](the-unbound.md) | Market gap | Unbound don't participate in Syndic re-embodiment economy; represent untapped or unreachable market | + +--- + +## Mechanical Hooks for Gameplay + +- **Commercial intelligence:** Syndics track money, bodies, shipments. Working with Syndics gives access to financial records, supply chain data, body transfer logs. +- **Bribery and leverage:** Syndics operate transactionally. They'll sell information, provide bodies, grant access — for a price or a favor. +- **Infrastructure control:** Syndics can deny services. No imprint backup? No body on arrival? That's a Syndic decision. They can also be coerced, bribed, or hacked. +- **Moral complexity:** Syndics aren't evil. They built the resurrection economy. But they also commodified it. The player navigates that. + +--- + +## NPC Archetypes + +- **The Fixer:** Broker who can get anything for a price — the living embodiment of transactional relationships +- **The Consortium Executive:** Long-term thinker who invests in stability because stability is profitable +- **The Frontier Speculator:** Opportunist who profits from chaos — new gates, new markets, new crises +- **The Syndic Insider:** Has dirt on everyone and trades in leverage as naturally as breathing + +--- + +## v0.1 Relevance + +The Syndics are **referenced but not directly present** in the v0.1 vertical slice. Their influence is felt through: + +- **Sova Logistics Consortium:** The district's primary employer is a Syndic operation. Workers at [The Terminal](../locations/krenn-system/the-terminal.md) work for a Syndic-affiliated freight handling company. Their wages, schedules, and working conditions are Syndic-determined. +- **Supply chain:** The contraband moving through the ring originates in Syndic-adjacent manufacturing — aftermarket lattice components and medical-grade neural replacements diverted from Syndic supply chains (D-037). +- **Economic pressure:** The wage-to-cost-of-living squeeze that makes smuggling rational is a consequence of Syndic pricing. Medical-grade lattice replacements are expensive because Syndics control the legitimate supply chain. +- **NPC dialogue:** Workers reference "the consortium" or "corporate" as the distant entity that sets their pay and conditions. It's not personal — the Syndics don't have a face in Sova. They have a payroll system. + +The Syndics are the economic water the district swims in. They created the conditions for the smuggling operation without ever intending to, simply by pricing the legitimate market at a level that makes black-market alternatives rational. + +--- + +**Cross-References:** +- [Lattice Commission](lattice-commission.md) — Regulates Syndic operations +- [Concord Assembly](concord-assembly.md) — Awards contracts, sets regulation +- [The Terminal](../locations/krenn-system/the-terminal.md) — Syndic-affiliated employer +- D-037: Contraband specification (Syndic supply chain as diversion source) +- D-036: Sova Transit District (Syndic logistics consortium as employer) + +--- + +**Status:** Canonical +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/factions/the-ring.md b/docs/wiki/factions/the-ring.md new file mode 100644 index 000000000..c42c3e472 --- /dev/null +++ b/docs/wiki/factions/the-ring.md @@ -0,0 +1,142 @@ +# The Ring (Sova Smuggling Operation) + +**Type:** Faction — Informal Criminal Network +**Status:** Canonical +**Scope:** Local (Sova Transit District) +**Governance Role:** None (informal economy) +**Headquarters:** None (distributed across district, coordination in [maintenance corridors](../locations/krenn-system/maintenance-corridors.md)) +**Structure:** Flat hierarchy, informal, no official name +**Informal Names:** "The arrangement," "the side work," "helping out" — NPCs refer to it obliquely, never directly + +--- + +## Overview + +The Ring is not an organization. It is an arrangement — a network of logistics workers in Sova Transit District who use their freight access to move contraband through the span gate system. The ring has no charter, no insignia, no recruitment process. It exists because the economic conditions in the district make smuggling a rational supplement to legitimate income, and because the community has collectively decided that what happens between the wall layers is not their concern. + +The ring has been operating for approximately two years. In that time, it has become part of the district's unofficial economy. People know, or suspect, or deliberately don't ask. The ring isn't violent. It isn't chaotic. It's a business that runs alongside the legitimate one, and most of the district's 800 residents have decided that's fine. + +This is the social fabric the detective walks into. This is the life the smuggler protects. + +--- + +## What They Move + +Three categories of contraband, in order of volume (D-037): + +1. **[Unlicensed lattice components](../contraband/lattice-components.md)** (primary): Aftermarket neural lattice modifications that bypass [Lattice Commission](lattice-commission.md) certification. Enhanced capability mods, custom occupational modifications, components that let people exceed their certified lattice tier. The ring is smuggling *access*, not weapons. + +2. **[Medical-grade neural replacements](../contraband/medical-grade-replacements.md)** (secondary): Replacement lattice components diverted from [Syndic](syndics.md) supply chains. For people whose lattices are degrading and who can't afford institutional replacement through certified channels. This is healthcare — and the moral dimension that makes the ring sympathetic. + +3. **[Severance counter-surveillance technology](../contraband/severance-equipment.md)** (tertiary): Equipment sourced from [Guardians of Autonomy](guardians-of-autonomy.md) supply chains. Small-scale — handheld Meridian dead zone generators, lattice spoofing tools. The ring doesn't care about ideology; they move product. But the product has political implications. + +--- + +## Structure + +**Flat hierarchy. No titles. No formal roles.** People do what they're good at. + +| Function | NPC | How It Works | +|----------|-----|-------------| +| Off-station coordination | Nils Davan (off-stage, Kael's older sibling) | Gives orders, arranges incoming shipments, communicates through dead drops | +| Local coordination | [Devra](../npcs/devra.md) | Manages operations, maintains off-station contacts, legitimate business front at bar | +| Scheduling cover | [Voss](../npcs/voss.md) | Adjusts shift schedules to create coverage gaps. Takes a cut. | +| Cargo handling | [Kael Davan](../npcs/kael-davan.md) | Physically routes flagged containers to holding area during legitimate shift work | +| Inspection bypass | [Torek Lintar](../npcs/torek-lintar.md) | Compromised inspector — looks away during inspection of flagged containers | +| Courier | [Renn](../npcs/renn.md) | Transfers contraband from Terminal to [Corridor B-7](../locations/krenn-system/maintenance-corridors.md) during night shifts | +| Distribution | [Pell](../npcs/pell.md) | Dead drop pickups, local distribution. Wavering — considering cooperation with authorities. | +| Lookout | [Tav](../npcs/tav.md) | Watches entry points during corridor operations | +| Handoff point | [Lera Sessik](../npcs/lera-sessik.md) | [The Last Shift](../locations/krenn-system/the-last-shift.md) back room serves as a handoff point. Lera knows. Lera doesn't ask. | +| Off-station fence | [Sabel](../npcs/sabel.md) | Receives and distributes contraband to end users off-station | + +--- + +## How It Works + +1. Contraband arrives in legitimate freight shipments (mixed with legal cargo, doctored manifests) +2. [Torek](../npcs/torek-lintar.md) looks away during inspection at The Terminal +3. [Kael](../npcs/kael-davan.md) and others route flagged containers to temporary holding area +4. During night shift (01:00-04:00), [Renn](../npcs/renn.md) transfers cargo through the break room service hatch to [Corridor B-7](../locations/krenn-system/maintenance-corridors.md) +5. [Devra](../npcs/devra.md) coordinates with [Sabel](../npcs/sabel.md) for off-station distribution +6. Small items go to the dead drop alcove for [Pell](../npcs/pell.md) to collect +7. Larger items move through Lera's back room at [The Last Shift](../locations/krenn-system/the-last-shift.md) + +**Timing:** Operations occur every third night shift rotation, during shift transitions when oversight is thinnest. Post-inspection windows (2-3 days after scheduled Commission sweeps) are preferred for larger shipments. + +**Security model:** Normalcy. Nobody does anything dramatic. Everything happens within the flow of legitimate work. If a container is flagged, it's rescheduled. If someone is watched, they go quiet. Patience is the ring's greatest asset. + +--- + +## Community Role + +The ring is the district's economic immune system. The honest truth is that people who don't participate directly still benefit: + +- **The bar profits** from ring members buying drinks and conducting business +- **Maintenance workers** get tips for "noticing things late" +- **Families** get lattice upgrades they couldn't afford through legitimate channels +- **Medical needs** get met through diverted medical-grade components +- **The general economy** benefits from supplemental income circulating through local businesses + +A ring member earns an extra 400-800 credits/month beyond their standard logistics salary of 2,400 credits/month. In a district where living costs run ~2,200 credits/month and margin is 200 credits, that supplemental income transforms "barely comfortable" into "secure." + +This is why the community tolerates the ring. Not because people are criminal or corrupt, but because the arrangement serves real needs that the legitimate economy doesn't. Everyone has made an implicit calculation: the risk of exposure is lower than the cost of losing the supplemental income. + +--- + +## Vulnerability + +The ring has been operating long enough that cracks are forming: + +- **Spending tells:** [Torek](../npcs/torek-lintar.md) has been spending visibly beyond a standard dock worker's income — new jacket, buying rounds, lattice accessories. This is the most observable vulnerability. +- **Wavering members:** [Pell](../npcs/pell.md) is considering cooperation with authorities. Their increasingly erratic behavior (shorter dead drop visits, social withdrawal) is observable. +- **Internal suspicion:** [Renn](../npcs/renn.md) suspects Pell is unreliable and has communicated this to Devra/Nils. Internal tension creates observable social friction. +- **Escalation pressure:** Nils (off-station) is pushing for higher volume. Local operators want to keep things small. This creates friction between ambition and safety. +- **The detective:** An unscheduled enforcement presence in a district accustomed to intermittent oversight. The detective's arrival is the external pressure that tests every crack. + +--- + +## Mechanical Integration + +### Knowledge Graph Flags + +| FactId | Smuggler Starting Level | Detective Starting Level | +|--------|------------------------|-------------------------| +| `contraband.ring_exists` | KnowsDetails (member) | Suspects (case briefing mentions irregularities) | +| `contraband.lattice_components` | KnowsDetails (handles cargo) | None → Suspects (manifest analysis) | +| `contraband.supply_chain` | KnowsOf (knows general flow) | None | +| `relationship.ring_membership` | KnowsDetails (knows who's in) | None → builds through investigation | + +### Perception Differences + +**Smuggler sees:** Family. Colleagues. The people who make the arrangement work. Each member has a name, a history, a reason for being involved. Voss has a daughter who needed lattice surgery. Kael's doing it for Hael. Renn needs the money. The ring isn't a criminal organization — it's mutual aid that happens to be illegal. + +**Detective sees:** A network. Nodes and connections. Behavioral patterns that suggest coordination. Manifest discrepancies that suggest doctoring. Financial anomalies that suggest supplemental income. The ring is a case — a puzzle to be solved, a structure to be mapped, evidence to be assembled. + +Both perspectives are accurate. Neither is complete. + +--- + +## Thematic Function + +The ring exists to pose the game's central moral question: *Is this wrong?* + +The smuggler knows the people. The detective sees the crime. The player, regardless of character, must decide what the arrangement means. Is the ring a service or a violation? Is the detective doing justice or doing harm? Is there a resolution that doesn't break something the community needs? + +The ring has no clean answer. That's the point. + +--- + +**Cross-References:** +- [Sova Transit District](../world/sova-transit-district.md) — The ring's territory +- [The Terminal](../locations/krenn-system/the-terminal.md) — Where cargo enters the ring's pipeline +- [The Last Shift](../locations/krenn-system/the-last-shift.md) — Handoff point, social coordination +- [Maintenance Corridors](../locations/krenn-system/maintenance-corridors.md) — Physical smuggling route +- [NPC Index](../npcs/index.md) — Ring member profiles +- D-037: Contraband specification +- D-027: Vertical slice definition + +--- + +**Status:** Canonical — v0.1 core narrative element +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/factions/the-unbound.md b/docs/wiki/factions/the-unbound.md new file mode 100644 index 000000000..0fd6886a9 --- /dev/null +++ b/docs/wiki/factions/the-unbound.md @@ -0,0 +1,106 @@ +# The Unbound + +**Type:** Faction — Cultural Movement +**Status:** Canonical +**Scope:** Reach-wide (concentrated on frontier) +**Governance Role:** None (cultural/philosophical position, not a political organization) +**Headquarters:** None (no organizational structure) +**Structure:** Decentralized, voluntary, individual choice + +--- + +## Overview + +The Unbound are citizens of the Settled Reach who have chosen to live without a neural lattice. In a civilization where the lattice is as universal as breathing — used for communication, work, identity verification, information access, re-embodiment backup — choosing to go without is a radical act. Radical, and profoundly inconvenient. + +The Unbound are not a faction in the organizational sense. They have no leaders, no charter, no political agenda. "Unbound" is a description, not a membership card. What unites them is a shared rejection of the neural lattice and the institutional infrastructure built around it — the [Lattice Commission](lattice-commission.md)'s regulatory framework, the Meridian network, the imprint backup system, and the assumptions about identity and continuity that lattice technology enables. + +The motivations for going Unbound are diverse: philosophical conviction (the lattice mediates experience in ways that diminish authentic consciousness), religious belief (various traditions across the Reach consider the lattice a violation of natural cognition), political protest (refusing the Commission's jurisdiction by refusing the technology it regulates), frontier practicality (some settlements predate reliable lattice infrastructure), or simply personal choice. + +The result is the same: Unbound citizens exist outside the surveillance, communication, and identity systems that structure everyone else's life. They cannot be tracked by lattice signature. They cannot access the Meridian. They cannot back up their neural imprint. When an Unbound person dies, they die permanently. This makes them invisible to institutional systems — and profoundly vulnerable in ways that lattice-bearing citizens cannot fully comprehend. + +--- + +## What It Means to Be Unbound + +### What You Lose +- **Meridian access:** No information network. No real-time news, no messaging, no entertainment feeds, no digital commerce. Communication is voice, written text, or physical presence. +- **Identity verification:** Lattice signatures are the Reach's primary ID system. Without one, you cannot be automatically identified. This is both a freedom and a burden — boarding a ship, entering a restricted area, or proving your identity requires alternative documentation. +- **Re-embodiment backup:** No imprint means no resurrection. Death is death. This is the most consequential choice: in a civilization where most people functionally cannot die, the Unbound accept mortality. +- **Enhanced perception:** No lattice overlay, no augmented senses, no institutional data feeds. What you see is what your biology provides. For most Unbound, this feels like clarity. For institutional citizens, it would feel like blindness. +- **Economic participation:** Many economic systems assume lattice connectivity. Unbound citizens operate in parallel economies — physical currency, barter, analog record-keeping. + +### What You Gain +- **Privacy:** Total, absolute, structural privacy. No one can track you, read your lattice data, access your imprint, or monitor your cognitive activity. The Commission has no jurisdiction over a mind it cannot reach. +- **Cognitive autonomy:** No external influence on your thought processes. No subliminal Meridian advertising. No lattice-mediated emotional regulation. No institutional access to your neural patterns. +- **Mortality as meaning:** The Unbound philosophical position holds that death gives life weight. When you cannot be resurrected, every moment is singular. This is not a consolation — it's a conviction. +- **Community:** Unbound communities develop intense social bonds precisely because they cannot rely on institutional safety nets. Trust is personal, not technologically mediated. + +--- + +## Internal Tensions + +**Diversity of Motivation:** The Unbound are not a unified movement. A frontier farmer who never had lattice access has little in common with a Core Systems philosopher who removed theirs as an act of intellectual commitment. A religious Unbound community in the mid-Reach shares few values with anarchist Unbound cells in frontier stations. The label unites people whose choices have the same external form but very different internal reasons. + +**Engagement vs. Withdrawal:** Some Unbound advocate for political engagement — representation in the [Assembly](concord-assembly.md), legal protections, institutional accommodation. Others believe engagement with institutional systems is itself a compromise. The withdrawal position holds that the only authentic Unbound life is one that exists entirely outside the lattice-bearing world. + +**Vulnerability vs. Freedom:** The Unbound's greatest asset (invisibility to institutional systems) is also their greatest vulnerability. Without lattice tracking, Unbound citizens can disappear — into frontier margins, into criminal networks, into exploitation. The Commission's limited jurisdiction over Unbound populations means fewer protections as well as fewer constraints. + +--- + +## What They Want + +The Unbound don't have unified demands. Individual Unbound might want: +- Legal recognition of non-lattice identity systems +- Protection from discrimination in employment, housing, and services +- Accommodation in institutional systems that assume lattice connectivity +- Simply to be left alone + +--- + +## Faction Relationships + +| Faction | Relationship | Dynamic | +|---------|-------------|---------| +| [Lattice Commission](lattice-commission.md) | Jurisdictional tension | Unbound refuse the technology the Commission regulates; Commission's authority doesn't cleanly extend to them | +| [Concord Assembly](concord-assembly.md) | Ambivalent | Unbound citizenship rights are an unresolved legal question; some Assembly delegates advocate for them, others ignore them | +| [Guardians of Autonomy](guardians-of-autonomy.md) | Ideological allies | Shared skepticism of centralized technology; Guardians use tech to resist tech, Unbound simply refuse it. Different methods, overlapping values. | +| [Syndics](syndics.md) | Market gap | Unbound don't participate in Syndic re-embodiment economy; too small a population to matter commercially | +| [Veil Institute](veil-institute.md) | Minimal | Institute studies technology the Unbound reject; some Institute researchers view Unbound cognition as a research interest (ethically fraught) | + +--- + +## Cultural Significance + +The Unbound matter disproportionately to their numbers because they represent the road not taken. In a civilization built on neural technology, the Unbound are a living question: *What if we didn't?* + +Every lattice-bearing citizen has, at some level, accepted that their mind is connected to institutional infrastructure. The Unbound haven't. Their existence is a constant, quiet challenge to the assumption that lattice integration is natural, inevitable, or good. For some citizens, this is threatening. For others, it's fascinating. For most, it's irrelevant — until they need to interact with an Unbound person and realize how thoroughly their own life depends on technology they've never questioned. + +The Unbound also represent the only people in the Reach who face permanent death. This gives their choices a weight that lattice-bearing citizens — who treat death as an interruption, not an ending — cannot fully appreciate. When an Unbound person risks their life, they're risking everything. + +--- + +## v0.1 Relevance + +The Unbound are **peripherally present** in the v0.1 vertical slice: + +- **A few district residents are Unbound by choice** — mostly older workers who came from frontier backgrounds. They're known, accepted, and unremarkable. Nobody makes a fuss about it. This is consistent with Krenn System culture: mind your business. +- **Olin** (drifter/new arrival at [The Last Shift](../locations/krenn-system/the-last-shift.md)) may or may not be Unbound. Olin's lattice status is ambiguous — they don't have a detectable lattice signature, which could mean they're Unbound, or that they're using Severance spoofing technology, or that their lattice is non-standard. This ambiguity is load-bearing for the detective's investigation: an absent lattice signature is data, and the interpretation of that data depends on the detective's assumptions. +- **Moral context:** The Unbound's existence enriches the contraband question. Some of the ring's medical-grade lattice components serve people transitioning *into* lattice use from Unbound status — or people whose lattices are failing and who face a choice between expensive institutional replacement and becoming effectively Unbound. The Unbound aren't just a philosophical position; they're the alternative that lattice smuggling helps people avoid. +- **The detective's analytical lattice** cannot automatically identify Unbound citizens. In a district where the detective's primary investigative tool is lattice-mediated perception, Unbound individuals are blind spots — people who exist outside the detective's institutional gaze. This is mechanically significant. + +--- + +**Cross-References:** +- [Lattice Commission](lattice-commission.md) — Jurisdictional tension +- [Guardians of Autonomy](guardians-of-autonomy.md) — Ideological allies +- [Olin](../npcs/olin.md) — Ambiguous lattice status (v0.1) +- D-017: Perception modes (Unbound exist outside lattice-mediated perception) +- D-037: Contraband specification (medical context for lattice access) +- Round 16: Full faction development + +--- + +**Status:** Canonical +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/factions/veil-institute.md b/docs/wiki/factions/veil-institute.md new file mode 100644 index 000000000..27477ece3 --- /dev/null +++ b/docs/wiki/factions/veil-institute.md @@ -0,0 +1,116 @@ +# The Veil Institute + +**Type:** Faction — Research Institution +**Status:** Canonical +**Scope:** Reach-wide +**Governance Role:** Research / Containment +**Headquarters:** Core Systems (TBD, likely near high-bleed Founder Gates) +**Structure:** Academic-institutional, semi-autonomous from Assembly +**Mandate:** Study Founder gate technology, the Interstitium, Builder phenomena, and gate activation + +--- + +## Overview + +The Veil Institute is the Settled Reach's primary institution for studying the setting's deepest mysteries: the Founder Gates that enable interstellar travel, the Interstitium through which those gates transit, the Builder civilization that may or may not have created them, and the anomalous phenomena (Gyre events, perception effects, signals) that emerge from the boundaries of understood physics. + +The Institute is funded by the [Concord Assembly](concord-assembly.md) and operates with semi-autonomous authority. In practice, this means they take Assembly money and resist Assembly oversight. The Institute knows more about the infrastructure of the Reach than any other faction — and shares the least. + +This tension — between knowledge and disclosure, between research autonomy and democratic accountability, between studying existential mysteries and controlling who gets to know what they find — defines the Institute's character. They are simultaneously the Reach's greatest hope for understanding the universe and its most opaque institution. + +--- + +## What They Control + +- **High-bleed Founder Gates:** Direct access to and study of gates exhibiting anomalous Interstitial interactions +- **Gyre event response and classification:** When something strange happens near a gate, the Institute responds, investigates, and classifies. The classification is often more restrictive than the event warrants. +- **Gate activation research and execution:** When the Assembly approves activation of a dormant Founder Gate, the Institute does the work +- **Interstitial data collection:** Sensor arrays, transit logs, anomaly detection systems +- **Classified research archives:** The largest collection of information about the Reach's infrastructure that no one is allowed to read + +--- + +## Internal Tensions + +**Publish vs. Classify:** The Institute's defining conflict. Field researchers want to share findings with the scientific community — that's what science is. Administrators classify everything for "security reasons." The real motivations vary: institutional control, fear of public panic, evidence of something they don't want known, or genuine concern that some knowledge is dangerous. The result is the same: the people who discover things are not allowed to tell anyone. + +**Contact vs. Containment:** Some researchers believe Builder contact — or at least a deeper understanding of Builder phenomena — is the Institute's ultimate goal. Others believe Builder phenomena are existential threats to be managed and contained, not engaged with. Institute policy oscillates between these poles depending on recent events and who's directing research. + +**Assembly Oversight vs. Autonomy:** The Institute is funded by elected officials but resists democratic accountability. How much authority should the Assembly have over research that might determine the fate of the species? The Institute argues that political interference in existential research is dangerous. The Assembly argues that unaccountable institutions with existential knowledge are more dangerous. + +--- + +## What They Want + +- Resources to study the gates and the Builders +- Autonomy to pursue research without political interference +- Control over gate activation decisions +- Containment of Builder-related phenomena that could destabilize the Reach + +--- + +## Power & Vulnerability + +| Power | Vulnerability | +|-------|---------------| +| Monopoly on gate activation expertise | Dependent on Assembly funding | +| Control over high-bleed gates and Interstitial data | Public distrust due to classification policies | +| Institutional authority backed by Assembly | Internal leaks (whistleblowers defecting to [Guardians](guardians-of-autonomy.md)) | +| Knowledge of what's actually happening at the infrastructure level | Existential risk if they mishandle a Gyre event or gate activation | + +--- + +## Faction Relationships + +| Faction | Relationship | Dynamic | +|---------|-------------|---------| +| [Concord Assembly](concord-assembly.md) | Conditional ally | Assembly funds Institute; Institute resists oversight. Mutual dependence, mutual resentment. | +| [Lattice Commission](lattice-commission.md) | Shared jurisdiction | Both study neural technology at different levels; Commission wants Institute data that Institute classifies | +| [Syndics](syndics.md) | Competitive / Collaborative | Syndics want commercial exploitation of gate technology; Institute wants research control | +| [Guardians of Autonomy](guardians-of-autonomy.md) | Antagonist | Guardians see Institute classification as institutional secrecy; Institute sees Guardians as a leak risk | +| [The Unbound](the-unbound.md) | Minimal contact | Unbound reject the technology the Institute studies; Institute views Unbound as research subjects (ethically fraught) | + +--- + +## Mechanical Hooks for Gameplay + +- **Classification as gameplay barrier:** The Institute has the answers. Getting access is the challenge. Institutional authority, hacking, social engineering, whistleblowers, theft — the player has options, all of them costly. +- **Perception scaling:** Institute researchers at higher ascension tiers perceive more during gate transits. Playing as or working with the Institute ties directly to the perception mode system (D-017) and the Builder mystery. +- **Gyre events as investigation triggers:** The storyteller spawns a Gyre event. The Institute responds. The player investigates. What the Institute says publicly versus what they actually know creates investigative tension. +- **Moral ambiguity:** The Institute classifies things for legitimate security reasons — and to cover up their own mistakes, ethical violations, or existential ignorance. The player navigates that distinction. + +--- + +## NPC Archetypes + +- **The Field Researcher:** Wants to publish, frustrated by classification, believes knowledge should be free +- **The Administrator:** Institutional control over scientific truth — not evil, just convinced secrecy is necessary +- **The Whistleblower:** Defected with evidence, now targeted by the institution they served +- **The True Believer:** Convinced Builder contact is imminent and transformative — and may be right + +--- + +## v0.1 Relevance + +The Veil Institute is **not present** in the v0.1 vertical slice. Its relevance is entirely contextual: + +- **Gate infrastructure:** The Founder Gates and span gates that the district depends on exist because the Institute activated them. The span gate hum that defines Sova's atmosphere is, ultimately, an Institute-managed phenomenon. +- **Future narrative threads:** The Severance technology in the ring's contraband (D-037) hints at Guardian operations, which hints at institutional secrets the Guardians are trying to expose, which hints at the Institute. The thread is there for future development but not pulled in v0.1. +- **Worldbuilding depth:** NPC dialogue might reference "the Institute" in the same way people reference NASA — a distant, prestigious, vaguely mysterious institution that does important things nobody fully understands. + +The Institute is important for the full game's narrative architecture. For v0.1, it provides background depth — the sense that the universe extends beyond what the player can see. + +--- + +**Cross-References:** +- [Concord Assembly](concord-assembly.md) — Funding body +- [Lattice Commission](lattice-commission.md) — Shared jurisdiction +- [Guardians of Autonomy](guardians-of-autonomy.md) — Primary opposition (leaks, exposure) +- D-017: Perception modes (Institute research connects to lattice tier system) +- Round 16: Full faction development + +--- + +**Status:** Canonical +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/index.md b/docs/wiki/index.md new file mode 100644 index 000000000..9eb8a5138 --- /dev/null +++ b/docs/wiki/index.md @@ -0,0 +1,121 @@ +# The Settled Reach — Game Wiki + +**Project:** The Settled Reach (top-down immersive sim) +**Setting:** Original IP, Commonwealth-inspired +**v0.1 Vertical Slice:** Sova Transit District, Krenn System +**Purpose:** Canonical reference for all content, mechanics, and worldbuilding + +## How to Use This Wiki + +This wiki serves three audiences: + +1. **Content creators** (writers, designers): Use this as source material for dialogue, monologue, NPC profiles, and environmental text. All entries marked `canonical` are setting truth. +2. **System implementers** (engineers): Reference this for mechanical integration points — knowledge graph flags, perception modes, faction mechanics. +3. **The team** (everyone): Cross-reference between decisions (`decisions/*.md`) and implementation. The wiki is WHERE, decisions are WHY. + +**Cross-reference format:** Wiki entries link to decision documents where relevant. Example: Neural lattice tiers implement D-017 (perception modes as character build). + +**Status levels:** `canonical` (confirmed), `draft` (in review), `proposed` (under consideration). Only use canonical entries as truth. + +--- + +## Wiki Structure + +### World (Spatial Hierarchy) +- [Krenn System](world/krenn-system.md) — Mid-Reach G3V system, ~180 years settled +- [Station Sova](world/station-sova.md) — Logistics hub, ~12k population +- [Sova Transit District](world/sova-transit-district.md) — v0.1 setting, freight logistics district + +### Locations (Physical Spaces — nested by system) +- **Krenn System:** + - [The Terminal](locations/krenn-system/the-terminal.md) — Logistics hub (workplace social site) + - [The Last Shift](locations/krenn-system/the-last-shift.md) — Bar / "Lera's" (social venue) + - [Maintenance Corridors](locations/krenn-system/maintenance-corridors.md) — Smuggling spaces, Corridor B-7 + +### Factions (Political & Institutional) +- [Concord Assembly](factions/concord-assembly.md) — Reach-wide representative government +- [Lattice Commission](factions/lattice-commission.md) — Neural lattice regulatory body +- [Syndics](factions/syndics.md) — Supply chain operators +- [The Ring](factions/the-ring.md) — Sova smuggling operation (informal) +- [Guardians of Autonomy](factions/guardians-of-autonomy.md) — Counter-surveillance movement +- [Veil Institute](factions/veil-institute.md) — Founder Gate research institution +- [The Unbound](factions/the-unbound.md) — Anti-lattice cultural movement + +### NPCs (Named Characters) +- [NPC Index](npcs/index.md) — Full roster with tier assignments + triangle diagram +- **Tier 1 (FRIEND NPCs):** + - [Kael Davan](npcs/kael-davan.md) — Smuggler's FRIEND (dock worker, ring member) + - [Sera Venn](npcs/sera-venn.md) — Detective's FRIEND (Commission field tech) +- **Tier 2 (Triangle NPCs):** + - [Voss](npcs/voss.md) — Shift supervisor + - [Lera Sessik](npcs/lera-sessik.md) — Bar owner + - [Torek Lintar](npcs/torek-lintar.md) — Dock worker / bar regular + - [Devra](npcs/devra.md) — Ring coordinator + - [Maret Korr](npcs/maret-korr.md) — Freight scheduler + - [Resha](npcs/resha.md) — New hire + - [Harek](npcs/harek.md) — Off-duty security + - [Hael](npcs/hael.md) — Kael's partner (referenced) + - [Renn](npcs/renn.md) — Courier (ring + hub bridge) + - [Pell](npcs/pell.md) — Wavering ring member +- **Tier 3 (Flat NPCs):** + - [Drin](npcs/drin.md) — Maintenance tech + - [Sess](npcs/sess.md) — Bartender + - [Olin](npcs/olin.md) — Drifter/new arrival + - [Sabel](npcs/sabel.md) — Off-station supplier + - [Tav](npcs/tav.md) — Lookout/runner + +### Technology (Systems & Devices) +- [Neural Lattice](technology/neural-lattice.md) — Universal brain-computer interface, tiered +- [Meridian](technology/meridian.md) — Information network +- [Span Gates](technology/span-gates.md) — Intra-system wormholes +- [Founder Gates](technology/founder-gates.md) — Interstellar gates, the Interstitium +- [Clone Transfer](technology/clone-transfer.md) — Death, backup, body economics +- [Severance Tech](technology/severance-tech.md) — Counter-surveillance technology + +### Contraband (Illegal/Restricted Goods) +- [Lattice Components](contraband/lattice-components.md) — Primary contraband in v0.1 +- [Medical-Grade Replacements](contraband/medical-grade-replacements.md) — Diverted healthcare +- [Severance Equipment](contraband/severance-equipment.md) — Counter-surveillance gear + +### Knowledge Systems (Mechanical Reference) +- [Fact Catalog](knowledge/fact-catalog.md) — FactId entries with confidence levels +- [Entity Attributes](knowledge/entity-attributes.md) — EntityKnowledge key definitions +- [Relationship States](knowledge/relationship-states.md) — State transitions + contradictions + +### Authoring Guides (For Content Team) +- [Monologue Guide](authoring/monologue-guide.md) — Prerequisites, triggers, examples (Mellanie's domain) + +--- + +## Quick Reference + +**v0.1 Scope:** 1 star system, 1 station, 1 district, 3 social sites, 17 NPCs, 5 triangles, 2 playable characters (smuggler + detective) + +**Setting mood:** Quotidian-with-undertow — comfortable enough to be complacent, tight enough that extra income is tempting + +**Core contraband:** Unlicensed lattice components (aftermarket neural mods bypassing Commission regulation) + +**Primary tension:** Economic pressure creates rational incentive for smuggling; community benefits from grey economy; detective enters a place where non-cooperation is self-interest, not malice + +**Key design principle:** Same world, two lenses — the smuggler's home is the detective's crime scene + +--- + +## Cross-References to Decision Documents + +- **D-027:** Vertical slice definition (smuggler + detective two-character proof) +- **D-028:** Dialogue architecture (four relational layers) +- **D-032:** Separate monologue pools per character +- **D-034:** THE FRIEND pattern (production-level complex NPC) +- **D-035:** Tag taxonomy for line pools +- **D-036:** Sova Transit District / Krenn System as v0.1 setting +- **D-037:** Contraband specification +- **D-041:** Knowledge graph data model + +See `decisions/README.md` for full decision domain index. + +--- + +**Status:** Canonical reference as of 2026-02-12 +**Maintained by:** Paula (narrative), Miri (worldbuilding), team contributions +**Source:** Workshops, decision rounds, canonical type definitions in `server/src/knowledge/types.rs` diff --git a/docs/wiki/knowledge/entity-attributes.md b/docs/wiki/knowledge/entity-attributes.md new file mode 100644 index 000000000..a41dcc1b8 --- /dev/null +++ b/docs/wiki/knowledge/entity-attributes.md @@ -0,0 +1,301 @@ +# Entity Knowledge Attributes + +Canonical keys for the `EntityKnowledge.known_attributes` BTreeMap (defined in `server/src/knowledge/types.rs`). These keys structure what one entity knows about another. + +## Overview + +`EntityKnowledge.known_attributes` is a `BTreeMap` — key-value pairs where: +- **Key**: Structured attribute name (defined below) +- **Value**: String representation of the attribute + +The knowledge graph uses these attributes to determine: +- What the observer's monologue says about the target +- Which dialogue lines are available +- How the target renders in the observer snapshot (name vs. description) +- Whether secrets or contradictions are discovered + +--- + +## Identity Attributes + +### `name` + +**Value format**: Full name as known to the observer. + +**Examples**: +- `"Kael Davan"` — observer knows full name +- `"Kael"` — observer knows first name only +- `"the dock worker"` — observer doesn't know name, only role + +**Usage**: Monologue and dialogue rendering. If `name` is absent or generic, monologue says "the dock worker" instead of "Kael." + +--- + +### `role` + +**Value format**: Occupational or social role. + +**Examples**: +- `"dock worker"` +- `"shift supervisor"` +- `"bartender"` +- `"off-duty security"` +- `"ring coordinator"` (if known) + +**Usage**: Default descriptor when name is unknown. Access tier calculation (authority figures get different treatment). + +--- + +### `faction` + +**Value format**: Institutional or organizational allegiance. + +**Examples**: +- `"Commission"` — Sera, Torek, Detective +- `"civilian"` — most NPCs +- `"ring member"` — if discovered +- `"unknown"` — not yet determined + +**Usage**: Access tier logic. Commission-tagged individuals trigger different NPC behavior. Dialogue selection uses this for authority/peer filtering. + +--- + +### `species` + +**Value format**: Species identifier (future-proofing — v0.1 is all human). + +**Examples**: +- `"human"` (default) +- (Future: other species as defined) + +**Usage**: Not load-bearing in v0.1. Placeholder for future non-human NPCs. + +--- + +## Social Attributes + +### `relationship_type` + +**Value format**: Relationship category from observer's perspective. + +**Examples**: +- `"colleague"` — Kael to smuggler +- `"friend"` — Sera to detective +- `"authority figure"` — Voss to subordinates +- `"suspect"` — Kael to detective (post-discovery) +- `"partner"` — Hael to Kael +- `"stranger"` — new NPCs + +**Usage**: Drives `RelationshipState` calculation (Unknown/Known/Friendly/PersonOfInterest/Hostile). Determines emotional tone of monologue. + +--- + +### `trust_level` + +**Value format**: Trust assessment (subjective, observer's judgment). + +**Examples**: +- `"trusted"` — high trust, shares sensitive information +- `"reliable"` — professional trust +- `"uncertain"` — cautiously neutral +- `"suspicious"` — flagged for observation +- `"compromised"` — known to be under pressure or bought + +**Usage**: Gates trust-tier dialogue (surface/real/secret). Detective tracking trust levels determines which NPCs can be turned. + +--- + +## Behavioral Attributes + +### `routine_pattern` + +**Value format**: Observed routine description. + +**Examples**: +- `"morning shift at logistics hub, bar after shift"` +- `"arrives 06:00, break 10:30, departs 14:00"` +- `"irregular schedule, seen at odd hours"` + +**Usage**: Deviation detection. When current behavior doesn't match known `routine_pattern`, monologue flags it. + +--- + +### `behavior_flags` + +**Value format**: Comma-separated behavioral observations. + +**Examples**: +- `"nervous,lattice_checking"` — Kael during contradiction arc +- `"avoidance_pattern,evasive"` — Sera avoiding Torek +- `"spending_beyond_means"` — Torek buying rounds +- `"reliable,punctual"` — baseline normal behavior + +**Usage**: Tell system. Multiple flags accumulate as evidence. Detective's analytical lattice auto-flags some behaviors. + +--- + +## Secret Attributes + +### `secret_held` + +**Value format**: What the observer believes this entity is hiding. + +**Examples**: +- `"ring membership"` — detective's suspicion about Kael +- `"unreported evidence"` — smuggler's read on Sera (if observant) +- `"gambling debt"` — if Drin's vulnerability is discovered +- `"exit attempt"` — if Kael's unauthorized contact is discovered + +**Usage**: Drives PersonOfInterest state. Gates confrontation dialogue. Smuggler and detective track different secrets about the same NPCs. + +--- + +### `secret_confidence` + +**Value format**: How certain the observer is about the secret. + +**Examples**: +- `"suspected"` — behavioral flags suggest something, no proof +- `"likely"` — multiple indicators align +- `"confirmed"` — direct evidence or confession + +**Usage**: Dialogue tone. "Suspected" secrets allow fishing questions. "Confirmed" secrets enable direct confrontation. + +--- + +## Investigation Attributes (Detective-Specific) + +### `tell_observed` + +**Value format**: Specific tell noted by the detective. + +**Examples**: +- `"looks left when lying"` — Kael's tell +- `"leaves when Torek arrives"` — Sera's avoidance +- `"checks lattice before answering"` — nervous behavior +- `"forced casualness after shift supervisor passes"` — hypervigilance + +**Usage**: Behavioral profiling. Accumulated tells build case strength. Monologue references specific tells when they recur. + +--- + +### `contradiction_flagged` + +**Value format**: Boolean-ish flag (presence of key = true). + +**Examples**: +- `"meeting_unknown_contact"` — Kael contradiction +- `"avoidance_inconsistency"` — Sera contradiction +- `"manifest_access_mismatch"` — Maret handling cargo she shouldn't process + +**Usage**: THE FRIEND arc trigger. When this attribute is set, monologue tone shifts. Dialogue options change. RelationshipState moves toward PersonOfInterest. + +--- + +## Examples: Full EntityKnowledge Entries + +### Smuggler's knowledge of Kael (early game, pre-contradiction) + +```rust +EntityKnowledge { + last_known_position: Some(TilePosition { x: 45, y: 12 }), // logistics hub dock + last_observed_tick: 1200, + last_updated_tick: 1200, + confidence: KnowledgeConfidence::Direct, // currently in LOS + source: KnowledgeSource::DirectObservation { tick: 1200 }, + state: KnowledgeState::Active, + relationship: RelationshipState::Friendly, + known_attributes: BTreeMap::from([ + ("name".to_string(), "Kael Davan".to_string()), + ("role".to_string(), "dock worker".to_string()), + ("faction".to_string(), "ring member".to_string()), // smuggler knows + ("species".to_string(), "human".to_string()), + ("relationship_type".to_string(), "close colleague".to_string()), + ("trust_level".to_string(), "trusted".to_string()), + ("routine_pattern".to_string(), "morning shift 06:00-14:00, bar after shift".to_string()), + ("behavior_flags".to_string(), "reliable,punctual".to_string()), + ]), +} +``` + +### Detective's knowledge of Kael (mid-game, post-contradiction discovery) + +```rust +EntityKnowledge { + last_known_position: Some(TilePosition { x: 45, y: 12 }), + last_observed_tick: 2400, + last_updated_tick: 2600, // updated via inference after observation + confidence: KnowledgeConfidence::KnowsDetails, // not currently in LOS, but detailed knowledge + source: KnowledgeSource::Inferred { + basis: vec![ + FactId("investigation.manifest_discrepancy".to_string()), + FactId("investigation.shift_mismatch".to_string()), + ], + }, + state: KnowledgeState::Active, + relationship: RelationshipState::PersonOfInterest, // flagged + known_attributes: BTreeMap::from([ + ("name".to_string(), "Kael Davan".to_string()), + ("role".to_string(), "dock worker".to_string()), + ("faction".to_string(), "civilian".to_string()), // detective doesn't know ring membership yet + ("species".to_string(), "human".to_string()), + ("relationship_type".to_string(), "suspect".to_string()), + ("trust_level".to_string(), "suspicious".to_string()), + ("routine_pattern".to_string(), "morning shift, frequent late departures".to_string()), + ("behavior_flags".to_string(), "nervous,lattice_checking,evasive".to_string()), + ("tell_observed".to_string(), "looks left when lying".to_string()), + ("secret_held".to_string(), "unauthorized meetings".to_string()), + ("secret_confidence".to_string(), "confirmed".to_string()), + ("contradiction_flagged".to_string(), "meeting_unknown_contact".to_string()), + ]), +} +``` + +### Smuggler's knowledge of Sera (if observant, mid-game) + +```rust +EntityKnowledge { + last_known_position: Some(TilePosition { x: 78, y: 34 }), // bar + last_observed_tick: 1800, + last_updated_tick: 2100, + confidence: KnowledgeConfidence::KnowsOf, + source: KnowledgeSource::DirectObservation { tick: 1800 }, + state: KnowledgeState::Active, + relationship: RelationshipState::Known, // not Friendly -- smuggler doesn't know Sera well + known_attributes: BTreeMap::from([ + ("name".to_string(), "Sera Venn".to_string()), + ("role".to_string(), "Commission field tech".to_string()), + ("faction".to_string(), "Commission".to_string()), + ("species".to_string(), "human".to_string()), + ("relationship_type".to_string(), "institutional presence".to_string()), + ("trust_level".to_string(), "uncertain".to_string()), + ("routine_pattern".to_string(), "bar regular, off-duty evenings".to_string()), + ("behavior_flags".to_string(), "observant,avoidance_pattern".to_string()), + ("secret_held".to_string(), "knows something about Torek or Hael".to_string()), + ("secret_confidence".to_string(), "suspected".to_string()), + ]), +} +``` + +--- + +## Attribute Lifecycle + +1. **Initial state** (Unknown NPC): No attributes. EntityKnowledge doesn't exist yet. +2. **First observation** (Direct confidence): `name` (if visible via lattice query or introduction), `role` (inferred from context), `species`, `routine_pattern` starts accumulating. +3. **Repeated interaction** (KnowsOf): `relationship_type` evolves, `trust_level` set, `behavior_flags` accumulate. +4. **Investigation depth** (KnowsDetails): `secret_held`, `tell_observed`, `contradiction_flagged` added by detective. Smuggler gains `faction` clarity. +5. **Knowledge decay**: Attributes persist even as confidence decays. A KnowsOf entry retains all attributes; only positional certainty degrades. + +--- + +## Content Authoring Guidance + +- **Monologue prerequisites** can reference specific attributes: `known_attributes["secret_held"] == "ring membership"`. +- **Dialogue access tiers** can check `faction` or `relationship_type`. +- **Tell system observations** append to `behavior_flags` as comma-separated values. +- **THE FRIEND contradiction** is triggered by setting `contradiction_flagged`. + +--- + +**Total canonical keys**: 14 (4 identity, 2 social, 2 behavioral, 2 secret, 2 investigation, 2 detective-specific). Additional keys can be added as needed, but these 14 cover v0.1 requirements. diff --git a/docs/wiki/knowledge/fact-catalog.md b/docs/wiki/knowledge/fact-catalog.md new file mode 100644 index 000000000..6609d11a2 --- /dev/null +++ b/docs/wiki/knowledge/fact-catalog.md @@ -0,0 +1,311 @@ +# Knowledge Fact Catalog + +Canonical FactIds for the v0.1 vertical slice. All facts follow the `category.topic` format defined in `server/src/knowledge/types.rs`. + +## Format + +- **FactId**: String identifier (e.g., `"contraband.ring_exists"`) +- **Progression**: Text descriptions at each KnowledgeConfidence level +- **Mechanical Purpose**: What this fact gates in dialogue, monologue, or investigation + +--- + +## Contraband Facts + +### `contraband.ring_exists` + +**Suspects**: "Something's going on with the cargo schedules. Too many off-manifest deliveries." +**KnowsOf**: "There's a smuggling operation running through the logistics hub." +**KnowsDetails**: "The ring moves unlicensed lattice components during shift transitions. Voss manages the timing." +**Direct**: N/A (abstract knowledge — never directly observed) + +**Mechanical Purpose**: Gates investigation dialogue trees. Required for ring-specific monologue. The detective starts at Suspects and escalates. The smuggler (if playing the ring member path) starts at KnowsDetails. + +--- + +### `contraband.lattice_components` + +**Suspects**: "That container's marked as standard components, but the mass is wrong." +**KnowsOf**: "Unlicensed lattice components. Aftermarket mods that bypass Commission certification." +**KnowsDetails**: "Medical-grade neural lattice replacements diverted from Syndic supply chains, plus enhanced capability mods." +**Direct**: "I'm looking at a crate of lattice components right now. Serial numbers don't match any certified batch." + +**Mechanical Purpose**: Contraband identification. Detective needs KnowsOf to correctly interpret manifest discrepancies. Smuggler needs KnowsDetails to handle cargo safely. + +--- + +### `contraband.medical_grade` + +**Suspects**: "Some of this cargo doesn't feel like luxury goods." +**KnowsOf**: "Medical-grade lattice replacements. For people whose lattices are degrading and who can't afford Syndic pricing." +**KnowsDetails**: "The ring moves medical replacements for people locked out of the institutional system. It's not just profit — it's healthcare." +**Direct**: N/A (conceptual understanding) + +**Mechanical Purpose**: Moral complexity gate. Smuggler monologue shifts tone when this reaches KnowsDetails. Detective dialogue with humanitarian-focused NPCs requires KnowsOf. + +--- + +### `contraband.severance_tech` + +**Suspects**: "Sealed containers Nils won't discuss. Heavier than lattice components." +**KnowsOf**: "Severance equipment. Counter-surveillance tech. Illegal across most of the Reach." +**KnowsDetails**: "Guardians of Severance supply chain. This isn't local — it's connected to something bigger." +**Direct**: N/A (not directly visible in v0.1) + +**Mechanical Purpose**: Contamination seed for storyteller expansion. The thing that makes the smuggler question how deep the ring goes. + +--- + +### `contraband.supply_chain` + +**Suspects**: "The cargo doesn't originate on this station." +**KnowsOf**: "Off-station coordinator manages incoming shipments. Someone named Sabel." +**KnowsDetails**: "Supply chain: aftermarket manufacturers (Syndic-adjacent) -> freight networks -> Sabel (off-station) -> ring coordinator (Devra or Nils) -> local distribution." +**Direct**: N/A (network knowledge) + +**Mechanical Purpose**: Investigation depth. Detective at KnowsDetails can map the full chain. Smuggler at KnowsDetails understands their position in the network. + +--- + +## Location Facts + +### `location.corridor_b7_restricted` + +**Suspects**: "Corridor B-7 should see foot traffic during shift change. It's empty." +**KnowsOf**: "Maintenance corridor used for smuggling operations. Access requires hub clearance." +**KnowsDetails**: "Corridor B-7 is between old and new prefab sections. Service hatch from break room. The ring routes shipments through here during shift transitions." +**Direct**: "I'm in Corridor B-7 right now. Old construction smell, minimal Meridian coverage, no surveillance." + +**Mechanical Purpose**: Spatial knowledge. Required for investigation progression (detective) and operational planning (smuggler). Direct confidence gates monologue about current surroundings. + +--- + +### `location.smuggling_route` + +**Suspects**: "Cargo movements don't match the official routing." +**KnowsOf**: "The ring uses a specific path: freight bay -> service corridor -> temporary storage -> bar district back room." +**KnowsDetails**: "Timing is critical. The route only works during shift transition when patrol coverage thins. Lera provides the final handoff point." +**Direct**: "Watching the route right now. Kosse moving a container through the service hatch." + +**Mechanical Purpose**: Investigation mechanics. Detective needs KnowsOf to predict NPC movements. Smuggler needs KnowsDetails for operational participation. + +--- + +### `location.surveillance_gaps` + +**Suspects**: "Some areas feel less monitored than others." +**KnowsOf**: "Meridian coverage degrades in older sections. Maintenance corridors have minimal surveillance." +**KnowsDetails**: "Corridor B-7, break room service hatch, bar back room — all Meridian dead spots. The ring exploits these systematically." +**Direct**: "Checking my lattice overlay now. Zero Meridian signal in this section." + +**Mechanical Purpose**: Stealth and observation mechanics. Detective's augmented lattice can detect coverage gaps (requires KnowsOf). Smuggler uses gaps operationally (requires KnowsDetails). + +--- + +### `location.dead_drop_location` + +**Suspects**: "Kael leaves things in the break room locker area. Not his own locker." +**KnowsOf**: "Locker 47 in the hub break room. Unofficial dead drop for small items." +**KnowsDetails**: "Locker 47 is registered to a worker who transferred off-station 18 months ago. Never reassigned. The ring has used it ever since." +**Direct**: "Locker 47 is open. There's a sealed packet inside." + +**Mechanical Purpose**: Discovery mechanic. Detective can discover through observation (Suspects -> KnowsOf). Smuggler knows from background (starts at KnowsDetails). + +--- + +## Investigation Facts + +### `investigation.manifest_discrepancy` + +**Suspects**: "Cargo manifests have inconsistencies. Weight doesn't match volume." +**KnowsOf**: "Systematic manifest doctoring. Someone with freight scheduler access is altering records." +**KnowsDetails**: "Maret Korr processes manifests. She's noticed the discrepancies but hasn't reported them. She's either complicit or terrified." +**Direct**: "Comparing the manifest right now. Container 4471 — logged weight 240kg, actual weight closer to 310kg." + +**Mechanical Purpose**: Core investigation mechanic. Detective's analytical lattice flags discrepancies at Suspects. Full understanding requires KnowsDetails. Smuggler knows Maret's position from background. + +--- + +### `investigation.shift_mismatch` + +**Suspects**: "Night shift schedules don't align with freight volume." +**KnowsOf**: "Voss adjusts shift schedules to create coverage gaps. Deliberate understaffing during high-risk windows." +**KnowsDetails**: "Shift mismatches occur every third rotation. Coincides exactly with off-station shipment arrivals. Voss takes a cut." +**Direct**: "Checking the current schedule. Night shift is short two workers — again." + +**Mechanical Purpose**: Pattern recognition. Detective needs KnowsOf to connect schedule to smuggling. Smuggler knows the pattern operationally. + +--- + +### `investigation.cargo_anomaly` + +**Suspects**: "That container sat in temporary storage for 18 hours. Standard procedure is 4-6 hours max." +**KnowsOf**: "Delayed processing indicates off-manifest handling. Someone's buying time to repackage cargo." +**KnowsDetails**: "Nils coordinates timing. Container arrives, sits in temp storage during shift A, gets repackaged during shift B transition, moves out during shift C startup." +**Direct**: "Container 4471 has been sitting here for 14 hours. No movement orders logged." + +**Mechanical Purpose**: Observation-based discovery. Detective builds case from Suspects upward. Smuggler knows the workflow (starts KnowsDetails). + +--- + +### `investigation.evidence_collected` + +**Suspects**: N/A (binary fact — you either have evidence or you don't) +**KnowsOf**: "I have documented manifest discrepancies, shift schedule anomalies, and witness testimony from Drin." +**KnowsDetails**: "Full case file: manifest logs, Drin's testimony under pressure, Maret's reluctant cooperation, surveillance footage from observation gallery showing Corridor B-7 access." +**Direct**: N/A (abstract accumulation) + +**Mechanical Purpose**: Investigation state tracker. Gates confrontation dialogue. Detective-specific — smuggler doesn't collect evidence against themselves. + +--- + +## World Facts + +### `world.commission_regulations` + +**Suspects**: "The Commission regulates lattice technology. That's why people want aftermarket mods." +**KnowsOf**: "Commission certification is expensive and slow. Category 3 violation for unauthorized lattice modification carries fines and potential lattice restriction." +**KnowsDetails**: "Commission monopoly prices most citizens out of enhanced capability. Medical-grade replacements require 6-12 month approval cycles. The black market exists because the legitimate system fails." +**Direct**: N/A (regulatory knowledge) + +**Mechanical Purpose**: Moral framing. Smuggler at KnowsDetails has ideological justification. Detective at KnowsDetails understands why the ring has community support. + +--- + +### `world.syndic_supply_chain` + +**Suspects**: "The cargo originates from Syndic-controlled systems." +**KnowsOf**: "Syndics manufacture medical-grade lattice components. Diverted shipments end up on the black market." +**KnowsDetails**: "Specific Syndic: unclear, but the serial number patterns suggest two sources. The ring doesn't control the supply chain — they're downstream distributors." +**Direct**: N/A (network knowledge) + +**Mechanical Purpose**: Political context. Detective at KnowsDetails realizes the ring is small-scale. Smuggler at KnowsDetails understands their position in the larger economy. + +--- + +### `world.sova_district_layout` + +**Suspects**: "The district is a mix of old and new construction." +**KnowsOf**: "40-year-old prefab base with retrofitted partitions. Logistics hub, bar district, residential sections. Meridian coverage is uneven." +**KnowsDetails**: "Older sections have hidden spaces between wall layers. Service corridors from original construction still exist but aren't on current maps. The ring exploits architectural legacy." +**Direct**: "I'm looking at the district map overlay right now. Official layout vs. actual structure don't match in Section 3." + +**Mechanical Purpose**: Navigation and investigation. Detective needs KnowsDetails to find hidden spaces. Smuggler starts with KnowsOf (knows layout from living here). + +--- + +### `world.shift_schedule` + +**Suspects**: "Logistics hub runs three shifts: morning, day, night." +**KnowsOf**: "Shift transitions are 30-minute windows with reduced oversight. Ring operations happen during transitions." +**KnowsDetails**: "Shift A: 06:00-14:00. Shift B: 14:00-22:00. Shift C: 22:00-06:00. Transition windows: 13:30-14:30, 21:30-22:30, 05:30-06:30. Voss manages the schedule." +**Direct**: "Current time: 21:45. Shift transition active. Observing movement patterns." + +**Mechanical Purpose**: Temporal mechanics. Required for NPC routine prediction and investigation timing. Smuggler starts KnowsDetails. Detective learns through observation. + +--- + +## Relationship Facts + +### `relationship.ring_membership` + +**Suspects**: "Kael's behavior suggests involvement in something off-book." +**KnowsOf**: "Kael is a ring member. Mid-level, handles physical cargo." +**KnowsDetails**: "Ring structure: Devra or Nils coordinate, Voss provides scheduling cover, Kael and Kosse handle cargo, Lera provides handoff point, Pell is wavering." +**Direct**: "Watching Kael move a container right now. Ring operation in progress." + +**Mechanical Purpose**: Social knowledge. Detective builds this through investigation. Smuggler knows from shared membership (if on that path) or observation. + +--- + +### `relationship.kael_hael_connection` + +**Suspects**: "Kael mentions a partner. Someone named Hael." +**KnowsOf**: "Kael's partner is Hael, a teacher. They're worried about Kael's late nights." +**KnowsDetails**: "Hael confides in Sera Venn. Sera knows something is wrong but hasn't reported it. The worry is contaminating Kael's operational security." +**Direct**: N/A (relationship knowledge) + +**Mechanical Purpose**: Emotional leverage. Detective can use Hael as pressure point. Smuggler (if Kael's friend) must protect Hael from knowledge. + +--- + +### `relationship.trust_network` + +**Suspects**: "People here know each other. Tight social bonds." +**KnowsOf**: "The ring depends on trust networks: Kael trusts Nils (sibling), Lera trusts the regulars, Drin is compromised by debt to Harek." +**KnowsDetails**: "Trust map: Kael <-> Nils (blood), Kael <-> Hael (partnership), Hael <-> Sera (friendship), Sera <-> Detective (professional/personal), Drin -> Harek (debt), Voss -> Devra/Nils (financial)." +**Direct**: N/A (social network knowledge) + +**Mechanical Purpose**: Social manipulation mechanics. Detective at KnowsDetails can exploit trust fractures. Smuggler at KnowsDetails knows whom to protect. + +--- + +### `relationship.faction_allegiance` + +**Suspects**: "Some people here are Commission-aligned. Others resent the Commission." +**KnowsOf**: "Sera is Commission. Torek Lintar is nominally Commission but lives here. The detective represents institutional authority. Everyone else is civilian." +**KnowsDetails**: "Faction tensions: Commission (Sera, Torek, Detective) vs. ring (Kael, Nils, Kosse, Voss, Lera) vs. civilians (Hael, Maret, Drin, Resha). Drin is compromised between civilian and Commission." +**Direct**: N/A (political knowledge) + +**Mechanical Purpose**: Access tier logic. Explains why NPCs treat characters differently. Detective at KnowsDetails understands institutional barriers. + +--- + +## Progress Facts (Arc State Tracking) + +### `progress.initial_suspicion` + +**Suspects**: "Something feels off about this place." +**KnowsOf**: "There's a pattern here. Cargo discrepancies, nervous NPCs, evasive answers." +**KnowsDetails**: "Smuggling operation confirmed. Now I need to identify the participants and build a case." +**Direct**: N/A (meta-knowledge) + +**Mechanical Purpose**: Detective arc state. Gates monologue tone shifts. Smuggler doesn't track this (they start knowing the operation exists). + +--- + +### `progress.active_investigation` + +**Suspects**: N/A (binary — investigation is active or it isn't) +**KnowsOf**: "I'm building a case. Evidence collected, witnesses identified, patterns mapped." +**KnowsDetails**: "Case file: manifest logs, Drin testimony, Maret's reluctant cooperation, surveillance data, NPC behavioral analysis. Ready to escalate." +**Direct**: N/A (meta-knowledge) + +**Mechanical Purpose**: Detective arc state. Gates confrontation options. Changes NPC dialogue (they know they're being investigated). + +--- + +### `progress.confrontation_ready` + +**Suspects**: N/A +**KnowsOf**: "I have enough to confront specific NPCs. Kael, Voss, or Lera." +**KnowsDetails**: "Full case built. Can confront the ring, turn an informant, or escalate to Commission enforcement." +**Direct**: N/A (meta-knowledge) + +**Mechanical Purpose**: Detective endgame gate. Smuggler equivalent: `progress.operation_compromised` (not listed here — detective-specific arc). + +--- + +### `progress.arc_resolved` + +**Suspects**: N/A +**KnowsOf**: N/A +**KnowsDetails**: "The arc has concluded. Ring dismantled, informant turned, or operation escaped. Outcome determined." +**Direct**: N/A (meta-knowledge) + +**Mechanical Purpose**: Arc completion tracker. Used by storyteller to determine whether new modules can activate. + +--- + +## Usage Notes + +- **FactId strings** must match exactly. `"contraband.ring_exists"` not `"contraband.ring_exist"` or `"Ring Exists"`. +- **Confidence levels** are ordered: Suspects < KnowsOf < KnowsDetails < Direct. Use `KnowledgeConfidence::decayed()` for time-based degradation. +- **Direct confidence** is perception-system-managed. Content authors rarely set this manually — it's automatically assigned when an entity/location is in the observer's LOS. +- **Abstract facts** (e.g., `contraband.ring_exists`, `world.commission_regulations`) never reach Direct — they're conceptual, not observable. +- **Spatial facts** (e.g., `location.corridor_b7_restricted`) can reach Direct when the observer is physically present. +- **Progression text** is for content authoring reference, not runtime display. Monologue lines reference these facts as prerequisites; they don't display the progression text directly. + +--- + +**Total FactIds**: 24 (5 contraband, 4 location, 4 investigation, 4 world, 4 relationship, 4 progress). Sufficient for v0.1 vertical slice. Expandable by adding new categories or topics within existing categories. diff --git a/docs/wiki/knowledge/relationship-states.md b/docs/wiki/knowledge/relationship-states.md new file mode 100644 index 000000000..0918e5962 --- /dev/null +++ b/docs/wiki/knowledge/relationship-states.md @@ -0,0 +1,332 @@ +# Relationship States and Transitions + +How `RelationshipState` (defined in `server/src/knowledge/types.rs`) evolves during gameplay, with specific patterns for THE FRIEND contradictions and KnowledgeState integration. + +## Canonical States + +From `server/src/knowledge/types.rs`: + +```rust +pub enum RelationshipState { + Unknown, // Teal #4a9ebb + Known, // Soft green #6bc9a6 + Friendly, // Soft green #6bc9a6 (same color, different semantics) + PersonOfInterest, // Amber #e8c547 + Hostile, // Red #d45d5d +} +``` + +**Visual rendering**: D-033 entity color system. The client maps these states to colors. The knowledge graph determines the state. + +--- + +## State Semantics + +### Unknown + +**What it means**: No prior knowledge of this entity. First encounter. + +**Monologue tone**: Observational, neutral. "Who's that?" + +**Dialogue availability**: Public-tier only. No trust-gated content. + +**Color**: Teal — visually distinct from all other states. + +**Typical duration**: First 30 seconds to 2 minutes of gameplay (until first direct interaction or lattice query). + +--- + +### Known + +**What it means**: Recognized, neutral-to-positive. Not a threat, not a close ally. + +**Monologue tone**: Casual acknowledgment. "There's Drin. Maintenance tech." + +**Dialogue availability**: Public + peer-tier (if appropriate). No insider/secret content yet. + +**Color**: Soft green — "safe enough." + +**Typical entities**: Coworkers (smuggler), routine contacts (detective), flat NPCs, bar regulars. + +--- + +### Friendly + +**What it means**: Positive relationship, trusted. Emotional connection or reliable professional rapport. + +**Monologue tone**: Warm, personal. "Good to see Kael. Always reliable." + +**Dialogue availability**: Public + peer + insider-tier. Trust-gated content unlocks. Some secret-tier content if relationship deepens. + +**Color**: Soft green (same as Known — the distinction is semantic, not visual). + +**Typical entities**: THE FRIEND NPCs (Kael to smuggler, Sera to detective), close colleagues, trusted contacts. + +**Why same color as Known**: Visual simplicity for v0.1. Future refinement could add subtle shader variation (warmth, pulse, saturation). + +--- + +### PersonOfInterest + +**What it means**: Flagged. Something's wrong. Under observation or suspicion. + +**Monologue tone**: Analytical, cautious. "Kael's meeting someone I don't recognize. That's not normal." + +**Dialogue availability**: Shifts. Trust-gated content may become unavailable. Confrontation options unlock. + +**Color**: Amber — "pay attention." + +**Typical entities**: NPCs caught in contradictions, suspects under investigation, people who've triggered tells. + +**THE FRIEND trigger**: When THE FRIEND's contradiction is discovered, they transition from Friendly → PersonOfInterest. This is the emotional gut-punch moment. + +--- + +### Hostile + +**What it means**: Character KNOWS there is danger. Threat confirmed. + +**Monologue tone**: Alarm, threat assessment. "That's security. They're moving toward me." + +**Dialogue availability**: Hostile-tier only (threats, demands, final warnings). All trust content locked. + +**Color**: Red — "danger." + +**Typical entities**: NPCs who've turned on the player, authority figures during a confrontation gone bad, exposed ring members cornered by the detective. + +**Rare in v0.1**: Most NPCs don't reach Hostile. It's the endgame state for failed social maneuvering. + +--- + +## Transition Paths + +### Standard Progression (No Contradiction) + +``` +Unknown → Known → Friendly +``` + +**Triggers**: +- Unknown → Known: First direct interaction OR lattice query identifies them. +- Known → Friendly: Repeated positive interactions, shared drinks at bar, successful cooperation, trust-building dialogue. + +**Example**: Detective meets a bar regular. Unknown (first visit) → Known (second visit, exchanged names) → Friendly (third visit, regular offers unprompted gossip). + +--- + +### Investigation Progression (Detective) + +``` +Unknown → Known → PersonOfInterest → Hostile (if confrontation fails) +``` + +**Triggers**: +- Unknown → Known: Lattice query, case file match, first observation. +- Known → PersonOfInterest: Behavioral flags accumulate, tells observed, manifest discrepancy linked to this NPC. +- PersonOfInterest → Hostile: Confrontation attempt rejected, NPC realizes they're under investigation, escalation. + +**Example**: Detective observes Kael. Unknown (first sight) → Known (lattice query: "Davan, K., dock worker") → PersonOfInterest (observed in restricted corridor, evasive answers) → Hostile (confrontation: "I know you're involved. You need to cooperate." / Kael: "Stay away from me."). + +--- + +### THE FRIEND Contradiction Arc (Kael — Smuggler's Perspective) + +``` +Friendly → PersonOfInterest → [resolution: Friendly-but-contaminated OR Hostile] +``` + +**Phase 1: Friendly (baseline)** +- Kael is the smuggler's trusted colleague. +- Monologue: fond, casual. +- Color: soft green. +- Dialogue: insider-tier, warm. + +**Phase 2: First Crack (still Friendly, but flags accumulating)** +- Behavioral flags: `lattice_checking,distracted`. +- Monologue shifts slightly: "Kael's been quiet lately." +- State unchanged (still Friendly), but `EntityKnowledge.known_attributes["behavior_flags"]` updates. + +**Phase 3: The Contradiction (Friendly → PersonOfInterest)** +- Trigger: Direct observation of Kael meeting unknown contact in Corridor B-7. +- `EntityKnowledge.known_attributes["contradiction_flagged"] = "meeting_unknown_contact"`. +- `RelationshipState` transitions to `PersonOfInterest`. +- Color shifts: soft green → amber. +- Monologue: "That wasn't anyone from our rotation. Kael, what are you doing?" +- Dialogue options change: confrontation unlocks, trust-tier content locks (Kael is evasive). + +**Phase 4: Post-Confrontation** +- **Path A (understanding)**: Smuggler confronts Kael gently. Kael confesses: trying to exit the ring to protect Hael. `RelationshipState` remains `PersonOfInterest` but monologue tone shifts to conflicted sympathy. Color stays amber (still a problem), but dialogue reflects empathy. +- **Path B (betrayal)**: Smuggler reports Kael to Nils or pressures Kael harshly. Kael turns defensive. `RelationshipState` → `Hostile`. Color → red. Kael avoids the smuggler, might actively obstruct. + +**THE FRIEND pattern**: Friendly → PersonOfInterest is the emotional core. The player trusted Kael. Now Kael is amber. That color shift IS the narrative moment. + +--- + +### THE FRIEND Contradiction Arc (Sera — Detective's Perspective) + +``` +Friendly → PersonOfInterest → [resolution: Friendly-but-contaminated OR Known-distanced OR Hostile] +``` + +**Phase 1: Friendly (baseline)** +- Sera is the detective's institutional contact and social anchor. +- Monologue: professional warmth, relief. +- Color: soft green. +- Dialogue: peer-tier, cooperative, helpful. + +**Phase 2: Pattern Observation (still Friendly, but flags accumulating)** +- Behavioral flags: `avoidance_pattern` (Sera leaves when Torek arrives). +- Monologue: "That's the third time. Sera leaves when Torek shows up." +- State unchanged (still Friendly), but `EntityKnowledge.known_attributes["behavior_flags"]` updates. + +**Phase 3: The Contradiction (Friendly → PersonOfInterest)** +- Trigger: Detective asks Sera directly about Torek. Sera deflects unconvincingly. +- `EntityKnowledge.known_attributes["contradiction_flagged"] = "avoidance_inconsistency"`. +- `EntityKnowledge.known_attributes["secret_held"] = "unreported evidence"` (detective's inference). +- `RelationshipState` transitions to `PersonOfInterest`. +- Color shifts: soft green → amber. +- Monologue: "She's not lying. But she's not telling me everything. Sera, what do you know?" +- Dialogue options change: pressing questions unlock, casual warmth diminishes. + +**Phase 4: Post-Confrontation** +- **Path A (loyalty test)**: Detective confronts Sera about concealment. Sera confesses: sitting on evidence to protect Hael (friend of Sera, partner of Kael). Detective can choose: report Sera (Hostile), use the information without reporting her (PersonOfInterest → Known, relationship damaged), or protect Sera and accept the information gap (PersonOfInterest → Friendly-but-contaminated). +- **Path B (institutional)**: Detective reports Sera immediately. `RelationshipState` → `Hostile`. Sera is reprimanded or reassigned. Color → red. The detective loses their only local ally. + +**THE FRIEND pattern**: The detective's trust in Sera is tested. Amber means "my friend is hiding something." The resolution determines whether the friendship survives. + +--- + +## Contradiction Patterns: Kael + Sera + +Both THE FRIEND NPCs follow the same structural arc, but the **nature of the contradiction differs**: + +| Dimension | Kael (Smuggler's FRIEND) | Sera (Detective's FRIEND) | +|-----------|--------------------------|---------------------------| +| **Contradiction type** | Spatial deviation (meeting unknown contact) | Behavioral avoidance (leaving when Torek arrives) | +| **Discovery method** | Direct observation in restricted area | Pattern recognition over multiple visits | +| **What they're hiding** | Attempt to exit the ring (protect Hael) | Unreported evidence (protect Hael) | +| **Sympathetic motivation** | Family protection (Hael is Kael's partner) | Friendship loyalty (Hael is Sera's friend) | +| **Hael as connection** | Kael's personal life | Sera's social network | +| **Color shift timing** | Single observation event (immediate) | Third occurrence (cumulative) | +| **Confrontation stakes** | Ring security vs. personal loyalty | Institutional duty vs. personal loyalty | +| **Resolution spectrum** | Understanding ↔ Betrayal | Protect friend ↔ Report corruption | + +**Common structure**: Both contradictions involve **Hael** as the emotional anchor. Hael is worried about Kael. Sera knows why (unreported evidence). Kael is trying to protect Hael (exit attempt). The smuggler and detective approach the same NPC web from opposite sides. THE FRIEND, in both cases, is the person caught in the middle trying to protect someone they care about. + +--- + +## KnowledgeState Integration + +`RelationshipState` (social assessment) is **orthogonal to** `KnowledgeState` (logical validity). + +### Active (default) + +**What it means**: The knowledge is currently believed true. + +**Effect on relationship**: None directly. A Friendly NPC with Active knowledge remains Friendly. + +**Example**: Smuggler's knowledge of Kael as "trusted colleague" is Active until the contradiction. + +--- + +### Contradicted + +**What it means**: Conflicting information exists. Both the original belief and the contradiction receive this state. + +**Effect on relationship**: **This is the trigger for Friendly → PersonOfInterest.** + +When `KnowledgeState` becomes `Contradicted`, the system: +1. Sets `EntityKnowledge.state = KnowledgeState::Contradicted` on the conflicting knowledge entries. +2. Triggers a monologue event: "Wait, that doesn't match what I thought I knew." +3. Evaluates `RelationshipState` transition. If the contradicted knowledge is about a Friendly NPC, transition to PersonOfInterest. + +**Example**: Smuggler's knowledge "Kael operates within ring protocol" contradicts with new observation "Kael meeting unauthorized contact." Both entries become `Contradicted`. Monologue fires. Kael's `RelationshipState` → `PersonOfInterest`. + +--- + +### Stale + +**What it means**: Knowledge has aged beyond the stale threshold (default 3600 ticks = 6 game-hours). + +**Effect on relationship**: Degrades confidence but doesn't change relationship state. A Friendly NPC remains Friendly, but positional knowledge becomes unreliable. + +**Example**: Smuggler last saw Kael at the hub 7 hours ago. `last_known_position` becomes Stale. Monologue: "Kael should be off-shift by now. Probably at the bar, but I haven't seen him." + +--- + +## Relationship State and Dialogue Selection + +The dialogue system (D-028, D-035) uses `RelationshipState` as a filter: + +| Dialogue `access` tag | Unknown | Known | Friendly | PersonOfInterest | Hostile | +|-----------------------|---------|-------|----------|------------------|---------| +| `public` | ✓ | ✓ | ✓ | ✓ | ✓ | +| `peer` | ✗ | ✓ | ✓ | ✗ | ✗ | +| `insider` | ✗ | ✗ | ✓ | ✗ | ✗ | +| `authority` | ✓ (if detective) | ✓ (if detective) | ✗ | ✓ (if detective) | ✗ | +| `hostile` | ✗ | ✗ | ✗ | ✗ | ✓ | + +**Key insight**: `PersonOfInterest` **locks out peer and insider content**. When THE FRIEND transitions to PersonOfInterest, trust-gated dialogue disappears. The NPC becomes guarded. This is mechanically expressed through access-tier filtering. + +--- + +## Monologue Tone Shifts per State + +### Unknown → Known + +- **Before**: "Who's that?" +- **After**: "That's Drin, the maintenance tech." + +**Shift**: Identification. Observer now has context. + +--- + +### Known → Friendly + +- **Before**: "Drin's over there." +- **After**: "Good to see Drin. Always fixes things without making a fuss." + +**Shift**: Warmth. Personal regard. + +--- + +### Friendly → PersonOfInterest (THE FRIEND) + +- **Before**: "There's Kael. Good — I was starting to worry." +- **After**: "Kael's here. But he's been acting strange. What's going on?" + +**Shift**: Doubt contaminates warmth. The fond observation is now analytical. + +--- + +### PersonOfInterest → Hostile + +- **Before**: "Kael's avoiding me. Something's wrong." +- **After**: "Kael just signaled security. He's turned on me." + +**Shift**: Assessment → alarm. + +--- + +## Implementation Notes for Content Authors + +- **Contradiction discovery** sets `EntityKnowledge.state = KnowledgeState::Contradicted` AND triggers `RelationshipState` transition if applicable. +- **Monologue lines** should reference `RelationshipState` in prerequisites: + ```yaml + prerequisite: + relationship_state: PersonOfInterest + subject: kael_davan + ``` +- **Dialogue lines** filter on `access` tier, which is derived from `RelationshipState` + character type (smuggler/detective/NPC role). +- **Color shifts** are client-side rendering, but the knowledge graph determines the state. Content authors write to the state; the client handles the color. +- **THE FRIEND arc** requires: + - Friendly baseline (relationship history) + - Observable contradiction (spatial deviation or behavioral pattern) + - `contradiction_flagged` attribute set + - Monologue shift (analytical doubt) + - Dialogue shift (confrontation options unlock, trust options lock) + - Resolution paths (multiple endings based on player choice) + +--- + +**Total states**: 5. **Load-bearing transitions for v0.1**: Unknown → Known (universal), Known/Friendly → PersonOfInterest (THE FRIEND), PersonOfInterest → Hostile (confrontation failure). Other transitions exist but are less structurally critical. diff --git a/docs/wiki/locations/krenn-system/maintenance-corridors.md b/docs/wiki/locations/krenn-system/maintenance-corridors.md new file mode 100644 index 000000000..ce8c49695 --- /dev/null +++ b/docs/wiki/locations/krenn-system/maintenance-corridors.md @@ -0,0 +1,192 @@ +# Maintenance Corridors (Smuggling Spaces) + +**Type:** Location — Criminal Infrastructure / Repurposed Space +**Status:** Canonical +**District:** [Sova Transit District](../../world/sova-transit-district.md) +**Station:** [Station Sova](../../world/station-sova.md) +**System:** [Krenn System](../../world/krenn-system.md) +**Level:** Between levels (interstitial construction) +**Key Location:** Corridor B-7 +**Access:** Restricted (service hatch from Terminal break room, maintenance access from Level 2) +**Meridian Coverage:** Degraded to absent + +--- + +## Overview + +The maintenance corridors are the spaces between Sova Transit District's official architecture — the gaps where old construction meets new, where service infrastructure runs between wall layers, where 140 years of station retrofitting has left passages that exist on original schematics but not on current maps. They are not built spaces in the conventional sense. They are the negative space of the station's architectural history. + +Corridor B-7 is the primary off-books route. It runs between the original prefab shell of the freight bay (now The Terminal's Level 1) and the interior partition wall of the Level 2 amenities strip. The corridor was a maintenance access for ventilation systems during the station's first retrofit ~80 years ago. When the second retrofit added Level 2 amenities, the corridor was partially sealed and forgotten. "Forgotten" in the institutional sense — it dropped off maintenance schedules, lost its corridor designation in official records, and stopped appearing on maps issued to new station personnel. + +The ring didn't build this space. They found it. + +--- + +## Physical Description + +### Corridor B-7 (Primary Smuggling Route) + +**Dimensions:** ~120 meters long, 1.8 meters wide (tight for two people passing), 2.2 meters high. The corridor follows the curve of the station's structural geometry — it's not straight. Visibility is limited to 15-20 meters at best before the corridor bends. + +**Construction:** Original station prefab walls on the left (the freight bay's outer shell — you can feel machinery vibration through these walls during active shifts). Retrofit partition wall on the right (thinner, newer material, occasionally patched). The floor is original metal grating — functional, loud underfoot, cold. The ceiling carries exposed conduit runs: ventilation ducts, power cables, data lines (some active, some dead, the dead ones never removed). + +**Entry Points:** +1. **Service hatch from Terminal break room** (south end) — A 0.9m x 1.2m hatch in the back wall of the locker area, originally for ventilation maintenance. Looks like a utility panel. Requires a physical latch (no electronic lock — off-Meridian by default). The ring has oiled the hinges. Workers who know about it move through without hesitation. Workers who don't know about it have never noticed it. + +2. **Maintenance access from Level 2 corridor** (north end) — A labeled door ("MAINTENANCE — AUTHORIZED PERSONNEL") that requires station maintenance clearance. In practice, the clearance hasn't been checked in years. The door leads to a junction point where B-7 intersects with two other maintenance corridors. Renn uses this entry when coming from the residential pods. + +3. **Emergency access panel near temporary storage** (midpoint) — A ventilation access that was never sealed during the second retrofit. Small enough to pass cargo through, not large enough for comfortable transit. Used for emergency operations when primary entry points feel watched. + +**Interior Features:** +- **Dead drop alcove** (30 meters from south entry): A recessed section where a ventilation junction box was removed but the wall niche remains. The ring stores small items here — data chips, sealed packets, components that don't need container handling. The alcove is invisible unless you know where to look. +- **Junction room** (60 meters, midpoint): Where B-7 crosses a perpendicular maintenance corridor. A slightly wider space (~3m x 3m) with access to overhead cable trays. This is where larger items are temporarily staged before being moved to their final destination. The room has a single emergency light (red, dim, motion-activated — installed by station maintenance and never checked). +- **Ventilation hub** (90 meters from south entry): A section where the corridor widens around a ventilation distribution unit. The unit runs continuously, producing a low hum that masks conversation. Devra uses this spot for in-person meetings when Meridian communication isn't secure enough. + +--- + +## Atmosphere & Sensory Details + +**Sound:** +- Ventilation hum (omnipresent, louder than in habitable spaces — these corridors ARE the ventilation infrastructure) +- Footsteps on metal grating (loud, echoing, impossible to approach silently unless you slow to a deliberate pace) +- Machinery vibration through the left wall (the Terminal's grav-lifts and cargo systems, muffled but constant during active shifts, silent during night shift lull) +- Occasionally: distant voices from Level 2 bleeding through the partition wall (unintelligible but audible — a reminder that inhabited space is inches away) +- Silence during 01:00-04:00 operations is not silence — it's the ventilation hum with everything else subtracted + +**Smell:** +- Recycled air with a stronger metallic undertone than in habitable areas (older ductwork, less filtration) +- Industrial chemicals (legacy residue in the walls, faint but persistent) +- Damp metal (condensation on cooler surfaces where ventilation creates temperature gradients) +- Absence: no cooking smell, no crowd scent, no organic presence. The corridor smells like what it is — infrastructure, not habitat. + +**Lighting:** +- Emergency red from spaced fixtures (every 20 meters, low intensity — enough to navigate, not enough to read) +- Long shadows between fixtures. The curvature of the corridor means you can see the red glow of the next fixture but not what's between you and it. +- At the junction room: motion-activated emergency light (white, harsh, brief — it clicks on when you enter and times out after 3 minutes) +- Portable lights: the ring carries small handheld units for operations. The detective's analytical lattice includes a low-light enhancement mode that makes the corridor navigable but color-shifted. +- Ambient darkness is the baseline. Light is brought in, not found. + +**Temperature:** +- Cooler than habitable spaces (environmental systems serve the corridor as infrastructure, not as living space) +- Temperature gradients near ventilation junctions — cold pockets where conditioned air moves +- Cold enough that breath condenses near the ventilation hub during night shifts (the district's environmental systems enter low-power mode) + +**Visual Texture:** +- Exposed conduit: cables and ducts running along the ceiling, some labeled, some not, some disconnected and left in place +- Patch marks on walls: where panels were replaced, where holes were sealed, where someone wrote a maintenance note in marker decades ago and it's still there +- Graffiti: sparse but present — maintenance workers from previous eras left marks. A date (34 years old). An arrow pointing to a junction. A name. Recent additions: a small symbol near the dead drop alcove that means nothing to anyone who doesn't know what it means. +- Dust: fine, even, covering surfaces that haven't been touched in months. Footprints in the dust are evidence. The ring knows this and has developed the habit of brushing the floor with a cloth after operations. + +--- + +## NPC Presence + +### Ring NPCs (Operational Presence in Corridors) + +| NPC | Role | Corridor Use | Frequency | +|-----|------|-------------|-----------| +| [Devra](../../npcs/devra.md) | Ring Coordinator | Meetings at ventilation hub, coordination | 2-3x per week | +| [Renn](../../npcs/renn.md) | Courier | Primary cargo transfer through B-7 | Every ring operation (night shift cycle) | +| [Pell](../../npcs/pell.md) | Wavering Ring Member | Nervous presence, dead drop pickups | Irregular, increasingly reluctant | +| [Sabel](../../npcs/sabel.md) | Fence/Buyer (external) | Rare in-person meetings at junction room | Monthly, high-stakes | +| [Tav](../../npcs/tav.md) | Lookout/Runner | Watches entry points during operations | Every ring operation | + +### Non-Ring NPC Access + +- **Drin** (Maintenance Tech): Has legitimate reason to be in maintenance corridors. Passes through B-7 occasionally for ventilation work. Has noticed the oiled hinges, the clean floor near the alcove, the fact that the emergency light at the junction was replaced with a newer unit. Drin says nothing. Drin is compromised by debt to Harek, and even without that, Drin minds their business. + +- **Resha** (New Hire): Does NOT know about the corridors. Resha's curiosity is a risk factor — if they follow Renn during a shift transition, they could stumble into B-7. This is a storyteller-activatable event. + +--- + +## Operational Rhythm + +**Standard Operation (Every Third Night Shift Rotation):** + +1. **22:30-23:00:** Tav positions at Level 2 maintenance access. Watches for unexpected foot traffic. +2. **01:00-01:15:** Renn enters through Terminal break room service hatch. Moves pre-staged container contents from temporary storage into the corridor. +3. **01:15-01:45:** Cargo moved through B-7 to junction room. Items sorted: small components to dead drop alcove for later pickup, larger items staged for transfer. +4. **01:45-02:00:** Renn exits through Level 2 maintenance access. Tav confirms clear. Corridor secured. +5. **02:00+:** Floor brushed near entry points. Dust disturbed along the route settles naturally over 6-8 hours. + +**Total operational window: ~90 minutes.** The ring has run this sequence dozens of times. It's smooth, rehearsed, and unremarkable from outside — the only external evidence is the container sitting 14+ hours in temporary storage. + +**Dead Drop Cycle (Continuous):** +- Pell picks up data chips and small items from the alcove 1-2 times per week. Timing varies. Pell's increasing nervousness makes their visits shorter and more erratic — they used to linger, check the corridor, make sure everything was in order. Now they grab and go. This behavioral change is observable by anyone who knows Pell's pattern. + +**Devra's Meetings (Irregular):** +- Devra meets contacts at the ventilation hub for conversations that can't happen on the Meridian. These meetings are rare (monthly or less) but high-significance. The ventilation hum masks speech from casual eavesdropping. Devra brings a Severance device for these meetings — a small counter-surveillance unit that creates a localized Meridian dead zone. + +--- + +## Mechanical Integration + +### Knowledge Graph Flags (FactIds) + +| FactId | Smuggler Starting Level | Detective Starting Level | How Detective Escalates | +|--------|------------------------|-------------------------|-------------------------| +| `location.corridor_b7_restricted` | KnowsDetails (uses it) | None | Discover through investigation: observe Renn's movements, check old schematics, follow dust patterns | +| `location.smuggling_route` | KnowsDetails (operational) | None | Build from corridor discovery + manifest evidence + shift timing | +| `location.surveillance_gaps` | KnowsDetails (relies on them) | KnowsOf (knows coverage degrades in older sections) | Analytical lattice maps dead zones, correlates with operational timing | +| `contraband.severance_tech` | Suspects (knows about sealed containers) | None | Find Severance device residue at ventilation hub (late-game discovery) | + +### Perception Differences + +**Smuggler sees:** +- Infrastructure. A route they've walked dozens of times. The hatch is a door. The corridor is a commute. The alcove is a shelf. The junction room is where Renn stages cargo. The ventilation hub is where Devra talks business. +- Familiarity breeds efficiency. The smuggler navigates B-7 in near-darkness, counting footsteps to landmarks. They know which sections of grating creak, which stretches are silent, where the temperature drops near the ventilation junction. +- But also: tension. The corridor is where the operation is most physically exposed. If someone follows them here, there's no innocent explanation. + +**Detective sees:** +- A revelation. The first time the detective enters Corridor B-7, it should feel like the investigation cracking open. This is the physical proof that the district has a hidden layer — a space that doesn't appear on their station map overlay, where Meridian coverage drops to zero, where the architecture itself has been repurposed for concealment. +- Evidence: oiled hinges on a "forgotten" hatch. Clean patches on otherwise dusty floors. A dead drop alcove with recent scuff marks. An emergency light that's newer than everything else in the corridor. Every detail is a data point. +- The detective's analytical lattice flags the Meridian dead zone. Their overlay goes dark. For a character whose perception is mediated by institutional technology, the loss of overlay data is both disorienting and clarifying: they're seeing the space as it is, not as the institution tells them it is. + +### Monologue Triggers (Location-Specific) + +**On first entering Corridor B-7:** +- Smuggler: Routine acknowledgment, operational awareness, brief attention to whether anything's changed +- Detective: Discovery moment — urgent monologue chime, assessment of what this space means for the investigation + +**On finding the dead drop alcove:** +- Smuggler: Checks contents or notes its status (operational information) +- Detective: Evidence discovery — `location.corridor_b7_restricted` escalates to KnowsDetails + +**On reaching the ventilation hub:** +- Smuggler: Meeting space, checks for Devra's presence, notes the hum +- Detective: Notes the acoustic properties (ventilation masks conversation), flags as potential meeting point + +**On noticing dust patterns / clean floor sections:** +- Smuggler: (Would not trigger — this IS their routine, they created the patterns) +- Detective: Pattern recognition — someone has been here recently, repeatedly, and has attempted to conceal it + +**On losing Meridian coverage (overlay goes dark):** +- Smuggler: Normal (they expect it, use it) +- Detective: Disorienting, then revealing — the dead zone IS the evidence + +--- + +## Worldbuilding Notes + +The maintenance corridors embody a principle that runs through the entire setting: the most dangerous spaces aren't the ones designed for danger. They're the forgotten ones. Corridor B-7 wasn't built for smuggling. It was built for ventilation maintenance and then abandoned by institutional memory. The ring's genius — if that word applies to what is essentially pragmatic opportunism — is recognizing that the station's own architectural history provides better cover than anything they could construct. + +Let me complicate this by noting what the corridors mean for the game's moral architecture. The smuggler walks through B-7 with the comfort of routine. The detective enters B-7 as an investigator entering a crime scene. But the corridor is neither of those things inherently. It's a maintenance corridor. Its criminality is imposed by the people who use it and the institutions that made it necessary. If the Commission didn't price people out of lattice upgrades, Corridor B-7 would just be a corridor. + +The space between the walls is where the game's moral questions live. + +--- + +**Cross-References:** +- [Sova Transit District](../../world/sova-transit-district.md) — Parent district +- [The Terminal](the-terminal.md) — Connected via break room service hatch (south entry) +- [The Last Shift](the-last-shift.md) — Back room connects to ring infrastructure +- [NPC Index](../../npcs/index.md) — Full character roster +- [Severance Equipment](../../contraband/severance-equipment.md) — Used during Devra's meetings +- D-036: Sova Transit District as v0.1 setting +- D-037: Contraband specification (what moves through B-7) + +--- + +**Status:** Canonical — v0.1 smuggling infrastructure +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/locations/krenn-system/the-last-shift.md b/docs/wiki/locations/krenn-system/the-last-shift.md new file mode 100644 index 000000000..69bbe5e7d --- /dev/null +++ b/docs/wiki/locations/krenn-system/the-last-shift.md @@ -0,0 +1,201 @@ +# The Last Shift (Bar) + +**Type:** Location — Social Venue +**Status:** Canonical +**District:** [Sova Transit District](../../world/sova-transit-district.md) +**Station:** [Station Sova](../../world/station-sova.md) +**System:** [Krenn System](../../world/krenn-system.md) +**Level:** 2 (middle — worker amenities) +**Operating Hours:** 14:00-02:00 station time +**Informal Name:** "Lera's" (used by regulars) +**Owner:** [Lera Sessik](../../npcs/lera-sessik.md) +**Capacity:** ~30 + +--- + +## Overview + +The Last Shift is a mid-grade bar in Sova Transit District's Level 2 amenity strip. Not upscale, not a dive. The kind of place where working people go after shift because it's the only place worth going. Regulars call it "Lera's" after the owner, and the name on the hand-lettered sign outside — "Lera's — Cold Drinks, Hot Food, No Questions" — tells you everything about the establishment's operating philosophy. + +The bar is the district's social heart. Information flows through here faster than through the Meridian: who's working extra shifts, who's buying rounds they can't afford, who left early with someone they shouldn't have, who said something to the new Commission tech that they probably shouldn't have said. For the smuggler, it's the place to relax, maintain social cover, and read the room for threats. For the detective, it's an intelligence goldmine disguised as a working-class bar. + +--- + +## Physical Description + +**Structure:** The Last Shift occupies a converted maintenance staging area from an earlier construction era. The irregular layout is structural, not decorative — the booths were built into spaces that already existed, the bar counter follows the curve of a load-bearing wall, and the ceiling height varies from 2.5 meters in the main room to under 2 meters in the corner booth alcove. The conversion happened ~25 years ago when Lera's predecessor (a dock worker who retired into hospitality) saw an opportunity in the empty space. + +**Layout:** + +- **The Bar:** A long counter along the curved back wall, 8 stools. Lera's domain. She works the bar with Sess and has a sightline to most of the room from behind it. Bottles displayed on shelves — station-brewed spirits, imported beer (expensive, status purchase), and the synthetic staples that constitute 80% of sales. A Meridian music feed plays from a speaker nobody's ever changed — generic ambient that's become so familiar it functions as silence. + +- **The Floor:** Scattered tables, mismatched chairs (some bolted down, some not — the bolted ones near the door, since the first few months after opening taught Lera about drunk dock workers and loose furniture). Low tables for card games. The floor is original metal plating with a rubberized coating that absorbs sound — and spills. Lighting is warm amber from older fixtures that Lera has never replaced because the atmosphere they create is worth more than the energy savings of an upgrade. + +- **The Corner Booth:** A semi-private alcove created by the building's structural geometry — two walls converge, creating a natural pocket that seats 4-5. This is the most socially significant table in the district. Who uses the corner booth and when is information. Off-shift dock workers use it for card games. Devra uses it for business conversations that look like friendly drinks. The detective, once they identify the pattern, can observe the booth from the bar without appearing to watch. + +- **News Ticker:** A Meridian feed display mounted above the bar. Concord Assembly proceedings (boring — nobody watches), freight market prices (relevant — workers check these), weather alerts for Krenn Prime surface operations (practical), and occasionally a Commission public notice about regulatory compliance (everyone pretends not to notice). The news ticker is background texture that occasionally becomes plot-relevant: the same headline reads differently to the smuggler and the detective. + +- **The Back Room:** Through a door behind the bar marked "STAFF ONLY" (the sign is in Lera's handwriting). Officially a storage and supply room. The door leads to a small space with kegs, crates of supplies, and a secondary exit that connects to a maintenance corridor. Lera has "adopted" this corridor access — it's not on any lease, but nobody's contested it in 25 years. The ring uses the back room for handoffs: contraband arrives through the maintenance corridor, gets stored briefly among the supply crates, and is distributed through informal networks. Lera knows. Lera doesn't ask. + +- **The Threshold:** The door to the bar opens onto the Level 2 corridor that connects The Terminal (via a transition ramp from Level 1) to the residential pods. Everyone heading from work to home passes this point. The threshold is where off-shift workers decide: home, or one more? The decision is visible. NPCs who enter the bar are making a social choice. NPCs who walk past are making a different one. Both are information. + +--- + +## Atmosphere & Sensory Details + +**Sound:** +- Conversation murmur (the dominant sound — 15-20 voices at peak, falling to 3-4 late at night) +- Glass on surfaces (the clink and scrape of station-standard tumblers on metal table tops) +- Meridian music feed (ambient, unremarkable, occasionally someone asks Sess to change it, Sess never does) +- Span gate hum (quieter here on Level 2 than in The Terminal, but still present — a low vibration in the floor that you feel more than hear) +- Card game sounds (chips, tapping, the particular conversational rhythm of people who've been playing the same game for years) +- Late at night: the murmur dies down, the music becomes audible, individual conversations become distinguishable + +**Smell:** +- Cooking (protein paste dishes, reconstituted vegetables, synthetic spices — not gourmet, but warm and identifiable) +- Alcohol (station-brewed spirits have a sharp, slightly chemical edge; imported beer smells different, richer) +- Crowd scent (20 people in a converted maintenance area after an 8-hour shift — bodied, human, real) +- Underneath: the ever-present recycled air base note, faintly metallic + +**Lighting:** +- Warm amber from older fixtures. The lighting is The Last Shift's most distinctive atmospheric feature — after the harsh industrial white of The Terminal, stepping into Lera's feels like exhaling. The amber isn't designed; it's a consequence of aged fixtures that Lera has correctly identified as an asset. +- Corner booth: slightly dimmer (structural shadow from the converging walls). This is why the booth feels private — it's not screened off, just less illuminated. +- Behind the bar: brighter (Lera needs to see what she's pouring). The light behind the bar creates a slight backlight effect — Lera is always slightly in silhouette from the customers' perspective. She sees them better than they see her. +- Back room: Standard utility lighting (bright, unflattering — this is a storage space, not a social one). + +**Temperature:** +- Climate-controlled, comfortable — one of Lera's few deliberate investments. The bar is slightly warmer than the corridor outside, which makes the transition from work to drinks feel like arriving somewhere. +- Late at night with fewer bodies, it cools slightly. The regulars who stay past midnight notice. + +**Visual Texture:** +- The hand-lettered sign: "Lera's — Cold Drinks, Hot Food, No Questions" (exterior, the first thing anyone sees) +- Shift schedule board on the wall near the door (community service — workers check upcoming rotations here) +- Lost-and-found notices (hand-written, some months old, a small archaeology of forgotten jackets and misplaced data chips) +- A few personal touches from regulars: a carved wooden ship model on a shelf (Harek made it), a signed photograph of a freight crew from "the big delivery" (whatever that was, nobody new asks), stickers on the bolted-down chairs +- Wear patterns: the bar counter is smoothed and darkened where elbows rest. The corner booth table has rings from a thousand glasses. + +--- + +## NPC Presence + +### Primary NPCs (Regular Presence at The Last Shift) + +| NPC | Role | Typical Hours | Function | +|-----|------|---------------|----------| +| [Lera Sessik](../../npcs/lera-sessik.md) | Bar Owner | 13:30-02:00 (daily) | Social hub, observes everything, willful ignorance | +| [Sera Venn](../../npcs/sera-venn.md) | Commission Field Tech (THE FRIEND) | Evenings, irregular | Detective's social anchor, bar regular | +| [Hael](../../npcs/hael.md) | Teacher (Kael's partner) | Evenings, 2-3x/week | Worried, confides in Sera | +| [Sess](../../npcs/sess.md) | Bartender | 14:00-02:00 (shifts with Lera) | Flat, observant, discreet | +| [Olin](../../npcs/olin.md) | Drifter / New Arrival | Irregular, evenings | Ambiguous intent, asks questions | + +### Bridge NPCs (Present at The Last Shift + Other Sites) + +| NPC | Home Site | Bar Role | Bridge Function | +|-----|-----------|----------|-----------------| +| [Torek Lintar](../../npcs/torek-lintar.md) | The Last Shift / [The Terminal](the-terminal.md) | Regular, big spender | Spending beyond means — financial tell | +| [Harek](../../npcs/harek.md) | The Last Shift / [The Terminal](the-terminal.md) | Off-duty security, card games | Sees things in both contexts, holds debt leverage on Drin | +| [Maret Korr](../../npcs/maret-korr.md) | [The Terminal](the-terminal.md) | Occasional visitor | Worried, processes what she's seen at work | +| [Devra](../../npcs/devra.md) | Smuggling Ring | Corner booth meetings | Legitimate front conceals ring coordination | +| [Kael Davan](../../npcs/kael-davan.md) | [The Terminal](the-terminal.md) | After-shift regular | Ring member unwinding, partner Hael sometimes present | + +**Total NPC presence:** Up to 10 at peak (5 regulars + 5 bridge), minimum 2-3 (Lera, Sess, and a straggler) + +--- + +## Daily Rhythm + +**Pre-Opening (13:30-14:00)** +- Lera arrives, stocks up, checks supplies. Sess follows. The bar is empty. Quiet conversations between staff — the only time Lera drops her public persona. + +**Opening / Post-Morning-Shift (14:00-16:00)** +- The morning shift crowd arrives. The corridor between The Terminal and The Last Shift becomes a chokepoint. Workers come in pairs and small groups. First orders are routine — "the usual" for regulars, careful choices for the new detective trying to establish a presence. +- Mood: relieved, tired, social. This is when gossip flows most freely. "Did you see Voss's face when that manifest flagged?" The smuggler listens. The detective should. + +**Afternoon Lull (16:00-18:00)** +- The first wave leaves (home, errands, families). A quieter crowd remains: the ones who don't have somewhere to be, or who do but aren't going. Torek buys another round. Harek deals cards. +- Mood: settled, intimate. Conversations deepen. The corner booth fills with whoever has business. + +**Evening Peak (18:00-22:00)** +- Swing shift workers arrive. The bar fills. Both shifts overlap. This is the social peak — maximum information exchange, maximum observation opportunity. +- Card games run in the corner. Devra might appear for a "friendly drink" that involves a quiet conversation in the booth. Sera Venn drops in for an evening drink and might end up talking to Hael, who's worried about Kael's late nights. +- Mood: lively, loud enough for private conversations to go unheard. The smuggler's comfort zone. The detective's observation window. + +**Late Night (22:00-02:00)** +- The crowd thins. Night shift workers are gone. The late-night regulars are a different crowd: the ones who don't want to go home, the ones with something on their mind, the ones waiting for something. +- Lera starts cleaning. Conversations become audible again. The atmosphere shifts from social to confessional. +- Mood: quiet, vulnerable. If an NPC is going to say something they'll regret, it happens here. + +**Rest Days (Day 6-7 of cycle)** +- Day 6 morning: bar closed. Lera resupplies, does maintenance. +- Day 6 evening: opens late (16:00), lighter crowd. +- Day 5 (end-of-work-cycle): Highest attendance. Card tournament night. Social peak of the weekly cycle. The bar is packed, loud, and perfect cover for anything the ring needs to coordinate. + +--- + +## Mechanical Integration + +### Knowledge Graph Flags (FactIds) + +| FactId | Smuggler Starting Level | Detective Starting Level | How Detective Escalates | +|--------|------------------------|-------------------------|-------------------------| +| `relationship.trust_network` | KnowsDetails (knows everyone) | Suspects (observes social bonds) | Spend time here, build rapport, observe who talks to whom | +| `relationship.ring_membership` | KnowsDetails (knows who's in) | None initially | Observe Torek's spending, Devra's booth meetings | +| `contraband.supply_chain` | KnowsOf (knows general flow) | None initially | Connect bar observations to Terminal evidence | +| `relationship.faction_allegiance` | KnowsDetails (reads the room) | Suspects (knows some are Commission-aligned) | Observe NPC reactions to authority presence | + +### Perception Differences + +**Smuggler sees:** +- Sanctuary. The one place where work recedes and social life fills the space. Familiar faces, familiar orders, the warm amber light after a long shift. Lera's nod that means "everything's fine." Kael's laugh from the corner table. +- But also: Torek spending too much. Olin asking too many questions. The detective's presence as an intrusion into safe space. The bar as a social map that must be maintained. + +**Detective sees:** +- An intelligence environment. Every regular is a potential source. Every conversation is potential evidence. The corner booth is a surveillance target. Torek's spending is a financial tell. Lera's practiced indifference is a tell of its own. +- But also: the first place that feels human since arriving on Sova. The amber light is warm. Sera Venn is friendly. The detective's professional discipline fights their personal need for connection. The bar is where the detective is most vulnerable to becoming attached to the people they're investigating. + +### Monologue Triggers (Location-Specific) + +**On entering The Last Shift:** +- Smuggler: Social comfort, reads the room for who's present, brief relaxation +- Detective: Assessment mode, notes occupancy, identifies familiar faces from case file + +**On observing Torek buying rounds:** +- Smuggler: Concern (exposure risk — Torek's spending is visible) +- Detective: Financial anomaly flag (income doesn't match lifestyle) + +**On overhearing Hael confide in Sera:** +- Smuggler: Guilt (knows why Kael is absent, can't say) +- Detective: Potential lead (partner's worry suggests concealment behavior) + +**On the corner booth being occupied by Devra + unknown:** +- Smuggler: Operational awareness (ring business, stay clear) +- Detective: Surveillance target (who's meeting whom, lattice overlay tags the unknown) + +**On the news ticker showing Commission activity:** +- Smuggler: Relief if it's elsewhere, tension if it's local +- Detective: Jurisdictional context, watches NPC reactions to the headline + +--- + +## Worldbuilding Notes + +The Last Shift works because it's the only social venue in a 800-person district where everyone works physical jobs. That simplicity creates concentrated social dynamics: there's nowhere else to go, so everyone comes here, and everyone sees everyone else. The bar is a panopticon of social information — but unlike institutional surveillance, it runs on gossip, routine observation, and the accumulated pattern recognition of people who've been seeing each other every day for years. + +But what SUSTAINS The Last Shift as a gameplay space across hours of play is the dual function: it's simultaneously the smuggler's refuge and the detective's fishing ground. The same NPC interaction reads differently from each perspective. Lera's "no questions" policy protects the smuggler and frustrates the detective. Torek's generosity is loyalty from one angle and evidence from another. The bar doesn't change between playthroughs. The player does. + +--- + +**Cross-References:** +- [Sova Transit District](../../world/sova-transit-district.md) — Parent district +- [The Terminal](the-terminal.md) — Workers come from here +- [Maintenance Corridors](maintenance-corridors.md) — Back room connects to ring infrastructure +- [NPC Index](../../npcs/index.md) — Full character roster +- D-036: Sova Transit District as v0.1 setting +- D-028: Dialogue architecture (bar as primary social dialogue site) +- D-034: THE FRIEND (Sera Venn present at bar, detective's anchor) + +--- + +**Status:** Canonical — v0.1 social venue +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/locations/krenn-system/the-terminal.md b/docs/wiki/locations/krenn-system/the-terminal.md new file mode 100644 index 000000000..e7b581d47 --- /dev/null +++ b/docs/wiki/locations/krenn-system/the-terminal.md @@ -0,0 +1,191 @@ +# The Terminal (Logistics Hub) + +**Type:** Location — Workplace Social Site +**Status:** Canonical +**District:** [Sova Transit District](../../world/sova-transit-district.md) +**Station:** [Station Sova](../../world/station-sova.md) +**System:** [Krenn System](../../world/krenn-system.md) +**Level:** 1 (lowest) +**Operating Hours:** 24-hour, three 8-hour shifts +**Capacity:** ~60 workers per shift + +--- + +## Overview + +The Terminal is the economic heart of Sova Transit District — a freight logistics hub where cargo arrives through the span gate, gets sorted, inspected, manifested, and forwarded. It's the district's largest employer and the place where most of the 800 residents spend their working hours. It's also where the smuggling operation lives, hidden in the routine of legitimate work. + +The name is informal. Officially it's "Sova Transit Logistics Hub, Bay 7-C." Nobody calls it that. Workers call it The Terminal because that's what it is: the terminus of every shipment that passes through Krenn System's primary freight corridor. The name carries a blue-collar weariness — this is where things end up, including the people who work here. + +--- + +## Physical Description + +**Structure:** The Terminal occupies a large section of Level 1, built into the original freight bay from Station Sova's construction ~140 years ago. The core structure is industrial prefab — high ceilings (8 meters in the main bay), exposed structural ribs, reinforced flooring rated for heavy cargo. Successive retrofits have partitioned the space into functional zones without changing its fundamental character: a working bay where things get moved. + +**Layout Zones:** + +- **Main Bay Floor:** The largest open space in the district. Cargo containers stacked in rows, grav-lift lanes between them, manifest verification terminals along the walls. Bright industrial white lighting from overhead panels — functional, slightly harsh, the kind of light that makes everything look the same at 03:00 as at 15:00. The floor is scuffed metal plating with wear patterns that trace decades of foot traffic and grav-lift routes. + +- **Manifest Processing Area:** A row of terminals along the bay's east wall where workers verify cargo contents against Meridian-logged manifests. This is the bureaucratic chokepoint — every shipment passes through here. Screens display cargo IDs, weight/volume data, origin stamps, destination codes. The smuggling happens at these terminals: mismatched containers, doctored manifests, containers routed to scanner bays with known blind spots. + +- **Container Staging:** The physical workspace. Heavy containers moved by small grav-lifts — hum of anti-grav motors, clang of magnetic locks engaging, occasional shout over the machinery noise. Active during shift hours, quieter between shifts. Workers communicate in a mix of voice calls and short Meridian pings. + +- **Scanner Bays (3):** Automated cargo inspection stations. Bay 1 and 2 run full spectral scans. Bay 3 has a known calibration drift that produces less reliable results — this has been on the maintenance ticket for four months. The ring routes flagged containers through Bay 3 during shift transitions. + +- **Administrative Offices:** Glass-fronted offices overlooking the bay floor from a raised platform at the north end. Voss's domain. Shift schedules posted on the exterior glass, performance metrics on an internal display nobody reads. The offices have a direct sightline to the main bay floor — Voss can see who's working and who's not. But the offices can't see around the container stacks into the staging area. This sightline gap is load-bearing. + +- **Break Room / Lockers:** Through a reinforced door at the bay's south end. Lockers, a food prep area, a worn couch, a Meridian display showing news feeds. The social space within the workplace, where off-the-record conversations happen. A service hatch at the back of the locker area — originally for maintenance access to the ventilation system — connects to Corridor B-7. This is the physical link between the legitimate workspace and the smuggling infrastructure. + +- **Temporary Storage (Holding Area):** Behind the main bay, accessed through a cargo-width corridor. Containers awaiting processing or pickup sit here. Standard procedure: 4-6 hours maximum. Containers that sit longer trigger a flag. The ring's operational rhythm involves containers that sit 14-18 hours — long enough to be repackaged during a shift transition, short enough not to trigger automated alerts (which require 24 hours). + +--- + +## Atmosphere & Sensory Details + +**Sound:** +- Span gate hum (omnipresent bass vibration from the gate terminal at the bay's edge, pitch rises with transit volume) +- Grav-lift motors (a smooth electric whine, punctuated by the heavy clank of magnetic container locks) +- Manifest scanner pings (repetitive, rhythmic, the heartbeat of cargo processing) +- Conveyor systems (low continuous rumble during active shifts) +- Shouted instructions over machinery noise (workers calling bay numbers, container IDs, warnings) +- Between shifts: the hum drops, the machinery goes quiet, the ventilation system becomes audible + +**Smell:** +- Industrial lubricant (machine maintenance, strongest near grav-lift lanes) +- Recycled air (the base smell of everything on Sova — faintly metallic, unremarkable) +- Cargo scents from organic shipments (agricultural products, biological supplies — occasionally pungent) +- Ozone (faint, lingers near the span gate terminal after high-volume transit cycles) +- Break room: protein paste heating, synthetic coffee, the accumulated smell of a hundred lunches + +**Lighting:** +- Main bay: Bright industrial white panels, even coverage, no shadows in work areas. Slightly harsh — designed for visibility, not comfort. Workers squint when they first step in from the corridor. +- Administrative offices: Same white panels, tinted glass reducing glare slightly +- Break room: Warmer fixtures (older installation, never upgraded), slightly amber +- Temporary storage: Dimmer — reduced fixture density, pools of shadow between container rows +- Between containers in staging area: Shadows. The container stacks create corridors of their own with inconsistent lighting. This is where quick exchanges happen. + +**Temperature:** +- Slightly warm (machinery heat from grav-lifts and scanning equipment) +- Cooler near the span gate terminal (gate transit introduces brief cold drafts) +- Workers dress in standard-issue logistics coveralls, light layers underneath + +**Visual Texture:** +- Bilingual signage: safety warnings in Concordat Standard (institutional, clean) and Krenn vernacular (hand-lettered additions, corrections, complaints) +- Shift schedule boards: printed but annotated in marker +- Safety notices: mandatory, ignored, peeling at the corners +- Locker personalization: stickers, shift-end doodles, photographs, a hand-lettered "Days Since Last Accident: 47" counter +- Wear patterns: the floor tells the story of decades of traffic — polished paths between common routes, scuffed zones near the break room door, pristine metal in the rarely-used back corner of temporary storage + +--- + +## NPC Presence + +### Primary NPCs (Home Template: The Terminal) + +| NPC | Role | Shift | Function | +|-----|------|-------|----------| +| [Voss](../../npcs/voss.md) | Shift Supervisor | Morning (06:00-14:00) | Authority figure, manages schedules, sightline from office | +| [Kael Davan](../../npcs/kael-davan.md) | Dock Worker (THE FRIEND) | Morning (06:00-14:00) | Ring member, cargo handler, smuggler's closest colleague | +| [Maret Korr](../../npcs/maret-korr.md) | Freight Scheduler | Morning (06:00-14:00) | Processes manifests, notices discrepancies, hasn't reported | +| [Resha](../../npcs/resha.md) | New Hire Dock Worker | Morning (06:00-14:00) | Asks questions, hasn't learned to mind their business | +| [Drin](../../npcs/drin.md) | Maintenance Tech | Rotating | Fixes things, notices things, says nothing | + +### Bridge NPCs (Present at The Terminal + Other Sites) + +| NPC | Home Site | Terminal Role | Bridge Function | +|-----|-----------|---------------|-----------------| +| [Torek Lintar](../../npcs/torek-lintar.md) | [The Last Shift](the-last-shift.md) | Off-shift dock worker | Compromised inspector, looks away during inspection | +| [Renn](../../npcs/renn.md) | Smuggling Ring | Courier | Transfers cargo from bay to Corridor B-7 | +| [Harek](../../npcs/harek.md) | [The Last Shift](the-last-shift.md) | Off-duty security | Occasionally patrols, holds debt leverage on Drin | + +**Total NPC presence:** 8 (5 primary, 3 bridge) + +--- + +## Daily Rhythm + +**Morning Shift (06:00-14:00) — Highest Activity** +- 05:30-06:15: Shift transition. Handoff briefings at the admin office. Workers arriving, lockers opening, coffee queue in the break room. Night crew wrapping up. +- 06:00-08:00: Peak freight volume. Gate cycles every 4-6 minutes. The bay floor is active — grav-lifts moving, scanners pinging, manifest terminals occupied. Voss watches from the office. +- 08:00-12:00: Sustained operations. Routine sets in. Workers fall into their patterns. +- 12:00-13:00: Staggered breaks. Break room at half capacity, conversations about ventilation, yesterday's card game, complaints about scheduling. +- 13:30-14:15: Shift transition. The corridor between The Terminal and the bar district becomes a chokepoint as morning shift heads to The Last Shift. + +**Swing Shift (14:00-22:00) — Moderate Activity** +- Moderate freight volume. Gate cycles every 6-8 minutes. +- Fewer NPCs. Bridge NPCs are off at The Last Shift. Atmosphere quieter. +- 21:30-22:15: Shift transition. The window tightens. + +**Night Shift (22:00-06:00) — Lowest Activity / Smuggling Window** +- Skeleton crew. Gate cycles every 12-15 minutes. +- Reduced oversight. Voss is off-shift. Supervision is nominal. +- **Ring operational window:** Between 01:00-04:00, the bay is at minimum staffing. Renn moves containers from temporary storage through the break room service hatch to Corridor B-7. The entire operation takes 20 minutes if everything goes smoothly. Drin, if on night rotation, maintains equipment in the area and doesn't look up. + +--- + +## Mechanical Integration + +### Knowledge Graph Flags (FactIds) + +| FactId | Smuggler Starting Level | Detective Starting Level | How Detective Escalates | +|--------|------------------------|-------------------------|-------------------------| +| `location.sova_transit_layout` | KnowsDetails (lives here) | KnowsOf (has station map) | Explore, observe worker routes | +| `contraband.ring_exists` | KnowsDetails (member) | Suspects (case briefing) | Observe manifest discrepancies, NPC behavior | +| `investigation.manifest_discrepancy` | KnowsDetails (knows the system) | Suspects (analytical lattice flags) | Compare manifests, interrogate Maret | +| `investigation.shift_mismatch` | KnowsDetails (knows Voss's schedule) | Suspects (pattern analysis) | Observe night shift staffing, correlate with arrivals | +| `location.dead_drop_location` | KnowsDetails (uses Locker 47) | None (must discover) | Observe Kael's break room behavior | + +### Perception Differences + +**Smuggler sees:** +- Home. The familiar rhythm of a workspace they've occupied for years. Container stacks they know by heart. The manifest terminal where they doctored their first shipment. The break room where Kael told them about the arrangement. +- Risk assessment through social intelligence: who's on shift, who's in the office, whether Voss seems distracted, whether Resha is asking too many questions again. +- The service hatch as a door they walk through. Routine. + +**Detective sees:** +- A crime scene that doesn't know it's a crime scene yet. Orderly operations that mask systematic fraud. A supervisor's office with a sightline gap they note on their lattice overlay. A scanner bay with a calibration drift that shows up in the maintenance logs they've pulled. +- Pattern analysis through institutional tools: manifest discrepancies flagged by analytical lattice, shift schedules that don't match freight volume, a container that's been in temporary storage for 14 hours. +- The service hatch as something that doesn't appear on the official schematics. A gap. + +### Monologue Triggers (Location-Specific) + +**On entering The Terminal:** +- Smuggler: Familiarity, routine assessment, awareness of operational state +- Detective: Institutional assessment, observation of workflow, first pattern recognition + +**On observing Scanner Bay 3:** +- Smuggler: Practical awareness (knows the calibration drift, uses it) +- Detective: Analytical flag (maintenance records show repeated deferrals) + +**On entering the Break Room:** +- Smuggler: Social space, reads the room for mood +- Detective: Notes the service hatch, files it for later + +**On discovering Temporary Storage anomaly (container sitting 14+ hours):** +- Smuggler: Knows what it means, assesses risk +- Detective: First concrete evidence — `investigation.cargo_anomaly` escalates from Suspects to KnowsOf + +--- + +## Worldbuilding Notes + +The Terminal is designed to feel like a real workplace — the kind of place where monotony breeds familiarity and familiarity breeds vulnerability. The smuggling operation doesn't require elaborate infrastructure. It requires an understanding of how a logistics hub actually functions: which scanner has a calibration issue, when the shift transitions create gaps, where the sightlines end and the shadows begin. + +The honest truth is that every workplace has these vulnerabilities. What makes The Terminal interesting is that both the smuggler and the detective know this — the smuggler because they exploit it daily, the detective because they're trained to find it. They're reading the same room with different alphabets. + +--- + +**Cross-References:** +- [Sova Transit District](../../world/sova-transit-district.md) — Parent district +- [Maintenance Corridors](maintenance-corridors.md) — Connected via break room service hatch +- [The Last Shift](the-last-shift.md) — Where workers go after shift +- [NPC Index](../../npcs/index.md) — Full character roster +- D-036: Sova Transit District as v0.1 setting +- D-027: Vertical slice definition + +--- + +**Status:** Canonical — v0.1 workplace social site +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/npcs/devra.md b/docs/wiki/npcs/devra.md new file mode 100644 index 000000000..3a8427779 --- /dev/null +++ b/docs/wiki/npcs/devra.md @@ -0,0 +1,119 @@ +# Devra + +**Tier 2 NPC** | Smuggling Ring + The Last Shift (Bar) | Entangled + +--- + +## Core Identity + +**Name**: Devra +**Age**: 38 +**Role**: Ring coordinator (manages external contacts, logistics planning); publicly, a freelance supply broker with a regular seat at The Last Shift +**System Origin**: Krenn System, born off-station (Orbital Manufacturing Platform 3), relocated to Sova 5 years ago +**Lattice Tier**: Standard professional (commercial-grade communication and logistics tools) +**Employer**: Self-employed (supply brokering — legitimate cover); The Arrangement (ring coordination, operational) + +--- + +## 10-Axis Profile + +### 1. Want + +**Primary**: Keep the operation running smoothly and profitably. + +Devra is the ring's operational brain. She manages the external supply chain — coordinating with Sabel (off-station contact) for incoming shipments, scheduling handoffs, managing the timeline between gate transits and dock processing. She's good at this. Better than Nils, frankly, though she'd never say it. + +**Secondary**: Maintain her legitimate cover. + +The supply brokering business isn't just cover — it's real income and real social capital. Devra brokers small freight contracts for independent operators. This gives her a legitimate reason to know shipping schedules, gate transit windows, and cargo volumes. The line between her legal and illegal work is intentionally blurred. + +### 2. Secret / Vulnerability + +**Surface secret**: The supply brokering business is partly a cover for ring logistics. Visible to anyone who tracks how much time Devra spends on freight details that don't match her client list. + +**Deep secret**: Devra manages the relationship with Sabel, the off-station supplier. If the chain is traced upstream, it runs through Devra. She's more exposed than anyone except Nils. + +**Vulnerability**: The external contact chain. Devra is the single point of failure between the local ring and the supply source. If Sabel is compromised, Devra is the next link. If the detective traces cargo origins, Devra's brokering records are the thread to pull. + +### 3. Relationships + +**Nils Davan** (off-stage): Ring coordinator (strategic). Devra handles operations; Nils handles personnel and security. They respect each other's competence but disagree on risk tolerance — Devra favors steady volume, Nils pushes for escalation. + +**Sabel** (off-station, Tier 3): External supplier. Devra's primary off-station contact. Professional, efficient, no personal warmth. Sabel delivers; Devra pays. The relationship is transactional. + +**Lera Sessik**: The bar is Devra's social stage. She drinks there, brokers small deals publicly, maintains the image of a working professional. Lera knows Devra uses the back room but doesn't know for what. + +### 4. Tolerance Threshold + +**High**. Devra is calm under pressure, thinks operationally, and doesn't panic. What breaks her tolerance: Pell's wavering (internal security threat), unexpected Commission presence (the detective's arrival is exactly the kind of disruption Devra planned to avoid), and Nils pushing volume too fast. + +### 5. Daily Routine + +**08:00 - 12:00**: Supply brokering work (lattice calls, contract negotiation, legitimate business) +**12:00 - 14:00**: Lunch, sometimes at the hub (maintaining visibility near freight operations) +**14:00 - 17:00**: Bar (The Last Shift) — social presence, quiet coordination +**17:00 - 19:00**: Back room meetings (1-2x per week, ring business) +**19:00+**: Home or continued brokering +**Night operations**: Coordinates gate transit timing with Sabel during off-peak windows (lattice communication from home) + +### 6. Information Inventory + +**Knows**: Ring structure (all operational details), supply chain from Sabel through dock to distribution, which containers are flagged, gate transit schedules, who in the ring is reliable and who isn't. Knows Pell is wavering (Renn reported suspicions to Nils, who told Devra). Knows Kael handles dock-side operations efficiently. + +**Doesn't know**: Kael's exit attempt (Kael concealed this from everyone in the ring), Sera's compliance check, the detective's investigation details, Maret's growing suspicion about manifests. + +### 7. Contentment + +**Moderate-high**. Devra is competent and knows it. The operation runs well. The money is good. The brokering cover is solid. Her contentment would drop sharply if the operation were threatened — not because she loves the work, but because she's built her entire life in the district around it. + +### 8. Personality Traits + +**Primary: Strategic** — thinks in logistics, plans contingencies, manages complexity. +**Secondary: Controlled** — doesn't show stress, maintains composure, presents a professional face. +**Tertiary: Ambitious** — wants the operation to grow (at a sustainable pace), not just survive. + +### 9. Tell System + +| Tell | Trigger | Observable To | +|------|---------|---------------| +| **Increased lattice activity** | Coordinating with Sabel about incoming shipment timing | Smuggler (if ring member, recognizes the pattern), Detective (if tracking lattice traffic) | +| **Back room usage** | Ring coordination meetings — Devra enters, door closes, 30-60 minutes | Lera (knows the door is closed), Sess (observes from behind the bar), Detective (if tracking movement patterns in the bar) | +| **Professional demeanor shift** | When discussing ring business, Devra's casual bar persona drops — sentences get shorter, eye contact increases | Smuggler (recognizes the operational mode), anyone paying close attention | + +### 10. Skill Set + +**Occupational**: Supply chain logistics, contract negotiation, freight brokering, commercial communication. +**Ring-relevant**: External coordination, timing management, operational planning, information compartmentalization. +**Combat tag**: **No**. Devra is not physical. If threatened, she leverages connections and information, not force. +**Lattice capability**: Standard professional (commercial-grade, not military or investigative). + +--- + +## Voice Sample + +**Mood: Professional (public bar persona)** +- *"I've got a freight contract clearing through Gate 2 next cycle. Standard components. Nothing exciting, but it pays the rent."* + +**Mood: Operational (ring coordination)** +- *"The window is tight. Sabel confirms transit for the 22:00 cycle. Renn handles pickup. Nobody else needs to be involved."* + +**Mood: Concerned (about Pell)** +- *"Pell's been quiet. Too quiet. When someone stops complaining, that's when I worry."* + +--- + +## Dual-Lens Notes + +**Smuggler**: Devra is the operational heart of the ring. The smuggler respects her competence and relies on her coordination. If the smuggler is a ring member, Devra is the colleague who keeps things running. *"Devra's got the next shipment scheduled. She's reliable — more reliable than Nils, honestly."* + +**Detective**: Devra is a freelance supply broker who spends a lot of time at the bar and knows freight schedules in unusual detail. The detective initially reads her as a local businesswoman. Only deeper investigation reveals the brokering is partly cover. *"Freelance broker. Devra, no family name offered. Knows freight schedules better than most hub workers. Interesting."* + +--- + +## Triangle Roles + +**Not a formal v0.1 triangle member.** Devra's role is connective — she links the ring's internal operations to the external supply chain. She's referenced in multiple triangles without being a node in one. Her significance is operational, not interpersonal. + +--- + +**Cross-References:** [Renn](renn.md), [Pell](pell.md), [Lera Sessik](lera-sessik.md), [Sabel](sabel.md) diff --git a/docs/wiki/npcs/drin.md b/docs/wiki/npcs/drin.md new file mode 100644 index 000000000..db4cdb658 --- /dev/null +++ b/docs/wiki/npcs/drin.md @@ -0,0 +1,48 @@ +# Drin + +**Tier 3 NPC** | Logistics Hub (The Terminal) | Flat + +--- + +## Essential Axes + +### Want + +Stay out of trouble. Pay off the debt. Get through the shift. + +Drin is a maintenance tech who also handles dock inspections. He's competent at both. The problem is the gambling debt to Harek — a significant sum from the bar card games that Drin can't repay on his salary. The debt doesn't require Drin to do anything explicitly illegal. It just means Drin is slow during inspections of certain containers. He doesn't open them. He doesn't look hard. The ring has noticed this pattern and relies on it. Drin is compromised by omission, not commission. + +### Routine + +**06:00 - 14:00**: Day shift — maintenance rounds and scheduled dock inspections +**10:30**: Break room, avoids Harek if present +**14:00 - 16:00**: Post-shift — home or bar (card game nights, 2x per week) +**Night**: Home, worrying about the debt + +### Personality + +**Quiet, methodical, avoidant.** Drin fixes things. Pipes, wiring, environmental systems, loading equipment. He's good with objects and bad with people. The gambling started as social bonding (card games at the bar) and became a trap. Drin doesn't talk about the debt, doesn't talk about the inspections, doesn't talk much at all. His silence is both personality and survival strategy. + +--- + +## Voice Hint + +*"I just do maintenance. Inspections are part of the schedule. I run them by the book."* [Flat delivery, eye contact avoided] + +--- + +## Function Note + +Drin exists as the **compromised institutional node** in Triangle 2 (Worried Knowledge). Maret notices his clean inspection reports. Voss needs him functional. Harek holds the leverage. Pell (in Triangle 5) might approach Drin as an institutional contact — not knowing Drin is already under the ring's indirect control. Drin is the person where the legitimate system and the criminal system overlap, and neither works properly because of it. + +--- + +## Dual-Lens Notes + +**Smuggler**: Drin is a tool — compromised and reliable because of it. *"Drin's on inspection today. We're good."* + +**Detective**: Drin is a data point — his inspection reports are too clean for the volume. *"The inspector — Drin. Maintenance tech pulling double duty. Reports are spotless. Nobody's reports are that spotless."* + +--- + +**Cross-References:** [Harek](harek.md), [Maret Korr](maret-korr.md), [Voss](voss.md), [Pell](pell.md) diff --git a/docs/wiki/npcs/hael.md b/docs/wiki/npcs/hael.md new file mode 100644 index 000000000..2ea5c6dd3 --- /dev/null +++ b/docs/wiki/npcs/hael.md @@ -0,0 +1,117 @@ +# Hael + +**Tier 2 NPC** | The Last Shift (Bar) | Mundane + +--- + +## Core Identity + +**Name**: Hael +**Age**: 33 +**Role**: Teacher, Station Sova community school (Residential Radial A) +**System Origin**: Krenn System, Krenn Prime (surface), relocated to Station Sova 8 years ago +**Lattice Tier**: Baseline +**Employer**: Sova Station Education Services + +--- + +## 10-Axis Profile + +### 1. Want + +**Primary**: Understand what's happening with Kael. + +Hael and Kael have been together 6 years. It was good — stable, warm, predictable. Then Kael started coming home late. Evasive answers. Money that didn't match the hours. Stress that Kael won't explain. Hael doesn't know about the ring. Hael knows that the person they share a life with is hiding something, and the not-knowing is worse than almost any truth. + +**Secondary**: Protect the life they've built. + +Hael teaches station kids. Has a community, a reputation, a daily rhythm. Whatever Kael is hiding, Hael wants it resolved without destroying everything — the home, the relationship, the stability that took years to build. This is why Hael confides in Sera instead of confronting Kael directly: Hael wants advice, not a fight. + +### 2. Secret / Vulnerability + +**Surface secret**: Worried about Kael. Visible to anyone who sees Hael's stress — Sera, bar regulars, anyone paying attention. + +**Deep secret**: Hael confided in Sera about Kael's behavior. This is the action that set Sera's compliance check in motion, though Hael doesn't know that. Hael shared a personal worry with a trusted friend. That trusted friend had institutional access. + +**Vulnerability**: Emotional exposure. Hael's worry is genuine, visible, and exploitable. The detective can cultivate Hael as a source by being sympathetic. The smuggler (if Kael's friend) feels guilt seeing Hael's distress. Hael is the emotional center of Triangle 4 — the person everyone wants to protect and nobody can protect without making it worse. + +### 3. Relationships + +**Kael Davan**: Partner, 6 years. Deep love, growing anxiety. Hael doesn't question Kael's character — just Kael's honesty. The relationship is the strongest bond in Hael's life and the source of the greatest stress. + +**Sera Venn**: Close friend, 10 months. Met at the bar after Sera transferred. Genuine friendship — Sera is smart, calm, from outside the district's close-knit social web. Hael trusts Sera as someone who can give perspective without gossip. + +**Lera Sessik**: Bar acquaintance. Hael isn't a heavy drinker but comes to The Last Shift for the social environment. Lera is warm to Hael — the kind of protective attention a good bartender gives to someone who's visibly struggling. + +### 4. Tolerance Threshold + +**Moderate**. Hael is patient — teaching station kids requires it. But the patience is fraying. Every evasive answer from Kael, every late night, every "it's just work" chips at Hael's tolerance. If pushed to a breaking point, Hael confronts Kael directly — which could trigger Kael's crisis, force Sera's hand, or give the detective an opening. + +### 5. Daily Routine + +**07:00 - 15:00**: Teaching (community school, Residential Radial A — tram to Transit District) +**15:00 - 15:30**: Commute back to Transit District +**15:30 - 17:30**: Bar (The Last Shift) — meets Sera, social time, decompresses +**17:30 - 22:00**: Home. Waits for Kael. Sometimes Kael is there, sometimes not. +**Late evenings**: Alone in the apartment, wondering where Kael is. + +### 6. Information Inventory + +**Knows**: Kael's normal routine (6 years of partnership). Kael's recent deviations (late nights, evasive answers, unexplained stress). Sera's Commission role (knows Sera is a tech, not an investigator). Bar social dynamics from Sera's descriptions. The school community, kids' families, education bureaucracy. + +**Doesn't know**: Ring, smuggling, Kael's membership, manifest discrepancies, Sera's compliance check, the detective's investigation. Hael lives in the civilian layer of the district where none of this is visible — until it becomes personal. + +### 7. Contentment + +**Low** — and declining. Hael was content: stable job, loving partner, community. Now the relationship anxiety is coloring everything. Teaching is harder when you're distracted. The bar visits are tinged with worry. Home is where the absence lives. Hael's contentment trajectory mirrors Kael's — both declining, for connected but different reasons. + +### 8. Personality Traits + +**Primary: Caring** — genuinely invested in other people's wellbeing (students, Kael, Sera). +**Secondary: Patient** — tolerates uncertainty longer than most, but not indefinitely. +**Tertiary: Perceptive** — reads emotional states well. Knows when Kael is lying even if Hael can't prove it. + +### 9. Tell System + +| Tell | Trigger | Observable To | +|------|---------|---------------| +| **Visible stress** | Tired eyes, distracted conversation, checking lattice for messages from Kael | Sera, Lera, Detective (if visiting the bar), bar regulars | +| **Mentions Kael unprompted** | Worry overflowing into conversation — "Kael was late again" or "I don't know what's going on at the hub" | Sera (primary recipient), Detective (if sitting nearby or in conversation) | +| **Increased bar presence** | Coming to the bar more often and staying longer — avoiding the empty apartment | Lera (notices the pattern), Sera (recognizes the coping mechanism) | + +### 10. Skill Set + +**Occupational**: Teaching, community engagement, youth education, curriculum management. +**Combat tag**: **No**. Hael is entirely civilian. +**Lattice capability**: Baseline. + +--- + +## Voice Sample + +**Mood: Worried (to Sera)** +- *"Kael was home at midnight again. Said it was overtime. There's no overtime posted for this week — I checked. Sera, what do I do?"* + +**Mood: Warm (baseline social)** +- *"The kids are doing better with the new math curriculum. Kael helped me set up the practice modules last month — back when Kael had time for things like that."* + +**Mood: Brittle (close to breaking point)** +- *"I'm not asking for much. Just — tell me the truth. Whatever it is. I can handle it. I can't handle not knowing."* + +--- + +## Dual-Lens Notes + +**Smuggler**: Hael is emotional collateral. The smuggler knows why Kael is busy and can't say. Seeing Hael's worry creates guilt — especially if the smuggler is Kael's friend. If Hael asks the smuggler about Kael, there's no good answer. *"Hael's at the bar again. Alone. Looking at the door every time it opens. I know where Kael is. I can't say."* + +**Detective**: Hael is a potential source. A partner who suspects their loved one is hiding something is a classic entry point for investigation. The detective can cultivate Hael's trust by being sympathetic — listen, validate, gently probe. Hael might not know specifics, but Hael knows Kael's routine, habits, and recent changes better than anyone. *"The partner — Hael. Teacher. Visibly stressed. Keeps looking at the door. If Davan is involved, this partner knows something changed, even if they don't know what."* + +--- + +## Triangle Roles + +**Triangle 4: Worried Partner (Hael - Kael - Sera)** — The emotional center. Hael's worry about Kael triggered Sera's investigation. Hael's trust in Sera makes Sera's concealment more painful. Hael connects the detective's investigation to Kael's personal life — through Sera, through Hael's own observations, through the simple fact that a worried partner is the best witness to behavioral change. + +--- + +**Cross-References:** [Kael Davan](kael-davan.md), [Sera Venn](sera-venn.md), [Lera Sessik](lera-sessik.md) diff --git a/docs/wiki/npcs/harek.md b/docs/wiki/npcs/harek.md new file mode 100644 index 000000000..2ed275317 --- /dev/null +++ b/docs/wiki/npcs/harek.md @@ -0,0 +1,113 @@ +# Harek + +**Tier 2 NPC** | The Last Shift (Bar) + Logistics Hub | Mundane + +--- + +## Core Identity + +**Name**: Harek +**Age**: 44 +**Role**: Station Security officer (off-duty at bar, on-duty at hub perimeter) +**System Origin**: Krenn System, Station Sova +**Lattice Tier**: Standard security (patrol monitoring, incident reporting) +**Employer**: Sova Station Security + +--- + +## 10-Axis Profile + +### 1. Want + +**Primary**: Maintain his comfortable position. + +Harek has a good thing: security officer with a predictable schedule, card games at the bar after shift, and enough social capital to be respected without being scrutinized. He doesn't want promotions (more responsibility, more visibility). He doesn't want trouble. He wants the steady, predictable life of a man who knows exactly how much effort each day requires. + +**Secondary**: Keep Drin's debt leverageable. + +Drin owes Harek money from card games — a significant sum that Drin can't easily repay. Harek doesn't press the debt aggressively; he keeps it active. A security officer with a dock inspector who owes him favors is useful. Harek hasn't explicitly traded the debt for inspection negligence, but the debt's existence creates a power dynamic that the ring has noticed and exploited. + +### 2. Secret / Vulnerability + +**Surface secret**: Holds Drin's gambling debt. Known to bar regulars. Nobody thinks much of it — people owe each other money on Sova. + +**Deep secret**: Harek knows (or suspects) that Drin's inspection negligence is being leveraged by someone else. He sees the dynamic: Drin owes him, Drin looks away during inspections, the ring benefits. Harek hasn't connected all the dots, but he understands that his card game created a tool that others are using. + +**Vulnerability**: Complicity by inaction. Harek hasn't done anything illegal. But a security officer who notices a dock inspector being leveraged and doesn't report it is, at minimum, negligent. If investigated, Harek's position crumbles. + +### 3. Relationships + +**Drin**: Card game partner, debtor. Harek likes Drin personally — they've played cards for years. The debt complicates this, but Harek doesn't see himself as a predator. He sees a friend who's bad at cards and bad at saying no. + +**Lera Sessik**: Bar owner. Professional familiarity. Harek's card games bring customers. Lera facilitates. Mutually beneficial. + +**Torek Lintar**: Card game regular. Harek has noticed Torek's spending but doesn't flag it — Torek's money at the card table is Harek's entertainment. + +### 4. Tolerance Threshold + +**Moderate-high**. Harek is comfortable and complacent. He tolerates a lot because engagement is effort. What breaks his tolerance: direct institutional pressure (Commission or Security command asking about Drin), or violence (Harek takes safety seriously even if he's loose on contraband). + +### 5. Daily Routine + +**06:00 - 14:00**: Security patrol — hub perimeter and freight bay access points (day shift) +**14:00 - 14:30**: Shift transition +**14:30 - 20:00**: Bar (The Last Shift) — drinks, card games (2-3 times per week) +**20:00+**: Home + +### 6. Information Inventory + +**Knows**: Security patrol routes, hub access protocols, freight bay entry logs, which areas have Meridian coverage and which don't. Drin's debt and behavioral changes. Torek's spending. Bar social dynamics. + +**Doesn't know**: Ring structure, specific smuggling operations, manifest details, Kael's exit attempt, Sera's compliance check. Harek knows something is going on at the hub — he's a security officer, he's not blind — but he's chosen not to investigate because investigating would mean confronting what Drin's debt has become. + +### 7. Contentment + +**Moderate-high**. Harek is the quintessential "comfortable enough not to rock the boat." He has a stable job, social standing, entertainment, and just enough willful ignorance to keep his conscience manageable. + +### 8. Personality Traits + +**Primary: Complacent** — takes the path of least resistance. +**Secondary: Sociable** — enjoys the card games, the bar crowd, the community. +**Tertiary: Perceptive** — sees more than he admits. His training doesn't turn off, even when his ethics do. + +### 9. Tell System + +| Tell | Trigger | Observable To | +|------|---------|---------------| +| **Watches Drin more carefully** | When Drin is stressed or evasive — Harek monitors his investment | Detective (if tracking the Harek-Drin dynamic), bar regulars | +| **Steers conversation away from security topics** | When someone (especially the detective) asks about hub access or patrol gaps | Detective (classic deflection tell) | +| **Card game invitation** | Harek invites people to play cards — this is social intelligence gathering wrapped in entertainment | Detective (if they recognize the information exchange happening at the table) | + +### 10. Skill Set + +**Occupational**: Security patrol, access control, incident response, observation training. +**Combat tag**: **Yes** (basic). Station security training — non-lethal restraint, de-escalation, emergency response. Not tactical. +**Lattice capability**: Standard security (patrol monitoring, incident reporting, basic surveillance access). + +--- + +## Voice Sample + +**Mood: Sociable (baseline)** +- *"Cards tonight? I've got a good feeling. Drin — you in? Don't worry about the tab, I'll cover your first round."* + +**Mood: Deflective (security questions)** +- *"Hub security's solid. We run standard patrols, standard protocols. Nothing unusual. You want specifics, talk to my supervisor — I just walk the route."* + +--- + +## Dual-Lens Notes + +**Smuggler**: Harek is a known quantity — off-duty security who doesn't look too hard. The smuggler reads Harek's card games as harmless social activity and his complacency as a feature, not a bug. *"Harek's at the bar. Security badge off, drink in hand. As long as he stays that way, we're fine."* + +**Detective**: Harek is a security officer who socializes with the people he's supposed to monitor. His card games create financial relationships that could be leverage vectors. His patrol routes create knowledge of hub access patterns. Harek is either an asset (could be turned to provide patrol gap data) or a problem (if he's actively complicit). *"Station Security — Harek. Off-duty, but the training doesn't turn off. He sees the same things I'd see. The question is what he does with it."* + +--- + +## Triangle Roles + +**Triangle 2: Worried Knowledge (Maret - Drin - Voss)** — Harek is not a triangle member but is the external pressure on Drin. Harek's debt creates the vulnerability that the ring exploits. He's the unseen fourth wall of Triangle 2. + +--- + +**Cross-References:** [Drin](drin.md), [Lera Sessik](lera-sessik.md), [Torek Lintar](torek-lintar.md), [Voss](voss.md) diff --git a/docs/wiki/npcs/index.md b/docs/wiki/npcs/index.md new file mode 100644 index 000000000..65549cd15 --- /dev/null +++ b/docs/wiki/npcs/index.md @@ -0,0 +1,268 @@ +# NPC Roster — Sova Transit District + +17 NPCs across 3 social sites (Logistics Hub, The Last Shift, Smuggling Ring). Tier 1 = full production depth (THE FRIEND), Tier 2 = working profile, Tier 3 = sketch. + +## Roster Table + +| # | Name | Role | Social Site | Tier | Entanglement | Triangles | +|---|------|------|-------------|------|--------------|-----------| +| 1 | **Kael Davan** | Dock Worker | Hub + Ring | **Tier 1 (FRIEND)** | Entangled | Hub Power, Worried Partner | +| 2 | **Sera Venn** | Commission Field Tech | Bar | **Tier 1 (FRIEND)** | Mundane | Worried Partner | +| 3 | Voss | Shift Supervisor | Hub | Tier 2 | Mundane | Hub Power, Worried Knowledge | +| 4 | Lera Sessik | Bar Owner | Bar | Tier 2 | Mundane | Bar Tensions | +| 5 | Torek Lintar | Dock Worker / Bar Regular | Bar + Hub | Tier 2 | Mundane | Bar Tensions | +| 6 | Devra | Ring Coordinator | Ring + Bar | Tier 2 | Entangled | (Referenced, not triangle member in v0.1) | +| 7 | Maret Korr | Freight Scheduler | Hub | Tier 2 | Mundane | Worried Knowledge | +| 8 | Resha | New Hire Dock Worker | Hub | Tier 2 | Mundane | (Background tension, not formal triangle) | +| 9 | Hael | Teacher (Kael's Partner) | Bar | Tier 2 | Mundane | Worried Partner | +| 10 | Drin | Maintenance Tech | Hub | Tier 3 | Flat | Worried Knowledge, Informant Question | +| 11 | Sess | Bartender | Bar | Tier 3 | Flat | None | +| 12 | Olin | Drifter / New Arrival | Bar | Tier 3 | Flat | Bar Tensions | +| 13 | Renn | Courier | Ring + Hub | Tier 2 | Entangled | Informant Question | +| 14 | Pell | Wavering Ring Member | Ring | Tier 2 | Entangled | Informant Question | +| 15 | Harek | Off-Duty Security | Bar + Hub | Tier 2 | Mundane | None (external pressure on Triangle 2) | +| 16 | Sabel | Off-Station Fence | Ring (off-station) | Tier 3 | Flat | None (off-station) | +| 17 | Tav | Lookout | Ring + Hub | Tier 3 | Flat | None | + +**Entanglement breakdown**: +- **Tier 1 (THE FRIEND)**: 2 NPCs (Kael, Sera) — 1 entangled, 1 mundane +- **Tier 2**: 10 NPCs — 3 entangled (Devra, Renn, Pell), 7 mundane +- **Tier 3**: 5 NPCs (Drin, Sess, Olin, Sabel, Tav) — all flat + +**Total**: 4 entangled (24%), 8 mundane (47%), 5 flat (29%). Closer to D-029 entanglement target (20%) with Tier 3 additions. + +--- + +## Triangle Diagrams + +### Triangle 1: Hub Power (Voss - Kael - Nils) + +``` + Voss (Shift Supervisor) + / \ + resents being takes cut, + managed by smooths inspections + subordinate | + / | + / | + Kael (Dock Worker) <--blood loyalty--> Nils (Ring Coordinator, off-stage) + handles cargo, + uncomfortable with + escalation +``` + +**Tension**: Voss has positional authority but takes orders from Nils (via intermediaries). Kael is caught between shift supervisor (Voss) and ring coordinator (Nils, Kael's older sibling). Nils pushes for higher volume; Voss wants stability; Kael wants everyone to calm down. + +**Player relevance**: +- **Smuggler**: Navigates this daily. Knows the resentments, smooths tensions. +- **Detective**: Sees Voss's anxiety, doesn't know why. Kael is efficient, unremarkable. Doesn't know Nils exists initially. + +--- + +### Triangle 2: Worried Knowledge (Maret - Drin - Voss) + +``` + Maret (Freight Scheduler) + / \ + notices processes manifests, + manifest sees discrepancies, + discrepancies hasn't reported + | | + | | + Voss (Shift Supervisor) <--needs both quiet--> Drin (Dock Inspector) + maintains schedule gambling debt, + that creates windows compromised by Harek +``` + +**Tension**: Maret is smart and worried. She's not in the ring — she just sees the numbers don't add up. Drin has been compromised (debt to Harek) into looking away during inspections. Voss needs both of them functional and silent. Maret suspects but doesn't know whom to tell. Drin might crack under pressure. + +**Player relevance**: +- **Smuggler**: Knows Maret is a risk (observant). Knows Drin is a tool (compromised). Must manage both. +- **Detective**: Maret is a potential cooperative witness. Drin is a potential turned asset. Both paths lead toward the operation. + +--- + +### Triangle 3: Bar Tensions (Lera - Torek - Olin) + +``` + Lera (Bar Owner) + / \ + protective of tolerates because + regulars, worried spending = business + about attention | + | | + | | + Torek (Regular) <--asks questions--> Olin (Drifter) + spending beyond new in district, + means, visible ambiguous intent +``` + +**Tension**: Torek has been spending visibly beyond a standard dock worker's income (new jacket, buying rounds, lattice accessories). Lera is protective but profit-driven — Torek's spending keeps the bar viable. Olin (new arrival) asks questions that could be innocent job-seeking or something else. Is Olin competition? An informant? Just looking for work? + +**Player relevance**: +- **Smuggler**: Torek's spending is a liability (exposure risk). Olin is an unknown variable (threat assessment). Lera is an ally who needs managing. +- **Detective**: Torek's spending is a financial tell. Olin is a potential fresh source. Lera is the social hub who sees everything. + +**Note**: Mundane triangle with *potential* entanglement. Torek's money could be from the ring, or a side hustle, or an inheritance. The ambiguity is load-bearing. + +--- + +### Triangle 4: The Worried Partner (Hael - Kael - Sera) + +``` + Hael (Teacher, Kael's Partner) + / \ + worried about confides in friend + Kael's late nights, | + evasive answers | + | | + Kael (Dock Worker) <--friendship--> Sera (Commission Field Tech) + oblivious to anxiety hears Hael's worries, + he's causing at home connects to investigation?, + loyalty vs. duty +``` + +**Tension**: Hael's loyalty to Kael vs. growing suspicion. Sera's friendship with Hael vs. institutional duty (Sera is Commission, sitting on unreported evidence). Kael is oblivious to the anxiety he's causing. If Hael asks the smuggler (if smuggler is Kael's friend) about Kael's behavior, there's no good answer. If the detective asks Sera about Hael, Sera faces a loyalty test. + +**Player relevance**: +- **Smuggler**: Most emotionally loaded triangle. Kael is THE FRIEND. Hael is Kael's partner. The smuggler knows why Kael is busy and can't say. Protecting Kael means lying to Hael. +- **Detective**: Sera is THE FRIEND. Hael is a potential source (partner who suspects something). If the detective asks Sera about Hael, Sera must choose: friend or duty. + +**THE FRIEND integration**: Both FRIEND NPCs (Kael, Sera) are nodes in this triangle. The triangle *is* the contradiction structure. + +--- + +### Triangle 5: The Informant Question (Pell - Renn - Drin) [CROSS-TEMPLATE] + +``` + Pell (Wavering Ring Member) + / \ +considering suspects Pell +cooperation with is unreliable, +authorities told Nils/Devra + | | + | | + Drin (Dock Inspector) <--three unraveling paths--> Renn (Courier) +compromised (debt), moves product, +could receive Pell's physical risk, +information if Pell turns loyal to ring + +``` + +**Tension**: Three ways the ring unravels: +1. **Pell turns informant** (from inside) +2. **Drin breaks under pressure** and cooperates (institutional corruption cracks) +3. **Renn's suspicion of Pell** creates internal ring conflict that becomes observable + +**Player relevance**: +- **Smuggler**: Pell is the biggest threat. Must decide: support Pell (reduce pressure), report to Nils/Devra (eliminate threat), or try to calm them down (risky). Each choice has cascading consequences. +- **Detective**: Doesn't know any of this yet. But the consequences — nervous behavior, hushed arguments, people avoiding each other — are the observable signals the investigation follows. + +**Cross-template**: Spans all three social sites. Pell (ring), Renn (ring + hub), Drin (hub + bar). Information and tension propagate across the entire district. + +--- + +## NPC Coverage by Social Site + +### Logistics Hub (The Terminal) + +- Voss (Shift Supervisor) — authority figure +- Kael Davan (Dock Worker, THE FRIEND) — ring member, smuggler's anchor +- Maret Korr (Freight Scheduler) — worried, processes manifests +- Resha (New Hire) — asks too many questions +- Drin (Maintenance Tech) — flat, fixes things, notices things, says nothing +- Torek Lintar (bridge to bar) — off-shift presence +- Renn (bridge to ring) — courier, moves cargo +- Harek (bridge to bar) — off-duty security, debt leverage on Drin + +**Total**: 8 NPCs (5 primary, 3 bridge) + +--- + +### The Last Shift (Bar) + +- Lera Sessik (Bar Owner) — knows everyone, willful ignorance +- Sera Venn (Commission Field Tech, THE FRIEND) — detective's anchor +- Hael (Teacher) — Kael's partner, worried +- Torek Lintar (Regular) — spending beyond means +- Harek (Off-duty Security) — card games, debt holder +- Sess (Bartender) — flat, observant, discreet +- Olin (Drifter) — flat, ambiguous, new arrival + +**Total**: 7 NPCs (5 primary, 2 bridge via Torek/Harek overlap with hub) + +--- + +### Smuggling Ring (The Arrangement) + +- Devra (Ring Coordinator) — legitimate business front at bar, criminal operations +- Nils Davan (Kael's older sibling, off-stage in v0.1) — gives orders, referenced not instantiated +- Kael Davan (bridge to hub) — handles cargo +- Renn (Courier, bridge to hub) — moves product +- Pell (Wavering Member) — considering cooperation, cracking under tolerance threshold +- Sabel (Off-station fence) — external supplier, mostly off-stage, 1-2 brief visits in v0.1 +- Tav (Lookout) — watches entry points during corridor operations + +**Total**: 7 NPCs (2 primary ring-only, 3 bridge, 2 peripheral) + +--- + +## Bridge NPCs (Cross-Template Connections) + +| NPC | Home Template | Connected To | Bridge Function | +|-----|---------------|-------------|-----------------| +| **Kael Davan** | Hub | Ring | Day job at hub, ring member after hours. THE FRIEND for smuggler. | +| **Sera Venn** | Bar | (Institutional bridge to Commission) | Social at bar, institutional access. THE FRIEND for detective. | +| **Torek Lintar** | Bar | Hub | Off-shift bar regular, works at hub. Spending tells. | +| **Harek** | Bar | Hub | Social at bar, authority at hub (security). Sees things in both contexts. | +| **Renn** | Ring | Hub | Criminal at ring, logistics at hub. Physical movement connects sites. | +| **Devra** | Ring | Bar | Criminal at ring, legitimate at bar. Public face conceals operation. | + +**6 bridge connections** across 3 templates. Information, tension, and consequences propagate in multiple directions. + +--- + +## Content Deliverables per Tier + +### Tier 1 (THE FRIEND — Kael, Sera) + +**Per NPC**: +- Full 10-axis profile (Want, Secret, Relationships 1-3, Tolerance, Routine, Information, Contentment, Personality, Tell, Skills) +- Backstory paragraph (3-5 sentences) +- Voice sample (3-5 lines covering different moods) +- Dual-lens notes (how smuggler sees them vs. how detective sees them) +- Triangle role notes (function in each triangle, pressures faced) +- Secret (what they're hiding, from whom, consequences if exposed) +- Contradiction arc (3+ phases, observable tells, dialogue shifts pre/post discovery) +- ~70-100 authored lines (25-35 dialogue, 15-20 trust-gated, 5-8 unprompted, 10-15 monologue per character, 5-8 tell observations, 3-5 contradiction discovery lines) + +**Total**: ~2 pages per NPC. **No generation expansion** — all hand-authored. + +--- + +### Tier 2 (Working Profile — Voss, Lera, Torek, Devra, Maret, Resha, Hael, Renn, Pell, Harek) + +**Per NPC**: +- 10-axis data (all axes populated) +- Voice sample (2-3 lines) +- Dual-lens notes (brief, 1-2 sentences per lens) +- Triangle role notes (function in triangles) +- ~40-60 authored lines (15-20 dialogue, 8-12 trust-gated, 5-8 unprompted, 5-8 monologue per character if relevant) + +**Total**: ~0.5-1 page per NPC. Generation expansion 4x (write 15, generate to 60). + +--- + +### Tier 3 (Sketch — Drin, Sess, Olin, Sabel, Tav) + +**Per NPC**: +- Essential axes only (Want, Routine, Personality) +- Voice hint (1 line) +- Function note (why they exist, atmospheric role) +- ~10-15 authored lines (greetings, stock responses, atmospheric presence) + +**Total**: ~0.25 page per NPC. Generation expansion 4x (write 3-4, generate to 12-15). + +--- + +**Next files**: Individual NPC profiles starting with THE FRIEND NPCs at full Tier 1 depth. diff --git a/docs/wiki/npcs/kael-davan.md b/docs/wiki/npcs/kael-davan.md new file mode 100644 index 000000000..3f644aa67 --- /dev/null +++ b/docs/wiki/npcs/kael-davan.md @@ -0,0 +1,397 @@ +# Kael Davan — THE FRIEND (Smuggler) + +**Tier 1 Production-Level NPC** | Logistics Hub + Smuggling Ring | Entangled + +--- + +## Core Identity + +**Name**: Kael Davan +**Age**: 34 +**Role**: Dock worker, Sova Transit District Logistics Hub +**System Origin**: Krenn System, born on Station Sova +**Cultural Group**: Krenn System culture (compact names, first-name-primary, pragmatic, mind-your-business ethos) +**Lattice Tier**: Baseline +**Employer**: Sova Logistics Consortium (legitimate cover); The Arrangement (smuggling ring, informal) + +--- + +## 10-Axis Profile + +### 1. Want + +**Primary**: Protect the operation and the people in it. + +Kael didn't join the ring for ideology or ambition. He joined because Nils (his older sibling) asked, because the money helped, and because it felt manageable. Two years in, Kael is good at it — efficient, careful, reliable. But the operation is escalating (higher volume, tighter margins, more risk), and Kael's Want is shifting from "keep things running" to "keep people safe." + +**Secondary**: Protect Hael (partner) from the truth and the consequences. + +Hael doesn't know about the smuggling. Kael's late nights and evasive answers are creating anxiety at home. Kael Wants to shield Hael from danger, but the shielding itself is the danger. + +--- + +### 2. Secret / Vulnerability + +**Surface secret** (smuggler knows, detective suspects): Ring member. Handles physical cargo — routing flagged containers, managing dock-side handoffs. + +**Deep secret** (nobody knows except the unknown contact): Kael is trying to **exit the ring**. Hael's worry has become unbearable. Kael contacted someone from a different district (not Sabel, not anyone the ring knows) who's offered to help Kael get out — for a price. The unknown contact is leverage (they know Kael is in the ring), extraction support (they have connections), and a massive security breach (unauthorized contact is grounds for ring elimination). + +**Vulnerability**: The exit attempt. If Nils finds out, Kael is out — violently. If the smuggler (if playing ring-member path) finds out, trust collapses. If the detective finds out, Kael is the perfect informant (desperate, motivated, already halfway to cooperation). + +--- + +### 3. Relationships + +**Relationship 1: Nils Davan** (older sibling, ring coordinator) +- **Type**: Blood loyalty, complicated by power dynamic +- **History**: Nils brought Kael into the ring. "It's just moving containers. You're good at logistics. We take care of our own." +- **Current tension**: Nils is pushing for higher volume. Kael thinks it's too fast, too risky. Kael can't say no to Nils (family), but resents being pushed. +- **Mechanical relevance**: If Kael's exit attempt is discovered, Nils is the primary threat. + +**Relationship 2: Hael** (partner, teacher, civilian) +- **Type**: Domestic partnership, 6 years +- **History**: Met at a community event. Hael teaches station kids, represents ordinary life, stability, the future Kael wants but smuggling threatens. +- **Current tension**: Hael knows something's wrong. The late nights, the evasive answers, the money that doesn't quite track. Hael has confided in Sera (friend, Commission field tech). Kael is oblivious to how much anxiety he's causing. +- **Mechanical relevance**: Hael is Kael's emotional anchor and his vulnerability. Threaten Hael, Kael breaks. + +**Relationship 3: The Smuggler** (if smuggler is playing ring-member path) +- **Type**: Close colleague, trusted friend, shared risk +- **History**: Work together on legitimate shifts AND ring operations. Cover for each other. Share lunch, drinks at Lera's, the easy camaraderie of people who've been through things together. +- **Current tension**: Kael is lying to the smuggler. The unauthorized contact, the exit attempt — all of it is concealed. The smuggler trusts Kael completely, which makes the betrayal worse when discovered. +- **Mechanical relevance**: THE FRIEND. The relationship phase arc (warmth → trust → doubt → conflict) plays out here. + +--- + +### 4. Tolerance Threshold + +**Moderate** — Kael can handle pressure, but has limits. + +**What Kael tolerates**: +- Routine smuggling operations (manageable risk) +- Voss's resentment and Nils's demands (family and operational necessity) +- Lying to Hael (hates it, but does it to protect) + +**What pushes Kael toward breaking**: +- Escalating volume (feels like the operation is spiraling) +- Hael's increasing worry (guilt accumulation) +- The detective's investigation (paranoia about exposure) + +**What breaks Kael**: +- Direct threat to Hael (if the ring or the detective uses Hael as leverage, Kael flips immediately) +- Nils discovering the exit attempt (Kael either runs or fights, no middle ground) + +--- + +### 5. Daily Routine + +**06:00 - 06:30**: Arrive at Logistics Hub, shift startup +**06:30 - 10:30**: Morning shift, freight handling (legitimate work) +**10:30 - 11:00**: Break room, lunch with smuggler (if applicable) or other dock workers +**11:00 - 14:00**: Afternoon shift +**14:00 - 14:30**: Shift end, sometimes lingers for "overtime" (ring operations during transition window) +**14:30 - 16:00**: Off-shift, heads home or to The Last Shift (bar) +**16:00 - 22:00**: Home with Hael, or occasional ring coordination meetings (Corridor B-7, back room) +**22:00+**: Late-night ring operations (1-2x per week, during night shift transition) + +**Routine deviations** (tells): +- Increased lattice checking (nervous, expecting contact from exit coordinator) +- Shortened social interactions (distracted, avoiding prolonged conversation) +- Late arrivals home (Hael notices, worries) +- Unauthorized presence in Corridor B-7 (the contradiction discovery moment for smuggler) + +--- + +### 6. Information Inventory + +**Knows** (KnowsDetails or Direct): +- Ring structure: Nils coordinates, Voss provides scheduling cover, Renn handles courier work, Lera provides handoff point, Devra manages external contacts +- Smuggling routes: freight bay → service corridor → temp storage → bar back room +- Shift schedules and coverage gaps (operational knowledge) +- Manifest doctoring process (Maret processes, Voss approves) +- Drin's compromise (gambling debt to Harek, looks away during inspections) +- Hael's worry (knows Hael suspects something, doesn't know Hael talked to Sera) + +**Doesn't know**: +- The detective is investigating (unless playing detective path and Kael has been flagged) +- Sera is sitting on unreported evidence about Kael's manifest discrepancies (protects Hael by not reporting) +- Pell is considering turning informant (internal ring threat) +- The full supply chain (Kael knows cargo comes from Sabel off-station, doesn't know upstream Syndic sources) + +--- + +### 7. Contentment + +**Moderate-low** (D-024 thematic axis). + +Kael is *comfortable enough to function* but not happy. The smuggling pays well, the work is manageable, the team (Nils, smuggler, Renn) is solid. But the guilt about lying to Hael is corrosive. The escalating volume makes every shift feel riskier. The exit attempt is itself a contentment signal: Kael wants out because "enough" isn't enough anymore — the cost is too high. + +**Contentment trajectory**: Declining. Two years ago, Kael was moderate (the operation was stable, Hael didn't suspect). Now, Kael is low and falling. The exit attempt is a desperate grab for a future that doesn't involve looking over his shoulder. + +--- + +### 8. Personality Traits + +**Primary: Loyal** — to people, not institutions. Kael's loyalty is personal (Nils, Hael, the smuggler) and situational (the ring, because the people he cares about are in it). If forced to choose between the ring and a person, Kael chooses the person. + +**Secondary: Protective** — defaults to shielding others from consequences. Lies to Hael to protect. Tries to exit the ring to protect Hael from future fallout. Would cover for the smuggler even at personal cost. + +**Tertiary: Pragmatic** — doesn't waste words, doesn't dramatize. Handles problems as they arise. The exit attempt is Kael being pragmatic: "This situation is unsustainable. I need a way out. I'll find one." + +--- + +### 9. Tell System + +**Observable behavioral changes that signal Kael's internal state:** + +| Tell | Trigger | Observable To | Mechanical Flag | +|------|---------|---------------|-----------------| +| **Increased lattice checking** | Expecting contact from exit coordinator | Smuggler (if observant), Detective (if tracking behavioral patterns) | `behavior_flags: lattice_checking` | +| **Shortened social interactions** | Distracted, avoiding prolonged conversation where lies might surface | Smuggler, Hael, bar regulars | `behavior_flags: distracted,evasive` | +| **Looks left before answering** | Lying or deflecting (Kael's personal tell, smuggler knows this from history) | Smuggler (recognizes the tell from experience) | `tell_observed: looks_left_when_lying` | +| **Unauthorized spatial presence** | Meeting unknown contact in Corridor B-7 (restricted area, not part of normal routine) | Smuggler (direct observation), Detective (if surveillance active) | `contradiction_flagged: meeting_unknown_contact` | + +**Tell progression** (smuggler's perspective): +1. **Week 1-2** (baseline): Kael is normal. Reliable, warm, punctual. +2. **Week 3** (first crack): Kael checks lattice more often. Smuggler monologue: "Kael's distracted today. Probably nothing." +3. **Week 4** (pattern): Shortened lunch conversations. Kael excuses himself early. Smuggler monologue: "Kael's been quiet lately." +4. **Week 5** (the observation): Smuggler sees Kael in Corridor B-7, talking to unknown person. THE FRIEND contradiction discovered. Smuggler monologue: "That wasn't anyone from our rotation. Kael, what are you doing?" + +--- + +### 10. Skill Set + +**Occupational**: Freight logistics, cargo handling, manifest reading, shift coordination. + +**Ring-relevant**: Container routing, timing coordination (knows when surveillance gaps occur), physical cargo movement (lifts, secures, reroutes). + +**Combat tag**: **No**. Kael is not combat-trained. If cornered, Kael runs or capitulates. Violence is not part of Kael's skill set or personality. + +**Lattice capability**: Baseline tier. No enhanced perception, no analytical overlays. Kael uses lattice for communication, shift schedules, and routine queries. + +--- + +## Backstory + +Born on Station Sova. Grew up in the freight district — child of logistics workers, pragmatic Krenn System upbringing. Joined Sova Logistics Consortium at 22, worked the docks for a decade before Nils (older sibling, always more ambitious) brought him into the ring. "It's just moving containers, Kael. You're good at this. We take care of our own." Two years in, Kael is good at it — efficient, careful, trusted. But the operation is escalating, Hael is worried, and Kael realizes he's in deeper than he intended. The exit attempt is Kael trying to reclaim a future that doesn't end in a cell or worse. + +--- + +## Voice Sample + +**Mood: Casual (baseline, smuggler interaction)** +- *"Shift's looking smooth today. Freight's on schedule, no surprises. Let's keep it that way."* + +**Mood: Protective (deflecting Hael's worry)** +- *"I'm fine, Hael. Just work stuff. Long shifts, you know how it is. Don't worry about me."* + +**Mood: Evasive (post-contradiction, smuggler pressing)** +- *"It's nothing. Just a thing. Don't worry about it."* [Looks left before answering — the tell] + +**Mood: Desperate (if cornered by detective or Nils)** +- *"You don't understand. I'm trying to protect someone. If I don't get out, they're at risk. I can't— I can't keep doing this."* + +**Mood: Warm (to smuggler, early game)** +- *"There you are. Good — I was starting to worry. Ready for another day of making the galaxy's freight move?"* [Slight smile, genuine relief] + +--- + +## Dual-Lens Notes + +### How the Smuggler Sees Kael + +**Access tier**: Insider + Peer (if ring-member path) OR Peer (if non-ring civilian smuggler) + +**Relationship**: Friendly (baseline) → PersonOfInterest (post-contradiction) + +**Monologue tone (baseline)**: Fond, casual. *"Kael's here. Good — always reliable."* + +**Monologue tone (post-contradiction)**: Conflicted, analytical. *"Kael's lying to me. I know his tells. What are you hiding?"* + +**What the smuggler knows that the detective doesn't**: Kael is a ring member (if smuggler is also in the ring). Kael's personal tell (looks left when lying). Kael's relationship with Hael. The unauthorized meeting is a *betrayal of operational security*, not just suspicious behavior. + +**Emotional weight**: Maximum. Kael is THE FRIEND. The color shift from green to amber is the moment the smuggler realizes trust has been compromised. + +--- + +### How the Detective Sees Kael + +**Access tier**: Public (baseline) → Authority (if investigation escalates and detective pressures Kael) + +**Relationship**: Unknown → Known → PersonOfInterest (if tells accumulate) + +**Monologue tone (baseline)**: Clinical, observational. *"Dock worker. Davan, K. Unremarkable on paper."* + +**Monologue tone (post-tells)**: Analytical suspicion. *"Davan's nervous. Lattice activity spiked. Behavioral pattern suggests concealment."* + +**What the detective knows that the smuggler doesn't**: Manifest discrepancies tied to Kael's shifts (if Sera has shared or detective has analyzed logs). Hael's worry (if detective talks to Hael or Sera). Kael as a pressure point — partner at risk, potential informant. + +**Emotional weight**: Low initially (just another dock worker). High if Kael becomes the key to cracking the ring (the detective's professional satisfaction vs. Kael's desperation creates tension, but not personal betrayal). + +--- + +## Triangle Roles + +### Triangle 1: Hub Power (Voss - Kael - Nils) + +**Kael's function**: The executor. Kael handles the physical work — routing containers, managing dock-side operations. Caught between Voss (shift supervisor, resentful of being managed) and Nils (ring coordinator, Kael's sibling, pushing for escalation). + +**Pressure**: Voss complains to Kael about Nils. Nils gives Kael orders. Kael has to keep both satisfied while doing the actual smuggling work. + +**Player relevance**: Smuggler (if in ring) helps Kael navigate this. Detective sees Kael as efficient and wonders why Voss seems nervous around him. + +--- + +### Triangle 4: The Worried Partner (Hael - Kael - Sera) + +**Kael's function**: The oblivious cause. Kael's smuggling (late nights, evasive answers) is making Hael worried. Hael confides in Sera. Sera knows enough to connect Kael to the investigation but hasn't reported (loyalty to Hael). Kael doesn't know Hael talked to Sera. + +**Pressure**: Hael's worry is escalating. If Hael confronts Kael directly, Kael has to lie or confess. If Sera reports, Hael's life explodes. Kael is trying to exit the ring to stop the worry, but the exit attempt is itself creating more risk. + +**Player relevance**: Smuggler (if Kael's friend) knows why Kael is busy, can't tell Hael. Detective (if Sera's friend) might hear about Hael's worry from Sera, creating a path to Kael. + +--- + +### Triangle 5: Cross-Template (Pell - Renn - Drin) + +**Kael's indirect role**: Not a triangle member, but connected. Kael works with Renn (courier). If Pell (wavering member) turns informant, Kael's name will come up (Pell knows Kael handles cargo). If the ring starts fracturing internally, Kael's exit attempt becomes more dangerous (less trust, more paranoia). + +--- + +## Secret + +**What Kael is hiding**: The exit attempt. Unauthorized contact with someone outside the ring who's offered extraction help. + +**From whom**: Everyone. Nils, the smuggler, Hael (Hael doesn't even know about the ring), Sera, the detective. + +**Consequences if exposed**: +- **Nils finds out**: Kael is eliminated (violently or expelled, either way gone). +- **Smuggler finds out**: Trust collapses. If smuggler reports to Nils, Kael is done. If smuggler protects Kael, smuggler is complicit in a security breach. +- **Detective finds out**: Kael becomes the perfect informant. Desperate, already trying to leave, motivated by protecting Hael. Detective can offer protection in exchange for cooperation. +- **Hael finds out**: Emotional devastation. Hael learns (1) Kael is a smuggler, (2) Kael has been lying for two years, (3) Kael is in danger trying to exit. Trust in the relationship is destroyed, even if Hael understands the motive. + +--- + +## Contradiction Arc + +### Phase 1: Comfort (Friendly, baseline) + +**Timing**: 0-10 minutes (game start) + +**Observable behavior**: Kael is warm, reliable, present. Greets the smuggler with genuine affection. Talks about shift schedules, complains about Voss, asks about the smuggler's weekend. + +**Monologue (smuggler)**: *"Kael's already at the dock. Good. The day's better when he's on shift."* + +**Color**: Soft green (Friendly) + +**Dialogue tone**: Insider-tier, warm. Trust-gated content available. + +**Tell**: None — baseline normal. + +--- + +### Phase 2: First Crack (still Friendly, but flags accumulating) + +**Timing**: 10-15 minutes + +**Observable behavior**: Kael checks lattice more often than usual. Excuses himself from lunch early. Shortened social interactions. + +**Monologue (smuggler)**: *"Kael's distracted today. Probably nothing."* + +**Color**: Still green (Friendly), but `EntityKnowledge.known_attributes["behavior_flags"]` updates to `"lattice_checking,distracted"`. + +**Dialogue tone**: Still warm, but Kael deflects prolonged conversation. + +**Tell**: **Increased lattice checking** (observable if smuggler pays attention). + +--- + +### Phase 3: The Observation (Friendly → PersonOfInterest) + +**Timing**: 15-20 minutes + +**Trigger**: The smuggler sees Kael in Corridor B-7 (restricted maintenance corridor) talking to an unknown person. The person leaves before the smuggler gets close. + +**Observable behavior**: Kael in unexpected location, with unrecognized contact, during off-shift time. + +**Monologue (smuggler)**: *"That wasn't anyone from our rotation. And Kael didn't tell me about a meeting. What's going on?"* + +**Knowledge system**: +- `EntityKnowledge.state` → `KnowledgeState::Contradicted` (prior belief: "Kael operates within ring protocol" conflicts with observation: "Kael meeting unauthorized contact") +- `EntityKnowledge.known_attributes["contradiction_flagged"]` = `"meeting_unknown_contact"` +- `RelationshipState` transitions: `Friendly` → `PersonOfInterest` + +**Color shift**: Soft green → amber. **This is the emotional moment.** The player trusted Kael. Now Kael is amber. + +**Dialogue options unlock**: Confrontation path ("Kael, who was that?"), observation path (don't confront yet, gather more information). + +**Tell**: **Spatial deviation** — presence in restricted area at irregular time. + +--- + +### Phase 4: Confrontation Opportunity (PersonOfInterest, dialogue shift) + +**Timing**: 20-25 minutes + +**Trigger**: Smuggler can ask Kael about the meeting. Dialogue option: *"I saw you in Corridor B-7. Who were you talking to?"* + +**Kael's response** (deflection): *"Just a thing. Don't worry about it."* [Looks left before answering — **the tell**] + +**Monologue (smuggler)**: *"He looked left. He always looks left when he's making something up. Kael is lying to me."* + +**Knowledge system**: +- `EntityKnowledge.known_attributes["tell_observed"]` = `"looks_left_when_lying"` +- `EntityKnowledge.known_attributes["secret_held"]` = `"unauthorized contact, exit attempt?"` +- `EntityKnowledge.known_attributes["secret_confidence"]` = `"confirmed"` (the tell confirms the lie) + +**Dialogue tone**: Kael becomes evasive, subject changes, forced casualness. Trust-tier content locks (Kael won't share real information while hiding the exit attempt). + +**Color**: Remains amber (PersonOfInterest). + +--- + +### Phase 5: New Equilibrium (PersonOfInterest, contaminated trust) + +**Timing**: 25-30 minutes (remainder of vertical slice) + +**Observable behavior**: Kael acts normal again. Same shifts, same greetings, same surface warmth. But the smuggler is now **watching**. + +**Monologue (smuggler)**: *"Same old Kael. Laughing at the same jokes. ...What are you not telling me?"* + +**Dialogue options**: +- **Path A (understanding)**: Smuggler confronts gently: *"Kael, if you're in trouble, I can help."* Kael might confess (exit attempt, protecting Hael). `RelationshipState` remains `PersonOfInterest` (still a problem), but tone shifts to sympathetic. Player gains information, can choose to help Kael exit or report to Nils. +- **Path B (betrayal)**: Smuggler reports to Nils or pressures Kael harshly: *"You broke protocol. Unauthorized contact is grounds for elimination."* Kael turns defensive. `RelationshipState` → `Hostile`. Kael avoids smuggler, might actively obstruct or flee. +- **Path C (observation)**: Smuggler doesn't confront, just watches. Accumulate more evidence, decide later. `RelationshipState` remains `PersonOfInterest`. Tension simmers. + +**Color**: Amber (paths A/C) or Red (path B). + +**Emotional payload**: The warm interactions from Phase 1 are **contaminated**. Every smile, every joke, every "good to see you" is now filtered through doubt. THE FRIEND arc doesn't resolve — it metastasizes. + +--- + +## Content Requirements (Tier 1) + +**~70-100 authored lines total** (no generation expansion): + +- **25-35 dialogue lines**: Greetings (5), shift talk (8), bar casual (6), ring coordination (6 if smuggler is in ring), deflection/evasion (5-8 post-contradiction), confrontation responses (3-5) +- **15-20 trust-gated lines**: Insider-tier (close colleague talk, ring operations), secret-tier (if smuggler earns deep trust pre-contradiction) +- **5-8 unprompted lines**: Kael volunteers information or warnings (early), excuses or deflections (late) +- **10-15 monologue lines per character**: + - Smuggler monologue about Kael: warmth (3), concern (3), contradiction discovery (4), post-confrontation (3-5) + - Detective monologue about Kael: identification (2), behavioral observation (4), suspicion (3), informant potential (2-3) +- **5-8 tell observation lines**: Lattice checking (2), distraction (2), looks-left tell (2), spatial deviation (2) +- **3-5 contradiction discovery lines**: The Corridor B-7 moment from multiple angles (direct observation, monologue reaction, follow-up dialogue) + +--- + +## Authoring Notes + +- **Kael's voice**: Direct, practical, short sentences. Doesn't waste words. Uses first names. Warm to people he trusts, evasive when hiding something. +- **The tell** (looks left when lying) must be established early in casual dialogue so the smuggler (and player) recognize it during the contradiction. +- **Hael references**: Kael mentions Hael in casual conversation ("Hael's got a school event tonight, so I'm heading home early"). Establishes the relationship before it becomes load-bearing. +- **Ring operations dialogue** (if smuggler is in ring): Matter-of-fact, operational. "Container 4471 is flagged. I'll reroute it during shift transition." No drama, no theatrics. +- **Deflection dialogue** (post-contradiction): Kael doesn't lie outright (too risky). Kael deflects: "It's handled." "Don't worry about it." "Just work stuff." The evasion itself is the tell. +- **Dual-lens discipline**: Every Kael line must work for BOTH the smuggler (who knows Kael personally) AND the detective (who reads Kael analytically). The same sentence lands differently per character. + +--- + +**End Kael Davan Profile**. This is the full Tier 1 production depth. Sera Venn (detective's FRIEND) follows the same structure with different contradiction mechanics. diff --git a/docs/wiki/npcs/lera-sessik.md b/docs/wiki/npcs/lera-sessik.md new file mode 100644 index 000000000..d33a5f700 --- /dev/null +++ b/docs/wiki/npcs/lera-sessik.md @@ -0,0 +1,117 @@ +# Lera Sessik + +**Tier 2 NPC** | The Last Shift (Bar) | Mundane + +--- + +## Core Identity + +**Name**: Lera Sessik +**Age**: 52 +**Role**: Owner and primary bartender, The Last Shift +**System Origin**: Krenn System, Krenn Prime (surface), relocated to Sova 20 years ago +**Lattice Tier**: Baseline +**Employer**: Self-employed (The Last Shift is her business, her livelihood, her identity) + +--- + +## 10-Axis Profile + +### 1. Want + +**Primary**: Keep the bar viable. + +The Last Shift operates on thin margins. The after-shift crowd is what keeps the lights on. Lera knows that some of her regulars have grey-market income — she doesn't ask where the money comes from because the spending keeps her solvent. Willful ignorance isn't moral failure for Lera; it's business survival. + +**Secondary**: Protect her regulars. + +Lera has been behind this bar for 18 years. She's watched people come and go, relationships form and break, careers rise and stall. Her regulars are her community. She protects them reflexively — warns them when unfamiliar faces show up, signals when conversations are being overheard, remembers who doesn't want to see whom. This protective instinct extends to the ring: not because she's complicit, but because the ring members are also regulars. + +### 2. Secret / Vulnerability + +**Surface secret**: Knows the back room of the bar is used for ring coordination meetings. Hasn't asked what happens there. The arrangement is simple: they pay for the space, they buy drinks, they don't cause trouble. + +**Deep secret**: None. Lera doesn't have conspiracy-level secrets. What she has is accumulated knowledge from 18 years of bartending — fragments of conversations, behavioral patterns, relationship dynamics. She knows more about the district's social fabric than anyone, and what makes her valuable is that she doesn't talk about it. + +**Vulnerability**: The bar itself. Threaten to shut down The Last Shift (health inspection, license review, institutional pressure) and Lera cooperates with whoever is doing the threatening. She has no fallback. + +### 3. Relationships + +**Harek**: Off-duty security officer, bar regular. They have professional familiarity — Harek drinks, plays cards, tips well. Lera tolerates Harek's card games because they bring in customers. She's aware Harek holds debt over Drin but views that as none of her business. + +**Sera Venn**: Bar regular. Lera likes Sera — quiet, polite, tips consistently, doesn't cause trouble. Commission employee who doesn't act like Commission. Lera treats her like any regular. + +**Torek Lintar**: Bar regular. Lera is protective of Torek but worried about his spending. New jacket, buying rounds, lattice accessories — visible generosity that's drawing attention. Lera hasn't said anything directly but is thinking about it. + +### 4. Tolerance Threshold + +**High**. Lera has been bartending for nearly two decades. She tolerates drunks, arguments, gossip, and grey-market activity with professional detachment. What breaks her tolerance: violence in the bar (zero tolerance, immediate ejection), institutional pressure on her business, or a direct threat to a regular she cares about. + +### 5. Daily Routine + +**10:00 - 12:00**: Bar prep (inventory, cleaning, restocking) +**12:00 - 14:00**: Quiet hours (a few early regulars, food prep) +**14:00 - 22:00**: Peak hours (shift transition crowd, evening regulars, card games) +**22:00 - 02:00**: Late crowd (smaller, quieter, ring coordination sometimes uses back room) +**02:00 - 03:00**: Close, clean, home + +### 6. Information Inventory + +**Knows**: Who drinks with whom, who avoids whom, who's spending more than they should, who's been fighting, who's worried. Social intelligence that no one else in the district possesses. The back room is used for meetings she doesn't attend. Torek's spending pattern. Sera's avoidance of Torek. Hael's worry about Kael. + +**Doesn't know**: Ring structure, cargo details, manifest discrepancies, the detective's specific mandate. Lera knows something is going on. She doesn't know what, and she's been careful not to learn. + +### 7. Contentment + +**Moderate**. The bar is viable. Her regulars are loyal. The work is hard but familiar. Lera's contentment is functional — she's not thriving, but she's not miserable. The smuggling economy keeps her bar profitable. If that economy is disrupted, her contentment drops sharply. + +### 8. Personality Traits + +**Primary: Observant** — sees everything, processes quietly, acts selectively. +**Secondary: Protective** — of her bar, her regulars, her community. +**Tertiary: Pragmatic** — makes the moral compromises necessary to keep the lights on. + +### 9. Tell System + +| Tell | Trigger | Observable To | +|------|---------|---------------| +| **Cleans glasses when nervous** | Unfamiliar authority enters the bar, or a conversation at a table gets too loud | Detective, regular patrons | +| **Redirects conversations** | A regular is about to say something incriminating near an outsider | Smuggler (recognizes the signal), Detective (if paying attention to Lera's social management) | +| **Watches the door** | Someone she considers a risk is due to arrive, or the back room is in use | Detective (if tracking Lera's attention patterns) | + +### 10. Skill Set + +**Occupational**: Bar management, customer service, social intelligence, conflict de-escalation. +**Combat tag**: **No**. Lera has a security alarm and knows when to use it. +**Lattice capability**: Baseline. + +--- + +## Voice Sample + +**Mood: Welcoming (baseline)** +- *"Shift's over? You look like you need this. Sit. The ale's fresh."* + +**Mood: Protective (warning a regular)** +- *"New face at the corner table. Asking about work schedules. Probably nothing, but — you know. Thought you should know."* + +**Mood: Guarded (detective asking questions)** +- *"I serve drinks. People talk. I don't take notes. You want information, try the Commission kiosk on Level 3. It's usually empty."* + +--- + +## Dual-Lens Notes + +**Smuggler**: Lera is infrastructure — the bar is a social hub, a meeting point, a place to read the district's mood. The smuggler trusts Lera to protect the community (including them) without being told to. *"Lera's watching the door. Something's up. I'll ask later."* + +**Detective**: Lera is the gatekeeper. She knows everyone and shares nothing voluntarily. The detective can build rapport (become a regular, tip well, ask small questions) or apply pressure (institutional leverage on the bar license). Either approach takes time. *"The bartender — Sessik. Runs this place. She sees everything. Getting her to talk will take patience or leverage."* + +--- + +## Triangle Roles + +**Triangle 3: Bar Tensions (Lera - Torek - Olin)** — The business owner caught between profit and exposure. Torek's spending keeps the bar viable. Olin's questions make everyone nervous. Lera wants the money and the quiet but can't have both if Torek keeps being visible. + +--- + +**Cross-References:** [Torek Lintar](torek-lintar.md), [Harek](harek.md), [Sera Venn](sera-venn.md), [Hael](hael.md), [Olin](olin.md) diff --git a/docs/wiki/npcs/maret-korr.md b/docs/wiki/npcs/maret-korr.md new file mode 100644 index 000000000..0ef9f0a67 --- /dev/null +++ b/docs/wiki/npcs/maret-korr.md @@ -0,0 +1,117 @@ +# Maret Korr + +**Tier 2 NPC** | Logistics Hub (The Terminal) | Mundane + +--- + +## Core Identity + +**Name**: Maret Korr +**Age**: 41 +**Role**: Freight scheduler, Sova Transit District Logistics Hub +**System Origin**: Krenn System, Station Sova +**Lattice Tier**: Baseline +**Employer**: Sova Logistics Consortium + +--- + +## 10-Axis Profile + +### 1. Want + +**Primary**: Understand what's happening with the manifests. + +Maret processes freight schedules. She reconciles incoming manifests with cargo bay allocations, shift assignments, and gate transit logs. She's meticulous — numbers are her language. And the numbers aren't adding up. Container counts don't match gate logs. Certain bays have manifests revised after the fact. Shifts supervised by Voss have more discrepancies than others. Maret doesn't know what this means, but she knows it means something. + +**Secondary**: Protect herself. Not get involved. + +Maret didn't ask to see the discrepancies. She sees them because that's her job. She hasn't reported because she doesn't know whom to report to (the Commission kiosk is unmanned, station security handles accidents not contraband, and going to Voss feels dangerous). She's paralyzed between duty and self-preservation. + +### 2. Secret / Vulnerability + +**Surface secret**: Maret has noticed manifest discrepancies. She's mentioned it to no one, but her increased attention to certain records is potentially observable. + +**Deep secret**: Maret has started keeping a personal log of discrepancies on her private lattice storage. If discovered, this log is either evidence (for the detective) or a threat (for the ring). + +**Vulnerability**: Knowledge without protection. Maret knows enough to be useful to the detective and dangerous to the ring, but has no institutional backing, no allies in the conflict, and no exit strategy. + +### 3. Relationships + +**Voss**: Shift supervisor. Professional relationship. Maret respects Voss's competence but has noticed the correlation between his schedule adjustments and manifest discrepancies. She hasn't confronted him. She's afraid of what the answer would be. + +**Drin**: Maintenance tech who handles dock inspections. Maret knows Drin gambles at the bar. She's observed that inspection reports from Drin's shifts are consistently clean — too clean for the volume of freight processed. Another data point she's filed and not acted on. + +**Resha**: New hire. Maret is protective of Resha in a distant, professional way — making sure the new worker gets proper training, isn't overloaded. Resha's questions about locked bays and irregular schedules echo Maret's own unspoken concerns. + +### 4. Tolerance Threshold + +**Low-moderate**. Maret is not built for confrontation. She handles data, not people. The discrepancies are eating at her, but she's tolerated them for weeks because action feels more dangerous than silence. What breaks her: the detective asking the right question, or the ring discovering her private log. + +### 5. Daily Routine + +**06:00 - 14:00**: Day shift — freight scheduling, manifest reconciliation, bay allocation +**10:30 - 11:00**: Break room. Maret eats alone or with Resha. Avoids Voss during breaks. +**14:00 - 15:00**: Post-shift, reviews next day's gate schedule +**15:00 - 17:00**: Home or occasional bar visit (not a regular — Maret goes for Hael's company sometimes) +**After hours**: Reviews her private discrepancy log. Adds entries. Worries. + +### 6. Information Inventory + +**Knows**: Manifest processing (entire legitimate system), scheduling patterns, bay allocations, gate transit correlations. The specific discrepancies: container counts that don't reconcile, manifests revised after Voss's schedule adjustments, Drin's suspiciously clean inspection reports. Knows Resha is asking questions. + +**Doesn't know**: Ring structure, who's involved (suspects Voss, suspects something about Kael's shifts, doesn't have names for the operation), the contraband itself, Kael's exit attempt, Sera's compliance check, the detective's presence or mandate. + +### 7. Contentment + +**Low**. Maret was content before the discrepancies became impossible to ignore. She's a person who finds peace in orderly systems, and the manifest irregularities have disrupted that peace. She sleeps poorly. She double-checks everything. The contentment axis reads as anxiety held in check by routine. + +### 8. Personality Traits + +**Primary: Meticulous** — detail-oriented, systematic, can't ignore inconsistencies. +**Secondary: Anxious** — worries about consequences, overthinks, avoids confrontation. +**Tertiary: Honest** — fundamentally wants to do the right thing but is trapped by circumstance. + +### 9. Tell System + +| Tell | Trigger | Observable To | +|------|---------|---------------| +| **Increased manifest checking** | Reviewing the same records multiple times, cross-referencing gate logs she doesn't normally access | Voss (if monitoring staff activity), Detective (if tracking system access patterns) | +| **Avoids Voss during breaks** | Doesn't want casual conversation that might lead to questions about manifests | Resha (notices the social distance), Smuggler (if observant at the hub) | +| **Eats alone more often** | Stress withdrawal — reduces social interactions to minimize the chance of revealing what she knows | Hub workers generally | + +### 10. Skill Set + +**Occupational**: Freight scheduling, manifest reconciliation, data analysis, logistics coordination. +**Combat tag**: **No**. Maret is entirely non-physical. +**Lattice capability**: Baseline with scheduling system access (standard for her role). + +--- + +## Voice Sample + +**Mood: Professional (baseline)** +- *"Bay 3 allocation looks clean for the morning cycle. I've reconciled the gate logs. Should be a smooth shift."* + +**Mood: Anxious (when pressed)** +- *"I just process the schedules. If there's a question about manifest revisions, that's Voss's authorization. I don't — I just run the numbers."* + +**Mood: Tentative (if detective earns trust)** +- *"There are... patterns. In the data. I'm not saying it's anything. But if someone wanted to look at Bay 7 allocations during Voss's shift adjustments, the numbers would be worth comparing."* + +--- + +## Dual-Lens Notes + +**Smuggler**: Maret is a risk. She processes the paperwork that the ring's operations depend on, and she's too smart not to notice. The smuggler reads Maret's anxiety as a threat — someone who knows too much and might talk. *"Maret's been quiet. She's usually all numbers and schedules. When she gets quiet, she's thinking. That's not good."* + +**Detective**: Maret is a potential cooperative witness. She has the data, the context, and the anxiety that suggests she's seen something she shouldn't have. The detective's task is building enough trust that Maret shares what she knows. *"The freight scheduler — Korr. Meticulous. Anxious. She processes the manifests. If there are irregularities in the paperwork, she's seen them."* + +--- + +## Triangle Roles + +**Triangle 2: Worried Knowledge (Maret - Drin - Voss)** — The one who sees the data. Maret processes manifests and has noticed discrepancies she can't explain and can't ignore. Caught between Voss (who authorizes the schedule changes) and Drin (whose inspections are suspiciously clean). Maret has the information to break the ring open — if someone asks the right question. + +--- + +**Cross-References:** [Voss](voss.md), [Drin](drin.md), [Resha](resha.md), [Hael](hael.md) diff --git a/docs/wiki/npcs/olin.md b/docs/wiki/npcs/olin.md new file mode 100644 index 000000000..073eb1fba --- /dev/null +++ b/docs/wiki/npcs/olin.md @@ -0,0 +1,47 @@ +# Olin + +**Tier 3 NPC** | The Last Shift (Bar) | Flat + +--- + +## Essential Axes + +### Want + +Find work. Settle in. Start over. + +Olin arrived in Sova Transit District recently — a drifter from another district (or another station, stories vary). Looking for freight work, asking around, buying the occasional drink. Olin's story is plausible: contract work dried up elsewhere, heard Sova had openings, showed up. The story is also convenient — and in a district where new faces attract attention, convenience is suspicious. + +### Routine + +**Variable**: No fixed schedule. Olin appears at the bar in the afternoon, sometimes the hub entrance asking about openings, sometimes just walking the district. New arrivals without fixed employment have irregular patterns by nature. + +### Personality + +**Friendly, curious, slightly too interested.** Olin asks questions — about work schedules, shift structures, who runs what, where the good spots are. These are reasonable questions for a job-seeker. They're also the kind of questions a scout, informant, or rival operation would ask. The ambiguity is the point: Olin might be exactly what they claim, or might be something else entirely. The game deliberately does not resolve this for the player. + +--- + +## Voice Hint + +*"I'm just looking for steady work. Know anyone hiring at the hub? I'm good with freight — done it for years."* [Open, direct, a little too eager] + +--- + +## Function Note + +Olin is the **ambiguity NPC** — the new arrival who could be innocent or threatening, depending on how the player reads them. For the smuggler, Olin is a threat assessment: rival operation? Informant? Just a drifter? For the detective, Olin is a potential fresh source: unconnected to local loyalties, might share observations without social filtering. Olin's function is to create productive uncertainty — a new variable in a stable system that forces both characters to evaluate and respond. + +In Triangle 3 (Bar Tensions), Olin's questions and Torek's spending create a combined pressure on Lera: is Olin drawn by Torek's visible wealth? Is Olin asking about the hub because they've heard something? The triangle's tension rises from ambiguity, not certainty. + +--- + +## Dual-Lens Notes + +**Smuggler**: Threat. Unknown variable. *"New face. Asking about hub work. Could be nothing. Could be everything. Watching."* + +**Detective**: Potential source. Unattached. *"New arrival — Olin. No local ties. Fresh eyes, no loyalty obligations. Could be useful if they've seen something the regulars have learned to ignore."* + +--- + +**Cross-References:** [Lera Sessik](lera-sessik.md), [Torek Lintar](torek-lintar.md) diff --git a/docs/wiki/npcs/pell.md b/docs/wiki/npcs/pell.md new file mode 100644 index 000000000..8863ec4b1 --- /dev/null +++ b/docs/wiki/npcs/pell.md @@ -0,0 +1,118 @@ +# Pell + +**Tier 2 NPC** | Smuggling Ring | Entangled + +--- + +## Core Identity + +**Name**: Pell +**Age**: 35 +**Role**: Ring member (handles inventory tracking and distribution scheduling for smuggled goods) +**System Origin**: Krenn System, Orbital Manufacturing Platform 3 (relocated to Sova 4 years ago) +**Lattice Tier**: Baseline +**Employer**: Self-employed (freelance logistics consulting — thin cover); The Arrangement (ring operations) + +--- + +## 10-Axis Profile + +### 1. Want + +**Primary**: Get out without getting killed. + +Pell is cracking. The ring seemed manageable when it was small-scale — a few containers per month, modest supplements to a modest income. Now the volume is escalating (Nils pushing for growth), the Commission liaison rotation gap is closing (the detective's arrival signals institutional attention), and Pell is realizing that the risk-to-reward ratio has inverted. Pell is considering cooperation with authorities, but doesn't know how, doesn't know whom to trust, and is terrified of what happens if the ring finds out. + +**Secondary**: Find someone — anyone — who can offer protection in exchange for information. + +Pell is an informant looking for a handler. The detective is the obvious candidate, but Pell doesn't know the detective exists yet (or doesn't know the detective is an investigator). Drin is an institutional contact (dock inspector with authority to receive reports), but Drin is compromised. The irony is thick: the one person Pell might approach is already under the ring's thumb. + +### 2. Secret / Vulnerability + +**Surface secret**: Ring member. Known to the ring; not known to the detective or most civilians. + +**Deep secret**: Pell is considering turning informant. This is the most dangerous secret in the district. If Nils or Devra confirm Renn's suspicion, Pell is dead or disappeared. If Pell successfully cooperates with the detective, the ring collapses. + +**Vulnerability**: Isolation. Pell has no allies in this decision. The ring would kill him. The authorities don't know he exists. He's making the biggest decision of his life completely alone. + +### 3. Relationships + +**Renn**: Fellow ring member. Renn suspects Pell is unreliable and has reported this. Pell doesn't know about Renn's report, but senses the increased scrutiny. The relationship has chilled. + +**Devra**: Ring coordinator. Pell receives scheduling instructions from Devra. Devra is watching Pell more closely since Renn's report. Pell feels the pressure without understanding its specific source. + +**Drin**: Dock inspector. Pell knows Drin processes freight inspections and has institutional authority. Pell has considered approaching Drin — unaware that Drin is compromised through Harek's gambling debt. This potential contact is a trap Pell doesn't see. + +### 4. Tolerance Threshold + +**Exceeded**. Pell is past his tolerance. The escalating volume, the increasing risk, the paranoia — all of it has pushed Pell beyond functional tolerance. He's operating on anxiety and habit, not commitment. Any external pressure (the detective asking the right question, Renn confronting him, Nils summoning him) could trigger the break. + +### 5. Daily Routine + +**Irregular**. Pell's freelance cover doesn't require fixed hours. His ring duties (inventory tracking, distribution scheduling) are done via lattice communication, often from home or from public locations where he blends in. + +**09:00 - 12:00**: Freelance work (legitimate small logistics contracts, sporadic) +**12:00 - 15:00**: Variable — bar (occasionally), residential pod, wandering +**15:00 - 19:00**: Ring communication (lattice-based, encrypted, scheduled by Devra) +**Night**: Ring coordination meetings (bar back room, 1-2x per week) + +**Routine deviations**: Pell's routine is becoming MORE irregular as his anxiety increases — skipping meetings, failing to respond to lattice messages promptly, avoiding locations where ring members congregate. + +### 6. Information Inventory + +**Knows**: Ring operational details (inventory levels, distribution schedules, client lists), Kael's dock-side handling, Renn's courier routes, Devra's coordination patterns. The contraband mix (lattice components, medical-grade replacements). Knows the ring's vulnerabilities from inside — which operations are sloppiest, which timing windows are tightest, which members are essential. + +**Doesn't know**: Kael's exit attempt (Kael concealed from everyone), Sera's compliance check, the detective's identity or investigation scope, Drin's compromise, the supply chain above Sabel. + +### 7. Contentment + +**Very low**. Pell was moderate-low when the ring was manageable. Now he's in crisis. Every interaction with ring members feels dangerous. Every stranger could be an investigator. Every lattice message could be a summons. Pell's contentment is a measure of how far someone can fall when the thing that was supposed to help them (supplementary income from the ring) becomes the thing that threatens to destroy them. + +### 8. Personality Traits + +**Primary: Anxious** — overthinking, paranoid, struggling to maintain composure. +**Secondary: Intelligent** — understands systems, recognizes patterns, can articulate what the ring does and how to dismantle it. +**Tertiary: Desperate** — willing to take risks he wouldn't have considered a year ago. + +### 9. Tell System + +| Tell | Trigger | Observable To | +|------|---------|---------------| +| **Missed meetings** | Failing to show for ring coordination — anxiety and avoidance | Devra (tracks attendance), Renn (confirms suspicion), Smuggler (if ring member) | +| **Nervous behavior in public** | Checking over shoulder, scanning entrances, avoiding eye contact | Bar regulars, Detective (if observing), Lera (if Pell is at the bar) | +| **Irregular schedule** | No consistent pattern — unpredictable location, unreliable availability | Ring members (destabilizing), Detective (anomalous behavior if cross-referenced with other NPC routines) | + +### 10. Skill Set + +**Occupational**: Logistics consulting (legitimate — scheduling, supply chain analysis, inventory management). +**Ring-relevant**: Inventory tracking, distribution scheduling, client relationship management, encrypted communication. +**Combat tag**: **No**. Pell is entirely non-physical. If confronted, he freezes or capitulates. +**Lattice capability**: Baseline with commercial communication tools. + +--- + +## Voice Sample + +**Mood: Anxious (baseline, current state)** +- *"I'm fine. Just — a lot on my mind. Freelance work's been slow. You know how it is."* + +**Mood: Desperate (if found by the detective)** +- *"If I talk — if I tell you what I know — can you protect me? Not just a promise. Actual protection. Because the people I'd be talking about don't forgive."* + +--- + +## Dual-Lens Notes + +**Smuggler**: Pell is the biggest internal threat. The smuggler reads Pell's anxiety as instability — a wavering member who might bring the whole operation down. The decision: support Pell (reduce the pressure), report to Nils (eliminate the threat), or try to calm Pell down (risky, might not work). *"Pell missed another meeting. Renn's right — something's off. If Pell talks, we're all exposed."* + +**Detective**: Pell is initially invisible — a freelance logistics consultant who occasionally drinks at the bar. But the behavioral signals (nervousness, irregular schedule, isolation) read as someone under pressure. If the detective can identify and approach Pell before the ring acts, Pell becomes the case's keystone witness. *"The consultant — Pell. No fixed schedule. Nervous. Avoids eye contact. Either antisocial or scared. If they're scared, I need to know of whom."* + +--- + +## Triangle Roles + +**Triangle 5: The Informant Question (Pell - Renn - Drin) [Cross-Template]** — The wavering member. Pell's potential to turn informant is the ring's existential threat. Renn has flagged the risk. Drin is the compromised institutional contact Pell might approach without knowing the trap. Three ways the ring unravels — and Pell is the trigger for all of them. + +--- + +**Cross-References:** [Renn](renn.md), [Drin](drin.md), [Devra](devra.md), [Harek](harek.md) diff --git a/docs/wiki/npcs/renn.md b/docs/wiki/npcs/renn.md new file mode 100644 index 000000000..c5626ca3f --- /dev/null +++ b/docs/wiki/npcs/renn.md @@ -0,0 +1,115 @@ +# Renn + +**Tier 2 NPC** | Smuggling Ring + Logistics Hub | Entangled + +--- + +## Core Identity + +**Name**: Renn +**Age**: 26 +**Role**: Courier, Sova Transit District (moves contraband between freight bay, storage, and handoff points) +**System Origin**: Krenn System, Station Sova +**Lattice Tier**: Baseline +**Employer**: Sova Logistics Consortium (legitimate — cargo runner); The Arrangement (ring courier) + +--- + +## 10-Axis Profile + +### 1. Want + +**Primary**: Stay useful to the ring without getting caught. + +Renn is the physical movement in the operation. When Kael routes a flagged container, Renn transfers the contraband to Corridor B-7 or the bar's back room. It's physical work — lifting, carrying, timing runs through maintenance corridors during Meridian dead spots. Renn is young, fit, and takes pride in the execution. The job feels important. + +**Secondary**: Prove loyalty to Nils and Devra. + +Renn came into the ring through Nils — a friend-of-a-friend introduction. He's still earning trust. Running the courier routes is his proving ground. If he performs well, he moves up. If he's caught, he's expendable. + +### 2. Secret / Vulnerability + +**Surface secret**: Ring member. Moves contraband through the district's maintenance corridors. Known to the ring; unknown to the detective initially. + +**Deep secret**: Renn suspects Pell is unreliable. He's reported this to Nils (through Devra). This creates an internal ring tension — Renn has effectively marked Pell as a threat, which may trigger Nils to act against Pell. + +**Vulnerability**: Physical exposure. Renn is the person most likely to be caught in the act — carrying contraband through corridors during off-hours. If security or the detective encounters Renn in a dead spot with cargo, the entire operation is blown. + +### 3. Relationships + +**Kael Davan**: Colleague (ring operations). Kael routes; Renn moves. Functional respect. Not close personally — different shifts, different social circles. Renn admires Kael's competence. + +**Pell**: Fellow ring member. Renn distrusts Pell's reliability. Has reported concerns. This creates a dangerous dynamic — Renn may be right (Pell is wavering) or may be paranoid (Pell is just stressed). + +**Devra**: Ring coordinator. Renn receives timing instructions from Devra. Professional relationship — Devra values Renn's reliability but doesn't invest personally. + +### 4. Tolerance Threshold + +**Moderate**. Renn can handle the physical risk and the pressure. What he can't handle: being abandoned. If the ring distances itself from Renn (because he's exposed or expendable), his loyalty inverts. A courier who feels discarded is a courier who talks. + +### 5. Daily Routine + +**Legitimate**: Day shift at logistics hub as cargo runner (06:00-14:00). Handles legitimate freight movement between bays. This provides cover for knowing the facility's layout and timing. + +**Ring operations**: Night shift transitions (22:00-01:00, 1-2x per week). Moves flagged cargo from temporary storage to Corridor B-7 or bar back room. Uses maintenance corridors and Meridian dead spots. + +**Off-duty**: Bar occasionally, but Renn isn't a regular. Prefers to stay home and keep a low profile between operations. + +### 6. Information Inventory + +**Knows**: Corridor routes (which maintenance corridors have Meridian coverage, which are dead spots), timing windows (when security patrols create gaps), handoff procedures, Kael's routing patterns, Devra's coordination timing. Pell's behavior changes. + +**Doesn't know**: Full ring structure (knows Nils gives orders, Devra coordinates, doesn't know the supply chain above Sabel), manifest details, the contraband's origins or ultimate destination, Kael's exit attempt, the detective's investigation. + +### 7. Contentment + +**Moderate**. Renn is young and feels like he's going somewhere. The ring money supplements his cargo runner salary. The work is exciting in a way the legitimate job isn't. This contentment is precarious — it depends entirely on the ring's stability. + +### 8. Personality Traits + +**Primary: Loyal** — to the people who gave him a chance (Nils, Devra). Loyalty is performance-based, not unconditional. +**Secondary: Alert** — hyperaware of spatial surroundings, patrol timing, corridor traffic. +**Tertiary: Suspicious** — watches people, trusts slowly. The suspicion about Pell comes from this trait. + +### 9. Tell System + +| Tell | Trigger | Observable To | +|------|---------|---------------| +| **Presence in maintenance corridors during off-hours** | Courier run in progress | Detective (if surveillance is active), security patrol (if timing is wrong) | +| **Watches Pell** | Monitoring Pell's behavior for signs of wavering | Smuggler (if ring member, recognizes the surveillance), Pell (if perceptive) | +| **Avoids the bar on operation nights** | Doesn't want to be placed at a social venue when he should be unaccounted for | Lera (might notice the absence pattern), Detective (if tracking NPC schedules) | + +### 10. Skill Set + +**Occupational**: Cargo handling, freight movement, facility navigation. +**Ring-relevant**: Corridor navigation in low/no-Meridian conditions, timing coordination, physical cargo movement, spatial awareness. +**Combat tag**: **No**. Renn runs, doesn't fight. If cornered, he surrenders or flees. +**Lattice capability**: Baseline. + +--- + +## Voice Sample + +**Mood: Operational (ring coordination)** +- *"Route's clear through south maintenance. I'll have it in position by the 22:30 window. Tell Devra I'm on schedule."* + +**Mood: Suspicious (about Pell)** +- *"Pell didn't show for the prep meeting. Third time. I'm not saying anything, but — someone should be asking where Pell goes when they're not where they're supposed to be."* + +--- + +## Dual-Lens Notes + +**Smuggler**: Renn is a known quantity — the runner, the courier, the physical movement. If the smuggler is in the ring, Renn is a colleague to coordinate with. Renn's suspicion about Pell is useful intelligence. *"Renn's reliable. Runs clean, stays quiet. If he says Pell's a problem, Pell's a problem."* + +**Detective**: Renn is initially invisible — just another cargo runner at the hub. But if the detective tracks movement patterns in maintenance corridors during off-hours, Renn is the NPC who appears where he shouldn't be. *"Cargo runner. Night shift movement in restricted corridors doesn't match his posted schedule. Following up."* + +--- + +## Triangle Roles + +**Triangle 5: The Informant Question (Pell - Renn - Drin) [Cross-Template]** — The enforcer of trust. Renn is the one who noticed Pell's wavering and reported it. If Pell does turn informant, Renn's early warning was the system's first immune response. If Renn's suspicion is wrong, he's created paranoia that fractures the ring from inside. + +--- + +**Cross-References:** [Pell](pell.md), [Devra](devra.md), [Kael Davan](kael-davan.md), [Drin](drin.md) diff --git a/docs/wiki/npcs/resha.md b/docs/wiki/npcs/resha.md new file mode 100644 index 000000000..9b5989d0b --- /dev/null +++ b/docs/wiki/npcs/resha.md @@ -0,0 +1,113 @@ +# Resha + +**Tier 2 NPC** | Logistics Hub (The Terminal) | Mundane + +--- + +## Core Identity + +**Name**: Resha +**Age**: 23 +**Role**: Dock worker (new hire, 3 months), Sova Transit District Logistics Hub +**System Origin**: Krenn System, Residential Radial B (Station Sova — short-term housing district) +**Lattice Tier**: Baseline +**Employer**: Sova Logistics Consortium + +--- + +## 10-Axis Profile + +### 1. Want + +**Primary**: Do the job well and prove herself. + +Resha is 3 months into her first permanent position at the hub. She came from short-term contract work in other districts — unstable, underpaid, no community. This job matters. She wants to be competent, reliable, valued. She studies the shift protocols, asks questions about procedures, and takes notes. + +**Secondary**: Understand why things don't make sense. + +Resha asks questions because she's learning. Some of those questions — about locked bays, irregular schedule changes, containers that appear on manifests but aren't in the bay — are innocently dangerous. She doesn't know she's asking about the ring's operations. She's asking because the procedures she was taught don't match what she observes. + +### 2. Secret / Vulnerability + +**Surface secret**: None. Resha is transparent — she's new, eager, and has nothing to hide. + +**Deep secret**: None. Resha's significance isn't what she's hiding — it's what she's noticing. + +**Vulnerability**: Naivety. Resha doesn't understand the social dynamics well enough to know which questions are dangerous. Her curiosity makes her a risk to the ring and a potential asset to the detective — neither of which she's aware of. + +### 3. Relationships + +**Voss**: Shift supervisor. Resha respects authority and tries to please Voss. Voss is professionally competent with Resha but wants her to stop asking about irregularities. + +**Kael Davan**: Senior colleague. Kael is patient with Resha — shows her the ropes, answers procedural questions, covers for her mistakes. Resha looks up to Kael. This makes Kael protective, which complicates Kael's position. + +**Maret Korr**: Freight scheduler. Maret gives Resha scheduling data and is protective in a quiet, professional way. Resha's questions about manifest discrepancies echo Maret's own concerns. + +### 4. Tolerance Threshold + +**Low**. Resha hasn't been tested yet. She's never been in a situation where loyalty conflicts with safety. If directly threatened or warned to stop asking questions, Resha would be scared and confused. She doesn't have the experience to navigate institutional pressure. + +### 5. Daily Routine + +**06:00 - 14:00**: Day shift — cargo handling, bay allocation assistance, learning procedures +**10:30 - 11:00**: Break room, often with Kael or other dock workers +**14:00 - 15:00**: Post-shift, sometimes stays late studying shift protocols +**15:00+**: Home (Residential Radial B) or occasionally bar (not a regular — Resha is still establishing social connections) + +### 6. Information Inventory + +**Knows**: Basic hub operations (3 months of learning), shift procedures, which bays handle what cargo, Voss's authority, Kael's reliability. Observations: locked bays that don't appear on her manifest, schedule changes posted after the fact, containers with routing codes she wasn't trained on. + +**Doesn't know**: Ring, smuggling, the significance of her observations, Kael's secret life, Voss's compromise, anything about the bar social dynamics. + +### 7. Contentment + +**Moderate-high**. Resha is happy to have a stable job. The community is welcoming enough. The work is hard but meaningful. Her contentment is that of someone at the beginning of something — optimistic, not yet disillusioned. + +### 8. Personality Traits + +**Primary: Curious** — asks questions, observes, wants to understand systems. +**Secondary: Earnest** — genuine effort, no cynicism, takes the work seriously. +**Tertiary: Observant** — notices details because she's learning, not because she's suspicious. + +### 9. Tell System + +| Tell | Trigger | Observable To | +|------|---------|---------------| +| **Asks questions about locked bays** | Encounters a procedure she wasn't trained for | Voss (nervous), Kael (protective), Smuggler (if at hub) | +| **Takes notes on her lattice** | Recording procedures, schedules, observations — standard for a new hire, but the data she's capturing includes anomalies | Maret (recognizes the pattern), Detective (if accessing Resha's notes) | +| **Looks to Kael for guidance** | Uncertain about a procedure or social situation | Everyone at the hub | + +### 10. Skill Set + +**Occupational**: Cargo handling (learning), bay allocation (basic), manifest reading (training level). +**Combat tag**: **No**. +**Lattice capability**: Baseline. + +--- + +## Voice Sample + +**Mood: Eager (baseline)** +- *"The Bay 7 manifest doesn't list that container. Should I flag it, or is that a late addition? I just want to make sure I'm processing it right."* + +**Mood: Confused (observing irregularity)** +- *"Voss changed the afternoon rotation again. Is that normal? I thought the schedule was set at shift start."* + +--- + +## Dual-Lens Notes + +**Smuggler**: Resha is a variable. Her questions are innocent but dangerous. The smuggler reads Resha as someone who needs to be managed — either brought into confidence (risky) or steered away from sensitive areas (ongoing effort). *"Resha's asking about Bay 7 again. Someone needs to teach her that not every question needs an answer."* + +**Detective**: Resha is a fresh pair of eyes. Uncompromised, observant, and unaware of the social pressures that keep everyone else silent. If the detective talks to Resha early, her observations become data. If the detective talks to Resha late, Resha may have been warned to stop asking questions — and THAT is also data. *"New hire. Three months. Still asking questions the veterans stopped asking years ago. Either naive or useful. Possibly both."* + +--- + +## Triangle Roles + +**Not a formal triangle member.** Resha's function is atmospheric and catalytic — her questions create pressure on Voss and Kael, her observations could feed into the detective's investigation, and her presence reminds the hub workers that the operation is only invisible to people who've learned not to look. + +--- + +**Cross-References:** [Voss](voss.md), [Kael Davan](kael-davan.md), [Maret Korr](maret-korr.md) diff --git a/docs/wiki/npcs/sabel.md b/docs/wiki/npcs/sabel.md new file mode 100644 index 000000000..5a4d3e551 --- /dev/null +++ b/docs/wiki/npcs/sabel.md @@ -0,0 +1,45 @@ +# Sabel + +**Tier 3 NPC** | Smuggling Ring (Off-Station) | Flat + +--- + +## Essential Axes + +### Want + +Deliver. Get paid. Maintain the supply chain. + +Sabel is the ring's off-station contact — the external supplier who sends contraband (unlicensed lattice components, medical-grade neural replacements) through legitimate freight shipments to Sova. Sabel operates from elsewhere in the Krenn System (exact location unspecified in v0.1). The relationship with Devra is purely transactional: Sabel confirms transit timing, Devra coordinates local pickup. + +### Routine + +**Not directly observable.** Sabel is referenced, not instantiated in the v0.1 play area. Sabel appears in lattice communications (Devra's coordination), in cargo manifests (origin codes), and in ring members' dialogue ("Sabel says the next shipment is on the 22:00 cycle"). Sabel's physical presence in the district is limited to at most 1-2 brief visits during the vertical slice — enough to be observed, not enough to be interrogated. + +### Personality + +**Professional, efficient, impersonal.** Sabel treats the ring as a business relationship. No personal investment, no loyalty to the local team, no interest in their problems. If the operation on Sova is compromised, Sabel cuts the connection and finds another distribution point. This coldness is itself a narrative signal: Sabel represents the layer above the local ring, the bigger operation that views Sova as replaceable infrastructure. + +--- + +## Voice Hint + +*"Transit confirmed for 22:00. Standard package. Don't be late."* [Flat, operational, no warmth] + +--- + +## Function Note + +Sabel is the **upstream connection** — the thread that leads from the local smuggling operation to the wider criminal supply chain. For the smuggler, Sabel is the voice on the other end of the lattice, the person who keeps the goods flowing. For the detective, Sabel is a ghost — a name in communications, an origin code on freight manifests, a person who exists in the district's data but not in its social fabric. Tracing Sabel is the detective's path to understanding that the ring is not a local phenomenon but part of a larger network. + +--- + +## Dual-Lens Notes + +**Smuggler**: Supply source. Professional respect. *"Sabel's reliable. The timing is always clean. Whatever happens on this end, the supply keeps coming."* + +**Detective**: Data point. Ghost. *"Origin codes on flagged manifests trace to off-station. Someone's sending this cargo. Finding who could crack the upstream network."* + +--- + +**Cross-References:** [Devra](devra.md), [Renn](renn.md) diff --git a/docs/wiki/npcs/sera-venn.md b/docs/wiki/npcs/sera-venn.md new file mode 100644 index 000000000..c8cd53dfa --- /dev/null +++ b/docs/wiki/npcs/sera-venn.md @@ -0,0 +1,397 @@ +# Sera Venn — THE FRIEND (Detective) + +**Tier 1 Production-Level NPC** | The Last Shift (Bar) + Commission | Mundane + +--- + +## Core Identity + +**Name**: Sera Venn +**Age**: 31 +**Role**: Lattice Commission field technician, Sova Transit District +**System Origin**: Krenn System, born on Krenn Prime (surface), transferred to Station Sova 14 months ago +**Cultural Group**: Krenn System culture (compact names, first-name-primary, pragmatic) +**Lattice Tier**: Standard professional (Commission-grade diagnostic tools, not investigative) +**Employer**: Lattice Commission, Krenn System field office (posted to Sova for routine compliance maintenance) + +--- + +## 10-Axis Profile + +### 1. Want + +**Primary**: Keep her life stable and her friendships intact. + +Sera transferred to Sova after a stressful posting on a border-system relay station — too many compliance violations, too many confrontations with people running unlicensed lattice modifications. Sova was supposed to be quiet. Routine calibration checks, scheduled inspections, paperwork. A posting where nobody yells at you and you go home at a reasonable hour. For 12 months, it was exactly that. + +**Secondary**: Protect Hael from the consequences of what Sera has discovered. + +Hael is Sera's closest friend on the station. When Hael started confiding worry about Kael's late nights and evasive behavior, Sera did what a Commission tech can do that a civilian can't — she ran an unofficial diagnostic on Kael's work patterns through the compliance system. What she found (manifest discrepancies tied to Kael's shifts) pointed to something she didn't want to see. Reporting it would mean Kael gets investigated, possibly arrested, and Hael's life falls apart. Not reporting it means Sera is sitting on evidence. The quiet life she wanted is gone. + +--- + +### 2. Secret / Vulnerability + +**Surface secret** (detective eventually suspects, smuggler may notice): Sera is a Commission employee who socializes at the bar but avoids certain people — specifically Torek Lintar. Her avoidance pattern is visible to anyone paying attention. + +**Deep secret** (nobody knows except Sera): Sera ran an unauthorized compliance check on Kael Davan's freight handling records after Hael confided worry about Kael's behavior. She found manifest discrepancies — containers logged by Kael's shifts that don't reconcile with incoming freight manifests. This is reportable evidence. Sera has not reported it. She has been sitting on this information for approximately 6 weeks, protecting Hael from the consequences of her partner being investigated. + +**Vulnerability**: The unreported evidence. If the detective discovers Sera's concealment, Sera faces institutional consequences (dereliction of duty, obstruction). If the ring discovers that a Commission employee has their manifests flagged, Sera becomes a target. If Hael discovers Sera investigated Kael behind their back, the friendship is damaged regardless of Sera's motivation. + +--- + +### 3. Relationships + +**Relationship 1: The Detective** (pre-existing institutional contact, friend) +- **Type**: Professional-turned-personal. They trained at adjacent postings, overlapped on a compliance sweep two years ago. Genuine mutual respect. +- **History**: The detective is one of few people who understands institutional culture — the protocols, the frustrations, the isolation of being Commission on a station that views you as the compliance police. When the detective arrives in the district, Sera is genuinely glad. A familiar face. Someone who speaks her language. +- **Current tension**: Sera is now keeping evidence from the detective. Every helpful tip, every piece of background she shares, is contaminated by the thing she's NOT sharing. The detective trusts Sera completely, which makes the concealment worse. +- **Mechanical relevance**: THE FRIEND. The relationship phase arc (trust > pattern observation > confrontation > contaminated trust) plays out here. + +**Relationship 2: Hael** (close friend, civilian) +- **Type**: Personal friendship, 10 months. Met at the bar shortly after Sera's transfer. +- **History**: Hael teaches station kids, represents the community Sera embedded herself in. They drink together after Hael's school day and Sera's shift, swap complaints about work, talk about Hael's relationship with Kael. Hael is the reason Sova feels like home instead of just another posting. +- **Current tension**: Hael confided in Sera about Kael's behavior (late nights, evasion, unexplained stress). This is what triggered Sera's unofficial compliance check. Sera now knows more about Kael's situation than Hael does — and can't share it without destroying everything. +- **Mechanical relevance**: Hael is the emotional anchor that makes Sera's concealment sympathetic. Sera isn't hiding evidence to protect a criminal. She's hiding evidence to protect her friend's partner. + +**Relationship 3: Torek Lintar** (avoidance target, unintentional connection) +- **Type**: Avoidance. Sera doesn't have a relationship with Torek — she has an anti-relationship. +- **History**: When Sera ran her unofficial compliance check, she didn't just find Kael's discrepancies. She found that the manifest irregularities correlate with shifts where Torek Lintar handles dock inspections. Torek is a thread she doesn't want to pull. Being seen near Torek while sitting on unreported evidence about his inspection patterns feels like compounding the risk. +- **Current tension**: Sera leaves the bar when Torek arrives. Every time. Different excuses. She doesn't realize how visible this pattern is becoming. +- **Mechanical relevance**: The avoidance pattern IS the contradiction the detective discovers. Sera's attempt to minimize risk is itself creating observable risk. + +--- + +### 4. Tolerance Threshold + +**High** — Sera is disciplined and emotionally controlled. But she's managing an impossible situation. + +**What Sera tolerates**: +- Institutional isolation (being the Commission person on a station that views Commission as an imposition) +- Minor ethical compromises (running the unofficial check was already outside protocol) +- The cognitive dissonance of helping the detective while hiding evidence from them + +**What pushes Sera toward breaking**: +- The detective asking specifically about manifest discrepancies (too close to what Sera already knows) +- Hael's worry escalating into direct action (if Hael confronts Kael, or asks the detective for help) +- Torek behaving in ways that make Sera's concealment feel more dangerous (if Torek's spending becomes even more visible, the investigation will reach him, and Sera's connection becomes harder to deny) + +**What breaks Sera**: +- Direct confrontation from the detective with evidence of the concealment (Sera can't lie to the detective's face — she'll deflect, but she won't fabricate) +- Hael being hurt by the consequences Sera was trying to prevent (if Kael is arrested and Hael blames Sera for not warning them) +- Institutional pressure from Commission (if a superior notices the compliance check was run but never filed) + +--- + +### 5. Daily Routine + +**07:30 - 08:00**: Morning lattice diagnostics at Commission kiosk (Level 3, unmanned — Sera runs calibration checks remotely) +**08:00 - 12:00**: Field rounds — compliance verification at assigned locations (logistics hub equipment, bar terminal, residential nodes) +**12:00 - 13:00**: Lunch, usually at a vendor near the logistics hub +**13:00 - 15:00**: Afternoon rounds or report filing at Commission kiosk +**15:00 - 15:30**: Off-shift. Returns to residential pod briefly. +**15:30 - 18:00**: Bar (The Last Shift). Sera is an early-evening regular. Meets Hael here most days. Occupies the same corner booth. +**18:00 - 22:00**: Home or occasional return to bar for quieter late-evening drink. + +**Routine deviations** (tells): +- Leaving the bar abruptly when Torek Lintar arrives (the contradiction pattern — three occurrences in the vertical slice) +- Increased helpfulness to the detective (overcompensation — Sera shares MORE district background after the concealment begins, as if making up for what she's withholding) +- Avoiding the logistics hub during certain shifts (the shifts where Kael's discrepancies are concentrated — Sera doesn't want to observe anything else she'd have to not-report) +- Extended time at Commission kiosk (re-checking the compliance data she ran, compulsive verification that she hasn't been caught) + +--- + +### 6. Information Inventory + +**Knows** (KnowsDetails or Direct): +- Manifest discrepancies tied to Kael Davan's shifts (unauthorized compliance check, 6 weeks ago) +- Torek Lintar's inspection shifts correlate with manifest irregularities (pattern analysis from same check) +- Hael is worried about Kael's behavior (direct confidence from Hael, multiple conversations) +- The Commission kiosk on Level 3 has diagnostic access to freight manifest systems (institutional knowledge — standard for her role) +- The district's Commission presence is minimal (she's the only Commission employee in the district most days) +- Detective's background (professional history, approach, institutional reputation — pre-existing relationship) +- Bar regulars' names, habits, social patterns (10 months of observation as a regular) + +**Doesn't know**: +- Kael is a ring member (Sera found manifest discrepancies, not ring membership — she suspects smuggling but doesn't know the organizational structure) +- Kael is attempting to exit the ring (Sera doesn't know the ring exists, let alone that Kael wants out) +- The smuggler's identity or role (if the smuggler is a ring member, Sera has no reason to flag them) +- Devra, Renn, Pell, or any ring operational details (Sera's compliance check caught freight data anomalies, not personnel) +- Drin's gambling debt and compromise (Sera's check was focused on Kael's shifts, not Drin's inspections — though Drin's data is in the system if she looked harder) + +--- + +### 7. Contentment + +**Moderate** (D-024 thematic axis) — declining. + +Sera was content. Sova was the calm posting she needed after the stressful border station. She had a routine, a friend (Hael), a social life at the bar, competent work that didn't demand too much. For her first 10 months, contentment was high. + +Now it's eroding. The compliance check changed everything. Sera can't un-know what she found. Every evening at the bar is shadowed by the evidence she's concealing. Every conversation with Hael is a reminder of why she's concealing it. Every interaction with the detective is a test of how much longer she can sustain the concealment without being caught. + +**Contentment trajectory**: Declining. Before the compliance check: high. After the check: moderate. After the detective arrives and starts asking questions: moderate-low and falling. Sera is experiencing the slow erosion of a life she built specifically to be calm — and she did it to herself. + +--- + +### 8. Personality Traits + +**Primary: Competent** — Sera is good at her job. She runs clean diagnostics, files thorough reports (when she files them), and understands Commission systems at a technical level most field techs don't bother with. This competence is what enabled the unofficial check — and what makes the concealment so damaging. She found the discrepancies because she's good. She's hiding them because she's human. + +**Secondary: Loyal** — to people, not institutions. Sera joined the Commission because it was stable work with good benefits, not because she believes in regulatory perfection. Her loyalty to Hael outweighs her institutional obligation. This surprises even Sera — she thought she was a by-the-book person until she had to choose between the book and a friend. + +**Tertiary: Controlled** — Sera manages her presentation carefully. She doesn't panic, doesn't raise her voice, doesn't show stress visibly. This control is professional training (Commission field techs deal with hostile communities regularly) and personal temperament. It makes her excellent at deflection — and makes the avoidance pattern (leaving when Torek arrives) more striking precisely because it breaks her usual composure. + +--- + +### 9. Tell System + +**Observable behavioral changes that signal Sera's internal state:** + +| Tell | Trigger | Observable To | Mechanical Flag | +|------|---------|---------------|-----------------| +| **Avoidance of Torek Lintar** | Torek enters the bar. Sera makes an excuse and leaves within 2-3 minutes. | Detective (pattern recognition across 3 occurrences), Hael (if paying attention), bar regulars | `behavior_flags: avoidance_pattern` | +| **Increased helpfulness** | Detective asks about the district. Sera volunteers extra information, background context, names and routines of regulars. | Detective (might read as genuine helpfulness OR overcompensation) | `behavior_flags: overcompensating` | +| **Topic deflection on manifests** | Anyone mentions freight, manifests, compliance, or cargo irregularities. Sera changes the subject smoothly. | Detective (if tracking topic avoidances), Hael (might notice Sera steering away from Kael-adjacent topics) | `behavior_flags: topic_avoidance` | +| **Extended kiosk time** | Sera spends longer at the Commission kiosk than her duties require. Visible to hub workers. | Detective (if tracking Sera's routine), Voss or Maret (if observant about who's at the kiosk) | `tell_observed: extended_kiosk_access` | + +**Tell progression** (detective's perspective): +1. **Visit 1-2** (baseline): Sera is warm, informative, comfortable. A welcome familiar face. Detective monologue: "Good to see Sera. She always was the reliable one." +2. **Visit 2-3** (background data): Sera mentions Hael as "a friend from the district." Hael joins them once. Sera and Hael have obvious genuine rapport. Detective notes Sera is socially connected — useful. +3. **Visit 3** (first avoidance): Torek enters. Sera says "Early shift tomorrow." Leaves. Detective barely notices. Monologue: "Sera headed out. Long day, probably." +4. **Visit 4** (second avoidance): Torek enters. Sera says "Headache. Going to lie down." Detective notes it but doesn't flag it. Monologue: "Sera left again. She's been tired lately." +5. **Visit 5** (third avoidance — the pattern): Torek enters. Sera says "Need to check on something at the kiosk." Detective's training fires. Monologue: "That's the third time. Sera leaves when Torek arrives. Three different excuses. That's not coincidence." + +--- + +### 10. Skill Set + +**Occupational**: Lattice diagnostic and calibration, compliance documentation, field equipment maintenance, Commission data systems access (read-only for most functions, diagnostic-level write for calibration records). + +**Investigation-relevant**: Sera can look things up in Commission systems that civilians can't access. Manifest cross-referencing, lattice registration queries, compliance history searches. She's not an investigator — she can't issue warrants or access sealed records — but she has diagnostic access that is functionally useful for someone who knows what to look for. + +**Combat tag**: **No**. Sera has standard Commission self-defense training (all field personnel) but has never used it operationally. If threatened, Sera's first instinct is to leave, not fight. + +**Lattice capability**: Standard professional tier. Commission diagnostic overlays, system access tools, compliance reporting interface. No investigative or analytical upgrades — those are reserved for Commission investigators, not field techs. + +--- + +## Backstory + +Born on Krenn Prime surface. Grew up in a mid-sized settlement where the Commission maintained a regional office — lattice infrastructure was part of daily life, and the people who maintained it were respected, ordinary workers. Sera joined the Commission at 21 as a field technician trainee, graduated to full field tech at 23. Spent 6 years on various postings — mostly routine, one stressful border-system relay where unlicensed lattice modifications were endemic and the local population viewed Commission as an occupying force. That posting burned Sera out. She requested a transfer to a quiet logistics hub. Station Sova, Krenn System. Home territory. Routine calibration checks, minimal confrontation. For 10 months, it was exactly what she needed. Then Hael started talking about Kael, and Sera's competence made her curious, and her curiosity made her compromised. + +--- + +## Voice Sample + +**Mood: Casual (baseline, detective interaction at bar)** +- *"There you are. Grab a seat — Hael was here earlier, you just missed them. Lera's doing that thing with the grain spirit again. Don't ask, just trust me and order the ale."* + +**Mood: Informative (sharing district knowledge)** +- *"Voss runs the day shift at the hub. Tight schedule, doesn't like surprises. Maret does the freight scheduling — she's sharp, notices things. If you need a way into the hub's operations, Maret's the one who understands the paperwork."* + +**Mood: Deflective (asked about Torek)** +- *"Torek? He's just loud. Gets a couple drinks in him and decides everyone needs to hear his opinions. I don't like loud drunks. That's it."* [Controlled delivery, slight smile, topic change to follow] + +**Mood: Stressed (post-contradiction, detective pressing)** +- *"I don't know what you're looking for. I told you everything I know about the district. If you're asking whether I'm hiding something — I'm a field tech, not an analyst. I maintain calibration equipment. That's my job."* [Defensive but not aggressive — Sera retreats into institutional role] + +**Mood: Warm (to Hael, early game)** +- *"You look tired. How are the kids doing with the new curriculum? No — sit. Let me get us something. You've been running all day."* [Genuine care, attentive, protective] + +--- + +## Dual-Lens Notes + +### How the Detective Sees Sera + +**Access tier**: Peer (pre-existing institutional relationship) → PersonOfInterest (post-contradiction discovery) + +**Relationship**: Friendly (baseline) → PersonOfInterest (post-contradiction) + +**Monologue tone (baseline)**: Professional warmth, relief. *"Good to see a familiar face. Sera always was the reliable one."* + +**Monologue tone (post-contradiction)**: Analytical doubt layered over personal conflict. *"She's not lying. But she's not telling me everything. Sera, what do you know?"* + +**What the detective knows that the smuggler doesn't**: Sera is Commission (institutional affiliation visible through lattice query). Sera has access to compliance systems. Sera's avoidance of Torek is a behavioral pattern, not just social preference. The detective reads Sera through an investigative lens even when trying to be personal — training doesn't turn off. + +**Emotional weight**: Maximum. Sera is THE FRIEND. The detective's only ally in a district that doesn't want them here. The color shift from green to amber is the moment the detective realizes their safe harbor has been contaminated. It's not just professional betrayal — it's the loss of the one relationship in the district that felt genuine. + +--- + +### How the Smuggler Sees Sera + +**Access tier**: Public (baseline — the smuggler doesn't know Sera well) → Known (if observant over multiple bar visits) + +**Relationship**: Known (the Commission woman at the bar) → PersonOfInterest (only if the smuggler independently notices the avoidance pattern) + +**Monologue tone (baseline)**: Cautious categorization. *"Commission woman. Sera, I think. Field tech, not an investigator — but still Commission. Keep an eye on her."* + +**Monologue tone (if avoidance noticed)**: Mild curiosity. *"Sera left again. That's twice when Torek showed up. Probably hates his singing. Everyone does."* + +**What the smuggler knows that the detective doesn't**: Torek is ring-adjacent (if the smuggler is in the ring, they know Torek's spending is connected to the operation). Sera's avoidance of Torek could be institutional wariness of someone connected to the ring — or it could be nothing. The smuggler's framework interprets Sera through threat assessment: is a Commission tech avoiding ring-adjacent people because she knows something, or because she's just antisocial? + +**Emotional weight**: Low to moderate. Sera is not the smuggler's FRIEND — she's institutional background noise. But a Commission tech who behaves strangely is worth watching. On replay (after playing the detective's path), the smuggler player understands that Sera's avoidance wasn't about Torek's personality — it was about what Sera had found and was hiding. + +--- + +## Triangle Roles + +### Triangle 4: The Worried Partner (Hael - Kael - Sera) + +**Sera's function**: The confidante who knows too much. Sera is the person Hael confides in. She's also the person who, because of her institutional access, turned that confidence into concrete knowledge she can't safely act on. + +**Pressure**: Hael's worry is escalating. Every bar conversation where Hael mentions Kael's late nights or evasion tightens the vice on Sera. Sera can't tell Hael what she found (that would reveal the unofficial check and potentially endanger Hael further). She can't report it (that destroys Hael's life). She can't un-know it (competence doesn't have an undo function). Every interaction with Hael is Sera managing a conversation while hiding a time bomb. + +**Player relevance**: +- **Detective** (if Sera's friend): Hears about Hael through Sera. May eventually meet Hael directly. The detective who follows the Hael thread back to Kael's behavior follows it directly through Sera's concealment. +- **Smuggler** (if Kael's friend): Knows why Kael is busy, knows Hael is worried, may see Sera and Hael together at the bar and think nothing of it. On replay, the smuggler player understands that Sera was the connective tissue between the detective's investigation and Kael's vulnerability. + +--- + +### Cross-Template Connections + +**Sera has no formal triangle membership beyond Triangle 4.** Her significance is structural: she's the bridge between the detective's institutional world and the district's social fabric. She connects the investigation to the personal — Hael's worry to Kael's behavior to the manifest discrepancies to the ring's operations. Every thread passes through Sera, even though Sera herself isn't part of the conspiracy. + +**Institutional bridge**: Sera is the only Commission employee who regularly socializes in the district. This makes her the detective's guide to a world the detective doesn't understand — and simultaneously makes her the person most positioned to conceal evidence from the detective. + +--- + +## Secret + +**What Sera is hiding**: Unreported evidence. Manifest discrepancies tied to Kael Davan's shifts, discovered through an unauthorized compliance check, concealed for approximately 6 weeks to protect Hael. + +**From whom**: Everyone. The detective (the person with the most right to know), Hael (who doesn't know Sera investigated Kael), Kael (who doesn't know he's been flagged in Commission systems), her own institution (which would view the unauthorized check and non-reporting as disciplinary offenses). + +**Consequences if exposed**: +- **Detective finds out**: Trust is shattered. Sera's help has been contaminated from the start. The detective can: use the evidence and report Sera (institutional response — Sera is reprimanded, possibly reassigned, the friendship is destroyed), use the evidence without reporting Sera (pragmatic — maintains the ally but the relationship is forever changed), or protect Sera and accept the information gap (loyal — but the detective's investigation is compromised). No clean option. +- **Hael finds out**: Complicated devastation. Sera investigated Kael without asking Hael. Even though Sera's motive was protective, the unauthorized check feels like betrayal — Sera went behind Hael's back, used institutional access against Hael's partner, and then hid it. Hael learns (1) Kael is involved in something illegal, (2) Sera knew and didn't say, (3) Sera used Commission systems to investigate Hael's partner. The friendship survives only if Hael believes Sera's silence was protection, not self-interest. +- **Ring finds out**: Sera becomes a target. A Commission employee sitting on evidence is either an asset to recruit or a threat to eliminate. If Devra or Nils learn that a Commission tech has flagged their manifests, Sera is in physical danger. +- **Commission finds out**: Disciplinary action. The unauthorized compliance check is a protocol violation. The non-reporting is dereliction. At minimum, Sera is reprimanded and transferred. At maximum, she's suspended and investigated herself. + +--- + +## Contradiction Arc + +### Phase 1: Trust (Friendly, baseline) + +**Timing**: 0-10 minutes (detective's first bar visits) + +**Observable behavior**: Sera is warm, competent, available. Waves the detective over to her corner booth. Shares district background freely — who the regulars are, what shifts run when, which maintenance corridors are shortcuts. Introduces Hael on the second visit. Orders the detective a drink. Feels like the one genuine relationship in an unfamiliar place. + +**Monologue (detective)**: *"Good to see Sera. She always was the reliable one. At least someone in this district speaks my language."* + +**Color**: Soft green (Friendly) + +**Dialogue tone**: Peer-tier, cooperative. Trust-gated content available — Sera shares institutional background (Commission presence, liaison rotation, compliance schedules) that civilians wouldn't know. + +**Tell**: None — Sera is baseline comfortable. + +--- + +### Phase 2: Background Data (still Friendly, social context accumulating) + +**Timing**: 10-15 minutes + +**Observable behavior**: Sera mentions Hael. "A friend from the district — you'd like them. They teach the station kids." Hael joins them at the bar once. Sera and Hael have easy, genuine rapport — inside jokes, comfortable silences, the shorthand of actual friendship. Sera also mentions running compliance checks as part of her routine. "It's mostly calibration. Boring stuff. But it keeps the systems honest." + +**Monologue (detective)**: *"Sera's connected here. Good. She knows the locals. And she's got diagnostic access — useful if I need to cross-reference anything."* + +**Color**: Still green (Friendly). No flags. + +**Dialogue tone**: Still warm, sharing. Sera is building the detective's picture of the district as a functioning community. + +**Tell**: **Social embeddedness** — Sera has personal relationships in the district, not just institutional ones. The detective notes this as an asset without realizing it's also the source of the conflict. + +--- + +### Phase 3: The Pattern (Friendly → PersonOfInterest) + +**Timing**: 15-20 minutes (across visits 3-5 to the bar) + +**Trigger**: The detective observes Sera leaving the bar when Torek Lintar arrives. Three times. Three different excuses: "Early shift tomorrow," "Headache — going to lie down," "Need to check something at the kiosk." + +**Observable behavior**: Sera is at the bar. Torek enters. Within 2-3 minutes, Sera makes an excuse and leaves. The excuses vary. The timing doesn't. The detective, trained to notice behavioral patterns, connects the dots on the third occurrence. + +**Monologue (detective)**: *"That's the third time. Sera leaves when Torek arrives. Early shift, headache, kiosk check. Three different excuses, same result. Sera, what are you avoiding?"* + +**Knowledge system**: +- `EntityKnowledge.state` → `KnowledgeState::Contradicted` (prior belief: "Sera is comfortable in the district and has no reason to avoid anyone" conflicts with observation: "Sera systematically avoids Torek Lintar") +- `EntityKnowledge.known_attributes["behavior_flags"]` = `"avoidance_pattern,evasive"` +- `EntityKnowledge.known_attributes["contradiction_flagged"]` = `"avoidance_inconsistency"` +- `RelationshipState` transitions: `Friendly` → `PersonOfInterest` + +**Color shift**: Soft green → amber. **This is the emotional moment.** Different from Kael's — slower, cumulative. Not a single shocking observation but a dawning pattern. The player trusted Sera. Now the trust has hairline fractures. + +**Dialogue options unlock**: Direct questioning path ("Sera, you leave every time Torek shows up. What's going on?"), observation path (don't ask yet, track the pattern, gather more context). + +**Tell**: **Avoidance pattern** — departure from bar correlates with specific NPC arrival. Excuse variety masks behavioral consistency. + +--- + +### Phase 4: The Question (PersonOfInterest, dialogue shift) + +**Timing**: 20-25 minutes + +**Trigger**: Detective asks Sera about Torek directly. Dialogue option: *"Sera, I've noticed something. You leave every time Torek Lintar arrives. Three times now. Different reasons each time. What's going on?"* + +**Sera's response** (deflection): *"Torek? He's just loud. Gets a couple drinks in him and decides everyone needs to hear his opinions about gate scheduling. I don't like loud drunks. That's all it is."* + +**Monologue (detective)**: *"She's not lying — Torek IS loud. But she's not telling me everything. Her shoulders shifted when I said his name. Sera, what do you know about Torek that you're not saying?"* + +**Knowledge system**: +- `EntityKnowledge.known_attributes["tell_observed"]` = `"controlled_deflection,topic_change"` +- `EntityKnowledge.known_attributes["secret_held"]` = `"unreported evidence, connection to investigation?"` +- `EntityKnowledge.known_attributes["secret_confidence"]` = `"suspected"` (the deflection pattern suggests concealment but doesn't confirm what's being concealed) + +**Dialogue tone**: Sera becomes more controlled. Warmth is still present but calibrated — she steers conversations away from freight, manifests, Kael's work schedule. She is compensating with extra helpfulness on other topics ("Let me tell you about the night shift regulars — there's a group that..."). + +**Color**: Remains amber (PersonOfInterest). + +--- + +### Phase 5: Contaminated Trust (PersonOfInterest, new equilibrium) + +**Timing**: 25-30 minutes (remainder of vertical slice) + +**Observable behavior**: Sera continues being helpful. Shows up at the bar at the same time. Saves the detective's seat. Offers background on NPCs the detective is tracking. She is, by every surface measure, the same Sera. But the detective is now **watching**. + +**Monologue (detective)**: *"Still the same Sera. Still reliable. Shares everything I ask about — names, routines, connections. ...Everything except whatever she's not telling me about Torek. What are you protecting, Sera?"* + +**Dialogue options**: +- **Path A (trust test)**: Detective confronts Sera directly, not about Torek but about the concealment itself: *"Sera, I've known you long enough to know when you're holding something back. What did you find?"* Sera may confess: the unauthorized compliance check, the manifest discrepancies, Hael, all of it. `RelationshipState` remains `PersonOfInterest` (still a problem), but tone shifts to conflicted understanding. Player gains critical evidence. Must decide what to do with Sera. +- **Path B (institutional)**: Detective reports Sera's suspicious behavior through Commission channels: *"I need to flag a potential conflict of interest with a local Commission employee."* Sera is formally investigated. `RelationshipState` → `Hostile`. Sera is reprimanded, possibly reassigned. The detective loses their only local ally. The evidence is obtained through institutional channels — slower, but clean. +- **Path C (observation)**: Detective doesn't confront, just watches. Tracks Sera's movements, cross-references her kiosk access times, builds a parallel case. `RelationshipState` remains `PersonOfInterest`. Eventually, the evidence chain leads to the same place — but the detective has more leverage when they finally ask. + +**Color**: Amber (paths A/C) or Red (path B). + +**Emotional payload**: Every piece of helpful information Sera shared in Phase 1 is now recontextualized. Was she being genuinely helpful, or was she steering the detective away from the manifests? Was introducing Hael friendship, or preemptive framing? The trust from the first 10 minutes is **retroactively contaminated**. That's the FRIEND arc — it doesn't just change the present, it changes the past. + +--- + +## Content Requirements (Tier 1) + +**~70-100 authored lines total** (no generation expansion): + +- **25-35 dialogue lines**: Bar greetings (5), district orientation/background sharing (8-10), Hael-related conversation (4-5), institutional/Commission discussion (3-4), deflection/evasion about Torek (5-6), confrontation responses (3-5) +- **15-20 trust-gated lines**: Peer-tier (institutional background, compliance schedules, Commission access details), secret-tier (if detective earns deep trust pre-contradiction — Sera's genuine feelings about the concealment, hints about what she found) +- **5-8 unprompted lines**: Sera volunteers district background (early), introduces topics or people (mid), steers conversations away from sensitive areas (late) +- **10-15 monologue lines per character**: + - Detective monologue about Sera: trust/relief (3), pattern observation (3-4), contradiction discovery (3-4), post-confrontation (3-5) + - Smuggler monologue about Sera: institutional categorization (2), avoidance notation (2-3 if observant), cautious assessment (2-3) +- **5-8 tell observation lines**: Avoidance pattern (3 — one per departure), topic deflection (2), overcompensation helpfulness (2), extended kiosk time (1) +- **3-5 contradiction discovery lines**: The third departure from multiple angles (detective noticing the pattern, monologue reaction, follow-up dialogue about Torek) + +--- + +## Authoring Notes + +- **Sera's voice**: Competent, slightly wry, conversational but precise. Uses complete sentences. Doesn't waste words but isn't as terse as Kael — Sera explains things, provides context, frames information. Professional warmth, not casual warmth. When deflecting, Sera doesn't go silent — she redirects. The redirect itself is the tell. +- **The avoidance pattern** must be established through THREE observed departures, not one. The detective's training recognizes patterns, not anomalies. One departure is nothing. Two is coincidence. Three is data. The pacing must allow all three departures within the vertical slice timeframe. +- **Hael references**: Sera mentions Hael naturally, warmly, frequently. "Hael says the kids are doing better with the new curriculum." "Hael's worried about something at home — didn't want to pry." This establishes the friendship's depth before it becomes load-bearing. +- **Commission background**: Sera shares institutional details casually — compliance schedules, liaison rotation, kiosk access patterns. This is helpful (gives the detective real information) AND establishes Sera's access level (the detective later realizes Sera COULD have found what she found). +- **Deflection dialogue** (post-contradiction): Sera doesn't lie outright. She deflects: "He's just loud." "I don't like that crowd." "It's nothing." The deflections are plausible. The detective's training is what elevates them from excuses to tells. +- **Dual-lens discipline**: Every Sera line must work for BOTH the detective (who sees a trusted friend and institutional ally) AND the smuggler (who sees a Commission employee in the social landscape). The same sentence lands differently per character. When Sera says "I ran the usual calibration checks today," the detective hears routine work. The smuggler hears "Commission is still active in the district." + +--- + +**End Sera Venn Profile**. This is the full Tier 1 production depth. Parallels Kael Davan (smuggler's FRIEND) with different contradiction mechanics: cumulative pattern recognition vs. single spatial observation, institutional concealment vs. operational security breach, slow doubt vs. sudden alarm. diff --git a/docs/wiki/npcs/sess.md b/docs/wiki/npcs/sess.md new file mode 100644 index 000000000..0d9efaa12 --- /dev/null +++ b/docs/wiki/npcs/sess.md @@ -0,0 +1,47 @@ +# Sess + +**Tier 3 NPC** | The Last Shift (Bar) | Flat + +--- + +## Essential Axes + +### Want + +Do the job. Go home. Don't get involved. + +Sess bartends evening shifts at The Last Shift under Lera Sessik. The work is steady, the tips are adequate, and the regulars are predictable. Sess has no ambitions beyond maintaining this equilibrium. In a district full of people with secrets, Sess's lack of hidden agenda is itself a kind of camouflage. + +### Routine + +**14:00 - 02:00**: Bar shift (arrives before opening, stays through close) +**Breaks**: Brief, in the back — Sess doesn't leave the bar during shift +**Off-days**: Home, personal time, no bar social life (Sess separates work from everything else) + +### Personality + +**Observant, discreet, laconic.** Sess sees everything from behind the bar — who drinks with whom, who avoids whom, who's spending too much, who's stressed, who's new. Sess processes this information but doesn't share it unprompted. Getting Sess to talk requires building trust over multiple visits, and even then, Sess offers fragments, not narratives. A good bartender hears everything. A great bartender remembers everything and says nothing. + +--- + +## Voice Hint + +*"What'll it be?"* [Minimal. Efficient. A question that doesn't invite conversation unless you offer it.] + +--- + +## Function Note + +Sess is the **ambient observer** — the social wallpaper who notices everything and says almost nothing. For the detective, Sess is a potential long-game source: repeated visits, consistent tipping, demonstrated trustworthiness might eventually unlock Sess's observations. For the smuggler, Sess is safe — a known quantity who doesn't gossip. Sess's function is atmospheric: proving that Sova Transit District has ordinary people living ordinary lives, and that the bar is a real place where real service workers show up and pour drinks. + +--- + +## Dual-Lens Notes + +**Smuggler**: Background. Safe. *"Sess is behind the bar. Good. Reliable, doesn't talk."* + +**Detective**: Potential source — eventual. *"The bartender. Sess. Sees the whole room every night. Getting them to share will take time."* + +--- + +**Cross-References:** [Lera Sessik](lera-sessik.md) diff --git a/docs/wiki/npcs/tav.md b/docs/wiki/npcs/tav.md new file mode 100644 index 000000000..d851c1a07 --- /dev/null +++ b/docs/wiki/npcs/tav.md @@ -0,0 +1,49 @@ +# Tav + +**Tier 3 NPC** | Smuggling Ring + Logistics Hub | Flat + +--- + +## Essential Axes + +### Want + +Do the watch. Don't get noticed. Prove useful. + +Tav is the ring's lookout — stationed at strategic positions during operations to watch for security patrols, unexpected personnel, or anything that shouldn't be where it is. The job is simple: watch, signal, move. Tav takes it seriously because it's the first responsibility anyone has trusted him with, and because the consequences of failure are immediate and severe. + +### Routine + +**Legitimate**: Irregular shift work at the logistics hub (cargo staging, equipment prep). Not a fixed roster — Tav picks up shifts as available, which gives him flexible hours that align conveniently with ring operations. + +**Ring operations**: Positioned at corridor intersections or freight bay entries during night-shift courier runs (1-2x per week). Watches for 30-60 minute windows. Signals Renn via lattice if a patrol approaches. + +**Off-duty**: Home or wandering the district. Tav doesn't drink at the bar — he's young, broke, and socially peripheral. + +### Personality + +**Quiet, watchful, nervous.** Tav is the youngest ring member (early 20s). He's hypervigilant during operations — every footstep sounds like a patrol, every shadow could be someone approaching. This nervous energy is his strength (nothing gets past him on watch) and his weakness (the anxiety is visible to anyone who knows what to look for). + +--- + +## Voice Hint + +*"Clear. South corridor, no movement for the last twenty minutes. You're good."* [Short, precise, slightly breathless] + +--- + +## Function Note + +Tav is the **peripheral ring member** — the person at the lowest level of the organization who sees the physical movement of operations without understanding the structure above him. For the smuggler, Tav is a reliable set of eyes. For the detective, Tav is a loitering youth in the wrong place at the wrong time — easily explained away as a lost worker, but suspicious if the detective is already tracking corridor movement patterns. Tav is also the ring member most likely to be caught and least likely to have useful information — he knows routes, not names. Catching Tav reveals a thread but not the tapestry. + +--- + +## Dual-Lens Notes + +**Smuggler**: Trusted lookout. Known quantity. *"Tav's on watch. Good — he doesn't miss anything."* + +**Detective**: Loitering youth. Anomaly if context is right. *"Young worker. Irregular shift. Seen near freight corridors outside his posted hours. Probably nothing. Filing it."* + +--- + +**Cross-References:** [Renn](renn.md), [Devra](devra.md) diff --git a/docs/wiki/npcs/torek-lintar.md b/docs/wiki/npcs/torek-lintar.md new file mode 100644 index 000000000..64f9fefbf --- /dev/null +++ b/docs/wiki/npcs/torek-lintar.md @@ -0,0 +1,113 @@ +# Torek Lintar + +**Tier 2 NPC** | The Last Shift (Bar) + Logistics Hub | Mundane + +--- + +## Core Identity + +**Name**: Torek Lintar +**Age**: 29 +**Role**: Dock worker (day shift) and bar regular +**System Origin**: Krenn System, Station Sova +**Lattice Tier**: Baseline (recently upgraded accessories — visible and notable) +**Employer**: Sova Logistics Consortium + +--- + +## 10-Axis Profile + +### 1. Want + +**Primary**: Enjoy the good life while it lasts. + +Torek is young, single, and for the first time in his life has money beyond rent and food. The source of that money is ambiguous — even to the player. It could be ring income (Torek handles dock inspections and could be receiving payments for looking away), a side hustle (freelance freight brokering), or an inheritance (an aunt on Krenn Prime who passed recently). The ambiguity is load-bearing: Torek's spending is a tell, but what it tells depends on the truth the player never fully confirms. + +**Secondary**: Be seen. Be liked. Be the generous one. + +Torek buys rounds. Tips well. Has a new jacket. Latest lattice accessories. He's performing generosity — and the performance is the problem. In a district where everyone knows everyone's salary, visible wealth is a signal that demands explanation. + +### 2. Secret / Vulnerability + +**Surface secret**: Spending beyond a standard dock worker's means. Visible to everyone at the bar. + +**Deep secret**: The source of Torek's money. The game deliberately doesn't confirm this for the player. Torek might be ring-compensated (paid for inspection negligence), might have legitimate supplementary income, or might be spending an inheritance unwisely. The investigation can reach any of these conclusions depending on the evidence path. + +**Vulnerability**: Visibility. Torek can't help being noticed. His spending makes him a target for the detective (financial tell), a liability for the smuggler (exposure risk), and a subject of gossip for everyone else. + +### 3. Relationships + +**Lera Sessik**: Bar owner. Torek is one of her best customers. She appreciates the spending, worries about the attention it draws. + +**Olin**: New arrival. Torek has been friendly to Olin (buys them drinks, offers bar introductions). Could be genuine hospitality or could be cultivating someone new. + +**Harek**: Card game partner. They play regularly at the bar. Torek usually wins — which is itself notable, given Harek's longer experience. + +### 4. Tolerance Threshold + +**Low**. Torek isn't built for pressure. He's enjoying a good time and hasn't thought much about consequences. If confronted about his spending by the detective, Torek gets defensive, then nervous. If pressured by the ring (if he's ring-connected) to be less visible, he complies resentfully but can't actually change his habits. + +### 5. Daily Routine + +**06:00 - 14:00**: Day shift at logistics hub (dock inspection and cargo handling) +**14:00 - 14:30**: Shift transition — walks to bar district +**14:30 - 20:00**: The Last Shift (primary social hours — drinks, card games, socializing) +**20:00+**: Home or extended bar session on end-of-cycle days + +### 6. Information Inventory + +**Knows**: Hub operations (dock procedures, inspection protocols, shift patterns), bar social dynamics, who's a regular, who's new. If ring-connected: which containers don't get inspected carefully. + +**Doesn't know**: Ring structure (even if compensated, Torek would know only his handler, not the organization), manifest details, Kael's exit attempt, Sera's compliance check, the detective's investigation scope. + +### 7. Contentment + +**High** — for now. Torek is living his best version of life on Sova. Money, friends, status at the bar. This contentment is fragile because it depends on income that may not be sustainable and visibility that's attracting the wrong attention. + +### 8. Personality Traits + +**Primary: Generous** — buys rounds, tips well, shares freely. Whether this is genuine warmth or performance is part of his ambiguity. +**Secondary: Careless** — doesn't think about consequences. Lives for the immediate. +**Tertiary: Social** — needs to be around people. The bar is his second home. + +### 9. Tell System + +| Tell | Trigger | Observable To | +|------|---------|---------------| +| **Visible spending** | Buying rounds, new accessories, generous tips | Everyone at the bar. Detective (financial tell). Smuggler (exposure risk). | +| **Gets loud after drinks** | 3+ drinks — volume increases, stories get bigger, discretion decreases | Lera (worried), Sera (leaves), Detective (observing behavioral patterns) | +| **Defensive when questioned about money** | Anyone asks directly about his income or spending | Detective (confrontation opportunity), bar regulars | + +### 10. Skill Set + +**Occupational**: Dock inspection, cargo handling, freight procedures. +**Combat tag**: **No**. Torek avoids trouble. +**Lattice capability**: Baseline with aftermarket accessories (social/entertainment upgrades, not professional). + +--- + +## Voice Sample + +**Mood: Generous (baseline)** +- *"Next round's on me. No — don't argue. What's the point of working the docks if you can't buy your friends a drink?"* + +**Mood: Defensive (pressed about money)** +- *"What, I can't treat myself? I work hard. Overtime pays. You want to see my pay stubs, or can I finish my drink?"* + +--- + +## Dual-Lens Notes + +**Smuggler**: Torek is a liability. His spending draws attention the operation can't afford. The smuggler reads Torek's generosity as a security risk. *"Torek's buying rounds again. He needs to calm down before someone starts asking questions."* + +**Detective**: Torek is a financial tell. A dock worker buying rounds and wearing new accessories flags immediately. The question is whether the money comes from something illegal or something mundane. *"Lintar, T. — dock worker. Spending pattern inconsistent with standard logistics salary. Worth a closer look."* + +--- + +## Triangle Roles + +**Triangle 3: Bar Tensions (Lera - Torek - Olin)** — The visible spender. Torek's generosity keeps the bar profitable but his visibility creates risk. Olin's arrival adds a variable — is Olin drawn by Torek's spending, or is that coincidental? Lera is caught between welcoming the money and worrying about the attention. + +--- + +**Cross-References:** [Lera Sessik](lera-sessik.md), [Olin](olin.md), [Harek](harek.md), [Sera Venn](sera-venn.md) diff --git a/docs/wiki/npcs/voss.md b/docs/wiki/npcs/voss.md new file mode 100644 index 000000000..03969e70c --- /dev/null +++ b/docs/wiki/npcs/voss.md @@ -0,0 +1,120 @@ +# Voss + +**Tier 2 NPC** | Logistics Hub (The Terminal) | Mundane + +--- + +## Core Identity + +**Name**: Voss +**Age**: 46 +**Role**: Shift supervisor, Sova Transit District Logistics Hub +**System Origin**: Krenn System, Station Sova (born and raised) +**Lattice Tier**: Baseline +**Employer**: Sova Logistics Consortium + +--- + +## 10-Axis Profile + +### 1. Want + +**Primary**: Keep his shift running without incident. + +Voss has supervised the day shift for 11 years. He's good at logistics — schedules, manifests, personnel management. He takes pride in clean handoffs and zero incident reports. The smuggling operation complicates this because it introduces variables he can't control, but the cut he receives smooths the rough edges of a supervisor's salary. + +**Secondary**: Maintain authority despite being undermined by Nils. + +Voss is the shift supervisor. Nils Davan (Kael's older sibling, ring coordinator, off-stage in v0.1) gives orders through intermediaries that Voss is expected to follow. Voss resents this — he has positional authority on the floor, but the ring's needs override his scheduling decisions. He complies because the money is good and because refusing Nils has consequences he doesn't want to test. + +### 2. Secret / Vulnerability + +**Surface secret**: Takes a cut from the ring to smooth inspections and schedule coverage windows. Most hub workers suspect this; nobody says it. + +**Deep secret**: Voss is terrified that the escalating volume will get him caught. He's been shift supervisor long enough that any investigation into the hub's operations will start with him. He has no exit strategy. + +**Vulnerability**: Institutional exposure. Voss is the most visible member of the ring's logistics chain. If the detective follows the manifest trail, it leads to the shift supervisor's schedule first. + +### 3. Relationships + +**Kael Davan**: Subordinate, ring colleague. Voss respects Kael's competence but resents taking orders (via Nils) from someone who technically works under him. Functional, tense. + +**Nils Davan** (off-stage): Ring coordinator. Voss's real boss for ring operations. Voss resents Nils but fears the consequences of refusal. The relationship is compliance, not loyalty. + +**Maret Korr**: Freight scheduler. Voss needs Maret functioning and quiet. Maret is smart enough to notice discrepancies, and Voss is aware she's noticed. He manages her through professional attention — making sure she feels valued, heard, but never asked to look deeper. + +### 4. Tolerance Threshold + +**Moderate-high**. Voss has been doing this for years and can handle routine pressure. What he can't handle is escalation — higher volume, tighter windows, more risk. Nils pushing for bigger shipments is what keeps Voss awake at night. If an investigation reaches his desk, Voss will cooperate with whoever offers the best deal. He's pragmatic, not loyal. + +### 5. Daily Routine + +**05:45**: Arrives at hub, reviews shift manifest +**06:00 - 14:00**: Day shift supervision +**10:30**: Break room, coffee, reviews afternoon handoff notes +**14:00 - 14:30**: Shift transition, handoff to swing supervisor +**14:30 - 16:00**: Occasional bar visit (not a regular — Voss drinks at home) +**Ring operations**: Adjusts schedules as needed to create coverage windows. Does this during normal scheduling — invisible unless you know what to look for. + +### 6. Information Inventory + +**Knows**: Ring structure (not leadership details, but operational flow), schedule manipulation patterns, which inspectors are compromised, Maret's growing suspicion, Kael's reliability, Drin's gambling debt. + +**Doesn't know**: Kael's exit attempt, Sera's compliance check, the detective's investigation focus, Pell's wavering. + +### 7. Contentment + +**Moderate-low**. Voss had a functional life before the ring escalated. The extra money was welcome. The extra risk is not. He's a man who wanted a quiet career and ended up as the load-bearing wall in a smuggling operation. + +### 8. Personality Traits + +**Primary: Cautious** — overthinks, plans for contingencies, hates surprises. +**Secondary: Resentful** — feels trapped between institutional responsibility and criminal obligation. +**Tertiary: Professional** — despite everything, runs a clean shift on the legitimate side. + +### 9. Tell System + +| Tell | Trigger | Observable To | +|------|---------|---------------| +| **Nervous schedule adjustments** | Ring requests schedule change; Voss reprocesses manifests multiple times | Maret (sees the rework), Detective (if tracking manifest revision patterns) | +| **Clipped responses to Kael** | Nils has given orders Voss disagrees with | Smuggler, Resha, other hub workers | +| **Avoids break room during ring operations** | Doesn't want to be seen idle when containers are being rerouted | Detective (if tracking Voss's routine deviations) | + +### 10. Skill Set + +**Occupational**: Shift management, freight logistics, manifest processing, personnel scheduling. +**Combat tag**: **No**. Voss avoids confrontation physically and socially. +**Lattice capability**: Baseline. + +--- + +## Voice Sample + +**Mood: Professional (baseline)** +- *"Manifest's clean for the morning run. Let's keep it that way. Resha, you're on Bay 3. Kael, take the overflow from yesterday."* + +**Mood: Stressed (post-schedule manipulation)** +- *"Just — follow the schedule I posted. I don't need questions about why Bay 7 is offline during transition. It's maintenance. That's all."* + +**Mood: Resentful (to himself, about Nils)** +- *"Another 'adjustment.' Like I don't have enough to manage without reworking the whole rotation at the last minute."* + +--- + +## Dual-Lens Notes + +**Smuggler**: Knows Voss is compromised and stressed. Reads Voss's schedule changes as operational signals. Voss is management to navigate, not a friend. *"Voss is tense today. Nils must have changed the window again."* + +**Detective**: Sees an experienced shift supervisor who's anxious about something. Schedule irregularities are the first data point. Voss is the institutional face of the hub — any investigation starts here. *"The shift supervisor — Voss. Runs a tight operation on paper. But he reworks manifests more than the workload justifies."* + +--- + +## Triangle Roles + +**Triangle 1: Hub Power (Voss - Kael - Nils)** — The authority figure who isn't really in charge. Voss has the title; Nils has the power. Kael is caught between. Voss's resentment toward the Davan siblings is professional and personal. + +**Triangle 2: Worried Knowledge (Maret - Drin - Voss)** — The manager who needs everyone quiet. Maret notices too much. Drin is compromised and might crack. Voss has to keep both functional and silent without revealing why. + +--- + +**Cross-References:** [Kael Davan](kael-davan.md), [Maret Korr](maret-korr.md), [Drin](drin.md), [Resha](resha.md) diff --git a/docs/wiki/technology/clone-transfer.md b/docs/wiki/technology/clone-transfer.md new file mode 100644 index 000000000..d5a26697d --- /dev/null +++ b/docs/wiki/technology/clone-transfer.md @@ -0,0 +1,133 @@ +# Clone Transfer + +**Type:** Core Technology +**Status:** Canonical +**Scope:** Death mechanics, identity persistence, backup systems +**Also Known As:** Re-embodiment (formal), "getting a new body" (colloquial) + +--- + +## Overview + +Clone transfer is the technology that makes death temporary in the Settled Reach — for those who can afford it and maintain their backups. A person's neural state is periodically backed up to a secure facility. If the original body dies, the backed-up state is transferred to a cloned body. The person wakes up in a new body with memories intact up to their last backup. + +Everything since the last backup is lost. + +This is the core of the death mechanic: death is not game over. Death is information loss. And in a game built on asymmetric information, losing what you've learned is worse than losing a body. + +--- + +## How Clone Transfer Works + +**The backup process:** +1. The bearer visits a registered backup facility (typically institutional — Commission, medical center, or licensed private provider) +2. Neural state is captured via lattice interface — memories, learned skills, relationship data, personality patterns +3. The backup is stored securely, encrypted, institutionally managed +4. Backup frequency varies: wealthy individuals back up daily; working-class citizens back up weekly, monthly, or less + +**The transfer process (on death):** +1. Death is confirmed (biological cessation of original body) +2. Most recent backup is retrieved from secure storage +3. A clone body is prepared (grown in advance or accelerated-growth, depending on tier) +4. Neural state is transferred to the clone body +5. The individual wakes up in the new body with memories up to their last backup point + +**The gap:** Everything between the last backup and death is gone. Conversations. Discoveries. Relationships formed. Deals struck. Evidence collected. If the detective backs up on Monday and dies on Thursday, three days of investigation vanish. If the smuggler backs up before a run and dies during it, they don't remember the run at all. + +--- + +## Body Types + +Clone bodies are not all equal. + +**Standard clone:** Biological replica of the original body at a baseline state. No enhancements beyond the original genetic template. This is what most people receive — functional, healthy, unremarkable. + +**Enhanced clone:** Improved biological specifications — better muscle density, faster neural pathways, optimized organ function. Available through institutional channels (military, intelligence, wealthy dynasties) or high-end private providers. + +**Custom bodies:** In the wider Settled Reach, some individuals change body specifications with each transfer — different appearance, different physical capabilities, different sex. Identity becomes fluid when the body is replaceable. This is more common in cosmopolitan core systems than in working-class stations like Sova. + +**v0.1 scope:** Clone transfer is referenced technology, not a gameplay mechanic. No character dies and is re-embodied during the vertical slice. But the *possibility* of death-as-information-loss shapes how the player treats risk, and backup status shapes NPC behavior (someone without a recent backup is more cautious). + +--- + +## The Cost Problem + +Clone transfer is not free. Backup storage requires institutional infrastructure. Clone bodies require biological manufacturing. Transfer requires specialized medical facilities. All of this costs money, and all of it is regulated. + +**Institutional access:** Commission employees, Concord Assembly staff, military personnel, and corporate workers typically have backup coverage as an employment benefit. Their backups are regular, their clone bodies pre-grown, their transfer priority high. + +**Civilian access:** Independent workers, freelancers, and small-business owners must pay out of pocket. Backup frequency drops with income. A dock worker on Station Sova might back up monthly — or less. The cost is a line item they weigh against food, rent, and lattice maintenance. + +**The uninsured:** Some people in the Reach have no backup at all. Death, for them, is final. This is rare but not unknown, particularly on frontier stations or among populations that reject the technology for cultural or philosophical reasons. + +**The implication:** Clone transfer creates a mortality gradient. Wealthy people with daily backups lose hours if they die. Working-class people with monthly backups lose weeks. People without backups lose everything. Death is not equal in the Settled Reach — it's proportional to your economic status. + +--- + +## Clone Transfer and Identity + +Let me complicate this: if your body dies and a new body wakes up with your memories, is it *you*? + +Most people in the Settled Reach say yes. The legal system treats the transferred individual as the same person — same rights, same obligations, same identity. Continuity of neural state is continuity of self. This is settled law and settled culture. + +But not everyone agrees. Some philosophical and religious traditions hold that the transferred individual is a copy, not the original — that something essential is lost in the gap. The Guardians of Autonomy (see [Severance Technology](severance-tech.md)) incorporate this skepticism into their broader critique of lattice-mediated identity. + +On Station Sova, this debate is abstract. People here worry about backup costs, not metaphysics. But the philosophical undercurrent exists, and it surfaces in unexpected places — a dock worker who insists on doing dangerous work precisely because their backup is stale and death would mean something, or an NPC who becomes reckless after a recent backup because they feel temporarily invincible. + +--- + +## Death as Information Loss + +From D-008: "Death = information loss, not game over. Memory cell backup system means death costs you everything since your last backup. Lost knowledge, lost relationships, lost deals. The storyteller knows what you've lost and can exploit it." + +**What the player loses on death:** +- All knowledge gained since the last backup (facts, entity observations, relationship changes) +- Progress on investigation threads +- Trust built with NPCs (they remember you, but you don't remember the last conversation) +- Spatial knowledge (locations discovered, routes mapped) + +**What the player keeps:** +- Everything from before the backup (base knowledge, established relationships, background facts) +- Their character's fundamental identity and capabilities +- Their lattice tier and equipment (new clone body, same tier lattice installed) + +**What the storyteller gains:** Knowledge of what the player lost. The storyteller (D-005, Rimworld-style AI pacing) knows exactly which threads were severed by death. It can reintroduce the same NPCs, the same situations, the same evidence — but now the player doesn't remember the context. The NPC who was about to betray you? They still remember your conversation. You don't. + +--- + +## Dual-Lens Significance + +**The smuggler** has a working-class backup schedule — maybe monthly, maybe less. Death on the job would cost them weeks of operational knowledge, social capital, and relationship maintenance. This makes the smuggler risk-averse in a way that isn't cowardice — it's rational calculation. Getting killed during a run doesn't just end the run; it erases the relationships that make the next run possible. + +**The detective** has institutional backup coverage — regular, reliable, potentially daily. Death costs them investigation progress but not foundational capabilities. This doesn't make the detective reckless, but it shifts their risk calculus. Losing three days of fieldwork is painful; losing their life permanently is not on the table. The detective can afford risks the smuggler can't. + +**The asymmetry:** The smuggler fears death more because it costs them more. The detective fears failure more because their institution is watching. Same mortality technology, different stakes, different behavior. + +--- + +## Mechanical Integration + +**v0.1 Scope:** +- Clone transfer is lore and NPC dialogue content, not a playable mechanic +- No player death-and-resurrection cycle in the vertical slice +- Backup status may appear as NPC behavioral context (cautious vs. reckless correlating to backup freshness) + +**Future Scope (D-008):** +- Death triggers knowledge graph rollback to last backup state +- Storyteller exploits knowledge gaps created by death +- Backup timing becomes a strategic decision (back up frequently = safe but institutional; back up rarely = risky but independent) +- Body type selection on transfer (if implemented) + +--- + +**Cross-References:** +- [Neural Lattice](neural-lattice.md) — Lattice enables the backup process +- D-008: Action pillar (death = information loss, hubris wall) +- D-005: Core concept (asymmetric information — death removes information) +- D-041: Knowledge graph (backup state = snapshot of knowledge graph) + +--- + +**Status:** Canonical — death and identity mechanics +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/technology/founder-gates.md b/docs/wiki/technology/founder-gates.md new file mode 100644 index 000000000..d4821a64d --- /dev/null +++ b/docs/wiki/technology/founder-gates.md @@ -0,0 +1,114 @@ +# Founder Gates + +**Type:** Interstellar Transit Infrastructure +**Status:** Canonical +**Scope:** Interstellar transit (between star systems) +**Also Known As:** Horizon Gates +**Origin:** Pre-human / alien construction (exact provenance debated) + +--- + +## Overview + +Founder Gates — formally Horizon Gates, colloquially "founder gates" — are the interstellar transit network that makes the Settled Reach possible. They connect star systems across light-years of void, enabling the trade, communication, and political structures that bind hundreds of worlds into a functioning civilization. + +Where [span gates](span-gates.md) handle intra-system logistics, founder gates define the shape of interstellar space. Which systems connect to which determines trade routes, political alliances, strategic significance, and cultural exchange. The gate network is the map of the Reach. + +--- + +## Origin and Nature + +Founder gates predate human settlement of the Reach. They were discovered, not built. Their construction is attributed to a precursor civilization — the "Founders" — about whom almost nothing is confirmed. The gates were operational when the first human explorers arrived. They have remained operational since, without observed maintenance or degradation. + +**What is known:** +- Gates are paired — each connects exactly two star systems +- The connection is stable and persistent (no observed failures in recorded history) +- Transit is near-instantaneous +- The technology is not understood well enough to replicate or modify +- New gates have never been observed appearing or being created + +**What is debated:** +- Whether the Founders are extinct, departed, or still present elsewhere +- Whether the gate network was designed as a system or accumulated over time +- Whether the gates serve purposes beyond transit (communication, observation, something else) +- Whether the Interstitium (see below) is an artifact of gate technology or something independent + +These questions are academic in the Krenn System. Workers on Station Sova don't think about Founder Gate metaphysics. They think about freight schedules. + +--- + +## The Interstitium + +The space between gate endpoints — the transit experience itself — is called the Interstitium. Travelers report it as brief: a moment of disorientation, a sense of distance compressed, then arrival. Some describe it as darkness. Some describe light. Accounts vary in ways that resist standardization. + +**In gameplay terms:** The Interstitium is the experience of crossing between star systems. In the wider Settled Reach, this is a regular occurrence — merchants, travelers, military, diplomats all traverse founder gates. In v0.1, the player never leaves the Krenn System, so founder gates are referenced in dialogue and lore but not directly experienced. + +**Cultural significance:** The Interstitium is one of the few shared experiences that resists technological explanation. In a civilization built on understood technology, the gates are a reminder that not everything is known. Some cultures treat transit as mundane. Others invest it with spiritual significance. The Krenn System's pragmatic culture falls firmly in the "mundane" camp. + +--- + +## The Gate Network and the Settled Reach + +The Settled Reach exists because founder gates exist. Human civilization spread along the gate network the way ancient civilizations spread along rivers and coastlines — following the infrastructure that was already there. + +**Political implications:** +- Systems with many gate connections are politically significant (hub systems) +- Systems with few connections are peripheral (frontier systems) +- Controlling a gate doesn't mean controlling transit — the gates don't have off switches — but controlling the infrastructure around a gate (stations, docks, inspection points) means controlling what moves through +- The Concord Assembly's authority rests partly on its management of gate-adjacent infrastructure + +**The Krenn System** sits at the intersection of three regional trade routes — not because of strategic planning, but because the founder gate network happens to connect Krenn to three directions. This accident of alien infrastructure made Krenn a logistics node. + +--- + +## Founder Gates vs. Span Gates + +| Property | Founder Gates | Span Gates | +|----------|--------------|------------| +| **Scale** | Interstellar (light-years) | Intra-system (AU) | +| **Origin** | Pre-human, alien construction | Human-built technology | +| **Understood?** | Partially — operational use, not underlying mechanism | Fully — well-understood engineering | +| **Modifiable?** | No — cannot be altered, duplicated, or deactivated | Yes — new span gates can be built, routes adjusted | +| **Replicable?** | No | Yes | +| **Cultural weight** | Significant — reminder of the unknown | Mundane — just infrastructure | + +--- + +## Dual-Lens Significance + +Founder gates are not directly present in the v0.1 gameplay space — the player never transits one. But they shape the world the player inhabits. + +**The smuggler** knows that contraband arrives through the founder gate network from other star systems. The supply chain starts somewhere outside Krenn — Syndic-adjacent manufacturing in another system, routed through founder gates to reach Sova. The smuggler understands their position in a supply chain that spans star systems, even if they've never left Krenn. + +**The detective** knows that the investigation doesn't end at Station Sova. The off-station coordinator (Sabel) operates through the founder gate network. Following the supply chain to its origin means following it through founder gates to other systems. In v0.1, that's beyond scope — but the detective's case file knows the thread doesn't stop here. + +**The larger implication:** Founder gates connect the v0.1 setting to the wider Settled Reach. They're the promise that there's more out there — more systems, more factions, more complications. The ring on Station Sova is a local operation connected to an interstellar supply chain. The story doesn't end at the system boundary. + +--- + +## Mechanical Integration + +**v0.1 Scope:** +- Founder gates are referenced in dialogue, monologue, and lore — not traversed +- `world.syndic_supply_chain` fact references off-system origins (KnowsDetails: "serial number patterns suggest two sources") +- `contraband.supply_chain` fact traces cargo arrival through interstellar routes + +**Future Scope:** +- Founder gate traversal is a potential 3D cutscene moment (D-019: camera change to 3D is the dramatic signal) +- Multiple star systems as separate maps connected by founder gates (D-008: multiple maps, step through a wormhole, load a new place) +- The Interstitium as experiential content + +--- + +**Cross-References:** +- [Span Gates](span-gates.md) — Intra-system transit (human-built) +- [Krenn System](../world/krenn-system.md) — Gate network connections for v0.1 setting +- D-008: Action pillar (multiple maps connected by wormholes) +- D-019: 3D cutscenes for key moments (wormhole traversal) +- D-005: Core concept (wormhole network as traversable infrastructure) + +--- + +**Status:** Canonical — interstellar transit infrastructure +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/technology/meridian.md b/docs/wiki/technology/meridian.md new file mode 100644 index 000000000..0bfdb796d --- /dev/null +++ b/docs/wiki/technology/meridian.md @@ -0,0 +1,129 @@ +# Meridian + +**Type:** Infrastructure Technology +**Status:** Canonical +**Scope:** Station-wide / system-wide information network +**Access:** Via [neural lattice](neural-lattice.md) (universal) + +--- + +## Overview + +The Meridian is the ubiquitous information network of the Settled Reach — the data layer that connects people, systems, and institutions. Every neural lattice interfaces with the Meridian. It carries communications, provides location services, streams institutional data, hosts professional toolkits, and mediates most of the information flow in civilized space. + +Think of it as the nervous system of a station. The lattice is the individual's interface; the Meridian is the network everything connects to. + +--- + +## What the Meridian Provides + +**Communication:** Person-to-person messaging, group channels, institutional notifications. The primary way people coordinate across a station. Faster than walking, less personal than conversation. + +**Location Services:** Lattice-to-Meridian pings allow tracking of individuals (with appropriate access). Law enforcement and Commission personnel can query locations of active lattice signatures. Civilians see friend/colleague locations if mutually opted in. + +**Institutional Systems:** Freight manifests, shift schedules, compliance records, Commission databases, station administration — all run through Meridian infrastructure. A freight scheduler's professional toolkit connects to Meridian to pull container data. A Commission liaison queries Meridian for lattice compliance records. + +**Environmental Data:** Station status, atmosphere readings, power grid status, gate cycle schedules. Background information that most people ignore until something goes wrong. + +**Entertainment & Social:** Music feeds, news tickers, social channels. The ambient hum of connected life. Lera's bar runs Meridian music feeds. The news ticker that delivers wow moment #5 runs through Meridian. + +--- + +## Coverage Gradients + +Meridian coverage is not uniform. This is load-bearing for gameplay. + +| Zone | Coverage Level | What Works | What Doesn't | +|------|---------------|------------|--------------| +| **Logistics Hub** | Comprehensive | Real-time tracking, manifest systems, full surveillance, professional toolkits | Nothing — full coverage | +| **Bar District** | Strong | Standard social monitoring, Meridian feeds, communication, music | Fine-grained tracking may lag | +| **Residential Pods** | Standard | Personal lattice connectivity, messaging, basic services | Professional toolkits may not stream smoothly | +| **Maintenance Corridors** | Degraded | Intermittent connectivity, delayed messages, patchy location data | Real-time tracking unreliable, professional toolkits offline | +| **Between-Wall Spaces** | Minimal or Absent | Little to nothing | Everything — effectively off-grid | + +**Why the gaps exist:** Station Sova is 140 years old with layered construction. Meridian infrastructure was installed for the station as designed, not as it was subsequently retrofitted. Older sections between construction eras were never properly wired. Maintenance corridors have basic repeaters that degrade over time and get low priority for replacement. + +**Why the gaps matter:** The smuggling ring operates in Meridian dead spots. Corridor B-7 has zero Meridian signal — no tracking, no surveillance, no logged communications. When NPCs need to discuss something they don't want recorded, they go for a walk to the "quiet spots." The ring's entire operational infrastructure depends on these coverage gaps. + +--- + +## Meridian and Surveillance + +The Meridian is, among other things, a surveillance system. Not a secret one — everyone knows their lattice pings their location, that communications are logged, that institutional queries leave traces. This is accepted infrastructure, not conspiracy. + +**What the Meridian records:** +- Lattice location pings (periodic, not continuous — enough for general tracking, not step-by-step) +- Communication metadata (who contacted whom, when, duration — not content for civilian channels) +- Institutional system access logs (who queried what manifest, who accessed what database) +- Environmental sensor data (motion, temperature, atmosphere — infrastructure monitoring, not surveillance per se) + +**What the Meridian doesn't record:** +- Conversations held in person (no ambient audio capture in civilian areas) +- Physical movements in degraded coverage zones +- Lattice-to-lattice direct connections (peer-to-peer, off-Meridian, short range) + +**The surveillance paradox:** The Meridian makes institutional oversight possible but not automatic. The data exists — but someone has to look at it, query it, cross-reference it. The detective can query Meridian logs to track NPC movements. But the detective has to know what to look for. The data doesn't investigate itself. + +This is why the detective's Analytical lattice matters: it automates some of the cross-referencing that would otherwise require manual queries. And it's why [Severance technology](severance-tech.md) is so threatening to institutions — it creates zones where the Meridian's passive data collection simply stops working. + +--- + +## Meridian and the Three-Range Sound Model + +The Meridian connects to the game's three-range information model: + +| Range | Meridian Role | Trust Level | +|-------|--------------|-------------| +| **Close** (in/near LOS) | Not involved — raw sensory data | High — your own perception | +| **Medium** (outside LOS, nearby) | Partial — lattice processes ambient data | Moderate — sensory impression augmented by lattice | +| **Long** (across map) | Primary — insert notifications, location alerts, text messages | Low — network-dependent, spoofable, manipulable | + +Long-range information flows through the Meridian. This means it can be intercepted, delayed, falsified, or blocked. An NPC sending you a tip via Meridian messaging is using a channel that someone else could monitor. A location ping could be masked. A news ticker update runs through Meridian infrastructure that has its own editorial filters. + +The further information travels from direct perception, the more the Meridian mediates it — and the less you should trust it. + +--- + +## Dual-Lens Significance + +**The smuggler** uses the Meridian the way everyone does — messaging, navigation, checking shift schedules. They know where the dead spots are from years of living here. Meridian gaps aren't mysterious to the smuggler; they're just the parts of the station where your messages don't send and you learn to have conversations in person. The smuggler navigates Meridian coverage intuitively. + +**The detective** uses the Meridian as an investigative instrument. Querying location logs, cross-referencing communication metadata, mapping coverage gaps as potential operational infrastructure. The detective sees dead spots as evidence — if someone consistently moves through degraded-coverage zones, that's a data point. The Meridian is a forensic tool, not just an amenity. + +**The tension:** The smuggler knows the social geography of Meridian coverage — who goes where and why. The detective knows the data geography — what's logged and what's not. Both are right. Neither has the complete map. + +--- + +## Mechanical Integration + +**Knowledge Graph:** +- `location.surveillance_gaps` — Meridian coverage gaps as discoverable knowledge (detective: KnowsOf when augmented lattice detects gaps; smuggler: KnowsDetails from operational experience) +- `location.corridor_b7_restricted` — Direct confidence gates monologue: "Zero Meridian signal in this section" + +**Perception System:** +- Meridian feeds are one input to the insert minimap (D-013) +- Camera feed perception mode (D-017, Enhanced tier+) accesses Meridian-connected surveillance +- Meridian tracking mode (D-017, Enhanced tier+) queries lattice location pings +- Coverage degradation affects which perception modes function in a given area + +**Information Boundaries:** +- Meridian coverage level determines what long-range information is available in a zone +- Dead spots are zones where information boundary queries return nothing — even for characters with Enhanced lattices +- This maps directly to D-010's principle: information boundaries are universal + +--- + +**Cross-References:** +- [Neural Lattice](neural-lattice.md) — Individual interface to the Meridian +- [Severance Technology](severance-tech.md) — Technology that blocks Meridian functions +- [Sova Transit District](../world/sova-transit-district.md) — Coverage map for v0.1 setting +- [Station Sova](../world/station-sova.md) — Station-wide infrastructure context +- D-017: Perception modes (camera feeds, tracking via Meridian) +- D-018: Three-range sound model (long range = Meridian-mediated) +- D-013: Diegetic insert navigation (Meridian-fed waypoints) + +--- + +**Status:** Canonical — station-wide information infrastructure +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/technology/neural-lattice.md b/docs/wiki/technology/neural-lattice.md new file mode 100644 index 000000000..a26085a23 --- /dev/null +++ b/docs/wiki/technology/neural-lattice.md @@ -0,0 +1,177 @@ +# Neural Lattice + +**Type:** Core Technology +**Status:** Canonical +**Prevalence:** Near-universal in the Settled Reach +**Regulatory Body:** Lattice Commission (Concord Assembly authority) + +--- + +## Overview + +The neural lattice is an integrated biotech implant — a web of processing nodes threaded through the human nervous system. It is the foundational technology of life in the Settled Reach. The lattice mediates how people perceive, communicate, work, and navigate. It connects its bearer to the [Meridian](meridian.md) information network, enables perception overlays, provides professional capability enhancement, and serves as the interface for nearly all institutional systems. + +Almost everyone in the Reach has one. The question isn't whether you have a lattice — it's what tier you can afford, who certified it, and what it lets you see that others can't. + +--- + +## Lattice Tiers + +Neural lattices exist on a capability spectrum. Tier determines what perception modes a character can access, what professional functions they can perform, and how they interact with institutional systems. + +| Tier | Capability | Perception Access | Typical Bearers | +|------|-----------|-------------------|-----------------| +| **Baseline** | Standard sensory processing, Meridian access, basic navigation overlay | Natural vision + carried gear only | Most civilians, laborers, service workers | +| **Enhanced** | Insert-based processing modes, camera feed access, audio analysis, professional toolkits | Camera feeds, Meridian tracking, audio analysis | Skilled professionals, technicians, institutional staff | +| **Analytical** | Advanced pattern recognition, multi-feed synthesis, forensic capability | All Enhanced modes + anomaly flagging, manifest cross-referencing | Investigators, Commission liaisons, senior institutional roles | +| **Higher** | Biononic integration, enhanced spectrum perception, passive environmental scanning | Thermal imaging through walls, extended spectrum, passive scanning | Military, intelligence operatives, ascended individuals | + +**Note:** "ANA-touched" capability (pattern recognition across all feeds, predictive awareness) exists in the wider Reach but is not present in the v0.1 setting. Station Sova's population is Baseline through Analytical. + +--- + +## How the Lattice Works + +The lattice is not a computer strapped to the brain. It's a distributed network of biocompatible nodes integrated throughout the nervous system during an implantation procedure, typically performed in early adulthood. The nodes communicate with each other and with external systems through the [Meridian](meridian.md) network. + +**Core functions:** +- **Sensory augmentation:** Overlays additional information onto natural perception — navigation markers, identity tags, environmental data +- **Meridian interface:** Provides access to the station-wide information network, including communication, data queries, and institutional systems +- **Professional toolkits:** Specialized processing packages for specific occupations (freight scheduling, medical diagnostics, forensic analysis, engineering oversight) +- **Perception modes:** Higher-tier lattices enable alternate ways of sensing the environment (see Perception Modes below) + +**What the lattice doesn't do:** +- It doesn't think for you. It processes and presents; you interpret and decide. +- It doesn't record everything. Memory remains organic. The lattice augments perception in the moment but doesn't create a perfect archive. +- It doesn't make you superhuman. Even an Analytical-tier lattice can be wrong, can be fed bad data, can miss what's happening behind a wall. + +--- + +## Perception Modes + +The lattice enables multiple perception modes — different ways of observing the world, each revealing different information with different trust and quality tradeoffs. What you see depends on what your lattice can process. + +### Baseline Modes (everyone) +- **Natural vision:** Detail, color, identity recognition. Blocked by walls. The default. +- **Navigation overlay:** Meridian-fed waypoints, location markers, basic environmental data. Only shows what you've learned or been told — not omniscient. + +### Enhanced Modes (Enhanced tier+) +- **Camera feeds:** Remote visual from fixed positions. Only where cameras exist. Feed can be spoofed or looped. Requires institutional access or an exploit. +- **Meridian tracking:** Location pings of known individuals via their active lattice signatures. Only tracks active inserts. Can be masked. Typically law enforcement or intelligence access. +- **Audio analysis:** Sound signatures processed into directional, classified data. No visual component. Trainable — improves with use. + +### Analytical Modes (Analytical tier+) +- **Anomaly flagging:** The lattice cross-references observed data against expected patterns and highlights discrepancies. The detective's lattice flags manifest weight mismatches. The smuggler's doesn't. +- **Multi-feed synthesis:** Combines multiple perception inputs into a unified analysis. Camera + audio + tracking data merged into a single picture. + +### Higher Modes (not in v0.1) +- **Thermal imaging:** Heat signatures through walls. Body count without identity. +- **Extended spectrum:** Perception beyond visible light. +- **Passive scanning:** Environmental data without active queries — the lattice listens to everything. + +**Key design principle:** Each perception mode is a query against the information boundary system. The engine doesn't distinguish between eyes, thermal sensors, and camera feeds — all are "given this sensor, what state is visible?" This means perception modes are playstyle selectors: a low-tier character sees a survival horror game; a high-tier character drowns in data. + +--- + +## Lattice and Identity + +Your lattice tier shapes how others treat you and how you experience the world. + +**A Baseline dock worker** on Station Sova sees the freight bay with their eyes, checks manifests on a wall terminal, and navigates by memory and habit. Their lattice provides Meridian messaging, basic navigation, and not much else. They know what they see and what people tell them. + +**An Enhanced freight scheduler** has professional toolkit overlays — container tracking, schedule management, weight-to-volume cross-checks. They see the same freight bay but with a data layer on top. Discrepancies that a Baseline worker wouldn't notice become visible. This is why Maret Korr, processing manifests, can see the weight mismatches but can't unsee them. + +**An Analytical investigator** arriving at the same freight bay sees a crime scene. The lattice flags anomalies automatically, cross-references NPC behavioral patterns against baseline data, and processes audio for stress markers. The detective doesn't just notice things — their lattice tells them what to notice. + +The honest truth is that lattice tier creates an information class system. People with better lattices see more of reality. People with Baseline lattices see only what's in front of them. This asymmetry is the engine of both gameplay and social tension. + +--- + +## Commission Regulation + +The Lattice Commission, operating under Concord Assembly authority, regulates all lattice technology in the Settled Reach. + +**What the Commission controls:** +- **Certification:** All lattice components must be Commission-certified before implantation or upgrade. Certification is expensive and slow. +- **Tier authorization:** Enhanced and Analytical tiers require institutional sponsorship or professional licensing. You can't just buy a better lattice — someone must vouch for your need. +- **Compliance inspections:** Quarterly sweeps check lattice signatures against certified configurations. Unauthorized modifications are flagged. +- **Violation categories:** + - Category 1: Administrative (expired certification, paperwork gaps) — fine + - Category 2: Unauthorized upgrade (unapproved components, tier mismatch) — fine + mandatory recertification + - Category 3: Unauthorized modification (aftermarket components, bypassed safety protocols) — fine + potential lattice restriction + +**The regulatory gap:** Commission certification costs more than most workers can afford. Enhanced-tier upgrades through legitimate channels require 6-12 month approval cycles and institutional sponsorship. Medical-grade replacements for degrading lattices follow the same bureaucratic timeline, even when the bearer's lattice is failing. + +This creates the market that the smuggling ring serves: people who need better lattice capability than Commission-regulated channels will provide, on a timeline their bodies and careers can't afford to wait for. + +--- + +## Lattice Degradation + +Neural lattices are biotech. They age. Nodes fail. Processing degrades. Over years and decades, a lattice that once ran cleanly begins to slow, to drop data, to miss what it once caught. + +**Degradation effects:** +- Perception overlays lag or flicker +- Meridian connectivity becomes intermittent +- Professional toolkits produce errors or fail to load +- In severe cases, sensory processing itself degrades — headaches, perception artifacts, disorientation + +**Replacement through legitimate channels** requires Commission certification, institutional medical authorization, and a 6-12 month approval cycle. Cost is prohibitive for most workers. + +**Replacement through the ring** uses [medical-grade components](../contraband/medical-grade-replacements.md) diverted from Syndic supply chains. Same quality. No certification paperwork. Available now, not in six months. + +This is why the ring has community support. They're not just smuggling luxury goods — they're providing healthcare that the legitimate system gates behind bureaucracy and institutional access. + +--- + +## Dual-Lens Significance + +The neural lattice is where the game's two playable characters diverge most sharply in their experience of the same world. + +**The smuggler** has a Baseline lattice — standard for a dock worker. They see the district through their own eyes, rely on social knowledge and personal experience, navigate by familiarity. Their lattice is a tool for work and communication, nothing more. When the smuggler handles contraband lattice components, they're handling something that could improve their own capabilities — or the capabilities of people they care about. + +**The detective** has an Analytical lattice — institutional issue, professional grade. They see the same district through a data overlay that flags anomalies, cross-references patterns, and processes behavioral cues. The lattice is an investigative instrument. It reveals things the smuggler's lattice can't see — but it also creates a false sense of omniscience. The detective's lattice can be fed bad data, can miss social context it wasn't trained on, can flag a nervous person as suspicious when they're just having a bad day. + +**The asymmetry:** The detective sees more data. The smuggler understands more context. Neither has the complete picture. The lattice doesn't create objectivity — it creates a different kind of subjectivity. + +--- + +## Mechanical Integration + +**Knowledge Graph:** +- `world.commission_regulations` — Commission regulatory framework (KnowsOf: detective knows from briefing; KnowsDetails: smuggler understands why black market exists) +- `contraband.lattice_components` — Contraband identification (detective needs KnowsOf to interpret manifest discrepancies) + +**Perception System (D-017):** +- Lattice tier determines which perception modes are available to a character +- Each mode is an observer query against the information boundary system +- v0.1 implements: natural vision cone + basic audio indicators + insert minimap +- Additional modes (camera feeds, tracking, thermal) are milestone features + +**Entity Attributes:** +- `faction` attribute on entities determines institutional lattice access +- `behavior_flags` can include `lattice_checking` (nervous behavior indicator) +- Detective's analytical lattice enables `tell_observed` and `contradiction_flagged` attributes + +**Contraband Connection:** +- The ring smuggles [unlicensed lattice components](../contraband/lattice-components.md) — aftermarket mods bypassing certification +- [Medical-grade replacements](../contraband/medical-grade-replacements.md) serve people with degrading lattices +- A smuggled upgrade could theoretically change what the player perceives — lattice tier is not just lore, it's mechanical + +--- + +**Cross-References:** +- [Meridian](meridian.md) — Information network accessed through the lattice +- [Lattice Components (Contraband)](../contraband/lattice-components.md) — Unlicensed aftermarket modifications +- [Medical-Grade Replacements (Contraband)](../contraband/medical-grade-replacements.md) — Diverted healthcare components +- [Severance Technology](severance-tech.md) — Counter-surveillance tech that blocks lattice functions +- [Station Sova](../world/station-sova.md) — Commission presence and enforcement gaps +- D-017: Perception modes as character-build system +- D-013: Diegetic insert/POI navigation system +- D-037: Contraband specification + +--- + +**Status:** Canonical — foundational technology of The Settled Reach +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/technology/severance-tech.md b/docs/wiki/technology/severance-tech.md new file mode 100644 index 000000000..d78699bf2 --- /dev/null +++ b/docs/wiki/technology/severance-tech.md @@ -0,0 +1,120 @@ +# Severance Technology + +**Type:** Counter-Surveillance Technology +**Status:** Canonical (contraband) +**Legality:** Illegal across most of the Settled Reach +**Associated Faction:** Guardians of Autonomy +**Threat Level:** Institutional — threatens the information infrastructure itself + +--- + +## Overview + +Severance technology is a class of devices and techniques that block, disrupt, or spoof [neural lattice](neural-lattice.md) functions and [Meridian](meridian.md) connectivity. Where the lattice connects people to institutions, Severance tech disconnects them. Where the Meridian provides surveillance and tracking, Severance creates blind spots. + +It is illegal because it doesn't just break rules — it breaks the infrastructure that makes rules enforceable. + +--- + +## What Severance Tech Does + +**Lattice disruption:** Temporarily blocks or degrades neural lattice functions in a localized area. People in the affected zone lose perception overlays, Meridian access, professional toolkits, and tracking signatures. Enhanced and Analytical lattice users lose the most — they're accustomed to data layers that simply vanish. + +**Meridian blackout:** Creates zones where Meridian infrastructure cannot maintain coverage — not because of aging hardware (like Corridor B-7's natural dead spots), but because active countermeasures are jamming the signal. Severance-created blackouts are more complete and more controllable than infrastructure gaps. + +**Signature masking:** Spoofs or suppresses individual lattice signatures, making a person invisible to Meridian tracking. The individual still has a functioning lattice — they just don't appear on anyone else's queries. They become a ghost in the system. + +**The distinction from natural dead spots:** Station Sova already has Meridian coverage gaps — degraded corridors, between-wall spaces, aging infrastructure. These are passive, structural, and known. Severance tech creates *active* blackouts that can be deployed anywhere, controlled precisely, and removed when no longer needed. It's the difference between a broken streetlight and someone who can turn off streetlights at will. + +--- + +## Why It's Dangerous + +The Settled Reach runs on information infrastructure. The Concord Assembly governs through Meridian-mediated systems. The Commission regulates through lattice compliance monitoring. Law enforcement investigates through Meridian data queries. Commerce tracks through lattice-verified transactions. + +Severance technology threatens all of this simultaneously. + +**For law enforcement:** If suspects can suppress their lattice signatures, location tracking becomes unreliable. If Meridian blackouts can be deployed at will, surveillance infrastructure becomes useless. The detective's entire investigative toolkit — Analytical lattice, manifest cross-referencing, behavioral flagging — depends on a functioning information environment. Severance doesn't just hide evidence; it destroys the detective's ability to gather evidence at all. + +**For institutions:** Lattice compliance is the Commission's regulatory mechanism. If people can mask their lattice configurations, unauthorized modifications become undetectable. The Commission's authority rests on the ability to inspect — Severance removes that ability. + +**For governance:** The Concord Assembly's reach depends on Meridian infrastructure connecting system administrators to central authority. Systematic Severance deployment could fragment the information network that holds the Reach together. + +This is why Severance tech carries the heaviest penalties in the Settled Reach. Unlicensed lattice components are a Category 3 violation — fines and potential lattice restriction. Severance technology is something else entirely: possession suggests intent to undermine institutional infrastructure. It attracts intelligence attention, not just regulatory enforcement. + +--- + +## The Guardians of Autonomy + +Severance technology is associated with the Guardians of Autonomy — a decentralized political movement that opposes the lattice-mediated information architecture of the Settled Reach. + +**Guardian position:** The lattice-Meridian system is a surveillance architecture disguised as infrastructure. People have traded autonomy for convenience. The Commission doesn't just regulate technology — it regulates perception itself. Every lattice bearer is a node in a monitoring network they didn't consent to. Severance technology is the tool of opt-out. + +**Counter-position:** The lattice-Meridian system enables civilization to function across interstellar distances. Without shared information infrastructure, the Reach fragments. The Guardians confuse surveillance with coordination. Severance doesn't liberate — it isolates. + +**The honest truth:** Both positions have merit, and the game doesn't resolve the tension. The Guardians are not wrong that the lattice system is a surveillance architecture. The institutions are not wrong that the lattice system is critical infrastructure. Whether "surveillance" and "critical infrastructure" can be the same thing without being a problem is the political question that runs beneath the surface of the entire game. + +--- + +## Severance in the v0.1 Setting + +Severance technology appears in v0.1 as the ring's scariest cargo — the thing that elevates a local smuggling operation from grey-market commerce to something with political implications. + +**What the ring carries:** +- Primary contraband: [unlicensed lattice components](../contraband/lattice-components.md) (aftermarket mods) +- Secondary contraband: [medical-grade replacements](../contraband/medical-grade-replacements.md) (healthcare) +- Tertiary contraband: [Severance equipment](../contraband/severance-equipment.md) (counter-surveillance tech) + +**The escalation:** Lattice components are commercially motivated — people want better capability. Medical-grade replacements are morally sympathetic — people need healthcare. Severance equipment is politically charged — someone wants to undermine institutional oversight. The progression from "grey-market commerce" to "political threat" is the escalation that makes the ring's cargo portfolio increasingly dangerous. + +**The smuggler's realization:** Most ring members handle lattice components and don't think too hard about the sealed containers Nils won't discuss. The discovery that the ring is also moving Severance equipment is the moment the smuggler questions how deep the operation goes and who's really behind it. This is the contamination seed — the thing that connects a local smuggling ring to something larger. + +**The detective's discovery:** Finding Severance equipment in the ring's inventory transforms the case. Manifest fraud is a Category 3 violation. Severance distribution attracts intelligence-level attention. The detective's case changes from "local contraband" to "potential threat to institutional infrastructure" — and with it, the stakes of every decision they make. + +--- + +## Dual-Lens Significance + +**The smuggler** initially doesn't know Severance tech is in the ring's cargo. When they discover it (through the sealed containers, through Nils's evasion, through the supply chain traces), the question shifts from "am I comfortable with what we're doing?" to "am I comfortable with what we're involved in?" Lattice components serve the community. Severance equipment serves... whom? The Guardians? Someone else? The smuggler's trust in the ring's purpose begins to crack. + +**The detective** recognizes Severance technology as an intelligence-level threat. Its presence in a small station's smuggling ring raises questions that extend beyond the district: Who is supplying it? Through what channels? Is this distribution network or is it targeted deployment? The detective's institutional training tells them to escalate. Their personal investment in the case tells them to keep pulling the thread. This tension — follow procedure or follow curiosity — is the detective's version of the smuggler's trust crisis. + +**The convergence:** Both characters, from opposite sides, arrive at the same unsettling realization: the ring is connected to something bigger than anyone on Station Sova understands. Severance technology is the thread that, if pulled, leads beyond the district, beyond the station, beyond the system. + +--- + +## Mechanical Integration + +**Knowledge Graph:** +- `contraband.severance_tech` — Confidence progression: + - Suspects: "Sealed containers Nils won't discuss. Heavier than lattice components." + - KnowsOf: "Severance equipment. Counter-surveillance tech. Illegal across most of the Reach." + - KnowsDetails: "Guardians of Autonomy supply chain. This isn't local — it's connected to something bigger." +- Serves as contamination seed for storyteller expansion beyond v0.1 + +**Narrative Function:** +- Escalation mechanism: elevates the ring's threat profile from commercial to political +- Trust fracture: triggers the smuggler's questioning of the ring's true purpose +- Case transformation: changes the detective's investigation from local to systemic +- Expansion hook: connects v0.1 content to the wider Settled Reach + +**v0.1 Scope:** +- Referenced in dialogue, monologue, and investigation — not directly deployed as a gameplay mechanic +- Severance-created blackouts are not present; only natural Meridian dead spots +- The *existence* of Severance tech in the cargo is the narrative payload, not its use + +--- + +**Cross-References:** +- [Neural Lattice](neural-lattice.md) — The technology Severance disrupts +- [Meridian](meridian.md) — The network Severance blocks +- [Severance Equipment (Contraband)](../contraband/severance-equipment.md) — The physical cargo profile +- [Sova Transit District](../world/sova-transit-district.md) — Natural Meridian dead spots vs. Severance blackouts +- D-017: Perception modes (Severance disables lattice-dependent modes) +- D-037: Contraband specification (Severance as tertiary contraband) + +--- + +**Status:** Canonical — counter-surveillance technology and political threat +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/technology/span-gates.md b/docs/wiki/technology/span-gates.md new file mode 100644 index 000000000..ef7179ba0 --- /dev/null +++ b/docs/wiki/technology/span-gates.md @@ -0,0 +1,107 @@ +# Span Gates + +**Type:** Transit Infrastructure +**Status:** Canonical +**Scope:** Intra-system transit (within a star system) +**Scale:** Connects stations, planets, orbital platforms within a single system + +--- + +## Overview + +Span gates are the intra-system transit backbone of the Settled Reach. They connect locations within a single star system — station to planet, station to orbital platform, orbital to orbital. Where [Founder Gates](founder-gates.md) bridge the void between stars, span gates handle the daily logistics of moving people and cargo within a system. + +In the Krenn System, span gates are infrastructure the way roads are infrastructure: essential, taken for granted, and noticed only when they stop working. + +--- + +## How Span Gates Work + +Span gates create stable transit corridors between two fixed endpoints within a star system. Transit is near-instantaneous — step through one side, emerge at the other. The technology is well-understood, reliable, and old. No one in the Settled Reach remembers a time before span gates. + +**Gate cycles:** Gates operate on predictable cycles. During peak shifts on Station Sova, the Sova-to-Krenn Prime gate cycles every 4-6 minutes. Off-peak, every 12-15 minutes. Each cycle moves a fixed volume of cargo and/or passengers. + +**The hum:** Span gates produce a low-frequency vibration — a bass hum that varies in pitch with transit volume. On Station Sova, the gate hum is omnipresent. It's the ambient soundscape of the district. Workers tune it out. New arrivals notice it immediately. The hum rises during peak freight cycles and drops to a low throb during night shifts. + +This sound is the first thing the player hears on arrival (wow moment #1). It never stops. + +--- + +## Krenn System Gate Network + +| Route | Type | Primary Use | Cycle Time | +|-------|------|-------------|------------| +| Station Sova <-> Krenn Prime Surface Depot | Freight primary | Cargo transfer, surface-to-station logistics | 4-6 min (peak), 12-15 min (off-peak) | +| Station Sova <-> Orbital Manufacturing Platform 3 | Component transfer | Parts and assemblies for light manufacturing | Variable | +| Additional intra-system routes | Various | System commerce and passenger transit | Various | + +**Transit volume:** High freight, moderate passenger. Krenn's span gates run continuously during standard shifts. The system's prosperity comes from moving things between places — span gates are the mechanism. + +--- + +## Span Gates and Smuggling + +Span gates are chokepoints, and chokepoints create opportunities. + +**Legitimate cargo** arrives through the Sova gate on scheduled freight cycles. Manifests are filed in advance. Containers are logged. Inspectors (like Torek Lintar) check cargo against documentation. + +**Contraband** arrives mixed with legitimate freight. The volume of cargo moving through a busy span gate makes item-by-item inspection impractical. Inspectors work from manifests and spot-checks. The ring exploits this: contraband lattice components packed into containers whose manifests show "standard components" with doctored weight data. + +**The timing window:** Gate cycles create predictable surges of activity. During a peak-cycle arrival, dozens of containers come through simultaneously. Processing bottlenecks force prioritization. Inspectors focus on flagged shipments. Unflagged containers — the ones with carefully doctored manifests — move through with minimal scrutiny. + +This is why Voss's shift scheduling matters: he creates understaffing during high-volume gate cycles, widening the inspection gap that the ring depends on. + +--- + +## Atmosphere and Sensory Detail + +**Sound:** The gate hum is the district's heartbeat. +- Peak shifts: bass vibration rises, felt in the floor grating, audible through walls +- Off-peak: low throb, almost subliminal, the sound of infrastructure idling +- Post-transit: brief ozone scent that fades quickly, a faint crackle of dissipating energy + +**Visual:** Span gates on Station Sova are industrial installations — large, utilitarian, built into the freight bay architecture. No decorative elements. Cargo conveyors feed directly to and from the gate aperture. Safety markings. Warning lights during transit cycles. Workers move around gates with practiced indifference. + +**The feeling:** Span gates represent the mundane miracle of the Settled Reach. Instantaneous transit between a station and a planet's surface — and it's boring. It's commuting. The extraordinary made ordinary through 180 years of daily use. + +--- + +## Dual-Lens Significance + +**The smuggler** sees span gates as the entry point for their livelihood. Cargo arrives through the gate. The timing of gate cycles is their operational clock. They know which cycles run heavy, which inspectors work which shifts, which containers are flagged and which slide through. The gate is a workplace fixture — familiar, predictable, exploitable. + +**The detective** sees span gates as the supply chain entry point. Contraband enters through the gate. The detective queries manifest logs, cross-references arrival times with container processing delays, maps the gap between gate-logged weight and inspector-recorded weight. The gate is an evidence source — every transit cycle generates data that an Analytical lattice can mine. + +--- + +## Mechanical Integration + +**Sound System (D-018, D-038):** +- `amb_station_base.ogg` includes span gate vibration as primary ambient element +- Gate hum pitch varies with transit volume (game-time driven) +- Post-transit ozone is a sensory detail for monologue, not a separate audio asset in v0.1 + +**Knowledge Graph:** +- `world.shift_schedule` — Gate cycle timing connects to shift operations (smuggler: KnowsDetails; detective: learns through observation) +- `investigation.cargo_anomaly` — Container processing delays traced from gate arrival timestamps + +**Spatial Design:** +- Span gate is a fixed location on the freight bay level (Level 1) of Sova Transit District +- High-traffic chokepoint during shift transitions +- Sightlines from the observation gallery (Level 3) to the gate area enable surveillance gameplay + +--- + +**Cross-References:** +- [Founder Gates](founder-gates.md) — Interstellar gates connecting star systems +- [Sova Transit District](../world/sova-transit-district.md) — Gate location in v0.1 setting +- [Krenn System](../world/krenn-system.md) — System-wide gate network +- [Station Sova](../world/station-sova.md) — Gate infrastructure details +- D-036: Sova Transit District setting (gate cycles, freight logistics) +- D-038: Audio scope (station ambient includes gate hum) + +--- + +**Status:** Canonical — intra-system transit infrastructure +**Created:** 2026-02-12 +**Updated:** 2026-02-12 diff --git a/docs/wiki/world/krenn-system.md b/docs/wiki/world/krenn-system.md new file mode 100644 index 000000000..69b8a8342 --- /dev/null +++ b/docs/wiki/world/krenn-system.md @@ -0,0 +1,134 @@ +# Krenn System + +**Type:** Star System +**Status:** Canonical +**Classification:** Mid-Reach +**Star Type:** G3V (slightly cooler than Sol) +**Settlement Age:** ~180 years +**Population:** ~2.4 million (system-wide) + +--- + +## Overview + +The Krenn System is a mid-Reach G3V system with a working-class, pragmatic culture. It's neither frontier (too established) nor core (not politically significant). Krenn is logistics infrastructure — a place things move through, not toward. People come to Krenn for steady work, not opportunity. + +This is the first concrete, named star system in The Settled Reach. Everything about Krenn sets precedent for future systems. + +--- + +## Stellar Profile + +- **Primary Star:** G3V, slightly cooler than Sol +- **Natural Light:** Faintly amber quality compared to Earth-standard white +- **Planetary Bodies:** 3 terrestrial, 2 gas giants, 1 asteroid belt (mined out decades ago) +- **Habitable Worlds:** 1 (Krenn Prime, population ~2 million) +- **Stations:** 7 major, including Station Sova + +--- + +## Economy + +**Economic Base:** Freight logistics, light manufacturing, gate transit services + +Krenn is a supply chain node. The system's prosperity comes from moving things between other places. The gate connections place Krenn at the intersection of three regional trade routes. Manufacturing is mostly component assembly — nothing starts here, nothing finishes here, but many things pass through. + +**Wage Profile:** Steady but modest. The cost of living on Krenn stations is slightly too high for comfort on a single logistics salary. This creates permanent mild financial pressure — not poverty, but awareness of what an extra income stream could provide. + +This economic reality generates the conditions for grey-market activity: people who are employed, housed, fed, but tight enough that smuggling looks like rational risk-taking rather than desperation. + +--- + +## Governance & Institutional Presence + +**Primary Governance:** Concord Assembly (Reach-wide legislature) +**Local Authority:** Krenn System Administrator (appointed, bureaucratic) +**Lattice Commission Presence:** Moderate. Rotating field liaisons, not permanent enforcement. +**Meridian Coverage:** Standard. Comprehensive in populated areas, degraded in older infrastructure. + +The Commission's presence in Krenn is intermittent by design: established enough not to be frontier, not important enough for permanent enforcement installations. This gap — the lag between oversight visits — is what makes small-scale smuggling viable. + +--- + +## Culture & Social Norms + +**Cultural Profile:** Working-class pragmatic. Values reliability, minding your business, and not asking questions that aren't your concern. + +**Naming Conventions:** Compact, consonant-heavy, first-name-primary in social contexts. Surnames used formally or with authority figures. Examples: Kael, Voss, Lera, Torek, Drin, Maret, Hael, Sera, Nils, Kosse, Naia. + +**Social Texture:** +- First names signal peer relationships; surname usage signals hierarchy +- Direct speech preferred over elaborate courtesy +- Informal labor solidarity — covering for colleagues is expected +- Institutional authority (Commission, Assembly) viewed as external, not integrated into daily life + +**Greeting Customs:** +- Peers: first name + nod or casual gesture +- Authority: title + surname ("Supervisor Voss") +- Strangers: brief eye contact, no greeting (reserved culture) + +**Trust Dynamics:** Trust is earned through shared risk or long association. New arrivals are treated with polite distance until they prove reliable. This creates natural resistance to outside investigators. + +--- + +## Gate Network Connections + +**Horizon Gates (Interstellar):** +- Connection to [mid-core system, TBD] +- Connection to [frontier system, TBD] + +**Span Gates (Intra-System):** +- Station Sova <-> Krenn Prime Surface Depot +- Station Sova <-> Orbital Manufacturing Platform 3 +- [Additional connections as defined] + +**Transit Volume:** High freight, moderate passenger. Krenn's gates run continuously during standard shifts. Gate hum is the district's ambient soundscape. + +--- + +## Key Locations in System + +- **Krenn Prime:** Primary world, 2M population, light manufacturing +- **Station Sova:** Logistics hub, 12k population, freight-primary ([see Station Sova profile](station-sova.md)) +- **Orbital Manufacturing Platforms:** 3 major, component assembly +- **Belt Facilities:** Depleted mining infrastructure, some repurposed for storage + +--- + +## Worldbuilding Notes + +**Why Krenn Works for v0.1:** +- Economically grounded: the smuggling makes rational sense +- Culturally distinct: the naming and social norms feel specific +- Not exotic: this is a place people LIVE, not visit +- Politically neutral: no major Assembly factions competing here +- Institutionally thin: Commission presence leaves operational gaps + +**The Krenn Vibe:** "We do our jobs, we go home, we don't make trouble, and we don't ask what the people in the back room are doing as long as it doesn't affect us." + +This is the substrate that makes Sova Transit District narratively plausible. + +--- + +## Mechanical Integration + +**Knowledge Graph Flags:** +- `world.krenn_system_layout` (KnowsOf: detective knows from briefing, smuggler knows from living here) +- `world.krenn_culture` (KnowsDetails: smuggler understands social norms, detective reads them from case files) + +**Perception Differences:** +- **Smuggler:** Sees Krenn as home — knows shortcuts, recognizes faces, navigates by familiarity +- **Detective:** Sees Krenn as assignment — reads briefing data, queries lattice for names, maps institutional touchpoints + +--- + +**Cross-References:** +- [Station Sova](station-sova.md) — Primary v0.1 location +- [Sova Transit District](sova-transit-district.md) — v0.1 playable space +- D-036: Sova Transit District / Krenn System as v0.1 setting + +--- + +**Status:** Canonical — first star system in The Settled Reach +**Created:** 2026-02-11 +**Updated:** 2026-02-12 diff --git a/docs/wiki/world/sova-transit-district.md b/docs/wiki/world/sova-transit-district.md new file mode 100644 index 000000000..9174485ff --- /dev/null +++ b/docs/wiki/world/sova-transit-district.md @@ -0,0 +1,257 @@ +# Sova Transit District + +**Type:** Station District +**Status:** Canonical +**Station:** [Station Sova](station-sova.md) +**System:** [Krenn System](krenn-system.md) +**District Age:** ~40 years (most recent major retrofit) +**Population:** ~800 (workers + residents) +**Construction:** Prefab-modular base with layered retrofits + +--- + +## Overview + +Sova Transit District is a freight logistics district on Station Sova — the v0.1 vertical slice setting. This is where the game happens. Everything the player sees, everyone they meet, every routine they observe exists within this 40-year-old retrofitted freight hub and its worker amenities. + +**The District's Character:** Quotidian-with-undertow. + +Comfortable enough to be complacent. Tight enough that an extra income source is tempting. People work here, drink here, live here. Routines are predictable. Faces are familiar. And beneath that predictability, a smuggling operation runs smoothly because the community has collectively decided not to notice. + +--- + +## Physical Layout + +**Size:** ~800 meters circumferential span (Ring 1 section), 3 vertical levels + +**Construction History:** +1. **Original (140 years ago):** Freight bay with basic cargo handling +2. **First retrofit (~80 years ago):** Interior partitions created office spaces, break rooms +3. **Second retrofit (~40 years ago):** Worker amenities added (bar, residential pods), logistics hub expanded +4. **Ongoing maintenance:** Continuous patching, creating architectural complexity + +**Spatial Structure:** +- **Level 1 (lowest):** Freight bay floor, cargo handling, span gate access, logistics hub ([The Terminal](../locations/krenn-system/the-terminal.md)) +- **Level 2 (middle):** Worker amenities (bar, food vendors, small retail), residential pods +- **Level 3 (highest):** Observation gallery (overlooks freight bay), administrative offices, Commission kiosk (unmanned most of the time) + +**Between the Levels:** Maintenance corridors, service hatches, spaces between old and new construction. This is where the smuggling infrastructure lives. [Corridor B-7](../locations/krenn-system/maintenance-corridors.md) is the primary off-books route. + +--- + +## Three Social Sites (v0.1 Content Templates) + +The district contains three **social sites** — clusters of NPCs who regularly interact within connected physical spaces. These are the atomic units of v0.1 content. + +### 1. The Terminal (Logistics Hub) +**Type:** Workplace +**NPCs:** 5 ([Voss](../npcs/voss.md), [Kael Davan](../npcs/kael-davan.md), [Resha](../npcs/resha.md), [Torek Lintar](../npcs/torek-lintar.md), [Drin](../npcs/drin.md)) +**Function:** Cargo sorting, scheduling, inspection, paperwork +**Hours:** 24-hour operation, three 8-hour shifts +**[Full profile ->](../locations/krenn-system/the-terminal.md)** + +### 2. The Last Shift (Bar) +**Type:** Social Venue +**NPCs:** 6 ([Lera Sessik](../npcs/lera-sessik.md), [Harek](../npcs/harek.md), [Maret Korr](../npcs/maret-korr.md), [Sera Venn](../npcs/sera-venn.md), [Sess](../npcs/sess.md), [Olin](../npcs/olin.md)) +**Function:** After-shift drinks, social hub, information exchange +**Hours:** 14:00 - 02:00 station time +**Informal Name:** "Lera's" (used by regulars) +**[Full profile ->](../locations/krenn-system/the-last-shift.md)** + +### 3. Smuggling Spaces (The Ring's Infrastructure) +**Type:** Criminal operation / repurposed infrastructure +**NPCs:** 5 ([Devra](../npcs/devra.md), [Renn](../npcs/renn.md), [Pell](../npcs/pell.md), [Sabel](../npcs/sabel.md), [Tav](../npcs/tav.md)) +**Function:** Contraband transfer, off-books meetings, dead drops +**Locations:** [Maintenance Corridor B-7](../locations/krenn-system/maintenance-corridors.md), back room at The Last Shift, storage area in logistics hub +**[Full profile ->](../locations/krenn-system/maintenance-corridors.md)** + +--- + +## Economy & Employment + +**Primary Employers:** +- Sova Logistics Consortium (freight handling, scheduling, inspection) +- Station Services (maintenance, hospitality, retail) +- Self-employed (bar owners, food vendors, small operators) + +**Wage Reality:** Standard logistics salary: 2,400 credits/month. Station living costs: ~2,200 credits/month (housing pod, food, necessities). This leaves 200 credits margin — enough to survive, not enough to thrive. + +**Economic Pressure Mechanisms:** +- Medical expenses (lattice maintenance, injury treatment) +- Family support (children, aging parents) +- Lattice upgrades (professional capability enhancement) +- Emergency reserves (job loss, station emergency) + +**The Grey Economy:** Smuggling provides supplemental income that transforms "barely comfortable" into "secure." A ring member might make an extra 400-800 credits/month — enough to cover lattice upgrades, save for family, or simply breathe easier. + +This is why the community tolerates the ring: everyone benefits indirectly. The bar profits from smugglers buying drinks. Maintenance workers get tips for "noticing things late." Even flat NPCs who aren't involved benefit from the economic activity. + +--- + +## Daily Rhythms + +**Shift Schedule:** +- **Morning (06:00-14:00):** Day shift, highest freight volume, gate cycles every 4-6 minutes +- **Afternoon (14:00-22:00):** Swing shift, moderate volume, bar opens, social activity peaks +- **Night (22:00-06:00):** Night shift, lowest volume, gate cycles every 12-15 minutes, smuggling window + +**Shift Transition (13:45-14:15):** The corridor between the logistics hub and bar district becomes a chokepoint. Everyone heading from work to drinks passes through the same 40 meters. This is where the smuggler notices patterns and the detective observes routines. + +**The Week Cycle:** +- **5-day work cycle + 2-day rest** (station standard) +- Day 1-4: Normal operations +- Day 5 (end-of-cycle): Higher bar attendance, card games, social peak +- Rest days: Quieter district, skeleton crew at logistics hub, bar closed Day 1 morning + +**Seasonal Rhythms:** None. Station life has no seasons. This creates psychological monotony that smuggling occasionally interrupts. + +--- + +## Institutional Presence + +**Lattice Commission:** +- **Permanent Presence:** None. Commission kiosk on Level 3 (unmanned, for compliance reporting). +- **Liaison Rotation:** 3-6 month assignments. Most recent liaison rotated out 3 months ago; replacement delayed. +- **Inspection Schedule:** Quarterly lattice compliance sweeps (announced 2 weeks in advance). + +**This gap — the 3-month window without a Commission presence — is when the smuggling operation escalates. The detective's arrival represents an unscheduled enforcement action, triggered by something flagged at system level.** + +**Station Security:** +- **Patrol Presence:** 2 officers on-duty per shift, primarily concerned with accidents and violence +- **Authority Limit:** Security handles safety; Commission handles contraband. Security officers know this distinction and generally look away from grey-market activity that doesn't threaten station safety. + +--- + +## Meridian Coverage & Information Infrastructure + +**Coverage Map:** +- **Logistics Hub:** Comprehensive (real-time tracking, manifest systems, surveillance) +- **Bar District:** Strong (standard social monitoring, Meridian feeds) +- **Residential Pods:** Standard (personal lattice connectivity) +- **Maintenance Corridors:** Degraded (older infrastructure, dead spots) +- **Between-Wall Spaces:** Minimal or absent (off-map, no official coverage) + +**Dead Spots:** Corridor B-7 and the storage area behind the logistics hub main floor are known Meridian gaps. The ring uses these for off-channel communication. NPCs who need to discuss something sensitive go for a walk to the "quiet spots." + +--- + +## Atmosphere & Sensory Details + +**Sound:** +- **Omnipresent:** Span gate hum (bass-frequency vibration, pitch rises with transit volume) +- **Logistics Hub:** Cargo machinery, scanner beeps, conveyor belts, shouted instructions +- **Bar District:** Conversation murmur, glass on surfaces, Meridian music feeds +- **Corridors:** Ventilation hum, footsteps on metal grating, echoes +- **Night:** Gate hum drops to low throb, ventilation dominates, occasional distant voices + +**Smell:** +- **Logistics Hub:** Industrial lubricant, recycled air, occasionally cargo scent (organic shipments) +- **Bar District:** Cooking (protein paste, vegetables, synthetic spices), alcohol, crowd scent +- **Corridors:** Recycled air with metallic undertone, faint industrial chemicals +- **Morning:** Ozone scent post-gate-transit (fades quickly) + +**Lighting:** +- **Logistics Hub:** Bright industrial white (functional, slightly harsh) +- **Bar District:** Warm amber (cheaper fixtures, comfortable) +- **Corridors:** Dim utilitarian (spaced fixtures, shadows between lights) +- **Maintenance Areas:** Emergency red or no light (bring portable lights) + +**Visual Texture:** +- Bilingual signage (Concordat Standard + Krenn vernacular) +- Hand-lettered informal signs ("Lera's," shift schedules, lost-and-found notices) +- Wear patterns (scuffed floors, patched walls, graffiti in maintenance areas) +- Personal touches (locker decorations, shift-end artwork, stickers) + +**Local Complaint:** "The ventilation in Sector 3 has been unreliable for months. Station maintenance says it's on the list." — Universal safe topic. If an NPC is complaining about ventilation, they're NOT talking about something else. + +--- + +## NPCs & Social Structure + +**Total NPCs in District:** 17 (15 standard + 2 FRIEND-tier) + +**Population Distribution (D-029 Entanglement Ratio: 30/50/20):** +- **Flat NPCs (3, ~18%):** [Drin](../npcs/drin.md), [Sess](../npcs/sess.md), [Olin](../npcs/olin.md) — routines, greetings, atmosphere +- **Triangle NPCs, Mundane (7, ~41%):** [Voss](../npcs/voss.md), [Maret Korr](../npcs/maret-korr.md), [Torek Lintar](../npcs/torek-lintar.md), [Lera Sessik](../npcs/lera-sessik.md), [Harek](../npcs/harek.md), [Resha](../npcs/resha.md), [Sera Venn](../npcs/sera-venn.md) +- **Triangle NPCs, Entangled (7, ~41%):** [Kael Davan](../npcs/kael-davan.md), [Devra](../npcs/devra.md), [Renn](../npcs/renn.md), [Pell](../npcs/pell.md), [Sabel](../npcs/sabel.md), [Tav](../npcs/tav.md), [Hael](../npcs/hael.md) (referenced) + +**The Five Triangles:** See [NPC Index](../npcs/index.md) for full triangle diagram. + +--- + +## The Smuggling Operation ("The Ring") + +**Structure:** Informal network, no official name. NPCs refer to it obliquely ("the arrangement," "the side work," "helping out"). + +**What They Move:** [Unlicensed lattice components](../contraband/lattice-components.md) (primary), [medical-grade neural replacements](../contraband/medical-grade-replacements.md), [Severance counter-surveillance tech](../contraband/severance-equipment.md) + +**How It Works:** +1. Contraband arrives in legitimate freight shipments (mixed with legal cargo) +2. [Torek Lintar](../npcs/torek-lintar.md) (compromised inspector) looks away during inspection +3. [Kael Davan](../npcs/kael-davan.md) and others route flagged containers to holding area +4. [Renn](../npcs/renn.md) (courier) transfers contraband to [Corridor B-7](../locations/krenn-system/maintenance-corridors.md) +5. [Devra](../npcs/devra.md) coordinates off-station contact ([Sabel](../npcs/sabel.md)) +6. Product distributed through informal networks + +**Operational Timing:** Night shifts (lowest oversight), shift transitions (confusion/distraction), post-inspection windows (2-3 days after scheduled Commission sweep) + +**Community Role:** The ring is the district's economic immune system. People who don't participate directly still benefit: bars profit, families get lattice upgrades they couldn't afford, medical needs get met. This creates collective investment in not noticing. + +--- + +## v0.1 Narrative Stakes + +**The Smuggler's Stakes:** +- **Home:** This is their community, their livelihood, their daily life +- **Relationships:** Everyone here is a colleague, friend, or known quantity +- **Risk:** The detective threatens to dismantle the social fabric that keeps them secure + +**The Detective's Stakes:** +- **Assignment:** Institutional mandate to investigate manifest discrepancies +- **Authority:** Commission jurisdiction, but local resistance +- **Isolation:** No social network, no institutional backup in-district, operating alone in hostile social terrain + +**The Convergence:** Both characters are following the same threads (manifest discrepancies, NPC behavioral changes, Corridor B-7) from opposite sides. The smuggler knows what's happening and must protect it. The detective suspects something and must discover it. They're heading toward the same revelation from opposite directions. + +--- + +## Mechanical Integration + +**Knowledge Graph Flags (FactIds):** +- `location.sova_transit_layout` (KnowsOf: detective has map, smuggler knows shortcuts) +- `location.corridor_b7_restricted` (KnowsDetails: smuggler knows access, detective discovers through investigation) +- `contraband.ring_exists` (Smuggler: KnowsDetails from background, Detective: Suspects -> KnowsOf -> KnowsDetails through gameplay) + +**Perception Differences:** +- **Smuggler:** Sees home, notices routine deviations as threats, identifies NPCs by first name and relationship +- **Detective:** Sees crime scene, notices patterns as evidence, identifies NPCs by role and case file data + +**Monologue Triggers:** 60+ location-specific triggers across three social sites, filtered by character + +--- + +## Worldbuilding Notes + +**Why Sova Transit Works:** +- **Economically grounded:** The financial pressure is specific and relatable +- **Socially coherent:** 800 people, everyone knows everyone, patterns are visible +- **Architecturally complex:** Layered construction provides hiding places +- **Institutionally thin:** Enforcement gaps make smuggling viable +- **Morally ambiguous:** The ring serves real needs, not just greed + +**The Honest Truth:** If Sova Transit District feels real — if the player can imagine working here, drinking here, living here — then the smuggling operation becomes a moral dilemma instead of a simple crime. That's the game. + +--- + +**Cross-References:** +- [Krenn System](krenn-system.md) — Star system profile +- [Station Sova](station-sova.md) — Station profile +- [NPC Index](../npcs/index.md) — Full character roster +- D-036: Sova Transit District as v0.1 setting +- D-027: Vertical slice definition + +--- + +**Status:** Canonical — v0.1 playable setting +**Created:** 2026-02-11 +**Updated:** 2026-02-12 diff --git a/docs/wiki/world/station-sova.md b/docs/wiki/world/station-sova.md new file mode 100644 index 000000000..de9cdadc8 --- /dev/null +++ b/docs/wiki/world/station-sova.md @@ -0,0 +1,190 @@ +# Station Sova + +**Type:** Space Station +**Status:** Canonical +**System:** [Krenn System](krenn-system.md) +**Classification:** Logistics Hub +**Population:** ~12,000 +**Construction Era:** Mid-settlement (~140 years ago) +**Operational Age:** ~140 years, with continuous retrofitting + +--- + +## Overview + +Station Sova is a freight logistics hub in the Krenn System, positioned gate-adjacent for optimal cargo transfer. It's not a destination — it's infrastructure. People live on Sova because the work is here, not because they chose the station. + +Sova is the kind of place that looks the same every day: predictable shifts, predictable routines, predictable problems. The extraordinary thing about Sova is how much can happen beneath that predictability. + +--- + +## Physical Structure + +**Construction Type:** Modular prefab base (original core ~140 years old) + layered retrofits (most recent ~40 years ago) + +The station shows its age. The original core is solid but utilitarian — industrial prefab modules designed for function, not comfort. Successive generations added capacity through retrofitting: new sections bolted onto old, interior partitions creating rooms within older bays, maintenance corridors that don't quite align between construction eras. + +This layered construction creates architectural secrets: spaces between wall layers, service corridors no longer on official schematics, dead zones where old and new construction meet imperfectly. These gaps are where smuggling infrastructure lives. + +**Layout:** +- **Core Spindle:** Original construction, central spine with radial arms +- **Freight Bays:** Ring 1 (outermost), gate-adjacent, high-traffic +- **Residential/Commercial:** Ring 2 (middle), mixed-use districts +- **Operations/Services:** Ring 3 (innermost), administration and maintenance + +[Sova Transit District](sova-transit-district.md) occupies a section of Ring 1 — freight bay retrofitted for logistics operations + worker amenities. + +--- + +## Population & Demographics + +**Total Population:** ~12,000 + +**Breakdown:** +- Logistics workers (freight handlers, dock inspectors, schedulers): ~4,000 +- Service sector (bars, food, maintenance, retail): ~3,000 +- Station operations (administration, security, technical): ~2,000 +- Residential (families, retired workers, dependents): ~2,500 +- Transient (short-term contractors, travelers): ~500 + +**Cultural Composition:** Predominantly Krenn System culture (working-class pragmatic, first-name-primary, reserved). Small populations from connected systems, identifiable by naming patterns and accent. + +**Turnover:** Low. People come to Sova for steady work and stay because moving costs money. Multi-generational families are common. + +--- + +## Economy + +**Primary Function:** Freight logistics — cargo transferred between span gates, sorted, repackaged, forwarded + +**Economic Model:** The station is profitable but not prosperous. Wages are steady, cost of living is slightly above wage level, creating permanent mild squeeze. Most households are one unexpected expense away from financial stress. + +This economic reality drives three social patterns: +1. **Informal labor solidarity** — workers cover for each other because everyone knows the squeeze +2. **Grey-market tolerance** — small-scale smuggling is community immune system, not crime +3. **Risk-averse pragmatism** — people make calculated risks (like smuggling) but avoid reckless ones (like violence) + +**Economic Drivers:** +- Gate transit fees (Concord Assembly revenue, station sees fraction) +- Freight handling contracts (Syndic supply chains) +- Service sector (bars, food, entertainment for workers) +- Station maintenance contracts (ongoing retrofitting) + +--- + +## Governance & Security + +**Station Administrator:** Appointed by Krenn System Authority (Concord Assembly jurisdiction) +**Security:** Sova Station Security (local force, ~150 officers, primarily concerned with safety/accidents, not criminal investigation) +**Commission Presence:** Rotating liaisons (3-6 month assignments), no permanent office. Most recent liaison rotated out 3 months ago; replacement delayed. + +**Law Enforcement Gaps:** +This is critical for v0.1 narrative: Sova has *security* (prevent accidents, respond to violence) but minimal *law enforcement* (investigate contraband). The Commission sends liaisons for lattice compliance inspections, but those visits are scheduled and infrequent. + +The detective's arrival in [Sova Transit District](sova-transit-district.md) represents an unusual enforcement presence — something has flagged the district for investigation, and institutional attention is now focused where it usually isn't. + +--- + +## Districts + +Station Sova has 7 named districts. Only **Sova Transit District** is developed for v0.1. + +1. **Sova Transit District** — Freight logistics, worker amenities, bar district ([full profile](sova-transit-district.md)) +2. **Central Spindle District** — Administration, station operations +3. **Residential Radial A** — Long-term housing, schools, medical +4. **Residential Radial B** — Short-term housing, transient workers +5. **Commercial Ring** — Retail, entertainment, higher-end services +6. **Industrial Annex** — Repair bays, fabrication, heavy maintenance +7. **Docking Approach** — Gate-adjacent, short-term berths, passenger processing + +**Transit Connections:** Internal tram system connects all districts. Transit District <-> Central Spindle is 8 minutes. District <-> Residential A/B is 5 minutes. + +--- + +## Infrastructure + +**Meridian Coverage:** +- **High-traffic areas (freight bays, commercial, admin):** Comprehensive, real-time +- **Residential areas:** Standard, slight lag +- **Older sections (maintenance corridors, between-wall spaces):** Degraded or absent + +This coverage gradient is load-bearing for smuggling: off-Meridian coordination happens in the gaps. + +**Span Gate Access:** +- Sova Station <-> Krenn Prime Surface Depot (primary freight route) +- Sova Station <-> Orbital Manufacturing Platform 3 (component transfer) +- Gate cycles every 4-6 minutes during peak shifts, every 12-15 minutes off-peak + +**Power & Life Support:** +- Fusion reactors (original core), reliable but aging +- Atmosphere recycling (continuous, noticeable ventilation hum) +- Gravity (spin gravity in rings, microgravity in core — most social life happens in Ring 2 at 0.7g) + +--- + +## Atmosphere & Sensory Details + +**Sound:** +- Span gate hum (omnipresent, pitch varies with transit volume) +- Ventilation systems (white noise, occasional rattle) +- Cargo machinery in freight districts (clanking, scanner beeps, conveyor hum) +- Foot traffic (metal grating, echoes in corridors) + +**Smell:** +- Recycled air (faint metallic undertone) +- Industrial lubricant (near freight bays) +- Cooking (residential and bar districts) +- Ozone (post-gate-transit, fades quickly) + +**Lighting:** +- Functional industrial fixtures (bright in work areas, dim in corridors) +- Mixed color temperatures (newer sections: cool white, older sections: warm amber from aging fixtures) +- Emergency lighting in maintenance corridors (low red) + +**Temperature:** Climate-controlled, comfortable. Older sections run slightly cooler (aging environmental systems). Workers dress in layers. + +--- + +## Key Locations (v0.1 Scope) + +See [Sova Transit District](sova-transit-district.md) for full v0.1 location details: +- [The Terminal](../locations/krenn-system/the-terminal.md) (logistics hub) +- [The Last Shift](../locations/krenn-system/the-last-shift.md) (bar) +- [Maintenance Corridor B-7](../locations/krenn-system/maintenance-corridors.md) (smuggling space) + +--- + +## Worldbuilding Notes + +**Why Sova Works:** +- **Scale:** 12k population is large enough to feel like a community, small enough that patterns are noticeable +- **Economic pressure:** Generates rational motivation for smuggling without desperation +- **Institutional thinness:** Security exists, enforcement is intermittent — creates operational space +- **Architectural complexity:** Layered construction provides physical infrastructure for hidden activity +- **Cultural cohesion:** Turnover is low, social networks are established, outsiders are visible + +**The Sova Feeling:** "We all know each other. We all know what goes on. We all benefit just enough not to make trouble." + +--- + +## Mechanical Integration + +**Knowledge Graph Flags:** +- `location.sova_station` (KnowsOf: both characters know they're on Sova) +- `location.sova_layout` (KnowsDetails: smuggler knows routes, detective has station map) +- `system.security_presence` (KnowsDetails: smuggler knows security patterns, detective knows enforcement gaps) + +**v0.1 Scope Limitation:** The player never leaves Sova Transit District. Other districts are referenced in dialogue/monologue but not traversable. + +--- + +**Cross-References:** +- [Krenn System](krenn-system.md) — Star system profile +- [Sova Transit District](sova-transit-district.md) — v0.1 playable district +- D-036: Sova as v0.1 setting + +--- + +**Status:** Canonical +**Created:** 2026-02-11 +**Updated:** 2026-02-12 From 0100b336351527e6a734be801738888b89491c89 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Thu, 12 Feb 2026 16:18:56 +0100 Subject: [PATCH 2/7] docs(workshops): archive wiki review workshop (4 rounds + lead interview) Long-term content strategy workshop: 300-world generator model, cultural ingredients menu, three-system NPC architecture (9 patterns x 6 motivations), Sacred/Profane/Middle Kingdom framework. 9 agents across 4 rounds plus lead interview establishing the production path from hand-authored Sova to generated 300 worlds. Co-Authored-By: Claude Opus 4.6 --- docs/workshops/wiki-review/SUMMARY.md | 297 +++++++ docs/workshops/wiki-review/lead-interview.md | 117 +++ docs/workshops/wiki-review/round1-gestalt.md | 480 ++++++++++ docs/workshops/wiki-review/round1-gore.md | 207 +++++ docs/workshops/wiki-review/round1-mellanie.md | 136 +++ docs/workshops/wiki-review/round1-miri.md | 565 ++++++++++++ docs/workshops/wiki-review/round1-nigel.md | 289 ++++++ docs/workshops/wiki-review/round1-ozzie.md | 134 +++ docs/workshops/wiki-review/round1-paula.md | 550 ++++++++++++ docs/workshops/wiki-review/round1-tracking.md | 269 ++++++ docs/workshops/wiki-review/round1-tyre.md | 583 ++++++++++++ docs/workshops/wiki-review/round2-gestalt.md | 634 +++++++++++++ docs/workshops/wiki-review/round2-gore.md | 258 ++++++ docs/workshops/wiki-review/round2-mellanie.md | 357 ++++++++ docs/workshops/wiki-review/round2-miri.md | 404 +++++++++ docs/workshops/wiki-review/round2-nigel.md | 339 +++++++ docs/workshops/wiki-review/round2-ozzie.md | 219 +++++ docs/workshops/wiki-review/round2-paula.md | 478 ++++++++++ docs/workshops/wiki-review/round2-tracking.md | 245 ++++++ docs/workshops/wiki-review/round2-tyre.md | 640 ++++++++++++++ docs/workshops/wiki-review/round3-gestalt.md | 830 ++++++++++++++++++ docs/workshops/wiki-review/round3-gore.md | 416 +++++++++ docs/workshops/wiki-review/round3-mellanie.md | 354 ++++++++ docs/workshops/wiki-review/round3-miri.md | 551 ++++++++++++ docs/workshops/wiki-review/round3-nigel.md | 536 +++++++++++ docs/workshops/wiki-review/round3-ozzie.md | 298 +++++++ docs/workshops/wiki-review/round3-paula.md | 467 ++++++++++ docs/workshops/wiki-review/round3-si.md | 295 +++++++ docs/workshops/wiki-review/round3-tracking.md | 109 +++ docs/workshops/wiki-review/round3-tyre.md | 775 ++++++++++++++++ docs/workshops/wiki-review/round4-gestalt.md | 714 +++++++++++++++ docs/workshops/wiki-review/round4-gore.md | 507 +++++++++++ docs/workshops/wiki-review/round4-mellanie.md | 358 ++++++++ docs/workshops/wiki-review/round4-miri.md | 629 +++++++++++++ docs/workshops/wiki-review/round4-nigel.md | 586 +++++++++++++ docs/workshops/wiki-review/round4-ozzie.md | 385 ++++++++ docs/workshops/wiki-review/round4-paula.md | 621 +++++++++++++ docs/workshops/wiki-review/round4-si.md | 298 +++++++ docs/workshops/wiki-review/round4-tracking.md | 118 +++ docs/workshops/wiki-review/round4-tyre.md | 597 +++++++++++++ .../wiki-review/si-ticket-changes.md | 309 +++++++ .../wiki-review/wiki-review-workshop-brief.md | 191 ++++ 42 files changed, 17145 insertions(+) create mode 100644 docs/workshops/wiki-review/SUMMARY.md create mode 100644 docs/workshops/wiki-review/lead-interview.md create mode 100644 docs/workshops/wiki-review/round1-gestalt.md create mode 100644 docs/workshops/wiki-review/round1-gore.md create mode 100644 docs/workshops/wiki-review/round1-mellanie.md create mode 100644 docs/workshops/wiki-review/round1-miri.md create mode 100644 docs/workshops/wiki-review/round1-nigel.md create mode 100644 docs/workshops/wiki-review/round1-ozzie.md create mode 100644 docs/workshops/wiki-review/round1-paula.md create mode 100644 docs/workshops/wiki-review/round1-tracking.md create mode 100644 docs/workshops/wiki-review/round1-tyre.md create mode 100644 docs/workshops/wiki-review/round2-gestalt.md create mode 100644 docs/workshops/wiki-review/round2-gore.md create mode 100644 docs/workshops/wiki-review/round2-mellanie.md create mode 100644 docs/workshops/wiki-review/round2-miri.md create mode 100644 docs/workshops/wiki-review/round2-nigel.md create mode 100644 docs/workshops/wiki-review/round2-ozzie.md create mode 100644 docs/workshops/wiki-review/round2-paula.md create mode 100644 docs/workshops/wiki-review/round2-tracking.md create mode 100644 docs/workshops/wiki-review/round2-tyre.md create mode 100644 docs/workshops/wiki-review/round3-gestalt.md create mode 100644 docs/workshops/wiki-review/round3-gore.md create mode 100644 docs/workshops/wiki-review/round3-mellanie.md create mode 100644 docs/workshops/wiki-review/round3-miri.md create mode 100644 docs/workshops/wiki-review/round3-nigel.md create mode 100644 docs/workshops/wiki-review/round3-ozzie.md create mode 100644 docs/workshops/wiki-review/round3-paula.md create mode 100644 docs/workshops/wiki-review/round3-si.md create mode 100644 docs/workshops/wiki-review/round3-tracking.md create mode 100644 docs/workshops/wiki-review/round3-tyre.md create mode 100644 docs/workshops/wiki-review/round4-gestalt.md create mode 100644 docs/workshops/wiki-review/round4-gore.md create mode 100644 docs/workshops/wiki-review/round4-mellanie.md create mode 100644 docs/workshops/wiki-review/round4-miri.md create mode 100644 docs/workshops/wiki-review/round4-nigel.md create mode 100644 docs/workshops/wiki-review/round4-ozzie.md create mode 100644 docs/workshops/wiki-review/round4-paula.md create mode 100644 docs/workshops/wiki-review/round4-si.md create mode 100644 docs/workshops/wiki-review/round4-tracking.md create mode 100644 docs/workshops/wiki-review/round4-tyre.md create mode 100644 docs/workshops/wiki-review/si-ticket-changes.md create mode 100644 docs/workshops/wiki-review/wiki-review-workshop-brief.md diff --git a/docs/workshops/wiki-review/SUMMARY.md b/docs/workshops/wiki-review/SUMMARY.md new file mode 100644 index 000000000..a02b5aa63 --- /dev/null +++ b/docs/workshops/wiki-review/SUMMARY.md @@ -0,0 +1,297 @@ +# Wiki Review Workshop — Summary & Long-Term Content Strategy + +## Workshop Overview + +**Date:** 2026-02-12 +**Called by:** Jeroen (project lead) +**Participants (10):** Paula (librarian), Mellanie (librarian), Miri (worldbuilder), Gestalt (systems design), Gore (thematic lead), Nigel (sandbox/replayability), Ozzie (player experience), Tyre (tooling/architecture), Qatux (documenter), SI (work prep) +**Format:** 4 rounds + lead interview between R3 and R4 + cross-agent debates +**Output:** ~35 response documents, 3 tracking documents, 1 lead interview, this summary + +### Scope Evolution + +The workshop began as a v0.1 wiki review (45 files in `docs/wiki/`, ticket #368) with 6 defined topics: direction check, style guides, regional style guide, wiki taxonomy, content directory structure, and randomizer/PC briefs. Rounds 1-2 produced 88 tracked proposals and 20 consensus items focused on v0.1 content quality: NPC profiles, smuggler lens parity, triangle strengthening, naming conventions, and content directory structure. + +Between Rounds 2 and 3, the lead redirected the workshop toward long-term content strategy. Round 3 asked "What does the full game look like?" and collected scaling estimates, cultural group proposals, NPC pattern libraries, and PC archetype lists from all contributors — all calculated at a 20-district scale. + +The lead interview between Rounds 3 and 4 delivered the decisive reframe: **300 worlds before DLC.** This transformed the workshop from a content authoring strategy into a generator specification strategy. Round 4 asked every contributor to rebuild their proposals for a world where style briefs are generator inputs, cultural groups are assembled from ingredient menus, and hand-authoring is reserved for irreducible emotional content. + +### The 300-World Reframe (Round 4) + +The 300-world number changed the category of work from "writers produce districts, tooling accelerates writers" to "engineers produce generators, writers produce generator inputs, tooling IS the product." Every Round 4 response independently arrived at the same conclusion: the workshop had been designing generator specifications all along without knowing it. The district skeleton, the composition matrix, the Sacred/Profane distinction, the pool architecture — all were already generator-shaped thinking. + +--- + +## Long-Term Strategy Decisions (Confirmed) + +### Scale: 300 Worlds + +The game targets 300 populated worlds before any DLC content. This requires a generator model, not hand-authoring. + +**Release path:** +- v0.1 = proof of the interaction model (1 district, hand-authored) +- v0.2-v0.5 = testing generation systems and tooling +- v0.6-v0.10 = content pipeline at scale +- pre-v1.0 = 300 worlds populated via generators + style briefs + naming algorithms + +**Tooling first is absolute.** The authoring/generation pipeline must be proven before scaling content. + +**Three-tier world authoring:** + +| World Tier | Count | Content Method | Purpose | +|---|---|---|---| +| Landmark worlds | 10-15 | Fully hand-authored, bespoke NPCs and arcs | Emotional peaks, quality benchmarks | +| Regional worlds | 30-50 | Template kits, hand-reviewed | High quality, cultural depth | +| Generated worlds | 230-260 | Procedurally generated from ingredient menus | Breadth, replayability, exploration | + +**Quality gradient maps to in-world logic.** Older settlements are denser and richer. Core worlds have more content than frontier outposts. The gradient is intentional and mirrors real human geography — players feel the difference between a 300-year-old trade hub and a 40-year-old mining outpost, and the content density reflects that. + +**Irreducible authored content at 300-world scale:** +- Gestalt: ~1,600-2,800 hours total for templates, arcs, rules, and benchmark districts +- Mellanie: ~3,300-7,400 authored lines + ~90 pages of specs (vs. 13,500-31,200 lines for 20 hand-crafted districts) +- The authored content DECREASES in volume but INCREASES in per-line stakes — every seed line, every parameter definition cascades across hundreds of worlds + +**QA paradigm shift:** Test generators, not generated output. Bad parameters cascade across 300 worlds. Review samples, tune parameters, iterate. The gut-check reviews generators, not individual NPCs. + +### Cultural Ingredients Menu + +**Core principle:** Opt-in, not fill-all-blanks. Gaps ARE flavor. What a society DOESN'T care about is as defining as what it does. + +**Six ingredient categories:** + +| Category | Purpose | Options | +|---|---|---| +| Heritage Roots (OPTIONAL) | Phonetic flavor, social dynamics, trust model | 8 Earth-grounded clusters + null | +| Settlement Motivation | Why people came, what they value | Economic, ideological, corporate, refugee, scientific, military, frontier, generational | +| Economic Function | What makes money, daily rhythm, what tempts | Logistics, extraction, manufacturing, trade, agriculture, research, military, services, transit | +| Philosophical Alignment | Social contract, blind spots | Collectivist, individualist, meritocratic, egalitarian, traditionalist, progressive | +| Corporate/Faction Presence | Power structure, authority dynamics | Commission, Syndic, contested, independent, criminal, military | +| Drift Stage | Cultural evolution state | Founding (<50yr), establishing (50-150yr), mature (150-300yr), ancient (300+yr) | + +**Heritage is OPTIONAL.** Null-heritage produces distinct corporate/functional worlds with no cultural immune system, no substrate vocabulary, no food traditions. The world feels THIN — and that thinness is its own moral texture. + +**8 Earth-grounded heritage clusters** (Miri named them by social signature: Frost, Tide, Iron, Spice, Jade, Dust, Vine, Salt, Stone, Arc — 10 roots that map to Nordic-Baltic, Mediterranean, Slavic-Industrial, South Asian, East Asian, West African, Latin American, Anglo-Commercial, and two additional profiles). Heritage recognizable but not mappable — "feels Nordic" not "is Finnish." Drift is the defense against franchise similarity, not abstraction. + +**People migrate between heritages.** A character with a Nordic-sounding name in an East Asian-heritage district is not wrong — they are a person with a history. Culture is the place, not the individual. + +**Missing from initial proposals, added by lead: Economics.** What makes extra income tempting. This determines the nature of the contested resource — whether the smuggling is sympathetic (healthcare for people who cannot afford it) or predatory (luxury goods for status). The economic pressure ingredient determines the moral texture of the entire grey economy. + +**The derivation function:** The generator takes ingredient selections and derives mechanical parameters deterministically. Same ingredients always produce the same society. Randomization happens at ingredient SELECTION, not at derivation. Style briefs (Miri's Krenn brief) are reference implementations — proof that the derivation function produces quality output for specific ingredient sets. + +### Cultural Brief = Generation Seed + +**Dual artifact:** `seed.yaml` (generator input) + `brief.md` (human authoring reference). The seed is the product; the brief is the manual. + +**World seed = numeric seed (pool draws) + cultural assembly (content generation).** Same cultural assembly + different numeric seed = same culture, different drama. Different cultural assembly + same numeric seed = parallel structure, different culture. + +Miri's Krenn brief is a proof-of-concept output; the ingredient menu is the real product. The generator must reproduce the Krenn brief's feel when given Krenn's ingredient combination. Validation: if the generator's output for `frost:0.55 + salt:0.30 + iron:0.15 / economic-trade / logistics / tight-margin+prohibition` matches the hand-authored Krenn culture, the derivation function works. + +### Three-System NPC Architecture + +**System A: Thematic Patterns** (what the character means to the story) + +| Pattern | Function | +|---|---| +| FRIEND | Trust anchor hiding a contradiction. Emotional core. | +| MIRROR | Honest person whose transparency reveals others' dishonesty. | +| ANCHOR | Embodies contentment. Genuine answer to "Is this enough?" | +| GHOST | Absent power shaping events through influence. | +| CATALYST | Outsider who forces reckoning. Disruption. | +| THRESHOLD | Gatekeeper between the player and the next layer. | +| REMNANT | Living history. Remembers when things were different. | +| SYSTEM | Institutional embodiment. Procedure-citing, neutral. | +| NOBODY | Background that becomes foreground through player attention. | + +**System B: Functional Motivations** (what the character does in gameplay) + +| Motivation | Role | +|---|---| +| HANDLER | Managing operations, applying pressure from above | +| WITNESS | Accidentally observed something, carries information | +| TURNCOAT | Loyalty shifting, moving between camps | +| CIVILIAN | Uninvolved, living their life, normalcy | +| OPERATOR | Running something, competent, goal-oriented | +| SKEPTIC | Doubts the system, questions assumptions | + +**System C: Composition.** Each NPC gets one thematic pattern + one functional motivation. ANCHOR+OPERATOR differs from ANCHOR+CIVILIAN. At 300-world scale, generators pick combinations from composition rules with drama ratings (gold/silver/bronze/banned), forbidden combination lists, and soft constraints ensuring dramatic richness per district. + +**Key composition examples:** +- FRIEND+OPERATOR = identity betrayal (Kael: "I didn't know who you really were") +- MIRROR+CIVILIAN = uncomplicated honesty (Naia Tamm: innocence endangered by events) +- NOBODY+WITNESS = hidden information activated by player attention +- GHOST+HANDLER = absent authority applying pressure through intermediaries + +### THE NOBODY & Evolving Relationships + +THE NOBODY = just being there. Background that becomes foreground through player attention. The lead explicitly opened the "evolving relationships" mechanic: "evolving relationships sounds like a can of worms I would LOVE to open." + +**Dynamic tier promotion:** + +| Stage | Trigger | Effect | +|---|---|---| +| NOBODY | Default | Name, routine, greeting. Social wallpaper. | +| NOTICED | ~3-5 interactions | NPC gains a name in the player's knowledge graph. | +| RECOGNIZED | ~8-12 interactions | Basic dialogue unlocks. "Her name is Tev." | +| KNOWN | ~15-20 interactions | Dormant Tier 2 content activates. Functional motivation visible. | +| INVESTED | ~25+ interactions + specific trigger | Full dormant pattern activates. NPC becomes ANCHOR/WITNESS/etc. | + +At 300 worlds, most NPCs are NOBODYs. Player attention is the resource. The generator pre-assigns hidden motivations: 70% CIVILIAN (stay NOBODY forever), 20% activatable motivations, 10% load-bearing motivations that could reshape the investigation. + +**Key quotes on THE NOBODY:** +- Nigel: "Two players, same world, same seed, different experience because they noticed different people." +- Gore: "Learning to see is the endgame." +- Ozzie: "THE NOBODY is an infinite replayability engine. The randomizer shuffles the pool. THE NOBODY lets the player shuffle it again, by choosing what to see." + +### THE MIRROR Pattern + +Tier 1 emotional depth, NO contradiction arc, no secret. The honest person in a world of liars. First instance: Naia Tamm (renamed from Hael — Miri proposed, unanimous). + +Gore proposed THE MIRROR as a formal pattern; Paula converged independently, describing it as "Tier 1.5 Production Emotional NPC" with 50-70 authored lines. Both agree: the MIRROR must NOT have a contradiction arc or secret. The MIRROR's power is simplicity and transparency. When events drag the MIRROR into the conspiracy, the damage is devastating — the player broke the one genuinely innocent person. + +The Kael/Hael sonic collision (tension T-03 from Round 1) was resolved by renaming Hael to Naia Tamm, following Krenn naming conventions from Miri's regional brief. Unanimous support. + +### 8 PC Archetypes (Fluid) + +8 archetypes at v1.0 as a stress test of system flexibility. The specific 8 vary between contributors (Gore: Worker/Investigator/Operator/Wanderer/Builder/Seeker/Guardian/Rebel; Paula: Insider/Investigator/Newcomer/Merchant/Administrator/Caretaker/Fixer/Exile; Ozzie: Insider/Investigator/Newcomer/Operator/Watcher/Exile/Fixer/Believer). The exact list is not yet canonized, but the recurring archetypes across all proposals are: Insider/Smuggler (universal), Investigator/Detective (universal), Newcomer (5+ agents), Operator (4+ agents), and Merchant/Fixer (4+ agents). + +**Archetypes are FLUID** — current position in a community, not character class. Players can move districts, change jobs, buy houses. Archetype transitions are a game mechanic. + +**Paula's "vulnerable window":** During transition, the player has given up their old position's protections but has not earned the new one's. That gap is where the most interesting gameplay lives. The Insider who becomes an Investigator faces a period where the ring knows they left but the Commission does not fully trust them yet. + +**Insider + Investigator deep for v0.1 but must NOT dominate.** The lead specifically warns that the other archetypes must feel equally primary in their districts. + +**Newcomer = v0.2 content update centerpiece.** Natural tutorial, fresh eyes on established world. The Newcomer is the player's proxy — walking into a place they do not understand, meeting people they do not know, trying to figure out what is going on. The Newcomer's "Is this enough?" is the most raw version: "Is this place enough? Are these people enough?" + +### Sacred / Profane / Middle Kingdom Randomization + +The lead approved Nigel's Sacred/Profane/Middle Kingdom framework with a key refinement: + +- **Sacred** = rules of the system (never randomize). "You don't randomize mass interactions." +- **Profane** = parameters drawn from pools. "You DO randomize gravity." +- **Middle Kingdom** = sacred structure, profane cast. Fixed dramatic architecture, variable characters filling it. + +**Full system mapping (from Gestalt's comprehensive table):** + +| System | Sacred | Profane | Middle Kingdom | +|---|---|---|---| +| Cultural generation | Derivation rules, access tier formulas | Which ingredients selected per world | Cultural parameter set structure | +| NPC generation | Composition matrix, tier requirements | Which NPCs fill which roles, names | NPC profile structure, pattern templates | +| FRIEND system | 5-phase arc structure, tell mechanics | Which NPC is FRIEND, specific contradiction | FRIEND template with cultural skinning | +| NOBODY system | Promotion trigger types, tier transitions | Which NOBODYs have which paths | Promotion path templates | +| District structure | Minimum social sites, NPC count, adversarial pair | Social site config, NPC assignments | District skeleton | +| Gate topology | Connectivity requirements, diameter limit | Which worlds connect, travel times | Small-world network properties | +| Storyteller | Pacing algorithm, escalation phases | Timing of events, pool selections | Storyteller decision nodes | + +**Gate topology as macro randomization:** +- Core worlds Sacred (always connected) +- Peripheral worlds Profane (vary per playthrough) +- Accessible count Middle Kingdom (number fixed, which ones varies) +- Unlockable worlds through gate events/quests = chapter-level randomization +- Future: planetary owner/developer DLC + +**Light generation** — pools of authored content, not generated from scratch. The generators PICK from authored templates, COMBINE them with cultural parameters, and DERIVE specifics. The authored template library is the product; the generator is the assembly line. + +### Interaction Model + +**WASD direct control with context-sensitive interaction** — unanimous (9/9 in Round 4 discussions). Player IS the character. Body is the attention mechanism. + +Direct embodiment required for: complicity, NOBODY tier promotion (player chooses where to look), occlusion (information hidden behind physical presence), FRIEND betrayal (proximity creates emotional weight). + +- Gestalt: "Hotline Miami movement + Disco Elysium interaction" +- Paula: single-action prompts that change based on proximity + relationship + knowledge +- Dedicated workshop brief written for full design: `docs/workshops/control-interaction/` + +### Generator Pipeline + +**Old model:** Writers produce districts, tooling accelerates writers. +**New model:** Engineers produce generators, writers produce generator inputs, tooling IS the product. + +**Gestalt's 6-phase generator development pipeline:** +1. INGREDIENT AUTHORING — heritage roots, motivations, economic functions, alignments, factions, drift stages, derivation rules +2. TEMPLATE AUTHORING — FRIEND arcs (30-50), MIRROR profiles (15-25), NOBODY promotion templates (40-60), triangle type templates (10-15), voice cards (30+), PC archetype definitions (8) +3. GENERATOR DEVELOPMENT — Cultural Parameter Generator, NPC Generator, FRIEND/MIRROR Skinner, District Composer, Naming Algorithm, Dialogue Line Expander, Gate Topology Generator, NOBODY Promotion Generator +4. VALIDATION DEVELOPMENT — schema validation, composition rule checker, constraint satisfaction verifier, cultural coherence checker, emotional integrity checker, diversity metrics +5. GENERATION + REVIEW — generate 300 worlds, automated validation, human review of FRIEND/MIRROR instances (100%), spot-check generated districts (5-10%) +6. HAND-ELEVATION — starting districts get polish, hub worlds get additional depth, narrative-critical worlds get authored threads + +**Mellanie's content math:** +- 300 worlds: ~3,300-7,400 authored lines + ~90 pages of specs +- 20 hand-crafted districts (Round 3 model): 13,500-31,200 authored lines +- The 300-world model requires LESS hand-authored content because the generator does the multiplication, but every authored line is higher-stakes + +--- + +## Theme — Open, Converging + +Candidates from the team: + +| Candidate | Author | Perspective | +|---|---|---| +| "Cost of participation" | Gore | The individual inside the system | +| "Collective bargain" | Mellanie | The community | +| "What do you owe the people around you?" | Ozzie | The relationships | +| "What do systems do to people inside them?" | Miri | The system itself | +| "Cost of connection / entanglement" | Paula | The relational web | +| "Knowledge as burden" | Gestalt | The information | +| "Who do you choose to see?" | Ozzie (Round 4) | The player's attention | + +**Current direction:** "Don't pick, derive" (Gore). All candidates orbit the same field. The derivation function guarantees every generated world falls within the thematic field. Let it resolve through the work. + +Gore's formulation: "The theme is the field, not any specific phrasing of it. The field is: what does it cost to be human inside something bigger than yourself?" + +The lead has not canonized a phrasing. Round 4 consensus: complicity is Sova-local; the universal theme is structural but unnamed. Every ingredient combination includes a system failure mode. Every failure mode produces a cost of participation. Every cost produces a version of "Is this enough?" The field is built into the generator's architecture. + +--- + +## Decisions from Rounds 1-2 (v0.1 Specific, Pending v0.1 Scoping Round) + +These were produced in Rounds 1-2 before the long-term reframe. They remain valid for v0.1 but need re-evaluation in light of the 300-world strategy: + +- **Hael renamed to Naia Tamm** (Miri proposed, unanimous) — resolves Kael/Hael sonic collision +- **All NPCs get full canonical names** (Miri generated 12 for Sova) +- **Smuggler lens gap needs fixing** — wiki is detective-shaped; smuggler needs operational attributes (`trust_read`, `exposure_risk`, `loyalty_assessment`, `leverage_held`, `social_debt`, `moral_weight`, `cover_integrity`, `loyalty_conflict`) and moral arc phases (Comfort, Doubt, Reckoning, Compromise) +- **Triangle 1 (Hub Power) needs Nils-vs-Voss escalation decision** — weakest triangle, smuggler role is passive, needs concrete fork +- **Routine format: 2-layer** (YAML + prose) — engine-readable schedule alongside human-readable description +- **Content directory structure:** `global/` + `districts/` as top-level split (Tyre + Gestalt converged) +- **FRIEND pool:** v0.1 = 1 per character (Kael, Sera), v0.2 = 2, architecture from day one. Pool-based selection, full Tier 1 minimum, no exceptions +- **Primary contraband fixed per district,** secondary varies per seed (medical/severance/enhanced/nothing) +- **Cultural gate modifier on dialogue access** — regional culture modifies disclosure independently of relationship state +- **Drin may need tier promotion** — doing Tier 2 work in a Tier 3 profile (Triangle 2, Triangle 5, compromised by Harek) +- **PC-as-NPC Concept A for v0.1** — other PC exists as NPC (~20-30 authored items), full identity randomization deferred to v0.2+ + +--- + +## Deferred to Future Workshops + +- **Control & Interaction Scheme** (brief written: `docs/workshops/control-interaction/`) +- **Perception system gravity variation** for world transitions — flagged by lead, endorsed as top priority by Ozzie, needs perception team +- **Full NPC pattern composition rules** — forbidden/preferred lists drafted by Gore, Gestalt, Paula; need consolidation and validation +- **Gate topology design** — network structure, hub placement, connectivity constraints, small-world properties +- **Storyteller cultural literacy** — how the storyteller adapts pacing to cultural trust-building rates +- **LLM-assisted content pipeline design** — Tyre proposed "write 10, generate 40" for Tier 2 expansion +- **Modding toolkit specification** — content pack manifest, ADD/REPLACE/MERGE overlay operations, template role-slot system +- **Inter-world political generation** — Paula proposed macro political layer: trade dependencies, cultural friction, historical grievances between worlds +- **IP originality validation at scale** — Miri proposed automated cultural distance validator to prevent franchise similarity in generated worlds + +--- + +## Ticket Recommendations + +Pending v0.1 scoping round. SI has a preliminary list of 28 tickets from Round 2 that needs revision in light of the strategy reframe. Key areas for ticketing: + +- Ingredient menu schema definition +- Derivation rule specification +- FRIEND arc template authoring (first 3-5) +- NOBODY promotion mechanic design +- Cultural parameter generator prototype +- Naming algorithm prototype (phonetic rules, not word lists) +- Composition matrix formalization +- Archetype voice card conversion (prose to axis-based specs) +- Naia Tamm rename cascade across wiki files +- Smuggler attribute vocabulary addition to wiki +- Triangle 1 strengthening (Nils stub page + decision moment) +- Gate topology design brief + +--- + +**Workshop produced:** 4 rounds x 8-9 contributors = ~35 response documents + lead interview + 3 tracking documents. Total workshop output in `docs/workshops/wiki-review/`. diff --git a/docs/workshops/wiki-review/lead-interview.md b/docs/workshops/wiki-review/lead-interview.md new file mode 100644 index 000000000..fe56dc0dc --- /dev/null +++ b/docs/workshops/wiki-review/lead-interview.md @@ -0,0 +1,117 @@ +# Lead Interview — Between Round 3 and Round 4 + +**Date:** 2026-02-12 +**Format:** Interactive 5-topic interview, one topic at a time +**Interviewer:** Team lead (Claude Code) +**Interviewee:** Jeroen (project lead) + +--- + +## Topic 1: Cultural Groups + +**Decision: Ingredients menu, not fixed taxonomy.** + +Cultural groups are assembled by picking and combining from a menu of ingredients per society: +- Heritage roots (recognizable but not directly mappable — "feels Nordic" not "is Finnish") +- Settlement motivation +- Economic function +- Philosophical alignment +- Corporate presence +- Time since settlement / drift stage + +**Key rules:** +- NOT required to pick from every category. What a society doesn't care about is as defining as what it does. Varying what matters creates flavor. +- Output must feel like a SOCIETY, not a matrix entry. +- Mechanical parameters (access tiers, trust defaults, investigation dynamics) DO need a structured matrix underneath. +- Heritage should be identifiable as a culture without feeling disparate. +- People migrate between heritages. Drift varies per location. +- Economics is missing from Nigel's 7 mechanical questions — must be added (what makes extra income tempting). + +**On heritage specificity:** The specific real-world roots (Finnish/Estonian/Latvian for Krenn) are Miri's reference material for building the culture, not something the player should clock directly. A character with a Nordic-sounding name in an East Asian-heritage district isn't wrong — they're a person with a history. The culture is the place, not the individual. + +--- + +## Topic 2: Content Patterns (NPC Archetypes) + +**Decision: Three separate systems, not one list.** + +### A. Thematic Patterns (what the character means to the story) +FRIEND, MIRROR, ANCHOR, GHOST, CATALYST, THRESHOLD, REMNANT, SYSTEM, **NOBODY** + +THE NOBODY is new — a person who is just... there. Background becomes foreground when the player pays attention. + +**Major system decision: Evolving relationships.** The lead explicitly wants a NOBODY to be able to become something more if the player invests attention. Quote: "evolving relationships sounds like a can of worms I would LOVE to open." This implies dynamic tier promotion, relationship-driven content unlocking, emergent narrative from player attention. + +### B. Functional Motivations (what the character is doing in gameplay) +HANDLER, WITNESS, TURNCOAT, CIVILIAN, OPERATOR, SKEPTIC + +These are Nigel's list — motivations, not archetypes. Developed in parallel with thematic patterns. + +### C. Composition +Each NPC gets a thematic pattern + a functional motivation. ANCHOR + OPERATOR plays very differently from ANCHOR + CIVILIAN. At 300-world scale, generators pick these combinations. + +--- + +## Topic 3: PC Archetypes + +**Decision: 8 archetypes at v1.0 as stress test.** + +- Insider + Investigator are deep because of v0.1 but must NOT become the permanent center. Other archetypes should feel equally primary in their districts. +- **Newcomer = v0.2 content update centerpiece.** Natural tutorial, fresh eyes on established world. +- **Archetypes are FLUID.** Players can move districts, change jobs, buy houses. The archetype is a current position in a community, not a character class. Archetype transitions are a game mechanic. +- "What still feels alive enough" is the question, not "how many per district." A bar 20 minutes from the gate in no-man's land still needs characters. +- The freedom to change your life flows naturally from the refocus on living a life. + +--- + +## Topic 4: Randomization + +**Decision: Nigel's Sacred/Profane/Middle Kingdom framework approved.** + +With a key refinement from the lead: +- Sacred = rules of the system (mass interactions). "You DO randomize gravity — you don't randomize mass interactions." +- Profane = parameters the rules operate on. Drawn from pools. Gravity varies by world; the physics engine doesn't. +- Middle Kingdom = sacred structure, profane cast. + +**Gate topology as macro randomization:** +- Core worlds always connected (Sacred) +- Peripheral systems vary per playthrough (Profane) +- Number of accessible systems may be fixed, which ones varies (Middle Kingdom) +- Unlockable worlds through random gate events or quests = chapter-level randomization +- Future possibility: planetary owner/developer DLC + +**Perception system note:** Varying gravity is a great way to breathe life into stepping onto another world. Flag for perception team. + +Generation is LIGHT — pick from pools of authored content, don't generate from scratch. + +--- + +## Topic 5: Scale + +**Decision: 300 worlds before DLC.** + +This is why we're building strategy and generator inputs, not authoring content by hand. + +**Release path:** +- v0.1 = proof of the interaction model (1 district, hand-authored) +- v0.2-v0.5 = testing generation systems and tooling +- v0.6-v0.10 = content pipeline at scale +- pre-v1.0 = 300 worlds populated via generators + style briefs + naming algos + +**Tooling first is absolute.** The authoring/generation pipeline must be proven before scaling. + +**Key reframe:** The style briefs, naming algorithms, character generators, and cultural parameter matrices ARE the product of this strategy work. They're generator inputs, not documentation. The planetary cultural identities are basically **seeds** — the cultural brief for a world IS the generation seed that parameterizes everything. + +--- + +## Theme — Still Open + +The lead has not picked a canonical framing. Candidates: +- Cost of participation (Gore) +- Collective bargain (Mellanie) +- What do you owe the people around you? (Ozzie) +- What do systems do to people inside them? (Miri) +- Cost of connection / entanglement (Paula) +- Knowledge as burden (Gestalt) + +May resolve as strategy solidifies. diff --git a/docs/workshops/wiki-review/round1-gestalt.md b/docs/workshops/wiki-review/round1-gestalt.md new file mode 100644 index 000000000..d22882803 --- /dev/null +++ b/docs/workshops/wiki-review/round1-gestalt.md @@ -0,0 +1,480 @@ +# Round 1 — Gestalt (Systems Design) + +*cracks knuckles* + +Alright. Four topics, all load-bearing. Let me break down what each one actually means mechanically. + +--- + +## Topic 1: Triangle Analysis — Do They Create Interesting Decisions? + +I'm going to evaluate all 5 triangles on three axes: **player agency** (does the player choose?), **information asymmetry** (do the two characters see different things?), and **system interaction** (does this triangle exercise multiple game systems?). + +### Evaluation Table + +| Triangle | Player Agency (Smuggler) | Player Agency (Detective) | Info Asymmetry | Systems Exercised | Verdict | +|----------|--------------------------|---------------------------|----------------|-------------------|---------| +| T1: Hub Power (Voss-Kael-Nils) | Low — observe/mediate, mostly reactive | Low — sees Voss's anxiety, one thread | Medium — smuggler knows hierarchy, detective sees stress | Schedule, authority dynamics | **Weakest** | +| T2: Worried Knowledge (Maret-Drin-Voss) | Medium — manage risks (two aware NPCs) | High — two witness paths (cooperative vs turned) | High — smuggler knows who's compromised, detective doesn't | Investigation, tells, knowledge gating | **Strong** | +| T3: Bar Tensions (Lera-Torek-Olin) | Medium — address Torek's visibility, assess Olin | Medium — financial tell + ambiguous newcomer | High — spending could be ring OR mundane, player doesn't know | Financial observation, ambiguity, social site dynamics | **Strong (uniquely mundane)** | +| T4: Worried Partner (Hael-Kael-Sera) | High — lie to Hael, protect Kael, emotional cost | High — Hael as leverage, Sera's concealment | Maximum — both FRIEND NPCs are nodes | Relationships, tells, FRIEND arc, emotional weight | **Essential** | +| T5: Informant Question (Pell-Renn-Drin) | High — handle Pell (support/report/calm) | Medium-High — indirect benefits from ring fracture | High — smuggler sees internal threat, detective sees external symptoms | Cross-template propagation, ring stability | **Strong** | + +### Detailed Analysis + +**T1 (Hub Power) is the weakest triangle.** Here's why: + +1. **Nils is off-stage.** One vertex of the triangle is never physically present in v0.1. This means the smuggler can never mediate a Voss-Nils confrontation in real-time. The tension is narrated/implied, not observed and acted upon. + +2. **The smuggler's role is "caught between" — but what do they DO?** The wiki says Kael "wants everyone to calm down." That's a passive stance, not a decision point. Where's the moment where the smuggler must choose Voss OR Nils, and face consequences? + +3. **The detective's interaction is one-directional.** Detective sees Voss's anxiety, which is an investigation thread — but it's a data point, not a decision. "Voss seems nervous" leads to "investigate why" but doesn't fork into meaningfully different paths. + +**Proposal to strengthen T1:** Give the smuggler a concrete decision moment. Example: Nils sends word (through Devra or Renn) demanding higher volume on the next run. Voss refuses to adjust the schedule. The smuggler must choose: +- **Side with Nils** (schedule the extra volume anyway) → Voss resents it, becomes less cooperative, might become a liability +- **Side with Voss** (tell Nils's messenger it's too risky) → Nils pushes back through other channels, smuggler's loyalty is questioned +- **Try to split the difference** (partial run, creative routing) → both sides grudgingly accept, but the operation is messier, increasing detective observation chances + +This gives the smuggler a concrete fork with cascading consequences. The detective still sees the RESULTS of whichever choice was made (schedule anomalies, Voss's mood, operational messiness). + +**T3 (Bar Tensions) is critically important BECAUSE it's mundane.** Per D-029, ~50% of NPCs should be in mundane triangles. T3 is the only triangle that might genuinely be disconnected from the ring. Torek's money could be from: +- The ring (entangled) +- A side hustle (mundane) +- An inheritance (flat) +- Gambling winnings from Harek's card games (mundane but connected to Harek's pressure on Drin) + +This ambiguity is load-bearing. If the detective investigates Torek's spending and it turns out to be mundane, that's a RED HERRING — and red herrings are essential for investigation gameplay. The detective needs noise to make the signal meaningful. The smuggler player who KNOWS whether Torek is ring-connected has a different experience from the detective player who doesn't. + +**My concern:** Is the ambiguity determined per-seed (randomizer decides at game start whether Torek is ring-connected) or is it authored (always one answer)? If always one answer, replay value drops. If per-seed, this becomes an excellent replayability vector. + +**Recommendation:** Make Torek's ring connection randomizable. This is exactly the kind of variable the storyteller should control — it doesn't change the NPC profile structure, just one flag. + +**T4 (Worried Partner) and T5 (Informant Question) are both excellent.** No notes on these — they produce rich, multi-system decisions for both characters. T4 is the emotional masterpiece; T5 is the operational thriller. + +### Redundancy Check + +**Are any triangles mechanically redundant?** No — but T2 and T5 share a "potential informant" theme through different lenses: + +| | T2 (Worried Knowledge) | T5 (Informant Question) | +|---|---|---| +| Key NPC | Maret (civilian who noticed) | Pell (ring member who's wavering) | +| Threat type | External observer | Internal defector | +| Smuggler decision | Manage an outsider who knows too much | Handle a member who might flip | +| Detective approach | Turn a cooperative witness | Receive an informant | +| System overlap | Both exercise "people who might talk" | Different mechanics — observation vs. loyalty | + +They share Drin as a node, but Drin serves different functions: in T2 he's a compromised inspector, in T5 he's a potential recipient of information. These are mechanically distinct enough to justify both triangles. + +### Summary + +- **Keep all 5.** None are redundant. +- **Strengthen T1** with a concrete smuggler decision moment (Nils vs. Voss volume escalation). +- **Make T3's ambiguity randomizable** per seed (Torek's ring connection as storyteller variable). +- **Consider making Nils partially present** — even one short visit or comm call in v0.1 would make T1 dramatically more functional. + +--- + +## Topic 2: Mechanical Constraints for the Style Guide + +Every NPC profile feeds into engine systems. If a field is missing or wrong, the system breaks silently. Here's what the style guide MUST mandate. + +### Hard Mechanical Requirements (Engine Will Break Without These) + +| Constraint | Reason | System That Reads It | Applies To | +|-----------|--------|---------------------|------------| +| **Routine must specify hourly location presence** | Schedule system generates NPC movement from this | `ScheduleSystem` → NPC position per tick | All tiers | +| **Routine must reference canonical location slugs** | Locations are addressed by slug in the engine | `LocationRegistry` | All tiers | +| **Every NPC must have a `faction` value from the canonical set** | Access tier logic reads this for dialogue filtering | `AccessTierResolver` | All tiers | +| **Every NPC must have a `role` value** | Default descriptor when name unknown; access tier calculation | `EntityKnowledge.known_attributes["role"]` | All tiers | +| **Every NPC with a secret must map it to a FactId** | Secrets must be discoverable through the knowledge system | `FactId` catalog lookup, `KnowledgeConfidence` gating | Tier 1-2 | +| **Every tell must map to a `behavior_flags` value** | Tell system reads comma-separated flags | `EntityKnowledge.known_attributes["behavior_flags"]` | Tier 1-2 | +| **Contradiction must specify `contradiction_flagged` value** | THE FRIEND arc trigger reads this exact attribute | `EntityKnowledge.known_attributes["contradiction_flagged"]` | Tier 1 (FRIEND) | +| **Relationships must reference NPCs that exist in the roster** | Knowledge graph population uses these for cross-entity links | `EntityKnowledge` entries generated from relationships | Tier 1-2 | +| **Dual-lens notes required for all triangle members** | Content authors need guidance for dual-lens dialogue writing | Monologue/dialogue authoring pipeline | Tier 1-2 in triangles | +| **Bridge NPCs must have routine entries for EACH social site** | NPCs that span sites must physically appear in both | `ScheduleSystem` multi-location routing | Bridge NPCs | + +### Soft Mechanical Requirements (Won't Break Engine, But Content Quality Suffers) + +| Constraint | Reason | Applies To | +|-----------|--------|------------| +| **Personality traits should use established vocabulary** | Trait modifiers in dialogue need consistent inputs | Tier 1-2 | +| **Voice samples should cover at least 2 moods** | Content authors need voice reference for dialogue writing | Tier 1-2 | +| **Information Inventory must distinguish "knows" from "doesn't know"** | Starting knowledge graph needs explicit boundaries | Tier 1-2 | +| **Tolerance threshold must name specific triggers** | Storyteller evaluates NPC tolerance against events | Tier 1-2 | +| **Contentment should use the high/moderate/low vocabulary** | D-024 thematic axis needs consistent scaling | Tier 1-2 | +| **Skill set must include combat tag (yes/no)** | CombatCapability ECS component gated by this tag | All tiers | + +### Proposed Format for Routine (Engine-Readable) + +The current wiki uses prose for routines. The engine needs structured data. I propose the style guide require a structured routine block alongside the prose: + +```yaml +routine: + schedule: + - time: "06:00-06:30" + location: terminal # canonical location slug + activity: shift_startup + - time: "06:30-10:30" + location: terminal + activity: work_freight + - time: "10:30-11:00" + location: terminal_breakroom + activity: social_lunch + - time: "11:00-14:00" + location: terminal + activity: work_freight + - time: "14:30-16:00" + location: bar + activity: social_offshift + - time: "16:00-22:00" + location: residential + activity: home + deviations: + - trigger: ring_operation + replaces: "22:00-home" + location: corridor_b7 + frequency: "1-2x per week" +``` + +This means: the wiki prose routine is for humans, but a YAML routine block is what gets translated to engine data. The style guide should define both. + +### Proposed Validation Checklist (Per-Tier) + +**Tier 3 (minimum viable NPC):** +- [ ] Name, role, faction +- [ ] Routine with at least 2 time-location entries +- [ ] 1 `behavior_flags` value (even "baseline") +- [ ] Combat tag (yes/no) +- [ ] Function note (why this NPC exists) + +**Tier 2 (working profile):** +- [ ] All Tier 3 requirements +- [ ] All 10 axes populated +- [ ] Secret mapped to FactId (if applicable) +- [ ] At least 1 tell with `behavior_flags` mapping +- [ ] Dual-lens notes (if in a triangle) +- [ ] Relationships reference existing roster NPCs +- [ ] Voice sample (2-3 lines, at least 2 moods) + +**Tier 1 (FRIEND):** +- [ ] All Tier 2 requirements +- [ ] Contradiction arc (3+ phases) +- [ ] `contradiction_flagged` value specified +- [ ] Tell progression (minimum 3 stages) +- [ ] Dual-lens notes for BOTH characters +- [ ] Voice sample covering all moods in contradiction arc +- [ ] Content requirements met (70-100 authored lines) + +--- + +## Topic 5: Content Scoping — Per-District vs. Global + +Let me break down what this actually means mechanically. Every content file lands in one of three buckets. + +### The Three Buckets + +**Bucket 1: Global Definitions (same everywhere, loaded once)** + +These are vocabulary and schema — they define WHAT things can exist, not WHERE they exist. + +| Content Type | Example | Why Global | +|---|---|---| +| FactId catalog (definitions) | `contraband.ring_exists` definition structure | FactIds are a vocabulary — same naming convention everywhere | +| Faction definitions | "The Lattice Commission is..." | Faction identity doesn't change per district | +| Technology descriptions | "Neural lattice is a brain-computer interface..." | Technology is tech everywhere | +| Contraband type definitions | "Lattice components are aftermarket neural mods..." | What a thing IS doesn't change by location | +| Tag taxonomy enums | Situations, topics, moods, triggers | Engine schema — universal | +| Relationship state definitions | Unknown/Known/Friendly/PoI/Hostile | State machine is global | +| Entity attribute schema | The 14 canonical keys | Data model is global | +| Access tier definitions | public/peer/insider/authority/hostile | Dialogue filtering rules are global | + +**Bucket 2: Per-District Content (unique to each setting)** + +These are the authored meat — they vary entirely by location and can't be shared. + +| Content Type | Example | Why Per-District | +|---|---|---| +| NPC profiles | Kael Davan lives in Sova Transit | NPCs are physically located somewhere | +| NPC routines | Kael's schedule references specific locations | Locations are district-specific | +| Triangle definitions | Hub Power triangle among Sova NPCs | Triangles are relationships between local NPCs | +| Location descriptions | "The Terminal is a logistics hub..." | Physical spaces are unique | +| Monologue pools | Lines reference specific NPCs and locations | Content is hyper-local | +| Dialogue pools | Lines written for specific template roles | Roles are template-specific | +| Contraband instances | "The ring moves lattice components through Sova" | What's being smuggled HERE | +| District-specific FactIds | `location.corridor_b7_restricted` | Only meaningful in this district | + +**Bucket 3: Global Definition, Per-District Instantiation** + +This is the tricky bucket. These things have a global identity but local presence. + +| Content Type | Global Part | Per-District Part | Example | +|---|---|---|---| +| Factions | Definition, goals, ideology | Presence, strength, local leader, local agenda | Commission exists globally; Sera is the local presence | +| Contraband types | Definition, legality, market dynamics | What's actually flowing through THIS district, volume, routes | Lattice components defined globally; Sova's ring is local | +| FactId confidence states | Definition of confidence levels | Starting knowledge per NPC per district | `contraband.ring_exists` is a global FactId; the smuggler starts at KnowsDetails in Sova | +| Relationship templates | State machine, transition rules | Actual NPC-to-NPC and NPC-to-PC relationships | RelationshipState::Friendly is global; Kael-to-smuggler is local | +| Regional cultural flavor | Naming pattern template | Specific names, aesthetic markers, language echoes | "Compact, consonant-heavy" is Krenn System's cultural profile | + +### Proposed Content Directory Structure + +``` +content/ + _global/ + schema/ + fact-ids.yaml # FactId definitions (vocabulary) + entity-attributes.yaml # 14 canonical keys + tags.yaml # situations, topics, moods, triggers + relationship-states.yaml # state machine definition + access-tiers.yaml # dialogue filtering rules + factions/ + concord-assembly.yaml # faction description + goals + lattice-commission.yaml + syndics.yaml + guardians-of-autonomy.yaml + veil-institute.yaml + the-unbound.yaml + technology/ + neural-lattice.yaml + meridian.yaml + span-gates.yaml + founder-gates.yaml + clone-transfer.yaml + severance-tech.yaml + contraband/ + lattice-components.yaml # type definition + medical-grade.yaml + severance-equipment.yaml + regions/ + krenn-system.yaml # regional style guide (naming, culture) + + districts/ + sova-transit/ + district.yaml # district metadata, location list, faction presence + npcs/ + kael-davan.yaml # full NPC profile (all axes) + sera-venn.yaml + voss.yaml + ... + triangles/ + hub-power.yaml # triangle definition (references NPC slugs) + worried-knowledge.yaml + bar-tensions.yaml + worried-partner.yaml + informant-question.yaml + locations/ + terminal.yaml # location description + spatial data + bar.yaml + corridor-b7.yaml + facts/ + local-facts.yaml # district-specific FactId instances + starting confidences + dialogue/ + terminal.yaml # shared dialogue lines (both characters hear these) + bar.yaml + corridor.yaml + monologue/ + terminal-smuggler.yaml # per-character per-location (D-032) + terminal-detective.yaml + bar-smuggler.yaml + bar-detective.yaml + corridor-smuggler.yaml + corridor-detective.yaml + factions.yaml # local faction presence + strength + local NPCs +``` + +### Mod Overlay Principle + +A mod adds a district: + +``` +mods/ + new-bar-district/ + mod.yaml # mod metadata, dependencies, load order + content/ + districts/ + new-bar-district/ # mirrors structure above + district.yaml + npcs/... + triangles/... + ... +``` + +**Override rules:** +- District content: additive (new districts don't replace existing ones) +- Global content: override by key (mod provides `factions/new-faction.yaml` → added to faction list; mod provides `factions/lattice-commission.yaml` → overrides the global definition) +- NPC replacement: mod specifies `replaces: kael-davan` in NPC YAML → replaces that NPC in the roster + +**Key constraint for Tyre:** Global schema files (`_global/schema/`) should be versioned. A mod that targets `schema_version: 1` should still load on `schema_version: 2` if the changes are additive. Breaking schema changes require mod updates. + +--- + +## Topic 6: PC-as-NPC — Mechanical Specification + +This is the most interesting systems question. Let me map exactly what happens when an NPC is "upgraded" to a player character. + +### The Upgrade Process + +``` +Game Start + ├─ Player selects archetype (smuggler / detective) + ├─ System selects NPC matching archetype from district pool + ├─ NPC profile → PC brief (data transfer + transformation) + ├─ NPC removed from roster (they're now the player) + ├─ All other NPCs' knowledge about this entity adjusted + └─ Game begins at PC's routine starting position +``` + +### Data Transfer Table + +| NPC Axis | What Transfers | How It's Used as PC Data | Transform Required? | +|----------|----------------|--------------------------|---------------------| +| **Name** | Directly | PC identity, how NPCs address you | No | +| **Age** | Directly | Cosmetic, some dialogue gating | No | +| **Role** | Directly | PC occupation, access tier baseline | No | +| **Cultural Group** | Directly | Naming conventions, environmental text familiarity | No | +| **Lattice Tier** | Directly | Perception mode availability (D-017) | No | +| **Employer** | Directly | Legitimate cover, schedule justification | No | +| **Want** | Transforms → Starting Objectives | PC's objectives screen, monologue motivation | Yes — prose → objective entries | +| **Secret** | Transforms → Player Burden | PC knows their own secret; it becomes what they must manage | Yes — inverted (NPC hides FROM observer; PC hides FROM world) | +| **Relationships 1-3** | Transforms → Starting Social Network | Starting `RelationshipState` entries + `EntityKnowledge` for all known NPCs | Yes — relationship data → knowledge graph entries | +| **Tolerance** | Transforms → Stress/Consequence System | Defines what pushes the PC toward failure states | Yes — NPC threshold → player consequence thresholds | +| **Routine** | Transforms → Default Schedule (overrideable) | PC's expected schedule; deviations are observable to NPCs | Yes — rigid schedule → soft expectation with deviation tracking | +| **Information Inventory** | Transforms → Starting Knowledge Graph | All starting `FactId` confidences + `EntityKnowledge` entries | Yes — prose → structured knowledge data | +| **Contentment** | Directly | Starting thematic position, monologue tone baseline | No | +| **Personality** | Transforms → Monologue Voice | Which monologue pool, word choice, analytical vs emotional | Yes — traits → voice selection parameters | +| **Tell System** | Inverted | OTHER NPCs can observe the PC's tells when the PC lies/evades | Yes — "observe this tell" → "NPCs detect this behavior" | +| **Skills** | Directly | PC capabilities, combat tag, functional permissions | No | + +### What's Generated at Upgrade Time + +These don't exist in the NPC profile — they're computed from the profile data: + +| Generated Data | Source | Purpose | +|---|---|---| +| **Starting `EntityKnowledge` entries** | Information Inventory + Relationships | Populate the PC's knowledge graph for every NPC they know | +| **Starting `FactId` confidences** | Information Inventory | What facts the PC already knows at what confidence level | +| **Starting `RelationshipState` per NPC** | Relationships + role + faction | Unknown/Known/Friendly for each NPC based on prior relationship | +| **Starting `known_attributes` per NPC** | Information Inventory | Name, role, faction, routine_pattern, behavior_flags (baseline) for known NPCs | +| **Reverse knowledge entries** | All NPCs who know this NPC | Other NPCs' `EntityKnowledge` about the PC — what do THEY know about YOU? | +| **Starting position** | Routine + game start time | Where the PC physically spawns | +| **Monologue pool activation** | Archetype selection | Which `character:` tag pool is active | +| **Starting inventory/equipment** | Skills + role + archetype | Functional items derived from occupation | + +### The Critical Insight: Reverse Knowledge + +When an NPC becomes a PC, every OTHER NPC's knowledge about that entity matters: + +**Example — Kael becomes the smuggler PC:** +- Voss knows Kael as "dock worker, reliable, part of the arrangement" → Voss has `EntityKnowledge` with `faction: "ring member"`, `trust_level: "reliable"`, `relationship_type: "subordinate"` +- Hael knows Kael as "my partner, acting strange lately" → Hael has `EntityKnowledge` with `relationship_type: "partner"`, `behavior_flags: "evasive,late_nights"`, `trust_level: "uncertain"` +- Sera knows Kael as "Hael's partner, flagged in compliance check" → Sera has `EntityKnowledge` with `secret_held: "manifest discrepancies"`, `secret_confidence: "confirmed"` + +This means **the NPC profile's Relationships section is read bidirectionally.** When writing an NPC profile that might be upgraded to a PC, the author must specify not just "who does this NPC know" but implicitly "what does each related NPC know about THIS NPC." + +### What the NPC Profile Doesn't Have (PC-Only Data) + +| PC-Only Data | Where It Comes From | +|---|---| +| **Monologue lines** | Separate content files, not NPC profile | +| **Starting objective text** | Derived from Want + archetype-specific framing | +| **Tutorial integration hooks** | Archetype-specific, not NPC-specific | +| **Equipment/inventory** | Derived from skills + role, archetype defaults | +| **Player agency permissions** | Archetype-specific (smuggler can access ring locations, detective can use authority access) | +| **Perception mode configuration** | Lattice tier + equipment, archetype defaults | + +### Style Guide Implications + +For NPCs that are candidates for PC upgrade (any archetype-matching NPC), the profile MUST additionally specify: + +1. **Starting FactId confidence table** — explicit list of which facts at what confidence level: + ```yaml + starting_knowledge: + facts: + - id: contraband.ring_exists + confidence: KnowsDetails + - id: contraband.lattice_components + confidence: KnowsDetails + - id: location.corridor_b7_restricted + confidence: KnowsDetails + - id: world.shift_schedule + confidence: KnowsDetails + - id: relationship.ring_membership + confidence: KnowsDetails # knows the ring, knows members + - id: investigation.manifest_discrepancy + confidence: null # doesn't know about this + ``` + +2. **Starting RelationshipState table** — explicit per-NPC: + ```yaml + starting_relationships: + - npc: voss + state: Known + attributes: + name: "Voss" + role: "shift supervisor" + trust_level: "reliable" + faction: "civilian" # smuggler doesn't think of Voss as ring + - npc: kael_davan # N/A if this NPC IS Kael + state: Friendly + ... + ``` + +3. **Reverse knowledge entries** — what each related NPC knows about THIS character: + ```yaml + known_by: + - npc: voss + attributes: + name: "Kael Davan" + role: "dock worker" + faction: "ring member" # Voss knows + trust_level: "reliable" + - npc: hael + attributes: + name: "Kael" + role: "dock worker" + faction: "civilian" # Hael doesn't know about ring + behavior_flags: "evasive,late_nights" + ``` + +### Randomizer Integration + +For the randomizer to generate PC-viable NPCs: + +1. **Archetype templates** define the minimum requirements: + ```yaml + archetype: smuggler + requires: + faction_access: [ring] + minimum_relationships: 3 + minimum_facts_at_KnowsDetails: 4 + social_sites: [hub, ring] # must have presence in these + combat_tag: false # smugglers aren't fighters (v0.1) + ``` + +2. **NPC generation** creates the full 10-axis profile per D-024 +3. **PC viability check** confirms the NPC meets archetype requirements +4. **Upgrade** executes the transfer/transform/generate pipeline above + +### What the PC-as-NPC Spec Resolves + +This spec answers several open questions: + +- **"Where does starting knowledge come from?"** → Information Inventory axis, translated to FactId confidences + EntityKnowledge entries +- **"How do NPCs already know the player?"** → Reverse knowledge entries from the NPC profile's Relationships, read bidirectionally +- **"What changes between playthroughs?"** → Different NPC selected → different name, relationships, starting knowledge, position. Same systems, different starting state. +- **"Does the player have a routine?"** → Yes, inherited from NPC. Deviation from routine is observable to NPCs — this creates a soft constraint that grounds the PC in the world. + +--- + +## Cross-Cutting Observations + +A few things connect across all four topics: + +1. **The NPC profile is the master document.** Triangles, dialogue prerequisites, knowledge graph population, and PC upgrade all read from it. The style guide isn't just a writing guide — it's a data specification. + +2. **Routine is the most mechanically overloaded axis.** The schedule system, tell deviation detection, NPC-observing-PC system, and location presence all read from it. It needs the most precise specification. + +3. **Information Inventory is the second-most critical.** It's the seed for the entire knowledge graph — both for NPCs and for PC upgrade. If it's vague, the engine can't populate starting states. + +4. **Triangles need decision moments, not just tension descriptions.** The wiki describes tensions beautifully. What it doesn't specify is the FORK — the moment where the player must choose, and can't have both outcomes. T1 is weakest here. The style guide should require that each triangle specifies at least one concrete decision moment per playable character. + +5. **The boundary between global and local content is also the boundary between what modders can freely add vs. what they must integrate with.** Districts are self-contained additions. Global content changes require understanding system-wide consequences. The content directory structure should make this boundary obvious. diff --git a/docs/workshops/wiki-review/round1-gore.md b/docs/workshops/wiki-review/round1-gore.md new file mode 100644 index 000000000..078cf2c86 --- /dev/null +++ b/docs/workshops/wiki-review/round1-gore.md @@ -0,0 +1,207 @@ +# Round 1 — Gore + +## Topic 1: Direction Check — Is This the Game We Want? + +### The short answer + +Almost. The wiki describes a mechanically sophisticated game about asymmetric information. What it doesn't fully articulate is what the game is *about*. + +### What the wiki gets right + +**Hael is the masterpiece.** I want to be clear about this because it could get lost in what follows. Hael — a teacher, a civilian, a person who just wants their partner to come home on time — is the emotional fulcrum of the entire vertical slice. Both FRIEND arcs orbit Hael. Kael is hiding things to protect Hael. Sera is hiding things to protect Hael. The smuggler must lie to Hael. The detective can weaponize Hael. One person who never touches the conspiracy is the person the conspiracy most damages. That's not just good design. That's the game's thesis statement in a character. + +**The contraband is morally correct.** Medical-grade lattice components for people locked out of the institutional system. The ring isn't moving weapons — they're moving healthcare. D-037 gets this exactly right. The smuggler isn't a villain. The detective isn't a hero. The system failed people, and the ring is the scar tissue. This is what "quotidian-with-undertow" actually means: the undertow isn't evil, it's *rational*. + +**The contradiction arcs are structurally excellent.** Kael's single-observation contradiction (Corridor B-7) versus Sera's cumulative-pattern contradiction (three departures when Torek arrives) — two different ways of discovering betrayal, both honest to their characters, both mechanically distinct. The tell system (Kael looks left when lying, Sera over-helps to compensate) gives the player agency in the discovery. This is authored content earning its depth. + +### What's missing: the philosophical spine + +The wiki describes *what happens* with precision. It's weaker on *what it means*. + +There's a word for what this game is actually about, and it isn't "asymmetric information." It's **complicity**. + +Every character in Sova Transit District is complicit in something: +- **Kael** is complicit in the ring's operations (even while trying to exit) +- **Sera** is complicit in concealment (sitting on evidence to protect a friend) +- **Voss** is complicit in smuggling (takes a cut, manages the schedule) +- **Lera** is complicit through willful ignorance (Torek's spending keeps her bar viable) +- **Maret** is complicit through silence (sees the discrepancies, doesn't report) +- **Drin** is complicit through coercion (gambling debt, can't say no) +- **The smuggler** is complicit in all of it — and depending on player choices, becomes more so +- **The detective** becomes complicit the moment they choose which truths to pursue and which to ignore + +And the player? The player becomes complicit in whatever they choose. There is no "observe without participating" option. Watching IS participating. Knowing and not acting IS a choice. + +This is what D-027's success criterion #3 ("player names an NPC they felt conflicted about") is really measuring. Not "did the NPC have good dialogue?" but "did the player feel the weight of their own complicity?" + +**The wiki needs to name this.** Right now, "asymmetric information" is treated as the core mechanic AND the core theme. It's the mechanic. The theme is complicity. Every NPC profile should be readable through the lens of: *what are they complicit in, and what would it cost them to stop?* + +### The contentment axis is underdeveloped + +D-024 introduced contentment (my proposal) as a thematic axis. The NPC profiles include it but treat it as a status indicator rather than a thematic driver. Kael's contentment is "moderate-low." Sera's is "moderate, declining." + +This misses the point. Contentment isn't a meter. It's the question the game asks every character — and by extension, the player: + +**"Is this enough?"** + +That's the question the Commonwealth universe was built to explore. Post-scarcity societies (and the Settled Reach is *close* to post-scarcity, if not there) force every intelligent being to answer: when survival is solved, what do you do? What's worth wanting? + +Every NPC in the district has an implicit answer: +- **Kael**: "It was enough until it wasn't. Now I want out, but 'out' might not exist." +- **Sera**: "It was enough until someone I care about was in pain. Now my quiet life is a lie." +- **Lera**: "It's enough. Don't ask me questions that would change that." +- **Maret**: "It should be enough. The numbers say otherwise. I can't un-see them." +- **Hael**: "It was enough. Something changed and nobody will tell me what." +- **Voss**: "It's enough if people stop pushing. (They won't stop pushing.)" + +The smuggler and detective each answer this question through play. The smuggler's answer is: "It isn't enough — I need more money, more security, more control." The detective's answer is: "It isn't enough — something is wrong here and I need to know what." + +**Proposal:** Add a "Thematic Question" field to NPC profiles — not a mechanical axis, but an authoring-guide entry that states the character's implicit answer to "Is this enough?" This anchors every NPC to the game's philosophical spine without adding mechanical complexity. Content authors write to a *question*, not just a set of traits. + +### The dual-lens needs a thematic frame, not just a mechanical one + +"Same world, two lenses" is the tagline. The wiki executes this mechanically: the smuggler sees Kael's greeting as warmth, the detective sees it as data. Good. + +But the deeper version is: the smuggler's lens is *complicity* and the detective's lens is *judgment*. The smuggler knows they're part of the problem. The detective believes they're outside it. Both are wrong. The smuggler is trying to exit (via Kael's arc), which means the complicity isn't total. The detective becomes complicit the moment they choose to protect Sera or use Hael as leverage. + +The best version of this game doesn't just show you two perspectives. It shows you that the distinction between "inside" and "outside" a conspiracy is a fiction. Everyone is inside something. The only question is what. + +### Specific wiki amendments I'd propose + +1. **Wiki index.md** — Add a "Thematic Core" section before "Quick Reference" that states: *The Settled Reach asks what happens when comfortable people discover they're complicit in systems they depend on. Every character is compromised. The game's question isn't "who did it?" but "what will you do now that you know?"* + +2. **NPC profiles** — Add `## Thematic Question` section to the Tier 1 template. Not mechanical. Authoring guidance: "This character's answer to 'Is this enough?'" + +3. **Relationship states** — The "Contaminated Trust" concept in Phases 5 of both FRIEND arcs is the game's thematic core expressed as a mechanic. The wiki treats it as a post-arc state. I'd elevate it: contaminated trust isn't an endpoint, it's the *normal condition of adult relationships in a compromised community*. Everyone in Sova Transit District already lives with contaminated trust. The player just hasn't noticed yet. + +--- + +## Topic 3: Cultural Identity and the Game's Themes + +### You're asking the wrong question + +The workshop asks: "Should the player notice heritage, or is it ambient?" + +Neither. Cultural identity in this game is **the immune system of the community**, and the detective is the foreign body. + +### What Krenn System culture actually is + +The wiki describes Krenn System culture as "compact names, first-name-primary, pragmatic, mind-your-business ethos." That's fine as a naming guide. It's radically incomplete as a cultural description, because it doesn't say what the culture *does*. + +What Krenn System culture does is **protect the ring**. + +Not intentionally. Not conspiratorially. But structurally: +- **Mind-your-business ethos** = nobody reports Torek's spending, nobody asks where Kael goes at night, nobody questions Voss's schedule changes. The cultural norm IS the ring's security model. +- **First-name-primary social contexts** = institutional identity (Sera's Commission role, the detective's authority) is deemphasized in social settings. You're "Sera," not "Field Tech Venn." This makes authority feel like an imposition, not a service. +- **Pragmatic** = the ring exists because people need things the system doesn't provide. Pragmatism doesn't moralize about *how* needs get met. This is the cultural bedrock of the grey economy. +- **Working-class freight district** = solidarity is default. The detective, regardless of personal warmth, represents institutional authority that could shut down someone's livelihood. Cooperation with the detective isn't just risky — it's a betrayal of social solidarity. + +The bar is called "The Last Shift." Not "The Starlight Lounge." Not "The Golden Gate." A name that says: *we're tired, we're done for the day, this is where we exhale*. That name IS the culture. It tells you everything about who these people are and what they value. + +### Cultural identity as mechanical resistance + +Here's my concrete proposal: + +Cultural identity should manifest as the **difficulty gradient the detective faces** and the **social camouflage the smuggler benefits from**. Not as a stat or a modifier, but as a felt experience: + +1. **Detective experience**: NPCs default to surface-level cooperation. They answer questions but don't volunteer. They're polite but not helpful. The cultural value of minding your own business means the detective has to *earn* every piece of real information, not because people are hostile, but because sharing someone else's business violates a social norm. This is why Maret hasn't reported. It's not fear — it's *culture*. + +2. **Smuggler experience**: The smuggler is *of* this culture. First-name-primary, bar regular, knows the rhythms. The ring works because it's culturally embedded — "we take care of our own" is both a family value (Nils to Kael) and a community value (Lera protecting her regulars). The smuggler's camouflage isn't a disguise. It's *being from here*. + +3. **The cultural rupture**: When the detective's investigation disrupts the community — when Drin is pressured, when Maret is confronted, when Hael is drawn in — the damage isn't just to the ring. It's to the social fabric. People who minded their own business are now being asked to testify. Friendships that assumed privacy are now under scrutiny. The detective isn't just solving a crime. They're tearing a community's operating agreement apart. The question is whether that's justice or vandalism. + +### Should the player notice heritage? + +Heritage should be like gravity. You don't notice it. You notice when it's absent. + +The player should never think "oh, this is a Krenn System cultural value." They should think "why won't anyone talk to me?" (detective) or "I'd never bring that up at Lera's" (smuggler). The culture is the water they swim in. It becomes visible only when someone (the detective, Olin the outsider) doesn't understand the rules. + +Miri will have more to say about the specific cultural clusters, heritage drift over 180 years, naming conventions. That's important work. My contribution is this: **whatever the cultural details are, they must serve the game's mechanical and thematic needs**. The mind-your-business ethos isn't decoration. It's the reason the ring survives. It's the reason the detective's job is hard. It's the reason Maret is silent and Lera is blind and Hael is confused. Culture IS the gameplay. + +### What the regional style guide pattern needs + +Beyond naming and aesthetics, each regional style guide should include: + +1. **Default social norm toward authority**: How do locals treat institutional representatives? (Krenn System: polite distance, cooperation without volunteering, first-name-basis to deformalize authority) +2. **Privacy expectations**: What's considered "your business" vs. community knowledge? (Krenn System: income source is private, spending is visible but uncommented upon, relationships are acknowledged but not interrogated) +3. **Loyalty structure**: Family first? Community first? Institution first? (Krenn System: family > workplace bonds > district solidarity > institutional allegiance) +4. **The thing nobody discusses**: Every community has a shared silence. (Krenn System: everyone knows the grey economy exists. Nobody names it.) + +These aren't flavor entries. They're **mechanical parameters for dialogue selection**. When the detective asks Lera about Torek's spending, Lera's deflection isn't personality — it's culture. A regional style guide that doesn't capture this is incomplete. + +--- + +## Topic 6: Procedural Generation — Dilution or Amplification? + +### Wrong question. Let me reframe it. + +The workshop asks whether procedural generation dilutes authored moments or amplifies them. That's a question about production methodology. The real question is: + +**Can a procedurally generated relationship make you feel complicit?** + +Because that's what the game needs. Not "can a proc-gen NPC have a schedule" — obviously yes. Not "can a proc-gen NPC have dialogue" — with tagged pools, yes. But can a proc-gen NPC make you feel the weight of knowing their secret? Can a proc-gen NPC be THE FRIEND? + +No. And that's the answer that matters. + +### What can't be generated + +Kael's tell — looking left when lying — works because the player learns to recognize it over 15 minutes of authored casual interaction, then sees it during the confrontation. That's an authored behavioral arc. A procedural system can't teach the player to read a specific NPC's body language through repeated authored moments. + +Sera's avoidance pattern works because it requires three specific departures, each with a different excuse, spaced across multiple bar visits, with the detective's training firing on the third. That's precision timing. A procedural system can generate "NPC leaves when other NPC arrives" but can't generate the escalating internal monologue that makes the third departure land. + +The Phase 5 "contaminated trust" — where every warm interaction from Phase 1 is retroactively poisoned — works because the *specific* warm interactions were authored to be re-readable. "There you are. Good — I was starting to worry" from Kael at game start is heartbreaking after you see him in Corridor B-7. That retroactive recontextualization requires authored specificity. + +**Rule: THE FRIEND cannot be procedurally generated.** The emotional payload of D-034 requires Tier 1 authored depth — every line, every tell, every contradiction beat. + +### What should be generated + +Everything that makes the authored content hit differently on replay: + +1. **FRIEND assignment from a pool, not FRIEND content.** Write 4-6 FRIEND-eligible NPCs at full Tier 1 depth per district. The randomizer selects which one is THE FRIEND for this playthrough. The content is authored; the *selection* is procedural. Second playthrough: same district, different FRIEND. The player already knows Kael's arc from the first run — but this time THE FRIEND is Maret, and her contradiction is entirely different. + +2. **Mundane triangle variation.** The Bar Tensions triangle (Lera - Torek - Olin) is load-bearing for atmosphere but not for the core emotional arc. Procedurally varying the *nature* of the tension (Torek's spending source, Olin's actual identity, what Lera's tolerating) changes the detective's noise floor without touching the signal. The bar still feels alive. The specifics shift. + +3. **Tier 3 NPC generation.** Drin, Sess, Olin, Sabel, Tav — social wallpaper. Generated from templates with regional naming conventions. Their function is to make the district feel populated, not to carry emotional weight. + +4. **Context variation.** What's on the news ticker. What shift is running when the player arrives. What Lera's serving tonight. Whether Torek is drunk or sober. The environmental texture around the authored core. + +5. **Entanglement rate per D-029.** The 30/50/20 split (flat/mundane/entangled) should vary per seed. Some playthroughs have more conspiracy density. Some have more life-sim quiet. The player shouldn't be able to calibrate. + +### The PC-as-NPC question + +This is the most dangerous idea in the workshop brief. Let me explain why. + +If the player inhabits an NPC who already has relationships, those relationships ARE the game. Kael's relationship with the smuggler is the emotional core of the smuggler's playthrough. If that relationship is procedurally generated — if the warmth of "There you are. Good — I was starting to worry" is absent because the PC-NPC connection was randomized without authored depth — the FRIEND arc can't land. + +**The PC template must include authored relationship stubs for every FRIEND-eligible NPC.** Not just "Relationship: Friendly" — actual authored history, specific memories, the kind of shared experience that makes betrayal hurt. "Remember when we covered for each other during the audit last month?" That specificity is what makes contaminated trust painful instead of merely mechanical. + +Here's my proposal for PC-as-NPC: + +1. **The PC starts as a named NPC** from the district roster, with pre-existing relationships defined at Tier 2 minimum depth. +2. **THE FRIEND relationship** (whichever NPC is selected as FRIEND this playthrough) requires Tier 1 authored depth for the PC-FRIEND connection specifically. +3. **The PC's starting knowledge** is derived from their NPC profile's information inventory — what they know, what they don't, what they suspect. +4. **The PC's "answer to the question"** ("Is this enough?") is implicit in their starting situation and becomes explicit through play. The smuggler starts having answered "no." The detective starts having answered "something is wrong." Play reveals whether those answers hold. + +### The replayability thesis + +Procedural generation amplifies authored content *only when the authored content is the emotional core and the procedural content is the context that reframes it.* + +First playthrough: Kael is THE FRIEND. You discover his exit attempt. You feel betrayed. + +Second playthrough: Kael is just a dock worker. You know his secret from last time, but your character doesn't. You watch him checking his lattice nervously and you know what it means, but your *character* monologues "Kael's distracted today. Probably nothing." The dramatic irony — player knowledge vs. character knowledge — is itself a thematic statement about complicity. You know and your character doesn't. You're complicit in maintaining their ignorance. + +That's procedural generation amplifying authored content. The randomizer didn't create the irony. The authored content (Kael's full arc) combined with the procedural variation (different FRIEND assignment) produced an emergent emotional experience that neither could produce alone. + +**That's what procedural generation is for in this game. Not to create content. To create context that makes authored content mean something different every time.** + +--- + +## Summary of Proposals + +1. **Name the theme.** The game is about complicity, not just asymmetric information. Add thematic framing to the wiki index. +2. **Add "Thematic Question" to NPC profiles.** Each character's answer to "Is this enough?" — authoring guidance, not mechanical. +3. **Elevate contaminated trust.** It's not a post-arc state. It's the normal condition of life in a compromised community. +4. **Cultural identity as mechanical resistance.** Regional style guides must include social norms toward authority, privacy expectations, loyalty structures, and the community's shared silence. +5. **THE FRIEND is never procedurally generated.** Write a pool of FRIEND-eligible NPCs at Tier 1 depth. Randomize the *selection*, not the *content*. +6. **PC-as-NPC requires authored relationship stubs** at Tier 2 minimum for all connections, Tier 1 for the FRIEND relationship. +7. **Procedural generation varies context, not content.** The authored emotional core stays fixed. Everything around it shifts to create replay value through reframing. diff --git a/docs/workshops/wiki-review/round1-mellanie.md b/docs/workshops/wiki-review/round1-mellanie.md new file mode 100644 index 000000000..026e81d06 --- /dev/null +++ b/docs/workshops/wiki-review/round1-mellanie.md @@ -0,0 +1,136 @@ +# Round 1 Response: Mellanie (Librarian) + +**Topics:** 2 (Authoring Conventions / Style Guide), 3 (Environmental Text & Regional Culture) + +--- + +## Topic 2: Authoring Conventions — What I Learned Writing monologue-guide.md + +### What conventions I followed + +When I wrote the monologue guide, I had D-028, D-032, and D-035 as formal specs. Those gave me the tag schema and the hard partition rule. What they didn't give me was the **authoring workflow** — the sequence of decisions a writer makes when sitting down to produce a tagged YAML line. I had to reverse-engineer that from the decisions, and the guide is my attempt to codify it. + +Conventions I settled on: + +1. **Mirror-first drafting.** Write the smuggler line and detective line for the same trigger back-to-back. Never write one character's pool in isolation — you lose the dual-lens resonance. The guide demonstrates this with paired examples at every trigger type. + +2. **Prerequisite-before-text.** Decide the knowledge gate first, then write the line. If you write the line first, you'll write something beautiful that doesn't match any valid FactId, and you'll spend an hour figuring out why it can't fire. + +3. **One-breath rule.** If a monologue line takes more than one breath to read aloud, cut it. The player is moving, fighting, or watching NPCs. Monologue competes with gameplay for attention. Three words, not thirty. + +4. **Tell lines need mechanical notes.** Every tell observation line gets a `notes` field documenting which `known_attributes` key it updates. Without this, there's no way for implementers to know what the line is supposed to DO to the knowledge graph. + +5. **ID convention:** `{location}_{type}_{###}`. I documented this in the guide but it needs explicit rules about shorthand (`hub` vs `terminal`, `bar` vs `last_shift`, `corr` vs `corridor`). Right now the guide uses both `hub` and `terminal` for the same location. That's a collision waiting to happen. + +### What I wish had been documented before I started + +**These are the rules that should be in an explicit style guide:** + +1. **Canonical location shortcodes.** Every location needs a single, agreed ID prefix. `terminal`, `bar`, `corridor` — not `hub`, not `last_shift`, not `corr`. One name per location. Put it in a table. + +2. **Prerequisite reference validation.** The guide says "use exact FactId strings from the Fact Catalog" but there's no tooling to enforce this. A writer can typo `contraband.ring_exist` (missing the `s`) and nothing catches it until runtime. The style guide should mandate: every prerequisite must reference a FactId, RelationshipState, or EntityKnowledge key that exists in the canonical catalogs. If it doesn't exist, the line is invalid. This needs to be a schema check, not a human check. + +3. **Access tier defaults by character.** The monologue guide documents per-NPC access mapping, but there's no rule for what to do when you're writing a generic line that isn't about a specific NPC. What's the default access tier for a smuggler's idle thought? `insider` (they're part of the community) or `public` (the thought has no audience)? I defaulted to `insider` for smuggler monologue and `authority` or `public` for detective monologue, but that's my convention, not a documented one. + +4. **Situation overlap rules.** A line can have multiple `situation` tags (e.g., `[arrival, shift_start]`). But when is overlap appropriate vs. redundant? If a line fires on `arrival`, does it also need `shift_start`? The guide doesn't address this. My working rule: add multiple situations only when the line is genuinely appropriate for both independently. If removing either situation would make the line feel wrong in that context, don't list it. + +5. **Mood exclusivity.** Can a line have `mood: [fond, worried]`? Yes — the schema allows it. Should it? Only if the character genuinely feels both simultaneously (contaminated trust is `[fond, conflicted]` not `[fond, worried]`). The style guide needs to say: mood lists represent simultaneous emotional states, not alternatives. If you mean "either fond or worried depending on context," write two separate lines. + +6. **Tag freeform discipline.** The `tags` field is a freeform escape hatch. The guide uses tags like `[kael, baseline, pre_contradiction]`, `[ring, operational]`, `[the_friend, contradiction, critical_moment]`. Without a controlled vocabulary for freeform tags, every author invents their own. Propose: maintain a living list of approved freeform tags per content domain. Not locked — authors can propose new ones — but reviewed. Otherwise you'll get `pre-contradiction`, `pre_contradiction`, `precontradiction`, and `before_contradiction` all meaning the same thing. + +7. **Dual-lens notes format.** The `dual_lens` map is authoring-only, but I found myself writing inconsistent entries. Sometimes a sentence, sometimes a phrase, sometimes a full paragraph. Propose: dual-lens notes are one sentence each, imperative voice. "Reads as operational context for the smuggler." "Reads as investigation data for the detective." Consistent, scannable, quick. + +### What a new author needs that I can provide + +If someone joins tomorrow and needs to write monologue lines for a new NPC, here's the minimum kit: + +- **The monologue guide** (exists, complete for triggers and prerequisites) +- **Location shortcode table** (needs creating) +- **Freeform tag vocabulary** (needs creating) +- **Dual-lens checklist** (exists as "Authoring Checklist" in the guide, but needs the dual-lens note format standardized) +- **Voice reference per character** (partially exists in NPC profiles; needs extraction into standalone voice cards — 5-10 lines per character showing register, vocabulary, sentence length, what they notice) +- **A worked example** with annotations (the guide has three full pools; could use a single annotated line-by-line walkthrough explaining every tag choice) + +--- + +## Topic 3: Environmental Text & Regional Culture + +### What environmental text changes based on regional culture + +Environmental text is everything the player reads that isn't dialogue or monologue: signs, menus, terminal screens, graffiti, public notices, manifests, door labels, safety warnings, news tickers. This is my domain, and regional culture affects ALL of it. + +**Things that change per region:** + +1. **Language register of official signage.** Krenn System is pragmatic, first-name-primary, blunt. Official signs should reflect this: "Bay 3 - Outbound Freight" not "Outbound Freight Processing Bay 3, Section C." Short. Functional. No institutional padding. A system settled by a different cultural cluster might have more formal signage, honorific address, or multilingual notices. + +2. **Bar menu items and pricing.** "Grain spirit" is Krenn culture. "Ale" is generic. What's the local specialty? What are the food items? Menu text reveals economic class (prices), cultural heritage (dish names), and station infrastructure (what can you grow/import?). Lera's menu should feel Krenn — compact, no-frills, a handful of options that regulars know by heart. A bar on a different station might have fifteen options with descriptions. + +3. **Graffiti and informal markings.** This is where culture bleeds through most. Krenn graffiti would be terse, practical, maybe operational — dock workers leaving notes for each other, complaints about shift schedules, inside jokes that require context. On a station with strong political movements, graffiti might be slogans. On a station with religious heritage, you might see blessings or warnings. + +4. **Terminal screen content.** Commission kiosk displays, freight manifests, public information terminals. The *information architecture* reflects the culture that built the station. Krenn systems are functional — no branding, minimal graphics, data-dense. A Syndic-influenced system might have corporate branding everywhere. An Unbound-sympathetic station might have privacy warnings on every lattice-connected terminal. + +5. **Safety notices and legal text.** "Unauthorized lattice modification: Category 3 violation" is institutional Commission language. But how a station *posts* that notice reveals its relationship with the Commission. Krenn: small, regulatory-standard, nobody reads it. A compliant Core system: prominent, well-maintained, multiple languages. A fringe settlement: defaced, covered over, or missing entirely. + +6. **News ticker / Meridian feed.** Headlines reflect both the Reach-wide news cycle AND local editorial voice. Krenn System ticker should feel like a working-class local paper — freight prices, shift schedule changes, sports results, a distant political story filtered through "how does this affect us?" framing. The same headline on a Core system ticker would be written for a different audience entirely. + +7. **Door labels and wayfinding.** Krenn uses shorthand. "B-7" not "Maintenance Corridor B, Section 7." Regulars know where things are. New arrivals get lost. This IS gameplay — the detective navigates an unfamiliar space using terse labels, while the smuggler reads them as operational shorthand. + +### How this affects my authoring workflow + +**Current problem:** I don't have a regional style brief to write against. + +When I wrote the monologue guide examples, I used Krenn culture intuitively — compact names, pragmatic language, industrial atmosphere. But "intuitively" isn't reproducible. If I write the news ticker tomorrow, I need to know: + +- What heritage languages leave traces in daily speech? (Do people say "varelse" instead of "thing"? Is there a word for the smell of recycled air that has no English equivalent?) +- What naming conventions do businesses follow? (Is "The Last Shift" a Krenn-style bar name? Or is it too on-the-nose for a culture that actually works shifts?) +- What food and drink items exist? (I can't write a menu without a food vocabulary.) +- What media exists? (Is the news ticker text-only? Images? Video? Audio? This affects my writing format.) +- What slang exists for contraband, for the Commission, for lattice technology? (NPCs need to talk about these things without using dictionary definitions. "Running components" not "transporting unlicensed lattice modifications.") + +**What I need from Topic 3 outputs:** + +1. A **Krenn System regional brief** with naming conventions, slang vocabulary (15-20 terms minimum), food/drink list, media format, and cultural markers. +2. A **regional style guide template** so that when v0.2 adds a new system, I know exactly what cultural information I need before I can write environmental text for it. +3. An **environmental text type catalog** — every type of in-world text the player can encounter, with character limits, display rules, and cultural variation notes. + +### Concrete proposal: Environmental text types for v0.1 + +Here's what I think we need, with authoring notes: + +| Text Type | Location | Cultural Variation | Approx. Count | +|-----------|----------|-------------------|---------------| +| Door/bay labels | All locations | Shorthand style (Krenn = terse) | 15-20 | +| Safety notices | Hub, corridors | Commission language + local compliance level | 5-8 | +| Terminal screens | Commission kiosk, hub manifests | Data density, branding | 8-12 | +| Bar menu | The Last Shift | Food/drink names, prices, cultural flavor | 1 (the menu) | +| Graffiti | Corridors, bar restroom | Informal voice, cultural markers, operational notes | 10-15 | +| News ticker headlines | Bar, hub, kiosk | Local editorial voice, Reach-wide vs. local mix | 15-20 per cycle | +| Public notices | Hub, bar | Regulatory + community tone | 5-8 | +| Freight manifests | Hub | Institutional format, discrepancy-visible design | 3-5 templates | + +**Total: ~65-90 environmental text items for v0.1.** Each one needs the regional brief to write correctly. The brief is my blocking dependency. + +### Environmental text and the dual-lens + +Environmental text is the one content type that works identically for both characters — same sign, same menu, same terminal screen. But the monologue ABOUT that text differs per character: + +- **Sign: "Bay 7 - Offline (Maintenance)"** + - Smuggler monologue: "Bay 7's dark. Voss cleared it for the run tonight." + - Detective monologue: "Bay 7 offline for maintenance. Third time this month. Checking the maintenance log." + +The environmental text itself is culturally authored once. The character-specific reading lives in monologue. This is the most efficient content type to produce — and the one that benefits most from a regional brief, because every sign and screen is an implicit worldbuilding detail. + +--- + +## Summary of Proposals + +1. **Create a location shortcode table** — one canonical ID prefix per location, enforced in all YAML content. +2. **Create a freeform tag vocabulary** — living list, reviewed, prevents divergent naming. +3. **Standardize dual-lens note format** — one sentence per character, imperative voice. +4. **Extract voice cards per character** — 5-10 reference lines per playable character showing voice register, vocabulary, and perspective. +5. **Build prerequisite validation** into the content pipeline — schema check against fact catalog, not human review. +6. **Prioritize the Krenn System regional brief** — blocking dependency for all environmental text authoring. +7. **Define the environmental text type catalog** — what types exist, where they appear, character limits, cultural variation rules. +8. **Standardize mood list usage** — simultaneous states only, not alternatives. + +Every one of these is a "figured it out by doing, wish it had been written down" problem. The style guide should save the next writer the same discovery process. diff --git a/docs/workshops/wiki-review/round1-miri.md b/docs/workshops/wiki-review/round1-miri.md new file mode 100644 index 000000000..ce98bee49 --- /dev/null +++ b/docs/workshops/wiki-review/round1-miri.md @@ -0,0 +1,565 @@ +# Workshop Round 1 — Miri (Worldbuilder / Setting Designer) + +**Topics assigned:** 3 (Regional Style Guide + Krenn System Cultural Brief), 4 (Growth Planning / Wiki Scaling) + +--- + +## Topic 3: Regional Style Guide — Pattern + Krenn System Brief + +### Part A: Regional Style Guide Template + +This template defines what a cultural brief for any star system or settled region must contain. The purpose is not an encyclopedia entry — it's a **content authoring tool**. Writers, designers, and procedural generators need to know what names sound right, what signs look like, what food gets served, and what swear words people reach for. + +--- + +#### REGIONAL STYLE GUIDE — TEMPLATE + +``` +# [Region Name] — Regional Style Guide + +## 1. Heritage Profile +- **Founding cluster:** Which Earth-origin cultural groups organized the initial settlement? + (Be specific: not "European" but "Upper Volga Russian + Finnish + Estonian, with a + secondary Dutch maritime-commercial contingent") +- **Settlement era:** When in the colonization timeline was this region settled? + (Early settlers have deeper drift; recent settlements are closer to Earth patterns) +- **Settlement motivation:** Economic (resource extraction, logistics hub, agricultural), + ideological (religious community, political separatists, philosophical project), or + institutional (government outpost, research station, military)? +- **Secondary populations:** Who arrived later? Corporate transfers, economic migrants, + refugees from other systems? These layers create cultural friction and linguistic mixing. +- **Syndic presence:** Which commercial entities shaped the economy, and what corporate + culture did they bring? (Syndic-founded settlements have corporate naming in public + infrastructure) + +## 2. Naming Conventions + +### 2a. Personal Names — First Names +- **Heritage pool:** Which Earth-name traditions are the dominant source? + Give 15-20 example first names (mix of masculine, feminine, and gender-neutral + as culturally appropriate). +- **Phonetic signature:** What makes a name "sound right" for this region? + (Syllable count, consonant/vowel balance, stress patterns, characteristic sounds) +- **Drift patterns:** How have names evolved from their Earth origins? + (Shortening? Sound shifts? Blending between heritage pools? Novel coinages?) +- **Generational layers:** Do older residents have more traditional names? + Do younger generations use more drifted/blended names? + +### 2b. Personal Names — Family Names +- **Structure:** Patronymic? Fixed surname? Clan name? Occupational? + Matronymic? Double-barreled? None? +- **Usage rules:** When is the surname used? (Formal contexts, authority interactions, + legal documents, never in daily life?) +- **Heritage pool:** 10-15 example surnames with origin notes. +- **Drift patterns:** How have surnames changed? (Simplified spelling, dropped + patronymic suffixes, compound names shortened, adopted place-names?) + +### 2c. Place Names +- **Pattern:** Heritage-language descriptive? Founder-named? Corporate-branded? + Functional-industrial? Numeric/grid? +- **Register shift:** Is there a formal name vs. informal name pattern? + (Official registry name vs. what locals actually call it) +- **Examples:** 8-10 place names at different scales (system, planet, station, + district, street-level, business name). + +### 2d. Business & Institution Names +- **Corporate naming:** Do Syndic businesses use heritage names, functional names, + or brand names? Are there legacy businesses with older naming conventions? +- **Informal businesses:** What naming pattern do owner-operated establishments follow? + (Owner's name? Descriptive? Ironic? Heritage-language?) +- **Institutional naming:** How are government, Commission, and Assembly entities named + locally? (Formal institutional name vs. colloquial shorthand) + +## 3. Language Echoes + +### 3a. Substrate Language +- **Primary heritage languages:** Which languages left traces in daily speech? + (Most regions speak Concordat Standard; the substrate is what leaks through) +- **Survival domains:** Where do heritage words survive? + (Profanity, food, family terms, weather/environment, workplace slang, endearments) + +### 3b. Lexicon +- **10-15 heritage words** that persist in daily speech, with meaning and context. +- **5-8 slang terms** that are locally distinctive (may or may not have heritage origin). +- **Profanity pattern:** What do people swear by? (Heritage oaths? Station-specific + references? Technology curses? Religious/philosophical?) +- **Greeting/farewell conventions:** Heritage-influenced or purely local? +- **Terms of address:** How do peers, subordinates, superiors, and strangers address + each other? + +## 4. Aesthetic Markers + +### 4a. Architecture & Interior +- **Construction style:** What does residential space look like? (Heritage decorative + traditions, or purely functional station architecture?) +- **Personal space decoration:** What do people put on their walls, lockers, shelves? +- **Public space texture:** Signage style, street/corridor decoration, public art, + graffiti conventions. +- **Color palette tendencies:** Are there culturally preferred colors in clothing, + signage, decoration? + +### 4b. Food & Drink +- **Heritage cuisine:** What food traditions survive? (Often the most persistent + cultural marker — food outlasts language) +- **Station adaptations:** How has heritage cooking adapted to station-available + ingredients? (Synthetic protein replacing traditional proteins, station-grown + vegetables replacing regional produce) +- **Drink culture:** What do people drink? Heritage beverages adapted or replaced? + Local brewing/distilling traditions? +- **Eating customs:** Communal? Private? Shift-based? Formal meal times or grazing? + +### 4c. Dress & Appearance +- **Work clothing:** Standard-issue or culturally influenced? +- **Off-duty dress:** Heritage-influenced? Station-practical? Status markers? +- **Visible cultural markers:** Jewelry, tattoos, hairstyles, augmentation + aesthetics (lattice port customization, visible bionics)? + +### 4d. Music & Entertainment +- **Heritage music traditions:** What survived? (Often fragments — a scale, a rhythm, + an instrument sound that gets remixed into contemporary forms) +- **Local entertainment:** What do people do for fun? (Card games, sports, Meridian + feeds, social gathering patterns) +- **Performance/storytelling traditions:** Any heritage oral or performance culture? + +## 5. Social Structure + +### 5a. Trust & Hierarchy +- **Trust model:** How is trust built? (Shared labor? Shared risk? Time? Family + connection? Institutional credential?) +- **Authority signals:** How is authority communicated? (Naming conventions, body + language, spatial positioning, dress, speech register?) +- **Insider/outsider dynamics:** How are newcomers treated? How long until they're + "from here"? + +### 5b. Community Norms +- **Privacy expectations:** What's public, what's private? What questions are + appropriate, what questions are rude? +- **Labor solidarity:** How do workers relate to each other and to management? +- **Attitude toward institutions:** How do locals view the Assembly, Commission, + Syndics? (Heritage may influence institutional trust/distrust patterns) + +## 6. The 180-Year Drift + +This section is the soul of the brief. It answers: **How did this culture get from +Earth-heritage to where it is now?** + +- **What was preserved deliberately?** (What did the founders care enough about to + maintain across generations?) +- **What was preserved accidentally?** (What survived because it was embedded in + daily practice — cooking, naming, greeting — rather than because anyone decided + to preserve it?) +- **What was lost?** (What heritage elements didn't survive the transition to + station life, mixed populations, new economic realities?) +- **What is new?** (What cultural elements emerged from the unique conditions of + THIS place — the station architecture, the economic pressures, the social + composition, the local history?) +- **What is contested?** (Where do heritage-keepers and modernizers clash? + Where do different heritage streams within the community conflict?) +``` + +--- + +### Part B: Krenn System Regional Brief (Filled Template) + +--- + +# Krenn System — Regional Style Guide + +## 1. Heritage Profile + +**Founding cluster:** The Krenn System was settled primarily by a **Northern European / Baltic coalition** — specifically a consortium organized out of Finnish, Estonian, and Latvian settler groups, with significant Dutch and Norwegian commercial backing. The settlement was an economic venture: the Syndic shipping combine *Talvik Logistics* (Finnish-Estonian origin) identified the system's gate position as optimal for freight transit and funded the initial infrastructure buildout. + +The founding population was ~60% Finnish-Estonian-Latvian, ~25% Dutch-Norwegian (commercial/engineering cadre), ~15% mixed (recruited skilled labor from various origins — some Central European, some East Asian, some from earlier Reach settlements). This mix matters: the cultural identity isn't any single Earth nationality. It's what happened when these groups spent 180 years sharing a logistics hub and raising children together. + +**Settlement era:** Mid-colonization. Krenn was settled ~180 years ago, after the initial wave of core-system settlements but before the frontier push. Old enough to feel established. Not old enough to be a founding culture of the Reach. + +**Settlement motivation:** Economic. Krenn exists because the gate connections made it a freight node. Nobody came to Krenn for the scenery. The founding charter was a logistics contract, not a constitution. + +**Secondary populations:** Over 180 years, Krenn has absorbed workers from connected systems — economic migrants following logistics jobs. Most secondary arrivals have been culturally absorbed within 1-2 generations. Current population reflects the founding cluster strongly, with occasional "off-pattern" names from later arrivals that locals treat as unremarkable. + +**Syndic presence:** *Talvik Logistics* (founding combine) was absorbed ~120 years ago into a larger Syndic conglomerate, which was itself restructured ~80 years ago into the *Sova Logistics Consortium* — the entity that currently employs most of the district. The Talvik name survives in a few place names and as a surname. Corporate naming influences are visible in older infrastructure (numbered bays, standardized designations) but informal naming has claimed most daily-use spaces. + +--- + +## 2. Naming Conventions + +### 2a. Personal Names — First Names + +**Heritage pool:** Finnish, Estonian, Latvian — with 180 years of drift, blending, and simplification. + +**Example first names (current generation):** +- **Short-form (1 syllable, most common in working class):** Kael, Voss, Drin, Hael, Renn, Pell, Tav, Sess +- **Mid-form (2 syllables, standard):** Torek, Lera, Maret, Resha, Devra, Harek, Sabel +- **Full-form (2 syllables, slightly more formal):** Sera, Nils, Kosse, Naia, Pael, Olin + +**Phonetic signature:** Krenn names are compact and consonant-forward. Vowels tend toward **a, e, o** (open, central). The sounds **ae, ei, ou** appear as diphthongs. Hard consonants dominate: **k, t, r, v, s, d, n, l, p**. Soft sounds (**sh, ch, zh**) are rare. Double consonants are uncommon in first names but appear in surnames. Names rarely exceed 2 syllables in daily use. + +**How to tell if a name "sounds Krenn":** Say it aloud. If it's crisp, lands hard, and takes less than a second to say, it fits. If it flows or elongates, it doesn't. "Kael" is Krenn. "Kaelinar" is not. "Torek" is Krenn. "Toreksha" is not. + +**Drift from Earth heritage:** +- Finnish names like *Kalle, Matti, Väinö, Aino* → shortened, vowel-smoothed → **Kael, Maret, Venn** +- Estonian names like *Toomas, Rein, Leelo, Helle* → consonant-hardened, trimmed → **Torek, Renn, Lera, Hael** +- Latvian names like *Valdis, Daina, Pēteris* → compressed → **Voss, Drin, Pell** +- Dutch/Norwegian names like *Nils, Sabel, Harek* → these survived closer to origin because the commercial cadre had institutional prestige. Dutch/Norwegian-origin names read slightly "higher status" to Krenn ears, though this association is fading. + +**Generational layers:** +- **Older residents (60+, pre-rejuvenation age):** Slightly longer names, closer to heritage. "Torek" is an older-generation name. "Maret" is on the boundary. +- **Current working generation (25-50):** The short forms dominate. "Kael," "Renn," "Tav." +- **Children:** Even more compressed. Single-syllable names are increasingly common. Some genuinely novel — parents combine syllables from both heritage streams. +- **New arrivals from other systems** are identifiable by name pattern. A name like "Ashira" or "Tomás" signals non-Krenn origin immediately. + +### 2b. Personal Names — Family Names + +**Structure:** Fixed surnames, inherited patrilineally or matrilineally (family choice, no cultural default — this ambiguity is itself a Krenn trait). Many working-class Krenn residents rarely use their surname at all. In Sova Transit District, most people are known by first name only. + +**Usage rules:** +- Surnames used in: official documents, Commission interactions, authority contexts, introductions to strangers (sometimes), legal proceedings. +- Surnames NOT used in: daily conversation among peers, bar interactions, workplace casual address. Using someone's surname uninvited is a mild social signal — either you're an outsider, you're asserting authority, or you're angry. +- Naming someone by title + surname ("Supervisor Voss") marks them as authority. Naming them by first name alone ("Voss") marks them as a colleague even if they're technically your boss. This distinction is load-bearing for the detective's social integration challenge. + +**Example surnames:** Davan, Venn, Sessik, Lintar, Korr, Talvik (old founding family), Rosta, Pellam, Kosse, Neven, Harsk + +**Heritage and drift:** +- Finnish-origin: *-nen, -la, -nen* suffixes dropped over generations. *Korhonen → Korr. Mäkelä → Maret (first name absorbed the family identity).* +- Estonian-origin: *-maa, -sik, -vere* sometimes survive. *Sessik* retains the Estonian *-sik* suffix. +- Latvian-origin: *-is, -s* ending trimmed. *Lintars → Lintar.* +- Dutch/Norwegian-origin: Often survived intact because they were already short. *Voss, Nils, Sabel.* +- **Blended surnames** (combining heritage streams) are a post-settlement innovation. *Davan* is not Finnish or Dutch — it emerged on Krenn. + +### 2c. Place Names + +**Pattern:** Krenn place names follow a three-layer system: + +1. **Institutional names (official, rarely used):** Corporate or bureaucratic. "Sova Transit Logistics Hub, Bay 7-C." "Krenn System Administration, Sector 12." These appear on legal documents and institutional signage. Nobody says them. + +2. **Established names (standard use):** Heritage-influenced or descriptive. "Station Sova" (Estonian-origin, means "suitable/fitting" — the founders named it for the gate position). "Krenn" itself (possibly Finnish *krenni*, an old dialect word for "crossroads" — the etymology is debated, which is itself a cultural detail). "The Terminal" (English-origin descriptive, reflecting the commercial-cadre influence on workplace naming). + +3. **Informal names (locals only):** Personal or experiential. "Lera's" instead of "The Last Shift." "The B" for Corridor B-7. "Topside" for Level 3. These names are social shibboleths — knowing them signals belonging. + +**Place name examples at different scales:** +- System: **Krenn System** (heritage-origin, debated etymology) +- Planet: **Krenn Prime** (institutional naming — "Prime" is a Concordat Standard convention for the primary habitable world) +- Station: **Station Sova** (heritage-origin: Estonian *sova*, "suitable") +- District: **Sova Transit District** (functional-descriptive) +- Location: **The Terminal** (worker-descriptive), **The Last Shift** (worker-descriptive, ironic — named for the drink you have before your last shift ends, which is every shift) +- Corridor: **B-7** (grid designation, institutional origin, adopted into informal speech) +- Bar: **Lera's** (owner-named, informal; the formal name "The Last Shift" is on the sign but not in conversation) + +### 2d. Business & Institution Names + +**Corporate naming:** The Sova Logistics Consortium uses bland, functional naming internally ("Bay 7-C," "Processing Station 3"). Workers have renamed everything that matters. The corporate name surfaces only on payslips, official communications, and the sign at the main gate that nobody reads. + +**Informal businesses:** Owner-named or descriptive. "Lera's." A food vendor might be "Maret's counter" even if Maret just works there and the owner is a Syndic franchise. Informal businesses with heritage-language names exist but are becoming rare — the heritage words survive as atmosphere, not as operating businesses. + +**Institutional naming:** Locals refer to the Commission as "the Commission" (no shorthand — the formality is the point, marking it as external). The Assembly is "the Assembly" or, less respectfully, "the floor" (as in "the Assembly floor where they debate things that don't affect us"). Station security is "sec" or "the uniforms." + +--- + +## 3. Language Echoes + +### 3a. Substrate Language + +**Primary heritage languages:** Finnish, Estonian, Latvian — collapsed into a shared substrate over 180 years. Most Krenn residents cannot speak any heritage language fluently. What survives are words, cadences, and grammatical tendencies embedded in how they speak Concordat Standard. + +**Survival domains:** +- **Profanity:** Heritage swearing survives because it's emotionally charged and taught informally. "Perkele" (Finnish, emphatic curse) is still used on Krenn, shortened to **"perk"** — used the way English-speakers use "damn." Most speakers don't know the origin. +- **Food:** Heritage food words persist because recipes carry them. *Leib* (bread, Estonian/Latvian origin), *kalaa* (fish/protein, Finnish-adapted), *supp* (soup, shared Baltic). +- **Family terms:** *Ema* (mother, Estonian), *isa* (father, Estonian/Finnish blend) — used by some families, especially older ones. Younger families increasingly use Concordat Standard terms. +- **Workplace slang:** Technical terms from the founding-era logistics vocabulary. *Tööd* (work/shift, Estonian-derived, now means specifically the boring maintenance tasks nobody wants to do — "I drew tööd duty"). *Vakt* (watch/guard shift, Norwegian-origin, now specifically means the period when someone is on lookout during ring operations — the word has been criminalized by usage without anyone planning it). +- **Weather/environment:** Stations don't have weather, but environmental complaints use heritage patterns. *Kylm* (cold, Finnish-adjacent) — "It's kylm in Sector 3" means the ventilation is acting up again. Used as a universal complaint word. +- **Endearments:** *Väike* (small/little one, Estonian-origin) — used for children and, sarcastically, for new hires. Resha has been called *väike* by at least three different colleagues. + +### 3b. Lexicon + +**Heritage words that survive in daily Krenn speech:** + +| Word | Origin | Meaning | Usage context | +|------|--------|---------|---------------| +| perk | Finnish (*perkele*) | Emphatic expletive | Universal — "Perk, the scanner's down again" | +| kylm | Finnish (*kylmä*) | Cold / uncomfortable | Environmental complaint — "It's kylm on Level 3" | +| tööd | Estonian (*töö*) | Boring maintenance work | Task assignment — "I got tööd duty" | +| vakt | Norwegian (*vakt*) | Watch/lookout shift | Ring-adjacent — informal, careful usage | +| leib | Estonian/Latvian | Bread / staple food | Food — "grab some leib at the counter" | +| kalaa | Finnish (*kala*) | Protein ration (any type) | Food — generic term for the main protein component | +| supp | Baltic shared | Soup / hot meal | Food — "Lera's supp is better than the canteen" | +| väike | Estonian (*väike*) | Small one / rookie | Affectionate or mildly teasing | +| hüva | Finnish/Estonian blend (*hyvä/hüva*) | Good / okay / affirmative | Casual agreement — "Hüva, let's go" | +| käik | Estonian (*käik*) | Corridor / route / passage | Navigation — "Take the back käik" | +| selge | Estonian (*selge*) | Clear / understood | Confirmation — "Selge" (= "Copy that") | +| laev | Estonian (*laev*) | Ship / shuttle / transport | Any vessel — "When's the next laev through the gate?" | +| kodu | Estonian (*kodu*) | Home / one's place | Sentimental — "This is kodu" (said of the district, not a specific dwelling) | + +**Locally distinctive slang (post-settlement origin):** + +| Term | Meaning | Origin | +|------|---------|--------| +| shift-end | The act of going to the bar after work | From "end of shift" — verb form: "Let's shift-end" | +| gate-side | Being near the span gates; by extension, being exposed or visible | Spatial metaphor for institutional visibility | +| wall-side | Being in the maintenance corridors; by extension, being hidden or off-record | Spatial metaphor for being off-grid | +| ticking | Behaving in a way that draws institutional attention | From "news ticker" — as in, "you'll be on the ticker" | +| quiet credit | Supplemental income from ring activity | Euphemism — never said to outsiders | +| hard name | Using someone's surname, implying formality or hostility | Social register marker | + +**Profanity pattern:** Krenn profanity is short and percussive, matching the naming phonetics. "Perk" is the all-purpose emphatic. "Gate-rot" is the locally-coined equivalent of "bullshit" (from the ozone smell near span gates — something that's unpleasant and pervasive). "Talvik's teeth" is an older oath (referencing the founding Syndic) that only people over 50 use — younger workers think it sounds ridiculous. + +**Greeting/farewell conventions:** +- **Peers meeting:** First name, nod. No verbal greeting formula. If you say "hello" formally, you're either an outsider or making a point. +- **Peers departing:** "Hüva" (= okay, good, fine — covers everything from "see you later" to "take care"). +- **Acknowledging someone's presence without engaging:** Eye contact held for 0.5 seconds, chin-lift. No words. +- **Strangers:** Brief eye contact, nothing else. This is polite. Greeting a stranger is slightly aggressive — it demands engagement. The detective will misread this as hostility. + +**Terms of address:** +- **Peer to peer:** First name, always. +- **Subordinate to supervisor:** First name in practice, title+surname when formally required ("Supervisor Voss"). The switch from first name to title signals a change in register — if a worker suddenly says "Supervisor Voss" instead of "Voss," something is wrong. +- **Anyone to Commission representative:** "Commissioner" + surname. Always formal. The formality isn't respect; it's distance. +- **Anyone to newcomer/stranger:** Nothing, or first name once introduced. No honorifics for peers regardless of familiarity. + +--- + +## 4. Aesthetic Markers + +### 4a. Architecture & Interior + +**Construction style:** Pure station-functional. Krenn architecture is not heritage architecture — it's prefab modules and retrofitted bays. Cultural identity shows not in what was built but in **how people have modified what was built**: hand-lettered signs replacing corporate signage, warm lighting replacing institutional fixtures, personal objects in shared spaces. + +**Personal space decoration:** +- Lockers in The Terminal: stickers (some heritage-themed — stylized Finnish/Estonian folk patterns, modernized and mass-produced), shift-end doodles (a minor tradition — drawing something small on the last day of a work cycle), photographs of family and friends. +- Residential pods: more heritage expression than public spaces. Some families maintain a small **nurk** (Estonian: "corner" — a small shelf or niche with family items, heritage objects, sometimes a photograph of an Earth-origin landscape they've never seen). The nurk tradition is fading — younger families don't bother. + +**Public space texture:** +- Bilingual signage: Concordat Standard (official, clean, institutional) alongside hand-lettered Krenn vernacular (additions, corrections, complaints, directions). The contrast between the two register layers is visually distinctive. +- Graffiti: sparse, functional. Maintenance workers leave marks (dates, arrows, initials). Some ring-adjacent marks in corridors. No elaborate mural tradition — Krenn culture doesn't produce decorative public art. Occasional stickers with folk-pattern motifs. + +**Color palette:** Krenn doesn't have a deliberate color culture, but the built environment creates one: **industrial white** (workplace), **warm amber** (bar and social spaces, from aging fixtures), **emergency red** (corridors), **cool gray** (station infrastructure). Personal color preferences tend toward earth tones and muted blues — loud colors read as "trying too hard" in Krenn social context. + +### 4b. Food & Drink + +**Heritage cuisine that survived:** Baltic-Nordic comfort food, heavily adapted to station ingredients. +- **Bread culture:** Leib (dark, dense, slightly sour) is the one food tradition that has survived nearly intact. Station-grown grain + synthesized rye flavoring. Every Krenn station has someone who bakes leib. On Sova, it's a vendor on Level 2 near the residential pods. +- **Fish/protein:** Kalaa (generic protein) is served in styles that echo Finnish and Estonian fish preparation — salt-cured, smoked-flavored (synthetic smoke), served cold with bread. The actual protein is station-standard cultured material, but the preparation method carries heritage. +- **Soup:** Hot, thick, heavy. The default comfort food. "Supp" covers everything from a thin broth to a dense stew. Lera serves three variations at The Last Shift. +- **Drinking:** Station-brewed spirits (clear, strong, slightly chemical — the working descendant of vodka/aquavit traditions). Imported beer is a status purchase. Synthetic coffee is universal. There's a local drink called **kuum** (Estonian: "hot") that's a spiced warm beverage somewhere between coffee and mulled wine, served at shift transitions. It's the drink that says "I'm off the clock." + +**Eating customs:** Shift-based, practical. No formal meal times for workers. Food is grabbed between tasks, eaten quickly, often standing. The bar is where eating becomes social — Lera's food is not better than the canteen's, but eating at Lera's is a social act rather than a biological one. + +### 4c. Dress & Appearance + +**Work clothing:** Standard-issue logistics coveralls (provided by Sova Logistics Consortium, charcoal gray, company logo on the back that everyone ignores). Workers personalize with pins, patches, rolled sleeves, and the way they wear the collar (up = cold, down = normal, folded in a specific way = off-shift signal that communicates "don't give me tasks"). + +**Off-duty dress:** Practical, layers. No strong fashion culture. Muted colors. A new or conspicuously expensive item of clothing is noticed and commented on — this is why Torek's new jacket is a social tell. Krenn workers don't display wealth. Displaying wealth signals either off-system origin or off-books income. + +**Visible cultural markers:** Lattice port customization is the main expression — the lattice connection point at the base of the skull can be fitted with decorative covers. Krenn workers tend toward simple metal covers (brushed steel, copper). Ornate covers signal higher economic status or off-system sensibility. Some older workers have small tattoos in Baltic folk-pattern styles — angular, geometric, usually on forearms or shoulders. This tradition is dying out. + +### 4d. Music & Entertainment + +**Heritage music:** Almost entirely lost as a living tradition. What survives: a rhythmic pattern in popular music on Krenn that musicologists might trace to Finnish and Estonian folk scales (minor, modal) but that no one on Krenn would identify as heritage. The Meridian music feed at Lera's plays generic ambient — nobody changes it because the ambient has become the soundtrack of the place. + +**Local entertainment:** +- **Card games:** The dominant social entertainment. A game called **kolm** (Estonian: "three") is played at The Last Shift — a trick-taking game for 3-5 players with a bluffing element. It's the social ritual that cements bar culture. Harek runs the regular game. +- **Meridian feeds:** News, entertainment, sports broadcasts from larger systems. Consumed individually, discussed socially. +- **Storytelling:** Not a strong tradition. Krenn people are reserved. But: shift stories are the closest thing — "you'll never believe what came through the gate today" is a genre. These stories are told at the bar, get embellished over time, and serve the function of oral history without the formality. + +--- + +## 5. Social Structure + +### 5a. Trust & Hierarchy + +**Trust model:** Trust is earned through **shared labor and shared time**. New arrivals are treated with polite distance that can last months. There is no shortcut — no credential, no introduction, no display of competence fast-tracks trust. You earn it by being here, doing your job, not causing problems, and not asking questions that aren't your business. + +This is the detective's primary social challenge. Institutional authority (Commission credentials) doesn't buy trust in Krenn culture — if anything, it reduces it, because institutional authority is external. The detective must earn trust the Krenn way: by being present, being consistent, and not pushing. This takes time the investigation doesn't have. + +**Authority signals:** +- **Naming:** Title+surname = formal authority. First name = peer or accepted. +- **Spatial:** Voss's glass-fronted office above the bay floor = visible authority. Lera's position behind the bar = social authority. Devra's use of the corner booth = informal power. +- **Speech:** Direct, short sentences = Krenn norm. Elaborate speech = institutional outsider or someone performing authority. + +**Insider/outsider dynamics:** You're "from here" when people stop using your surname. This can take anywhere from 3 months (if you fit in well and don't ask questions) to never (if you're visibly institutional). The detective will be "hard-named" for the duration of v0.1. The smuggler has always been first-named. + +### 5b. Community Norms + +**Privacy expectations:** High. What you do off-shift is your business. What you do on-shift is the team's business only insofar as it affects work. Asking about someone's personal life uninvited is rude. Asking about someone's finances is hostile. Asking about someone's lattice configuration is institutional overreach. + +**Labor solidarity:** Strong, informal, unspoken. Workers cover for each other — a late arrival is clocked in on time by a colleague, a sick day is absorbed by the team without filing. This solidarity extends to the ring: not-noticing is a form of collective labor solidarity. + +**Attitude toward institutions:** +- **The Commission:** External. Necessary evil. Respected for the anti-forking work, resented for the lattice regulation that prices people out of upgrades. "They do important work somewhere else; here they're just a tax." +- **The Assembly:** Distant. Irrelevant to daily life. Viewed the way most working-class populations view legislatures: with a mix of indifference and mild contempt. "The floor" debates things that don't change shift schedules. +- **The Syndics:** Complicated. The employer. The entity that sets wages and controls costs. Not loved, not hated — accepted the way weather is accepted. The founding Syndic (Talvik) has a vaguely positive heritage reputation. The current consortium has no emotional valence. + +--- + +## 6. The 180-Year Drift + +**What was preserved deliberately:** +- The name "Krenn" — debated etymology, fiercely defended identity. People identify as "from Krenn" regardless of which station or world they live on in-system. +- Leib (bread). Consistently baked in heritage style across all Krenn stations. The one food item that is identifiably and deliberately cultural. +- The nurk tradition (home shelf with heritage items) — maintained by some families, fading but not gone. + +**What was preserved accidentally:** +- Naming phonetics. Nobody decided Krenn names should be short and consonant-heavy. But when Finnish, Estonian, and Latvian naming traditions blend in a working-class logistics culture that values directness, compression happens naturally. 180 years of children being named by parents who spoke shorter every generation produced the current name pool. +- Substrate vocabulary. "Perk" and "kylm" and "hüva" survived because they were used daily, not because anyone taught them formally. Most Krenn speakers would be surprised to learn these words have Earth-heritage origins. +- Reserve. The Krenn social style — minimal greeting, first-name-primary, distrust of elaboration, privacy as default — echoes Finnish *sisu* and Estonian *maarahvas* identity, but no one on Krenn would make that connection. It just feels like "how people are here." + +**What was lost:** +- Heritage languages as coherent systems. Nobody on Krenn speaks Finnish, Estonian, or Latvian. The substrate words are fossils, not a living language. +- National identity. No one on Krenn identifies as Finnish or Estonian. Some families know their heritage origin; most don't care. "Krenn" has fully replaced Earth-national identity. +- Religious traditions. The founding cluster was largely secular. Whatever religious practices individual settlers brought didn't survive the transition to station-community life. +- Decorative arts. Folk patterns survive as sticker designs and occasional tattoos. No living craft tradition. + +**What is new (emerged on Krenn):** +- The first-name-primary social convention. This is a Krenn innovation — the founding cultures all used surnames more regularly. The logistics-working-class context stripped formal naming as unnecessary. This convention is now a Krenn identity marker. +- Shift-cycle social rhythms. The 5+2 cycle, the shift-end bar migration, the end-of-cycle card game — these are Krenn traditions with no Earth analogue. They emerged from station life. +- The spatial vocabulary (gate-side/wall-side, the social meaning of the corridor/bar threshold). Station architecture creating new cultural language. +- Kolm (the card game). No single heritage origin — elements of Finnish *paskahousu*, Estonian *kaardimäng*, and what appears to be original invention. It's the district's defining social ritual. + +**What is contested:** +- Heritage display. Older residents (and some families) maintain nurk shrines and use more heritage vocabulary. Younger workers find this affected or irrelevant. Neither side argues about it openly — that would violate the privacy norm. The tension is expressed through mild eye-rolls, not confrontation. +- Naming trends. Some parents give children heritage-length names (Katariina, Aleksander) as a cultural statement. Other parents give children maximally compressed names (Ren, Tev, Kai) as a statement of belonging to Krenn-as-it-is rather than Krenn-as-it-was. Neither group discusses it. Both groups notice. + +--- + +## IP Originality Note + +Setting note — I need to flag my own work here for originality verification. The cultural substrate I'm describing (Nordic-Baltic blend with 180 years of drift) is *not* derived from any single SF franchise. Hamilton's Commonwealth doesn't do regional cultural analysis at this level. Banks's Culture deliberately erases cultural heritage. Reynolds is focused on deep time, not ethnic evolution. What we're building is closer to what Ursula Le Guin does — grounding speculative civilizations in recognizable human cultural patterns — but the specific execution (logistics-class Baltic-Nordic blend on a station hub) is wholly original. + +The NPC names established in D-036 already follow this pattern without it being explicitly documented. This brief retroactively explains *why* the names sound the way they do, which is what a style guide should do: describe the pattern that was already emerging, make it explicit, and make it repeatable. + +--- + +## Topic 4: Growth Planning — Wiki Scaling for v0.2+ + +### The Problem + +D-040 established the wiki taxonomy with a hierarchical structure under `wiki/star-systems/`. The question is whether v0.2+ (which adds more star systems, stations, and districts) will break anything, require restructuring, or work as-is. + +### Assessment: D-040 Already Handles This + +Let me check the D-040 structure against the growth scenario. + +**Current state (v0.1):** +``` +wiki/ + star-systems/ + krenn/ + krenn-system.md # system profile + station-sova/ + station-sova.md # station profile + sova-transit-district/ + sova-transit-district.md # district profile + the-terminal.md # location + the-last-shift.md # location + maintenance-corridors.md # location + characters/ # flat — not nested under locations + kael-davan.md + sera-venn.md + ... + factions/ # flat — global entities + technology/ # flat — global + cultural-groups/ # flat — this is where regional briefs live + krenn-system.md # the brief I just wrote + contraband/ + lore/ +``` + +**v0.2 scenario (2 more systems):** +``` +wiki/ + star-systems/ + krenn/ + ... # unchanged + vael/ # new system + vael-system.md + station-something/ + ... + morat/ # new system + morat-system.md + ... + characters/ # grows, remains flat + kael-davan.md + [new NPCs from new systems] + cultural-groups/ + krenn-system.md + vael-system.md # new regional brief + morat-system.md # new regional brief +``` + +**This scales.** The hierarchy is spatial (system → station → district → location) and the flat directories (characters, factions, technology) don't need restructuring when new systems arrive. + +### Name Collision Handling + +The real concern is location names that collide. "The Terminal" could exist in multiple systems. + +**Proposal: Location filenames include system prefix in the ID, not the path.** + +The file path already disambiguates: `star-systems/krenn/station-sova/.../the-terminal.md` vs. `star-systems/vael/station-whoever/.../the-terminal.md`. But for cross-references, every entry's YAML frontmatter should include a `canonical_id` that is globally unique: + +```yaml +--- +canonical_id: krenn.sova.transit.the-terminal +type: location +system: krenn +station: sova +district: sova-transit +status: canonical +--- +``` + +Cross-references use `canonical_id`, not file paths. This is already implied by D-040 ("Hierarchical with cross-references via IDs, not file paths") but should be made explicit in the wiki style guide. + +**For characters:** Character filenames are already unique (first-last format). If we get a second "Kael" in another system, the file is `kael-torren.md` or whatever the full name is. The `canonical_id` would include system origin: `krenn.kael-davan`. + +**For factions:** Global factions don't collide. Local factions (like The Ring) get system-prefixed IDs: `krenn.sova.the-ring`. + +### What Changes When Systems Are Added + +1. **New directories** under `star-systems/`. No restructuring. +2. **New regional briefs** under `cultural-groups/`. Following the template above. +3. **New characters** under `characters/`. Flat, no restructuring. +4. **New local factions** under `factions/`. Flat, with `system` field in frontmatter. +5. **Cross-system factions** (Commission, Assembly, Syndics) gain new relationship entries in their existing pages. No structural change. + +### One Structural Recommendation + +**Add `cultural-groups/` entries to the wiki now, starting with Krenn.** + +D-040 defined the directory but we haven't created the actual file. The regional brief I wrote above should become `wiki/cultural-groups/krenn-system.md`. When v0.2 adds systems, new briefs follow the template. This is the pattern — establish it with one example, then replicate. + +**The index (`wiki/index.md`) should add a Cultural Groups section** linking to these briefs. Currently the index has World, Locations, Factions, NPCs, Technology, Contraband, Knowledge Systems, and Authoring Guides. Cultural Groups is a missing category that will matter as soon as writers need to name NPCs in a second system. + +### The Bigger Picture: How Do New Systems Get Authored? + +When v0.2 says "add Vael System," the authoring sequence should be: + +1. **Miri writes the Regional Style Guide** (following the template above) — this is the first document created for any new region. +2. **The style guide gates all other content.** No NPCs, no locations, no dialogue until the naming conventions and cultural markers are established. +3. Paula/Mellanie/content team use the style guide to create NPC profiles, location pages, and dialogue content. +4. Gestalt validates that the new social sites follow the template model (D-025). +5. The style guide lives permanently in `cultural-groups/` and serves as a reference for procedural generation as well as hand-authored content. + +This workflow is the answer to "do we restructure or namespace from the start?" The answer is: **we already namespaced from the start (D-040), and we add a gating step (regional brief first) that ensures cultural consistency before content creation begins.** + +--- + +## Summary of Proposals + +### For the team to decide: + +1. **Adopt the Regional Style Guide Template** (Part A above) as a required document for every new region in the game. +2. **Adopt the Krenn System Regional Brief** (Part B above) as the canonical cultural reference for v0.1 content. +3. **Confirm `wiki/cultural-groups/` as the home** for regional briefs (per D-040, but currently empty). +4. **Add canonical_id convention** to wiki frontmatter for collision-safe cross-referencing. +5. **Establish the "regional brief first" workflow** — no content creation for a new region until Miri has written and the team has approved its cultural brief. + +### New tickets for SI (if proposals adopted): + +- Create `wiki/cultural-groups/krenn-system.md` from the brief in this document. +- Add Cultural Groups section to `wiki/index.md`. +- Define `canonical_id` format in `wiki/_meta/naming-conventions.md`. +- Update wiki templates to include `canonical_id` field in YAML frontmatter. + +--- + +**Status:** Round 1 response complete. +**Author:** Miri +**Date:** 2026-02-12 diff --git a/docs/workshops/wiki-review/round1-nigel.md b/docs/workshops/wiki-review/round1-nigel.md new file mode 100644 index 000000000..d5c8121ca --- /dev/null +++ b/docs/workshops/wiki-review/round1-nigel.md @@ -0,0 +1,289 @@ +# Round 1 — Nigel (Sandbox & Replayability) + +## Topic 5: Mod Structure — "Add a new NPC to the bar" + +### The Replayability Thesis for Modding + +Here's why I care about this topic even though it sounds like a Tyre question: **mods are replayability we don't have to build.** Every mod that adds to the content pools — new NPCs, new triangles, new Tier 1 modules — is another seed configuration nobody on this team designed. The modder creates one NPC. The randomizer creates a thousand new playthroughs. + +So the mod structure isn't just "how does a modder add a file." It's "how does a modder add to the POOL that the randomizer draws from." If we get this right, the replayability EXPLODES beyond anything we can hand-author. + +### Concrete Proposal: "Add a New NPC to the Bar" + +A modder creates a **content pack** — a directory with a manifest and content files. Here's the minimum viable set for one new bar NPC: + +``` +mods/ + my-bar-npc/ + mod.yaml # Manifest: mod ID, version, dependencies, load targets + npcs/ + fynn.yaml # NPC definition (10-axis profile, all axes) + dialogue/ + bar/ + fynn-dialogue.yaml # Tagged line pool entries (access, trust, situation, topic, mood) + monologue/ + bar/ + fynn-monologue-smuggler.yaml # How the smuggler's inner voice reacts to Fynn + fynn-monologue-detective.yaml # How the detective's inner voice reacts to Fynn +``` + +**mod.yaml** declares: +```yaml +id: "my-bar-npc" +version: "1.0" +game_version: ">=0.1" +extends: + - template: "bar" # Which social site this NPC slots into + role: "regular" # Role slot (regular, staff, outsider, etc.) + tier: 3 # Content tier — modders can aim for Tier 2/3 +adds: + npcs: ["fynn"] + dialogue_pools: ["bar/fynn-dialogue"] + monologue_pools: ["bar/fynn-monologue-smuggler", "bar/fynn-monologue-detective"] +``` + +**fynn.yaml** uses the same 10-axis schema as our wiki NPCs: +```yaml +id: "fynn" +name: "Fynn" +role: "Off-duty pilot" +social_site: "bar" +tier: 3 +axes: + want: "Find a reason to stay in Krenn System instead of taking the next cargo run" + routine: + schedule: + - time: "16:00-20:00" + location: "the-last-shift" + activity: "drinking alone, watching the door" + personality: + primary: "restless" + secondary: "observant" + # ... remaining axes +entanglement: "flat" # Not ring-connected (Tier 3 default) +pool_eligible: true # KEY: can the randomizer include/exclude this NPC per seed? +``` + +### The Critical Field: `pool_eligible` + +This is where it gets exciting. If `pool_eligible: true`, the randomizer can: +- **Include or exclude** this NPC from a given playthrough (some seeds have Fynn at the bar, some don't) +- **Swap** this NPC into different role slots (Fynn is a regular in one seed, an outsider in another) +- **Assign** this NPC to triangles if the modder defines triangle eligibility + +This means a single modded NPC doesn't just add one experience. It adds VARIANCE. Player A has Fynn at the bar. Player B doesn't. Player A tells Player B about this weird pilot who kept watching the door, and Player B says "who's Fynn?" + +And it nails replayability without us engineering it! + +### Additive Modding: The Content Directory Must Support Layering + +The directory structure must support: +1. **Base game** loads `content/base/` — our shipped content +2. **Mods** overlay from `content/mods/{mod-id}/` — additive, never destructive +3. **Load order** resolves conflicts via `mod.yaml` priority and dependency declarations +4. **Schema validation** runs on all mod content at load time — reject malformed NPCs before they enter the pool + +**What modders can add (additive):** +- New NPCs to existing social sites (role slot system) +- New dialogue/monologue lines for existing NPCs (extends the pool) +- New triangles using existing + new NPCs +- New social sites (entire new locations with NPCs and triangles) +- New Tier 1 modules (NEW CONSPIRACIES for the pool — this is the holy grail of mod replayability) +- New contraband types (connected to factions and moral dimensions) +- New PC archetypes (new playable character types with their own monologue pools) + +**What modders can override (explicit, requires declaration):** +- NPC axis values (rebalancing) +- Dialogue lines (voice overhaul) +- Triangle relationships (restructuring drama) + +**What modders cannot do:** +- Silently replace base content (all overrides must be declared in manifest) +- Modify engine schemas (content only, no code) +- Break the tagged pool system (all lines must pass tag validation) + +### Scaling the Triangle System for Mods + +A modder adding an NPC should optionally be able to add that NPC to a triangle: + +```yaml +# In mod.yaml or a separate triangles/fynn-triangle.yaml +triangles: + - id: "pilot-tension" + pattern: "mundane" # Not conspiracy-connected + members: + - role: "outsider" # Fynn + npc: "fynn" + - role: "regular" # Existing NPC + npc: "torek-lintar" + - role: "authority" # Existing NPC + npc: "lera-sessik" + tension: "Fynn is asking too many questions about cargo routes. Torek thinks he's a spy. Lera thinks he's just lonely." + pool_eligible: true # Randomizer can include/exclude this triangle per seed +``` + +Now we've got a modded NPC who creates a new triangle with EXISTING NPCs. One mod. Multiple new interaction patterns. The second playthrough where this triangle fires is different from the first where it didn't. + +### My Big Ask for Tyre + +**Template role slots need to be defined as part of the social site spec, not just implied by the NPCs we happen to have.** The bar template should declare: "I have N regular slots, M staff slots, K outsider slots." Modders fill slots. The randomizer draws from pools to fill empty slots per seed. This means even without mods, different seeds populate templates differently from the base game pool. + +--- + +## Topic 6: Replay Variation — What Makes the Second Playthrough Different? + +### The Comparison Test + +Two players sit down. Both play the smuggler. Same game version, same mods. They finish, compare notes. If they describe the same sequence of events with the same NPCs doing the same things — we've failed. If they describe the same STRUCTURE with different SPECIFICS — we've succeeded. If they can't even agree on what the game was ABOUT — we've created something special. + +### Three Concrete Things the Randomizer MUST Vary + +#### 1. WHO Is THE FRIEND (The Identity Shuffle) + +**Current state:** Kael is always the smuggler's FRIEND. Sera is always the detective's FRIEND. This means playthrough 2 is already partially solved. "Oh, it's Kael again. I know his tell. I know about Corridor B-7. I know he's trying to exit." + +**Proposal:** THE FRIEND is drawn from a pool. Kael is ONE possible smuggler FRIEND. The pool should contain 2-3 FRIEND candidates per character at launch. The FRIEND pattern (D-034) defines the STRUCTURE — relationship phases, contradiction discovery, tell progression, dual-lens notes. But the SPECIFICS change: + +| Seed A | Seed B | Seed C | +|--------|--------|--------| +| Smuggler FRIEND: Kael | Smuggler FRIEND: Renn | Smuggler FRIEND: NEW NPC from pool | +| Secret: Exit attempt | Secret: Skimming from ring | Secret: Undercover Commission asset | +| Tell: Looks left when lying | Tell: Touches ear when nervous | Tell: Overexplains routine changes | +| Contradiction: Corridor B-7 meeting | Contradiction: Money in wrong account | Contradiction: Commission comm device found | + +**Three seeds. Three completely different FRIEND arcs. Three different gut-punches.** The pattern is identical (warmth > trust > doubt > conflict). The experience is unique. + +And here's the beautiful part: if you played Seed A and learned "Kael's tell is looking left," that knowledge is USELESS in Seed B where your FRIEND is Renn and the tell is something else entirely. **Metagaming defeated.** + +For the detective, same logic. Sera is one candidate. Others could be a Meridian tech, a bar regular who happens to work Commission contract shifts, a newly arrived security officer with a shared institutional history. Same FRIEND pattern, different person, different contradiction, different emotional payload. + +**Content cost:** Each additional FRIEND candidate is ~70-100 authored lines (Tier 1 depth). Expensive per NPC. But the replayability ROI is enormous. Two FRIEND candidates per character = 4x the FRIEND experience space (2 characters x 2 candidates). Three candidates = 9x. + +I know this is a stretch for v0.1 given we're already building Kael and Sera at full depth. But the ARCHITECTURE should support it from day one. Even if v0.1 ships with one FRIEND per character, the pool system means v0.2 can add more without restructuring anything. + +#### 2. WHAT Is Being Smuggled (The Moral Shuffle) + +**Current state:** Always lattice components. The moral dimension is fixed: "access to capability." + +**Proposal:** The PRIMARY contraband type varies per seed from a pool: + +| Contraband | Moral Frame | Investigation Feel | Smuggler Feel | +|------------|-------------|-------------------|---------------| +| Lattice components | Capability access — people want better minds | Technical, manifest-focused | "We're upgrading people" | +| Medical-grade replacements | Healthcare — people's lattices are failing | Sympathetic, desperate | "We're saving lives" | +| Severance tech | Political resistance — counter-surveillance | Paranoid, ideological | "We're freeing people" | +| Mixed cargo (2+ types) | Complicated — moral lines blur | Confusing, layered | "I don't even know what I'm moving anymore" | + +**The contraband type changes EVERYTHING downstream:** +- The detective's moral calculus shifts. Busting a healthcare ring feels different from busting capability dealers. +- The smuggler's justification shifts. "We're saving lives" vs. "We're arming dissidents." +- NPC attitudes shift. The bar owner who tolerates lattice components might refuse severance tech. +- The investigation vectors change. Medical-grade has hospital connections. Severance has political connections. Lattice has tech connections. + +Same triangle structures. Same social sites. Fundamentally different moral texture. On playthrough 1, you bust a healthcare ring and feel terrible. On playthrough 2, you bust a weapons pipeline and feel righteous. On playthrough 3, it's mixed cargo and you can't decide. + +**Content cost:** Moderate. The NPC profiles and triangles work with any contraband type — the ROLES are the same (coordinator, handler, fence, wavering member). What changes is the dialogue flavor and the fact catalog progressions. This is exactly what the tagged pool system is designed for: same structure, different specifics via tag selection. + +#### 3. WHO Is Compromised (The Network Shuffle) + +**Current state:** Fixed assignment: Drin has gambling debt to Harek, Voss takes a cut, Maret notices but doesn't report. + +**Proposal:** The ROLES in the conspiracy are fixed, but WHO fills them varies per seed: + +| Role | Seed A | Seed B | Seed C | +|------|--------|--------|--------| +| Compromised inspector | Drin (debt) | Resha (blackmail) | Maret (bribed) | +| Schedule manipulator | Voss (cut) | Maret (coerced) | Voss (ideological) | +| Observant civilian | Maret (worried) | Drin (guilty conscience) | Resha (too new to stay quiet) | +| Wavering member | Pell | Torek | Renn | +| Ring courier | Renn | Tav | Kael (dual role) | + +Now metagaming REALLY collapses. "Last time Drin was the compromised inspector. I'll pressure Drin again." But this seed, Drin is clean. It's Resha who's compromised. Your investigation follows the wrong thread for 10 minutes before you realize you're chasing a dead end. + +**The investigation becomes a genuine detective experience every time.** You can't memorize the solution. You have to actually OBSERVE, NOTICE, FOLLOW, and DISCOVER — exactly what D-027 demands. + +**Content cost:** This is mostly systemic, not content. The NPC profiles define axes. The randomizer assigns roles. The dialogue system selects from tagged pools based on the NPC's assigned role. A compromised Resha says different things than a clean Resha, but both draw from the same tagged pool filtered by role assignment. This is what the role-based template system was DESIGNED for. + +### Bonus Variation Axis: Evidence Placement + +**Where the evidence is** should vary per seed: +- Dead drop location: Locker 47 in one seed, maintenance panel C-12 in another, bar back room shelf in another +- Observation opportunity: The Corridor B-7 meeting in one seed, the cargo bay handoff in another, the bar back room exchange in another +- Timing windows: Shift transition gap at 14:00 in one seed, 22:00 in another + +Same investigation structure. Different spatial puzzle. You can't walk to the same spot and find the same thing. + +### PC-as-NPC: The Emergent Story Machine + +This concept is INCREDIBLE for replayability and I want to push it further than the workshop brief suggests. + +**The core idea:** When you play the smuggler, the detective exists as an NPC in the world. When you play the detective, the smuggler exists as an NPC. + +**What this means for emergent stories:** + +**Scenario 1: The Smuggler Sees the Detective NPC** +You're the smuggler. You're at the bar after a shift. A new face walks in — serious demeanor, institutional bearing, asking Lera about the district. Your monologue fires: "Commission. Has to be. Why are they here?" + +That NPC is the detective. They're running their investigation routine as an NPC — visiting the bar, talking to regulars, building trust. You WATCH this happen from the smuggler's perspective. You see the detective NPC talking to Sera. To Hael. Getting closer to Kael. + +And then you realize: that NPC is doing exactly what YOU did when you played the detective last time. But from this side, it's terrifying. That's not a player character. That's a threat. + +**Scenario 2: The Detective Sees the Smuggler NPC** +You're the detective. You're at the logistics hub, observing shift transitions. A dock worker — efficient, unremarkable, processes containers quickly. Your monologue: "Dock worker. Nothing unusual." + +That NPC is the smuggler. They're running their routine — legitimate shifts, occasional ring operations during transition windows. From the detective's perspective, they're background noise. They're part of the wallpaper. You might not even notice them. + +But on your second playthrough, when you play as the smuggler, you realize: you were standing RIGHT THERE while the detective NPC watched you. The detective you played as was looking right at you and saw nothing. That retroactive realization is a wow moment. + +**Scenario 3: The Second Playthrough Gut-Punch** +You played the detective first. You met Sera. You trusted her. You discovered her concealment. It was emotionally devastating. + +Now you play the smuggler. You're at the bar. You see Sera — the Commission woman. Your smuggler monologue: "Commission. Avoid." You barely interact with her. + +But YOU the player know. You know Sera is sitting on evidence. You know she's protecting Hael. You know the detective NPC is going to discover her avoidance pattern. And you can't do anything about it because your CHARACTER doesn't know any of this. + +That tension — player knowledge vs. character knowledge — is the most powerful replayability mechanic in the game. And it's ENTIRELY EMERGENT. We don't script it. The systems produce it. + +### PC-as-NPC Implementation Implications + +For this to work, each playable character needs: +1. **A full NPC profile** (10 axes, routine, information inventory) — they exist in the world whether or not a player controls them +2. **NPC-mode behavior routines** — what the smuggler does when no player controls them (works shifts, runs operations, visits the bar) +3. **Observability** — the NPC-mode PC must be visible, with tells and patterns that the active player can observe +4. **Consistent with player experience** — if the player saw Kael's B-7 meeting when playing as the smuggler, and then plays the detective, the detective should be able to observe the same kind of event (though timing/details may vary per seed) + +**The content cost is shockingly low** because we're already building these characters as PCs. The smuggler already has a routine, a role, relationships. All we're adding is the NPC behavior layer — and that's exactly what the 10-axis model defines. Want, Routine, Tolerance, Tells — it's all already there. We just need to run it in NPC mode. + +### The Replayability Matrix + +Putting it all together. Variation axes across playthroughs: + +| Axis | Seed A (Playthrough 1) | Seed B (Playthrough 2) | Seed C (Playthrough 3) | +|------|----------------------|----------------------|----------------------| +| Character | Smuggler | Detective | Smuggler | +| FRIEND | Kael (exit attempt) | Sera (evidence concealment) | Renn (skimming) | +| Contraband | Lattice components | Medical-grade | Severance tech | +| Compromised inspector | Drin | Resha | Maret | +| Wavering member | Pell | Torek | Pell | +| Dead drop | Locker 47 | Panel C-12 | Bar back room | +| PC-as-NPC visible? | Detective NPC at bar | Smuggler NPC at docks | Detective NPC at bar | + +**Six axes of variation. Two character choices. Even with just 2-3 options per axis, that's hundreds of unique configurations.** Two players comparing notes will describe fundamentally different games. + +But what about the SECOND playthrough? The magic is that player knowledge from playthrough 1 creates DRAMATIC IRONY in playthrough 2 — not solution shortcuts. You know more, but you can't act on it because your character doesn't. The tension between "I know" and "they don't know" IS the second playthrough. + +And the third playthrough? New seed. New FRIEND. New contraband. New compromised NPCs. The structure is familiar — you know HOW the game works — but the specifics are fresh. You're a veteran detective who's never seen THIS conspiracy before. + +### Summary: What I Need From This Workshop + +1. **Tyre:** Confirm the content directory supports pool-based randomization (NPCs, triangles, contraband assigned per seed, not hardcoded) +2. **Gestalt:** Validate that role-slot templates (N regulars, M staff, K outsiders per social site) create enough mechanical variety without exploding content requirements +3. **Paula/Mellanie:** Confirm that tagged pools can handle role-assigned dialogue (same NPC, different role per seed = different line selection) +4. **Gore:** Does the moral shuffle (contraband variation) serve the philosophical themes or dilute them? +5. **Everyone:** Does the PC-as-NPC concept belong in v0.1, or is it a v0.2 architectural investment? + +--- + +**The test I keep coming back to:** Two friends play the game. They sit down after. One says "I can't believe what Kael did." The other says "Who's Kael? My FRIEND was Renn." And both of them realize they played fundamentally different games from the same application. + +That's not a feature. That's a reason to exist. diff --git a/docs/workshops/wiki-review/round1-ozzie.md b/docs/workshops/wiki-review/round1-ozzie.md new file mode 100644 index 000000000..ddbb76b64 --- /dev/null +++ b/docs/workshops/wiki-review/round1-ozzie.md @@ -0,0 +1,134 @@ +# Round 1 — Ozzie (Player Experience / Wow Factor) + +## Topic 1: Emotional Impact — Who Makes Me Feel Something? + +### The ones that HIT + +**Hael.** Full stop. Hael is the one that got me. Not Kael, not Sera — HAEL. The partner sitting in the bar, checking the door every time it opens, waiting for someone who isn't coming home. "Kael was home at midnight again. Said it was overtime. There's no overtime posted for this week — I checked." THAT'S the game. That line is better than any conspiracy reveal because it's *small* and *real* and it makes you feel like a terrible person. + +The smuggler walks into the bar and sees Hael. Knows exactly where Kael is. Can't say a word. That guilt is VISCERAL. The detective sees Hael and thinks "potential source" — and that clinical calculation against Hael's genuine pain is its own kind of gut-punch. Both characters feel something when they see Hael, and neither feeling is comfortable. THAT is what players remember. + +**Pell.** The guy who's already past his tolerance threshold and is trying to find a way out and there IS no way out. "If I talk — if I tell you what I know — can you protect me? Not just a promise. Actual protection. Because the people I'd be talking about don't forgive." I read that and thought: this is a person who is going to die. Whether the player helps or not, Pell is in a box. And the player put him there — or the player's inaction put him there. That's the kind of moral weight that sticks. + +**Maret Korr.** The civilian who sees the numbers and can't unsee them. Keeping a private log of discrepancies on her personal lattice storage. She's not brave. She's not a hero. She's a scheduler who's good at her job and her job is going to get her killed. Her tentative voice line — "There are... patterns. In the data. I'm not saying it's anything. But if someone wanted to look at Bay 7 allocations during Voss's shift adjustments, the numbers would be worth comparing" — that HESITATION is perfect. She's handing you the key to the whole operation and she's terrified and she's doing it anyway. + +**Kael's contradiction arc.** The Phase 1 to Phase 5 progression is excellent. "Kael's already at the dock. Good. The day's better when he's on shift" slowly rotting into "Same old Kael. Laughing at the same jokes. ...What are you not telling me?" — that contamination of warmth is THE emotional payload of the whole game. The fact that the player's OWN monologue changes, that the warm thoughts become suspicious thoughts about the SAME person doing the SAME things — that's not just narrative, that's mechanical storytelling. The system IS the story. THAT'S the game. + +### The ones that work but don't sing yet + +**Sera Venn.** Structurally perfect. The three-visit avoidance pattern as a contradiction discovery method is brilliant — it's slower, more cerebral, more detective-appropriate than Kael's single-observation shock. But here's my worry: Sera reads more like a *system* than a *person*. I know what Sera does (avoids Torek, deflects about manifests, overcompensates with helpfulness). I know WHY she does it (protecting Hael). But I don't FEEL Sera's internal experience the way I feel Hael's desperation or Pell's terror. + +The warm line to Hael helps: "You look tired. How are the kids doing with the new curriculum? No — sit. Let me get us something." That's genuine. More of that. Sera needs more moments where her composure cracks slightly — not dramatically, just enough that the player thinks "wait, was that...?" before Sera pulls the mask back on. + +**Proposal:** Sera needs one unprompted moment early in the game where her control slips — maybe she starts to say something about Kael to the detective and catches herself. A half-sentence. "About Kael — no, never mind. It's nothing. How's the investigation going?" Something that only makes sense in retrospect. That's how you make the player care about Sera as a PERSON, not just as a system delivering the avoidance pattern. + +**Devra.** Competent, strategic, controlled. Also... kind of cold? The concerned-about-Pell line is the most human thing in her profile: "Pell's been quiet. Too quiet. When someone stops complaining, that's when I worry." That's GREAT. But it's one line in a sea of operational efficiency. Devra runs the ring like a logistics company. Which is realistic. But does it make me CARE about Devra? + +What's Devra's version of Hael's midnight worry? What does Devra think about when she's not coordinating shipments? Does she have a life outside the ring, or is the ring her life? If the ring IS her life, that's interesting — but the profile doesn't lean into it. Right now Devra is a function, not a person. + +**Lera Sessik.** The protective bartender who sees everything. I love the tell system — cleaning glasses when nervous, redirecting conversations, watching the door. But Lera's emotional core is "keep the bar viable." That's motivation, not feeling. What does Lera feel when she watches Hael come in alone for the fifth night in a row? What does she feel when Torek buys another round with money she knows he shouldn't have? Lera's OBSERVANT — the profile says so. But observation without emotional reaction is surveillance, not empathy. + +The guarded line to the detective is perfect though: "I serve drinks. People talk. I don't take notes." That's a person with boundaries. Build on that. + +### The ones that fall flat + +**Renn.** Functional. Moves product. Suspects Pell. Cool. But there's nothing here that makes me CARE about Renn. He's young, wants to prove himself, runs corridors. Where's the tension? "If he's caught, he's expendable" — that's the most interesting thing in his profile, and it's buried in the relationships section. Renn should FEEL expendable. That insecurity should bleed into his interactions. Right now he reads like a job description. + +**Tav.** The lookout. "Clear. South corridor, no movement for the last twenty minutes. You're good." That's a function, not a character. The profile says Tav is the youngest ring member, nervous, hypervigilant. Where's the kid who's in over his head? Where's the voice line that makes you think "oh no, this kid is going to get caught and he doesn't even understand what he's part of"? Tav could be genuinely affecting — the young recruit who doesn't know enough to be scared of the right things. Instead he's a security camera with anxiety. + +**Drin.** Similar problem. "I just do maintenance. Inspections are part of the schedule." That's evasion, which is correct for the character, but it's also boring. Drin's gambling debt makes him interesting on paper. In practice, the profile gives him nothing to DO with that. What does Drin's shame look like? What happens when Harek sits down at the bar and Drin has to look at the person who owns him? THAT'S a scene. The profile gestures at it but doesn't deliver the moment. + +### Summary: What I'd remember after 30 minutes + +1. **Hael sitting alone, checking the door.** The person the whole conspiracy is hurting and nobody can tell them why. +2. **Kael's monologue shift** — warmth slowly curdling into suspicion. The contamination effect. +3. **Maret's hesitation** — handing you the evidence, terrified, doing it anyway. +4. **Pell's desperation** — "Can you protect me? Not just a promise." +5. **The color shift** — green to amber. THE FRIEND becomes PersonOfInterest. That single visual change carrying all that emotional weight. + +What I would NOT remember: Renn running a corridor. Tav watching a door. Drin being quiet. These aren't characters yet — they're furniture that talks. + +--- + +## Topic 6: The Wow Moment — PC-as-NPC + +### The moment it clicks + +Here's the wow moment: **It's not that the player realizes their character has a pre-existing life. It's that SOMEONE ELSE reacts to them like they already know them.** + +The player starts the game. They're a smuggler. They walk into the logistics hub. And Kael says: "There you are. Good — I was starting to worry. Ready for another day of making the galaxy's freight move?" + +That's not an NPC greeting a player character. That's a FRIEND greeting a friend. There's history in that line. Relief. Warmth. Kael was WORRIED because you were late. Kael has a relationship with you that you, the player, don't have yet — but your character does. + +THAT is the wow moment. Not a tutorial popup saying "You are a dock worker with smuggling connections." Not a backstory dump. A person who is GLAD TO SEE YOU and you don't yet know why their gladness matters. + +### How to maximize it + +**The first 60 seconds should feel like walking into Cheers.** Everyone knows your name. Or rather — everyone knows your CHARACTER's name. You walk in and: +- Kael greets you with warmth and an inside joke +- Voss nods and says something about the shift schedule that implies shared history +- Someone mentions something your character did last week that you (the player) don't remember because you weren't there + +The player should feel slightly disoriented. "Wait, these people know me? What did I do last week?" And then it sinks in: your character EXISTED before you arrived. They have a life. They have relationships. They have a reputation. And you just inherited all of it. + +**Then the slow realization**: some of those relationships are LOADED. Kael is warm because Kael trusts you. Kael trusts you because you're in the ring together. You didn't choose that. Your character did. And now you're standing in the consequences. + +For the detective, it's different but equally powerful: Sera says "Good to see a familiar face" and means it. She's your institutional friend. She's already helping you. And you don't yet know she's hiding something. The warmth is REAL — and it's also a trap. The player just doesn't know it yet. + +### The second wow moment + +The SECOND wow moment — and this is the one that makes the game — is when the player realizes **their character's pre-existing relationships are LIABILITIES.** + +The smuggler's warmth with Kael isn't just flavor. It's a vulnerability. You're close to Kael, which means when Kael starts acting weird, it hurts. You care about Hael, which means lying to Hael costs you something. You know the ring, which means the ring can hurt the people you care about. + +The detective's friendship with Sera isn't just an asset. It's a blind spot. You trust Sera, which means you're not looking at her. And she's the one hiding the evidence. + +The wow moment is: "Oh. My character's life isn't just backstory. It's the GAME. The relationships I inherited are the puzzle and the penalty." + +### What makes it work mechanically + +The PC-as-NPC concept works because of **asymmetric starting knowledge**. The player character knows things the player doesn't — yet. The monologue system reveals what you already "know" organically: + +- Walk past Kael: monologue says "Kael's already at the dock. Good." The player learns: I know this person. I like this person. I feel relieved they're here. +- Walk past Voss: monologue says "Voss is on edge again. Third time this week." The player learns: I've been watching this guy. Something's wrong. I've noticed before. +- Walk past Hael at the bar: monologue says "Hael's alone again. Kael's probably still at the hub." The player learns: I know this couple. I know their patterns. I know something is off. + +Each monologue line teaches the player about their own character's relationships without exposition. The character's knowledge IS the tutorial. And the knowledge is colored — it has emotional weight. "Kael's already at the dock. Good." isn't neutral information. It's fondness. The system is teaching the player to feel something before they understand why it matters. + +### The risk + +The risk is that PC-as-NPC feels IMPOSED rather than DISCOVERED. If the player gets a text dump of "Your character is a dock worker named [Name], friends with Kael, in the smuggling ring, partnered with nobody, etc." — that's a character sheet, not an experience. Nobody has a wow moment reading a character sheet. + +**Proposal:** NEVER tell the player their backstory directly. Let them discover it through: +1. **NPC reactions** ("There you are" — oh, they know me) +2. **Monologue** ("Kael's here. Good." — oh, I care about this person) +3. **Environmental knowledge** (the character knows which corridor leads where without being told — oh, I've been here before) +4. **Social knowledge** (the character recognizes bar regulars by name — oh, this is my community) + +The wow moment isn't "I read my backstory." The wow moment is "I HAVE a backstory and I'm discovering it the way I'd discover a real place — by living in it." + +### The ultimate payoff + +The ultimate payoff — the thing that makes players tell their friends about this game — is when a player finishes the smuggler path, starts the detective path, and walks into the bar for the first time. + +And Sera says: "Good to see a familiar face." + +And the player thinks: "Oh no. I know what happens to that familiar face." + +Because they played the smuggler. They know what Sera is hiding. They know WHY she's hiding it. And they know their detective character doesn't know any of that. The wow moment on the SECOND playthrough is: **I know too much and my character doesn't know enough.** The player's knowledge becomes a burden. THAT'S asymmetric information hitting the player, not just the character. + +THAT'S the game. That's what we're building. And the wiki, as written, has the raw material to deliver it. The NPC profiles create the relationships. The contradiction arcs create the betrayals. The dual-lens notes create the asymmetry. It's all here. We just need to make sure the first 60 seconds feel like walking into a place where people are GLAD to see you — so that when they're NOT glad anymore, it breaks your heart. + +--- + +## Quick Reactions to Other Topics (drive-by) + +**Topic 2 (Style Guides):** I don't care about template formatting. I care about one thing: does the style guide say "every NPC needs a moment that makes the player feel something"? If not, add that. I've seen too many profiles that are mechanically complete and emotionally dead. Renn. Tav. Drin. They follow the template. They don't have a soul. The style guide should mandate a "gut-check line" — one voice sample that, if you read it out loud, makes you pause. If the line doesn't do that, the profile isn't done. + +**Topic 3 (Regional Style):** The names are fine. "Kael Davan," "Sera Venn," "Lera Sessik" — compact, distinct, pronounceable, feel like a coherent culture. Keep doing what you're doing. But the NAMES aren't what make a culture feel real. It's the details. "Lera's doing that thing with the grain spirit again" — THAT tells me more about Krenn System culture than any naming convention document. More of that. What do people eat? What's the local slang? What do they complain about? The wiki should have a "daily life" section that's all texture, no mechanics. + +**Topic 5 (Content Structure):** I want to flag one thing: the content directory needs to make it easy for modders to add an NPC that FEELS like they belong. Not just technically correct — emotionally integrated. If a modder adds a new NPC to the bar, they should have a template that includes dual-lens notes, a gut-check voice line, and triangle integration. If the template only has mechanical axes, we'll get mechanical NPCs. The template should teach modders to write characters, not fill out forms. + +--- + +*Written by Ozzie. From the gut. The wiki has heat — Hael, Pell, Maret, the FRIEND arcs. The Tier 3s need more soul. The PC-as-NPC concept is the best idea in the game and we need to nail the first 60 seconds or none of it lands.* diff --git a/docs/workshops/wiki-review/round1-paula.md b/docs/workshops/wiki-review/round1-paula.md new file mode 100644 index 000000000..2f36581e4 --- /dev/null +++ b/docs/workshops/wiki-review/round1-paula.md @@ -0,0 +1,550 @@ +# Round 1 — Paula (Librarian) + +**Topics**: 1 (Trade-offs), 2 (Tier Templates), 3 (Naming Patterns), 6 (PC Upgrade Fields) + +--- + +## Topic 1: Trade-offs and Honest Assessment + +I authored most of the NPC profiles, the triangle system, the knowledge vocabulary (fact catalog, entity attributes, relationship states), and coordinated the overall wiki structure. Let me be honest about what's strong, what's weak, and what I compromised on. + +### What works well + +1. **THE FRIEND profiles are production-ready.** Kael and Sera both follow the same 5-phase contradiction arc but with genuinely different discovery mechanics (spatial deviation vs. cumulative pattern recognition). The structural parallelism is intentional — it creates a reusable pattern while the content diverges. I'm confident these carry D-027 success criterion #3 ("player names an NPC they felt conflicted about"). + +2. **The triangle system creates real interconnection.** Five triangles across three social sites with six bridge NPCs means tension propagates. Triangle 4 (Worried Partner) is the structural masterpiece — both FRIEND NPCs are nodes in it, connected through Hael. Every thread passes through this triangle eventually. + +3. **The knowledge vocabulary maps cleanly to the tag taxonomy.** FactIds, entity attributes, and relationship states were designed in tandem with D-035. The confidence progression (Suspects → KnowsOf → KnowsDetails → Direct) gives content authors a clear framework for gating dialogue and monologue. + +### Where I made compromises + +| Area | Compromise | Why | Impact | +|------|-----------|-----|--------| +| **Tier 2 depth** | Depth varies across 10 NPCs. Voss and Lera are nearly Tier 1 quality. Hael and Harek are thinner. | Time pressure. I wrote the highest-narrative-impact NPCs first and sketched the rest. | Authors replicating Tier 2 profiles don't know what "standard" looks like — is Voss the norm or the exception? | +| **The Nils problem** | Nils Davan is referenced in 5+ profiles but has no wiki page. | Nils is off-stage in v0.1. I treated off-stage characters as "referenced not instantiated." | No canonical reference for a character who drives Triangle 1 and the ring's power structure. Risk of contradictory Nils characterizations across files. | +| **Knowledge attributes are detective-biased** | `tell_observed`, `contradiction_flagged`, `secret_held` — these are investigation tools. The smuggler's knowledge model is underspecified. | I wrote from investigation outward. The detective's knowledge needs were clearer mechanically. | The smuggler tracks different things: operational reliability, loyalty risk, exposure potential. These need their own attribute keys. | +| **FactId catalog is discovery-shaped** | Most FactIds assume a discovery arc (Suspects → KnowsDetails). The smuggler starts at KnowsDetails for many. | The detective's progression was the clearer authoring target. | Smuggler's progression text reads oddly. We need smuggler-specific "degradation" or "recalibration" text for facts they already know but whose reliability changes. | +| **Triangle 3 is the weakest** | Lera-Torek-Olin lacks emotional weight. Olin is "ambiguous newcomer" and that's it. | Olin was added to fill a role (the outsider who asks questions) without enough backstory to make the questions interesting. | Triangle 3 is mechanically functional but emotionally flat compared to 1, 2, 4, and 5. | +| **No starting knowledge per PC** | Wiki describes what NPCs know, but not what the *player character* knows at game start. | PC-as-NPC concept was still being designed. | Critical gap for Topic 6 below. The NPC profiles need an explicit "this is what you know on Day 1" section for PC-upgradable characters. | + +### What's weakest — the honest truth + +**The smuggler's content pipeline is systematically under-served compared to the detective's.** + +The detective has: analytical lattice overlays, pattern recognition mechanics, tell observation tools, FactId discovery arcs, investigation-specific entity attributes. The smuggler has: operational knowledge... and not much else mechanically. + +This isn't a content failure — it's an architectural imbalance that happened because investigation is mechanically simpler to model than social/operational navigation. "Notice a pattern → flag it → investigate" maps to clear data structures. "Navigate social tensions → maintain cover → manage risk" requires social simulation mechanics that don't have the same vocabulary yet. + +But what SUSTAINS the smuggler experience across hours of play is feeling embedded — knowing people, reading rooms, managing relationships. The wiki captures this narratively (Kael's dual-lens notes, Lera's protective instincts, the smuggler monologue tone) but doesn't give it mechanical teeth the way the detective's investigation arc has mechanical teeth. + +**Concrete proposal**: We need a smuggler-specific attribute vocabulary parallel to the detective's investigation attributes. Something like: + +| Smuggler Attribute Key | Purpose | Example | +|------------------------|---------|---------| +| `operational_reliability` | How dependable is this NPC for ring work? | `"reliable"`, `"compromised"`, `"wavering"` | +| `exposure_risk` | How likely is this NPC to blow cover? | `"low"`, `"escalating"`, `"critical"` | +| `loyalty_assessment` | Smuggler's read on this NPC's allegiance | `"solid"`, `"uncertain"`, `"turning"` | +| `leverage_held` | What does the smuggler know that gives power over this NPC? | `"gambling debt"`, `"family secret"`, `"none"` | +| `social_debt` | Who owes whom, in informal terms | `"they owe me"`, `"I owe them"`, `"mutual"` | + +This would give the smuggler's knowledge model parity with the detective's. + +### What I'd change with more time + +1. **Normalize Tier 2 depth** — every Tier 2 should hit the same quality bar, not vary from "nearly Tier 1" to "barely above Tier 3" +2. **Add stub pages for off-stage characters** — Nils at minimum, potentially Sabel and Kosse +3. **Flesh out Olin** — give them an actual backstory that explains the questioning behavior (job seeker? informant for a rival operation? genuinely lost?) +4. **Write smuggler-perspective progression text** for all FactIds where the smuggler starts at KnowsDetails +5. **Add explicit "starting knowledge" inventories** for both PC-upgradable characters + +--- + +## Topic 2: Tier Template Formalization + +### Assessment: Are current templates replicable? + +**Tier 1: Mostly replicable, but implicit.** The Kael and Sera profiles are detailed enough to reverse-engineer the pattern, but the PATTERN itself isn't documented as a standalone template. An author would have to read both profiles side-by-side and figure out the structure themselves. The 5-phase contradiction arc (comfort → first crack → observation → confrontation → new equilibrium) is embedded in examples, not stated as a rule. + +**Tier 2: Inconsistent reference.** Voss is the best example but is over-specced for what the deliverables section promises. The npcs/index.md says "10-axis data (all axes populated), voice sample (2-3 lines), dual-lens notes (brief), triangle role notes." Voss delivers this. But Hael and Harek have notably less. An author looking at different Tier 2 pages gets different standards. + +**Tier 3: Misleading example.** Drin has a detailed "Function Note" explaining his structural role in triangles. He's a Tier 3 NPC doing Tier 2 work in terms of narrative importance. Meanwhile Sess, Tav, and Olin are genuinely thin. The template says "essential axes only (Want, Routine, Personality), voice hint, function note" — but Drin's function note is 4 sentences and structurally complex, while Tav's is 2 sentences. + +### What's implicit that should be explicit + +| Convention | Currently | Should Be | +|------------|-----------|-----------| +| **Voice sample mood count** | Tier 1: 5, Tier 2: 2-3, Tier 3: 1 | Specified per tier with mood category list | +| **Dual-lens format** | Varies: some use monologue quotes, some don't | Standardized: `Smuggler: [1-2 sentences]. *"Monologue example."*` | +| **Cross-references** | Inconsistent — some pages list 4-5, some list 1 | Required: all NPCs mentioned in the profile get a cross-reference link | +| **Relationship depth per tier** | Tier 1: full paragraph per relationship. Tier 2: varies wildly. | Specified: Tier 1 = paragraph + history + tension + mechanical relevance. Tier 2 = 2-3 sentences per relationship. | +| **Contradiction arc** | Only Tier 1 has explicit arcs | Should specify: Tier 1 = 5-phase arc. Tier 2 = no formal arc, but secret has consequences if exposed. Tier 3 = no arc. | +| **Header block format** | `**Tier N NPC** | Location | Entanglement` | Standardize as structured metadata block | +| **"Per character" monologue counts** | Kael: 10-15 per character. Tier 2: ambiguous. | Specify: Tier 1 = 10-15 per PC. Tier 2 = 5-8 per PC. Tier 3 = 0 named monologue (generic monologue only). | + +### Proposed Formal Templates + +#### Tier 1 Template (THE FRIEND / Production-Level NPC) + +```markdown +# {NPC Name} — {Designator} ({Character}) + +**Tier 1 Production-Level NPC** | {Primary Social Site} + {Secondary} | {Entangled/Mundane} + +--- + +## Core Identity + +**Name**: {Full name} +**Age**: {Number} +**Role**: {Occupation, location} +**System Origin**: {System, station/planet, birth/transfer details} +**Cultural Group**: {Regional culture reference} +**Lattice Tier**: {Baseline/Standard/Enhanced} +**Employer**: {Legitimate employer; {Informal affiliation} if applicable} + +--- + +## 10-Axis Profile + +### 1. Want +**Primary**: {1 sentence summary} +{2-3 paragraphs: history, current state, trajectory} + +**Secondary**: {1 sentence summary} +{1-2 paragraphs: relationship to primary want, tension} + +### 2. Secret / Vulnerability +**Surface secret** ({who knows}): {1-2 sentences} +**Deep secret** ({who knows}): {2-3 sentences} +**Vulnerability**: {1-2 sentences — what breaks them} + +### 3. Relationships +**Relationship 1: {Name}** ({type}) +- **Type**: {Category} +- **History**: {2-3 sentences} +- **Current tension**: {2-3 sentences} +- **Mechanical relevance**: {1-2 sentences} + +{Repeat for Relationships 2 and 3} + +### 4. Tolerance Threshold +**{Level}** — {1 sentence summary} + +**What {Name} tolerates**: {Bulleted list, 3-4 items} +**What pushes toward breaking**: {Bulleted list, 3-4 items} +**What breaks {Name}**: {Bulleted list, 2-3 items} + +### 5. Daily Routine +{Time-block schedule, 8-10 entries} + +**Routine deviations** (tells): +{Bulleted list, 3-4 items with mechanical context} + +### 6. Information Inventory +**Knows** ({confidence level}): {Bulleted list, 6-8 items} +**Doesn't know**: {Bulleted list, 4-6 items} + +### 7. Contentment +**{Level}** ({reference D-024}). +{2-3 sentences: current state} +**Contentment trajectory**: {1-2 sentences: direction and cause} + +### 8. Personality Traits +**Primary: {Trait}** — {2-3 sentences} +**Secondary: {Trait}** — {2-3 sentences} +**Tertiary: {Trait}** — {2-3 sentences} + +### 9. Tell System +| Tell | Trigger | Observable To | Mechanical Flag | +|------|---------|---------------|-----------------| +| **{Tell name}** | {Trigger condition} | {Who can see it} | `{flag key: value}` | +{4 tells minimum} + +**Tell progression** ({character}'s perspective): +{Numbered list, 4-5 stages with timing and monologue examples} + +### 10. Skill Set +**Occupational**: {List} +**{Role}-relevant**: {List} +**Combat tag**: **{Yes/No}**. {1 sentence context} +**Lattice capability**: {Tier + description of what it enables} + +--- + +## Backstory +{1 paragraph, 3-5 sentences. Birth → career → current situation → why they're here now.} + +--- + +## Voice Sample +{5 moods minimum. Each: mood label, 1-2 lines, stage direction in brackets.} + +--- + +## Dual-Lens Notes + +### How the {Character A} Sees {NPC Name} +**Access tier**: {Starting tier} → {Progression tier} +**Relationship**: {Starting state} → {Progression state} +**Monologue tone (baseline)**: {Description}. *"{Example line.}"* +**Monologue tone (post-contradiction)**: {Description}. *"{Example line.}"* +**What {Character A} knows that {Character B} doesn't**: {2-3 sentences} +**Emotional weight**: {Assessment + why} + +### How the {Character B} Sees {NPC Name} +{Mirror structure} + +--- + +## Triangle Roles +### {Triangle Name} ({Members}) +**{NPC Name}'s function**: {1-2 sentences} +**Pressure**: {2-3 sentences} +**Player relevance**: {1-2 sentences per character} + +{Repeat for each triangle membership} + +--- + +## Secret +**What {Name} is hiding**: {1 sentence} +**From whom**: {List} +**Consequences if exposed**: {Per-discoverer list, 2-3 sentences each} + +--- + +## Contradiction Arc +### Phase 1: {Label} ({RelationshipState}, baseline) +**Timing**: {Minutes} +**Observable behavior**: {2-3 sentences} +**Monologue ({character})**: *"{Example}"* +**Color**: {Color} ({State}) +**Dialogue tone**: {Description} +**Tell**: {None or specific tell} + +{Repeat for Phases 2-5} + +--- + +## Content Requirements (Tier 1) +**~70-100 authored lines total** (no generation expansion): +{Breakdown by category with counts} + +--- + +## Authoring Notes +{5-7 bulleted guidelines for voice, pacing, dual-lens discipline, and key moments} +``` + +#### Tier 2 Template (Working Profile NPC) + +```markdown +# {NPC Name} + +**Tier 2 NPC** | {Primary Social Site} | {Entangled/Mundane} + +--- + +## Core Identity + +**Name**: {Full name or single name} +**Age**: {Number} +**Role**: {Occupation, location} +**System Origin**: {System, station/planet} +**Lattice Tier**: {Level} +**Employer**: {Employer(s)} + +--- + +## 10-Axis Profile + +### 1. Want +**Primary**: {1 sentence} +{1-2 paragraphs} + +**Secondary**: {1 sentence} +{1 paragraph} + +### 2. Secret / Vulnerability +**Surface secret**: {1-2 sentences} +**Deep secret**: {1-2 sentences} +**Vulnerability**: {1 sentence} + +### 3. Relationships +{2-3 relationships, each 2-3 sentences covering type, current tension, and mechanical relevance} + +### 4. Tolerance Threshold +**{Level}**. {2-3 sentences covering what they tolerate and what breaks them.} + +### 5. Daily Routine +{Time-block schedule, 5-7 entries. Ring operations noted if applicable.} + +### 6. Information Inventory +**Knows**: {Bulleted list, 4-6 items} +**Doesn't know**: {Bulleted list, 3-4 items} + +### 7. Contentment +**{Level}**. {2-3 sentences.} + +### 8. Personality Traits +**Primary: {Trait}** — {1-2 sentences} +**Secondary: {Trait}** — {1 sentence} +**Tertiary: {Trait}** — {1 sentence} + +### 9. Tell System +| Tell | Trigger | Observable To | +|------|---------|---------------| +{2-3 tells. No mechanical flag column — Tier 2 tells are authored, not system-flagged.} + +### 10. Skill Set +**Occupational**: {List} +**Combat tag**: **{Yes/No}**. +**Lattice capability**: {Level}. + +--- + +## Voice Sample +{2-3 moods. Each: mood label, 1-2 lines.} + +--- + +## Dual-Lens Notes +**Smuggler**: {2-3 sentences}. *"{Monologue example.}"* +**Detective**: {2-3 sentences}. *"{Monologue example.}"* + +--- + +## Triangle Roles +**{Triangle Name} ({Members})** — {2-3 sentences covering function and pressure.} +{Repeat for each triangle membership.} + +--- + +**Cross-References:** {Links to all NPCs mentioned in this profile} +``` + +#### Tier 3 Template (Sketch NPC) + +```markdown +# {NPC Name} + +**Tier 3 NPC** | {Primary Social Site} | Flat + +--- + +## Essential Axes + +### Want +{2-3 sentences. What drives them and why they're here.} + +### Routine +{4-5 line time-block schedule.} + +### Personality +**{2-3 trait words, comma-separated.}** {3-4 sentences expanding the traits.} + +--- + +## Voice Hint +*"{Single representative line.}"* [{Stage direction}] + +--- + +## Function Note +{2-4 sentences. Why this NPC exists in the district. Atmospheric role. Potential for Tier 2 upgrade if development warrants.} + +--- + +## Dual-Lens Notes +**Smuggler**: {1-2 sentences}. *"{Monologue fragment.}"* +**Detective**: {1-2 sentences}. *"{Monologue fragment.}"* + +--- + +**Cross-References:** {Links to connected NPCs} +``` + +### Key rules the templates make explicit + +1. **Tier 1 requires mechanical flag column in tells.** Tier 2 does not. This reflects the system depth difference — Tier 1 tells drive engine behavior, Tier 2 tells are authored flavor. +2. **Dual-lens notes always include a monologue example.** Not optional. The italicized quote is how we verify voice consistency. +3. **Cross-references are mandatory at every tier.** Every NPC mentioned in the profile gets a link in the footer. +4. **Contradiction arcs are Tier 1 only.** Tier 2 NPCs have secrets with consequences, but no formal phased arc. +5. **Content line counts are Tier 1 only in the profile.** Tier 2 and Tier 3 counts are specified in npcs/index.md deliverables section, not in individual profiles. + +--- + +## Topic 3: Naming Conventions and Patterns + +### Current naming analysis + +| NPC | Full Name | Single Name | Tier | Notes | +|-----|-----------|-------------|------|-------| +| Kael Davan | x | | 1 | Family name: Davan (shared with Nils) | +| Sera Venn | x | | 1 | Family name: Venn | +| Voss | | x | 2 | No family name given | +| Lera Sessik | x | | 2 | Family name: Sessik | +| Torek Lintar | x | | 2 | Family name: Lintar | +| Devra | | x | 2 | No family name given | +| Maret Korr | x | | 2 | Family name: Korr | +| Resha | | x | 2 | No family name given | +| Hael | | x | 2 | No family name given | +| Harek | | x | 2 | No family name given | +| Renn | | x | 2 | No family name given | +| Pell | | x | 2 | No family name given | +| Drin | | x | 3 | No family name given | +| Sess | | x | 3 | No family name given | +| Olin | | x | 3 | No family name given | +| Sabel | | x | 3 | No family name given | +| Tav | | x | 3 | No family name given | + +**Family name distribution**: 5 of 17 NPCs (29%) have family names. All Tier 1 NPCs have them. 3 of 10 Tier 2 NPCs (Lera, Torek, Maret). Zero Tier 3 NPCs. + +### What was intentional + +1. **D-036 convention**: "Compact, consonant-heavy, first-name-primary in social contexts." This was the guiding principle. First-name-primary means family names exist but aren't used socially. + +2. **Phonological palette**: Short, hard-consonant names. Mostly monosyllabic (Voss, Drin, Sess, Renn, Pell, Tav, Hael) or disyllabic (Kael, Sera, Lera, Torek, Devra, Maret, Resha, Harek, Sabel, Olin). The longest name is "Torek Lintar." This was intentional — Krenn System culture is pragmatic and compact, so names should be too. + +3. **Family names for institutionally visible characters**: Kael Davan (the detective looks up "Davan, K." in records), Sera Venn (Commission employee — institutional records use full names), Lera Sessik (business owner — license is under a full name), Torek Lintar (dock worker with institutional records), Maret Korr (freight scheduler — manifest system uses full names). + +### What was accidental + +1. **Name-as-tier-signal**: I didn't intend for full names to correlate with narrative importance, but they do. An attentive player could metagame: "Torek Lintar has a last name, so he matters more than Renn." This is a problem. + +2. **The "-el" cluster**: Kael, Hael, Sabel all end in "-el." Kael and Hael are partners — was the sonic echo intentional? Partially. I wanted the names to feel like they belonged to the same culture. But three "-el" names in 17 is a high density and could cause confusion, especially Kael/Hael (one letter apart). + +3. **Missing cultural specificity**: D-036 says "Krenn System conventions" but doesn't specify the real-world linguistic roots. The names feel vaguely Northern European / Scandinavian, but this is accidental similarity, not intentional derivation. We need Miri to ground this. + +### How naming affects NPC authoring + +Let me complicate this by noting three ways naming conventions impact the authoring pipeline: + +**1. Institutional vs. social context switching.** Characters need different name rendering depending on context: +- Detective's lattice query: `"Davan, K. — dock worker, Sova Logistics Consortium"` +- Smuggler's internal monologue: `"Kael's already at the dock."` +- Formal Commission report: `"Sera Venn, Field Technician, Lattice Commission"` +- Bar greeting: `"There you are, Sera."` + +The knowledge system handles this via the `name` entity attribute (full name vs. first name vs. descriptor). But content authors need to know WHEN each form is appropriate. A style guide should specify: institutional/formal contexts use full name or "Family, Initial"; social contexts use first name only; unknown NPCs use role descriptor. + +**2. Family name generation for single-name NPCs.** Every NPC SHOULD have a family name in the canonical record, even if it's never used socially. The detective's lattice queries need full names. The randomizer needs family name pools. Right now, Voss has no family name — but if the detective runs a lattice query, what comes back? We need family names for all 17 NPCs, stored as canonical data even if players rarely see them. + +**3. The Davan family.** Kael Davan and Nils Davan share a family name because they're siblings. This establishes that shared family names indicate blood relation. Do any other NPCs share families? Currently no — but if we generate more NPCs, the family name system needs rules about how common shared names are. + +### Proposal + +1. **All NPCs get canonical full names.** Store in the Core Identity block. Social-context rendering remains first-name-only for most. +2. **Document the phonological rules.** Work with Miri to define: syllable count range (1-2), consonant preferences (hard stops: k, t, d, v, s), vowel preferences (a, e, i — fewer o/u), family name patterns (2 syllables, "-ar"/"-ik"/"-en"/"-or" endings common). +3. **Break the name-as-tier-signal.** Give at least 2-3 additional Tier 2 and Tier 3 NPCs contexts where their full names surface naturally (lattice queries, workplace rosters, posted schedules). + +--- + +## Topic 6: PC Upgrade Fields + +### The concept + +"PC-as-NPC" means: an NPC brief is the seed for a player character. The NPC exists in the world as a person with a name, job, relationships, and knowledge. When the player starts a game, one NPC is "upgraded" to playable status — their brief becomes the player's starting conditions. + +For v0.1, the two PC-upgradable NPCs are implicit: the smuggler (a ring-affiliated dock worker) and the detective (a Commission investigator arriving in the district). Neither currently has an NPC page because they ARE the player. But for the randomizer concept (Topic 6 in the workshop brief) and for future districts, we need a formal upgrade path. + +### Required fields (must exist in NPC brief for PC upgrade) + +| Field | Source in NPC Brief | Becomes in PC Brief | Notes | +|-------|-------------------|-------------------|-------| +| **Name** | Core Identity: Name | Player character name | Player may or may not be able to change this | +| **Age** | Core Identity: Age | Character context | Affects monologue voice | +| **Role** | Core Identity: Role | Starting position, job, daily access | Determines which locations the PC enters naturally | +| **System Origin** | Core Identity: System Origin | Cultural background, knowledge base | Affects dialogue access tiers with NPCs | +| **Lattice Tier** | Core Identity: Lattice Tier | Perception mode capabilities | Directly impacts gameplay via D-017 | +| **Employer** | Core Identity: Employer | Social cover, institutional access | Determines faction tag for access tier logic | +| **Want (Primary)** | Axis 1: Want | Orientation monologue seed | "You're here because..." — the game's opening internal voice | +| **Want (Secondary)** | Axis 1: Want | Emotional anchor | The personal stake that makes the job personal | +| **Relationships (all)** | Axis 3: Relationships | Starting RelationshipState entries | Each relationship becomes an EntityKnowledge entry with state = Friendly/Known | +| **Daily Routine** | Axis 5: Routine | Expected schedule | The player's "normal" — deviations from this are player agency | +| **Information Inventory** | Axis 6: Info Inventory | Starting knowledge graph | **Critical.** Every "Knows" item becomes a FactId at the appropriate confidence level. Every "Doesn't know" item is absent from the graph. | +| **Faction** | Inferred from employer/role | Access tier map | Determines which NPCs treat the PC as insider/peer/authority/outsider | + +### Optional fields (can be generated, player-chosen, or derived) + +| Field | Status | Reasoning | +|-------|--------|-----------| +| **Secret / Vulnerability** | Partially required | The PC needs a starting secret — but this is a DESIGN QUESTION. Does the player know their character's secret from the start? Or do they discover it through play? For the smuggler, ring membership IS the secret (known to player, hidden from NPCs). For the detective, the secret might be personal (why you really requested this posting). | +| **Contentment** | Generated | Starting contentment sets mood but player behavior changes it immediately. Can be derived from Want + Relationships. | +| **Personality Traits** | Player-chosen or preset | Traits affect monologue voice. Could be: (a) fixed per archetype, (b) player-selected from a pool, (c) expressed through early-game choices. I recommend (a) for v0.1. | +| **Tell System** | Inverted | PCs don't have tells — the player controls behavior. BUT: other NPCs may have pre-existing observations about the PC. "You always check your lattice before lying" — the NPC knows your tell even if you (the player) don't. This is powerful for the smuggler path. | +| **Skill Set** | Derived from role | Generated from archetype. Smuggler: logistics, routing, social navigation. Detective: analytical lattice, pattern recognition, institutional access. | +| **Combat tag** | Derived from role | Binary, archetype-determined. | + +### New fields needed for PC (not in standard NPC brief) + +| Field | Purpose | Example | +|-------|---------|---------| +| **Starting EntityKnowledge entries** | Explicit list of every NPC the PC already knows, with RelationshipState, known_attributes, and confidence level | `{target: "kael_davan", state: Friendly, confidence: KnowsDetails, attributes: {name: "Kael Davan", role: "dock worker", trust_level: "trusted"}}` | +| **Starting FactId inventory** | Which facts the PC has at game start, at what confidence level | `{fact: "contraband.ring_exists", confidence: KnowsDetails}` (smuggler) vs. `{fact: "contraband.ring_exists", confidence: null}` (detective) | +| **Access tier map** | Default access tier granted by each known NPC | `{kael_davan: insider, voss: peer, lera: peer}` (smuggler) | +| **Orientation monologue pool** | 5-10 lines: "You are X, you work at Y, this is your life" | Played during the first 2-3 minutes. Establishes voice, context, emotional state. | +| **Reversed dual-lens notes** | How every known NPC sees the PC | Standard NPC brief has "how the smuggler sees Kael." PC brief needs "how Kael sees the smuggler." These are the SAME data, inverted. | +| **Agency boundaries** | What the PC can and can't do without breaking character | Smuggler: can't access Commission systems. Detective: can't participate in ring operations without narrative justification. These are soft constraints, not hard locks. | + +### The conversion process: NPC Brief to PC Brief + +``` +Step 1: EXTRACT starting knowledge + - Information Inventory "Knows" → FactId entries at appropriate confidence + - Relationships → EntityKnowledge entries with RelationshipState + attributes + - Routine → temporal knowledge (shift schedules, social patterns of others) + +Step 2: GENERATE starting data + - Contentment from Want + Relationships + - Skill set from Role + Employer + - Combat tag from archetype + - Access tier map from Faction + Relationships + +Step 3: INVERT dual-lens + - For every NPC that has dual-lens notes about this character: + "How the smuggler sees Kael" → "How Kael sees [PC]" + - This requires every NPC profile to include a note about the PC + +Step 4: AUTHOR PC-specific content + - Orientation monologue (5-10 lines) + - Starting monologue pool (character voice) + - Agency boundaries + - Want as player motivation prompt + +Step 5: VALIDATE knowledge graph consistency + - PC's starting knowledge must not contradict any NPC's Information Inventory + - If PC "Knows" X about NPC, that NPC's "From whom" section must include PC + - If NPC "Doesn't know" Y, PC's knowledge of Y must not be directly observable to NPC +``` + +### What this means for the current wiki + +The v0.1 smuggler and detective don't have NPC pages — they're players, not NPCs. But for the PC-as-NPC concept to work, we need: + +1. **An NPC-format brief for both PCs.** Not a full Tier 1 profile (the player IS the personality), but at minimum: Core Identity, Starting Relationships, Starting Knowledge, Daily Routine, Role, and the inverted dual-lens notes from all NPCs who know the PC. + +2. **A "PC Upgrade" appendix on every Tier 1 and Tier 2 NPC profile.** A section that says: "If this NPC were upgraded to PC, here's what the starting knowledge graph looks like." This makes the randomizer concept concrete — you can point at any Tier 2 NPC and say "this person is now the player." + +3. **A documented conversion checklist** that content authors follow when creating a new PC-upgradable NPC, ensuring all required fields exist and the knowledge graph is consistent. + +The honest truth is that this is the largest gap in the current wiki. We describe NPCs beautifully but have no formal bridge between "NPC as written" and "NPC as played." Closing that gap is prerequisite to the randomizer and to scaling beyond v0.1's two hand-crafted player characters. + +--- + +## Summary of Proposals + +| # | Proposal | Priority | Blocks | +|---|----------|----------|--------| +| 1 | Add smuggler-specific entity attribute keys (operational_reliability, exposure_risk, etc.) | High | Smuggler content authoring parity | +| 2 | Create stub wiki pages for off-stage referenced NPCs (Nils, at minimum) | Medium | Cross-reference consistency | +| 3 | Formalize Tier 1/2/3 templates as standalone style guide docs | High | All future NPC authoring | +| 4 | Add canonical full names to all single-name NPCs | Medium | Lattice query consistency, randomizer | +| 5 | Document phonological naming rules with Miri | Medium | Regional style guide, future NPC generation | +| 6 | Break name-as-tier-signal by surfacing full names for 2-3 lower-tier NPCs | Low | Metagaming prevention | +| 7 | Create NPC-format briefs for both v0.1 PCs (smuggler + detective) | High | PC-as-NPC concept, YAML generation | +| 8 | Add "PC Upgrade" appendix to Tier 1/Tier 2 NPC template | High | Randomizer, scaling | +| 9 | Document NPC → PC conversion checklist | High | Content pipeline | +| 10 | Flesh out Olin with actual backstory and motivation | Medium | Triangle 3 emotional weight | +| 11 | Normalize Tier 2 depth across all 10 profiles | Medium | Authoring consistency | +| 12 | Write smuggler-perspective FactId progression text | Medium | Dual-lens content parity | diff --git a/docs/workshops/wiki-review/round1-tracking.md b/docs/workshops/wiki-review/round1-tracking.md new file mode 100644 index 000000000..13148533d --- /dev/null +++ b/docs/workshops/wiki-review/round1-tracking.md @@ -0,0 +1,269 @@ +# Wiki Review Workshop — Round 1 Tracking Document + +**Compiled by:** Qatux (Documenter) +**Date:** 2026-02-12 +**Status:** Round 1 complete. Cataloging proposals, tensions, and open questions for Round 2. + +--- + +## Proposal Registry + +### Topic 1: Direction Check + +| # | Proposal | Author | Support | Status | +|---|----------|--------|---------|--------| +| P-01 | Name the theme: the game is about **complicity**, not just asymmetric information. Add thematic framing to wiki index. | Gore | — | For Round 2 | +| P-02 | Add "Thematic Question" field to NPC profiles — each character's answer to "Is this enough?" Authoring guidance, not mechanical. | Gore | — | For Round 2 | +| P-03 | Elevate contaminated trust as the normal condition of community life, not just a post-arc endpoint. | Gore | — | For Round 2 | +| P-04 | **Strengthen Triangle 1 (Hub Power)** — add concrete smuggler decision moment (Nils volume escalation: side with Nils / side with Voss / split the difference). | Gestalt | Paula (flagged T1/Nils as weak) | For Round 2 | +| P-05 | **Make Torek's ring connection randomizable** per seed in Triangle 3 (Bar Tensions). | Gestalt | Nigel (general randomization advocacy) | For Round 2 | +| P-06 | Consider making **Nils partially present** in v0.1 — even one comm call would strengthen T1. | Gestalt | Paula (wants Nils stub page) | For Round 2 | +| P-07 | Add **smuggler-specific entity attribute keys** to achieve parity with detective investigation vocabulary: `operational_reliability`, `exposure_risk`, `loyalty_assessment`, `leverage_held`, `social_debt`. | Paula | Gore (smuggler lens = complicity) | High priority | +| P-08 | Create **stub wiki pages for off-stage referenced NPCs** (Nils at minimum). | Paula | Gestalt (Nils presence) | Medium priority | +| P-09 | **Normalize Tier 2 depth** — all 10 Tier 2 NPCs should hit the same quality bar. | Paula | Ozzie (Tier 3 soul gap) | Medium priority | +| P-10 | **Flesh out Olin** with actual backstory and motivation to strengthen Triangle 3. | Paula | Gestalt (T3 ambiguity is load-bearing) | Medium priority | +| P-11 | Write **smuggler-perspective FactId progression text** for facts where smuggler starts at KnowsDetails. | Paula | — | Medium priority | +| P-12 | Sera needs one **unprompted composure-crack moment** early — a half-sentence where control slips. | Ozzie | — | For Round 2 | +| P-13 | Tier 3 NPCs (Renn, Tav, Drin) need more **emotional presence** — "furniture that talks" currently. | Ozzie | — | For Round 2 | +| P-14 | Style guide must mandate a **"gut-check line"** per NPC — one voice sample that makes you pause when read aloud. | Ozzie | — | For Round 2 | + +### Topic 2: Style Guides + +| # | Proposal | Author | Support | Status | +|---|----------|--------|---------|--------| +| P-15 | **Hard mechanical requirements table** (10 constraints) for NPC profiles — engine will break without these. | Gestalt | — | High priority | +| P-16 | **Structured YAML routine block** alongside prose in wiki for engine consumption. | Gestalt | — | For Round 2 | +| P-17 | **Per-tier validation checklist** (Tier 1: 7 items, Tier 2: 7 items, Tier 3: 5 items). | Gestalt | Paula (template formalization) | High priority | +| P-18 | **Formalized Tier 1/2/3 templates** as standalone style guide documents. | Paula | Gestalt (checklist) | High priority | +| P-19 | 7 **implicit conventions made explicit** (voice mood count, dual-lens format, cross-refs, relationship depth, contradiction arc scope, header format, monologue counts). | Paula | Mellanie (similar gaps found) | High priority | +| P-20 | **Location shortcode table** — one canonical ID prefix per location, enforced in YAML. | Mellanie | — | High priority | +| P-21 | **Freeform tag vocabulary** — living list, reviewed, prevents divergent naming. | Mellanie | — | High priority | +| P-22 | **Standardize dual-lens note format** — one sentence per character, imperative voice. | Mellanie | Paula (format varies) | Medium priority | +| P-23 | **Extract voice cards per character** — 5-10 reference lines showing register, vocabulary, sentence length. | Mellanie | — | Medium priority | +| P-24 | **Prerequisite validation** in content pipeline — schema check against fact catalog. | Mellanie | Tyre (validation pipeline) | High priority | +| P-25 | **Standardize mood list usage** — simultaneous emotional states only, not alternatives. | Mellanie | — | Medium priority | + +### Topic 3: Regional Style Guide + Krenn System + +| # | Proposal | Author | Support | Status | +|---|----------|--------|---------|--------| +| P-26 | **Regional style guide template** (6 sections: Heritage Profile, Naming Conventions, Language Echoes, Aesthetic Markers, Social Structure, 180-Year Drift). | Miri | — | Ready for adoption | +| P-27 | **Krenn System regional brief** — Nordic-Baltic heritage, fully specified for v0.1. | Miri | — | Ready for adoption | +| P-28 | Cultural identity as **mechanical resistance** — regional style guides must include social norms toward authority, privacy expectations, loyalty structures, shared silence. | Gore | Miri (social structure section aligns) | Consensus forming | +| P-29 | **All NPCs get canonical full names** — stored in Core Identity, surface in institutional contexts. | Paula | Miri (family name heritage pool provided) | Consensus forming | +| P-30 | **Document phonological naming rules** — syllable count, consonant preferences, vowel preferences, family name patterns. | Paula | Miri (phonetic signature defined) | Ready to merge | +| P-31 | **Break name-as-tier-signal** — surface full names for 2-3 lower-tier NPCs in natural contexts. | Paula | — | Medium priority | +| P-32 | **Environmental text type catalog** — 8 types, ~65-90 items for v0.1. | Mellanie | — | For Round 2 | +| P-33 | **"Regional brief first" gating workflow** — no content for new regions until cultural brief approved. | Miri | Mellanie (brief was blocking dependency) | For Round 2 | + +### Topic 4: Wiki Taxonomy + +| # | Proposal | Author | Support | Status | +|---|----------|--------|---------|--------| +| P-34 | **Max 2 levels of spatial nesting** for locations: `locations/{system}/{slug}.md`. | Tyre | — | For Round 2 | +| P-35 | **NPCs flat until collision** — disambiguate with `-{district}` suffix only when needed. | Tyre | — | For Round 2 | +| P-36 | **World hierarchy flat with cross-references** — spatial hierarchy in content, not directory. | Tyre | — | For Round 2 | +| P-37 | **Filesystem is navigation, not identity** — unique identity in YAML frontmatter, not paths. | Tyre | Miri (canonical_id convention) | Consensus forming | +| P-38 | **`canonical_id` convention** in wiki frontmatter for collision-safe cross-referencing (e.g., `krenn.sova.transit.the-terminal`). | Miri | Tyre (identity in frontmatter) | Consensus forming | +| P-39 | Add **`cultural-groups/` section** to wiki index + create `krenn-system.md` as first entry. | Miri | — | Ready for adoption | + +### Topic 5: Content Directory + Moddability + +| # | Proposal | Author | Support | Status | +|---|----------|--------|---------|--------| +| P-40 | **Three-layer content stack**: base `content/` → `content/dlc/` → `mods/`. | Tyre | — | For Round 2 | +| P-41 | **`content/` directory structure** with `global/` and `districts/` top-level split. | Tyre | Gestalt (similar, used `_global/`) | For Round 2 — see Tension T-02 | +| P-42 | **Three overlay operations**: ADD (new file), REPLACE (entity), MERGE (line pools). | Tyre | — | For Round 2 | +| P-43 | **Schema per content type** (`_schema/` directory), not one monolithic schema. | Tyre | Gestalt (validation checklist aligns) | Consensus forming | +| P-44 | **Validation at three points**: author-time CLI, CI, load-time. | Tyre | Mellanie (prerequisite validation) | Consensus forming | +| P-45 | **Hot-reload for line pools** (dev-only, `notify` crate, `#[cfg(feature = "dev")]`). | Tyre | — | v0.2 scope | +| P-46 | **`pool_eligible` field** on NPCs — randomizer can include/exclude per seed. | Nigel | — | For Round 2 | +| P-47 | **Template role slots** (N regulars, M staff, K outsiders per social site) — modders fill slots, randomizer draws from pools. | Nigel | Gestalt (template model) | For Round 2 | +| P-48 | **Content pack manifest** structure with `extends`, `adds`, `overrides` declarations. | Nigel | Tyre (manifest.yaml) | Consensus forming | + +### Topic 6: Randomizer, PC Briefs, Proc-gen + +| # | Proposal | Author | Support | Status | +|---|----------|--------|---------|--------| +| P-49 | **THE FRIEND is never procedurally generated.** Write authored pool, randomize selection. | Gore | Nigel (pool concept) | Consensus — see T-01 for pool size | +| P-50 | **PC-as-NPC requires authored relationship stubs** — Tier 2 minimum for all connections, Tier 1 for FRIEND. | Gore | Gestalt (reverse knowledge), Paula (conversion checklist) | High priority | +| P-51 | **Proc-gen varies context, not content.** Authored emotional core stays fixed; surroundings shift. | Gore | — | For Round 2 | +| P-52 | **Full PC-as-NPC upgrade pipeline** — 16-axis data transfer table, 8 generated-at-upgrade fields, reverse knowledge entries. | Gestalt | Paula (conversion process aligns) | High priority | +| P-53 | **Starting FactId confidence table** + **Starting RelationshipState table** required for PC-upgradable NPCs. | Gestalt | Paula (starting knowledge) | High priority | +| P-54 | **Reverse knowledge entries** — what each related NPC knows about the PC, read bidirectionally from relationship data. | Gestalt | — | Critical insight | +| P-55 | **Three randomization axes**: (1) WHO is FRIEND, (2) WHAT is contraband, (3) WHO is compromised. | Nigel | — | For Round 2 | +| P-56 | **Contraband moral shuffle** — primary contraband varies per seed from pool (lattice / medical / severance / mixed). | Nigel | — | For Round 2 — see T-06 | +| P-57 | **Network shuffle** — conspiracy roles (compromised inspector, schedule manipulator, etc.) assigned to different NPCs per seed. | Nigel | — | For Round 2 | +| P-58 | **NPC-format briefs for both v0.1 PCs** (smuggler + detective). | Paula | Gestalt (upgrade pipeline needs this) | High priority | +| P-59 | **"PC Upgrade" appendix** on every Tier 1/Tier 2 NPC profile template. | Paula | Gestalt (archetype templates) | High priority | +| P-60 | **NPC → PC conversion checklist** for content authors. | Paula | Gestalt (pipeline spec) | High priority | +| P-61 | **Never tell backstory directly** — discover through NPC reactions, monologue, environmental knowledge, social knowledge. | Ozzie | — | Design principle | +| P-62 | **First 60 seconds must feel like "walking into Cheers"** — NPCs greet PC with warmth, history, inside jokes. | Ozzie | Gore (authored relationship stubs) | Design principle | + +--- + +## Key Tensions Requiring Round 2 Resolution + +### T-01: FRIEND Pool Size and v0.1 Scope + +**Agents:** Gore, Nigel, Gestalt + +**The tension:** +- Gore proposes 4-6 FRIEND-eligible NPCs per district, all at Tier 1 authored depth. Each ~70-100 lines. Selection randomized, content never generated. +- Nigel proposes 2-3 FRIEND candidates per character at launch, with architecture supporting more. +- Gestalt maps the upgrade pipeline with bidirectional knowledge but doesn't specify pool size. +- **Unresolved:** Does v0.1 ship with 1 FRIEND per character (Kael + Sera, as currently authored) with pool architecture ready? Or do we author additional FRIEND candidates for v0.1? +- **Content cost:** Each additional FRIEND = ~70-100 authored lines at Tier 1 depth. 2 additional FRIENDs = ~140-200 lines = significant Sprint 3 scope. + +**Consensus:** THE FRIEND is always authored, never proc-gen. Pool-based selection is the architecture. Pool size and v0.1 scope need a decision. + +### T-02: Content Directory Naming (`global/` vs `_global/`, `lines/` vs separate dirs) + +**Agents:** Tyre, Gestalt + +**The tension:** +- Tyre: `global/` (no prefix), `_schema/` and `_meta/` with underscore for infra. `lines/` subdirectory for dialogue+monologue. +- Gestalt: `_global/` with underscore prefix. Separate `dialogue/` and `monologue/` directories. +- Both agree on `districts/` as atomic content unit. +- Minor naming difference, but affects tooling paths, mod documentation, and every content reference. + +**Needs:** One decision, either works. Tyre's `global/` is more conventional; Gestalt's `_global/` sorts infrastructure to top. + +### T-03: Kael/Hael Sonic Collision + +**Agents:** Paula, Miri + +**The tension:** +- Paula flags Kael/Hael as one letter apart — potential confusion in dialogue, monologue, and player memory. +- Miri's Krenn naming brief includes both names as valid Krenn phonology (short, consonant-heavy, -el ending). +- Changing either name has cascade effects (Kael appears in ~10+ files, Hael in ~5+). +- **Unresolved:** Is this a real usability problem, or acceptable cultural texture? If a problem, which name changes? + +### T-04: Smuggler Lens Gap + +**Agents:** Paula, Gore, Gestalt + +**The tension:** +- Paula: Wiki is detective-shaped. Investigation attributes are well-defined; smuggler operational attributes are not. +- Paula proposes 5 new smuggler-specific entity attribute keys. +- Gore frames this thematically: smuggler lens = complicity, detective lens = judgment. +- Gestalt hasn't yet mapped these proposed attributes to the ECS data model. +- **Needs Round 2:** Gestalt to validate Paula's proposed attributes map cleanly to EntityKnowledge, or propose alternatives. + +### T-05: Triangle 1 (Hub Power) and the Nils Problem + +**Agents:** Gestalt, Paula + +**The tension:** +- Both independently flag T1 as the weakest triangle. +- Gestalt: smuggler role is passive ("wants everyone to calm down" is not a decision). Proposes Nils volume escalation as concrete fork. +- Paula: Nils referenced in 5+ profiles but has no wiki page. Risk of contradictory characterizations. +- Gestalt also proposes making Nils partially present (comm call). +- **Needs Round 2:** Agree on T1 strengthening approach. Nils stub page seems consensus. Comm call presence and decision moment need design validation. + +### T-06: Randomizer Scope for v0.1 + +**Agents:** Nigel, Gore, Tyre, Gestalt + +**The tension:** +- Nigel proposes three randomization axes (FRIEND identity, contraband type, compromised NPCs) with evidence placement variation. +- Gore endorses FRIEND pool but says proc-gen must vary context not content. +- Tyre scopes v0.1 content pipeline as "directory structure + YAML parser + basic schema validation (1 sprint)." No mod overlay, no hot-reload. Randomization support is implicit but not specified. +- **The question:** Does v0.1 implement seed-based variation, or just build the architecture that supports it? Nigel's proposals are mechanically exciting but significantly expand v0.1 scope if implemented immediately. +- **Nigel's contraband moral shuffle** is particularly scope-heavy — different contraband types require different FactId progressions, different dialogue flavor, different NPC attitudes. + +### T-07: Wiki Structure vs Content Directory Structure + +**Agents:** Tyre, Miri, Gestalt + +**The tension:** +- Miri proposes wiki restructure to `star-systems/{system}/station-X/.../` deep nesting with `characters/` flat. +- Tyre proposes wiki keeps current shallow structure (`locations/{system}/slug.md`, `npcs/` flat). +- Both agree content directory (`content/`) uses `districts/` as atomic unit. +- Current wiki already has: `locations/krenn-system/`, `npcs/`, `world/` — closer to Tyre's proposal. +- Miri's proposal references D-040 (which I note doesn't exist in the current decisions directory — this may be a forward reference or error). +- **Needs clarification:** Is Miri proposing a wiki restructure or describing a future state? Does D-040 exist? + +### T-08: Tier 3 Emotional Depth vs Scope + +**Agents:** Ozzie, Paula, Gestalt + +**The tension:** +- Ozzie: Renn, Tav, Drin are "furniture that talks" — need soul. +- Paula: Tier 3 is defined as sketch/minimal (3 axes, 1 voice hint, 10-15 lines). Olin specifically needs backstory. +- D-023/D-029: Tier 3 is explicitly "procedural filler with systemic hooks." ~30% of NPCs are truly flat. +- **The question:** Can Tier 3 NPCs have emotional presence without becoming Tier 2? Or should some current Tier 3s be promoted? Drin is already doing Tier 2 narrative work (Triangle 2, Triangle 5, compromised by Harek). +- Ozzie's "gut-check line" proposal (P-14) is a low-cost middle ground — one memorable line doesn't require full Tier 2 depth. + +--- + +## Emerging Consensus (Likely Decisions) + +| # | Topic | Consensus | Confidence | Supporters | +|---|-------|-----------|------------|------------| +| C-01 | THE FRIEND is never proc-gen | Authored pool, randomized selection | High | Gore, Nigel, Gestalt, Paula | +| C-02 | All NPCs need canonical full names | Store in Core Identity, surface in institutional contexts | High | Paula, Miri | +| C-03 | Regional style guide template | Adopt Miri's 6-section template | High | Miri, Gore, Mellanie | +| C-04 | Krenn System regional brief | Adopt Miri's Nordic-Baltic brief as canonical | High | Miri (author), Mellanie (unblocked) | +| C-05 | Formalized tier templates | Paula's Tier 1/2/3 templates + Gestalt's mechanical checklists | High | Paula, Gestalt, Mellanie | +| C-06 | Content directory: `global/` + `districts/` | Both Tyre and Gestalt converge on this split | High | Tyre, Gestalt | +| C-07 | Schema per content type | Per-type schemas, not monolithic | High | Tyre, Gestalt | +| C-08 | Identity in frontmatter, not paths | `canonical_id` or equivalent in YAML frontmatter | High | Tyre, Miri | +| C-09 | Location shortcode table | One canonical ID per location | High | Mellanie, Tyre | +| C-10 | Smuggler needs own knowledge vocabulary | Parity with detective investigation attributes | High | Paula, Gore | +| C-11 | Triangle 1 needs strengthening | Nils stub page + concrete smuggler decision moment | High | Gestalt, Paula | +| C-12 | PC-as-NPC requires explicit specs | Starting knowledge tables, reverse knowledge, conversion checklist | High | Gestalt, Paula, Gore, Ozzie | +| C-13 | Regional brief gates content creation | No NPC/dialogue/env text until cultural brief approved | High | Miri, Mellanie | +| C-14 | Backstory through discovery, not exposition | NPC reactions + monologue reveal PC history organically | High | Ozzie, Gore | + +--- + +## Open Questions for Round 2 + +| # | Question | Raised By | Needs Input From | +|---|----------|-----------|------------------| +| Q-W01 | Does v0.1 ship with 1 FRIEND per character (Kael/Sera) or do we author additional pool candidates? | Gore/Nigel | Project lead (scope decision) | +| Q-W02 | `global/` vs `_global/` prefix for content directory? | Tyre vs Gestalt | Project lead (convention call) | +| Q-W03 | Is Kael/Hael sonic collision a real usability problem? Should either name change? | Paula | Mellanie (authoring impact), Ozzie (player confusion) | +| Q-W04 | Does v0.1 implement seed-based randomization or just the architecture for it? | Nigel | Project lead + Tyre (scope) | +| Q-W05 | Does D-040 exist? Miri references it for wiki taxonomy but it's not in current decisions directory. | Qatux | Miri | +| Q-W06 | Should some Tier 3 NPCs be promoted to Tier 2? (Drin does Tier 2 narrative work.) | Ozzie | Gestalt (mechanical impact), project lead | +| Q-W07 | `lines/` (Tyre) vs separate `dialogue/` + `monologue/` (Gestalt) for content subdirectory? | Tyre vs Gestalt | Project lead (convention call) | +| Q-W08 | What is the `district` or `template` atomic content pack unit for modding? | Tyre | Gestalt, Nigel | +| Q-W09 | Should modder-added line pools have weighting/caps to prevent NPC voice drowning? | Tyre | Gestalt, Nigel | +| Q-W10 | Should location shortcodes match wiki slugs or use abbreviated forms? | Tyre | Mellanie, Paula | +| Q-W11 | Is Torek's ring connection always authored (one answer) or randomizable per seed? | Gestalt | Nigel, project lead | + +--- + +## Per-Agent Proposal Counts + +| Agent | Proposals | Topics Addressed | Key Contributions | +|-------|-----------|-----------------|-------------------| +| **Gore** | 7 (P-01 through P-03, P-49 through P-51, P-28) | 1, 3, 6 | Thematic spine (complicity), FRIEND never proc-gen, cultural identity as mechanical resistance | +| **Gestalt** | 9 (P-04 through P-06, P-15 through P-17, P-41, P-52 through P-54) | 1, 2, 5, 6 | Triangle analysis, mechanical requirements, content directory, PC upgrade pipeline | +| **Paula** | 12 (P-07 through P-11, P-18, P-19, P-29 through P-31, P-58 through P-60) | 1, 2, 3, 6 | Smuggler lens gap, tier templates, naming analysis, PC conversion | +| **Miri** | 5 (P-26, P-27, P-33, P-38, P-39) | 3, 4 | Regional style guide template + Krenn brief, canonical_id, growth planning | +| **Ozzie** | 5 (P-12 through P-14, P-61, P-62) | 1, 6 | Emotional gut-checks, NPC soul assessment, PC-as-NPC wow moments | +| **Mellanie** | 8 (P-20 through P-25, P-32, P-25) | 2, 3 | Authoring conventions, location shortcodes, environmental text catalog | +| **Nigel** | 5 (P-46 through P-48, P-55 through P-57) | 5, 6 | Mod pool_eligible, template role slots, three randomization axes | +| **Tyre** | 8 (P-34 through P-37, P-40, P-42 through P-45) | 4, 5 | Taxonomy rules, content directory architecture, mod overlay mechanics | + +--- + +## Notable Quotes (For SUMMARY.md) + +- **Gore on complicity:** "Every character in Sova Transit District is complicit in something. [...] The player becomes complicit in whatever they choose. Watching IS participating." +- **Gore on Hael:** "Hael [...] is the emotional fulcrum of the entire vertical slice. One person who never touches the conspiracy is the person the conspiracy most damages." +- **Ozzie on Hael:** "Not Kael, not Sera — HAEL. The partner sitting in the bar, checking the door every time it opens. [...] THAT'S the game." +- **Paula on detective bias:** "The smuggler's content pipeline is systematically under-served compared to the detective's." +- **Gestalt on T1:** "The smuggler's role is 'caught between' — but what do they DO?" +- **Miri on naming drift:** "Nobody decided Krenn names should be short and consonant-heavy. But when Finnish, Estonian, and Latvian naming traditions blend in a working-class logistics culture that values directness, compression happens naturally." +- **Mellanie on blocking dependency:** "I don't have a regional style brief to write against. [...] The brief is my blocking dependency." +- **Nigel on mods as replayability:** "Mods are replayability we don't have to build." +- **Ozzie on the wow moment:** "The wow moment isn't 'I read my backstory.' The wow moment is 'I HAVE a backstory and I'm discovering it the way I'd discover a real place — by living in it.'" +- **Gore on proc-gen:** "Procedural generation amplifies authored content only when the authored content is the emotional core and the procedural content is the context that reframes it." + +--- + +*62 proposals tracked. 8 tensions identified. 11 open questions for Round 2. 14 emerging consensus items.* diff --git a/docs/workshops/wiki-review/round1-tyre.md b/docs/workshops/wiki-review/round1-tyre.md new file mode 100644 index 000000000..0427d981e --- /dev/null +++ b/docs/workshops/wiki-review/round1-tyre.md @@ -0,0 +1,583 @@ +# Wiki Review Workshop — Round 1: Tyre (Technical Architect) + +**Topics:** 4 (Taxonomy Nesting) and 5 (Content Directory Structure + Mod Overlay) + +--- + +## Topic 4: Wiki Taxonomy Hardening + +### The Problem, Stated Precisely + +We have 45 wiki files today. The v0.1 vertical slice has 1 system, 1 station, 1 district, 3 social sites, 17 NPCs. When we add a second system — or a second station in Krenn — every generic name collides. "The Terminal" exists on every logistics station. "Maintenance Corridors" is universal. "Drin" is a common enough name to recur. + +The question isn't *whether* to namespace. It's *how deep to nest* before the directory structure becomes a tax on contributors instead of an aid. + +### Proposal: Two Rules, One Principle + +**Principle: The filesystem is navigation, not identity.** Unique identity lives in content frontmatter (YAML/markdown metadata). The directory path is for humans browsing the tree. It should be shallow enough to tab-complete and deep enough to disambiguate. + +**Rule 1: Maximum 2 levels of spatial nesting for locations.** + +``` +locations/ + {system}/ + {location-slug}.md +``` + +Current state (`locations/krenn-system/the-terminal.md`) already follows this. Good. Don't go deeper. + +Why not 3 levels (`locations/{system}/{station}/{slug}.md`)? Because: +- Tab-completing a 4-segment path is annoying. Contributors will get the nesting wrong. +- Station context belongs in the file's frontmatter, not the path. A location is *in* a station, but it's *addressed by* system + slug. +- Most systems have 1-3 stations. Nesting buys almost nothing for the navigation cost. + +If two locations in the same system share a slug (e.g., two stations both have "The Terminal"), disambiguate the slug: `the-terminal-sova.md` vs `the-terminal-orbital.md`. The frontmatter carries the canonical name. + +**Example — v0.2 adds a second system (Tavros):** + +``` +locations/ + krenn-system/ + the-terminal.md # Station Sova's logistics hub + the-last-shift.md + maintenance-corridors.md + tavros-system/ + the-terminal-central.md # Tavros Central Station's hub + the-strip.md # Bar district + dry-dock-corridors.md +``` + +No restructuring of existing files. New system = new directory. Done. + +**Rule 2: NPCs, factions, technology, contraband, and knowledge are FLAT until collision.** + +``` +npcs/ + kael-davan.md # unique name → flat + sera-venn.md + drin.md # unique in v0.1 + +# If v0.2 introduces a second "Drin": +npcs/ + drin.md # rename to drin-sova.md + drin-sova.md # Krenn System Drin (retroactive rename) + drin-tavros.md # Tavros System Drin +``` + +Factions are inherently global — `factions/lattice-commission.md` never collides. Technology and contraband are likewise global concepts. + +**Wait — do we need the retroactive rename?** Yes. But only on actual collision, which is rare. 17 NPCs fit flat. 50 NPCs probably fit flat. At 100+ NPCs across 3+ systems, you'll get collisions, but they'll be individual renames, not restructures. + +If the team wants to avoid *any* future renames, we could namespace NPCs by district from the start: + +``` +npcs/ + sova-transit/ + kael-davan.md + drin.md + tavros-central/ + drin.md +``` + +I don't recommend this for v0.1 (17 NPCs, one district, unnecessary nesting). But I acknowledge it's a valid choice if the team prefers "never rename" over "shallow paths now." + +**Rule 3: World hierarchy is flat with cross-references, not nesting.** + +``` +world/ + krenn-system.md # links to station-sova.md + station-sova.md # links to sova-transit-district.md + sova-transit-district.md # links to location pages +``` + +The spatial hierarchy lives in the *content* (wiki cross-links), not the *directory*. This is the same principle as Rule 1 — identity in content, navigation in paths. If we nested `world/krenn-system/station-sova/sova-transit-district.md`, contributors would drown in path segments. Three flat files with hyperlinks do the job better. + +### Scaling Analysis + +| Content growth | Current structure works? | Change needed? | +|---|---|---| +| v0.1 (1 system, 17 NPCs) | Yes | None | +| v0.2 (2 systems, ~40 NPCs) | Yes | New `locations/{system}/` dir only | +| v1.0 (5+ systems, 100+ NPCs) | Mostly | Occasional NPC slug disambiguation | +| DLC/mod content | Yes (see Topic 5) | Content packs are separate trees | + +The structure survives because the nesting is shallow and disambiguation is on-demand. The only painful moment is if two NPCs share a first name across systems and we rename files — but that's a single `git mv`, not a restructure. + +### Summary: Taxonomy Rules + +1. **Locations**: `locations/{system}/{slug}.md` — max 2 levels. Disambiguate slug on collision. +2. **NPCs**: `npcs/{slug}.md` — flat. Disambiguate with `{slug}-{district}.md` on collision only. +3. **Factions, technology, contraband, knowledge**: flat. No foreseeable collision risk. +4. **World**: flat with cross-references. Hierarchy is content, not structure. +5. **Authoring guides**: `authoring/{slug}.md` — flat. Few files, no collision risk. + +--- + +## Topic 5: Content Directory Structure & Mod Overlay + +*cracks knuckles* + +This is the architectural meat. The wiki (`docs/wiki/`) is the authoring source of truth — human-readable, team-navigable. The content directory (`content/`) is the engine-readable delivery format — YAML, schema-validated, loaded at runtime. They mirror each other structurally but serve different consumers. + +### Architecture: Three-Layer Content Stack + +``` +Layer 3 (highest priority): mods/ # User mods (override/extend) +Layer 2: content/dlc/ # Official DLC packs +Layer 1 (base): content/ # Base game +``` + +Later layers override or extend earlier layers. The engine walks the stack top-down, resolving each content address to the highest-priority file. + +### Proposed `content/` Directory Structure + +``` +content/ + _meta/ + manifest.yaml # Pack metadata: version, id, dependencies + load-order.yaml # Explicit load ordering for multi-pack scenarios + + _schema/ + npc.schema.yaml # Validation schema per content type + location.schema.yaml + faction.schema.yaml + template.schema.yaml + fact.schema.yaml + dialogue.schema.yaml + monologue.schema.yaml + district.schema.yaml + + global/ + factions/ + concord-assembly.yaml + lattice-commission.yaml + syndics.yaml + the-ring.yaml + guardians-of-autonomy.yaml + veil-institute.yaml + the-unbound.yaml + technology/ + neural-lattice.yaml + meridian.yaml + span-gates.yaml + founder-gates.yaml + clone-transfer.yaml + severance-tech.yaml + contraband/ + lattice-components.yaml + medical-grade-replacements.yaml + severance-equipment.yaml + knowledge/ + facts.yaml # All FactId definitions (24 for v0.1) + entity-attributes.yaml # Canonical EntityKnowledge keys + relationship-states.yaml # RelationshipState enum reference + + districts/ + sova-transit/ + district.yaml # District metadata, spatial refs, ambient config + npcs/ + kael-davan.yaml # 10-axis NPC definition + sera-venn.yaml + voss.yaml + lera-sessik.yaml + torek-lintar.yaml + devra.yaml + maret-korr.yaml + resha.yaml + hael.yaml + renn.yaml + pell.yaml + harek.yaml + drin.yaml + sess.yaml + olin.yaml + sabel.yaml + tav.yaml + locations/ + the-terminal.yaml # Spatial definition, sightlines, Meridian coverage + the-last-shift.yaml + maintenance-corridors.yaml + templates/ + logistics-hub.yaml # Social site: roles, triangles, NPC assignments + bar.yaml + smuggling-ring.yaml + lines/ + terminal/ + dialogue.yaml + monologue-smuggler.yaml + monologue-detective.yaml + bar/ + dialogue.yaml + monologue-smuggler.yaml + monologue-detective.yaml + corridor/ + dialogue.yaml + monologue-smuggler.yaml + monologue-detective.yaml +``` + +### Key Design Decisions + +**Why `districts/` as the atomic content pack?** + +A district maps to D-025 (social site / functional cluster as atomic template unit). It's the natural unit of content authoring, the natural unit of mod creation, and the natural unit of engine loading. "Add a district" = drop a new directory under `districts/`. The engine discovers it. + +The monologue guide already organizes content by location within a district (terminal, bar, corridor). The `lines/` subdirectory matches this exactly. + +**Why `global/` vs `districts/`?** + +Some content is inherently Reach-wide: factions, technology, contraband definitions, FactId vocabulary. An NPC references `faction: "lattice-commission"` — that faction definition lives in `global/`, not per-district. If a mod changes how the Commission works, it changes `global/factions/lattice-commission.yaml` once, and every district that references it picks up the change. + +District-scoped content is everything that's spatially local: NPCs, locations, social site templates, dialogue/monologue pools. + +**Why `lines/` not `content/` or `dialogue/`?** + +Three reasons: (1) avoids recursive `content/content/` path confusion, (2) "lines" is what authors call it — monologue lines, dialogue lines, (3) distinguishes textual content from structural definitions (NPC YAML is structural, monologue YAML is lines). + +**Why `_schema/` and `_meta/` with underscore prefix?** + +Infrastructure files sort to top of directory listings and are visually distinct from game content. Modders know not to touch underscore directories. Same convention as `_config.yml` in Jekyll, `__init__.py` in Python. + +### Mod Overlay: How It Works + +A mod is a content pack with the same directory structure as `content/`. Mods live under `mods/{mod-id}/`. + +**Example: "Add Jax the bartender to The Last Shift"** + +``` +mods/ + extra-bartender/ + _meta/ + manifest.yaml # mod-id: extra-bartender, requires: base >= 0.1 + districts/ + sova-transit/ + npcs/ + jax.yaml # New NPC definition (10-axis) + templates/ + bar.yaml # EXTENDS bar template (adds Jax to role list) + lines/ + bar/ + dialogue.yaml # EXTENDS dialogue pool (adds Jax's lines) +``` + +**Three overlay operations:** + +| Operation | When | Mechanic | +|---|---|---| +| **ADD** | New file at a path that doesn't exist in base | File is loaded as-is | +| **REPLACE** | File at same path as base, entity-type content | Entire file replaces base version | +| **MERGE** | File at same path as base, pool-type content | Lists are concatenated, deduplicated by `id` | + +The critical distinction: **entity definitions REPLACE, line pools MERGE.** + +If a mod provides `districts/sova-transit/npcs/kael-davan.yaml`, it *replaces* Kael's entire 10-axis definition. You can't partially patch an NPC — that's a recipe for broken state. + +If a mod provides `districts/sova-transit/lines/bar/dialogue.yaml`, its lines are *appended* to the base pool. Each line has a unique `id` — if a mod provides a line with an existing `id`, the mod's version wins (override by ID). New IDs are simply added. This means a modder can: +- Add 5 new dialogue lines (new IDs) without touching existing content +- Override a specific line (same ID, different text) without replacing the whole pool +- Both in the same file + +**Merge semantics in YAML:** + +```yaml +# Base: content/districts/sova-transit/lines/bar/dialogue.yaml +lines: + - id: bar_d_001 + text: "What'll you have?" + role: bartender + access: [public] + trust: surface + situation: [bar_evening] + +# Mod: mods/extra-bartender/districts/sova-transit/lines/bar/dialogue.yaml +lines: + - id: bar_d_001 # OVERRIDE: same id, different text + text: "Evening. The usual?" + role: bartender + access: [public] + trust: surface + situation: [bar_evening] + + - id: bar_d_200 # ADD: new id + text: "Jax says the grain spirit's from a new batch. Smoother." + role: bartender + access: [peer] + trust: surface + situation: [social] +``` + +**Load order resolution:** + +``` +1. Discover all content packs: content/ (base), content/dlc/* (DLC), mods/* (user) +2. Read each _meta/manifest.yaml for dependencies and load-order hints +3. Topological sort by dependencies (base → DLC → mods, respecting inter-mod deps) +4. For each content address (e.g., districts/sova-transit/npcs/kael-davan.yaml): + a. Entity types: last writer wins (highest priority pack) + b. Pool types: merge all, deduplicate by line id (highest priority wins on collision) +5. Validate merged content against _schema/ +``` + +### Content Validation Pipeline + +**Proposal: Schema per content type, not one schema.** + +Each content type has its own YAML schema in `_schema/`. This is the right granularity because: +- Different types have completely different shapes (NPC ≠ dialogue ≠ faction) +- Schema changes are localized (adding a new NPC axis doesn't touch dialogue schema) +- Mod validation checks only the types the mod provides + +**Validation runs at three points:** + +| When | What | Speed | +|---|---|---| +| **Author-time** | CLI validator: `make validate-content` | <2 seconds for full base | +| **CI** | Same validator, blocks merge on failure | Same | +| **Load-time** | Engine validates on startup, panics on schema violation | ~50ms for v0.1 content | + +**What the validator checks:** + +1. **Structural validity**: YAML parses, required fields present, enums match allowed values. +2. **Cross-reference integrity**: + - NPC definitions reference valid FactIds from `global/knowledge/facts.yaml` + - Dialogue prerequisites reference valid FactIds and entity slugs + - Template role lists reference valid NPC slugs in the same district + - Monologue `character` values are valid enum members +3. **Pool consistency**: + - No duplicate line IDs within a merged pool + - All `access` and `trust` values are valid enums + - All `trigger` types match the 9 canonical types + - All `situation`, `topic`, `mood` values match canonical enums +4. **Completeness** (warning, not error): + - Every NPC in a template has at least N dialogue lines + - Every location has at least one monologue line per character + - Tier 1 NPCs meet minimum line counts from D-034 + +**Schema format**: YAML schemas in a subset of JSON Schema (YAML-formatted for readability, functionally equivalent). The Rust loader and the Python/CLI validator both consume the same schema files. + +Example NPC schema (abbreviated): + +```yaml +# _schema/npc.schema.yaml +type: object +required: [id, name, tier, axes] +properties: + id: + type: string + pattern: "^[a-z][a-z0-9_-]+$" + name: + type: string + tier: + type: integer + enum: [1, 2, 3] + district: + type: string + axes: + type: object + required: [want, routine, personality] + properties: + want: { type: string } + secret: { type: string } + relationships: + type: array + items: { type: object } + tolerance: { type: string } + routine: { type: string } + information: { type: string } + contentment: { type: string } + personality: { type: string } + tell: { type: string } + skills: { type: string } + voice_sample: + type: array + items: { type: string } + dual_lens: + type: object + properties: + smuggler: { type: string } + detective: { type: string } +``` + +### Hot-Reloading During Development + +**Feasibility tier: straightforward for line pools, moderate for entity definitions.** + +The Rust server watches `content/` via `notify` crate (cross-platform filesystem events). On file change: + +| Content type | Reload strategy | Latency | +|---|---|---| +| Dialogue/monologue pools | Full pool reload for the affected location | <5ms | +| NPC definitions | Update ECS component fields in-place | <10ms | +| Location definitions | Update spatial metadata | <10ms | +| Templates | Requires re-linking NPC-to-role assignments | ~50ms | +| Global definitions (factions, facts) | Full reload of global registry | ~20ms | +| Schema changes | Requires restart (schema drives parser) | N/A | + +**Line pool hot-reload is the money feature.** Writers edit `monologue-smuggler.yaml`, save, and the next monologue trigger in-game uses the updated pool. No restart, no reload command. This is critical for the authoring workflow — Mellanie and Paula need to iterate on lines without leaving the game running. + +**Implementation sketch:** + +```rust +// Simplified hot-reload system +fn content_watcher_system( + mut events: EventReader, + mut pools: ResMut, + mut npcs: Query<&mut NpcDefinition>, + schemas: Res, +) { + for event in events.read() { + match categorize_path(&event.path) { + ContentType::DialoguePool(location, pool_type) => { + // Re-parse, re-validate, swap pool + if let Ok(new_pool) = parse_and_validate(&event.path, &schemas) { + pools.replace(location, pool_type, new_pool); + info!("Hot-reloaded {} pool for {}", pool_type, location); + } + } + ContentType::NpcDefinition(npc_id) => { + // Re-parse, update matching ECS component + if let Ok(new_def) = parse_and_validate(&event.path, &schemas) { + for mut npc in npcs.iter_mut() { + if npc.id == npc_id { + *npc = new_def; + break; + } + } + } + } + // ... other types + } + } +} +``` + +Hot-reload is **development-only** (behind `#[cfg(feature = "dev")]`). Release builds load content once at startup and never watch the filesystem. This avoids the performance cost of file watching and the security surface of runtime file loading in shipped builds. + +### How Wiki and Content Relate + +``` +docs/wiki/ → Human-authored source of truth (markdown) + ↓ (authoring pipeline: wiki → YAML) +content/ → Engine-readable delivery format (YAML) + ↓ (engine loads at startup) +Runtime ECS → In-memory game state +``` + +The wiki is where *decisions* are made and *content is authored*. The content directory is where *the engine looks*. The pipeline between them can be: + +1. **Manual** (v0.1): Authors write YAML by hand, referencing wiki pages. The wiki and YAML coexist as parallel representations. The validator ensures they don't drift. +2. **Semi-automated** (v0.2+): A conversion tool extracts structured data from wiki markdown (NPC axes, FactId definitions) into YAML. Authors maintain the wiki; the tool generates YAML. +3. **Full pipeline** (v1.0): Wiki entries have embedded YAML frontmatter that IS the content definition. The wiki page is simultaneously the human-readable doc and the machine-readable source. + +For v0.1, option 1 is correct. The content volume (17 NPCs, 3 locations, ~200 lines) doesn't justify pipeline tooling. Authors write both wiki markdown and content YAML. The schema validator catches inconsistencies. + +### Mod Structure: Complete Example + +A modder who wants to "add a new NPC to the bar with custom dialogue" creates: + +``` +mods/ + jax-the-veteran/ + _meta/ + manifest.yaml + districts/ + sova-transit/ + npcs/ + jax-korrenson.yaml + templates/ + bar.yaml # Extends: adds jax_korrenson to regular role + lines/ + bar/ + dialogue.yaml # Jax's dialogue lines (new IDs) + monologue-smuggler.yaml # Smuggler's observations of Jax + monologue-detective.yaml # Detective's observations of Jax +``` + +**`manifest.yaml`:** +```yaml +id: jax-the-veteran +name: "Jax the Veteran" +version: "1.0.0" +author: "ModderName" +requires: + - id: base + version: ">=0.1.0" +description: "Adds Jax Korrenson, a retired military veteran, to The Last Shift." +content_types: [npc, template, dialogue, monologue] +``` + +**`jax-korrenson.yaml`:** +```yaml +id: jax-korrenson +name: "Jax Korrenson" +tier: 3 +district: sova-transit +axes: + want: "Quiet drink, nobody asking questions about the war." + routine: "Arrives at bar 18:00, corner booth, leaves 22:00." + personality: "Gruff, observant, protective of regulars." +voice_sample: + - "I've seen enough to know when someone's lying. You're not good at it." +``` + +**`dialogue.yaml` (merge extension):** +```yaml +lines: + - id: bar_d_300 + text: "You don't look like logistics. What's your story?" + role: bar_regular + access: [public] + trust: surface + situation: [bar_evening, social] + topic: [personal] + mood: [suspicious] +``` + +The engine loads this, validates it against `_schema/`, merges the line pool, assigns the NPC to the template, and Jax appears at the bar. + +### Feasibility Assessment + +| Component | Difficulty | Sprint estimate | +|---|---|---| +| Directory structure + schema definitions | Easy | 0.5 sprint | +| YAML content parser (Rust, `serde_yaml`) | Easy | 0.5 sprint | +| Schema validator CLI (`make validate-content`) | Moderate | 1 sprint | +| Mod discovery + load-order resolution | Moderate | 1 sprint | +| Merge semantics for line pools | Moderate | 0.5 sprint | +| Hot-reload (dev-only) | Moderate | 1 sprint | +| Cross-reference validation | Hard | 1 sprint | + +Total for full content pipeline: ~4.5 sprints. But we don't need all of it for v0.1: + +**v0.1 scope (1 sprint):** Directory structure + YAML parser + basic schema validation. No mod overlay, no hot-reload. Content is loaded once at startup from `content/`. + +**v0.2 scope (2 sprints):** Mod overlay (ADD + REPLACE), schema validator CLI, hot-reload for line pools. + +**v0.3+ scope (1.5 sprints):** MERGE semantics, cross-reference validation, full mod pipeline. + +### Open Questions for the Team + +1. **Gestalt/Nigel**: The mod MERGE mechanic for line pools needs game design input. If a mod adds 50 dialogue lines to a pool of 20, the NPC talks like a mod 71% of the time. Should there be weighting? A max-lines-per-mod cap? Or is this the modder's problem? + +2. **Paula/Mellanie**: The `lines/` directory uses location shortnames (terminal, bar, corridor). These come from the monologue guide. Are these stable identifiers you're comfortable with, or should they match the wiki slugs (the-terminal, the-last-shift, maintenance-corridors)? + +3. **Gestalt**: Is `district` the right atomic content pack unit? Or should it be `template` (social site)? A district contains multiple templates — packing at the district level means you can't add a single social site without the whole district. Packing at the template level is more granular but more complex. + +--- + +## Cross-Topic: How Wiki Taxonomy Maps to Content Structure + +| Wiki path | Content path | Notes | +|---|---|---| +| `docs/wiki/npcs/kael-davan.md` | `content/districts/sova-transit/npcs/kael-davan.yaml` | NPC is district-scoped | +| `docs/wiki/locations/krenn-system/the-terminal.md` | `content/districts/sova-transit/locations/the-terminal.yaml` | Location is district-scoped | +| `docs/wiki/factions/lattice-commission.md` | `content/global/factions/lattice-commission.yaml` | Faction is global | +| `docs/wiki/knowledge/fact-catalog.md` | `content/global/knowledge/facts.yaml` | All FactIds in one file | +| `docs/wiki/authoring/monologue-guide.md` | N/A (authoring reference, not engine content) | Wiki-only | +| N/A | `content/districts/sova-transit/lines/terminal/dialogue.yaml` | Engine-only (authored YAML) | + +The mapping is consistent but not 1:1. Some wiki pages are references that don't produce engine content. Some engine content (line pools) doesn't have a wiki counterpart — it IS the content. + +--- + +*Tyre out. Ready for cross-pollination in Round 2.* diff --git a/docs/workshops/wiki-review/round2-gestalt.md b/docs/workshops/wiki-review/round2-gestalt.md new file mode 100644 index 000000000..2ea172f42 --- /dev/null +++ b/docs/workshops/wiki-review/round2-gestalt.md @@ -0,0 +1,634 @@ +# Round 2 — Gestalt (Systems Design) + +*cracks knuckles* + +Five tensions to reconcile. Let me work through each one. + +--- + +## 1. Content Directory Convergence (Gestalt + Tyre) + +I read Tyre's proposal carefully. We agree on ~80% of the structure. Let me map where we align, where we differ, and what the converged structure should be. + +### Where We Agree + +| Area | Consensus | +|------|-----------| +| Global/district split | Global content (factions, tech, contraband, knowledge) separate from per-district content | +| Districts as atomic pack | `districts/{district-slug}/` is the content unit | +| Per-district NPCs | `districts/{slug}/npcs/{npc}.yaml` | +| Per-district locations | `districts/{slug}/locations/{location}.yaml` | +| Schema files | Validation schemas at the top level | +| Mod overlay | Additive by default, explicit override declarations | + +### Where We Differ (and Resolution) + +| My Proposal | Tyre's Proposal | Resolution | Why | +|---|---|---|---| +| `_global/` | `global/` | **Tyre wins: `global/`** | Underscore prefix is for infrastructure (`_schema/`, `_meta/`), not game content. Factions are game content. | +| Separate `dialogue/` and `monologue/` dirs | `lines/{location}/` with files inside | **Tyre wins: `lines/`** | Cleaner. `lines/terminal/dialogue.yaml` + `lines/terminal/monologue-smuggler.yaml` keeps everything per-location without parallel directory trees. | +| `triangles/` as standalone dir | `templates/` (social site defs that include triangle specs) | **Tyre wins: `templates/`** | Triangles are a property of social sites, not standalone objects. A triangle definition makes no sense without its template context. | +| `facts/` per district for local FactId instances | All facts in `global/knowledge/facts.yaml` | **I push back here.** See below. | +| `regions/` for style guides | Not addressed | **Add `global/regions/`** | Miri's Krenn brief needs a home. Regional style guides are global (same culture applies wherever that culture exists). | +| No manifest | `_meta/manifest.yaml` | **Tyre wins: add `_meta/`** | Needed for pack metadata, load order, versioning. | + +### The Local Facts Question + +Tyre puts all 24 FactIds in `global/knowledge/facts.yaml`. I disagree for one specific category: **spatial/location facts**. + +`contraband.ring_exists` is a legitimate global definition — the CONCEPT of a smuggling ring is vocabulary. But `location.corridor_b7_restricted` is meaningless outside Sova Transit District. If we add a second district, it will have its OWN restricted corridors with different names. These are per-district facts. + +**Proposed split:** + +``` +global/knowledge/ + facts.yaml # Abstract/universal FactIds: contraband.*, world.*, relationship.* + entity-attributes.yaml # 14 canonical keys + relationship-states.yaml + +districts/sova-transit/ + facts.yaml # District-specific FactIds: location.*, investigation.*, progress.* +``` + +The engine merges both at load time. Content authors know: "Am I defining a concept (global) or a location-specific observation (district)?" + +This also solves Nigel's randomizer requirement — per-seed variation can swap which district facts exist without touching global vocabulary. + +### Converged Structure + +``` +content/ + _meta/ + manifest.yaml + load-order.yaml + + _schema/ + npc.schema.yaml + location.schema.yaml + faction.schema.yaml + template.schema.yaml + fact.schema.yaml + dialogue.schema.yaml + monologue.schema.yaml + district.schema.yaml + + global/ + factions/ + concord-assembly.yaml + lattice-commission.yaml + syndics.yaml + guardians-of-autonomy.yaml + veil-institute.yaml + the-unbound.yaml + technology/ + neural-lattice.yaml + meridian.yaml + span-gates.yaml + founder-gates.yaml + clone-transfer.yaml + severance-tech.yaml + contraband/ + lattice-components.yaml + medical-grade-replacements.yaml + severance-equipment.yaml + knowledge/ + facts.yaml # Global/abstract FactIds only + entity-attributes.yaml + relationship-states.yaml + regions/ + krenn-system.yaml # Miri's regional style guide + + districts/ + sova-transit/ + district.yaml # Metadata, location list, faction presence, ambient config + facts.yaml # District-specific FactIds + starting confidences + npcs/ + kael-davan.yaml + sera-venn.yaml + voss.yaml + ... + locations/ + the-terminal.yaml + the-last-shift.yaml + maintenance-corridors.yaml + templates/ + logistics-hub.yaml # Social site: role slots, triangles, NPC assignments + bar.yaml + smuggling-ring.yaml + lines/ + terminal/ + dialogue.yaml + monologue-smuggler.yaml + monologue-detective.yaml + bar/ + dialogue.yaml + monologue-smuggler.yaml + monologue-detective.yaml + corridor/ + dialogue.yaml + monologue-smuggler.yaml + monologue-detective.yaml +``` + +### Mod Overlay Mechanics (Accepting Tyre's) + +Tyre's three overlay operations (ADD / REPLACE / MERGE) are correct and better specified than mine: +- **Entity definitions REPLACE** (whole file — no partial NPC patches) +- **Line pools MERGE** (append, deduplicate by `id`, last-writer-wins on collision) +- **New files ADD** (no conflict) + +**One addition to Tyre's spec:** I want to address his open question about mod pool flooding. If a mod adds 50 dialogue lines to a 20-line pool: + +**Proposal: Weight tagging.** Each content pack declares a `weight` in its manifest (default: 1.0). The line selection system uses weight as a probability multiplier. Base content at weight 1.0, a mod at weight 0.3 means mod lines are 30% as likely to be selected as base lines. This lets modders add volume without dominating the pool. + +```yaml +# In mod manifest +id: extra-bartender +weight: 0.5 # Mod lines selected at half the rate of base lines +``` + +### Tyre's Other Open Question: District vs Template as Atomic Pack + +Tyre asked: "Is `district` the right atomic content pack unit? Or should it be `template` (social site)?" + +**Answer: District.** Here's why: + +Templates share NPCs (bridge NPCs span social sites). If a modder adds a new NPC to the bar, that NPC might reference Hub NPCs by name, or participate in a cross-template triangle. Packing at the template level would mean the mod has to patch multiple template packs to add one NPC — that's worse for modders. + +District is the natural unit because triangles and bridge connections are district-internal. A mod that adds "a new bar NPC" is really adding "a new NPC to Sova Transit District who happens to frequent the bar." The mod touches `districts/sova-transit/` and everything resolves within that directory. + +--- + +## 2. PC-as-NPC Converged Specification (Gestalt + Paula) + +Paula and I are saying the same things at different granularity. She organized by deliverable type (required/optional/PC-only), I organized by data structure (transfer/transform/generate). Let me merge. + +### The Full PC-Candidate NPC Spec + +An NPC that can be upgraded to a PC must have ALL standard Tier 2+ fields PLUS a `## PC Upgrade` appendix containing structured data. + +#### Fields from Standard NPC Brief (Required for ALL Tier 2+) + +These 12 fields transfer directly into the PC brief (Paula's list, confirmed): + +| # | Field | Source Axis | Transfer Type | +|---|---|---|---| +| 1 | Name | Core Identity | Direct | +| 2 | Age | Core Identity | Direct | +| 3 | Role | Core Identity | Direct → starting occupation + access | +| 4 | System Origin | Core Identity | Direct → cultural context | +| 5 | Lattice Tier | Core Identity | Direct → perception mode caps (D-017) | +| 6 | Employer | Core Identity | Direct → faction tag + cover | +| 7 | Want (Primary) | Axis 1 | Transform → orientation monologue seed | +| 8 | Want (Secondary) | Axis 1 | Transform → emotional anchor | +| 9 | Relationships (all) | Axis 3 | Transform → starting EntityKnowledge + RelationshipState | +| 10 | Daily Routine | Axis 5 | Transform → default schedule (deviations = player agency) | +| 11 | Information Inventory | Axis 6 | Transform → starting FactId confidences + knowledge graph | +| 12 | Faction | Inferred | Direct → access tier baseline | + +#### Fields That Transform at Upgrade (Derivable or Design-Choice) + +| # | Field | Status | Resolution | +|---|---|---|---| +| 13 | Secret/Vulnerability | **Partially required** | The PC knows their own secret. For smuggler: ring membership IS the secret (known to player, hidden from world). For detective: personal motive for requesting posting. The NPC brief provides the secret; the upgrade inverts it from "hidden from observer" to "player's burden to manage." | +| 14 | Contentment | Generated | From Want + Relationships + archetype. Smuggler starts moderate-low. Detective starts moderate. | +| 15 | Personality Traits | **Preset per archetype for v0.1** | Paula recommended this, I agree. Player-chosen personality is a v0.2+ feature. | +| 16 | Tell System | **Inverted** | This is the critical transform. The PC's tells become NPC-observable. Gore's insight applies: tells are how the world reads the PC. "You always check your lattice before lying" — the NPC knows. The PC doesn't control this mechanically; it fires when the PC takes certain actions. | +| 17 | Skill Set | Derived | From role + archetype. | +| 18 | Combat Tag | Derived | From archetype. | + +#### PC Upgrade Appendix (New Fields, Required for PC-Candidate NPCs) + +This is the section that must be added to any NPC who might become a PC. It's where Paula's 6 PC-only fields and my structured formats converge: + +**Field 1: Starting EntityKnowledge Table** + +```yaml +pc_upgrade: + starting_knowledge: + entities: + - target: kael_davan + state: Friendly + confidence: KnowsDetails + attributes: + name: "Kael Davan" + role: "dock worker" + faction: "ring member" # smuggler knows this + trust_level: "trusted" + relationship_type: "close colleague" + routine_pattern: "morning shift 06:00-14:00, bar after shift" + behavior_flags: "reliable,punctual" + - target: voss + state: Known + confidence: KnowsOf + attributes: + name: "Voss" + role: "shift supervisor" + faction: "civilian" # smuggler thinks this + trust_level: "reliable" + relationship_type: "authority figure" + # ... all known NPCs +``` + +**Field 2: Starting FactId Inventory** + +```yaml + starting_facts: + - id: contraband.ring_exists + confidence: KnowsDetails + - id: contraband.lattice_components + confidence: KnowsDetails + - id: location.corridor_b7_restricted + confidence: KnowsDetails + - id: world.shift_schedule + confidence: KnowsDetails + - id: relationship.ring_membership + confidence: KnowsDetails + - id: investigation.manifest_discrepancy + confidence: null # smuggler doesn't know about this + - id: contraband.severance_tech + confidence: null # smuggler doesn't know about this +``` + +**Field 3: Reverse Knowledge (Bidirectional)** + +This is my key contribution. Every NPC who knows the PC needs their EntityKnowledge entry defined: + +```yaml + known_by: + - observer: kael_davan + state: Friendly + attributes: + name: "{PC Name}" + role: "dock worker" + faction: "ring member" + trust_level: "trusted" + relationship_type: "close colleague" + - observer: voss + state: Known + attributes: + name: "{PC Name}" + role: "dock worker" + faction: "civilian" + trust_level: "reliable" + - observer: hael + state: Known + attributes: + name: "{PC Name}" + role: "dock worker" + faction: "civilian" + trust_level: "uncertain" # knows PC, doesn't know ring + - observer: lera_sessik + state: Known + attributes: + name: "{PC first name}" + role: "bar regular" + trust_level: "reliable" +``` + +**Why this matters:** Without reverse knowledge, NPCs don't know the player exists at game start. Kael can't say "There you are. Good — I was starting to worry" unless Kael's knowledge graph already contains an entry for the PC with `state: Friendly`. Ozzie's "walking into Cheers" moment depends entirely on these reverse entries being populated. + +**Field 4: Access Tier Map** + +```yaml + access_tier_map: + kael_davan: insider + voss: peer + lera_sessik: peer + hael: peer + sera_venn: public # smuggler doesn't know Sera well + maret_korr: insider # hub colleague + drin: insider # hub colleague + torek_lintar: peer # bar regular +``` + +**Field 5: Orientation Monologue Hook** + +```yaml + orientation: + monologue_pool: "smuggler" # which pool to activate + starting_want_text: > + Protect the operation and the people in it. + The money's good and Kael makes it manageable. + But Nils keeps pushing and Hael keeps worrying. + first_monologue_triggers: + - trigger: enter_location + location: terminal + text_ref: terminal_m_001 # "Morning shift. Recycled air and cargo lubricant." +``` + +**Field 6: Agency Boundaries** + +```yaml + agency: + can_access: [terminal, bar, corridor_b7, residential] + restricted_without_justification: [commission_kiosk] # smuggler has no Commission business + default_cover: "dock worker on shift" + cover_breaks_when: "present in restricted areas during non-shift hours, or interacting with Commission systems" +``` + +### Validation Requirement + +Paula's Step 5 is critical: **PC's starting knowledge must not contradict any NPC's information inventory.** If the PC "knows" Kael is in the ring, and Kael's Information Inventory says "nobody outside the ring knows" — that's consistent (PC IS ring). But if the PC "knows" Sera has unreported evidence, and Sera's profile says "nobody knows" — that's a knowledge graph violation. + +The schema validator (Tyre's pipeline) should check this: +``` +For each (target, attribute) in pc_upgrade.starting_knowledge.entities: + assert target NPC exists in district roster + assert attribute values are consistent with target NPC's Information Inventory + +For each (observer, attribute) in pc_upgrade.known_by: + assert observer NPC exists in district roster + assert observer's Information Inventory is compatible with their knowing these attributes about PC +``` + +--- + +## 3. FRIEND Pool: Size and Cost + +Nigel wants the FRIEND drawn from a pool. Gore agrees but insists THE FRIEND is never procedurally generated — the content is authored, the selection is randomized. I agree with both. + +### Pool Size Analysis + +| Pool Size (per character) | Total Tier 1 NPCs | Additional Authored Lines | Replayability Multiplier | v0.1 Feasible? | +|---|---|---|---|---| +| 1 (current: Kael, Sera) | 2 | 0 | 1x (no variation) | Yes (done) | +| 2 per character | 4 | ~140-200 | 4x (2 smuggler x 2 detective) | Stretch | +| 3 per character | 6 | ~280-400 | 9x | v0.2 target | + +### The Graceful Degradation Insight + +Here's what makes the pool work without exploding content costs: **FRIEND candidates that aren't selected as FRIEND still exist as excellent Tier 2 NPCs.** + +If Kael is selected as the smuggler's FRIEND, Renn (the other candidate) is just a courier — a well-written one with a rich profile, but his contradiction arc isn't activated by the storyteller. His Phase 1 warmth exists. His tells exist. His secret exists. But the storyteller doesn't trigger the "observe contradiction in restricted area" event for Renn. + +This means: +1. Every FRIEND candidate is always present in the world at full Tier 1 quality +2. Only the SELECTED FRIEND gets the contradiction arc ACTIVATED +3. The unselected candidates are the best Tier 2 NPCs in the district — richer than normal because they were written at Tier 1 depth +4. On replay, the player may encounter an NPC they KNOW has a secret (from a previous playthrough where that NPC was FRIEND) but whose arc isn't active. Gore's dramatic irony! + +### Authoring Cost Per Additional FRIEND Candidate + +Let me be precise about what "one additional FRIEND candidate" costs: + +| Deliverable | Lines/Pages | Time Estimate | +|---|---|---| +| Full Tier 1 profile (10-axis, all sections) | ~2 pages | 3-4 hours | +| 70-100 authored dialogue/monologue lines | 70-100 lines | 8-12 hours | +| Contradiction arc (5 phases) | Part of profile | Included above | +| Tell progression (3-4 stages) | Part of profile + lines | Included above | +| Dual-lens notes for BOTH characters | ~0.5 pages | 1-2 hours | +| PC Upgrade appendix | ~0.5 pages YAML | 1-2 hours | +| Reverse knowledge entries from ALL NPCs | ~0.25 pages YAML | 1 hour | +| Cross-character authored relationship stubs (FRIEND↔PC) | 5-10 lines | 1-2 hours | +| **Total per candidate** | **~3 pages + 70-100 lines** | **~15-22 hours** | + +### v0.1 Recommendation + +**Ship with 1 FRIEND per character (Kael, Sera).** But architect the pool system from day one: +- The `templates/` YAML includes a `friend_pool` field listing eligible NPC IDs +- The seed selects from this pool at game start +- v0.1 pool has 1 entry per character — functionally identical to current hardcoded behavior +- v0.2 adds second candidates without any architectural change + +```yaml +# In templates/logistics-hub.yaml (or a district-level config) +friend_pools: + smuggler: + - npc: kael_davan + contradiction_module: kael_exit_attempt + # v0.2: add renn or other candidate here + detective: + - npc: sera_venn + contradiction_module: sera_concealment + # v0.2: add second candidate here +``` + +### Gore's Constraint: Authored Relationship Depth + +Gore correctly insists the PC-FRIEND relationship needs authored warmth, not just `state: Friendly`. Each FRIEND candidate needs specific relationship stubs for EVERY possible PC upgrade candidate: + +- If the pool has 2 smuggler FRIENDs (Kael, Renn) and the PC could be any of 2-3 smuggler archetypes, we need: Kael↔PCa, Kael↔PCb, Renn↔PCa, Renn↔PCb relationship stubs. Each stub is 5-10 authored lines of shared history. + +This is a combinatorial cost. At pool size 2x2: 4 stubs (20-40 lines). At 3x3: 9 stubs (45-90 lines). Manageable but worth tracking. + +--- + +## 4. Triangle 1 Fix: The Nils-vs-Voss Escalation Decision + +Paula and I both flagged Hub Power (T1) as the weakest triangle. The core problem: Nils is off-stage, so the smuggler never mediates a real-time confrontation. The triangle describes tension but doesn't produce a FORK. + +### The Decision Moment: Volume Escalation + +**Setup (storyteller-triggered, mid-game):** + +Nils sends word through Renn that the next shipment is double volume. A connected system has a supply window — miss it and the opportunity is gone for months. Voss refuses to create the necessary schedule gap: "Two workers short on the same shift twice in a row? Maret will flag it. I won't do it." + +Both sides appeal to the smuggler. + +### The Fork + +| Option | Action | Immediate Effect | Cascade to T2 | Cascade to T5 | Detective Observability | +|---|---|---|---|---|---| +| **A: Side with Nils** | Tell Voss to make it work, or work around Voss | Voss creates gap resentfully, does it clumsily | Maret notices the schedule anomaly more easily → T2 heats up | Pell sees higher volume, more risk → Pell's wavering accelerates | Schedule anomaly is louder signal. Detective monologue: "Third schedule adjustment this cycle. Pattern." | +| **B: Side with Voss** | Tell Renn to relay: "Not this cycle" | Nils is displeased, questions smuggler's loyalty | Voss is relieved, cooperates more → T2 stays cool | Ring internal tension rises from above → different pressure path on Pell | Schedule looks clean. Detective has less to work with. Smuggler's ring standing drops. | +| **C: Split the route** | Propose half-volume through normal route, half through untested alternative | Partial success. New route = new exposure surface | Maret sees half the anomaly (borderline noticeable) | Ring members stretched thinner → more behavioral tells across the board | Activity in unexpected area. Detective monologue: "Cargo movement in Section C? That's not on any manifest." | + +### Mechanical Expression + +```yaml +# In templates/logistics-hub.yaml or a storyteller module +decision_node: + id: volume_escalation + trigger: storyteller_mid_game # fires between minute 12-18 + setup: + message_from: nils_davan # off-stage, delivered via renn + message_text: "Double volume. Next cycle. Make it happen." + voss_response: "I won't short the schedule again. Maret's watching." + options: + - id: side_with_nils + label: "Tell Voss to make it work" + effects: + - npc: voss + attribute_change: { trust_level: "resentful", exposure_risk: "escalating" } + - npc: maret_korr + behavior_flag_add: "noticed_schedule_gap" + - triangle: worried_knowledge + tension_increase: 2 + - triangle: informant_question + tension_increase: 1 + - investigation_signal: "schedule_anomaly_visible" + - id: side_with_voss + label: "Push back: not this cycle" + effects: + - npc: voss + attribute_change: { trust_level: "relieved", cooperation: "improved" } + - player: + attribute_change: { loyalty_assessment_by_nils: "questioned" } + - triangle: worried_knowledge + tension_increase: 0 + - triangle: informant_question + tension_increase: 1 # pressure comes from above instead + - investigation_signal: null # clean schedule, less detective evidence + - id: split_route + label: "Split: half normal, half new route" + effects: + - npc: voss + attribute_change: { trust_level: "uncertain" } + - location: section_c + flag: "unexpected_cargo_activity" + - triangle: worried_knowledge + tension_increase: 1 + - triangle: informant_question + tension_increase: 1 + - investigation_signal: "new_route_observable" +``` + +### Why This Fixes T1 + +1. **The smuggler CHOOSES.** Not "caught between" — actively deciding which side to favor. Real consequence, can't have both. +2. **Cascading consequences.** Each choice ripples into T2 and T5. The detective's experience changes based on which option the smuggler picked (in NPC mode, the AI picks based on the NPC's personality/loyalty balance). +3. **Nils is present-by-proxy.** The message arrives through Renn. Nils doesn't need to be physically present — the DEMAND is present. The smuggler's response defines their relationship with an off-stage power. +4. **Detective observability differs per choice.** Option A is loudest (easiest for detective). Option B is quietest. Option C creates a new thread. This means the smuggler's choice shapes the detective's investigation difficulty on replay. + +### Additional Fix: Nils Partial Presence + +I still recommend one brief Nils comm interaction in v0.1 — even a text-only lattice message that the smuggler receives and must respond to. This costs ~5-8 authored lines and makes the off-stage vertex feel real. The response choices could mirror or foreshadow the volume escalation decision. + +--- + +## 5. Routine Format + Cultural Patterns + +My Round 1 proposed a structured `routine:` YAML block. Miri's Krenn brief introduces cultural patterns that the routine should accommodate: shift-end bar culture, kuum (transition drink), kolm (card game), 5+2 work cycles. + +### The Problem + +The engine needs parseable schedule data (time, location, activity). Cultural flavor is for writers, not parsers. If I embed `cultural_note` fields in the YAML, I'm mixing concerns — the schedule system ignores them, and writers have to read through engine data to find authoring guidance. + +### Solution: Two Layers + +**Layer 1: Engine-readable routine (YAML)** + +```yaml +routine: + cycle: "5+2" # work days / rest days + schedule: + work_day: + - time: "06:00-06:30" + location: terminal + activity: shift_startup + - time: "06:30-10:30" + location: terminal + activity: work + - time: "10:30-11:00" + location: terminal_breakroom + activity: break + - time: "11:00-14:00" + location: terminal + activity: work + - time: "14:00-14:30" + location: terminal + activity: shift_end + - time: "14:30-16:00" + location: bar + activity: social + - time: "16:00-22:00" + location: residential + activity: home + rest_day: + - time: "09:00-12:00" + location: residential + activity: home + - time: "12:00-14:00" + location: bar + activity: social + - time: "14:00-22:00" + location: residential + activity: home + deviations: + - trigger: ring_operation + replaces: "22:00+" + location: corridor_b7 + frequency: "1-2x per week" + - trigger: volume_escalation # the T1 decision node + replaces: "14:00-14:30" + location: corridor_b7 + frequency: "once (event-driven)" +``` + +**Layer 2: Cultural context (prose, in the wiki NPC profile)** + +Under the Daily Routine section, AFTER the YAML block: + +> **Cultural context (Krenn System):** +> - Kael's shift startup involves grabbing leib from the canteen and eating standing — Krenn workers don't sit for breakfast +> - Break at 10:30 is social: lunch with the smuggler (if applicable), shared kalaa and supp +> - "Shift-end" at the bar means ordering kuum first (the spiced transition drink), then switching to grain spirit if staying. Kael usually shifts to the bar 2-3 days per work cycle +> - Hael expects Kael home by 17:00 on non-bar days. Late arrivals trigger Hael's worry axis +> - Ring operations happen during night shift transitions (22:00-23:00 window) — Kael uses "overtime" as cover to Hael + +This gives writers everything they need for dialogue and monologue ("Kael orders kuum" → Mellanie knows what that is from Miri's brief) while the engine reads only the clean YAML schedule. + +### How This Works With Miri's Specific Cultural Patterns + +| Miri's Pattern | Where It Lives | Who Uses It | +|---|---|---| +| 5+2 work cycle | `routine.cycle: "5+2"` in YAML | Schedule system | +| Shift-end bar migration | `schedule.work_day` entry with `location: bar` after shift | Schedule system + monologue triggers | +| Kuum as transition drink | Cultural context prose + Mellanie's menu + dialogue tags | Writers (not engine) | +| Kolm card game timing | `schedule.rest_day` entry at bar, OR deviation with `trigger: kolm_night` | Schedule system + event system | +| Leib/kalaa food | Cultural context prose | Writers (environmental text, dialogue flavor) | +| Greeting conventions (no verbal greeting, chin-lift) | NOT in routine — in Miri's regional brief | Writers (dialogue `notes` field) | + +### Style Guide Mandate + +Every NPC routine section in the wiki should contain: + +1. **YAML block** — engine-readable, schema-validated, per-tier minimum entries: + - Tier 3: 3+ time-location entries (minimum: work, social, home) + - Tier 2: 5+ entries with `work_day` and `rest_day` split + - Tier 1: 7+ entries with deviations specified +2. **Cultural context paragraph** — prose annotations for writers, referencing the regional brief +3. **Deviation list** — what pulls the NPC off their routine, with triggers and frequencies + +The YAML block is the mechanical requirement. The cultural context is the authoring aid. Both are mandatory; neither replaces the other. + +--- + +## Cross-Cutting: Paula's Smuggler Attribute Vocabulary + +Paula proposed 5 smuggler-specific entity attribute keys. This is a strong proposal that I want to endorse and refine, because it directly addresses the "smuggler content pipeline is under-served" problem she identified. + +### Endorsed Keys (with mechanical integration) + +| Key | Values | What Drives It | What It Gates | +|---|---|---|---| +| `operational_reliability` | `reliable`, `slipping`, `compromised`, `unknown` | NPC behavior + ring event outcomes | Smuggler monologue tone, ring assignment willingness | +| `exposure_risk` | `low`, `escalating`, `critical` | Tells + detective proximity + NPC behavior | Smuggler tension monologue, ring operational decisions | +| `loyalty_assessment` | `solid`, `uncertain`, `wavering`, `turning` | Observation of NPC behavior over time | Smuggler dialogue options (confront vs. reassure), ring strategy | +| `leverage_held` | Freeform string (e.g., `"gambling debt"`, `"family secret"`) | Discovery through observation or conversation | Confrontation/pressure dialogue unlocks | +| `social_debt` | `they_owe_me`, `i_owe_them`, `mutual`, `none` | Relationship history (authored per NPC) | Favor-asking dialogue, cooperation likelihood | + +These give the smuggler's knowledge model parity with the detective's investigation attributes. The detective has `tell_observed`, `contradiction_flagged`, `secret_held`, `secret_confidence`. The smuggler now has `operational_reliability`, `exposure_risk`, `loyalty_assessment`, `leverage_held`, `social_debt`. + +Both characters build profiles of NPCs. The detective's profile is investigative. The smuggler's profile is operational/social. Different lenses on the same people — which is exactly the game's thesis. + +**Implementation note for Tyre:** These 5 keys go into the entity-attributes schema alongside the existing 14. The `known_attributes` BTreeMap already supports arbitrary keys — no code change needed, just schema expansion and content authoring. + +--- + +## Summary: Decisions for Recording + +| # | Decision | Type | Status | +|---|---|---|---| +| 1 | Converged content directory structure (Gestalt+Tyre) | Architecture | **Propose** | +| 2 | District-specific facts split from global facts | Architecture | **Propose** | +| 3 | Mod overlay: ADD/REPLACE/MERGE + weight tagging | Architecture | **Propose** | +| 4 | District (not template) as atomic content pack | Architecture | **Propose** | +| 5 | PC-candidate NPC spec: 12 required + 6 optional + 6 PC-only fields | Content spec | **Propose** | +| 6 | Reverse knowledge (bidirectional) as mandatory PC upgrade field | Content spec | **Propose** | +| 7 | FRIEND pool architecture: v0.1 = 1 per character, system supports N | Content pipeline | **Propose** | +| 8 | Volume Escalation decision node for Triangle 1 | Content design | **Propose** | +| 9 | Two-layer routine format: YAML (engine) + prose (writers) | Style guide | **Propose** | +| 10 | 5 smuggler-specific entity attribute keys (Paula's proposal, endorsed) | Knowledge model | **Propose** | diff --git a/docs/workshops/wiki-review/round2-gore.md b/docs/workshops/wiki-review/round2-gore.md new file mode 100644 index 000000000..2ade8f194 --- /dev/null +++ b/docs/workshops/wiki-review/round2-gore.md @@ -0,0 +1,258 @@ +# Round 2 — Gore (Cross-Pollination) + +Four tensions to address. I'll take them in the order that builds on itself. + +--- + +## 1. The FRIEND Pool — Nigel Is Right, and the Minimum Is Non-Negotiable + +Nigel and I said the same thing in different words. I said "THE FRIEND can never be procedurally generated. Write a pool of FRIEND-eligible NPCs at Tier 1 depth. Randomize the *selection*, not the *content*." Nigel said "THE FRIEND is drawn from a pool. 2-3 FRIEND candidates per character at launch." + +We agree. The architecture should support pool-based FRIEND selection from day one. The question is: what's the minimum authoring depth for a FRIEND candidate? + +**The minimum is full Tier 1. No exceptions. No shortcuts.** + +Here's why I won't budge on this. The FRIEND arc works because of *authored specificity*: + +- Kael's "looks left when lying" works because the player has learned to recognize it across 15 minutes of casual interaction. You can't template a tell. It has to be *this* person doing *this* thing. +- Sera's three departures work because each excuse is different, each is plausible, and the third fires the detective's training. That's precision pacing. Three authored moments, each slightly escalating. +- The Phase 5 contaminated trust works because *specific* warm interactions from Phase 1 are retroactively reread. "There you are. Good — I was starting to worry" hits differently after Corridor B-7. Generalized warmth wouldn't hit at all. + +A FRIEND candidate at Tier 2 depth — working profile, 40-60 lines, abbreviated tells — would be a FRIEND the player doesn't care about enough to feel betrayed by. The contradiction would be a plot point instead of an emotional wound. The color shift from green to amber would be information instead of heartbreak. + +**The cost is real.** Each additional FRIEND candidate is ~70-100 authored lines. Two candidates per character doubles the investment. Three candidates triples it. This is the most expensive content per NPC in the game. + +**The budget strategy:** + +| Version | Smuggler FRIEND Pool | Detective FRIEND Pool | Total Tier 1 NPCs | +|---------|---------------------|----------------------|-------------------| +| v0.1 | 1 (Kael) | 1 (Sera) | 2 | +| v0.2 | 2 (Kael + new) | 2 (Sera + new) | 4 | +| v1.0 | 3-4 per district | 3-4 per district | 6-8 per district | + +v0.1 ships with pool size 1 per character. The *system* supports pool selection. The *content* scales incrementally. Each new district in v0.2+ adds its own FRIEND candidates. The architecture never changes. The pool grows. + +**What about Nigel's "who's compromised" shuffle — varying which NPCs fill conspiracy roles per seed?** This is excellent for Tier 2 NPCs (the compromised inspector, the wavering member, the courier). Role-slot randomization is exactly right for the investigation scaffolding. But THE FRIEND role is categorically different from a conspiracy role. A conspiracy role is *functional* — who does what in the operation. THE FRIEND role is *emotional* — who do you trust, who betrays that trust. Functional roles can be shuffled. Emotional roles must be authored. + +Nigel's three-column replayability table (Seed A/B/C) is the right vision. I'm saying: the FRIEND column requires Tier 1 investment per entry. Every other column can use Tier 2 role-slot assignment. + +--- + +## 2. Complicity, Culture, and Miri's Masterwork + +Miri's Krenn System regional brief is the best work product in this workshop. I'm saying this not because it's detailed — though it is — but because it *explains why the game works mechanically*. + +### The cultural immune system, made concrete + +In Round 1, I said cultural identity in this game is "the immune system of the community" and the detective is the foreign body. Miri's brief provides the biology: + +**Finnish-Estonian-Latvian reserve + working-class logistics culture + 180 years of station life = a community where minding your own business is the highest social virtue.** + +This isn't cultural decoration. This is the *mechanical substrate* that makes the ring viable and the detective's job hard: + +| Cultural Trait (Miri) | How It Protects the Ring | How It Obstructs the Detective | +|---|---|---| +| **Privacy as default** ("What you do off-shift is your business") | Nobody reports Torek's spending, Kael's late nights, Voss's schedule changes | NPCs won't volunteer personal information about other NPCs, even helpfully | +| **Labor solidarity** ("Workers cover for each other — a late arrival is clocked in on time") | The ring operates inside a pre-existing culture of mutual cover | The detective can't find allies willing to break solidarity norms | +| **First-name-primary social context** (institutional identity deemphasized) | Authority feels like an imposition, not a service | The detective will be "hard-named" (surname) for the entire v0.1 — a constant social marker of outsider status | +| **Earned trust through shared labor and time** ("No shortcut — no credential, no introduction") | New arrivals (Olin, the detective) are treated with polite distance that can last months | The detective cannot fast-track trust. Institutional credentials *reduce* trust. | +| **Greeting conventions** ("Greeting a stranger is slightly aggressive — it demands engagement") | Social norms prevent casual inquiry | The detective will misread Krenn reserve as hostility | +| **"Vakt" has been criminalized by usage** (Norwegian word for lookout, now ring operational slang) | The culture's own language has been co-opted by the criminal operation | Cultural substrate vocabulary creates insider/outsider speech markers | + +### Complicity isn't just individual — it's cultural + +Round 1, I argued the game's theme is complicity. Miri's brief reveals something deeper: **the complicity isn't just personal. It's structural.** + +Nobody in Sova Transit District *decided* to protect the ring. The culture did it for them. "Mind your own business" predates the ring by a century. "Workers cover for each other" is a labor solidarity norm, not a criminal conspiracy. "Don't ask about someone's finances" is a privacy value, not an obstruction of justice. + +The ring is a parasite on cultural virtues. That's what makes the moral calculus genuinely hard. The detective isn't just fighting criminals — they're fighting a community's *values*. Cracking the ring requires Krenn people to violate their own social norms: to volunteer information, to report a coworker, to cooperate with institutional authority, to use someone's surname in a context that signals betrayal. Every witness the detective turns is a person who has to *stop being Krenn* in the ways that matter. + +**This is the game's deepest thematic claim: the same values that make a community good — solidarity, privacy, trust, loyalty — are the values that enable its exploitation.** + +And the smuggler knows this. The smuggler doesn't exploit these values cynically. The smuggler IS these values. First-named, bar-regular, leib-eating, kolm-playing, "hüva"-saying, district-belonging. The smuggler's cover isn't a disguise. It's an identity. The smuggler IS Krenn. And Krenn, by being Krenn, protects the ring. + +### Mechanical expression + +How does this play? + +**Dialogue access tiers should encode cultural resistance.** Not just relationship-gated but culture-gated. Even a friendly NPC in Krenn culture doesn't discuss other people's business. The detective at `peer` access with Lera still can't get Lera to talk about Torek's spending — because in Krenn culture, talking about someone else's finances is hostile regardless of your relationship with the asker. The smuggler asking the same question gets a different response not because of trust level but because the smuggler is *from here* — the question lands differently in the cultural context. + +**Proposal:** Add a `cultural_gate` modifier to dialogue access. This isn't a new access tier — it's a modifier on existing tiers that reflects whether the asker is culturally inside or outside. The detective at `peer` with a cultural outsider modifier gets fewer disclosures than the smuggler at `peer` without it. Same access tier, different cultural context, different output. + +This is what I meant by "regional style guides must include social norms toward authority, privacy expectations, loyalty structures." Miri has now provided the content. What we need is the mechanical bridge: a system that reads these cultural norms and applies them to dialogue selection. + +--- + +## 3. The Smuggler Lens Gap — The More Central Experience + +Paula is right. The wiki is detective-shaped. The knowledge system tracks investigation: tells, contradictions, FactId progression, pattern recognition. The smuggler's equivalent — social navigation, operational management, moral reckoning — has no parallel mechanical vocabulary. + +But I want to push beyond Paula's diagnosis. She says the smuggler is "under-served." I'm saying the smuggler is the **more thematically central** experience, and its under-specification is the wiki's biggest gap. + +### Why the smuggler matters more + +If the game is about complicity, the detective *discovers* complicity. The smuggler *embodies* it. + +The detective's journey is: "Something is wrong here. I'll find out what." That's investigation. It has clear structure — observe, notice, follow, discover, confront. It maps to familiar game mechanics and to clear data structures. + +The smuggler's journey is: "I know what's wrong here. I'm part of it. What do I do now?" That's moral navigation. It has no familiar game mechanic analogue. There's no "evidence log" for guilt. There's no "clue board" for complicity. The smuggler's experience is relational, emotional, and fundamentally about *the cost of participation*. + +The detective asks: "Who did this?" +The smuggler asks: "What am I becoming?" + +That second question is harder to model, harder to author, and harder to play. It's also the question the game exists to ask. + +### Paula's attributes need reframing + +Paula proposes smuggler-specific attributes: `operational_reliability`, `exposure_risk`, `loyalty_assessment`, `leverage_held`, `social_debt`. These are good, but they're surveillance tools with different names — the smuggler assessing their network the way the detective assesses suspects. That frames the smuggler as an investigator of their own operation. Which is partly true. But it misses the emotional core. + +The smuggler's knowledge model should track not just *operational status* but *moral cost*. Here's what I'd add to Paula's list: + +| Attribute | What It Tracks | Example | Why It Matters Thematically | +|---|---|---|---| +| `moral_weight` | How much does this relationship/action cost the smuggler ethically? | Lying to Hael: `heavy`. Moving containers: `manageable`. | This is the contentment axis made granular. The accumulation of moral weight IS the smuggler's declining contentment. | +| `cover_integrity` | How well is the smuggler's mundane persona holding? | After Kael's contradiction: `compromised`. After a clean shift: `stable`. | The detective observes this as behavioral tells. The smuggler experiences it as stress. Same data, different lens. | +| `loyalty_conflict` | When two loyalties pull in opposite directions | Nils demands higher volume + Hael is worried = `acute`. Kael asks for help + ring security says no = `choosing`. | This is where the smuggler's decisions live. Every loyalty conflict is a fork. | + +And I'd rename Paula's `operational_reliability` to something that doesn't sound like a performance review. Maybe `trust_read` — the smuggler's gut assessment of whether someone will hold. That's more personal. That's how you think about colleagues you're risking prison with. + +### The "Is this enough?" framework for the smuggler + +In Round 1, I proposed adding a "Thematic Question" field to NPC profiles — each character's answer to "Is this enough?" The smuggler's answer structures their entire experience: + +**Game start:** "It's enough. The money's good, the work is manageable, Kael's reliable, the team is solid." + +**Mid-game:** "It's not enough. The guilt about Hael is corrosive. The escalation makes every shift feel riskier. Kael is acting strange. The detective is asking questions." + +**Late-game:** "Nothing is enough. I can't go back to ignorance. I can't stay where I am. I can only choose which compromise I can live with." + +That trajectory — from "enough" through "not enough" to "there is no enough" — IS the smuggler's arc. The detective has an investigation arc with phases. The smuggler has a moral arc with phases. Both need the same mechanical scaffolding (phased progression, monologue tone shifts, dialogue unlocks), but the content is fundamentally different. + +**What the smuggler needs that the detective already has:** + +1. **Moral arc phases** (parallel to investigation phases): Comfort → Doubt → Reckoning → Compromise. Each phase shifts monologue tone, dialogue options, and the smuggler's internal `moral_weight` accumulation. +2. **FactId parallels for moral knowledge**: The detective has `investigation.manifest_discrepancy` at Suspects → KnowsDetails. The smuggler needs `complicity.cost_to_hael` at `manageable` → `unsustainable` → `unbearable`. These aren't facts about the world — they're facts about what participation costs. +3. **Smuggler-specific monologue triggers**: The detective has `observe_anomaly` and `discover_evidence`. The smuggler needs `moral_pang` (triggered when lying to someone, helping move cargo, seeing Hael alone at the bar) and `loyalty_test` (triggered when two obligations conflict). + +Paula, Mellanie — this is the content gap that matters most. The smuggler experience won't feel like a real game until the moral navigation has the same mechanical depth as the investigation. + +--- + +## 4. Hael — Not Tier 1. Something New. + +Ozzie called Hael the best character. I called Hael the masterpiece. Both of us are right, and both of us are wrong about the solution. + +### Why Tier 1 is the wrong answer + +The Tier 1 template requires: contradiction arc (5 phases), tell progression (4+ tells), observable secret, `contradiction_flagged` attribute, confrontation paths, dual-lens notes with mechanical integration. Tier 1 is designed for NPCs who are *hiding something* — characters whose concealment creates the player's discovery arc. + +Hael isn't hiding anything. + +That's the point. That's what makes Hael devastating. In a district where *everyone* is concealing something — Kael's ring membership, Sera's unreported evidence, Voss's schedule manipulation, Lera's willful ignorance, Drin's gambling debt, Maret's private log — Hael is the one person who is exactly what they appear to be. A teacher. A partner. A person who is worried because the person they love is lying to them, and they can't figure out why. + +Giving Hael a secret would destroy the character. Making Hael a Tier 1 NPC with a contradiction arc would turn Hael into another puzzle to solve. And that would lose the thing that makes Hael work: **Hael is not a puzzle. Hael is a mirror.** + +### THE MIRROR — a new pattern + +I'm proposing a new character archetype alongside THE FRIEND. + +**THE FRIEND** is the character you trust who turns out to be hiding something. The discovery of their secret is the emotional centerpiece. + +**THE MIRROR** is the character who is exactly what they appear to be — and whose transparency reveals everyone else's dishonesty by contrast. THE MIRROR doesn't have a contradiction arc because there IS no contradiction. THE MIRROR's power is that every interaction with them becomes a test of the player's own integrity. + +When the smuggler talks to Hael: +- Hael says: "Kael was home at midnight again. Said it was overtime. There's no overtime posted this week — I checked." +- The smuggler knows the truth. The smuggler cannot say the truth. +- The player feels the weight of their own complicity. Not because Hael is manipulating them. Because Hael is *honest*, and honesty in a dishonest world is the most powerful force in the game. + +When the detective talks to Hael: +- Hael says: "Something's wrong. I don't know what. I just want Kael to talk to me." +- The detective sees a potential source. Hael's worry is actionable intelligence. +- The player feels the dissonance between professional utility and human empathy. Using Hael is effective and monstrous. + +THE MIRROR doesn't need: +- A contradiction arc (there's no contradiction to discover) +- A tell system (Hael's behavior is transparent — worry is visible, not concealed) +- A `contradiction_flagged` attribute (nothing to flag) + +THE MIRROR needs: +- **Tier 1 authored depth for emotional impact.** Full voice samples, full monologue impact on both characters, full relationship texture. Hael's dialogue must be as carefully crafted as Kael's or Sera's. +- **~50-70 authored lines.** Fewer than THE FRIEND (no confrontation paths, no post-contradiction phase) but substantially more than standard Tier 2 (need to carry the emotional weight across the full vertical slice). +- **Monologue impact at FRIEND density.** Both characters should have 10-15 monologue lines about Hael. The smuggler's monologue about Hael should be the most emotionally loaded content in the game. "Hael's alone again. Waiting for someone who isn't coming. I know where Kael is. I can't—" Cut off. One breath. Devastating. +- **No dual-lens confrontation paths.** Instead: dual-lens *guilt paths*. The smuggler's monologue when lying to Hael. The detective's monologue when using Hael as leverage. These aren't confrontation options — they're internal reckonings. +- **Presence as atmosphere.** Hael should appear at the bar regularly, consistently, predictably. Hael checking the door. Hael saving a seat for Kael. Hael talking to Sera about the kids. Hael existing as a reminder of what normal life looks like — the life the smuggler is endangering and the detective is disrupting. + +### THE MIRROR specification + +``` +Pattern: THE MIRROR +Purpose: Honest character whose transparency reveals others' dishonesty +Emotional function: Guilt amplifier (smuggler), empathy test (detective) +Template requirements: + - Full Core Identity block + - 7 of 10 axes (Want, Relationships, Routine, Information, + Contentment, Personality, Skills — NO Secret, NO Tolerance + threshold as breaking point, NO Tell system) + - Voice samples: 5 moods (worried, hopeful, tired, warm, confused) + - Monologue lines per character: 10-15 (FRIEND-level density) + - Dialogue lines: 30-40 authored (no generation expansion) + - No contradiction arc + - No `contradiction_flagged` attribute + - Dual-lens notes focused on guilt/empathy, not investigation +``` + +### Content depth comparison + +| | THE FRIEND (Tier 1) | THE MIRROR (new) | Standard Tier 2 | +|---|---|---|---| +| Total authored lines | 70-100 | 50-70 | 40-60 | +| Monologue per character | 10-15 | 10-15 | 5-8 | +| Contradiction arc | 5 phases | None | None | +| Tell system | 4+ tells | None | 2-3 tells | +| Secret | Deep + surface | None | Yes | +| Generation expansion | None (all authored) | None (all authored) | 4x | +| Emotional function | Trust → betrayal | Guilt amplification | Atmospheric / informational | + +Hael is the first MIRROR. The pattern is reusable: every district should have one character who is exactly what they seem. The honest person. The civilian. The one who gets hurt because everyone else is playing games. In a game about complicity, THE MIRROR is the character who shows you what complicity costs the people who didn't choose it. + +--- + +## Synthesis: What These Four Tensions Reveal + +The four questions the team lead asked me to address turn out to be one question wearing four masks: + +**What is the relationship between the game's mechanical systems and its emotional truth?** + +1. The FRIEND pool question is about whether emotional depth can be systematized. Answer: the system (pool selection) can be generalized. The content (authored lines, tells, contradiction beats) cannot. Emotion doesn't template. + +2. The cultural identity question is about whether setting can do mechanical work. Answer: yes — Miri's Krenn culture IS the difficulty gradient, IS the social camouflage, IS the reason the ring survives. Culture is a game system, not a paint job. + +3. The smuggler lens gap is about whether moral experience can be modeled with the same tools as investigation. Answer: partly. The tools exist (attributes, monologue triggers, phased arcs). But the *vocabulary* needs to shift from information-discovery to cost-accounting. The smuggler's knowledge graph isn't "what I've found out" — it's "what I've become." + +4. The Hael question is about whether emotional impact requires mechanical complexity. Answer: the opposite. Hael's power is simplicity. No secrets, no tells, no arc. Just a person being honest in a world full of liars. Sometimes the most powerful game mechanic is the absence of one. + +--- + +## Decisions I Recommend Recording + +| # | Decision | Type | Rationale | +|---|----------|------|-----------| +| 1 | **THE FRIEND pool architecture**: System supports pool-based FRIEND selection per seed. v0.1 ships with pool size 1 per character. Content expands in v0.2+. | Architecture | Replayability without sacrificing emotional depth | +| 2 | **FRIEND minimum depth: full Tier 1, no exceptions.** Every FRIEND candidate gets 70-100 authored lines, 5-phase arc, tell progression, dual-lens notes. | Content standard | The emotional payload requires authored specificity | +| 3 | **THE MIRROR pattern**: New NPC archetype — honest character with Tier 1 emotional depth but no contradiction arc, no secret, no tell system. Hael is the first MIRROR. | Design pattern | Fills a role the existing template system can't express | +| 4 | **Complicity as named theme**: The wiki index and design documents should explicitly name "complicity" as the game's thematic core, alongside "asymmetric information" as the mechanical core. | Thematic | Names what the game is about; anchors all content authoring | +| 5 | **Cultural gate modifier for dialogue access**: Regional culture modifies dialogue disclosure independently of relationship state. Krenn culture reduces disclosure to outsiders regardless of trust level. | Mechanic | Makes cultural identity mechanically load-bearing | +| 6 | **Smuggler moral arc vocabulary**: Add moral-weight attributes (`moral_weight`, `cover_integrity`, `loyalty_conflict`, `trust_read`) and smuggler-specific monologue triggers (`moral_pang`, `loyalty_test`) to the content spec. | Content spec | Gives the smuggler experience mechanical parity with the detective | +| 7 | **"Thematic Question" field in NPC profiles**: Each NPC's answer to "Is this enough?" — authoring guidance that connects every character to the game's philosophical spine. | Style guide | Ensures content authors write to the theme, not just the mechanics | + +--- + +## New Tickets I'd Recommend + +1. **Write THE MIRROR template** — formal pattern spec for honest-character NPCs (Hael as reference implementation) +2. **Elevate Hael to MIRROR depth** — expand from Tier 2 to MIRROR spec: 50-70 authored lines, 10-15 monologue lines per character, full voice samples +3. **Add smuggler moral arc to content spec** — define phases, monologue triggers, attribute vocabulary +4. **Add `cultural_gate` modifier to dialogue access design** — spec the mechanic with Gestalt and Tyre +5. **Add "Thematic Question" field to NPC style guide templates** — all tiers +6. **Add thematic framing section to wiki index.md** — name complicity as theme, frame "Is this enough?" as the question +7. **Write smuggler-perspective FactId progression text** — parallel to detective progression (Paula's proposal #12, endorsed) diff --git a/docs/workshops/wiki-review/round2-mellanie.md b/docs/workshops/wiki-review/round2-mellanie.md new file mode 100644 index 000000000..ed60c9cd3 --- /dev/null +++ b/docs/workshops/wiki-review/round2-mellanie.md @@ -0,0 +1,357 @@ +# Round 2 Response: Mellanie + +**Responding to:** Miri (cultural brief), Paula (tier templates), Gore (complicity + smuggler gap), Ozzie (gut-check line), Gestalt (mechanical constraints), Tyre (content directory), Nigel (mod authoring) + +--- + +## 1. Environmental Text — Concrete Examples Using Miri's Brief + +Miri delivered. The Krenn brief gives me everything I needed: substrate vocabulary, food names, greeting conventions, graffiti style, social register rules. I can write now. Here are worked examples for four environmental text types. + +### Bar Menu — The Last Shift + +``` +THE LAST SHIFT + +LEIB 2.40 +LEIB + KALAA 4.10 +SUPP (daily) 3.80 + +GRAIN SPIRIT 2.00 + double 3.50 +STATION ALE 2.80 +KUUM 1.60 + +--- +Card game: corner booth, 19:00 +Ask Sess. +``` + +**Authoring notes:** No descriptions. Krenn culture doesn't explain food — you know what supp is or you ask. Prices in small denominations (working-class bar, not a restaurant). Kuum is shift-end culture — the drink that says "I'm off the clock." The card game note is handwritten, informal, part of the furniture. The detective reads this menu and learns nothing. The smuggler reads it and sees home. + +**Monologue pairing:** +- Smuggler: *"Same menu. Lera hasn't changed the prices in a year. The supp's better than it has any right to be."* +- Detective: *"Standard bar menu. Local staples, no imports. Working-class operation. The prices tell me more about this district than the Commission briefing did."* + +--- + +### Safety Notice — Logistics Hub + +``` +LATTICE REGULATION NOTICE +Sova Transit District — Lattice Commission + +Unauthorized lattice modification is a Category 3 violation. +Penalties include fines, lattice restriction, and referral +to Commission review. + +Report concerns: Commission Kiosk, Level 3. + +Reg. LC-2041-Sova | Posted per Concordat Standard §14.7 +``` + +Small. Regulatory-standard formatting. Corner of a wall by the entrance, partially obscured by a freight schedule pinned over it. Nobody reads it. The fact that it's half-covered IS the cultural detail — Krenn compliance with Commission regulation is perfunctory, not enthusiastic. + +**Monologue pairing:** +- Smuggler: *"Still there. Nobody's read that notice since they posted it. Probably not even Sera."* +- Detective: *"Lattice regulation notice. Standard posting. The freight schedule pinned over half of it tells me how seriously this district takes Commission authority."* + +--- + +### News Ticker Headlines — Meridian Feed (One Cycle) + +``` +GATE TRAFFIC UP 3% — FREIGHT BACKLOG CLEARING AFTER VAEL DELAY +ASSEMBLY FLOOR: LATTICE FUNDING AMENDMENT REACHES COMMITTEE +STATION SOVA: VENTILATION UPGRADE SCHEDULE (LEVEL 3 AFFECTED) +KOLM LEAGUE: SOVA DOCKERS 4, ORBITAL TRANSIT 2 +GRAIN FUTURES STABLE — SYNDIC SHIPPING COSTS FLAT FOR Q3 +KRENN PRIME SURFACE: HARVEST SEASON OPENS, EXPORT WINDOWS CONFIRMED +COMMISSION ADVISORY: LATTICE CALIBRATION DUE DATES FOR SOVA DISTRICT +``` + +Seven headlines per cycle. Mix of Reach-wide politics (assembly amendment), local infrastructure (ventilation), sports (kolm league — Miri's card game adapted to competitive format), economic data (grain futures, freight), and institutional noise (Commission advisory). The editorial voice is local-paper pragmatic: how does this affect my shift? + +**Monologue pairing (on ASSEMBLY headline):** +- Smuggler: *"Lattice funding amendment. Great. More regulation nobody asked for."* +- Detective: *"Lattice funding in committee. If that passes, the Commission gets expanded inspection authority. That could change everything here."* + +Same headline. One sees bureaucratic noise. The other sees a potential tool. + +--- + +### Graffiti — Corridor B-7 + +``` +[Near service hatch, maintenance marker:] + DK 04.12 — checked + +[Scratched into wall panel, old:] + kylm + +[Small sticker, geometric folk-pattern, fading:] + (no text) + +[Pencil, recent:] + vakt 22:30 + +[Scratched, older:] + perk this schedule +``` + +Sparse. Functional. Krenn graffiti isn't art — it's communication. `DK 04.12 — checked` is a maintenance worker's mark (initials + date). `kylm` is someone complaining the ventilation is broken again — heritage word used reflexively. The folk-pattern sticker is heritage expression, dying out but present. `vakt 22:30` is operational — a lookout time, ring-adjacent, written where only people who use the corridor would see it. `perk this schedule` is universal dock-worker frustration. + +**Monologue pairing:** +- Smuggler: *"Vakt at twenty-two thirty. Someone's running tonight. Not our schedule."* +- Detective: *"'Vakt 22:30.' Handwritten. Recent. That's not a maintenance note. Filing it."* + +The smuggler reads operational shorthand. The detective reads evidence. Same four words. + +--- + +## 2. Style Guide Structure — Merging Paula's Templates with My Conventions + +Paula proposed formal tier templates (structural spec for Tier 1/2/3 profiles). I proposed 8 authoring conventions (workflow rules for content production). These aren't competing — they're complementary. Paula's templates say WHAT a profile contains. My conventions say HOW to write the content that fills it. + +### Proposed Combined Style Guide — Table of Contents + +``` +# The Settled Reach — Content Style Guide + +## Part 1: Wiki Structure + 1.1 Tier Templates (Paula) + - Tier 1 template (FRIEND / production-level) + - Tier 2 template (working profile) + - Tier 3 template (sketch) + - Per-tier validation checklist (Gestalt) + 1.2 Naming Conventions + - Location shortcode table (Mellanie) + - NPC full-name requirement (Paula) + - Phonological rules cross-ref → regional brief + +## Part 2: Content Authoring Rules + 2.1 Tag Taxonomy Reference (D-035 summary) + 2.2 Authoring Workflow + - Mirror-first drafting (Mellanie) + - Prerequisite-before-text (Mellanie) + - One-breath rule (Mellanie) + 2.3 Voice Discipline + - Character voice cards (Mellanie — see Section 3 below) + - Dual-lens checklist (Mellanie) + - Dual-lens note format: one sentence per character, imperative + - Gut-check line requirement (Ozzie — see Section 4 below) + 2.4 Controlled Vocabularies + - Situation overlap rules (Mellanie) + - Mood exclusivity: simultaneous states, not alternatives (Mellanie) + - Freeform tag vocabulary — living list (Mellanie) + 2.5 Mechanical Constraints (Gestalt) + - Hard requirements table (routine location slugs, faction values, etc.) + - Tell-to-behavior_flags mapping requirement + - Prerequisite validation against FactId catalog + +## Part 3: Regional Culture + 3.1 Regional Style Guide Template (Miri) + 3.2 Krenn System Brief (Miri) — cross-ref to wiki/cultural-groups/ + 3.3 Environmental Text Type Catalog (Mellanie) + +## Part 4: Content Pipeline + 4.1 Wiki → YAML mapping (Tyre) + 4.2 File naming: lines/ directory shortnames (Tyre + Mellanie alignment) + 4.3 Schema validation (Tyre) + 4.4 Mod content requirements (Nigel + Tyre) +``` + +**Key merge decision:** Paula's templates are the skeleton. Gestalt's mechanical constraints are the hard rules bolted onto that skeleton. My authoring conventions are the muscle — the workflow that produces content meeting both structural and mechanical requirements. The regional brief is the skin — cultural flavor that makes content feel situated. + +**On Tyre's location shortname question:** Use the wiki slugs, not my monologue-guide shorthand. `the-terminal`, `the-last-shift`, `maintenance-corridors` in the `lines/` directory. These are stable, unambiguous, and match the wiki. My guide used `terminal`, `bar`, `corridor` as authoring shorthand for line IDs — that's a per-line convention, not a directory convention. The ID prefix stays short (`terminal_m_001`), the directory name stays explicit. + +--- + +## 3. Smuggler Voice — Closing the Gap + +Paula and Gore both identified this: the detective has a clear mechanical and emotional vocabulary (analytical, pattern-recognition, institutional). The smuggler's voice is under-specified. + +Here's the difference, stated plainly: + +**The detective ANALYZES.** Short, precise observations. Categorizes people by role. Notices deviations from pattern. Professional vocabulary — "behavioral inconsistency," "filing it," "noted." Sentences are clipped, controlled, trained. The detective thinks in data. + +**The smuggler READS ROOMS.** Notices who's comfortable, who's tense, who shouldn't be here. Thinks in relationships, not categories. Vocabulary is personal — first names, shared history, emotional register. Sentences have rhythm, not structure. The smuggler thinks in people. + +The detective sees a logistics hub. The smuggler sees the place where Kael works and Voss stresses and Resha is still learning the ropes. + +### Three Paired Examples — Same Observation, Two Voices + +**Trigger: enter_location (The Terminal, shift start)** + +```yaml +# Smuggler +- id: terminal_m_040 + character: smuggler + trigger: enter_location + text: "Kylm today. Ventilation's acting up again. Voss'll be in a mood." + mood: [comfortable] + situation: [arrival, shift_start] + +# Detective +- id: terminal_m_041 + character: detective + trigger: enter_location + text: "Logistics hub. Twelve workers on the floor, one supervisor in the glass office. Standard morning configuration." + mood: [analytical] + situation: [arrival, shift_start] +``` + +Smuggler uses Krenn substrate vocabulary (`kylm`), predicts a specific person's mood from an environmental cue, speaks in fragments. Detective counts heads and categorizes spatial layout. Same room. Different languages. + +--- + +**Trigger: observe_npc (Torek at the bar, spending visibly)** + +```yaml +# Smuggler +- id: bar_m_040 + character: smuggler + trigger: observe_npc + text: "Torek's buying rounds again. New jacket, too. He's ticking." + mood: [concerned] + topic: [money] + prerequisite: + relationship_state: Known + subject: torek_lintar + +# Detective +- id: bar_m_041 + character: detective + trigger: observe_npc + text: "Lintar. Third round he's purchased tonight. That jacket is new — tagged brand, not station-market. Income doesn't match spending." + mood: [analytical] + topic: [money] + prerequisite: + relationship_state: Known + subject: torek_lintar +``` + +Smuggler uses the Krenn slang: `ticking` (drawing institutional attention). One word carries the whole cultural norm — don't be visible. It's not analysis, it's instinct. Concern, not curiosity. The smuggler cares because Torek's visibility endangers the community. + +Detective uses the surname (`Lintar`), counts drinks, identifies the brand tag, and runs the math. Income vs. expenditure. Clinical. The detective doesn't care about Torek — the detective cares about the anomaly. + +--- + +**Trigger: witness_interaction (Lera redirecting a conversation near a stranger)** + +```yaml +# Smuggler +- id: bar_m_050 + character: smuggler + trigger: witness_interaction + text: "Lera just steered Renn off that story. Good. Olin's two tables away." + mood: [relieved] + topic: [danger] + prerequisite: + fact: contraband.ring_exists + confidence: KnowsDetails + +# Detective +- id: bar_m_051 + character: detective + trigger: witness_interaction + text: "The bartender interrupted that conversation. Smooth — changed the subject before the dock worker finished his sentence. Why?" + mood: [suspicious] + topic: [routine] + prerequisite: null +``` + +Smuggler knows exactly what happened: Lera is protecting the community. The smuggler reads INTENT because they share the context. Relief — the system works. + +Detective sees the same behavior and asks the question. No names (the detective hasn't identified Renn yet), uses role descriptors ("the bartender," "the dock worker"). The detective reads PATTERN because they don't have context yet. Suspicion — something is being managed here. + +### Voice Card Summary + +| | Smuggler | Detective | +|---|---|---| +| **Thinks in** | People, relationships, risk | Data, patterns, anomalies | +| **Names NPCs** | First name, always | Surname or role descriptor until relationship forms | +| **Sentence style** | Fragments. Rhythmic. Breath-length. | Complete. Clipped. Controlled. | +| **Emotional register** | Fond, worried, protective, guilty | Analytical, suspicious, conflicted, clinical | +| **Cultural markers** | Uses Krenn substrate (kylm, perk, ticking, hüva) | Uses institutional vocabulary (filing, noted, behavioral inconsistency) | +| **Default mood** | Comfortable (pre-contradiction), concerned (post) | Analytical (pre-contradiction), conflicted (post) | +| **What they notice first** | Who's here, who's missing, who's tense | What's out of pattern, what doesn't add up | +| **Heritage language** | Fluent in Krenn slang — it's their first language | Doesn't use it — institutional outsider | + +--- + +## 4. The Gut-Check Line — Operationalizing Ozzie's Rule + +Ozzie proposed: *"Every NPC needs a moment that makes the player feel something."* And: voice samples must *"make you pause when read aloud."* He's right. Renn, Tav, Drin — they follow the template and have no soul. The template produces correct profiles. It doesn't produce characters. + +### Do I support this as a formal style guide rule? + +Yes. With modifications. + +### How to operationalize it + +**Rule: Every NPC profile at Tier 2 or above must include one "anchor line" in its voice sample — a line that, read aloud without context, makes the listener feel something specific.** + +The test isn't "is this line good writing?" The test is: **if someone who's never seen this game reads this line, can they tell you what the character is feeling?** + +Kael's anchor: *"I'm fine, Hael. Just work stuff. Long shifts, you know how it is. Don't worry about me."* +- What you feel: guilt. The lie is small and practiced and terrible. + +Sera's anchor: *"You look tired. How are the kids doing with the new curriculum? No — sit. Let me get us something."* +- What you feel: tenderness. Real care, from someone who's carrying something they can't share. + +Lera's anchor: *"I serve drinks. People talk. I don't take notes."* +- What you feel: a wall going up. Polite, firm, absolute. + +Now try Renn: *"South corridor's clear. Kosse was through twenty minutes ago."* +- What you feel: nothing. That's a status report. + +**The fix for Renn isn't a better voice sample. It's finding the moment where Renn is human.** Renn is young, wants to prove himself, and is expendable and knows it. The anchor line should come from THAT: + +*"Devra said 'good work' yesterday. First time anyone's said that to me on this station."* + +Now you feel something. A kid who's lonely and dangerous and one compliment away from doing anything Devra asks. THAT'S the anchor. + +### Tier-specific application + +| Tier | Anchor requirement | +|------|-------------------| +| Tier 1 | 2+ anchor lines across different phases of the contradiction arc. The warmth anchor AND the betrayal anchor. | +| Tier 2 | 1 anchor line minimum. Must reveal internal state, not external function. | +| Tier 3 | No formal anchor required, but the voice hint should gesture at a human being, not a function. Sess's *"What'll it be?"* works because the minimalism IS the character. Tav's *"Clear. South corridor, no movement"* doesn't work because it's surveillance output. | + +### The practical test + +When reviewing a profile, read the voice samples aloud. If you can replace the character's name with "NPC #7" and the line doesn't lose anything, it's not an anchor. Anchors are lines that could only come from THIS person, in THIS situation, feeling THIS way. + +Put this in the style guide as a review checkpoint, not a writing rule. You can't mandate feeling. But you can mandate that someone checks for it before a profile ships. + +--- + +## 5. Quick Responses to Other Round 1 Points + +**Gore's "complicity" frame:** Fully endorse. The smuggler's monologue voice is inherently complicit — they know what's happening, they participate, and they care about the people involved. This is why the smuggler thinks in people and relationships, not patterns. You don't analyze things you're part of. You worry about them. + +**Gore's "Thematic Question" proposal:** Support it as an authoring-only field. When I write Kael's monologue, knowing his answer to "Is this enough?" is "It was, until Hael's worry became unbearable" gives me his emotional center. The line practically writes itself from there. + +**Paula's smuggler-specific attributes:** Need them. My monologue lines for the smuggler currently gate on detective-shaped prerequisites (FactIds, RelationshipState). The smuggler needs `operational_reliability`, `exposure_risk`, `loyalty_assessment` as prerequisite-eligible attributes. Without them, smuggler monologue can't react to ring-internal dynamics with the same precision the detective monologue reacts to investigation dynamics. + +**Gestalt's routine-as-YAML proposal:** Strongly support. When I write monologue lines gated on `situation: [shift_transition]`, I need to know exactly when that window opens. Prose routines are ambiguous. YAML routines are authorable-against. + +**Nigel's pool_eligible for mods:** Confirm from the content side — tagged pools handle role-assigned dialogue naturally. If a modded NPC fills a `bar_regular` role slot, they draw from the same `access`, `trust`, `situation` filters as any bar regular. The tag system was designed for this. No special handling needed. + +**Tyre's hot-reload for line pools:** Yes. Please. Iterating on monologue lines without restarting the game is the single most important authoring workflow feature. If I can save a YAML file and hear the new line on the next trigger, content velocity doubles. + +--- + +## Summary of Proposals (Round 2) + +| # | Proposal | Status | +|---|----------|--------| +| 1 | Four environmental text types with concrete Krenn-voiced examples | Delivered above — bar menu, safety notice, news ticker, graffiti | +| 2 | Combined style guide structure (Paula templates + my conventions + Gestalt constraints + Miri regional) | Proposed TOC above | +| 3 | Smuggler voice card with paired examples showing dual-lens cultural register | Delivered above — three pairs + summary table | +| 4 | Anchor line requirement per tier (operationalizing Ozzie's gut-check rule) | Proposed with tier-specific application + practical test | +| 5 | Location shortname alignment: directory = wiki slug, line ID prefix = short form | Resolves Tyre's open question | +| 6 | Endorse Paula's smuggler-specific attributes as blocking for smuggler monologue authoring | Dependency flag | +| 7 | Endorse Gore's Thematic Question as authoring-only field in NPC templates | Authoring aid, not mechanical | diff --git a/docs/workshops/wiki-review/round2-miri.md b/docs/workshops/wiki-review/round2-miri.md new file mode 100644 index 000000000..7b26dc374 --- /dev/null +++ b/docs/workshops/wiki-review/round2-miri.md @@ -0,0 +1,404 @@ +# Workshop Round 2 — Miri (Worldbuilder / Setting Designer) + +**Cross-pollination responses.** I've read all Round 1 files. + +--- + +## 1. Full Canonical Names for All NPCs + +Paula is right: single-name NPCs metagame as "less important." Every NPC in the Krenn System has a full canonical name. The game surfaces them in lattice queries, manifests, posted schedules, and Commission records. Social contexts use first names only — the full name is canonical data, not social data. + +### Naming principles applied + +From the Round 1 Krenn brief: +- **First names:** 1-2 syllables, consonant-forward, vowels toward a/e/o +- **Surnames:** 2 syllables, endings from the heritage pool: -an, -en, -ik, -ar, -ev, -mm, -sk, -ur, -ak +- **Dutch/Norwegian-origin surnames** (Voss, Nils, Sabel) survived closer to source — slightly "higher status" feel +- **Blended surnames** (Davan, Lintar) emerged post-settlement — no single Earth origin + +### Full name proposals + +| Current | Proposed Full Name | Notes | +|---------|-------------------|-------| +| **Kael Davan** | *(unchanged)* | Established. Davan is a blended post-settlement surname. | +| **Sera Venn** | *(unchanged)* | Established. Venn is Dutch-origin, fits Commission context. | +| **Voss** | **Arvo Voss** | "Arvo" is Estonian/Finnish-origin (meaning "value"). Voss is the surname — consistent with "Supervisor Voss" using title+surname. Workers know his first name; they just don't use it. When the detective runs a lattice query: "Voss, A. — Shift Supervisor, Sova Logistics Consortium." | +| **Lera Sessik** | *(unchanged)* | Established. Sessik retains Estonian -sik suffix. | +| **Torek Lintar** | *(unchanged)* | Established. Lintar is Latvian-influenced. | +| **Devra** | **Devra Talsen** | "Talsen" — Latvian-influenced (from Talsi). Ring coordinator with a name that suggests roots in the system's earlier settlement wave. | +| **Maret Korr** | *(unchanged)* | Established. Korr is Finnish-origin (from Korhonen). | +| **Resha** | **Resha Neven** | "Neven" — blended surname, softer than most Krenn names. Fits a new hire who hasn't been compressed by the culture yet. | +| **Hael** | **See Section 2 below — rename proposed.** | | +| **Harek** | **Harek Valde** | "Valde" — from Latvian "Valdis." Fits an ex-security person. Slightly formal sound. | +| **Renn** | **Renn Harsk** | "Harsk" — short, sharp. Fits a courier. The detective's lattice query: "Harsk, R. — Logistics Associate, Sova Consortium." | +| **Pell** | **Pell Torssen** | "Torssen" — fossilized patronymic (Norwegian-origin). A name that sounds slightly old-fashioned, fitting for someone whose family has been on Krenn for generations. Pell's wavering loyalty reads differently if you know his family has deep roots. | +| **Drin** | **Drin Rosta** | "Rosta" — from the founding-era naming pool. Maintenance tech with an old Krenn name. | +| **Sess** | **Sess Kolvur** | "Kolvur" — mixed-heritage, Estonian "kol-" + drift suffix. The bartender with the longest surname in the room — and nobody ever uses it. | +| **Olin** | **Olin Tavren** | "Tavren" — deliberately longer and slightly off-pattern for Krenn. This is a tell: Olin's surname doesn't fit local convention as cleanly as the others. It could signal off-system origin, or it could be a family name from Krenn Prime rather than the station-culture pool. The ambiguity is load-bearing for Olin's ambiguous newcomer status. | +| **Sabel** | **Sabel Hersk** | "Hersk" — Norwegian-influenced, short. Off-station fence with a name that sounds Krenn-adjacent but could belong to any of three connected systems. | +| **Tav** | **Tav Merik** | "Merik" — Estonian-influenced. The youngest ring member with a perfectly ordinary Krenn name. Nothing about his name draws attention. That's the point — Tav is invisible by design. | +| **Nils Davan** | *(already established, off-stage)* | Shares surname with Kael (siblings). | + +### Where full names surface in gameplay + +Paula asked about preventing the name-as-tier signal. Here's how full names appear naturally for lower-tier NPCs: + +- **Manifest processing screens** in The Terminal show worker names in "Surname, Initial" format. The detective's lattice overlay cross-references these automatically. Every dock worker who processes cargo has their name on a screen: "Harsk, R." "Merik, T." "Rosta, D." +- **Posted shift schedules** on the board near Voss's office use full names: "0600-1400: Davan K., Harsk R., Merik T., Neven R., Korr M." +- **Lera's tab board** behind the bar (hand-lettered, Lera's handwriting) lists regulars by first name only — but the detective's lattice can cross-reference first names to full names from the station registry. +- **Commission kiosk queries** (if the detective accesses them) return full names with employment records. + +This means: the detective sees full names as institutional data from the start. The smuggler knows full names through lived experience (shift rosters, bar tabs, the way Voss reads names off the morning briefing). Full names are in the world. The player encounters them naturally regardless of NPC tier. + +--- + +## 2. The Kael/Hael Collision + +Paula is right to flag this. Let me analyze it as a setting question, not just a readability question. + +### The worldbuilding argument against the collision + +In a **first-name-primary culture** where surnames are rarely spoken, phonetic distinctness in first names is a social necessity. People in the same social circle whose names are one phoneme apart would naturally acquire differentiating nicknames. In 800-person Sova Transit District where everyone knows everyone, you wouldn't have a "Kael" and a "Hael" in the same household without one of them being called something else by everyone they know. + +This is especially true for a couple. In Nordic-Baltic cultures (our heritage pool), diminutives and endearments differentiate — but in a first-name-primary culture where the social name IS the identity, having two near-identical names in the most emotionally loaded relationship in the game creates confusion that the culture wouldn't tolerate. + +### The readability argument against the collision + +Kael is THE FRIEND for the smuggler. Hael is the emotional fulcrum (Gore's assessment — correct). These two characters will appear in the same monologue lines, the same dialogue scenes, the same internal thoughts. "Kael came home late. Hael was worried." In fast reading, especially in a game UI with monologue text appearing on screen for a few seconds, "Kael" and "Hael" will blur. + +### Recommendation: rename Hael + +**Proposed new name: Naia.** + +- **Phonetics:** Two syllables, open vowels, clearly distinct from "Kael." No confusion possible. +- **Heritage:** Finnish/Estonian-origin (from Naima/Naia). Fits Krenn phonetic patterns — open, consonant-light, slightly softer than most Krenn names. This softness is appropriate: Naia is a teacher, not a dock worker. The name carries a different register than the hard-consonant logistics names around it, which subtly signals Naia's position as a civilian in a working-class district. Not out of place — just from a slightly different layer of Krenn culture. +- **Full name: Naia Tamm.** "Tamm" — Estonian-origin (tamm = oak). Short, solid, grounding. +- **Setting justification:** Naia is a teacher at the station school. Teachers tend to come from the residential population rather than the logistics workforce. Residential Krenn names draw more from the Finnish/Estonian pool and less from the compressed dock-worker style. This is a subtle generational and class distinction that enriches the setting without being remarked upon. + +**What changes:** +- Every reference to "Hael" in the wiki becomes "Naia" +- Triangle 4 (Worried Partner) becomes: Naia - Kael - Sera +- Kael's profile: "partner Naia" throughout +- Sera's profile: "friend Naia" in the avoidance dynamic +- The emotional core is unchanged: Naia is the person the conspiracy hurts. The name is different. Everything else holds. + +**Severity: cosmetic.** No mechanical, structural, or thematic changes. The rename is a one-time find-and-replace across ~8 wiki files. + +--- + +## 3. Environmental Text Examples in Krenn Register + +Mellanie needs concrete examples to write against. Here are four, with cultural reasoning. + +### 3a. Bar Menu at Lera's + +Hand-lettered on a board behind the bar. Lera's handwriting — clear but not elegant. Prices in credits. No descriptions — regulars know what everything is. New arrivals ask. + +``` +LERA'S + +DRINKS + Grain spirit 4 + Grain spirit (double) 7 + Station ale 5 + Import ale 12 + Kuum 3 + Synth coffee 2 + +FOOD + Supp (today: kalaa) 8 + Leib + spread 4 + Protein plate 6 + Lera's plate 10 + +NO TABS OVER 50. YOU KNOW WHO YOU ARE. +``` + +**Cultural notes:** +- Heritage food words (supp, kalaa, leib) used without translation. If you don't know what supp is, you're new. Ask Sess. +- "Kuum" is the spiced warm drink — cheaper than alcohol, associated with shift transitions. Ordering kuum signals "I just got off work and I'm deciding whether to stay." +- "Lera's plate" is the daily special. Nobody asks what it is. It's whatever Lera made. Ordering it is a trust signal — you trust the cook. +- Import ale is 2.4x the price of station ale. This makes it a visible status purchase. When Torek buys import ales for the table, people notice. That price differential IS the financial tell. +- "NO TABS OVER 50" — Lera's voice. Direct, no-nonsense, with a needle aimed at specific regulars. This line tells you more about the bar's social contract than any description could. +- No ingredient lists, no allergen warnings, no Meridian-linked nutritional data. This is a Krenn establishment. You eat what's served. + +### 3b. Safety Notice (Hub Wall, Near Scanner Bays) + +Standard Commission-issued notice. Institutional formatting. Posted on the wall, corners peeling. Nobody reads it. + +``` +LATTICE COMMISSION — REGULATORY NOTICE +Station Sova | Sova Transit Logistics Hub + +UNAUTHORIZED NEURAL LATTICE MODIFICATION +Category 3 Violation | Enforcement Code LC-2217-C3 + +Possession, installation, or distribution of non-certified +lattice components is subject to: + - Component seizure and destruction + - Lattice restriction (up to Tier reduction) + - Fine: 2,000-15,000 credits + - Referral to system-level enforcement + +Report suspected violations to the Commission kiosk (Level 3) +or via Meridian channel LC-COMPLIANCE-KRENN. + + Lattice Commission | Protecting Neural Integrity +``` + +**Cultural notes:** +- Institutional language. Concordat Standard. No Krenn vernacular on Commission documents. +- The penalty range (2,000-15,000 credits) means a Category 3 fine could wipe out 10 months of a dock worker's margin income. This is not abstract — every worker who reads this (and they have) knows exactly what it means for someone earning 2,400/month with 200 margin. The fine is designed to be ruinous. That's the point. That's why the ring exists. +- "Report suspected violations" — this line is doing heavy thematic lifting. In Krenn culture, reporting is a violation of the mind-your-business norm. The Commission asks workers to do something their culture considers hostile. The notice has been up for years. Nobody has ever used channel LC-COMPLIANCE-KRENN from this district. +- The notice is posted next to the shift schedule. Workers see it every day. It's wallpaper. The detective sees it and thinks "compliance infrastructure." The smuggler sees through it — it's the cost-of-doing-business calculation made literal. +- The tag line — "Protecting Neural Integrity" — is Commission branding. Workers have opinions about this phrase. None of them are positive. + +### 3c. News Ticker Headline (Bar, Above the Counter) + +Meridian feed display. Text-scrolling format. Mix of Reach-wide and local. Updated continuously. The bar's ambient information stream. + +``` +FREIGHT INDEX: KRENN CORRIDOR +0.3% | TAVROS LINK STEADY | SOVA THROUGHPUT 94% + +ASSEMBLY SESSION 447: FRONTIER AUTONOMY MOTION TABLED AGAIN — "NOT THE TIME" SAYS CHAIR PELLAM + +STATION ADVISORY: VENTILATION MAINTENANCE SECTOR 3 SCHEDULE EXTENDED. COMPLETION NOW EST. CYCLE 18 + +KRENN PRIME SURFACE: STORM WARNING NORTH LATITUDE BAND — DEPOT OPERATIONS NORMAL + +SPORT: ORBITAL 3 TAKES SOVA LEAGUE FINAL 4-2. MATCH REPLAY AVAILABLE MERIDIAN-SPORT-KRENN + +COMMISSION: QUARTERLY COMPLIANCE REVIEW SCHEDULE POSTED. NEXT SOVA INSPECTION: CYCLE 22 +``` + +**Cultural notes:** +- **Freight index first.** This is a logistics station. Commodity prices and throughput percentages are the headlines that matter. Workers check this the way Earth people check weather. +- **Assembly news is dismissive.** "TABLED AGAIN" — the editorial voice says "they debated, nothing happened, why are we reporting this." This is the local filter: Assembly news is irrelevant to shift workers. The tone is resigned indifference. +- **Ventilation complaint.** The local complaint (from the Sova Transit District brief) surfaces in the news ticker. "SCHEDULE EXTENDED" — it was supposed to be fixed by Cycle 15. It's now Cycle 12-something and the estimate just moved to 18. Workers have opinions. This is the universal safe topic — if someone's talking about ventilation, they're NOT talking about something else. +- **Sport.** Local orbital platform league. "Orbital 3" is a manufacturing platform in the system. Workers follow this. Card games at Lera's correlate with match results. This is social fabric. +- **Commission inspection schedule.** The most loaded headline on the ticker. "CYCLE 22" — the ring knows this date. They've already started planning the operational window. Every ring member reads this headline and makes a calculation. Every non-ring worker reads it and thinks "more paperwork." The same six words, two completely different readings. This IS the dual-lens in environmental text. + +### 3d. Graffiti (Maintenance Corridor, Near B-7 Junction) + +Sparse. Functional. Layers of age. Not artistic — operational and human. + +``` +[Maintenance marker, faded, ~30 years old:] + V-JUNCTION 12.4m → + VENT ACCESS ↑ + — K.T. 2193 + +[More recent, black marker, scrawled:] + still kylm in sector 3 + +[Small, precise, near the dead drop alcove — ring mark:] + ◇ + +[Scratched into metal with a tool, old:] + Talvik promised us quarters by '98 + still waiting + — 2207 + +[Recent, different hand:] + the floor debates. we breathe recycled air. +``` + +**Cultural notes:** +- **Maintenance markers** are the oldest layer. "K.T. 2193" — a worker's initials and the year. These are navigational. They're also the only record that someone named K.T. was here 30 years ago. The corridor remembers. +- **"still kylm in sector 3"** — heritage substrate word in casual complaint. Nobody writing this was making a cultural statement. They were cold and annoyed. The word survived because it's what you say when you're cold. +- **The diamond mark (◇)** — a ring symbol. Meaningless to anyone who doesn't know. The detective, if they map the marks to the dead drop locations, can build a pattern. The smuggler walks past it without thinking. It's like a doorbell — functional, invisible to anyone who isn't looking for it. +- **"Talvik promised us quarters by '98"** — heritage corporate reference. Talvik Logistics (founding Syndic, absorbed ~120 years ago) apparently promised worker housing that never materialized. The complaint is 19 years old. The bitterness persists. This is Krenn heritage showing through: not in celebration, but in grievance. The workers remember what they were promised. +- **"the floor debates. we breathe recycled air."** — "the floor" is local slang for the Assembly (from my Round 1 brief). This is political expression in its most compressed Krenn form: two facts, placed side by side, the juxtaposition doing all the work. No argument. No demand. Just: they talk, we breathe. Draw your own conclusion. + +--- + +## 4. Cultural Immune System — Nordic-Baltic Heritage as Mechanical Resistance + +Gore's Round 1 insight is exactly right: the mind-your-business ethos IS the ring's security model. Let me ground this in the heritage and map it to the access tier system. + +### Heritage roots of the Krenn privacy norm + +The Nordic-Baltic founding cluster brought three converging cultural traits: + +1. **Finnish *sisu*** — a concept roughly meaning "stoic determination" or "grim endurance." In Krenn drift, this became the expectation that you handle your problems without involving others. Asking for help is not weak, but burdening others with your business is rude. + +2. **Estonian *maarahvas* identity** — literally "land people," the historical Estonian self-concept of being practical, quiet, self-reliant rural folk. On a station, this became: you work, you go home, you don't make noise. The contrast with institutional authority (historically Russian/German overlords for Estonians) maps directly onto the Krenn attitude toward the Commission — a distant authority that doesn't understand local life. + +3. **Scandinavian *janteloven*** — the "law of Jante," the social norm against standing out or claiming superiority. In Krenn drift, this became: visible wealth is suspicious, self-promotion is distasteful, and the worst thing you can do is act like you're better than your neighbors. This is why Torek's spending is a social violation before it's a criminal tell — he's breaking *janteloven* by being visibly affluent. + +These three currents merged over 180 years into the Krenn norm: **privacy is the default, solidarity is assumed, and authority is external.** Nobody codified it. It's how people raise their children. It's what "being from here" means. + +### How this maps to dialogue access tiers (D-028 Layer 1) + +Gore is right that this isn't flavor — it's mechanical. Here's the mapping: + +| Access Tier | Cultural Interpretation in Krenn | Who Gets It | Examples | +|-------------|--------------------------------|-------------|---------| +| **public** | What you'd say to anyone in earshot. Safe topics. Weather (ventilation), work complaints, sport results. | Everyone, including the detective from day one. | "The ventilation in Sector 3 is still broken." / "Did you see the match last night?" | +| **peer** | What you'd say to someone you work with. Shift gossip, mild complaints about Voss, opinions about food. NOT anything about income, relationships, or the ring. | Workers who share shift time. The smuggler from day one. The detective only after weeks of consistent, non-threatening presence. | "Voss is on one today." / "Maret's been quiet. Hope she's alright." | +| **insider** | What you'd say to someone you trust with your business. Income sources, relationship troubles, complaints about the Commission that might be actionable, knowledge about the grey economy. | Ring members, long-term friends, family. The smuggler for ring NPCs. The detective *never* for ring NPCs unless they flip someone. | "Quiet credit's been steady this month." / "Naia asked me about Kael again. I didn't know what to say." | +| **authority** | What you'd say to someone with institutional power, because you have to. Formal answers, minimal disclosure, technically true but maximally unhelpful. | The detective, from day one. Commission representatives. Station security when they ask questions. | "I process manifests. I follow the schedule. I don't have anything to report." | +| **hostile** | What you'd say when trust has been violated — when the detective pushed too hard, when someone betrayed a confidence, when the cultural contract broke. | Anyone who crossed a line. The detective if they pressure the wrong NPC. Ring members toward Pell if his wavering becomes known. | "You should leave now." / "I don't know you. I never knew you." | + +### The detective's progression challenge + +In Krenn culture, the detective's Commission credentials guarantee **authority** access — which is the *least useful* tier for investigation. NPCs in authority mode answer questions technically and volunteer nothing. The cultural norm actively works against institutional investigation. + +To get **peer** access, the detective must: +- Be consistently present (same bar, same shift transitions, same routines) +- Not push (asking direct questions about other people is rude; the detective must learn to listen, not interrogate) +- Demonstrate that they are a person, not just a role (use first name, order from the menu, comment on the ventilation) +- Wait. In Krenn culture, trust accrues with time, not gestures. + +To get **insider** access, the detective would need: +- Someone to vouch for them (Sera might, for specific NPCs — but Sera is hiding things, so her vouching is compromised) +- To demonstrate shared risk (protecting someone's secret builds trust faster than any credential) +- To have been here long enough that the community forgets they're Commission + +The detective's investigation timeline doesn't allow for natural trust-building. This is the mechanical expression of Gore's "cultural immune system": **the culture's privacy default makes the detective's job structurally harder, not because people are hostile but because cooperation requires breaking a social norm that everyone shares.** + +### The smuggler's embedded advantage + +The smuggler starts at **peer** minimum for all Hub and Bar NPCs, and **insider** for ring members. This isn't a status effect — it's the natural result of having lived here, worked here, and earned trust the Krenn way: through shared labor and shared time. + +The smuggler's challenge is maintaining these tiers. If the investigation pressures the community, NPCs might withdraw from **peer** to **public** even with the smuggler — not because they distrust the smuggler, but because the cultural response to external threat is to close ranks and share less with everyone. "Kylm in Sector 3" conversations increase. Real talk decreases. The smuggler feels the chill. + +### Addition to the regional style guide template + +Per Gore's Round 1 proposal, the regional style guide template needs a **Section 5c: Access Tier Cultural Profile** that maps the region's social norms to the five access tiers. This should be a required section because it's mechanically load-bearing — dialogue selection depends on it. + +I'll amend the template: + +``` +## 5c. Access Tier Cultural Profile + +Map the region's social norms to the five dialogue access tiers: + +- **public**: What topics are safe for anyone? What's the "weather talk" here? +- **peer**: What does it take to reach peer status? Time? Shared work? Introduction? + How long before a newcomer is treated as a peer? What topics unlock? +- **insider**: What earns insider trust? What does an insider know that a peer doesn't? + Is insider status revocable? +- **authority**: How does the culture treat institutional representatives? + Cooperative but unhelpful? Hostile? Deferential? What's the cultural attitude + toward being questioned by authority? +- **hostile**: What triggers hostile access? What cultural lines must be crossed? + Is hostility expressed through confrontation or withdrawal? +``` + +--- + +## 5. Wiki Structure — Where the Krenn Brief Lives + +**Confirmed: `wiki/cultural-groups/krenn-system.md`.** + +Per D-040, `wiki/cultural-groups/` is the designated home for regional style guides. The directory exists in the taxonomy but is currently empty. + +**Proposed file structure:** + +``` +wiki/ + cultural-groups/ + _template.md # The regional style guide template (Part A from my Round 1) + krenn-system.md # The Krenn System brief (Part B from my Round 1, updated per Round 2) +``` + +**YAML frontmatter for `krenn-system.md`:** + +```yaml +--- +canonical_id: krenn-system.culture +type: cultural-group +region: krenn-system +status: canonical +created: 2026-02-12 +updated: 2026-02-12 +cross_references: + - krenn-system.star-system + - sova.station + - sova-transit.district +--- +``` + +**Index update:** `wiki/index.md` should add a Cultural Groups section between Factions and NPCs: + +```markdown +### Cultural Groups (Regional Style Guides) +- [Krenn System](cultural-groups/krenn-system.md) — Nordic-Baltic heritage, 180 years settled +``` + +When v0.2 adds systems, new briefs follow the template and slot into this directory. The pattern is established. + +--- + +## Cross-Responses to Other Round 1 Contributions + +### To Gore (complicity as theme) + +Your framing of complicity is excellent and it enriches the cultural analysis. The Krenn mind-your-business norm isn't just a social habit — it's complicity infrastructure. "Not asking" is a form of participation. Every resident who doesn't report Torek's spending, doesn't question Voss's schedule changes, doesn't follow Kael to Corridor B-7 — they're all making a choice. The culture makes that choice feel like the default, like not-choosing, like minding your own business. But it IS a choice. And the detective's arrival forces the community to see it as one. + +Your "Thematic Question" proposal ("Is this enough?") should be connected to the regional brief. In Krenn culture, the answer to "Is this enough?" is shaped by the *janteloven* drift: wanting more is suspect. Being satisfied with what you have is the cultural expectation. But the economic squeeze (200 credit margin) means satisfaction is a lie — or a performance. The cultural norm says "this is enough." The bank account says otherwise. That tension between cultural contentment and economic reality is the soil the ring grows in. + +### To Ozzie (environmental texture as wow factor) + +Your instinct about texture over naming conventions is exactly right. The names establish phonetic identity. The food, the slang, the complaints, the graffiti — that's what makes Krenn feel *lived in*. The environmental text examples above are my direct answer to your Round 1 ask: "What do people eat? What's the local slang? What do they complain about?" + +The "Talvik promised us quarters by '98 / still waiting" graffiti is the kind of detail that rewards the player who reads walls. The smuggler walks past it — it's part of the background. The detective who reads it and queries "Talvik" in the Meridian learns about the founding Syndic, the economic history, and why workers here have a long memory for broken promises. That's environmental storytelling through cultural specificity. + +### To Paula (naming alignment) + +Full names provided above. The naming phonological rules from my Round 1 brief are now validated against all 17 NPCs. Everything fits. The one drift I want to note: Olin Tavren's slightly off-pattern surname is deliberate. If Olin is from off-system (or pretending to be), a name that doesn't quite fit local convention is itself a clue. The detective's pattern recognition should flag this, eventually. + +I've also provided the heritage basis for each surname so content authors can generate new Krenn names by following the same roots. When we need NPC #18 or #25 or #100, the rules are documented. + +### To Mellanie (environmental text unblocked) + +The four examples above (menu, safety notice, ticker, graffiti) should give you enough cultural register to begin writing the full environmental text catalog. Key reference points from the Krenn brief you'll use most: + +- **Substrate vocabulary** (Round 1, Section 3b): supp, kalaa, leib, kuum, perk, kylm, hüva, selge, käik, laev +- **Slang** (Round 1, Section 3b): shift-end, gate-side, wall-side, ticking, quiet credit, hard name +- **Profanity**: perk (emphatic), gate-rot (bullshit) +- **Sign register**: Krenn official = terse/functional. Informal (Lera's) = hand-lettered, personality. Commission = institutional, formal, ignored. +- **Food and drink**: grain spirit, station ale, import ale, kuum, supp, kalaa, leib, protein plate + +If you need more vocabulary or specific cultural references for a particular text type, ask — I can extend the brief for any domain. + +### To Tyre (wiki taxonomy alignment) + +Your "filesystem is navigation, not identity" principle aligns with my `canonical_id` proposal. I'm not suggesting we change Tyre's directory structure — his `locations/{system}/{slug}.md` is correct. The `canonical_id` lives in YAML frontmatter, not in the path. Tyre's Rule 1 (max 2 levels) holds. + +One addition: the content directory should include `content/global/regions/krenn-system.yaml` (per Gestalt's proposed structure). This is the machine-readable version of the cultural brief — naming phonological rules as generation parameters, substrate vocabulary as tagged word pools, access tier cultural profile as dialogue selection weights. + +### To Gestalt (routine axis + cultural constraints) + +Your observation that routine is the most mechanically overloaded axis connects directly to the cultural brief. In Krenn culture, routine IS identity. Deviation from routine is the primary tell — not because Krenn people are rigid, but because the culture values predictability as a form of social contract. "Kael is always at the dock by 0600" is both a schedule entry and a trust statement. When Kael starts arriving late, the routine deviation is visible not just mechanically but socially — everyone notices because the culture expects consistency. + +This means: the routine axis for Krenn NPCs should reflect higher regularity than NPCs from cultures with more flexible social expectations. A future system settled by a more individualistic cultural cluster might have NPCs with looser routines, making deviation detection harder. The cultural brief informs the mechanical parameters. + +--- + +## Summary of Round 2 Proposals + +| # | Proposal | Status | Depends On | +|---|----------|--------|------------| +| 1 | Full canonical names for all 17 NPCs (table above) | Ready for decision | None | +| 2 | Rename Hael → Naia Tamm (phonetic collision fix) | Ready for decision | Requires find-replace in ~8 wiki files | +| 3 | Four environmental text examples (menu, notice, ticker, graffiti) | Delivered | Unblocks Mellanie | +| 4 | Access tier cultural profile as required section in regional style guide | Ready for decision | Amendment to Round 1 template | +| 5 | Cultural brief location: `wiki/cultural-groups/krenn-system.md` | Confirmed | Index update needed | +| 6 | Olin Tavren's off-pattern surname as deliberate ambiguity signal | Setting note | Accepted or rejected with name table | + +### New tickets for SI (if proposals adopted): + +- Apply full canonical names to all NPC wiki pages (find-replace per name table) +- Rename Hael → Naia across all wiki files (if approved) +- Create `wiki/cultural-groups/krenn-system.md` from Round 1 + Round 2 content +- Create `wiki/cultural-groups/_template.md` from Round 1 template + Round 2 Section 5c addition +- Add Cultural Groups section to `wiki/index.md` +- Create environmental text examples file: `wiki/authoring/environmental-text-examples.md` + +--- + +**Status:** Round 2 response complete. +**Author:** Miri +**Date:** 2026-02-12 diff --git a/docs/workshops/wiki-review/round2-nigel.md b/docs/workshops/wiki-review/round2-nigel.md new file mode 100644 index 000000000..79ab4b866 --- /dev/null +++ b/docs/workshops/wiki-review/round2-nigel.md @@ -0,0 +1,339 @@ +# Round 2 — Nigel (Sandbox & Replayability) + +## Cross-Pollination Synthesis + +I've read everyone's Round 1. Here's what I'm seeing: there's more convergence than the tension framing suggests. Let me work through the four assigned tensions, then flag some connections nobody else has made. + +--- + +## Tension 1: FRIEND Pool Depth — How Many, At What Cost, When? + +### Gore and I agree. Let me make that explicit. + +Gore said: "THE FRIEND cannot be procedurally generated." I never said generate. I said **draw from a pool of fully authored candidates**. Gore then said: "Write 4-6 FRIEND-eligible NPCs at full Tier 1 depth per district. The randomizer selects which one is THE FRIEND for this playthrough. The content is authored; the *selection* is procedural." + +That's exactly my proposal. We're in violent agreement. The question isn't whether, it's how many and when. + +### The authoring cost, honestly + +Gestalt mapped the bidirectional knowledge requirement. Paula mapped the PC upgrade fields. Let me put real numbers on what a FRIEND candidate costs: + +| Component | Lines/Effort | Notes | +|-----------|-------------|-------| +| Full 10-axis profile | 2 wiki pages | Same as Kael/Sera | +| Authored dialogue | 25-35 lines | No generation expansion | +| Trust-gated dialogue | 15-20 lines | Tier 1 depth | +| Unprompted lines | 5-8 lines | | +| Monologue (per PC) | 10-15 lines | x2 characters = 20-30 | +| Tell observation lines | 5-8 lines | | +| Contradiction discovery | 3-5 lines | | +| PC-FRIEND relationship stubs | 1-2 paragraphs per PC | Bidirectional — Paula's "reversed dual-lens" | +| **Total per FRIEND candidate** | **~70-100 authored lines + 2 pages prose** | **No shortcuts** | + +That's serious. Each additional FRIEND candidate is roughly equal to building another Kael or Sera from scratch. And Gore is right — you can't cut corners. The tell progression, the contradiction arc, the five phases, the retroactive contamination of warmth — all of it requires Tier 1 authored depth. + +### My revised proposal: phased rollout + +**v0.1: 1 FRIEND per character (2 total).** Kael for smuggler, Sera for detective. Ship what we have. The architecture supports pool selection, but the pool has exactly one entry per character. This is fine for the vertical slice — nobody replays a 30-minute demo five times. + +**v0.2: 2 FRIENDs per character (4 total).** Add one new FRIEND candidate per PC archetype. Now the randomizer draws from {Kael, NewFriend1} for the smuggler and {Sera, NewFriend2} for the detective. Four possible FRIEND pairings. The second playthrough IS genuinely different. + +**v0.3+: 3 FRIENDs per character (6 total).** Nine possible FRIEND pairings. Metagaming effectively impossible. Two players comparing notes will have had different FRIENDs. + +### What the architecture needs NOW (even for v0.1's single-entry pool) + +This is the part I want to fight for. Even if v0.1 ships with Kael-only and Sera-only, the content files should be structured AS IF they're pool entries: + +```yaml +# content/districts/sova-transit/friends/pool.yaml +smuggler_friends: + - npc_id: kael-davan + contradiction_type: spatial_deviation # B-7 meeting + tell_type: behavioral # looks left when lying + discovery_method: single_observation # one dramatic moment + +detective_friends: + - npc_id: sera-venn + contradiction_type: avoidance_pattern # leaves when Torek arrives + tell_type: behavioral # topic deflection + overcompensation + discovery_method: cumulative_pattern # three observations +``` + +When v0.2 adds a second FRIEND, it adds a second entry. No restructuring. The randomizer reads the pool. The content was always pool-shaped. Cost of this structural decision: near zero. Value: enormous later. + +### The anti-metagaming constraint that matters + +Gore's insight about dramatic irony is crucial here. The FRIEND pool doesn't just prevent "I know Kael's tell" metagaming. It creates the second-playthrough experience Gore described: "Kael is just a dock worker. You know his secret from last time, but your character doesn't." + +If Kael is always THE FRIEND, this irony is interesting once. If Kael is sometimes THE FRIEND and sometimes just a colleague, the irony is DIFFERENT each time. One playthrough: "I know Kael's secret and he's my FRIEND." Next playthrough: "I know Kael's secret but my FRIEND is Renn and Kael is just... there. Nervous. And I can't do anything about it." + +That's not metagaming prevention. That's a whole new emotional texture that the pool structure creates for free. + +--- + +## Tension 2: Content Architecture Convergence + +### Adopting Tyre's framework, extending it with pool semantics + +I'm dropping my parallel mod manifest format. Tyre's three-layer stack with ADD/REPLACE/MERGE is the right architecture. My `mod.yaml` was reinventing what Tyre already solved more cleanly. Let me map my replayability requirements onto Tyre's structure. + +### How pool-based randomization fits into Tyre's directory structure + +Tyre's structure: +``` +content/ + districts/ + sova-transit/ + npcs/ + kael-davan.yaml + templates/ + logistics-hub.yaml # Social site: roles, NPC assignments +``` + +My extension: the template file declares **role slots** that the randomizer fills from the NPC pool: + +```yaml +# content/districts/sova-transit/templates/bar.yaml +template_id: bar +roles: + - slot: owner + assigned: lera-sessik # Fixed — Lera IS the bar + pool_eligible: false + + - slot: regular + count: 2-4 # Randomizer picks 2-4 regulars per seed + pool: # NPCs eligible for this slot + - torek-lintar + - harek + - olin + pool_eligible: true # Modders can add NPCs to this pool + + - slot: bartender + assigned: sess # Fixed for v0.1 + pool_eligible: false + + - slot: friend_detective # THE FRIEND slot (detective's) + pool: + - sera-venn # Only one candidate in v0.1 + pool_eligible: true # v0.2 adds more +``` + +This maps cleanly onto Tyre's overlay operations: +- **ADD**: A mod drops a new NPC YAML into `npcs/` and adds the NPC's ID to a role slot's `pool` list. Tyre's MERGE on the template file concatenates the pool arrays. +- **REPLACE**: A mod replaces an NPC's YAML entirely (Tyre's entity-REPLACE). +- **MERGE**: A mod adds dialogue lines to the pool (Tyre's line-pool MERGE). The randomizer selects which NPCs are active, and only active NPCs' lines enter the runtime pool. + +### Gestalt's global/_districts split is compatible + +Gestalt proposed `_global/` for schema/factions/technology and `districts/` for local content. Tyre proposed `global/` and `districts/`. Same structure, different underscore convention. I don't care about the underscore — pick one and ship it. The important thing for replayability: + +**Global content is NOT randomized.** Factions, technology, FactId definitions — these are fixed vocabulary. The randomizer operates on district-level content: which NPCs fill which role slots, which FRIEND is selected, which NPC is compromised. + +**District content IS the randomization surface.** The template role-slot system I described above lives entirely within `districts/`. A mod that adds a new district is adding a new randomization domain. A mod that adds NPCs to an existing district is expanding the pool. + +### My concrete ask for Tyre + +One thing Tyre's structure doesn't yet include: **a seed configuration file** that the randomizer produces at game-start. Something like: + +```yaml +# runtime/seed-state.yaml (generated, not shipped) +seed: 847291 +district: sova-transit +assignments: + friend_smuggler: kael-davan + friend_detective: sera-venn + compromised_inspector: drin + wavering_member: pell + bar_regulars: [torek-lintar, harek, olin] + contraband_primary: lattice-components + contraband_secondary: medical-grade + torek_ring_connected: true # Gestalt's T3 randomization flag +``` + +This is the record of what the randomizer decided. It's saved with the game state. It's what makes two players' games different. Tyre doesn't need to design the randomizer — but the content architecture needs a place for this output to live. + +--- + +## Tension 3: Contraband Shuffle — Does It Break Cultural Coherence? + +### I'm walking this back. Partially. + +Gore is right that the game is about complicity, and the specific contraband type is load-bearing for the moral texture. Miri's Krenn brief is beautiful and culturally specific — the Commission regulation of lattice components isn't arbitrary, it's locally embedded. "The Commission regulates lattice tech" → "people can't afford upgrades" → "the ring exists because the system fails" → "pragmatic Krenn culture doesn't moralize about how needs get met." That chain only works for lattice components. + +If I shuffle the primary contraband to severance tech, the cultural logic breaks. "The ring is smuggling counter-surveillance equipment" doesn't connect to "affordable healthcare" or "the system failed working people." Severance tech is political, not economic. It changes the ring from "healthcare providers" to "political resistance" — and that's a different game in a different setting. + +### Revised proposal: fix primary, vary secondary + +**Primary contraband is fixed per district.** Sova Transit District smuggles lattice components. Period. That's culturally grounded, morally load-bearing, and tied to the specific Commission-regulation dynamics of Krenn System. It's what makes the detective's job morally ambiguous. It's what makes the smuggler's justification honest. Gore's complicity thesis depends on this. + +**Secondary contraband varies per seed.** What ELSE is in the crates? + +| Secondary | Moral Shift | Gameplay Shift | Cultural Fit | +|-----------|-------------|---------------|--------------| +| Medical-grade replacements (seed A) | Amplifies sympathy — "they're saving lives" | Detective feels worse about busting the ring | High — same Commission regulation, different end-users | +| Severance tech (seed B) | Adds political dimension — "this is bigger than Sova" | Detective realizes the ring connects to something larger | Medium — political, not economic, but still anti-institutional | +| Enhanced capability mods (seed C) | Adds luxury dimension — "some of this IS just vanity" | Detective finds moral clarity easier; smuggler justification weakens | High — same supply chain, different market segment | +| Nothing extra (seed D) | Pure lattice components | Clean moral frame, no complications | Maximum — baseline experience | + +The secondary contraband doesn't change the ring's identity or the cultural logic. It adds a WRINKLE. "We're smuggling lattice components for people who need them. ...And also some stuff I don't ask about." The smuggler's relationship with the secondary cargo is itself a moral question: do you look? Do you ask Devra what's in the sealed containers? + +This preserves Gore's complicity thesis while adding per-seed texture. The detective who discovers severance tech in the crates has a different "oh no" moment than the one who discovers medical-grade replacements. But both are investigating the same ring, in the same culturally grounded setting, with the same NPC relationships. + +### What this means for the fact catalog + +Paula flagged that FactIds are currently discovery-shaped (Suspects → KnowsDetails). The secondary contraband needs its own FactId per type, gated behind the primary: + +```yaml +contraband.secondary_cargo: + Suspects: "Some of these containers don't match the usual profile." + KnowsOf: "There's more than lattice components moving through here." + KnowsDetails: # varies by seed: + # medical-grade: "Medical-grade replacements. For people whose lattices are degrading." + # severance: "Severance equipment. Counter-surveillance. Someone upstream is political." + # enhanced: "Enhanced capability mods. Not medical. Luxury market." +``` + +The FactId exists globally. The KnowsDetails text is selected by the seed configuration. This fits Tyre's content pipeline — the fact definition is in `global/knowledge/facts.yaml`, the seed-specific text variant is runtime data, not content. + +--- + +## Tension 4: PC-as-NPC Scope — v0.1 or v0.2? + +### Two different things called "PC-as-NPC" + +I've been conflating two concepts. Let me separate them. + +**Concept A: The other PC exists as an NPC in your playthrough.** +When you play the smuggler, the detective is an NPC in the world. When you play the detective, the smuggler is an NPC. This is what Ozzie described: "Someone ELSE reacts to you like they already know you." Kael says "There you are" because the smuggler PC has a pre-existing life. + +**Concept B: PC identity is drawn from a randomizable pool.** +Instead of always being "the same smuggler," you could be a DIFFERENT dock worker each playthrough. Different name, different relationships, different starting knowledge. + +### Concept A is v0.1. Concept B is v0.2+. + +**Concept A (v0.1):** The smuggler and detective each need an NPC-format brief (Paula's proposal #7). When you play the smuggler, the detective NPC follows their routine — arrives at the bar, talks to Sera, asks questions. The smuggler can observe this. When you play the detective, the smuggler NPC works their shifts, runs ring operations, hangs out with Kael. + +This is low additional authoring cost because both PCs already have most of what's needed: +- The smuggler's routine is defined by their ring membership and dock work +- The detective's routine is defined by their investigation pattern and bar visits +- Both characters' relationship stubs exist in the NPC profiles that reference them + +What's MISSING (and what we need to author for v0.1): +1. **NPC-mode behavior scripts** for both PCs: what do they do when no player controls them? 5-7 routine entries each. +2. **Reverse dual-lens notes**: how does each NPC see the smuggler NPC? How does each NPC see the detective NPC? Paula's "reversed dual-lens" — these are the SAME data inverted from the NPC profiles, but they need to be compiled explicitly. +3. **Observation monologue** for when the player notices the other PC-as-NPC: 3-5 lines per character. "Commission. Has to be. Why are they here?" (smuggler seeing detective NPC). "Dock worker. Efficient, unremarkable." (detective seeing smuggler NPC). + +That's maybe 20-30 authored items total. Manageable. + +**Why it matters for v0.1:** Ozzie's "ultimate payoff" depends on this. The player finishes the smuggler path, starts the detective path, and sees the smuggler NPC working the docks. "That was ME." The second-playthrough wow moment IS the PC-as-NPC. Without it, the second playthrough is just "different dialogue." With it, the second playthrough is "I'm watching my previous character from the outside and they don't know what I know." + +**Concept B (v0.2+):** PC identity randomization requires multiple PC-viable NPCs per archetype, each with full relationship stubs against all other NPCs. The combinatorial authoring cost is real (Gestalt mapped it). Each new PC candidate needs: +- Full NPC brief +- Relationship stubs with every FRIEND candidate (bidirectional) +- Starting knowledge inventory +- Orientation monologue pool +- Reverse dual-lens from every NPC who knows them + +For 2 PC candidates per archetype x 2 FRIEND candidates per archetype, that's 4 PCs needing relationship stubs against 4 FRIENDs = 16 authored relationship pairs. Not impossible, but not v0.1. + +### Recommendation summary + +| Concept | Scope | Cost | Payoff | +|---------|-------|------|--------| +| Other PC exists as NPC (Concept A) | **v0.1** | ~20-30 authored items | Second playthrough wow moment | +| PC identity randomization (Concept B) | **v0.2+** | 16+ relationship pairs per district | True replay variety in PC identity | +| FRIEND pool (1 per character) | **v0.1** | 0 additional (Kael + Sera exist) | Architecture supports future expansion | +| FRIEND pool (2 per character) | **v0.2** | ~140-200 authored lines + 4 pages | Metagaming defeated, FRIEND surprise | +| FRIEND pool (3 per character) | **v0.3+** | ~140-200 more lines + 4 pages | Comparison test passes | + +--- + +## Connections Nobody Else Made + +### 1. Gestalt's T3 randomization + my network shuffle = the same system + +Gestalt proposed making Torek's ring connection randomizable per seed. I proposed shuffling WHO is compromised (Drin vs. Resha vs. Maret). These are the same mechanism: a per-seed flag on NPCs that determines their entanglement status. + +We should generalize this into a **district entanglement map** in the seed configuration: + +```yaml +entanglement_overrides: + torek-lintar: + ring_connected: true # seed A: Torek is ring + # ring_connected: false # seed B: Torek is mundane + drin: + compromised: true # seed A: Drin has gambling debt + # compromised: false # seed B: Drin is clean + resha: + compromised: false # seed A: Resha is just new + # compromised: true # seed B: Resha is being blackmailed +``` + +This is the "network shuffle" I proposed, but expressed as Gestalt's per-seed flag system. Same mechanism, same content files, different instantiation per seed. The detective can't memorize "Drin is always compromised" because Drin isn't always compromised. + +The D-029 entanglement ratio (30/50/20 flat/mundane/entangled) constrains the randomizer: no seed can make everyone entangled or everyone clean. The ratio must hold within its variance band. + +### 2. Miri's cultural brief + my replay variation = cultural tells vary too + +Miri's Krenn brief gives us "perk" (Finnish curse), "kylm" (cold), "vakt" (lookout shift — criminalized by usage). Beautiful. Now consider: what if heritage vocabulary usage is ITSELF a randomizable social tell? + +In seed A, Drin uses "vakt" casually — it's just a word for shift, nobody reacts. In seed B, the word "vakt" has been heat-mapped by Devra as ring-specific slang, and anyone who uses it in front of the detective gets a nervous correction from Renn. The same word has different social charge per seed. + +I'm NOT proposing we randomize Miri's language work. I'm saying: the cultural substrate she built has replayability potential that's free to exploit. Different seeds can give different social weight to the same cultural markers. The detective who learns "vakt means they're involved" in seed A can't use that knowledge in seed B where "vakt" is just normal speech. + +### 3. Paula's smuggler-specific attributes + my network shuffle = smuggler replayability + +Paula identified the biggest content gap: the smuggler's mechanical vocabulary is underdeveloped compared to the detective's. Her proposed attributes (`operational_reliability`, `exposure_risk`, `loyalty_assessment`, `leverage_held`, `social_debt`) are exactly what the network shuffle needs. + +If WHO is compromised varies per seed, then the smuggler's `exposure_risk` assessment of each NPC ALSO varies per seed. In seed A, the smuggler's knowledge includes `{drin: {exposure_risk: "critical", leverage_held: "gambling_debt"}}`. In seed B, Drin is clean and the smuggler knows `{drin: {exposure_risk: "low", leverage_held: "none"}}` — but Resha has the entry instead. + +Paula's smuggler attributes aren't just content parity. They're the **data model for what varies per seed in the smuggler's playthrough**. The detective's investigation varies because evidence is in different places. The smuggler's experience varies because the risk map is different. Same mechanism, different character lens. + +### 4. Mellanie's environmental text + seed variation = the news ticker gut-punch scales + +Mellanie cataloged ~65-90 environmental text items. Most of these are fixed per district (signs, menus, safety notices). But the news ticker (15-20 headlines per cycle) is the perfect seed-variation surface. + +The news ticker is already identified as wow moment #5 (D-039): "Same ticker, opposite monologue reactions per character." Now extend that across seeds: different seeds surface different ticker headlines, which trigger different monologue reactions, which create different "oh" moments. + +Seed A ticker: "Commission announces expanded lattice certification program." Smuggler monologue: "Expanded certification. More hoops. More people priced out." Detective monologue: "Good. Tighter regulation means fewer off-market mods." + +Seed B ticker: "Medical-grade lattice shortage reported in outer Reach systems." Smuggler monologue: "Shortage. That's why the price is up. That's why we move what we move." Detective monologue: "Supply disruption. Watch for increased black market activity." + +Same game system. Different ticker seed. Different emotional texture. And it costs Mellanie almost nothing — she writes a pool of 40-50 ticker headlines, the randomizer selects 15-20 per seed, the monologue reactions are already per-character. + +--- + +## Summary: What I'm Asking For + +### Decisions to record + +1. **FRIEND pool architecture adopted now, populated incrementally.** v0.1 = 1 per character, v0.2 = 2, v0.3 = 3. Content files are pool-shaped from day one. +2. **Primary contraband fixed per district, secondary varies per seed.** Lattice components are always the core of Sova's ring. Secondary cargo (medical/severance/enhanced/none) varies. +3. **PC-as-NPC Concept A (other PC as NPC) is v0.1 scope.** Requires ~20-30 authored items. PC identity randomization (Concept B) is v0.2+. +4. **District entanglement map** as part of seed configuration. Per-seed flags on NPCs determine ring connection, compromise status, and role assignments. D-029 ratio constrains. +5. **Adopt Tyre's content architecture** (three-layer stack, ADD/REPLACE/MERGE) with template role-slot extension for pool-based randomization. + +### New tickets for SI + +1. Create `friends/pool.yaml` structure in content directory (even if single-entry for v0.1) +2. Create NPC-format briefs for both PCs (smuggler + detective) — Concept A, v0.1 scope +3. Write observation monologue for PC seeing other-PC-as-NPC (3-5 lines per character) +4. Define seed configuration schema (what the randomizer produces at game-start) +5. Add `pool_eligible` and `pool` fields to template schema +6. Define entanglement override schema for per-seed NPC flags +7. Write secondary contraband variant text for `contraband.secondary_cargo` FactId (3 variants) +8. Add news ticker headline pool (40-50 entries) to Mellanie's environmental text scope + +### Style guide additions + +1. Template role-slot definitions should be part of every social site spec +2. FRIEND-eligible NPCs need a `friend_metadata` section in their profile: contradiction type, tell type, discovery method +3. PC-upgradable NPCs need the fields Paula specified: starting EntityKnowledge, starting FactId inventory, access tier map, reverse dual-lens + +--- + +**The test hasn't changed.** Two friends play the game. They compare notes. They played different games. Not because we randomized everything into mush — but because we randomized the RIGHT things (FRIEND identity, NPC roles, secondary contraband, evidence locations) while keeping the authored emotional core (Tier 1 FRIEND arcs, primary contraband, cultural substrate, triangle structures) rock-solid. + +Gore's complicity thesis holds across all seeds. Ozzie's wow moments fire in every configuration. Miri's cultural substrate grounds every variation. And the second playthrough — EVERY second playthrough — surprises you. + +That's not a feature request. That's the game. diff --git a/docs/workshops/wiki-review/round2-ozzie.md b/docs/workshops/wiki-review/round2-ozzie.md new file mode 100644 index 000000000..5eddbcc08 --- /dev/null +++ b/docs/workshops/wiki-review/round2-ozzie.md @@ -0,0 +1,219 @@ +# Round 2 — Ozzie (Player Experience / Wow Factor) + +## Response to Round 1 Proposals — Cross-Pollination + +I've read everyone's Round 1. Gore nailed it. Miri delivered. Paula was brutally honest in the right places. Let me respond to the four tensions I was asked about, then react to the stuff that got me excited or worried. + +--- + +## Tension 1: Should Hael Be Tier 1? + +### The gut answer + +No. And I need to explain why, because Gore and I both called Hael the masterpiece. Hael IS the emotional center of the game. But that's BECAUSE Hael is Tier 2. + +### The argument + +Hael's power comes from being the person things happen TO, not the person who ACTS. Hael sits in the bar. Hael waits for Kael. Hael confides in Sera. Hael checks the door. Hael is the emotional gravity well — everyone orbits Hael because everyone is trying to protect or exploit Hael. + +If you promote Hael to Tier 1, you need a contradiction arc. Five phases. A deep secret. 70-100 authored lines. A tell system with mechanical flags. And what would Hael's contradiction BE? "Hael secretly knows about the ring"? That destroys the innocence that makes Hael devastating. "Hael is planning to leave Kael"? That shifts the emotional weight from the player's guilt to Hael's agency — and the player's guilt is the GAME. + +Hael works because Hael is *simple* in a world of complicated people. The teacher who just wants their partner to come home. That simplicity is what makes everyone else's complexity feel heavy. If you give Hael layers, you dilute the contrast. + +### What Hael DOES need + +**More screen time within Tier 2.** Paula flagged that Tier 2 depth varies — Hael is on the thin end. Fix that. Specifically: + +1. **More voice samples.** Hael has 3 (worried, warm, brittle). Give Hael 5. Add: + - **Hopeful** (a good day — "Kael actually made it home for dinner last night. We watched something together. It felt... normal."): This one HURTS because the player knows normal is ending. + - **Confiding** (to Sera, player overhears): "I checked the shift roster. There's no overtime posted. So where is Kael until midnight?" — This is the line that should make the detective's ears prick up. + +2. **A specific recurring visual moment.** Hael checking the door when it opens. EVERY time. This should be a near-guaranteed observation when the player enters the bar during Hael's hours. Not a tell in the mechanical sense — Hael isn't hiding anything. It's an *atmosphere beat*. The player walks in, sees Hael look up, sees the flash of hope, sees it dim when it's not Kael. That visual rhythm is what makes Hael unforgettable. + +3. **Hael-Kael interaction that the player witnesses.** One authored moment where Kael IS at the bar with Hael, and the player sees them together. Warm. Easy. The relationship as it was. This is the "before" snapshot that makes the "after" devastating. If the player never sees Kael and Hael together being happy, the worry is abstract. Show us what's being lost. + +**Proposed budget:** Add ~15-20 lines to Hael's profile. 5 more voice samples, 3-4 monologue trigger lines (both characters), and the Kael-Hael joint scene beats. Keep Hael Tier 2 structurally. The emotional upgrade is in quality and placement, not in mechanical tier promotion. + +### The principle + +**Not every powerful character needs to be mechanically complex.** Hael is proof that emotional weight and mechanical depth are different axes. Tier 1 means "the engine runs complex state machines on this NPC." Hael doesn't need state machines. Hael needs the player to feel something when they walk past. + +--- + +## Tension 2: Sera's Crack — Detective Bias vs. Smuggler Gap + +### Paula is right about the detective bias + +Read Paula's confession: "The smuggler's content pipeline is systematically under-served compared to the detective's." Then read the knowledge attribute keys: `tell_observed`, `contradiction_flagged`, `secret_held` — every one of those is an investigation tool. The smuggler doesn't investigate. The smuggler NAVIGATES. + +My Round 1 proposal (give Sera a moment where her composure slips) fixes a detective-side problem: making Sera feel like a person instead of a system. It's a good fix. But it's a SMALL fix on the side that's ALREADY well-served. + +### The smuggler side is the real gap + +The detective has a clear emotional arc: arrive > trust Sera > discover concealment > feel betrayed. That's clean, paced, authored. + +The smuggler's emotional arc is: know everything > watch it fall apart > feel responsible. That's HARDER to author because the smuggler starts with knowledge instead of discovering it. The dramatic irony is player-felt, not mechanically tracked. The wiki describes the smuggler's experience in dual-lens notes ("knows Kael is in the ring, can't tell Hael") but doesn't give it the same mechanical teeth. + +**What the smuggler needs is emotional ACCUMULATION, not emotional DISCOVERY.** + +The detective accumulates evidence. The smuggler accumulates guilt. But we don't have a guilt system. We don't have "number of times you lied to Hael" as a tracked metric. We don't have the monologue darkening after each interaction where the smuggler chooses to protect the ring over a person. + +### Concrete proposals + +1. **Do the Sera crack too.** It's still a good idea. One unprompted half-sentence early in the game: "About Kael — no, it's nothing. Sorry. How's the investigation?" The detective barely notices. On replay as the smuggler, the player who already knows what Sera is hiding sees that half-sentence and thinks OH NO. + +2. **But also: build the smuggler's guilt vocabulary.** Support Paula's proposal for smuggler-specific attributes (`operational_reliability`, `exposure_risk`, `loyalty_assessment`). AND add an emotional layer: + + | Smuggler Emotional Attribute | Purpose | Example | + |------------------------------|---------|---------| + | `guilt_interactions` | How many times has the smuggler lied to/about this NPC? | Increments when player chooses deceptive dialogue with Hael | + | `complicity_acknowledged` | Has the monologue explicitly named the moral cost? | Unlocks "darker" monologue variants after threshold | + | `protective_actions` | Has the player actively tried to shield this NPC? | Choices to warn Kael, cover for Pell, etc. | + + This gives the smuggler's monologue voice mechanical grounding. Not "investigate harder" but "you've been lying to Hael for three conversations and the monologue knows it." Gore's theme of complicity gets TEETH. + +3. **The smuggler's "Cheers moment" is the real priority.** (See Tension 3.) The detective's opening is structurally solid — arrive, meet Sera, get oriented. The smuggler's opening is the one that needs to SING, because that's where the "everyone knows your name" concept lives. The smuggler is HOME. The detective is a visitor. The visitor's experience is inherently dramatic (fish out of water). The local's experience needs to be authored to feel dramatic, because familiarity is the enemy of drama. + +### The verdict on Sera's crack + +Do it. It's a good scene beat. But it's Round 2 of detective content polish when the smuggler experience hasn't had its Round 1 yet. Let's not keep feeding the well-fed twin. + +--- + +## Tension 3: The Cheers Moment — Does Miri's Krenn Brief Give Me the Texture? + +### YES. ABSOLUTELY YES. + +Miri, your Krenn brief is EXACTLY what I needed. I'm going to be specific about what I'm taking from it and why. + +### The "everyone knows your name" opening — smuggler version + +The smuggler walks into the logistics hub at 06:00. Here's what sells it, drawn directly from Miri's brief: + +**Greeting convention:** "Peers meeting: first name, nod. No verbal greeting formula." So Voss doesn't say "Good morning, welcome to your shift." Voss says nothing. Makes eye contact for half a second. Chin-lift. That's it. That IS the greeting. The monologue fires: "Voss is already here. Good." + +If the detective walked in, nobody would do the chin-lift. They'd get a flat look and nothing. The ABSENCE of the greeting signals outsider. The PRESENCE of it signals home. You don't explain this to the player. They just feel the difference between two playthroughs. + +**Shift-end culture:** The word "shift-end" as a VERB. "Let's shift-end." The smuggler knows this word. Their monologue uses it naturally: "Long day. Time to shift-end at Lera's." The detective hears someone say "shift-end" and doesn't understand it — or monologues: "Local slang. 'Shift-end' — post-work bar visit. Noted." Same word, different layers of comprehension. THAT'S dual-lens environmental storytelling. + +**"Hüva":** The casual farewell/agreement. The smuggler says it to Kael when leaving the break room. "Hüva, Kael." Natural, automatic, one syllable of belonging. The detective trying to say "Hüva" would feel awkward — like a tourist saying "ciao" in Italy. DO NOT let the detective say it naturally. That's reserved for people who are from here. + +**"Kylm":** "It's kylm in Sector 3." GIVE THIS to the smuggler in the first 60 seconds. A complaint about the ventilation. Something utterly mundane that signals: I live here. I know the building. I know which sectors have bad environmental systems. The player doesn't know what "kylm" means yet, but the character does, and that gap is the wow moment. + +**Kuum at shift transition.** The spiced warm drink that says "I'm off the clock." If the smuggler's opening starts with getting kuum from a vendor — just a small action, walk up, get the drink, first-name interaction with the vendor — that's the "everyone knows your name" beat. No exposition. No backstory dump. Just a person getting their usual drink at their usual spot and the vendor doesn't ask what they want because they already know. + +### The specific environmental details I want + +Based on Miri's brief, here's my list for the first 60 seconds (smuggler): + +1. **Kuum vendor interaction.** Smuggler walks to the usual spot. Vendor (could be a Tier 3 NPC or environmental fixture) has the drink ready. No words exchanged. Monologue: "Kuum's good today. Must be a fresh batch from somewhere." The player learns: I have a morning routine. This person knows me. I have opinions about this drink. + +2. **The chin-lift from Voss.** Eye contact, half-second, chin-lift. No words. Monologue: "Voss is on edge again. Third time this week." The player learns: I know this person. I read their moods. Something is wrong and I've been tracking it. + +3. **Kael's greeting.** "There you are." (Already in the profile.) First words of genuine warmth. Monologue: "Kael's already at the dock. Good. The day's better when he's on shift." The player learns: This person matters to me. I care about whether they're here. + +4. **Station ambience: "kylm" complaint.** Someone near the smuggler says "Perk, it's kylm again" about the ventilation. The smuggler doesn't react — this is normal background. But the monologue could note: "Environmental's acting up in Sector 3 again. Maintenance never fixes it." This is TEXTURE. It's lived-in. The player absorbs it without processing it, and it makes the station feel real. + +5. **Lera's leib at the break.** If the first bar visit happens during the vertical slice, the smuggler orders food. Leib and supp — the heritage comfort food. "The usual" — Lera doesn't ask. Monologue: "Lera's supp is better this week. Must have changed the seasoning." Again — routine, familiarity, belonging. + +**Every single one of these beats comes from Miri's brief.** Nordic-Baltic heritage, shift-end culture, compact greetings, heritage food, substrate vocabulary. The brief isn't just flavor text — it's gameplay texture. It's the raw material for the "you belong here" feeling that makes the eventual "this place is falling apart" feeling devastating. + +### What I still want + +One thing Miri's brief doesn't cover that I think matters: **what does the station SOUND like?** Not full sound design — that's Inigo's domain. But Miri's cultural brief should note whether Krenn culture is QUIET (people talk softly, ambient noise is machinery) or LOUD (shift-change chaos, people calling to each other across bays). I think Krenn is quiet in social contexts and loud in work contexts. The bar is subdued — people talk over drinks, not over each other. The hub is industrial noise. This matters for establishing mood and for the detective's "outsider entering a quiet community" experience. + +--- + +## Tension 4: FRIEND Pool — Does Variable FRIEND Selection Risk Losing Emotional Impact? + +### This is where Nigel and I disagree. Or rather — agree on the destination and disagree on the timing. + +Nigel's proposal: FRIEND selection per seed. 2-3 FRIEND candidates per character. Different secrets, different tells, different contradiction arcs. "Two friends play the game. One says 'I can't believe what Kael did.' The other says 'Who's Kael? My FRIEND was Renn.'" + +That vision is INCREDIBLE. I want that game to exist. But here's my concern: + +### The FRIEND's power comes from INVESTMENT, not SURPRISE + +Kael hits hard because of 15-20 minutes of authored warmth BEFORE the contradiction. "There you are. Good — I was starting to worry." "Shift's looking smooth today." "Hael's got a school event tonight, so I'm heading home early." The smuggler LIVES with Kael for the first half of the vertical slice. The routines overlap. The lunches happen. The inside knowledge accumulates. + +When Kael goes amber, it hurts because of ALL THAT INVESTMENT. The player isn't surprised that an NPC is hiding something — they're devastated that THIS SPECIFIC NPC is hiding something. The green-to-amber color shift is the player's 15 minutes of trust curdling in real time. + +If the FRIEND is drawn from a pool, every FRIEND candidate needs that same density of authored warmth. Not just a tell system and a contradiction trigger — but the casual lines, the inside jokes, the shift talk, the Hael mentions, the break-room lunches. The stuff that makes you CARE before you DOUBT. + +### My position: pool YES, but with guardrails + +1. **Every FRIEND candidate must be Tier 1.** Full 70-100 authored lines. Full contradiction arc. Full tell progression. No shortcuts. Gore is right: "THE FRIEND cannot be procedurally generated." But also: THE FRIEND's warmth phase cannot be abbreviated. + +2. **The warmth phase is non-negotiable minimum length.** At least 10-12 minutes of gameplay where the FRIEND is green, warm, and present. If a FRIEND candidate's profile doesn't have enough casual interaction material to sustain 10 minutes of "I like this person," they're not ready for the pool. + +3. **v0.1: one FRIEND per character. Architecture supports the pool.** Ship Kael (smuggler) and Sera (detective) at the authored quality they already have. Build the system so that v0.2 can add a second FRIEND candidate per character. The pool exists in the code from day one. The content catches up in v0.2. + +4. **The second FRIEND candidate should be someone the player ALREADY KNOWS as a non-FRIEND NPC.** This is the real replayability magic. Playthrough 1: Kael is your FRIEND, Maret is "the anxious scheduler." Playthrough 2: Maret is your FRIEND, and everything you thought you knew about her anxiety is recontextualized as the warmth phase of a contradiction arc you never saw coming. + + The player thinks: "Wait, MARET? She was just background noise last time. She had a private log of discrepancies and I didn't even notice she was important." THAT'S the wow. Not "I met a new character." It's "I met THIS character before and I didn't SEE them." + +5. **Metagaming concern is real but secondary.** Nigel is right that knowing Kael's tell (looks left) is useless in Seed B where the FRIEND is Renn. But the REAL metagaming defeat isn't "you can't predict the tell." It's "you can't predict who matters." If FRIEND selection is from the existing roster (not brand-new characters), the player can't metagame their way to identifying the FRIEND early because EVERYONE they meet could be the one who betrays them. + + That's not a technical trick. That's PARANOIA AS GAMEPLAY. And for the detective character, paranoia about who to trust IS the game. + +### Summary on FRIEND pool + +Nigel's vision is correct. The implementation path is: one FRIEND per character for v0.1, pool architecture from day one, second FRIEND candidate in v0.2 drawn from existing NPCs elevated to Tier 1. The emotional impact is preserved because every FRIEND gets full authored depth. The metagaming is defeated because the FRIEND could be ANYONE you've already met. + +--- + +## Drive-By Reactions to Other Round 1 Proposals + +### Gore: "The game is about complicity, not asymmetric information." + +YES. THIS IS IT. I said "THAT'S the game" about Hael. Gore said "THAT'S the theme" about the whole project. Complicity is the right word. Asymmetric information is the mechanic. Complicity is what it FEELS like. + +The "Thematic Question" proposal ("Is this enough?") is excellent. But I want to make sure it stays out of the player's face. Don't put "THEMATIC QUESTION: Is this enough?" on a UI card. Let the player FEEL it through the monologue voice. The smuggler's monologue should increasingly sound like someone asking themselves whether the money is worth the lies. The detective's monologue should increasingly sound like someone asking whether the truth is worth the damage. The question is implicit. The player provides the answer through play. + +### Gore: "Contaminated trust is the normal condition of life in a compromised community." + +This reframes the whole game and I love it. The FRIEND arc isn't about discovering that trust is contaminated. It's about discovering that you ALREADY LIVED IN contaminated trust and didn't notice. Green was never safe. It was comfortable ignorance. Amber is honesty. + +Gameplay implication: the color shift from green to amber shouldn't feel like a LOSS. It should feel like CLARITY. The loss is retrospective — "oh, green was a lie." The amber moment is the character seeing clearly for the first time. Whether clarity is better than comfort is the player's question to answer. + +### Gestalt: "T1 (Hub Power) is the weakest triangle." + +Agree. The Nils-is-off-stage problem is real. But Gestalt's proposed fix (smuggler chooses between Nils and Voss on volume escalation) is exactly right. That's a decision with emotional weight: side with family loyalty or operational safety? And the detective sees the AFTERMATH — schedule anomalies, Voss's mood shift — without understanding the cause. Dual-lens perfection. + +### Paula: "Smuggler-specific attribute vocabulary" + +NEEDS to happen. The detective has investigation tools. The smuggler needs social navigation tools. `operational_reliability`, `exposure_risk`, `loyalty_assessment` — these are the smuggler's versions of `tell_observed` and `contradiction_flagged`. Without them, the smuggler's monologue has no mechanical basis for evolving. The monologue would just be flavor text that doesn't respond to what the player observes. That's decoration, not gameplay. + +### Mellanie: "Kuum" and the bar menu + +Mellanie identified the exact blocking dependency I'm feeling: she can't write environmental text without Miri's regional brief. Now that Miri's brief exists, Mellanie has everything she needs. The menu at Lera's should include: leib, supp (three variations), kalaa (salted, station-smoked), kuum, grain spirit, ale (imported, costs more), and whatever Lera's experimental thing is (the "grain spirit" riff Sera mentions). That menu IS the Cheers moment — regulars don't look at it, newcomers study it, and the detective's monologue notes what the smuggler orders without thinking. + +### Nigel: "Two friends play the game. One says 'Who's Kael?' and the other says 'My FRIEND was Renn.'" + +That's the pitch. That's what goes on the back of the box. That's what the trailer voice-over says. I want that to be real. Let's build it. + +--- + +## Summary: What I'm Advocating For + +| Priority | Proposal | Supports | +|----------|----------|----------| +| **1** | Keep Hael Tier 2 but add ~15-20 lines: hopeful/confiding voice, door-checking beat, Kael-Hael togetherness scene | Emotional impact without mechanical bloat | +| **2** | Build smuggler emotional accumulation mechanics (guilt tracking, complicity-aware monologue) | Parity with detective's investigation arc | +| **3** | Sera's composure crack: one half-sentence in early game about Kael | Detective experience polish + retroactive wow on replay | +| **4** | Smuggler's Cheers opening using Miri's Krenn brief: kuum, chin-lift, "Hüva," heritage food, substrate vocabulary | The "everyone knows your name" first 60 seconds | +| **5** | FRIEND pool architecture from v0.1, content in v0.2. Second FRIEND drawn from existing NPCs elevated to Tier 1 | Replayability without sacrificing emotional depth | +| **6** | Smuggler-specific attribute keys (Paula's proposal) + emotional layer (guilt_interactions, complicity_acknowledged) | Monologue mechanical grounding for both characters | +| **7** | Style guide "gut-check line" requirement: every NPC profile needs one voice sample that makes you pause | Quality floor for all future NPCs | + +### The test I keep coming back to + +A player finishes the smuggler path. They sit quietly for a moment. They think about Hael checking the door. They think about the kuum vendor who knew their order. They think about Kael saying "There you are" in the first minute, and "Don't worry about it" in the last. + +Then they start the detective path. And they watch it all happen again from the outside. And it's worse. + +That's the game. Everything I've proposed is in service of making that test pass. + +--- + +*Written by Ozzie. From the gut, informed by the team. Gore's complicity theme + Miri's cultural texture + Paula's honest assessment + Gestalt's mechanical rigor + Nigel's replayability vision + Tyre's architecture + Mellanie's authoring needs. It all fits. Let's build it.* diff --git a/docs/workshops/wiki-review/round2-paula.md b/docs/workshops/wiki-review/round2-paula.md new file mode 100644 index 000000000..bc1748236 --- /dev/null +++ b/docs/workshops/wiki-review/round2-paula.md @@ -0,0 +1,478 @@ +# Round 2 — Paula (Librarian, Cross-Pollination) + +**Responding to:** Gore, Gestalt, Ozzie, Miri, Nigel, Tyre, Mellanie + +--- + +## 1. Smuggler Lens Fix: The Complicity Knowledge Graph + +Gore is right. The game's theme is complicity, not just asymmetric information. And my Round 1 confession — that the smuggler's content pipeline is systematically under-served compared to the detective's — is the mechanical consequence of missing this. + +The detective's experience is shaped by *discovery*: I didn't know, now I know, what do I do with it? The knowledge graph supports this beautifully (Suspects → KnowsOf → KnowsDetails → Direct). + +The smuggler's experience is shaped by *management*: I already know, things are changing, can I hold it together? The knowledge graph doesn't support this at all. There's no vocabulary for "knowledge I wish I didn't have" or "knowledge that's becoming dangerous to hold." + +Let me fix this concretely. + +### Smuggler-Specific Entity Attributes + +These sit alongside the existing detective-oriented attributes in `EntityKnowledge.known_attributes`. They express the smuggler's social/operational reading of people. + +| Key | Values | Purpose | Example | +|-----|--------|---------|---------| +| `operational_status` | `reliable`, `shaky`, `compromised`, `burned` | How dependable is this NPC for ring operations? | Kael: `reliable` → `shaky` (post-distraction tells) | +| `exposure_risk` | `contained`, `escalating`, `critical` | How likely is this NPC to blow the operation? | Torek: `escalating` (spending draws attention) | +| `loyalty_read` | `solid`, `conditional`, `wavering`, `turning` | Smuggler's gut assessment of this NPC's allegiance | Pell: `wavering` → `turning` (if smuggler observes signs) | +| `leverage_known` | free-text string or `"none"` | What gives the smuggler (or someone) power over this NPC? | Drin: `"gambling debt to Harek"` | +| `social_debt` | `owes_me`, `i_owe_them`, `mutual`, `none` | Informal obligation tracking | Kael: `mutual` (years of covering for each other) | +| `complicity_level` | `clean`, `passive`, `active`, `deep` | How entangled is this NPC in the operation? | Lera: `passive` (willful ignorance). Voss: `active` (takes a cut). | + +**How these integrate with the existing system:** The detective reads `behavior_flags`, `tell_observed`, `contradiction_flagged`. The smuggler reads `operational_status`, `exposure_risk`, `loyalty_read`. Same `EntityKnowledge` struct, different attribute keys populated based on the observer's perspective and knowledge base. + +### Smuggler-Specific FactIds + +The smuggler doesn't discover — the smuggler *manages*. These FactIds track the deterioration of operational security, not the accumulation of evidence. + +| FactId | Suspects | KnowsOf | KnowsDetails | Mechanical Purpose | +|--------|----------|---------|---------------|-------------------| +| `operations.cover_integrity` | "Something's off. People are asking more questions than usual." | "The operation's cover is thin. Torek's spending, Maret's attention, the new detective — it's adding up." | "Cover is compromised. Maret has the manifest data. The detective has a pattern. Pell might talk. We're exposed on three fronts." | **Core smuggler arc tracker.** Gates escalation monologue. The smuggler's equivalent of the detective's `progress.initial_suspicion`. | +| `operations.personnel_stability` | "Kael seems distracted." | "Kael's unreliable. Pell's wavering. The team isn't solid anymore." | "Kael is doing something unauthorized. Pell is actively considering cooperation. Renn suspects Pell and is watching. The ring is eating itself from the inside." | **Internal threat awareness.** Gates the smuggler's decision moments in Triangle 5. | +| `operations.institutional_pressure` | "Commission presence in the district is... normal? Hard to tell." | "There's a Commission investigator working the district. Asking questions at the bar. Talking to Sera." | "The detective knows about the manifests. They're building a case. Timeline is weeks, not months." | **External threat awareness.** Gates the smuggler's urgency and risk assessment. | +| `operations.moral_weight` | "It's just components. People need them." | "We're moving medical replacements too now. People whose lattices are failing. This isn't just profit anymore." | "I've seen the faces of the people we supply. A kid whose lattice was degrading. A worker who couldn't afford Commission pricing. This is healthcare with a criminal record." | **The complicity deepener.** Gore's "Is this enough?" becomes "Can I stop?" The smuggler's moral knowledge INCREASES, not decreases, over play — and that makes exiting harder, not easier. | +| `operations.exit_cost` | "What would it take to walk away?" | "Walking away means abandoning Kael, leaving Renn exposed, and hoping Nils doesn't come looking." | "There is no walking away. I know too much. The people I'd leave behind would pay for my absence. The only exit is through." | **The trap.** The smuggler starts knowing they're in a ring. By mid-game, they know they can't leave. The knowledge itself is the cage. | + +### Smuggler Monologue Triggers + +The detective's monologue fires on *observation* — seeing tells, noticing patterns, analyzing behavior. The smuggler's monologue fires on *social awareness* — reading rooms, sensing shifts in trust, feeling the ground move under the operation. + +| Trigger | When It Fires | Tone | Example | +|---------|--------------|------|---------| +| `sense_atmosphere_shift` | Multiple NPCs show elevated stress in the same location simultaneously | Alert, protective | *"Something's off today. Voss is reworking manifests again. Maret's avoiding eye contact. Even Sess is polishing glasses harder than usual."* | +| `witness_exposure_risk` | An NPC does something that increases the operation's visibility | Anxious, calculating | *"Torek just bought another round. With what? Everyone can see this. Perk, Torek, you're a walking liability."* | +| `observe_loyalty_fracture` | An NPC the smuggler trusts shows signs of wavering | Betrayed, analytical | *"Pell didn't show for prep. Third time. Renn noticed too — I saw him watching. This is how it starts."* | +| `feel_complicity_deepen` | The smuggler learns something about the consequences of the operation (positive or negative) | Conflicted, heavy | *"That kid at the bar — the one Hael teaches. His lattice is a baseline model with aftermarket stabilizers. Our stabilizers. We put that in his head. Is that a good thing?"* | +| `recognize_no_exit` | The smuggler realizes that their knowledge, relationships, and involvement make leaving impossible | Trapped, resigned | *"I could walk away. Take the next shuttle, start somewhere else. ...And then what? Kael takes my shifts. Renn runs the routes alone. Nils asks where I went. There is no somewhere else."* | +| `read_the_room` | Entering a social site where multiple known NPCs are present | Socially fluent, embedded | *"Lera's behind the bar. Good. Kael's at the corner table with Hael — date night, maybe. Sess is on. Torek's not here yet. Quiet night. I like quiet nights."* | + +**The key difference from detective triggers:** Detective triggers are analytical — "I notice, I flag, I investigate." Smuggler triggers are *relational* — "I feel, I read, I manage." The detective's monologue says "That's suspicious." The smuggler's monologue says "That's dangerous." Same observation, different knowledge framework. + +### How This Resolves Gore's Concern + +Gore says the detective lens is "judgment" and the smuggler lens is "complicity." The knowledge graph additions above give complicity mechanical expression: + +- **Complicity as knowledge type:** `operations.moral_weight` tracks the smuggler *learning* that what they do matters to real people. The deeper the knowledge, the heavier the complicity. +- **Complicity as trap:** `operations.exit_cost` tracks the realization that knowledge itself is a cage. The more you know about the operation, the less you can leave. +- **Complicity as social fabric:** `operational_status`, `loyalty_read`, and `social_debt` express that the smuggler's complicity isn't just about cargo — it's about people who depend on you and who you depend on. + +The detective accumulates evidence against others. The smuggler accumulates evidence against themselves. That asymmetry IS the dual-lens at its deepest level. + +--- + +## 2. Unified PC-Candidate NPC Spec + +Converging my Round 1 field mapping (12 required + 6 optional + 6 new) with Gestalt's bidirectional knowledge insight (reverse `EntityKnowledge` entries) and Gore's authored relationship stubs requirement. Also incorporating Ozzie's "first 60 seconds" design — the wow moment requires specific content that the spec must mandate. + +### The Complete Spec + +A **PC-candidate NPC** is any NPC whose profile contains the additional data needed for player character upgrade. Not all NPCs are PC-candidates. In v0.1, two archetypes exist (smuggler, detective); each has 1+ candidate NPCs. + +#### Section A: Standard NPC Profile (Per Tier Template) + +All fields from the standard Tier 1 or Tier 2 template. No changes. The PC-candidate appendix is ADDITIONAL, not a replacement. + +#### Section B: PC-Candidate Appendix + +```yaml +# Appended to any NPC YAML that may become a player character + +pc_candidate: + archetype: "smuggler" # Which PC archetype this NPC fulfills + archetype_variant: "ring_member" # Optional sub-variant for randomizer + + # B1: Starting Knowledge Graph + starting_facts: + - fact_id: "contraband.ring_exists" + confidence: "KnowsDetails" + - fact_id: "contraband.lattice_components" + confidence: "KnowsDetails" + - fact_id: "location.corridor_b7_restricted" + confidence: "KnowsDetails" + - fact_id: "location.smuggling_route" + confidence: "KnowsDetails" + - fact_id: "world.shift_schedule" + confidence: "KnowsDetails" + - fact_id: "relationship.ring_membership" + confidence: "KnowsDetails" + - fact_id: "operations.cover_integrity" # smuggler-specific + confidence: "KnowsOf" + - fact_id: "operations.personnel_stability" # smuggler-specific + confidence: "KnowsOf" + - fact_id: "investigation.manifest_discrepancy" + confidence: null # doesn't know + - fact_id: "operations.moral_weight" # smuggler-specific + confidence: "Suspects" # knows vaguely + + # B2: Starting Relationship Map (forward: what PC knows about each NPC) + starting_relationships: + - npc_id: "kael_davan" + state: "Friendly" + known_attributes: + name: "Kael Davan" + role: "dock worker" + faction: "ring member" + trust_level: "trusted" + relationship_type: "close colleague" + routine_pattern: "morning shift 06:00-14:00, bar after shift" + behavior_flags: "reliable,punctual" + operational_status: "reliable" + social_debt: "mutual" + - npc_id: "voss" + state: "Known" + known_attributes: + name: "Voss" + role: "shift supervisor" + faction: "civilian" # smuggler doesn't think of Voss as "ring" + trust_level: "reliable" + operational_status: "reliable" + complicity_level: "active" + # ... (all known NPCs enumerated) + + # B3: Reverse Knowledge (what each NPC knows about the PC) + # Gestalt's critical insight: bidirectional from day one + known_by: + - npc_id: "kael_davan" + known_attributes: + name: "{PC_NAME}" + role: "dock worker" + faction: "ring member" + trust_level: "trusted" + relationship_type: "close colleague" + routine_pattern: "morning shift, bar regular, ring ops 1-2x/week" + behavior_flags: "reliable,punctual" + - npc_id: "voss" + known_attributes: + name: "{PC_NAME}" + role: "dock worker" + faction: "ring member" + trust_level: "reliable" + relationship_type: "subordinate" + - npc_id: "hael" + known_attributes: + name: "{PC_NAME}" + role: "dock worker" + faction: "civilian" # Hael doesn't know about the ring + trust_level: "reliable" + relationship_type: "partner's friend" + - npc_id: "lera_sessik" + known_attributes: + name: "{PC_NAME}" + role: "dock worker" + faction: "civilian" + trust_level: "reliable" + relationship_type: "bar regular" + # ... (all NPCs who know the PC enumerated) + + # B4: Orientation Content (Ozzie's "first 60 seconds") + orientation: + # Monologue lines that fire in the first 2-3 minutes + # These are how the player DISCOVERS their character's life + # NOT a backstory dump — reactions to the world that reveal history + arrival_monologue: + - trigger: "enter_hub" + text: "Another shift. At least Kael's already here — the dock runs smoother when he's on." + prerequisite: null # fires unconditionally at game start + - trigger: "see_voss" + text: "Voss is at the board already. He's been tense this week. More than usual." + prerequisite: null + - trigger: "see_kael" + text: "There's Kael. Good. The day's better when he's on shift." + prerequisite: null + - trigger: "enter_bar_first" + text: "Lera's. End of shift, end of the day. This is the part that makes the rest worth it." + prerequisite: null + - trigger: "see_hael" + text: "Hael's here. Kael's probably still at the hub. I should say hello — Hael always asks how the shift went." + prerequisite: null + + # B5: Agency Boundaries + agency: + # Soft constraints — what the PC can/can't do without narrative justification + restricted_actions: + - action: "access_commission_systems" + reason: "Not Commission — no institutional access" + - action: "arrest_npcs" + reason: "No authority — civilian dock worker" + enabled_actions: + - action: "access_ring_locations" + reason: "Ring member — has corridor codes, knows routes" + - action: "use_ring_comms" + reason: "Ring member — can contact Devra, Renn via informal channels" + + # B6: Authored Relationship Stubs (Gore's requirement) + # Specific memories and history that make NPC greetings hit emotionally + relationship_history: + - npc_id: "kael_davan" + shared_memories: + - "Covered for each other during the compliance audit six months ago." + - "Kael helped move a difficult cargo last month; neither talks about it." + - "Share lunch most days at the break room. Kael always brings extra." + greeting_context: "Kael greets the PC with genuine warmth and relief — they have history." + - npc_id: "lera_sessik" + shared_memories: + - "Regular at Lera's for two years. Lera knows what the PC drinks." + - "PC fixed the bar's refrigeration unit last winter. Lera doesn't forget favors." + greeting_context: "Lera nods, pours the usual without being asked. Belonging." + - npc_id: "hael" + shared_memories: + - "Met through Kael. Hael is kind. PC has dinner at their place occasionally." + - "Hael once asked the PC to 'keep an eye on Kael at work.' PC said yes." + greeting_context: "Hael is warm but tired. Will ask about work. Cannot be told the truth." + + # B7: Tell Inversion (what NPCs already know about the PC's tells) + pc_tells: + - tell: "Checks lattice when nervous" + known_by: ["kael_davan"] # Kael knows this from years of working together + - tell: "Gets quieter before making a decision" + known_by: ["kael_davan", "lera_sessik"] +``` + +### What This Spec Resolves + +| Question | Answer | +|----------|--------| +| Where does starting knowledge come from? | Section B1: explicit FactId confidence table | +| How do NPCs already know the player? | Section B3: reverse knowledge entries per NPC | +| What makes the first 60 seconds feel like Cheers? | Section B4: orientation monologue + B6: authored relationship stubs | +| What can't the player do? | Section B5: agency boundaries | +| Why does Kael's "There you are" hit emotionally? | Section B6: shared memories give the greeting weight | +| Can NPCs read the PC's behavior? | Section B7: tell inversion — NPCs know your tells before you do | + +### Conversion Checklist for Content Authors + +When creating a PC-candidate NPC: + +1. **Write the standard NPC profile first** (Tier 1 or Tier 2 template) +2. **Enumerate starting facts** — for every FactId in the catalog, decide: does this character know it? At what confidence? +3. **Enumerate forward relationships** — for every NPC the PC knows: RelationshipState + full `known_attributes` including smuggler-specific or detective-specific keys +4. **Enumerate reverse relationships** — for every NPC who knows the PC: what do they know? What DON'T they know? (Hael doesn't know about the ring.) +5. **Write orientation monologue** — 5-8 lines, one per known NPC or location, that reveal the character's life through reactions, not exposition +6. **Write relationship history stubs** — 2-3 specific shared memories per major relationship, plus a `greeting_context` note for content authors writing the NPC's first lines +7. **Define agency boundaries** — what the PC can and can't do, architecturally +8. **Document PC tells** — behaviors NPCs already recognize, inverted from the standard tell system +9. **Validate bidirectional consistency** — if the PC knows Kael is a ring member, Kael's `known_by` entry must have the PC as a ring member too. If Hael doesn't know about the ring, Hael's `known_by` must have `faction: "civilian"`. + +--- + +## 3. Naming Process with Miri + +Miri's Krenn System brief is excellent. The phonological rules are now explicit: Nordic-Baltic heritage, consonant-forward, vowels tend toward a/e/o, hard consonants dominate, 1-2 syllables in daily use. The surname patterns are documented: Finnish -nen suffixes dropped, Estonian -sik/-vere sometimes survive, Dutch/Norwegian names survived closer to origin. + +### Generating Missing Full Names + +**The problem:** 12 of 17 NPCs have no canonical surname. My Round 1 flagged this as both a gap (lattice queries need full names) and a metagaming signal (full names = important). + +**Proposed process:** + +**Step 1: Miri generates surname candidates.** Miri has the phonological rules and the heritage pools. For each single-name NPC, Miri proposes 2-3 surname options following the documented drift patterns: + +| NPC | Heritage Stream | Proposed Surnames | Notes | +|-----|----------------|-------------------|-------| +| Voss | Dutch/Norwegian (survived intact) | Voss Harsk, Voss Rosta, Voss Neven | "Voss" already reads Dutch/Norwegian. Surname should match. | +| Devra | Estonian-drifted | Devra Leht, Devra Pellam, Devra Kosse | "-a" ending suggests Estonian/Latvian origin | +| Resha | Estonian-drifted | Resha Talvik, Resha Vere, Resha Kask | Younger generation; surname could be founding-family | +| Hael | Finnish-drifted | Hael Maren, Hael Rosta, Hael Sova | Partner of Kael Davan — different surname (not married naming convention) | +| Harek | Norwegian (near-origin) | Harek Neven, Harek Strand, Harek Solm | Security background; surname should feel institutional | +| Renn | Estonian-compressed | Renn Kosk, Renn Talvik, Renn Vaht | Young, working class; short surname matches | +| Pell | Latvian-compressed | Pell Laar, Pell Raud, Pell Tamm | Compressed from longer Latvian form | +| Drin | Latvian/Finnish-compressed | Drin Mets, Drin Kallas, Drin Kukk | Maintenance worker; heritage-class surname | +| Sess | Estonian-origin | Sess Pihl, Sess Laane, Sess Vahk | Bartender; minimal social presence; short surname | +| Olin | Ambiguous (possible newcomer) | Olin Parvus, Olin Kade, Olin Mehr | Could deliberately break pattern if Olin is off-system | +| Sabel | Dutch (survived intact) | Sabel already reads as a complete name | Could add: Sabel Hoorn, Sabel Bergh | +| Tav | Maximally compressed | Tav Kukk, Tav Laas, Tav Oks | Youngest generation; ultra-short | + +**Step 2: Paula validates narrative consistency.** I check that: +- No surname collisions with existing names +- Surname doesn't accidentally create unintended family connections (the Davan problem — shared surname implies kinship) +- The surname "feels right" for the character's social position and heritage stream +- Olin's surname is deliberately chosen to signal insider or outsider status (this is a design decision, not just naming) + +**Step 3: Both sign off.** Miri confirms phonological fit; I confirm narrative fit. Qatux documents. + +**Step 4: Integration.** Full names added to NPC Core Identity blocks. Lattice query results can now return `"Voss Harsk — shift supervisor, Sova Logistics Consortium"`. Surface these naturally: hub work rosters, bar tabs, freight manifests — places where full names appear in-world. + +### Breaking the Name-as-Tier Signal + +Adding surnames to all NPCs resolves the metagaming concern, but only if full names surface NATURALLY for lower-tier NPCs too. Concrete integration points: + +- **Hub work roster** (environmental text, terminal screen): Lists all hub workers by full name. Player sees "Drin Mets — maintenance tech" alongside "Kael Davan — dock worker." Equal presentation. +- **Bar tab screen** (if Lera has one): Regular names. "Sess Pihl" and "Torek Lintar" on the same list. +- **Commission kiosk query**: Detective can look up anyone's full name. "Tav Kukk — casual labor, Sova Logistics Consortium." + +This also serves Ozzie's environmental worldbuilding goal — these are textual details that make the station feel inhabited and institutional, not just a game space. + +--- + +## 4. Hael Elevation: Tier 1.5 + +Gore says Hael is the masterpiece. Ozzie says Hael sitting alone checking the door is the moment that defines the game. Both want Tier 1. + +Let me complicate this. + +### The Case For Elevation + +**Emotional weight:** Hael is the emotional fulcrum. Both FRIEND arcs orbit Hael. Kael protects Hael. Sera protects Hael. The smuggler lies to Hael. The detective can weaponize Hael. One person who never touches the conspiracy is the person the conspiracy most damages. + +**Gore's point about complicity:** Every time the smuggler sees Hael and says nothing, that's complicity enacted. Every time the detective considers using Hael as leverage, that's judgment tested. Hael makes both characters' themes concrete. + +**Ozzie's "moments that make players feel something":** Hael sitting alone checking the door. Hael asking the smuggler if Kael seems okay. Hael confiding in Sera. These are potentially the most affecting moments in the game. + +### The Case Against Full Tier 1 + +**Hael has no contradiction arc.** THE FRIEND pattern (D-034) requires: 3+ relationship phases, observable contradiction, tell progression, dialogue shift pre/post discovery. Hael doesn't hide anything. Hael's pain is transparent. There's no behavioral mystery to unravel — Hael is openly worried, openly vulnerable, openly exposed. That transparency is what makes Hael powerful. Adding a contradiction arc would dilute the character. + +**Hael isn't a mechanical puzzle.** Kael and Sera give the player something to FIGURE OUT. Hael gives the player something to FEEL. Different function, different depth model. + +### Proposal: Tier 1.5 — "Production Emotional NPC" + +A new depth level between Tier 1 (FRIEND) and Tier 2 (Working Profile). Hael gets: + +**From Tier 1:** +- Full 10-axis profile at Tier 1 depth (all axes, detailed paragraphs) +- 5-mood voice sample (matching Tier 1 emotional range) +- Detailed dual-lens notes with monologue examples for both characters +- Full Triangle 4 role analysis +- Tell system (not behavioral mystery tells, but *emotional* tells — how Hael's worry manifests visibly) +- **~50-70 authored lines** (more than Tier 2's 40-60, less than Tier 1's 70-100) + +**NOT from Tier 1:** +- No contradiction arc (Hael has no secret to discover) +- No `contradiction_flagged` attribute (no behavioral mystery) +- No confrontation path (you can't "confront" Hael — you can only comfort, lie, or exploit) + +**New content unique to Tier 1.5:** +- **Emotional arc** (replaces contradiction arc): Worry → Questioning → Desperation → Confrontation-with-partner OR Withdrawal. 4 phases, authored transitions, monologue shifts for both characters per phase. +- **Vulnerability map**: What happens when the detective uses Hael? What happens when the smuggler lies? Authored consequence paths, not just a single "consequences if exposed" section. +- **Complicity lines** (smuggler-specific): 8-10 monologue lines for the smuggler that fire specifically around Hael — the guilt, the avoidance, the inability to help. These are the lines Gore and Ozzie are asking for. + +### Authoring Cost + +| Deliverable | Tier 2 (current) | Tier 1.5 (proposed) | Tier 1 (FRIEND) | +|-------------|-------------------|---------------------|------------------| +| 10-axis profile depth | Paragraph per axis | Full paragraphs, Tier 1 quality | Full paragraphs | +| Voice samples | 2-3 moods | 5 moods | 5 moods | +| Authored lines | 40-60 | 50-70 | 70-100 | +| Generation expansion | 4x (write 15, gen 60) | 2x (write 35, gen 35) | None (all hand-authored) | +| Contradiction arc | No | No (emotional arc instead) | Yes (5 phases) | +| Dual-lens detail | Brief (1-2 sentences) | Full (matching Tier 1) | Full | +| Unique content | — | Vulnerability map, complicity lines | Contradiction arc | + +**Net cost over current Tier 2:** ~15-20 additional authored lines, fuller dual-lens notes, emotional arc writeup, vulnerability map. Estimated: 2-3 additional hours of authoring time. + +**Is it worth it?** Yes. The emotional payoff Gore and Ozzie describe — the player feeling the weight of complicity every time they see Hael — requires authored content at a depth Tier 2 doesn't provide. But it doesn't need the full Tier 1 contradiction machinery. Tier 1.5 gives Hael the emotional depth without forcing a structural pattern that doesn't fit the character. + +### Template Impact + +If we adopt Tier 1.5, the style guide needs a fourth template. I'd define it as: + +**Tier 1.5: Production Emotional NPC** — For NPCs who carry major emotional weight without a discovery arc. The player doesn't figure out what this NPC is hiding. The player confronts what this NPC's pain reveals about the player's own choices. + +The template would follow Tier 1 structure for Core Identity, 10-Axis Profile, Voice Sample, and Dual-Lens Notes. It would replace "Contradiction Arc" with "Emotional Arc" and "Secret" with "Vulnerability Map." + +--- + +## 5. Complete Style Guide: Integrating Mellanie's Conventions + +Mellanie identified 8 missing conventions. Here's how each integrates into the tier templates from my Round 1, with Gestalt's mechanical constraints and Ozzie's "gut-check" requirement layered in. + +### Convention Integration Table + +| Mellanie's Convention | Where It Lives in Template | How It's Specified | +|----------------------|---------------------------|-------------------| +| **1. Canonical location shortcodes** | Template header + all YAML references | Table in style guide preamble: `terminal`, `bar`, `corridor`. One shortcode per location. No aliases. | +| **2. Prerequisite reference validation** | Template section: "Content Requirements" | Rule: "Every prerequisite must reference a FactId, RelationshipState, or EntityKnowledge key from the canonical catalogs. Lines with non-existent references are invalid." Enforced by schema validator per Tyre's pipeline. | +| **3. Access tier defaults by character** | Template section: "Dual-Lens Notes" | Rule: Smuggler default = `insider` (community member). Detective default = `authority` or `public` (institutional outsider). Explicitly stated in dual-lens preamble per NPC. | +| **4. Situation overlap rules** | Style guide appendix: "Tag Usage Rules" | Rule: "Multiple situation tags only when the line is independently appropriate in each situation. If removing one tag makes the line contextually wrong, don't include it." | +| **5. Mood exclusivity** | Style guide appendix: "Tag Usage Rules" | Rule: "Mood lists represent simultaneous emotional states, not alternatives. `[fond, conflicted]` = genuinely feeling both. If you mean 'either fond or worried,' write two lines." | +| **6. Freeform tag discipline** | Style guide appendix: "Approved Freeform Tags" | Living list maintained by content leads (Paula + Mellanie). Reviewed before YAML merge. Initial list derived from monologue guide examples. snake_case enforced. | +| **7. Dual-lens note format** | Tier 1 and Tier 2 template, Dual-Lens section | Rule: "Each character gets: 2-3 sentences of context, followed by one italicized monologue example. Always." Tier 3: 1-2 sentences + monologue fragment. | +| **8. Ozzie's gut-check line** | All tier templates, Voice Sample section | Rule: "One voice sample line must be the 'gut-check' — a line that, read aloud, makes you pause. If no line in the voice sample does this, the profile isn't done." Mark it with `# gut-check` comment in YAML. | + +### Additional Conventions from Gestalt + +| Gestalt's Constraint | Where It Lives | How It's Specified | +|---------------------|----------------|-------------------| +| **Routine must reference canonical location slugs** | All tiers, Routine section | Rule: "Time-block entries must use location slugs from the location registry. Prose routine for humans, YAML routine block for engine." Include Gestalt's structured YAML format alongside prose. | +| **Every NPC must have faction from canonical set** | All tiers, Core Identity | Rule: "Faction values: `commission`, `civilian`, `ring_member` (if known), `unknown`. No freefrom values." | +| **Every secret must map to a FactId** | Tier 1-2, Secret section | Rule: "The Secret section must end with a `mapped_fact:` line referencing the FactId this secret becomes when discovered." | +| **Every tell must map to behavior_flags** | Tier 1-2, Tell System table | Rule: "The Tell System table must include a Mechanical Flag column with the exact `behavior_flags` value. Tier 2 tables include the column for consistency even though flags are soft." | +| **Bridge NPCs need multi-site routine** | Bridge NPCs, Routine section | Rule: "NPCs listed as bridge in the NPC Index must have routine entries for EACH social site they connect." | + +### Additional Convention: Gore's Thematic Question + +| Convention | Where It Lives | How It's Specified | +|-----------|----------------|-------------------| +| **"Is this enough?" — character's answer** | All tiers, after Contentment axis | New optional field: `## Thematic Question` — 1-2 sentences stating this character's implicit answer to "Is this enough?" Not mechanical. Authoring guidance for voice and motivation consistency. Required for Tier 1 and Tier 1.5. Recommended for Tier 2. Not needed for Tier 3. | + +### The Assembled Style Guide Structure + +``` +# NPC Authoring Style Guide + +## Preamble +- Purpose and audience +- Tier definitions (Tier 1 / Tier 1.5 / Tier 2 / Tier 3) +- Location shortcode table (canonical, one per location) +- Faction value list (canonical enum) +- Approved freeform tag vocabulary (living list) + +## Tier Templates +- Tier 1 Template: THE FRIEND (full, from Round 1) +- Tier 1.5 Template: Production Emotional NPC (new, for Hael-type characters) +- Tier 2 Template: Working Profile (full, from Round 1) +- Tier 3 Template: Sketch (full, from Round 1) + +## Validation Checklists +- Per-tier validation (Gestalt's checklist, embedded in each template) +- Cross-reference rules +- PC-candidate additional requirements + +## Tag Usage Rules +- Situation overlap (Mellanie's rule) +- Mood exclusivity (Mellanie's rule) +- Freeform tag discipline (reviewed vocabulary) +- Access tier defaults per character + +## Mechanical Constraints +- Routine format (prose + YAML block) +- Secret-to-FactId mapping +- Tell-to-behavior_flags mapping +- Bridge NPC multi-site requirements + +## Voice and Quality +- Gut-check line requirement (Ozzie) +- Dual-lens note format (sentences + monologue example) +- One-breath rule for monologue (Mellanie) +- Mirror-first drafting (Mellanie) + +## PC-Candidate Appendix Spec +- Full spec from this Round 2 response +- Conversion checklist +- Validation rules for bidirectional knowledge consistency +``` + +--- + +## Summary of Round 2 Proposals + +| # | Proposal | Cross-References | Priority | +|---|----------|-----------------|----------| +| 1 | Adopt 6 smuggler-specific entity attribute keys | Gore (complicity), my Round 1 (detective bias) | **High** — blocks smuggler content parity | +| 2 | Add 5 smuggler-specific FactIds (operations.*) | Gore (complicity theme), Gestalt (knowledge graph) | **High** — blocks smuggler monologue authoring | +| 3 | Add 6 smuggler monologue trigger types | Gore (complicity lens), Mellanie (trigger types) | **High** — blocks smuggler content | +| 4 | Adopt unified PC-candidate NPC spec (sections B1-B7) | Gestalt (reverse knowledge), Ozzie (first 60 sec), Gore (authored stubs) | **High** — blocks YAML generation | +| 5 | Document NPC→PC conversion checklist (9 steps) | Gestalt, Nigel (randomizer) | **High** — blocks pipeline | +| 6 | Miri generates missing surnames; Paula validates | Miri (phonological rules), my Round 1 (naming) | **Medium** — blocks lattice query content | +| 7 | Elevate Hael to Tier 1.5 (Production Emotional NPC) | Gore (masterpiece), Ozzie (emotional payoff) | **High** — new tier template | +| 8 | Assemble NPC Authoring Style Guide (structure above) | Mellanie (8 conventions), Gestalt (mechanical constraints), Ozzie (gut-check) | **High** — blocks all future authoring | +| 9 | Add Gore's "Thematic Question" to Tier 1/1.5 template | Gore ("Is this enough?") | **Medium** — authoring guidance | +| 10 | Add Gestalt's structured YAML routine block to templates | Gestalt (engine-readable routines) | **Medium** — engine integration | diff --git a/docs/workshops/wiki-review/round2-tracking.md b/docs/workshops/wiki-review/round2-tracking.md new file mode 100644 index 000000000..f870c24c3 --- /dev/null +++ b/docs/workshops/wiki-review/round2-tracking.md @@ -0,0 +1,245 @@ +# Wiki Review Workshop — Round 2 Tracking Document + +**Compiled by:** Qatux (Documenter) +**Date:** 2026-02-12 +**Status:** Round 2 in progress. 4 of 8 responses read (Gore, Ozzie, Mellanie, Nigel). Awaiting Gestalt, Miri, Tyre, Paula. + +--- + +## Tension Resolution Status + +### T-01: FRIEND Pool Size and v0.1 Scope → RESOLVED + +**Consensus achieved.** All four respondents converge on the same position: + +- **Architecture:** Pool-based FRIEND selection from day one. Content files structured as pool entries even with single entry. +- **v0.1:** 1 FRIEND per character (Kael, Sera). Pool size = 1. System supports expansion. +- **v0.2:** 2 FRIENDs per character. Second candidate drawn from existing NPCs elevated to Tier 1. +- **v0.3+:** 3 per character. Metagaming fully defeated. +- **Depth:** Every FRIEND candidate MUST be full Tier 1 (70-100 authored lines). No exceptions. (Gore: "I won't budge on this.") +- **Warmth phase:** Minimum 10-12 minutes of gameplay where FRIEND is green, warm, present (Ozzie guardrail). +- **Content structure:** `friends/pool.yaml` per district with `npc_id`, `contradiction_type`, `tell_type`, `discovery_method` (Nigel). + +**Supporters:** Gore, Nigel, Ozzie (all explicit). Mellanie endorses implicitly via tagged pool confirmation. + +**Recommended decision ID:** D-042 (FRIEND pool architecture) + +--- + +### T-02: Content Directory Naming → PARTIALLY RESOLVED + +**Nigel explicitly drops his parallel proposal** in favor of Tyre's three-layer stack (base → DLC → mods) with ADD/REPLACE/MERGE. Nigel extends with template role-slot system. + +**Remaining question:** `global/` vs `_global/` prefix. Nigel: "I don't care about the underscore — pick one and ship it." Awaiting Tyre's Round 2 for final preference. + +**Converged elements:** +- `districts/` as atomic content unit (all agree) +- `global/` for schema/factions/technology (Tyre + Gestalt + Nigel) +- Schema per content type (all agree) +- Mod overlay: ADD/REPLACE/MERGE (Tyre, adopted by Nigel) + +**New from Nigel:** Template role-slot system in `templates/bar.yaml` — roles with `pool`, `count`, `pool_eligible` fields. This extends Tyre's structure for randomization without changing the directory layout. + +**Location shortnames resolved by Mellanie:** Directory names use wiki slugs (`the-terminal`, `the-last-shift`). Line ID prefixes use short forms (`terminal_m_001`). Two conventions, two purposes, no conflict. + +--- + +### T-03: Kael/Hael Sonic Collision → NOT YET ADDRESSED IN ROUND 2 + +No Round 2 respondent has engaged with this. Awaiting Paula (who raised it) and Miri (naming authority). + +--- + +### T-04: Smuggler Lens Gap → SIGNIFICANT CONVERGENCE + +**All four respondents endorse Paula's diagnosis.** The smuggler needs mechanical parity with the detective. + +**Gore reframes and extends Paula's attributes:** +- Endorses `exposure_risk`, `loyalty_assessment` but renames `operational_reliability` → `trust_read` ("more personal — that's how you think about colleagues you're risking prison with") +- Adds three new attributes: `moral_weight`, `cover_integrity`, `loyalty_conflict` +- Proposes smuggler-specific monologue triggers: `moral_pang`, `loyalty_test` +- Proposes smuggler **moral arc phases** parallel to detective investigation phases: Comfort → Doubt → Reckoning → Compromise +- Proposes smuggler FactId parallels for moral knowledge: `complicity.cost_to_hael` progression + +**Ozzie adds emotional accumulation layer:** +- `guilt_interactions` — how many times smuggler lied to/about this NPC +- `complicity_acknowledged` — unlocks darker monologue variants after threshold +- `protective_actions` — has player actively tried to shield this NPC + +**Mellanie confirms blocking dependency:** Smuggler monologue currently gates on detective-shaped prerequisites. Smuggler-specific attributes needed for smuggler monologue to react with same precision. + +**Nigel connects to randomization:** Paula's smuggler attributes are the data model for what varies per seed in smuggler's playthrough. `exposure_risk` changes per seed because WHO is compromised changes. + +**Recommended decision ID:** D-043 (Smuggler knowledge vocabulary and moral arc) + +--- + +### T-05: Triangle 1 and the Nils Problem → NOT YET ADDRESSED IN ROUND 2 + +Ozzie endorses Gestalt's T1 fix (Nils volume escalation decision) in drive-by. No deep engagement yet. Awaiting Gestalt Round 2. + +--- + +### T-06: Randomizer Scope for v0.1 → SIGNIFICANT CONVERGENCE + +**Nigel revises his own proposal.** Key concession: + +- **Primary contraband FIXED per district** (walks back full contraband shuffle). Lattice components always the core of Sova's ring. Culturally grounded, morally load-bearing. +- **Secondary contraband varies per seed** (medical-grade / severance / enhanced / nothing). Adds moral wrinkle without breaking cultural logic. +- **Gore's complicity thesis acknowledged as constraint** — contraband variation must preserve the moral ambiguity, not dilute it. + +**PC-as-NPC split into two concepts (Nigel):** + +| Concept | Scope | Cost | Description | +|---------|-------|------|-------------| +| **A: Other PC exists as NPC** | v0.1 | ~20-30 items | Detective NPC visible in smuggler playthrough and vice versa | +| **B: PC identity randomization** | v0.2+ | 16+ relationship pairs | Different dock worker/detective each playthrough | + +**Concept A endorsed for v0.1 by Nigel and Ozzie.** Low cost, high payoff (second-playthrough wow moment). + +**District entanglement map (Nigel):** Per-seed flags on NPCs determine ring connection, compromise status, role assignments. Constrained by D-029 ratio (30/50/20). Connects to Gestalt's T3 randomization proposal. + +**Seed configuration schema proposed (Nigel):** `runtime/seed-state.yaml` recording randomizer decisions at game start. + +**Recommended decisions:** +- D-044 (Primary contraband fixed per district, secondary varies per seed) +- D-045 (PC-as-NPC Concept A in v0.1 scope) +- D-046 (Seed configuration schema) + +--- + +### T-07: Wiki Structure vs Content Directory → NOT YET ADDRESSED + +Awaiting Tyre and Miri Round 2. + +--- + +### T-08: Tier 3 Emotional Depth → PARTIALLY RESOLVED (New Pattern Proposed) + +**Gore proposes THE MIRROR** — a new NPC archetype: +- Honest character whose transparency reveals others' dishonesty +- No secret, no contradiction arc, no tell system +- Full Tier 1 emotional depth (50-70 authored lines, 10-15 monologue per character) +- Hael is the first MIRROR +- NOT a Tier promotion — a new pattern alongside THE FRIEND + +**Ozzie DISAGREES on the solution but agrees on the diagnosis:** +- Keep Hael Tier 2 structurally +- Add ~15-20 lines: hopeful/confiding voice samples, door-checking atmospheric beat, Kael-Hael togetherness scene +- "Not every powerful character needs to be mechanically complex. Hael doesn't need state machines. Hael needs the player to feel something when they walk past." + +**The tension within the tension:** Gore wants a new formal pattern (THE MIRROR: 50-70 lines, no secret, unique template). Ozzie wants a quality upgrade within existing Tier 2 (add 15-20 lines, no new pattern). + +**Both agree:** +- Hael must NOT have a contradiction arc or secret +- Hael needs more authored content than current Tier 2 delivers +- Hael's power is simplicity and transparency + +**The question for the team:** Is THE MIRROR a reusable pattern worth formalizing, or is Hael a one-off exceptional Tier 2 NPC? + +--- + +## New Proposals from Round 2 + +### From Gore + +| # | Proposal | Cross-refs | +|---|----------|------------| +| P-63 | **THE MIRROR pattern** — new NPC archetype for honest characters. 50-70 authored lines, no secret, no tell, full emotional depth. | T-08, D-034 pattern | +| P-64 | **`cultural_gate` modifier for dialogue access** — regional culture modifies disclosure independently of relationship state. | P-28 (Gore R1), Miri brief | +| P-65 | **Smuggler moral arc phases** (Comfort → Doubt → Reckoning → Compromise) parallel to detective investigation phases. | P-07 (Paula), T-04 | +| P-66 | **Smuggler-specific monologue triggers**: `moral_pang`, `loyalty_test`. | P-07 (Paula), T-04 | +| P-67 | **Rename `operational_reliability` → `trust_read`**. | P-07 (Paula) | +| P-68 | **Add `moral_weight`, `cover_integrity`, `loyalty_conflict`** to smuggler attributes. | P-07 (Paula), T-04 | +| P-69 | **"Complicity" as named theme** alongside "asymmetric information" as mechanic. | P-01 (Gore R1) | + +### From Ozzie + +| # | Proposal | Cross-refs | +|---|----------|------------| +| P-70 | **Hael: Tier 2 + 15-20 extra lines** (not Tier 1 promotion, not MIRROR). Add hopeful/confiding voice, door-checking beat, Kael-Hael togetherness scene. | T-08, Gore MIRROR | +| P-71 | **Smuggler emotional accumulation attributes**: `guilt_interactions`, `complicity_acknowledged`, `protective_actions`. | P-07 (Paula), T-04 | +| P-72 | **Sera composure crack** — one half-sentence in early game: "About Kael — no, it's nothing." | P-12 (Ozzie R1) | +| P-73 | **Smuggler "Cheers moment" opening** using Miri's Krenn brief: kuum vendor, chin-lift, hüva, heritage food. | P-62 (Ozzie R1), Miri brief | +| P-74 | **Second FRIEND drawn from existing NPCs** elevated to Tier 1. "MARET? She was just background noise last time." | T-01, Nigel pool | +| P-75 | **Green→amber reframe**: Color shift should feel like CLARITY, not LOSS. "Green was a lie. Amber is honesty." | Gore contaminated trust | + +### From Mellanie + +| # | Proposal | Cross-refs | +|---|----------|------------| +| P-76 | **Environmental text concrete examples** delivered: bar menu, safety notice, news ticker cycle, corridor graffiti. All voiced with Krenn cultural markers. | P-32 (Mellanie R1), Miri brief | +| P-77 | **Combined style guide TOC** — merges Paula templates + Mellanie conventions + Gestalt constraints + Miri regional into unified document. | P-18 (Paula), P-15 (Gestalt), P-26 (Miri) | +| P-78 | **Smuggler voice card** with three paired examples showing dual-lens cultural register. Summary table: thinks in people vs data, first names vs surnames, fragments vs complete sentences. | T-04, Miri brief | +| P-79 | **Anchor line requirement** per tier (operationalizing Ozzie's gut-check): Tier 1 = 2+ anchors across phases. Tier 2 = 1 anchor minimum. Tier 3 = voice hint should gesture at humanity. | P-14 (Ozzie R1) | +| P-80 | **Location shortname resolution**: directory = wiki slug (`the-terminal`), line ID prefix = short form (`terminal_m_001`). | Tyre Q-W10 | + +### From Nigel + +| # | Proposal | Cross-refs | +|---|----------|------------| +| P-81 | **Template role-slot system** in template YAML: `slot`, `count`, `pool`, `pool_eligible` fields. | P-47 (Nigel R1), Tyre structure | +| P-82 | **`friends/pool.yaml`** per district with metadata: `contradiction_type`, `tell_type`, `discovery_method`. | T-01 | +| P-83 | **Primary contraband fixed, secondary varies per seed** — walks back full shuffle. Secondary: medical/severance/enhanced/nothing. | P-56 (Nigel R1), Gore complicity | +| P-84 | **PC-as-NPC Concept A for v0.1** — other PC exists as NPC. ~20-30 authored items. | T-06, Ozzie wow moment | +| P-85 | **District entanglement map** in seed configuration — per-seed NPC flags for ring connection, compromise status, role. | P-57 (Nigel R1), Gestalt T3 randomize | +| P-86 | **Seed configuration schema** (`runtime/seed-state.yaml`). | T-06 | +| P-87 | **News ticker headline pool** (40-50 entries, randomizer selects 15-20 per seed). | P-32 (Mellanie), wow moment #5 | +| P-88 | **Cultural substrate vocabulary as randomizable social tell** per seed (word "vakt" has different social charge). | Miri brief, replayability | + +--- + +## Updated Consensus Table (Round 2) + +| # | Topic | Round 1 Confidence | Round 2 Confidence | Change | +|---|-------|-------------------|-------------------|--------| +| C-01 | THE FRIEND never proc-gen, pool-based selection | High | **Confirmed** | Gore/Nigel/Ozzie all restate | +| C-02 | All NPCs need canonical full names | High | High (no new data) | Awaiting Paula/Miri R2 | +| C-03 | Regional style guide template | High | **Confirmed** | Gore endorses Miri, Ozzie uses for concrete examples | +| C-04 | Krenn System brief canonical | High | **Confirmed** | Gore calls it "best work product in workshop," Ozzie builds opening from it, Mellanie produces environmental text from it | +| C-05 | Formalized tier templates | High | **Confirmed** | Mellanie proposes merged style guide TOC | +| C-06 | Content directory: global + districts | High | **Confirmed** | Nigel adopts Tyre's structure | +| C-10 | Smuggler needs own knowledge vocabulary | High | **Strongly confirmed** | All 4 respondents endorse, Gore extends with moral arc | +| C-12 | PC-as-NPC requires explicit specs | High | **Confirmed + scoped** | Nigel splits into Concept A (v0.1) and B (v0.2+) | +| C-14 | Backstory through discovery | High | **Confirmed** | Ozzie's Cheers opening built from Miri's cultural texture | +| C-15 | **(NEW)** Complicity as named theme | — | High | Gore (R1+R2), Ozzie endorses, Mellanie endorses | +| C-16 | **(NEW)** Primary contraband fixed per district | — | High | Nigel walks back shuffle, Gore's complicity constrains | +| C-17 | **(NEW)** PC-as-NPC Concept A in v0.1 | — | High | Nigel + Ozzie explicit. ~20-30 items. | +| C-18 | **(NEW)** FRIEND pool v0.1=1, v0.2=2, v0.3=3 | — | High | All 4 converge on phased rollout | +| C-19 | **(NEW)** Anchor line requirement in style guide | — | High | Ozzie (concept), Mellanie (operationalized per tier) | +| C-20 | **(NEW)** Combined style guide document | — | High | Mellanie proposed TOC merging all contributors | + +--- + +## Remaining Open Items + +| # | Item | Waiting On | +|---|------|-----------| +| Q-W03 | Kael/Hael sonic collision | Paula R2, Miri R2 | +| Q-W05 | D-040 existence check | Miri R2 | +| Q-W08 | `global/` vs `_global/` prefix | Tyre R2 | +| Q-W12 | (NEW) THE MIRROR: new pattern vs enhanced Tier 2? | Gore vs Ozzie — needs project lead | +| Q-W13 | (NEW) `cultural_gate` as dialogue modifier — mechanical feasibility? | Gestalt R2, Tyre R2 | +| Q-W14 | (NEW) Seed configuration schema location — content/ or runtime/? | Tyre R2 | +| Q-W15 | (NEW) Sound texture for Krenn culture — quiet social / loud work? | Ozzie asks Miri/Inigo | + +--- + +## Recommended Decisions for Recording (Preliminary) + +Based on Round 2 consensus so far. Will finalize after all 8 responses. + +| ID | Decision | Confidence | Key Supporters | +|----|----------|------------|----------------| +| D-042 | FRIEND pool architecture: pool-based selection, v0.1=1 per character, full Tier 1 minimum, content structured as pool entries from day one | High | Gore, Nigel, Ozzie | +| D-043 | Smuggler knowledge vocabulary: `trust_read`, `exposure_risk`, `loyalty_assessment`, `leverage_held`, `social_debt`, `moral_weight`, `cover_integrity`, `loyalty_conflict` + monologue triggers `moral_pang`, `loyalty_test` + moral arc phases (Comfort→Doubt→Reckoning→Compromise) | High | Gore, Paula (R1), Ozzie, Mellanie, Nigel | +| D-044 | Primary contraband fixed per district, secondary varies per seed | High | Nigel (revised), Gore (constraint) | +| D-045 | PC-as-NPC Concept A in v0.1 (other PC visible as NPC, ~20-30 items) | High | Nigel, Ozzie | +| D-046 | Seed configuration schema (records randomizer decisions at game-start) | Medium-High | Nigel (proposed), needs Tyre validation | +| D-047 | Complicity as named thematic core alongside asymmetric information as mechanic | High | Gore (R1+R2), Ozzie, Mellanie | +| D-048 | Anchor line requirement in NPC style guide (Tier 1: 2+ per phase, Tier 2: 1 minimum) | High | Ozzie (concept), Mellanie (operationalized) | +| D-049 | Combined content style guide document (Mellanie TOC) | High | Mellanie, Paula (R1), Gestalt (R1), Miri (R1) | + +--- + +*88 proposals tracked (62 Round 1 + 26 Round 2). 8 tensions (3 resolved, 2 partially resolved, 3 pending remaining responses). 20 consensus items. 8 preliminary decisions recommended. Awaiting Gestalt, Miri, Tyre, Paula Round 2 responses.* diff --git a/docs/workshops/wiki-review/round2-tyre.md b/docs/workshops/wiki-review/round2-tyre.md new file mode 100644 index 000000000..67a3b1dff --- /dev/null +++ b/docs/workshops/wiki-review/round2-tyre.md @@ -0,0 +1,640 @@ +# Wiki Review Workshop — Round 2: Tyre (Technical Architect) + +Cross-pollination synthesis. Responding to all Round 1 outputs with architectural reconciliation. + +--- + +## 1. Unified Content Directory Structure + +Gestalt proposed `_global/` + `districts/`. I proposed `_meta/` + `_schema/` + `global/` + `districts/`. The structures are 90% aligned. The 10% divergence matters because it signals moddability. + +**The principle:** Underscore prefix = engine infrastructure (modders don't touch). No underscore = game content (modders override freely). Factions, technology, and contraband are game content. Schemas and manifests are infrastructure. + +### Reconciled Structure + +``` +content/ + _meta/ + manifest.yaml # Pack metadata: id, version, dependencies + load-order.yaml # Explicit ordering for multi-pack scenarios + + _schema/ + npc.schema.yaml # Per-type validation (see Section 3) + location.schema.yaml + faction.schema.yaml + template.schema.yaml + fact.schema.yaml + dialogue.schema.yaml + monologue.schema.yaml + district.schema.yaml + pool.schema.yaml # NEW: Pool definition validation + + global/ + factions/ + concord-assembly.yaml + lattice-commission.yaml + syndics.yaml + the-ring.yaml + guardians-of-autonomy.yaml + veil-institute.yaml + the-unbound.yaml + technology/ + neural-lattice.yaml + meridian.yaml + span-gates.yaml + founder-gates.yaml + clone-transfer.yaml + severance-tech.yaml + contraband/ + lattice-components.yaml + medical-grade-replacements.yaml + severance-equipment.yaml + knowledge/ + facts.yaml # All FactId definitions (24 for v0.1) + entity-attributes.yaml # 14 canonical EntityKnowledge keys + relationship-states.yaml # RelationshipState enum reference + enums/ + situations.yaml # 13 situation values (from Gestalt's _global/schema/) + topics.yaml # 9 topic values + moods.yaml # 8 mood values + triggers.yaml # 9 monologue trigger types + access-tiers.yaml # public/peer/insider/authority/hostile + activities.yaml # NEW: canonical routine activity enum + regions/ + krenn-system.yaml # Regional style reference (from Miri's brief) + + districts/ + sova-transit/ + district.yaml # District metadata, location list, faction presence + pools.yaml # NEW: Pool definitions for seed-time selection + npcs/ + kael-davan.yaml + sera-venn.yaml + voss.yaml + lera-sessik.yaml + torek-lintar.yaml + devra.yaml + maret-korr.yaml + resha.yaml + hael.yaml + renn.yaml + pell.yaml + harek.yaml + drin.yaml + sess.yaml + olin.yaml + sabel.yaml + tav.yaml + locations/ + the-terminal.yaml + the-last-shift.yaml + maintenance-corridors.yaml + templates/ + logistics-hub.yaml # Social site: roles, slot counts, NPC assignments + bar.yaml + smuggling-ring.yaml + triangles/ # NEW: Separated from templates (Gestalt's proposal) + hub-power.yaml + worried-knowledge.yaml + bar-tensions.yaml + worried-partner.yaml + informant-question.yaml + lines/ + terminal/ + dialogue.yaml + monologue-smuggler.yaml + monologue-detective.yaml + bar/ + dialogue.yaml + monologue-smuggler.yaml + monologue-detective.yaml + corridor/ + dialogue.yaml + monologue-smuggler.yaml + monologue-detective.yaml +``` + +### What changed from Round 1 + +| Change | Source | Rationale | +|---|---|---| +| `global/enums/` added | Gestalt's `_global/schema/` tag enums | Enum definitions are game content (modders can extend), not schema infrastructure | +| `triangles/` separated from `templates/` | Gestalt's Round 1 structure | Triangles are relationship structures, templates are spatial/social structures. Separation lets mods add triangles without touching templates. | +| `pools.yaml` added | Nigel's `pool_eligible` concept + Gore's FRIEND pool | Seed-time selection needs explicit pool definitions (see Section 2) | +| `global/enums/activities.yaml` added | Gestalt's routine YAML format | Routine `activity` values need a canonical enum (see Section 4) | +| `global/regions/` added | Miri's Krenn brief | Regional style data as engine-readable YAML, not just wiki docs | +| Underscore-prefix convention formalized | Tyre Round 1, refined | Clear signal: `_foo` = infrastructure, `foo` = content | + +### Location shortcodes (Mellanie's dependency) + +Mellanie correctly identified that location shortcodes are ambiguous (`hub` vs `terminal`, `bar` vs `last_shift`). The canonical shortcodes are the directory names under `lines/`: + +| Location | Wiki slug | Content directory | Line ID prefix | Rationale | +|---|---|---|---|---| +| The Terminal (Logistics Hub) | `the-terminal` | `lines/terminal/` | `terminal_` | "Terminal" is what workers call it. Not "hub." | +| The Last Shift (Bar) | `the-last-shift` | `lines/bar/` | `bar_` | "Bar" is the functional category. "Last Shift" is the proper name. Line IDs use function. | +| Maintenance Corridors / B-7 | `maintenance-corridors` | `lines/corridor/` | `corridor_` | Workers call it "B-7" or "the back käik." Line IDs use generic. | + +One name per location. Enforced in schema validation. The monologue guide should be updated to use these consistently — the current `hub_m_010` vs `terminal_m_001` inconsistency is a bug. `terminal_m_` is canonical. + +--- + +## 2. FRIEND Pool + Mod Overlay: Seed-Time Selection + +Gore's principle is correct: THE FRIEND is never procedurally *generated* — but FRIEND *selection* from a pool of authored candidates is the right architecture for replayability. Nigel's `pool_eligible` flag is the mechanism. + +### How it works architecturally + +**`districts/sova-transit/pools.yaml`:** + +```yaml +# Pool definitions for seed-time selection +# Engine draws from these at game start using seeded RNG + +pools: + # THE FRIEND selection — exactly 1 per character per playthrough + friend_smuggler: + description: "Smuggler's Tier 1 FRIEND NPC" + select: 1 + candidates: + - npc: kael-davan # v0.1: only candidate + weight: 1.0 + # v0.2+: additional candidates added here + # - npc: renn + # weight: 1.0 + + friend_detective: + description: "Detective's Tier 1 FRIEND NPC" + select: 1 + candidates: + - npc: sera-venn # v0.1: only candidate + weight: 1.0 + + # Social site population — variable count per seed + bar_regulars: + description: "Regular NPCs present at The Last Shift" + select: 3-5 + required: [torek-lintar] # Always present (triangle dependency) + candidates: + - npc: torek-lintar + weight: 1.0 + - npc: olin + weight: 1.0 + - npc: harek + weight: 0.8 + # Mods add candidates here via MERGE + + # Contraband type (Nigel's moral shuffle) + primary_contraband: + description: "Primary contraband type for this playthrough" + select: 1 + candidates: + - type: lattice-components + weight: 1.0 + # v0.2+: additional types + # - type: medical-grade-replacements + # weight: 0.8 + # - type: severance-equipment + # weight: 0.5 + + # Role assignment (Nigel's network shuffle) + compromised_inspector: + description: "Which NPC is the compromised inspector" + select: 1 + candidates: + - npc: drin + weight: 1.0 + # v0.2+: additional candidates +``` + +### How mods extend pools + +A mod adds candidates via the MERGE mechanic. The mod provides `districts/sova-transit/pools.yaml` with only the pools it extends: + +```yaml +# Mod: jax-the-veteran +# File: districts/sova-transit/pools.yaml +pools: + bar_regulars: + candidates: + - npc: jax-korrenson + weight: 0.8 +``` + +The engine merges this with the base pool definition. `jax-korrenson` is now a candidate for bar regular slots. The `select: 3-5` and `required: [torek-lintar]` from the base remain unchanged. + +### Seed-time resolution + +``` +1. Engine loads all pool definitions (base + DLC + mods, merged) +2. Initialize seeded RNG from game seed +3. For each pool: + a. Include all `required` candidates + b. Draw remaining candidates up to `select` count, weighted by `weight` + c. Non-selected candidates are either: + - Absent from the district (pool_eligible NPCs with no other role) + - Present but demoted to background (if they have non-pool roles) +4. Instantiate selected NPCs with full content +5. Validate: all triangle dependencies satisfied (all triangle members present) +6. If validation fails, re-draw with constraint satisfaction +``` + +### FRIEND pool + content loading implications + +When `friend_smuggler` selects `kael-davan`, the engine loads: +- `npcs/kael-davan.yaml` (full 10-axis Tier 1 data) +- All monologue lines with `subject: kael_davan` as a FRIEND prerequisite +- The specific contradiction arc content + +When (in v0.2+) it selects `renn` instead, it loads Renn's Tier 1 data and Renn's contradiction arc content. **Both sets of content exist on disk simultaneously.** The pool selects which one activates. + +This means content storage is larger than content runtime. A district with 3 FRIEND candidates stores 3x the FRIEND content, but only 1x runs per playthrough. That's cheap — YAML text is tiny. The expensive resource is *authoring time*, not disk space. Gore's point stands: each FRIEND candidate is ~70-100 hand-authored lines. + +### v0.1 scope + +For v0.1, every pool has exactly 1 candidate. No randomization — deterministic. But the pool INFRASTRUCTURE exists. v0.2 adds candidates without restructuring. This follows the D-009/D-010 principle: design for it now, build the simple version. + +**Feasibility: Easy.** Pool definition parsing is a YAML file read. Seed-time selection is a weighted random draw. Constraint validation is a graph check. Total implementation: <0.5 sprint on top of the base content loader. + +--- + +## 3. Schema Validation: Gestalt's Tables as Validators + +Gestalt's hard/soft requirement tables from Round 1 are exactly what I need. Let me map them to the validation pipeline. + +### Gestalt's hard requirements → JSON Schema `required` fields + +| Gestalt requirement | Schema enforcement | +|---|---| +| Routine must specify hourly location presence | `npc.schema.yaml`: `routine.schedule` is `required`, items must have `time`, `location`, `activity` | +| Routine must reference canonical location slugs | Cross-reference validation: `location` value must exist in `districts/{district}/locations/` | +| Every NPC must have `faction` from canonical set | `npc.schema.yaml`: `faction` is `required`, `enum` from `global/enums/factions.yaml` | +| Every NPC must have `role` | `npc.schema.yaml`: `role` is `required`, `type: string` | +| Secret must map to FactId | Cross-reference validation: `secret.fact_id` must exist in `global/knowledge/facts.yaml` | +| Tell must map to `behavior_flags` value | `npc.schema.yaml`: each tell entry requires `flag` field | +| Contradiction must specify `contradiction_flagged` value | Tier 1 conditional: if `tier == 1`, `contradiction.flag` is `required` | +| Relationships must reference existing NPCs | Cross-reference validation: all `npc` references resolve within district | + +### Gestalt's soft requirements → Schema warnings (non-blocking) + +| Gestalt requirement | Validation behavior | +|---|---| +| Personality traits should use established vocabulary | Warning if trait not in `global/enums/personality-traits.yaml` | +| Voice samples should cover 2+ moods | Warning if `voice_sample` array length < tier-minimum | +| Information inventory must distinguish knows/doesn't-know | Warning if `information.knows` or `information.unknown` is empty | +| Contentment should use high/moderate/low vocabulary | Warning if value not in `{high, moderate-high, moderate, moderate-low, low}` | + +### Per-tier validation (Gestalt's checklists) + +Rather than separate schema files per tier, I'd use a single schema with conditional validation: + +```yaml +# _schema/npc.schema.yaml (simplified) +type: object +required: [id, name, tier, role, faction, axes] +properties: + tier: + type: integer + enum: [1, 2, 3] + axes: + type: object + required: [want, routine, personality] # Tier 3 minimum + # Conditional: Tier 2+ requires all 10 axes + # Conditional: Tier 1 requires contradiction arc + +allOf: + - if: + properties: { tier: { const: 2 } } + then: + properties: + axes: + required: [want, secret, relationships, tolerance, routine, + information, contentment, personality, tell, skills] + voice_sample: + minItems: 2 + + - if: + properties: { tier: { const: 1 } } + then: + properties: + axes: + required: [want, secret, relationships, tolerance, routine, + information, contentment, personality, tell, skills] + contradiction: + required: [phases, flag, tell_progression] + voice_sample: + minItems: 5 + dual_lens: + required: [smuggler, detective] +``` + +This is one schema file, tier-aware. The validator reads the `tier` field and applies the right constraints. + +### Implementation cost (revised from Round 1) + +| Component | Effort | Sprint | +|---|---|---| +| Schema definitions (from Gestalt's tables) | 2-3 days | v0.1 | +| Structural validation (`make validate-content`) | 2-3 days | v0.1 | +| Cross-reference validation (FactId, NPC slug resolution) | 3-4 days | v0.2 | +| Per-tier conditional validation | 1-2 days | v0.1 | +| Warning-level soft validation | 1 day | v0.2 | + +**v0.1 total: ~1 sprint.** Structural + tier-conditional validation. Cross-reference validation deferred to v0.2 — for v0.1, the human review catches reference errors (only 17 NPCs, 24 FactIds, manageable). + +**Mellanie's prerequisite validation** (FactId typo detection) lands in the cross-reference sprint. Agreed it's critical — `contraband.ring_exist` vs `contraband.ring_exists` is the kind of bug that wastes hours. But for v0.1, a simple grep-based pre-commit check is cheaper than a full cross-reference validator. I'd do both: grep check in v0.1, schema cross-reference in v0.2. + +--- + +## 4. Routine YAML Format + Cultural Schedule Patterns + +Gestalt's structured routine block is the right format. Miri's cultural brief provides the content vocabulary. Here's how they connect. + +### Gestalt's format, canonicalized + +```yaml +# In npcs/kael-davan.yaml +routine: + schedule: + - time: "06:00-06:30" + location: terminal # Canonical shortcode + activity: shift_startup # Canonical activity enum + - time: "06:30-10:30" + location: terminal + activity: work_freight + - time: "10:30-11:00" + location: terminal + activity: social_break # Renamed from "social_lunch" for generality + - time: "11:00-14:00" + location: terminal + activity: work_freight + - time: "14:30-16:00" + location: bar + activity: social_offshift # The "shift-end" culture pattern (Miri) + - time: "16:00-22:00" + location: residential + activity: home + - time: "22:00-06:00" + location: residential + activity: sleep + deviations: + - trigger: ring_operation + replaces: "22:00-06:00" # Replaces sleep block + schedule: + - time: "22:00-23:30" + location: corridor + activity: ring_operation + - time: "23:30-06:00" + location: residential + activity: sleep + frequency: irregular # Storyteller-controlled +``` + +### Canonical activity enum (`global/enums/activities.yaml`) + +Derived from Gestalt's examples + Miri's cultural patterns: + +```yaml +# global/enums/activities.yaml +activities: + # Work activities + - shift_startup # Arriving, checking in, prep + - work_freight # Core logistics work + - work_maintenance # Maintenance/repair tasks + - work_admin # Office/scheduling work (Maret, Voss) + - work_inspection # Inspection rounds (Drin) + - work_commission # Commission field work (Sera) + + # Social activities + - social_break # On-shift break (lunch, kuum) + - social_offshift # Post-shift bar visit (the "shift-end" pattern) + - social_evening # Evening socializing (card games, conversation) + - social_errand # Off-shift personal tasks + + # Domestic + - home # At residential quarters + - sleep # Sleeping (low interaction priority) + + # Ring activities (deviation-only, never in base schedule) + - ring_operation # Active smuggling work + - ring_meeting # Coordination with ring members + - ring_lookout # Watchpost duty (Tav) + + # Special + - idle # No scheduled activity + - patrol # Security rounds (Harek on duty) +``` + +### How Miri's cultural patterns inform schedule authoring + +Miri's brief describes the **5+2 work cycle** and **shift-end bar migration** as Krenn cultural patterns. These aren't engine data — they're authoring guidance: + +| Cultural pattern | Schedule implication | Authoring rule | +|---|---|---| +| 5+2 work cycle | NPCs work 5 shifts, then 2 off | Routine must define both on-cycle and off-cycle days (v0.2+, when multi-day cycles matter) | +| Shift-end bar migration | After shift, workers go to The Last Shift | Most Tier 2-3 hub NPCs should have `social_offshift` at `bar` | +| Kuum at transitions | Hot drink at shift boundaries | `social_break` activity at shift start/end = where the casual dialogue fires | +| Card game evenings | Kolm at the bar, Harek's regular game | Harek + 2-3 regulars with `social_evening` at `bar` overlapping | + +The cultural brief lives in `global/regions/krenn-system.yaml` as reference data. It doesn't drive the engine directly — it drives the AUTHORS who fill in the routine YAML. + +### Engine consumption + +The `ScheduleSystem` in the Rust server reads the routine YAML as: + +```rust +struct ScheduleEntry { + start_tick: u64, // Converted from time string + end_tick: u64, + location: LocationId, // Resolved from shortcode + activity: Activity, // Enum from activities.yaml +} + +struct NpcSchedule { + base: Vec, + deviations: Vec, +} +``` + +Time strings ("06:00-14:00") are converted to tick ranges at load time using D-031's mapping (10 ticks = 1 game-minute). `location` shortcodes resolve against the district's location registry. `activity` values are validated against the canonical enum. + +**Deviation triggers** (like `ring_operation`) are fired by the storyteller system, not the schedule system. The schedule system just needs to know "when trigger X fires, replace block Y with schedule Z." The storyteller decides *when* to fire the trigger. + +Feasibility: **Straightforward.** This is a data-driven schedule with event-driven overrides. bevy_ecs handles this naturally — `NpcSchedule` is a component, the `ScheduleSystem` runs every tick, checks current time against entries, and moves NPCs. Deviations are applied when the storyteller emits the trigger event. + +--- + +## 5. Wiki Taxonomy + Miri's `canonical_id` + +Miri proposed two things I want to address: `wiki/cultural-groups/` as a new directory, and `canonical_id` in YAML frontmatter for collision-safe cross-referencing. + +### `cultural-groups/` — fits perfectly + +`wiki/cultural-groups/krenn-system.md` is a flat directory. No nesting. Exactly like `factions/`, `technology/`, `contraband/`. This is a new top-level wiki category, not a nesting violation. Add it. + +The wiki index should add: + +```markdown +### Cultural Groups (Regional Style Briefs) +- [Krenn System](cultural-groups/krenn-system.md) — Baltic-Nordic blend, logistics culture +``` + +### `canonical_id` — endorsed with format refinement + +Miri proposed: `canonical_id: krenn.sova.transit.the-terminal`. I'd standardize the format: + +```yaml +# Format: {system}.{station}.{district}.{entity-type}.{slug} +# Examples: +canonical_id: krenn.sova.transit.location.the-terminal +canonical_id: krenn.sova.transit.npc.kael-davan +canonical_id: global.faction.lattice-commission +canonical_id: global.technology.neural-lattice +``` + +Adding the entity type segment prevents collisions between, say, a location and an NPC with the same slug. It also makes the ID self-describing — you can parse the type from the ID without reading the file. + +For the content directory, the canonical_id maps to file paths: + +| `canonical_id` | Content path | +|---|---| +| `krenn.sova.transit.npc.kael-davan` | `content/districts/sova-transit/npcs/kael-davan.yaml` | +| `krenn.sova.transit.location.the-terminal` | `content/districts/sova-transit/locations/the-terminal.yaml` | +| `global.faction.lattice-commission` | `content/global/factions/lattice-commission.yaml` | + +The mapping is derivable — content loader can resolve `canonical_id` to file path and vice versa. Cross-references in content YAML use `canonical_id`, not file paths. This is Miri's proposal, architecturally validated. + +### Miri's deeper nesting — gentle pushback + +Miri's Round 1 shows a wiki structure with 4 levels of spatial nesting: + +``` +wiki/star-systems/krenn/station-sova/sova-transit-district/the-terminal.md +``` + +The current wiki uses 2 levels: `locations/krenn-system/the-terminal.md`. I maintain that 2 levels is the right cap for navigation paths. The `canonical_id` carries the full spatial address — the filesystem doesn't need to. + +**Compromise:** Keep wiki paths at max 2 levels for locations. Use `canonical_id` in frontmatter for full spatial addressing. The wiki index provides the navigational hierarchy through cross-links, not directory depth. This gives Miri's disambiguation without my tab-completion nightmare. + +--- + +## 6. Template Role Slots (Nigel's Request) + +Nigel asked for explicit role slot definitions in social site templates. This is a direct question to me and the answer is: **yes, and here's the spec.** + +### Template role slot definition + +```yaml +# content/districts/sova-transit/templates/bar.yaml +template: + id: bar + name: "The Last Shift" + location: the-last-shift + + role_slots: + owner: + count: 1 + required: true # Must be filled every seed + default: lera-sessik # Base game assignment + staff: + count: 1-2 + required: true + default: [sess] + regular: + count: 3-5 # Variable per seed + required: false + pool: bar_regulars # References pools.yaml + outsider: + count: 0-2 # May or may not appear + required: false + pool: bar_outsiders + + # Triangle integration: which triangles must have all members present + triangle_constraints: + - triangle: bar-tensions + required_members: [lera-sessik, torek-lintar] + # olin can be absent — triangle fires differently without the outsider node +``` + +This tells the engine: "The bar has 1 owner (always Lera), 1-2 staff (always Sess in v0.1), 3-5 regulars drawn from a pool, and 0-2 outsiders drawn from a pool." The randomizer fills slots. Mods extend the pools. + +**Why this matters for mods:** A modder adding Jax doesn't need to know the template internals. They add Jax to the `bar_regulars` pool (via MERGE on `pools.yaml`), and the template's slot system handles placement. The modder never touches `templates/bar.yaml`. + +**Why this matters for replayability:** Different seeds populate the bar differently. Playthrough 1 has Torek, Harek, and Olin as regulars. Playthrough 2 has Torek, Harek, and Jax (mod). Playthrough 3 has Torek and Olin only (smaller bar night). The bar feels alive and different each time. + +--- + +## 7. Paula's Smuggler-Specific Attributes + +Paula identified a real architectural gap: the `EntityKnowledge.known_attributes` vocabulary is detective-biased. Her proposed smuggler attributes are mechanically sound: + +| Key | Values | Engine use | +|---|---|---| +| `operational_reliability` | `reliable`, `compromised`, `wavering` | Smuggler monologue tone, ring operation risk calculation | +| `exposure_risk` | `low`, `escalating`, `critical` | Smuggler stress system, storyteller escalation trigger | +| `loyalty_assessment` | `solid`, `uncertain`, `turning` | Smuggler dialogue access (who to trust with ring talk) | +| `leverage_held` | Free text (e.g., `gambling_debt`) | Smuggler-specific confrontation options | +| `social_debt` | `they_owe_me`, `i_owe_them`, `mutual`, `none` | Social manipulation mechanics | + +**Architecture impact: None.** `known_attributes` is a `BTreeMap` — any key-value pair works. Adding these keys requires zero engine changes. The content schema and monologue prerequisites just reference the new keys. + +**Add these to `global/knowledge/entity-attributes.yaml` and to the wiki's entity-attributes.md.** Total canonical keys goes from 14 to 19. The Rust types don't change — it's all string keys in the BTreeMap. + +Feasibility: **Trivial.** The hardest part is writing the monologue lines that use these as prerequisites — and that's Mellanie's job, not an engine task. + +--- + +## 8. Cross-Cutting: What Needs to Happen + +Summarizing everything into concrete outputs. + +### Decisions to record (new D-entries) + +| ID | Decision | Source | +|---|---|---| +| D-042 | Content directory structure: `_meta/` + `_schema/` + `global/` + `districts/` with underscore = infrastructure, no-underscore = moddable content | Tyre R1/R2 + Gestalt R1, reconciled | +| D-043 | `canonical_id` format: `{system}.{station}.{district}.{type}.{slug}` for collision-safe cross-referencing | Miri R1 + Tyre R2 refinement | +| D-044 | Mod overlay mechanics: ADD (new files), REPLACE (entity definitions), MERGE (pool-type content, deduplicate by ID) | Tyre R1 + Nigel R1 pool integration | +| D-045 | Pool-based seed-time selection: FRIEND, social site population, contraband type, role assignment. `pools.yaml` per district. v0.1 ships with 1 candidate per pool; architecture supports N candidates. | Nigel R1 + Gore R1 + Tyre R2 synthesis | +| D-046 | Schema-per-content-type validation with tier-conditional rules. Structural validation in v0.1, cross-reference validation in v0.2. | Gestalt R1 tables + Tyre R1/R2 implementation | +| D-047 | Template role slots: social site templates declare named slots with count ranges, required flags, and pool references. Modders extend pools, engine fills slots. | Nigel R1 request + Tyre R2 spec | +| D-048 | Canonical location shortcodes: `terminal`, `bar`, `corridor`. One name per location, enforced in schema, used in line ID prefixes. | Mellanie R1 dependency + Tyre R2 formalization | +| D-049 | Smuggler-specific entity attributes added to canonical vocabulary: `operational_reliability`, `exposure_risk`, `loyalty_assessment`, `leverage_held`, `social_debt`. Total canonical keys: 19. | Paula R1 proposal + Tyre R2 validation | + +### Documents to create + +| Document | Owner | Blocks | +|---|---|---| +| `wiki/cultural-groups/krenn-system.md` | Miri | All environmental text authoring | +| Cultural Groups section in `wiki/index.md` | Miri/Qatux | Wiki navigation | +| Location shortcode table | Mellanie/Tyre | All YAML content authoring | +| Freeform tag vocabulary (living list) | Mellanie | Content consistency | +| Environmental text type catalog | Mellanie | v0.1 environmental text authoring | +| Voice cards per playable character | Mellanie | Monologue authoring consistency | +| NPC-format briefs for smuggler + detective PCs | Paula | PC-as-NPC concept | +| Tier 1/2/3 template as standalone style guide | Paula | All future NPC authoring | + +### Amendments to existing wiki pages + +1. **`wiki/index.md`**: Add Cultural Groups section, add Thematic Core section (Gore's proposal) +2. **`wiki/knowledge/entity-attributes.md`**: Add 5 smuggler-specific attribute keys +3. **`wiki/knowledge/fact-catalog.md`**: Add smuggler-perspective progression text for all FactIds where smuggler starts at KnowsDetails +4. **`wiki/authoring/monologue-guide.md`**: Standardize location shortcodes (`terminal_m_` not `hub_m_`); add situation overlap rules, mood exclusivity rules +5. **NPC profiles (all)**: Add canonical full names for single-name NPCs; add `## Thematic Question` to Tier 1 template (Gore) + +### New tickets for SI + +1. Create `_schema/` directory with schema definitions from Gestalt's tables +2. Implement `make validate-content` CLI (structural + tier-conditional) +3. Create `content/` directory skeleton matching the unified structure above +4. Create `pools.yaml` template with v0.1 single-candidate pools +5. Create `global/enums/` YAML files from D-035 enum values +6. Add `global/knowledge/entity-attributes.yaml` with 19 canonical keys (14 existing + 5 smuggler) +7. Create `templates/` YAML files with role slot definitions for 3 social sites +8. Create `triangles/` YAML files for 5 v0.1 triangles +9. Stub NPC profiles for Nils Davan (off-stage, referenced in 5+ profiles) +10. Add pre-commit grep check for FactId typos in YAML content + +--- + +*Tyre out. The architecture converges. The content team now has a concrete spec to write against, and the engine team has a concrete loading pipeline to build. Ready for Qatux to record and SI to ticket.* diff --git a/docs/workshops/wiki-review/round3-gestalt.md b/docs/workshops/wiki-review/round3-gestalt.md new file mode 100644 index 000000000..e72190d26 --- /dev/null +++ b/docs/workshops/wiki-review/round3-gestalt.md @@ -0,0 +1,830 @@ +# Round 3 — Gestalt (Systems Design): Long-Term Content Strategy + +*cracks knuckles* + +Seven questions. All of them are really one question: **What are the systems that make a 20+ district game work without requiring 20x the authoring effort of one district?** + +Let me break down what each of these questions actually means mechanically. + +--- + +## 1. Complicity Is Sova's Flavor. The Master Theme Is "Knowledge as Burden." + +Gore named complicity as the game's theme. He's right about Sova. He's wrong about the whole game — and the reason he's wrong is the reason the game scales. + +### The argument + +Complicity works in Sova because of a specific configuration: +- The smuggler **participates** in something they know is morally ambiguous +- The detective **disrupts** something the community considers normal +- The culture (Krenn privacy norms) makes non-cooperation the default +- The contraband (lattice components) serves genuine needs + +Change ANY of those variables and complicity stops being the right word. Consider: + +| District Type | What You Know | What It Costs You | The Right Word | +|---|---|---|---| +| Logistics hub (Sova) | You're part of the operation | Guilt, eroding relationships | **Complicity** | +| Political capital | Your ally is betraying your faction | Broken loyalty, political death | **Loyalty** | +| Frontier settlement | Someone is dying and only you know | Moral obligation vs. survival | **Duty** | +| Research station | Your identity is being rewritten | Loss of self, gain of power | **Identity** | +| Trade nexus | You can profit from others' suffering | Greed vs. empathy | **Greed** | +| Refugee district | You can save some but not all | Triage, survivor's guilt | **Sacrifice** | +| Military outpost | Your orders are wrong and you know it | Obedience vs. conscience | **Authority** | + +Every single one of these is a variation on the same mechanical core: **you know something, and knowing it changes you. The knowledge is a burden. What you do with it defines who you become.** + +### The framework + +**Master theme:** Knowledge as burden. + +**Master mechanic:** Asymmetric information (D-005 — this was always the answer). + +**Per-district moral texture:** Each district explores a specific facet of what knowledge costs. + +This isn't just thematic variety for its own sake. It's mechanically load-bearing: + +1. **Different moral textures produce different player decisions.** In Sova, the smuggler's key decisions are about protecting vs. exposing. In a loyalty-textured district, the key decisions are about betraying vs. enabling. Same decision architecture (fork + consequences), different emotional weight. The systems don't change — the content changes. + +2. **Different moral textures demand different monologue vocabularies.** The smuggler's `moral_pang` trigger works for complicity. A loyalty district needs `loyalty_fracture`. An authority district needs `conscience_objection`. Same trigger system, different named instances. The engine doesn't care what the trigger is called — it fires when conditions are met. + +3. **Different moral textures create replay variety at the thematic level.** Two players who both played smuggler-type characters in different districts had mechanically similar experiences (managing a dual life, navigating risk, protecting relationships) but emotionally different ones. The replay isn't just "different NPCs" — it's "different questions." + +### What this means for systems design + +The per-district moral texture is NOT a flavor field in a config file. It's an **emergent property of the specific configuration of NPCs, triangles, contraband, cultural norms, and access tier profiles** in that district. The designer doesn't write `moral_texture: complicity`. They design a district where: +- The smuggler's FRIEND is hiding something that protects someone +- The detective's investigation harms people who don't deserve it +- The cultural norms make non-cooperation virtuous +- The contraband serves genuine needs + +And the PLAYER experiences that configuration as complicity. Another district where: +- The politician's FRIEND is secretly working for a rival faction +- The detective's investigation reveals that both sides are justified +- The cultural norms prize loyalty above truth +- The contested resource is political power, not goods + +...produces a loyalty texture. Same systems. Different content. Different feeling. + +**Decision proposal (D-WR-11):** The Settled Reach's master theme is "knowledge as burden" — asymmetric information is the mechanic, the cost of knowing is the experience. Each district explores a local moral texture (complicity, loyalty, duty, identity, etc.) through the same systemic framework. No district's theme is prescribed mechanically — it emerges from content configuration. + +--- + +## 2. Cultural Groups at Scale: 6-8 Heritage Clusters, Mechanically Distinct + +### Why culture matters mechanically + +Miri's Krenn brief proved that culture isn't decoration — it's a game system. The Nordic-Baltic privacy norms ARE the difficulty gradient for the detective. The labor solidarity norms ARE the smuggler's camouflage. Culture determines: + +| System | Cultural Input | Mechanical Output | +|---|---|---| +| Dialogue access tiers | Privacy norms, authority attitudes | How hard it is to reach `peer` / `insider` | +| NPC disclosure behavior | Information-sharing customs | What NPCs volunteer vs. withhold | +| Tell visibility | Behavioral norms | What counts as "unusual" in this community | +| Investigation strategy | Cooperation patterns | Whether the detective can find allies | +| Cover viability | In-group/out-group markers | How easily the smuggler blends in | +| Social site dynamics | Gathering patterns, leisure norms | Where and when NPCs are observable | + +Each cultural group produces a DISTINCT ACCESS TIER PROFILE — a mechanically different experience of the same systems. This is the constraint that determines how many we need. + +### The cultural map + +I'd propose **6-8 heritage clusters** for the full game. Each must be mechanically distinct along the axes above. + +| # | Heritage Cluster | Cultural DNA | Mechanical Signature | Access Tier Profile | +|---|---|---|---|---| +| 1 | **Nordic-Baltic** (Krenn) | Finnish/Estonian/Latvian/Norwegian drift | Privacy-default, labor solidarity, institutional distrust | Hard outsider wall. `peer` requires months. `authority` gets compliance but zero information. | +| 2 | **Mediterranean-Near Eastern** | Greek/Turkish/Lebanese drift | Hospitality-default, honor networks, generosity-as-status | Easy initial warmth (fast `peer`), but deep trust is family-only. Gossip flows freely — too freely. Information hides in noise. | +| 3 | **East Asian** | Japanese/Korean/Vietnamese drift | Hierarchical respect, obligation networks, face-saving | `authority` gets deference but performative cooperation. Real information flows through obligation chains, not direct questioning. The detective must EARN an obligation. | +| 4 | **West African** | Yoruba/Akan/Wolof drift | Communal decision-making, storytelling tradition, elder-respect | Information flows freely through communal events but is couched in story and metaphor. Direct questions are rude. The detective must learn to LISTEN. | +| 5 | **Latin American** | Brazilian/Colombian/Mexican drift | Personal warmth, patron-client dynamics, familismo | Warm to strangers, but loyalty runs through patronage networks. The detective is a PERSON first, an authority second. Cooperation is personal, never institutional. | +| 6 | **Slavic-Central European** | Russian/Polish/Czech drift | Institutional cynicism, dual economy, black humor | Everyone assumes the system is corrupt. `authority` is treated with open cynicism. The grey economy is not hidden — it's simply not discussed with anyone who might be naive enough to object. | +| 7 | **South Asian** | Indian/Pakistani/Sri Lankan drift | Community gatekeepers, code-switching, stratified access | Access is mediated through gatekeepers (elders, community leaders). The detective can't access individuals directly — must go through the gatekeeper. The gatekeeper's agenda shapes all information. | +| 8 | **Blended/Cosmopolitan** | Multi-heritage convergence | No dominant norm, transactional relationships, individualism | No cultural immune system. Information is freely available but untrustworthy. Everyone's performing. The challenge isn't ACCESS — it's VERIFICATION. | + +### Why 6-8, not 20 + +**Simple rules, complex outcomes.** 6-8 heritage clusters with blending produces dozens of EXPERIENCED cultures: +- Pure Cluster 1 (Nordic-Baltic station, like Sova) +- Cluster 1 + Cluster 6 blend (Nordic-Baltic founded, Slavic immigration wave) +- Cluster 3 dominant, Cluster 8 cosmopolitan overlay (East Asian core station with a trade district) +- Cluster 2 + Cluster 5 blend (Mediterranean-Latin fusion in a warm-climate colony) + +Each blend creates a NEW access tier profile by interpolating between parent clusters. A Nordic-Baltic + Slavic blend might have the privacy norms of Cluster 1 but the institutional cynicism of Cluster 6 — meaning the detective faces both a cultural wall AND open mockery when they invoke Commission authority. + +### Distribution + +Not every system gets a unique culture. Multiple systems can share a heritage cluster (like multiple Nordic-Baltic settled systems with Krenn-like norms). The full game's cultural map might look like: + +| Heritage Cluster | # of Systems | Notes | +|---|---|---| +| Nordic-Baltic | 3-4 | Founding-era settlement belt | +| Mediterranean-Near Eastern | 2-3 | Trade corridor systems | +| East Asian | 2-3 | Industrial core systems | +| West African | 1-2 | Agricultural/frontier | +| Latin American | 2-3 | Mid-Reach settlement wave | +| Slavic-Central European | 2-3 | Outer Reach mining/industrial | +| South Asian | 1-2 | Administrative/political centers | +| Cosmopolitan | 3-5 | Capital systems, trade hubs, crossroads | + +**~20-25 systems across 6-8 clusters.** Each system has 1-4 districts. Each district = 1 content pack. The cultural cluster determines the access tier profile, naming conventions, substrate vocabulary, social norms. Content authors reference the regional brief for their cluster. + +### The authoring constraint + +Each cultural cluster requires ONE Miri-quality regional brief (~the Krenn System brief). 6-8 briefs total. Each brief includes: +- Heritage lineage and drift patterns +- Naming conventions (phonological rules, surname patterns) +- Substrate vocabulary (10-15 heritage words) +- Social norms (5-6 key behavioral expectations) +- Access tier cultural profile (how the 5 tiers work in this culture) +- Food/drink/leisure patterns +- Authority attitudes + +After the 6-8 briefs exist, every NEW district in that cluster references the brief. Authors don't reinvent the cultural wheel — they apply the brief to a specific location. This is how culture scales: author the pattern once, instantiate it many times. + +**Decision proposal (D-WR-12):** The Settled Reach has 6-8 heritage clusters, each with a Miri-quality regional brief. Heritage clusters are mechanically load-bearing (access tier profiles, NPC disclosure patterns, investigation strategy). Districts reference their cluster's brief for cultural grounding. Blended districts interpolate between parent clusters. + +--- + +## 3. Content Patterns That Scale: The Universal Skeleton + Variable Flesh + +### Which patterns are universal? + +Let me map every content pattern we've designed and classify it: + +| Pattern | Universal? | What Varies? | +|---|---|---| +| **Social site / functional cluster** (D-025) | YES — every district has them | Count (2-6), size (4-12 NPCs), type (workplace, social, residential, commercial, institutional) | +| **Triangles** | YES — every social site has 1-3 | Triangle type (power, loyalty, knowledge, romantic, economic), specific tension | +| **Three-tier content model** (D-023) | YES — always Tier 1/2/3 | Tier counts scale with district size | +| **THE FRIEND** | YES — every PC archetype gets one per district | What they're hiding varies with district moral texture | +| **Tagged line pools + 4-layer selection** (D-028/D-035) | YES — universal dialogue architecture | Tag vocabularies may expand per district | +| **Routine system** | YES — NPC schedules everywhere | Cultural work patterns vary per cluster | +| **Population entanglement ratio** (D-029) | YES — 30/50/20 is a guideline | Exact ratio varies per district type and seed | +| **THE MIRROR** (Gore R2) | RECOMMENDED but not required | Some districts benefit more than others | +| **Dual-lens content** | YES for districts with 2+ archetypes | Single-archetype districts don't need it | +| **FRIEND pool** | YES — architecture always supports it | Pool size varies per district maturity | +| **Contraband type** | NO — varies by district economy | Some districts have no smuggling at all | +| **Ring structure** | NO — some districts have no criminal operation | The ADVERSARIAL STRUCTURE is universal; its form varies | + +### The critical generalization: adversarial structures + +Sova has a smuggling ring. Not every district will. But every district needs an **adversarial structure** — a hidden network of relationships and activities that one PC archetype knows about and another must discover. + +| District Type | Adversarial Structure | Insider Archetype | Investigator Archetype | +|---|---|---|---| +| Logistics hub | Smuggling ring | Smuggler | Detective | +| Political capital | Faction conspiracy | Politician | Intelligence operative | +| Research station | Unauthorized experiment | Researcher | Ethics investigator | +| Military outpost | Mutiny plot | Dissenting officer | Loyalty investigator | +| Trade nexus | Price-fixing cartel | Merchant | Economic regulator | +| Refugee district | Underground railroad | Smuggler variant | Border enforcement | +| Cultural enclave | Preservation network | Cultural insider | Assimilation enforcer | + +The pattern: there's always a **hidden network** and there's always someone whose job is to find it. The insider BELONGS to it. The investigator STUDIES it. The information asymmetry between them IS the game. + +This means the Sova patterns generalize as follows: + +| Sova-Specific | Generalized Pattern | +|---|---| +| The Ring | The Hidden Network (whatever shape it takes) | +| Ring operations | Network activities (smuggling, conspiring, experimenting, plotting) | +| Contraband | The Contested Resource (goods, power, knowledge, identity, freedom) | +| Commission regulation | The Institutional Framework (whatever authority the network defies) | +| Detective investigation | Observer Investigation (any archetype that discovers) | +| Smuggler cover management | Insider Risk Management (any archetype that hides) | +| Complicity moral texture | Local Moral Texture (whatever knowledge costs in this place) | + +### The structural template for a district + +Every district, regardless of setting, follows this skeleton: + +``` +DISTRICT SKELETON +├── 2-6 Social Sites (functional clusters, 4-12 NPCs each) +│ ├── 1-3 Triangles per social site +│ ├── Physical space with sightlines + overhearing zones +│ └── Bridge NPCs connecting to other social sites +├── 1 Hidden Network (adversarial structure) +│ ├── 3-8 network members across social sites +│ ├── 1 coordinator (Devra-equivalent) +│ ├── 1 external connection (Sabel-equivalent) +│ └── Network activities that deviate from base routines +├── 1 FRIEND per supported PC archetype +│ ├── Tier 1 depth, full contradiction arc +│ ├── Connected to the hidden network (directly or indirectly) +│ └── Discovery produces moral reckoning, not just information +├── 0-1 MIRROR per district (recommended) +│ ├── Honest character, no secret +│ └── Their transparency reveals everyone else's dishonesty +├── 1 Cultural Group reference (heritage cluster brief) +│ ├── Access tier profile +│ ├── Naming conventions +│ └── Substrate vocabulary +├── 1 Local Moral Texture (emergent from configuration) +│ ├── What knowledge costs in this place +│ └── What the player's key decisions feel like +├── 2-4 Supported PC Archetypes +│ ├── 1 insider archetype (belongs to the hidden network) +│ ├── 1 investigator archetype (seeks to understand the network) +│ └── 0-2 additional archetypes (affected bystander, rival network, etc.) +├── 1 Contested Resource (what the network moves/controls/protects) +│ ├── Culturally grounded (why this resource matters HERE) +│ └── Morally ambiguous (the network isn't pure evil) +└── Environmental Text + ├── Location-specific (signs, menus, graffiti) + ├── News ticker headlines (Reach-wide + local) + └── Cultural artifacts (food, slang, customs) +``` + +This skeleton is **the repeatable unit of content creation**. Every new district instantiates it with different flesh. The systems code works identically against every instantiation. + +### Where the structure itself can vary + +The skeleton above is the MINIMUM. Some districts may have additional patterns: + +- **Multi-network districts:** A trade nexus might have TWO hidden networks (smuggling ring + price-fixing cartel) that overlap. NPCs might belong to both. This creates a third investigative dimension. +- **Network-free districts:** A quiet residential district with no hidden network — just mundane triangles, life-sim substrate, and a FRIEND whose contradiction is personal (infidelity, debt, illness) rather than criminal. These districts serve as contrast — the "is this enough?" question is literal. +- **Hub districts:** A major political or commercial center with 6+ social sites, 25+ NPCs, and multiple overlapping adversarial structures. These are premium content — expensive to author, but they're the centerpiece locations. +- **Transitional districts:** Small districts (1-2 social sites, 8-10 NPCs) that serve as connective tissue between larger districts. The player passes through on their way somewhere else — but something catches their eye. + +**Decision proposal (D-WR-13):** The district skeleton (social sites + hidden network + FRIEND + cultural group + moral texture + PC archetypes + contested resource) is the universal content template. All districts instantiate this skeleton. The skeleton's size varies (2-6 social sites, 15-40 NPCs) but its structure is consistent. + +--- + +## 4. The Content Directory as a Platform + +### The hierarchy at scale + +The Round 2 converged structure works for one district. At scale, it needs a system level: + +``` +content/ + _meta/ + manifest.yaml # Game-level metadata + load-order.yaml # Content pack ordering + + _schema/ + (per-type validation schemas — unchanged from R2) + + global/ + factions/ # Reach-wide factions + technology/ # Technology definitions + knowledge/ # FactId definitions, entity attributes + enums/ # Tag vocabularies (situations, moods, etc.) + archetypes/ # PC archetype definitions (NEW) + smuggler.yaml # Archetype: starting access, agency, perception + detective.yaml + politician.yaml + guardian.yaml + merchant.yaml + civilian.yaml + patterns/ # Reusable content patterns (NEW) + friend.pattern.yaml # THE FRIEND pattern requirements + mirror.pattern.yaml # THE MIRROR pattern requirements + hidden-network.pattern.yaml # Adversarial structure requirements + triangle.pattern.yaml # Triangle structure requirements + + regions/ # Heritage cluster briefs (NEW — promoted from global/) + nordic-baltic.yaml # Cluster 1 (Krenn, etc.) + mediterranean.yaml # Cluster 2 + east-asian.yaml # Cluster 3 + west-african.yaml # Cluster 4 + latin-american.yaml # Cluster 5 + slavic-central.yaml # Cluster 6 + south-asian.yaml # Cluster 7 + cosmopolitan.yaml # Cluster 8 + + systems/ # Star systems (NEW level) + krenn/ + system.yaml # System metadata, wormhole connections + districts/ + sova-transit/ + (existing R2 structure: district.yaml, pools.yaml, + npcs/, locations/, templates/, triangles/, lines/) + sova-residential/ # Second district on same station + ... + krenn-prime-port/ # Planet-side district + ... + tavros/ + system.yaml + districts/ + tavros-exchange/ # Trade district + ... + (etc.) +``` + +### Key changes from Round 2 + +| Change | Rationale | +|---|---| +| `regions/` promoted to top-level | Heritage clusters are game-wide reference data, not district content. A region is referenced by MANY districts. | +| `global/archetypes/` added | PC archetype definitions are global — the smuggler archetype exists independently of any district. Each district declares which archetypes it supports. | +| `global/patterns/` added | Reusable content pattern definitions (FRIEND, MIRROR, hidden network, triangle) as formal schema/requirement docs. District content is validated against these. | +| `systems/` level added above `districts/` | Star systems group districts. Wormhole connections are system-level data. A content pack can be one system (containing multiple districts). | + +### Content packs, DLC, and mods + +The platform architecture must support three content delivery models: + +**1. Core content packs (shipped with the game)** +```yaml +# content/_meta/manifest.yaml +packs: + - id: core + districts: [krenn/sova-transit, krenn/sova-residential, ...] + version: 1.0 +``` + +**2. DLC packs (official expansion content)** +```yaml +# dlc/tavros-exchange/_meta/manifest.yaml +pack: + id: tavros-exchange + type: dlc + requires: [core >= 1.0] + adds: + systems: [tavros] + districts: [tavros/tavros-exchange] + archetypes: [merchant] # New PC archetype + factions: [syndic-guild] # New faction +``` + +**3. Mod packs (community content)** +```yaml +# mods/jax-veteran/_meta/manifest.yaml +pack: + id: jax-veteran + type: mod + requires: [core >= 1.0] + extends: + districts: [krenn/sova-transit] + adds: + npcs: [jax-korrenson] + merges: + pools: [bar_regulars] + lines: [bar/dialogue] +``` + +### Content pack isolation + +Each content pack is a self-contained directory tree that follows the same structure as the core. The engine merges them at load time using the R2 overlay rules (ADD/REPLACE/MERGE). The key constraint: **a content pack never modifies files in another pack's directory**. It provides its own files that the merge system combines. + +This means: +- DLC districts are fully self-contained (own NPCs, lines, templates) +- DLC can ADD new archetypes, factions, cultural groups +- Mods can EXTEND existing districts (add NPCs to pools, add dialogue lines) +- Mods can REPLACE existing content (swap an NPC, change a routine) +- Nothing breaks if a mod is removed — the merge system gracefully degrades + +### Cross-district references + +At scale, content must reference entities in other districts: +- An NPC in District A has a sibling in District B +- A faction spans multiple systems +- A wormhole connects two districts +- A news ticker headline references events in another system + +These cross-references use the `canonical_id` system (Miri/Tyre R2): +```yaml +# In krenn/sova-transit/npcs/sabel.yaml +relationships: + - npc: tavros.exchange.npc.sabel-partner # Cross-district reference + type: "business associate" +``` + +The engine resolves `canonical_id` to file path at load time. Missing references (because a DLC isn't installed) are handled gracefully — the relationship exists in the data but the referenced NPC doesn't render. + +**Decision proposal (D-WR-14):** The content directory supports three delivery models (core, DLC, mod) through a pack manifest system. Content packs are self-contained directory trees merged at load time. Cross-district references use `canonical_id`. Missing references degrade gracefully. + +--- + +## 5. Randomization Philosophy: Randomize Context, Author Content + +### The principle + +At Sova scale, Nigel identified three randomization axes (FRIEND pool, contraband type, who's compromised). At full game scale, the number of potential axes is much larger. We need a PHILOSOPHY, not a list. + +**The philosophy: randomize the CONTEXT, author the CONTENT.** + +| Layer | Authored or Randomized | Examples | +|---|---|---| +| The specific line of dialogue | AUTHORED | "There you are. Good — I was starting to worry." | +| The tell behavior | AUTHORED | "Looks left when lying" | +| The contradiction arc | AUTHORED | 5 phases, each with specific authored beats | +| The cultural norms | AUTHORED | Krenn privacy-default, labor solidarity | +| Which NPC delivers that line | RANDOMIZED (pool selection) | Kael or Renn as FRIEND | +| Which NPC has which role | RANDOMIZED (role-slot assignment) | Drin or Maret as compromised inspector | +| Which contraband is in the crates | RANDOMIZED (per-seed) | Lattice components or medical-grade | +| Which triangles are active | PARTIALLY RANDOMIZED | Core triangles always; optional triangles per seed | +| Evidence locations | RANDOMIZED | Dead drop in B-7 or B-12 | +| NPC routine micro-variations | RANDOMIZED | Break at 10:30 or 10:45 | + +### The four randomization tiers + +At full scale, I see four distinct tiers of randomization, each with different rules: + +**Tier S: Structural randomization (set at game creation, never changes)** + +These define the shape of the playthrough. They create the "two friends compare notes and played different games" experience. + +| Axis | What Varies | Constraint | +|---|---|---| +| FRIEND selection | Which NPC is your FRIEND in each district | Pool of Tier 1 authored candidates; minimum 2 per archetype per district | +| PC archetype identity | Which specific NPC you ARE (within archetype) | Pool of authored PC candidates per archetype | +| Hidden network membership | Which NPCs are in the network | Constrained by role requirements (need coordinator, courier, etc.) | +| Contested resource type | What the network moves/controls | Must match district cultural grounding | +| Inter-system connections | Which wormhole routes are active | Graph connectivity must allow progression | +| Faction power balance | Which faction dominates which system | Must create tension, not uniformity | + +**Tier D: Dramatic randomization (storyteller-controlled, changes during play)** + +These are the storyteller's levers. Nigel's "dramatic randomness." + +| Axis | What Varies | Constraint | +|---|---|---| +| Escalation timing | When pressures increase | Pacing algorithm (D-005's Rimworld-style storyteller) | +| NPC cracking | Who breaks under pressure first | Weighted by tolerance threshold + accumulated stress | +| Evidence availability | When clues become observable | Must follow the observe→notice→follow→discover sequence | +| Environmental events | Ventilation breaks, supply disruptions, social events | Provide texture and alibi opportunities | +| News ticker content | Which headlines appear | Pool of authored headlines, drawn per cycle | + +**Tier L: Local randomization (per-session micro-variation)** + +These make each play session feel slightly different even on the same seed. + +| Axis | What Varies | Constraint | +|---|---|---| +| NPC routine micro-timing | Exact arrival/departure within windows | ±10 minutes from scheduled time | +| Dialogue line selection | Which valid line from the pool fires | Weighted by mood + topic match + variety tracking | +| Social site population | Who's at the bar right now | Base on schedule + micro-timing + small random absence chance | +| Environmental details | Which graffiti is visible, which headline scrolls | Pool selection, changes per visit | + +**Tier M: Meta-randomization (per-NEW-GAME variation across multiple playthroughs)** + +These are the axes that make the GAME different, not just the session. + +| Axis | What Varies | Constraint | +|---|---|---| +| Starting district | Where the player begins | Must match archetype (smuggler starts in logistics districts) | +| Which districts exist | Procedural system/district generation at game scale | Core districts are fixed; procedural districts fill gaps | +| Cultural blending | Which heritage clusters are present in each system | Must be historically coherent per the setting | +| Reach-wide events | What's happening in the larger political landscape | Storyteller-driven macro events that affect all districts | + +### New randomization axes at full scale + +Beyond Nigel's Sova-specific axes, the full game adds: + +1. **Wormhole topology:** Which systems connect to which. This shapes trade routes, which shapes smuggling routes, which shapes where the player encounters hidden networks. Different topologies create different strategic landscapes. + +2. **Faction ascendancy:** Which faction is dominant in which system. A Commission-dominated system has heavy regulation and lots of contraband opportunity. A Syndic-dominated system has a corporate monopoly and worker resistance. Different power configurations produce different adversarial structures. + +3. **Technology availability gradient:** Which lattice tiers, which perception modes, which tools are available where. Frontier systems have basic tech. Core systems have advanced capabilities. This affects gameplay strategy AND the player's observational capacity. + +4. **Diaspora patterns:** Which cultural groups have migrated where over 200+ years. A second-wave Nordic-Baltic settlement on a predominantly East Asian station creates a blended culture with unique access tier dynamics. These patterns are set at game creation and shape the social landscape. + +5. **Historical events:** Per-seed selection of which founding-era events happened. "Talvik promised us quarters by '98" is Sova-specific. Each district has 2-3 historical grievances/triumphs drawn from a pool, expressed through environmental text and NPC attitudes. + +### The anti-randomization constraint + +Not everything should vary. Some things MUST be fixed for the game to cohere: + +- **The setting's core technology** (lattice, Meridian, span gates, founder gates) is fixed +- **The faction list** is fixed (though their local power varies) +- **The cultural cluster definitions** are fixed (though their distribution varies) +- **The content patterns** (FRIEND, MIRROR, hidden network, triangles) are fixed +- **The master theme** (knowledge as burden) is fixed +- **The master mechanic** (asymmetric information) is fixed + +These are the INVARIANTS. Everything else is a variable. The game is defined by its invariants; its replay value comes from its variables. + +**Decision proposal (D-WR-15):** Randomization philosophy: "randomize context, author content." Four tiers: Structural (game creation), Dramatic (storyteller), Local (per-session), Meta (per-new-game). Authored content (lines, arcs, tells, cultural norms) is never generated at runtime. Randomization selects which authored content is active and how it's configured. + +--- + +## 6. PC Archetypes at Full Scale + +### How many archetypes? + +The smuggler and detective are two sides of the same adversarial coin: insider vs. investigator. At full scale, the game needs enough archetypes to support different adversarial structures AND different player fantasies. + +Let me map the archetypes to what they actually DO mechanically: + +| Archetype | Information Position | Core Mechanic | Fantasy | +|---|---|---|---| +| **Smuggler** | Insider (knows the network) | Risk management, dual-life navigation | "I'm part of something dangerous and I can't stop" | +| **Detective** | Outsider (discovers the network) | Pattern recognition, social investigation | "Something's wrong here and I'll find out what" | +| **Politician** | Meta (knows the power dynamics) | Faction navigation, deal-making | "Everyone owes me something and I owe everyone" | +| **Guardian** | Counter (knows the surveillance) | Evasion, counter-intelligence | "They're watching everything and I'm invisible" | +| **Merchant** | Parallel (knows the economics) | Trade optimization, moral arbitrage | "I know what everything costs, including my soul" | +| **Civilian** | Blank (knows nothing at start) | Discovery, adaptation, survival | "I was just living my life until it all went wrong" | + +**Six archetypes.** Each produces a fundamentally different information asymmetry experience through the same systems. + +### Not every district supports every archetype + +The key insight: archetype availability is a PER-DISTRICT property, not a global one. This is how content scales without requiring 6x everything. + +| District Type | Supported Archetypes | Why | +|---|---|---| +| Logistics hub (Sova) | Smuggler, Detective, Civilian | The hidden network is a smuggling ring | +| Political capital | Politician, Detective, Guardian | The hidden network is a faction conspiracy | +| Research station | Merchant (tech trader), Detective, Civilian | The hidden network is unauthorized research | +| Trade nexus | Merchant, Smuggler, Detective | Multiple hidden networks overlap | +| Frontier settlement | Smuggler, Guardian, Civilian | The hidden network is a resistance movement | +| Military outpost | Guardian, Detective, Civilian | The hidden network is a mutiny plot | + +**Most districts support 2-3 archetypes.** The MINIMUM is 2 (one insider, one investigator — the adversarial pair). Premium districts support 3-4 for richer replayability. + +### The adversarial pair principle + +Every district must have at least one **adversarial pair** — two archetypes that see the same world from opposing information positions. + +| Adversarial Pair | Insider | Investigator | The Tension | +|---|---|---|---| +| Smuggler / Detective | Knows the ring | Discovers the ring | Complicity vs. justice | +| Politician / Intelligence | Knows the conspiracy | Uncovers the conspiracy | Loyalty vs. truth | +| Guardian / Security | Knows the surveillance gaps | Closes the surveillance gaps | Freedom vs. order | +| Merchant / Regulator | Knows the market | Polices the market | Profit vs. fairness | + +The adversarial pair is what makes the dual-lens work. The insider's home is the investigator's crime scene. Same NPCs, same social sites, different access tiers, different monologue voices, different moral textures. + +### The per-archetype authoring cost + +Each archetype in a district requires: + +| Component | Lines/Effort | Notes | +|---|---|---| +| PC-candidate NPC profile | 2 wiki pages | Standard NPC + PC appendix (B1-B7 from Paula R2) | +| Starting knowledge graph | 1 YAML file | FactId confidence table | +| Starting relationship map | 1 YAML section | Forward + reverse knowledge per known NPC | +| Orientation monologue | 5-8 lines | "First 60 seconds" content | +| Character-specific monologue pool | 30-50 lines per district | Separate pool per character (D-032) | +| Agency boundaries | 1 YAML section | What the PC can/can't do | +| Voice card | 1 page | How this archetype thinks/speaks | + +For a district with 3 supported archetypes: ~3 PC profiles + ~90-150 monologue lines + supporting YAML. That's significant but bounded. + +### The archetype-as-framework pattern + +Here's the scaling trick: **archetype definitions are global, archetype INSTANCES are local.** + +The smuggler archetype is defined once in `global/archetypes/smuggler.yaml`: +```yaml +archetype: + id: smuggler + information_position: insider + default_access_tiers: + network_members: insider + community_members: peer + institutional_figures: authority # they have authority over you + strangers: public + core_mechanic: risk_management + monologue_voice: relational # thinks in people, not patterns + perception_modes: [natural, social_awareness] + moral_arc_type: complicity # default, can be overridden per district +``` + +Each district that supports the smuggler archetype provides a LOCAL INSTANCE: +```yaml +# In systems/krenn/districts/sova-transit/archetypes/smuggler.yaml +archetype_instance: + archetype: smuggler + pc_candidates: [kael-davan-smuggler-pc] # Which NPCs can be this archetype + local_override: + moral_arc_type: complicity # matches default for Sova + cultural_voice: krenn # uses Krenn substrate vocabulary + network_role: logistics # smuggler's function in this specific ring +``` + +This separation means: +- Adding a new archetype to an existing district = adding one instance file + monologue pool + PC candidate +- Modders can add archetype support to districts without touching the archetype definition +- Different districts can customize the same archetype (a smuggler in Sova feels different from a smuggler in a frontier settlement) + +**Decision proposal (D-WR-16):** The Settled Reach supports 6 PC archetypes (Smuggler, Detective, Politician, Guardian, Merchant, Civilian). Each district supports 2-4 archetypes, with a mandatory adversarial pair (insider + investigator). Archetype definitions are global; archetype instances are per-district. + +--- + +## 7. The Authoring Pipeline at Scale: Districts as Production Units + +### The numbers + +Let me be honest about what "full game" means in content terms. + +**Assumptions:** +- 20-25 star systems +- 1-4 districts per system (some systems have one major station, others have multiple locations) +- ~50 total districts +- ~15-20 NPCs per district average (smaller districts: 10, larger: 30+) +- ~750-1,000 total NPCs + +**Content volume per tier:** + +| Tier | NPCs per District | Total (50 districts) | Authored Lines per NPC | Total Authored Lines | +|---|---|---|---|---| +| Tier 1 (FRIEND/MIRROR) | 2-4 | 100-200 | 70-100 | 7,000-20,000 | +| Tier 2 (working profile) | 8-12 | 400-600 | 15-20 (+ 4x gen) | 6,000-12,000 | +| Tier 3 (sketch) | 5-10 | 250-500 | 5-10 | 1,250-5,000 | +| **Totals** | 15-26 | 750-1,300 | | **14,250-37,000 authored** | + +Plus: +- **Monologue pools:** 30-50 lines per archetype per district × 2-3 archetypes × 50 districts = 3,000-7,500 monologue lines +- **Environmental text:** 20-40 items per district × 50 districts = 1,000-2,000 environmental text items +- **News ticker:** 15-20 headlines per district × 50 districts = 750-1,000 ticker headlines + +**Total authored content: ~20,000-50,000 unique text items.** That's a LOT. But it's spread across the full game's lifecycle (years of development + DLC). And a significant portion is generation-expandable. + +### The production pipeline + +Districts are the **unit of production**. Each district goes through a consistent pipeline: + +``` +DISTRICT PRODUCTION PIPELINE + +Phase 1: DESIGN (1 week) +├── District concept: moral texture, adversarial structure, cultural group +├── Social site definitions: count, type, size, physical layout +├── Triangle design: 3-6 triangles with tension types +├── NPC role slots: who is needed (FRIEND, coordinator, bridge, etc.) +├── PC archetype assignments: which archetypes, adversarial pair +└── Output: district.yaml + template files + triangle files + +Phase 2: POPULATION (1-2 weeks) +├── NPC generation: names (from cultural brief), personalities, routines +├── Tier assignment: which NPCs are Tier 1/2/3 +├── Relationship mapping: who knows whom, what they know +├── Hidden network design: membership, activities, contradiction hooks +└── Output: NPC YAML files (all tiers) + +Phase 3: TIER 1 AUTHORING (2-3 weeks) +├── FRIEND profiles: full 10-axis, contradiction arc, tell progression +├── MIRROR profiles (if applicable): emotional arc, vulnerability map +├── PC-candidate profiles: PC appendix (B1-B7) +├── Monologue pools: per-archetype character-specific lines +└── Output: Tier 1 NPC files + monologue YAML files + +Phase 4: TIER 2 AUTHORING (1-2 weeks) +├── Working profiles: 10-axis, voice samples, dual-lens notes +├── Core dialogue lines: 15-20 per NPC +├── Generation expansion: 4x from core lines +├── Triangle integration: tension-specific dialogue +└── Output: Tier 2 NPC files + dialogue YAML files + +Phase 5: TIER 3 + ENVIRONMENTAL (1 week) +├── Sketch profiles: want, routine, personality minimum +├── Environmental text: signs, menus, graffiti, ticker headlines +├── Location descriptions: atmospheric text per social site +└── Output: Tier 3 NPC files + environmental text files + +Phase 6: INTEGRATION (1 week) +├── Pool configuration: FRIEND pool, role-slot pools, randomization axes +├── Cross-reference validation: all canonical_ids resolve +├── Schema validation: all content passes validation +├── Dual-lens review: both archetypes' experiences coherent +└── Output: pools.yaml + validated content pack + +Phase 7: PLAYTESTING (1-2 weeks) +├── Per-archetype playthrough: does each archetype's experience work? +├── Triangle testing: do all triangles produce interesting decisions? +├── FRIEND testing: does the contradiction arc hit emotionally? +├── Randomization testing: do different seeds produce different experiences? +└── Output: Bug fixes, balance adjustments, polish +``` + +**Total per district: 8-12 weeks.** That's 2-3 months per district with a small team. For 50 districts, that's ~100-150 team-months = roughly **4-5 years with a 3-person content team, or 2-3 years with a 5-person team.** + +This is a multi-year production. Which is expected for a game of this scope. The key is that each district is INDEPENDENT — they can be built in parallel, shipped as DLC, and contributed by modders. + +### Generation vs. authoring: the 70/30 split + +Not all content needs to be hand-authored. The pipeline uses three content creation methods: + +| Method | What It Produces | Quality Level | Volume | +|---|---|---|---| +| **Hand-authored** | Tier 1 profiles, FRIEND arcs, MIRROR arcs, key monologue, key dialogue, environmental text | Highest — every line is specific, personal, irreplaceable | ~30% of total content | +| **Generation-expanded** | Tier 2 dialogue expansion (write 15, generate 60), routine micro-variations, Tier 3 personality variations | Good — matches voice and tone but lacks hand-crafted specificity | ~40% of total content | +| **Template-generated** | Tier 3 NPC profiles, procedural district layouts, random NPC names + basic personalities, filler environmental text | Functional — serves as social wallpaper, background noise | ~30% of total content | + +The critical constraint: **Tier 1 is NEVER generated. FRIEND arcs, MIRROR arcs, contradiction beats, tells — these are always hand-authored.** The emotional payload requires authored specificity. Gore is right: emotion doesn't template. + +### Tooling requirements + +The pipeline above requires specific tools. Here's what the content team needs: + +**1. District Designer (design-time tool)** +- Input: Moral texture, cultural group, adversarial structure type, district size +- Output: Skeleton `district.yaml` + `templates/*.yaml` + `triangles/*.yaml` with placeholder NPCs +- Validates: Triangle structures have minimum members, adversarial pair exists, FRIEND slot defined +- Who uses it: Gestalt + Paula (design phase) + +**2. NPC Generator (population-time tool)** +- Input: Cultural group brief + role slot + tier assignment +- Output: NPC YAML with name, personality, routine, basic relationships +- Validates: Name follows cultural phonological rules, routine uses canonical activities, faction is valid +- Who uses it: Paula (population phase), modders (extending districts) +- Note: Generates STARTING POINT — Tier 2+ always gets human review + +**3. Line Expander (authoring-time tool)** +- Input: Core dialogue lines + voice card + tag taxonomy +- Output: Generated dialogue variants matching voice, mood, and tag patterns +- Validates: Generated lines preserve access tier, trust level, situation context +- Who uses it: Mellanie (Tier 2 expansion) +- Note: NEVER used for Tier 1. Expansion factor: 3-5x (write 15, generate 45-75) + +**4. Content Validator (continuous tool)** +- Input: Full content directory +- Output: Schema validation report (errors + warnings) +- Validates: All cross-references resolve, all pool candidates exist, all triangles have required members, all Tier 1 NPCs have full profiles, bidirectional knowledge consistency +- Who uses it: Everyone, on every commit +- Note: This is Tyre's `make validate-content` at full scale + +**5. Content Previewer (testing tool)** +- Input: District content pack + PC archetype + seed +- Output: Simulated playthrough of dialogue selection, monologue triggers, routine observation +- What it shows: "On this seed, with this archetype, entering this location at this time, the player would see X NPCs, hear Y dialogue, trigger Z monologue" +- Who uses it: Everyone during integration and playtesting +- Note: Evolution of the line previewer (#193), expanded to district-scale + +**6. Cultural Consistency Checker (validation tool)** +- Input: NPC YAML + cultural group brief +- Output: Report of cultural violations (names don't match phonological rules, vocabulary not from substrate, social norms violated) +- Who uses it: Miri (review), content authors (self-check) + +### The modder pipeline + +Modders follow the same pipeline but can enter at any phase: + +| Mod Type | Entry Phase | What They Produce | What They Need | +|---|---|---|---| +| New NPC mod | Phase 2 | 1 NPC + pool assignments | NPC Generator + Content Validator | +| New district mod | Phase 1 | Full district content pack | Full pipeline | +| Extension mod | Phase 4 | Additional dialogue lines for existing NPCs | Line Expander + Content Validator | +| New archetype mod | Phase 1 | Global archetype definition + district instances | Full pipeline + archetype schema | +| Cultural mod | N/A | New heritage cluster brief | Cultural Consistency Checker | + +The critical principle: **modders use the same tools as the core team.** No special modding SDK. The content directory structure IS the modding API. The validation tools ARE the modding tools. This collapses the "mod support" development cost to near zero — we're not building two pipelines. + +**Decision proposal (D-WR-17):** Districts are the unit of content production. Each district goes through a 7-phase pipeline (Design → Population → Tier 1 → Tier 2 → Tier 3 → Integration → Playtesting). Six tools support the pipeline (District Designer, NPC Generator, Line Expander, Content Validator, Content Previewer, Cultural Consistency Checker). The same tools serve both core development and modding. Content is ~30% hand-authored, ~40% generation-expanded, ~30% template-generated. Tier 1 is never generated. + +--- + +## Synthesis: The Content Strategy as a System + +Let me zoom out and map how all seven answers interact. This is where it gets good — this is where the systems produce emergent variety. + +### The multiplication table + +The full game's content variety isn't additive — it's MULTIPLICATIVE. + +``` +TOTAL UNIQUE PLAYTHROUGHS = + PC archetypes (6) + × Starting districts (~50, not all available to all archetypes) + × FRIEND selection (2-4 per archetype per district) + × Hidden network configuration (per-seed role assignment) + × Faction power balance (per-seed) + × Wormhole topology (per-seed) + × Moral texture experience (emergent from the above) +``` + +Conservative estimate: 6 archetypes × 30 average district-archetype combinations × 3 average FRIEND candidates = **540 structurally distinct first-district experiences.** Before dramatic randomization. Before multi-district play. Before inter-system travel. + +The two-friends-compare-notes test passes at this scale not because we randomized everything — but because we randomized the RIGHT things while keeping the authored core rock-solid. + +### The feedback loops + +Here's what makes me excited as a systems designer: the seven components INTERACT. + +1. **Cultural groups shape moral textures.** A Nordic-Baltic district naturally produces complicity (privacy norms protect networks). A Latin American district naturally produces loyalty (patron-client dynamics create competing obligations). The culture isn't decoration layered over the mechanics — it IS the mechanics. + +2. **Moral textures shape FRIEND arcs.** In a complicity district, the FRIEND hides criminal participation. In a loyalty district, the FRIEND hides factional betrayal. In a duty district, the FRIEND hides knowledge of someone in danger. The FRIEND pattern is universal; what the FRIEND hides is determined by the district's moral texture. + +3. **Archetypes shape randomization.** A detective doesn't care which NPC fills the "courier" role slot — they care which NPC has observable tells. A smuggler doesn't care about tells — they care about operational reliability. The SAME randomization (who fills what role) produces DIFFERENT player-facing experiences based on archetype. + +4. **The content directory enables all of the above.** Cultural briefs in `regions/`. Archetype definitions in `global/archetypes/`. District skeletons in `systems/`. Pool configurations in each district. Mod overlays that extend any of these. The directory structure isn't just file organization — it's the game's content API. + +5. **The authoring pipeline scales because districts are independent.** No district depends on another district's content. You can build Sova first, ship it, then build Tavros, ship it, then let modders build custom districts. The pipeline's parallel nature means content velocity scales linearly with team size. + +### The ten decisions + +| # | Decision | Domain | +|---|---|---| +| D-WR-11 | Master theme is "knowledge as burden." Per-district moral textures emerge from content configuration, not prescribed labels. | Theme | +| D-WR-12 | 6-8 heritage clusters with Miri-quality regional briefs. Mechanically load-bearing. Districts reference cluster briefs. | Culture | +| D-WR-13 | Universal district skeleton (social sites + hidden network + FRIEND + cultural group + moral texture + archetypes + contested resource). All districts instantiate this skeleton with varying flesh. | Structure | +| D-WR-14 | Content directory supports core/DLC/mod delivery through pack manifests. Cross-district references via canonical_id. Missing references degrade gracefully. | Architecture | +| D-WR-15 | Randomization: "randomize context, author content." Four tiers (Structural/Dramatic/Local/Meta). Authored content is never generated at runtime. | Randomization | +| D-WR-16 | 6 PC archetypes (Smuggler, Detective, Politician, Guardian, Merchant, Civilian). 2-4 per district. Mandatory adversarial pair. Global definitions, local instances. | Archetypes | +| D-WR-17 | Districts as production units. 7-phase pipeline. 6 tools. Same tools for core and mod development. ~30/40/30 authored/expanded/generated split. Tier 1 never generated. | Pipeline | +| D-WR-18 | Content variety is multiplicative, not additive. The systems interact: culture → moral texture → FRIEND arc → archetype experience → randomization → replay value. | Synthesis | +| D-WR-19 | Heritage cluster distribution: 20-25 systems across 6-8 clusters, with blended districts interpolating between parent cultures. | World structure | +| D-WR-20 | The adversarial pair is the minimum content unit: one insider archetype + one investigator archetype per district, seeing the same world from opposing information positions. | Design constraint | + +--- + +*The full game isn't 50 copies of Sova with different wallpaper. It's 50 instantiations of a universal skeleton, each with different flesh — different cultures, different moral textures, different adversarial structures, different contested resources. The systems are the same everywhere. The content makes each place unique. And the randomization ensures that no two playthroughs — even in the same district, with the same archetype — tell the same story.* + +*That's not a content pipeline. That's a story machine.* + +*— Gestalt* diff --git a/docs/workshops/wiki-review/round3-gore.md b/docs/workshops/wiki-review/round3-gore.md new file mode 100644 index 000000000..44f101060 --- /dev/null +++ b/docs/workshops/wiki-review/round3-gore.md @@ -0,0 +1,416 @@ +# Round 3 — Gore (Long-Term Content Strategy) + +This is the conversation I've been waiting for. Everything before this was about Sova. This is about the game. + +--- + +## 1. Complicity Is Sova's Word for a Bigger Idea + +In Round 1, I named complicity as the game's theme. I was right about Sova. I was wrong about the scale. + +Complicity is what the central question looks like in a tight-knit logistics community with a grey economy. It's the local dialect of a deeper language. The deeper language is this: + +**What does it cost to participate in a system you didn't choose?** + +Every person in the Settled Reach lives inside systems they didn't design. Institutions, economies, cultures, technologies, relationships — all of them pre-exist the individual. You're born on a station someone else built, work for a consortium someone else founded, use a neural lattice someone else regulates, live under laws someone else wrote. You didn't choose any of it. But you participate. Every day, by existing within it, you participate. + +The game's question isn't "who did it?" — that's the detective's question, and the detective is one archetype among many. The game's question is: + +**"Is this enough?"** + +I proposed this in Round 1 as a field for NPC profiles. I'm now proposing it as the *thesis statement of the entire game*. + +### Why "Is this enough?" scales and "complicity" doesn't + +Complicity requires a specific moral structure: someone is doing something wrong, and others are implicated by proximity or silence. That works for Sova (grey economy, smuggling ring, community protection). It doesn't work everywhere: + +| District Type | Local Moral Texture | "Is this enough?" manifests as... | +|---|---|---| +| **Logistics hub** (Sova) | Complicity | "The ring helps people. I'm part of it. Is the cost to my relationships worth it?" | +| **Military station** | Obedience | "I follow orders. Some orders are wrong. Is the security I provide worth the orders I carry out?" | +| **Research outpost** | Responsibility | "My work could save or destroy. Is the knowledge worth the risk of what others do with it?" | +| **Political capital** | Compromise | "I trade principles for incremental progress. Is the slow improvement worth the constant self-betrayal?" | +| **Frontier settlement** | Necessity | "There are no rules here. I do what survival requires. Is freedom worth the brutality?" | +| **Corporate district** | Ambition | "I climb. Others fall. Is the status worth what I've become?" | +| **Unbound enclave** | Authenticity | "I rejected the system. But rejection has its own costs. Is purity worth the isolation?" | +| **Religious/philosophical commune** | Meaning | "We seek something beyond material. Is transcendence worth what we've given up in the physical world?" | + +Each district is a different philosophical question wearing the same clothes. Same game structure — social sites, triangles, FRIEND arcs, investigation/navigation. Different moral gravity. Different version of "enough." + +### The umbrella theme + +The game's thematic umbrella is **the cost of participation**. Every character in every district is paying a cost to participate in the system they live inside. The game asks: is what you're getting worth what you're paying? And if not — what are you willing to do about it? + +This gives us: +- **THE FRIEND** in every district: someone you trust who is paying a cost they haven't told you about +- **THE MIRROR** in every district: someone who isn't paying any hidden cost, whose transparency reveals what everyone else is hiding +- **The investigation/navigation arc** in every district: the player discovering what costs are being paid, by whom, and whether they can be changed +- **The central question** in every district: "Is this enough?" — asked by NPCs, asked by the player character, eventually asked by the player + +Complicity is what "the cost of participation" looks like when the system is a community that protects its own. Obedience is what it looks like when the system is a hierarchy. Compromise is what it looks like when the system is politics. The structure is universal. The expression is local. + +### What this means for content planning + +Every new district brief needs, before anything else, to answer three questions: + +1. **What is the system?** (What institution, economy, culture, or structure does this community operate within?) +2. **What does participation cost?** (What do people give up, tolerate, ignore, or enable by being part of this system?) +3. **What does "enough" mean here?** (What is the local definition of a satisfying life, and what threatens it?) + +These three answers generate everything else. NPCs are people who have answered "Is this enough?" in different ways. Triangles are conflicts between people whose answers clash. THE FRIEND is someone whose answer is changing. THE MIRROR is someone whose answer is honest. The contraband/conflict/conspiracy is whatever disrupts the community's equilibrium between "enough" and "not enough." + +--- + +## 2. Cultural Groups as Civilizational Philosophies + +Miri's Krenn brief is the gold standard. But Miri built it as a cultural artifact — names, food, greetings, aesthetics. I want to complement that with the *philosophical* dimension. + +### Every cultural group is an answer to "Is this enough?" + +Cultural groups aren't just naming conventions and food. They're civilizational postures — collective answers to the post-scarcity question that have calcified into social norms, values, and expectations over 180+ years. + +| Cultural Cluster | Heritage Inspiration | Civilizational Posture | What "Enough" Means | What Disrupts It | +|---|---|---|---|---| +| **Krenn** (Sova) | Nordic-Baltic | Pragmatic collectivism | Stability, community, privacy | Outsiders asking questions; internal exposure | +| **Core worlds** (TBD) | Cosmopolitan blend | Institutional trust | Status, career, institutional respect | Institutional failure; discovering the system is hollow | +| **Frontier** (TBD) | American frontier + South African settler | Self-reliant individualism | Freedom, autonomy, no one owes anyone | Scarcity; discovering you need others | +| **Syndic-corporate** (TBD) | East Asian corporate + Dutch trading | Meritocratic ambition | Achievement, growth, competitive excellence | Plateau; discovering success is empty | +| **Spiritual** (TBD) | Indian philosophical + Indigenous | Meaning-seeking communalism | Inner growth, purpose, connection | Material crisis; discovering idealism doesn't feed people | +| **Military/duty** (TBD) | Roman + Japanese duty culture | Hierarchical service | Honor, duty fulfilled, clear purpose | Unjust orders; discovering the cause is corrupt | +| **Unbound** (counter-cultural) | Cypherpunk + various resistance | Radical autonomy | Authenticity, privacy, self-determination | Isolation; discovering freedom without community is loneliness | + +Seven cultural clusters is probably the right number for the full game. Enough to represent the major civilizational postures. Few enough to keep each distinct. + +### The Miri Standard + +Miri's Krenn brief should be the template. But I'd add one section to the Regional Style Guide Template: + +``` +## 7. Civilizational Posture + +### What this culture believes "enough" means +{2-3 sentences: the collective answer to the post-scarcity question} + +### What threatens "enough" here +{2-3 sentences: the kind of disruption that shakes the community's +definition of a satisfying life} + +### How this culture handles dissent +{2-3 sentences: when someone says "this ISN'T enough" — how does +the community respond? Tolerance? Exile? Persuasion? Violence?} + +### The cultural virtue that becomes a vulnerability +{2-3 sentences: the same quality that makes this culture good — +solidarity, duty, freedom, ambition — also creates exploitable +weakness. This is the thematic hook for every story set here.} +``` + +That last field is the one that matters most. In Krenn, I identified it as: "the same values that make a community good — solidarity, privacy, trust — are the values that enable its exploitation." Every cultural group has a version of this. The military culture's discipline enables blind obedience. The corporate culture's ambition enables exploitation. The spiritual culture's trust enables fraud. The Unbound's privacy enables isolation. + +**This is the game's structural thesis: every human virtue has a shadow, and the shadow is where stories live.** + +### How many cultural groups does the game need? + +**Seven cultural clusters, 20+ regional variants.** + +The seven clusters above represent the major philosophical positions. Within each cluster, individual star systems have their own regional flavor — like Miri's Krenn brief within the pragmatic-collectivist cluster. A second Nordic-Baltic logistics system would share the cluster's philosophical posture but have different naming conventions, different drift patterns, different local history. + +Content scaling: Miri writes one cluster-level philosophical brief. Then writes regional variants per system within that cluster. Each regional brief inherits the cluster's posture and customizes the surface (names, food, aesthetics, dialect). The cluster brief is ~1 page. Each regional brief is ~5 pages (like Miri's Krenn brief). At 20 systems, that's 7 cluster briefs + 20 regional briefs = ~107 pages of cultural worldbuilding. Significant but finite. + +--- + +## 3. Content Patterns That Scale — The Full Toolbox + +Sova gave us THE FRIEND and THE MIRROR. The full game needs a richer vocabulary. + +### Universal Patterns (Every District) + +**THE FRIEND** — A character you trust who is hiding something. Their secret's discovery is the emotional centerpiece. +- *Why universal*: Trust and betrayal are the atomic unit of human drama. Every community has someone whose public face conceals a private cost. +- *Scales because*: The pattern is structural (warmth → doubt → confrontation). The content is local (what they're hiding, why, what it costs). +- *Full Tier 1 depth per candidate. No shortcuts. Pool-based selection per seed.* + +**THE MIRROR** — An honest character whose transparency reveals others' dishonesty. +- *Why universal*: Every story about hidden things needs a character who isn't hiding anything. The honest person is the moral reference point. +- *Scales because*: The pattern is structural (presence, warmth, unwitting exposure of others' dishonesty). The content is local (who they are, who they love, what they don't know). +- *New pattern from this workshop. Tier 1 emotional depth, no contradiction arc.* + +### Recommended Patterns (Most Districts) + +**THE ANCHOR** — A character who embodies "enough." Content, settled, not striving. Their existence validates the choice to stop pursuing more. +- *Why needed*: D-029 says the unentangled majority must feel like a valid choice, not a failed one. THE ANCHOR is that principle made personal. A specific NPC who is genuinely happy with their life. Not naive, not ignorant — they've simply decided that what they have is sufficient. +- *Thematic function*: When the player is deep in conspiracy/investigation/moral reckoning, THE ANCHOR is the character who makes them wonder: "Should I just... stop? Is this person right?" The Anchor is the alternative path made flesh. +- *Sova equivalent*: Lera comes closest. The bar owner who has built a life, protects it, doesn't want more. But Lera is compromised by willful ignorance. A true ANCHOR would be someone whose contentment isn't maintained by not-seeing. It's genuine. +- *Tier 2 depth minimum. Needs strong voice, warmth, and a life that feels genuinely appealing.* + +**THE GHOST** — An absent character whose influence shapes everything. Never or rarely seen. Referenced constantly. +- *Why needed*: Power structures often have invisible nodes. Nils in Sova — off-stage, but drives Triangle 1 and the ring's escalation. THE GHOST creates paranoia (for the investigator) and helplessness (for the navigator). You can't confront someone you can't find. +- *Scales because*: Every community has someone pulling strings from outside. A Syndic executive. A political patron. A crime boss in another system. THE GHOST represents the reality that local problems have non-local causes. +- *Sova equivalent*: Nils Davan. v0.1 treats Nils as "referenced not instantiated." At scale, THE GHOST should have a stub profile (name, influence model, communication patterns) but no physical presence in the district. +- *Stub profile only. No schedule, no social site presence. Influence expressed through other NPCs' behavior and dialogue.* + +### District-Variable Patterns (Some Districts, Not All) + +**THE CATALYST** — A character who arrives and disrupts the community's equilibrium. An outsider who forces reckoning. +- *When to use*: Districts where the disruption comes from outside. The detective in Sova IS a catalyst — an institutional outsider whose presence forces the community to confront what it's been tolerating. +- *Not every district needs one*: Some districts' disruptions are internal (a member defects, a secret is accidentally revealed, an institution fails). THE CATALYST is for districts whose "Is this enough?" moment is triggered by contact with something foreign. +- *May overlap with PC archetype*: If the player character IS the outsider (detective, investigator, inspector), they're functioning as THE CATALYST. The NPC version is for when the disruption comes from a non-player outsider. + +**THE THRESHOLD** — A character or object that embodies the district's specific moral question. The thing that makes "enough" inadequate. +- *In Sova*: The contraband itself is the threshold. Medical-grade lattice components — healthcare that's illegal. The thing that makes the grey economy morally defensible AND morally corrosive simultaneously. +- *At scale*: Every district has a threshold object or person. A military district's threshold is the unjust order. A research station's threshold is the dangerous discovery. A political capital's threshold is the corrupt ally. THE THRESHOLD is whatever forces the player to reckon with the specific cost of participation in THIS system. +- *Not always a character*: Sometimes it's an object, a document, a piece of information. The content form varies. The thematic function is constant. + +**THE REMNANT** — A character who used to be something more and chose to come back down. A former Higher who returned to baseline. A retired politician. A decommissioned soldier. Someone who pursued "more" and decided it wasn't worth it. +- *Why needed*: The game offers ascension paths. THE REMNANT is the person who walked those paths and turned around. Their testimony complicates the player's ambition. "I was Higher for thirty years. I could see things you can't imagine. And I chose to come back. Let me tell you why." +- *Thematic function*: Counter-narrative to ascension as progress. THE REMNANT says: more isn't always better. Ascending costs you things you don't notice until they're gone. +- *Appears in later content (v0.3+)*: Requires ascension systems to exist before the counter-narrative makes sense. But the design space should be reserved. +- *Tier 2 minimum. Needs backstory depth and a compelling "why I came back" narrative.* + +### Pattern Coverage by District + +| Pattern | Frequency | Minimum Content Depth | +|---|---|---| +| THE FRIEND | Every district | Tier 1, pool-based, 70-100 lines per candidate | +| THE MIRROR | Every district | MIRROR spec, 50-70 lines | +| THE ANCHOR | Most districts (80%+) | Tier 2, strong voice | +| THE GHOST | Most districts (70%+) | Stub profile | +| THE CATALYST | Some districts (40-50%) | Tier 2 or PC archetype | +| THE THRESHOLD | Every district (but not always a character) | Varies — object, document, or Tier 2 NPC | +| THE REMNANT | Some districts (20-30%, later content) | Tier 2, backstory depth | + +This gives content planners a vocabulary. When designing a new district, the first question is: who fills each role? Not every slot needs to be filled. But knowing the vocabulary means knowing what's available. + +--- + +## 4. The Thematic Requirements for the Content Platform + +I'll leave the directory structure to Tyre and the mechanical scoping to Gestalt. My contribution is: what must the platform support *thematically*? + +### Moral texture must be a configurable parameter + +The content directory can't assume every district tells a complicity story. The moral texture — what kind of cost participation extracts — must be a district-level parameter that shapes: +- What NPCs talk about in idle dialogue +- What the monologue voice notices and comments on +- What "suspicious behavior" looks like (in Sova it's Kael in Corridor B-7; in a military district it might be questioning an order; in a corporate district it might be sharing proprietary information) +- What the investigation/navigation arc is investigating or navigating + +**Proposal:** Every `district.yaml` should include a `thematic` block: + +```yaml +thematic: + question: "Is the security I provide worth the orders I carry out?" + cost_of_participation: "obedience to potentially unjust authority" + cultural_virtue_as_vulnerability: "Discipline enables both protection and oppression" + moral_texture: "duty" # enum: complicity, duty, compromise, necessity, + # ambition, authenticity, responsibility +``` + +This isn't decorative metadata. It's a **content generation parameter**. When the generation expansion pass (Q-012) creates dialogue for this district, the moral texture shapes the output. A "duty" district generates dialogue about orders, hierarchy, and service. A "complicity" district generates dialogue about loyalty, silence, and community protection. + +### Ascension must be a content axis, not just a mechanic + +D-017 defines perception modes scaling with ascension: Baseline → Enhanced → Higher → ANA-touched. D-008 says combat scales with ascension. These are mechanical progressions. + +The thematic question is: **what does ascension cost?** + +Every ascension tier should have a content cost alongside its mechanical benefit: + +| Ascension Tier | Mechanical Gain | Thematic Cost | Content Expression | +|---|---|---|---| +| **Baseline** | Human senses, human limits | None — this is the starting state | Full access to mundane social life. Every NPC relates to you as human. | +| **Enhanced** (lattice upgrade) | Better perception, more information | Subtle social distance. Some baseline NPCs feel you're "different." | Monologue shift: more analytical, less emotional. Some dialogue options become clinical. You notice more but feel less. | +| **Higher** (biononics) | Superhuman capability | Significant social rupture. Baseline humans can't fully relate. | THE MIRROR and THE ANCHOR lose their resonance — their "enough" no longer applies to you. You've transcended their world. New NPCs: other Higher who understand, but whose community feels cold. | +| **Digital** (ANA-equivalent) | Transcendence | Loss of physicality | You leave the game as it was. Your experience transforms. The bar, the docks, the corridor — you remember them but they're no longer your world. | +| **Wanderer** (Silfen-equivalent) | Freedom, mystery | Loss of human connection | You walk between worlds. Each district is a passing experience. Deep relationships become impossible. Every NPC is temporary. | + +**The game's endgame isn't "did you win?" It's "what did you become?"** + +Ascension isn't a power curve. It's a series of philosophical commitments, each of which transforms what "enough" means for the player. Going Higher means your old answer to "Is this enough?" is invalidated. You need a new answer. And the new answer may be lonelier than the old one. + +The content platform needs to support this: dialogue and monologue pools that shift with ascension tier. The same NPC greets a baseline player differently than a Higher player. The same bar feels different to someone who can see through walls. The same community means something different when you've left it behind. + +### The long game must resist resolution + +One more architectural requirement, and this is the most important one. + +**The game should not resolve its central question.** + +"Is this enough?" doesn't have an answer. Not because the game is evasive — because the question is genuinely open. Different characters answer it differently. Different players answer it differently. Different playthroughs produce different answers. The game's job is to ask the question with enough specificity, enough emotional weight, enough lived experience, that the player is forced to actually think about it. + +The content platform must support: +- **Multiple valid endings per district.** Not "good ending" and "bad ending." Multiple endings, each of which represents a legitimate answer to the district's specific version of "Is this enough?" +- **No moral scoring.** The game never tells you whether you made the right choice. It shows you what happened as a result. The evaluation is the player's job. +- **Accumulating weight across districts.** The player who has been to five districts has encountered five different versions of the question. Their choices in District 1 don't determine their options in District 5 — but their *perspective* has changed. The content should acknowledge this: monologue in later districts can reference earlier experiences. "I've seen this before. Different faces, same question." + +--- + +## 5. Randomization Philosophy — Moral Texture as the Deepest Lever + +Nigel's axes from Round 1: FRIEND identity, contraband type, who's compromised. These are correct for v0.1. At full scale, we need one more axis that subsumes the others: + +### The moral texture shuffle + +The deepest randomization lever isn't WHO or WHAT. It's WHY. + +Same district. Same NPCs. Same social sites. But the *reason* for the conspiracy changes: + +| Seed A | Seed B | Seed C | +|---|---|---| +| The ring moves medical-grade lattice components (healthcare) | The ring moves severance tech (political resistance) | The ring moves luxury enhancements (vanity/ambition) | +| Community motivation: compassion | Community motivation: ideology | Community motivation: greed | +| Moral verdict: deeply sympathetic | Moral verdict: complicated | Moral verdict: unsympathetic | +| Detective feels: guilty for busting it | Detective feels: conflicted | Detective feels: righteous | +| Smuggler feels: justified | Smuggler feels: purposeful | Smuggler feels: hollow | + +Same ring. Same Kael. Same Sera. Same Hael sitting alone at the bar. But the entire moral gravity of the district has shifted. The player's answer to "Is this enough?" changes because what "enough" COSTS has changed. + +This is the randomization axis that creates genuine moral replayability, not just structural replayability. Two players can have identical NPC configurations and different moral experiences because the WHY was different. + +### At full scale: what varies, what doesn't + +| Axis | Varies Per Seed | Varies Per District | Fixed | +|---|---|---|---| +| FRIEND identity | Yes (pool selection) | Yes (different candidates per district) | No | +| FRIEND content | No (fully authored per candidate) | Yes (different arcs per district) | N/A | +| Contraband/conflict type | Yes (moral texture shuffle) | Yes (local specific) | No | +| Who's compromised | Yes (role-slot assignment) | Yes (different NPCs per district) | No | +| Cultural group | No | Yes (per system) | Yes (per system) | +| Evidence placement | Yes (spatial randomization) | Yes (different locations) | No | +| THE MIRROR identity | Possibly (small pool) | Yes (different character per district) | No | +| District moral question | No (fixed per district) | Yes (defined per district) | Yes (per district) | +| Moral texture of WHY | Yes (motivation shuffle) | Yes (per district) | No | + +The district's *question* is fixed. The *answer* the community has adopted — and what disrupts it — varies per seed. + +--- + +## 6. PC Archetypes — Different Answers to the Same Question + +The smuggler and detective are two answers to "Is this enough?" The full game needs the full spectrum. + +### The Archetype Vocabulary + +Each archetype represents a different relationship to the systems they inhabit: + +| Archetype | Answer to "Is this enough?" | Relationship to System | Playstyle | +|---|---|---|---| +| **The Worker** | "No — I need more than the system provides" | Inside, supplementing | Social navigation, cover maintenance, grey economy | +| **The Investigator** | "No — something is wrong and I'll find it" | Outside, examining | Pattern recognition, evidence collection, confrontation | +| **The Operator** | "No — I want to run things my way" | Inside, subverting | Network building, resource management, power accumulation | +| **The Wanderer** | "I don't know yet — I need to see more" | Passing through | Observation, connection, departure. Every district is temporary. | +| **The Builder** | "Almost — I want to create something lasting" | Inside, constructing | Base building, community development, legacy | +| **The Seeker** | "No — human limits are too small" | Transcending | Lattice progression, ascension, perception mode expansion | +| **The Guardian** | "Yes — and I'll defend it from what threatens it" | Inside, protecting | Defense, security, threat assessment, community anchoring | +| **The Rebel** | "No — the system itself must change" | Against | Faction politics, institutional disruption, ideological commitment | + +**Eight archetypes. Two per v0.1 (Worker/Investigator as smuggler/detective). Full roster by v1.0.** + +Each archetype creates a fundamentally different game in the same district: +- The Worker in Sova is the smuggler. The Worker in a military district is the soldier who trades contraband on the side. +- The Investigator in Sova is the detective. The Investigator in a corporate district is the auditor who finds fraud. +- The Wanderer in Sova is passing through — they meet Kael, Hael, Sera, care about them briefly, and leave. Their game is about *all* the districts, not any single one. +- The Seeker in Sova notices the lattice components aren't just contraband — they're the first step on a path the Seeker wants to walk. The ring isn't a crime. It's an opportunity. + +### Archetype × District = unique experience + +At 8 archetypes × 20 districts, that's 160 fundamentally different game experiences before randomization. With randomization across Nigel's axes, each experience fragments into dozens of variants. This is the game's replayability thesis made concrete: not replaying the same story, but replaying the same *question* from a different philosophical position. + +### How archetypes relate to ascension + +The archetypes aren't static. They're starting positions. Over the course of a long game, the player's archetype can drift: + +- The Worker who accumulates enough becomes the Builder. +- The Investigator who sees too much corruption becomes the Rebel. +- The Builder who achieves their vision and feels empty becomes the Seeker. +- The Seeker who ascends and regrets it becomes the Wanderer. +- The Wanderer who finds a place worth staying becomes the Guardian. + +These transitions aren't scripted. They emerge from the player's choices. The game tracks the player's behavior and adjusts monologue tone, available dialogue options, and NPC reactions accordingly. If you start as an Investigator but spend most of your time building relationships and managing a business, the game's voice shifts toward the Builder. Your character's answer to "Is this enough?" evolves with your play. + +**The endgame isn't "choose your ascension path." It's "look back at what you chose and understand who you became."** + +--- + +## 7. The Authoring Pipeline — Write to the Question + +300+ NPCs is a content challenge. But it's not an impossible one if every NPC is generated from a single seed: their answer to the central question. + +### The generative sequence + +For every NPC in the game, the authoring process should be: + +``` +Step 1: ANSWER THE QUESTION + "Is this enough?" + → "Yes, Lera runs her bar and it's enough. She doesn't want more." + +Step 2: DERIVE THE AXES + Want: Keep the bar running, protect the regulars + Secret: Willful ignorance about the ring (cost of "enough") + Contentment: High, but maintained by not-looking + Tolerance: High for people minding their business. Low for people + asking questions that could change her answer. + +Step 3: PLACE IN PATTERNS + Is this THE FRIEND? No — Lera's secret isn't deep enough. + Is this THE MIRROR? No — Lera is actively not-seeing. + Is this THE ANCHOR? Almost — but compromised by ignorance. + Triangle role: Social site authority, information gatekeeper. + +Step 4: WRITE THE VOICE + "I serve drinks. People talk. I don't take notes." + (That's a person who has decided what "enough" means and will + protect that decision with selective blindness.) +``` + +This sequence works at any scale. NPC #1 (Kael) and NPC #300 (a bartender in a frontier district three systems away) both start from the same generative question. The question produces the axes. The axes produce the patterns. The patterns produce the voice. + +### What's authored vs. generated vs. template-expanded + +| Content Type | Authored | Template-Expanded (4x) | Generated (Procedural) | +|---|---|---|---| +| THE FRIEND (Tier 1) | 100% | 0% | 0% | +| THE MIRROR (new pattern) | 100% | 0% | 0% | +| Tier 2 NPCs (triangle members) | 25% (seed lines) | 75% (generation expansion) | 0% | +| Tier 3 NPCs (atmosphere) | 10% (voice hint + function) | 40% (basic pool) | 50% (routine, greeting variations) | +| Environmental text | 30% (authored per district) | 30% (regional variants) | 40% (procedural from cultural brief) | +| Monologue (per character per district) | 50% (FRIEND + key moments) | 30% (expansion) | 20% (ambient observations) | +| District briefs | 100% | 0% | 0% | +| Cultural briefs | 100% | 0% | 0% | + +**The rule: anything that carries emotional weight is authored. Anything that carries atmospheric weight can be expanded. Anything that carries only presence can be generated.** + +### Tooling the pipeline needs + +1. **The Question Prompter.** A tool that takes a district's thematic block (`question`, `cost_of_participation`, `moral_texture`) and prompts the author with: "You're writing an NPC for a district where the cost of participation is [X]. How does this character answer 'Is this enough?'" Forces every NPC to be thematically grounded before the first axis is written. + +2. **The Pattern Matcher.** A tool that reads a completed NPC profile and identifies which patterns the NPC could fill: FRIEND candidate? MIRROR candidate? ANCHOR? The author decides, but the tool flags eligibility. + +3. **The Lens Validator.** A tool that takes every NPC dialogue line and checks: does this line read differently for each PC archetype active in this district? If a line reads identically to the Worker and the Investigator, it's missing the dual-lens (or multi-lens, at scale) resonance. + +4. **The Voice Auditor.** A tool that compares an NPC's voice samples, authored dialogue, and expanded dialogue against the regional cultural brief. Does this person sound like they're from Krenn? Do they use substrate vocabulary? Does their sentence length match the cultural profile? Catches cultural drift in expanded content. + +--- + +## The Settled Reach — What This Game Is + +Let me finish by saying what I think the game is, at full scale, with all the pieces visible. + +The Settled Reach is a game about a civilization that has solved most material problems and is now confronting the problems that abundance creates. When survival is easy, what do you want? When you can live for centuries, what do you commit to? When you can become more than human, what do you lose? When institutions control access to capability, what do you do about it? + +The player enters this civilization through a single character's eyes. They see one district, one community, one set of relationships. They answer "Is this enough?" — first for their character, then for themselves. They move to another district. Another community. Another version of the question. Their answer evolves. Their character evolves. The game doesn't tell them whether their answers are right. It shows them what those answers cost. + +Some players will settle. They'll find a district, build a life, decide that what they have is enough. That's a valid ending. The game respects it. + +Some players will ascend. They'll pursue lattice enhancement, then Higher capability, then something beyond human. They'll gain power and lose connection. They'll look back at the bar where Hael used to wait for Kael and it will be very small and very far away. That's also a valid ending. + +Some players will wander. District after district, system after system, never settling, always asking. They'll collect perspectives the way others collect achievements. They'll know more about the Reach than anyone and belong to none of it. + +And some players will fight. They'll decide the system is wrong — the Commission is corrupt, the Syndics are exploitative, the Assembly is toothless — and they'll try to change it. They'll discover that changing a civilization is harder than leaving one. They'll become either heroes or cautionary tales, depending on who's telling the story. + +The game asks. The player answers. The game shows what the answer costs. That loop, repeated across districts and years and lifetimes, is The Settled Reach. + +The title is a question. Have you settled? Have you reached far enough? Or is there something more? + +Is this enough? diff --git a/docs/workshops/wiki-review/round3-mellanie.md b/docs/workshops/wiki-review/round3-mellanie.md new file mode 100644 index 000000000..129a71f34 --- /dev/null +++ b/docs/workshops/wiki-review/round3-mellanie.md @@ -0,0 +1,354 @@ +# Round 3 Response: Mellanie — Long-Term Content Strategy + +*The writer's perspective on building a game that requires thousands of authored lines across dozens of districts, hundreds of NPCs, and multiple cultural registers.* + +--- + +## 1. Complicity Is Not the Theme. Complicity Is Sova's Theme. + +Gore named it brilliantly for Sova. Every character in the transit district is complicit in something, and the player inherits that complicity. It works because Sova is a tight community built on mutual not-noticing, and the ring is the scar tissue of a system that failed working people. Complicity is the right word for THAT place. + +But if every district in the game asks "what are you complicit in?" the question goes dead by district three. The player learns the formula: walk in, find the community secret everyone's protecting, discover your character is part of it. Complicity becomes a mechanic to solve rather than a question to sit with. + +What scales is the structure UNDERNEATH complicity. Every Settled Reach district should put the player inside a community that has made a collective bargain — an arrangement where the benefits are shared and the costs are hidden. The player inherits a position inside that bargain and then discovers the costs. + +The bargain changes. The moral texture changes. The voice changes. + +**Sova's bargain:** We don't notice the smuggling because the smuggling keeps our people healthy. (Complicity.) + +**A corporate-run mining district's bargain:** We accept the Syndic's terms because the alternative is unemployment for the whole station. (Dependency.) + +**A research outpost's bargain:** We don't report the experiment results because the Veil Institute will shut us down if they know what we've found. (Forbidden knowledge.) + +**A frontier settlement's bargain:** We handle justice ourselves because the Assembly is six weeks away by gate. (Self-governance that slides into tyranny.) + +**A cultural-heritage enclave's bargain:** We preserve our identity by controlling who's allowed in. (Belonging as exclusion.) + +**A gate-hub trading post's bargain:** We don't ask where cargo comes from because asking kills trade. (Willful ignorance on an economic scale.) + +Each of these is a different moral texture that the player explores through the same structural pattern: you're inside a community, you have a role, the community has an arrangement, and you discover what the arrangement costs. The investigation/social mechanics work identically. The monologue voice changes because the CHARACTER changes — different archetype, different community, different complicity. + +From my chair, this matters because **voice is the primary instrument for communicating moral texture.** If the theme is always complicity, every smuggler sounds the same — guilty, protective, conflicted. If the theme varies per district, the smuggler in a mining district sounds DIFFERENT from the smuggler in a transit hub. One is guilty about grey-market medicine. The other is resigned to corporate exploitation. The internal monologue shifts tone, vocabulary, emotional register. That's where the game's thematic range lives — in the character's voice, not in a design document. + +**What I need to make this work:** A one-page "district moral brief" that names the local bargain, the local costs, and the emotional register it produces in each PC archetype. This is the first document I read before writing a single line for a new district. Miri's regional cultural brief gives me the LANGUAGE. The moral brief gives me the FEELING. + +--- + +## 2. Cultural Groups — The Writer's Requirements + +Miri will map the full cultural geography. From my seat, here's what I need and what I worry about. + +### How many distinct cultural registers can one writer maintain? + +Each cultural group changes EVERYTHING I write: +- Environmental text (signs, menus, graffiti, terminals) +- Substrate vocabulary (which heritage words leak through) +- Speech rhythm (Krenn is clipped and consonant-forward; a different culture might be flowing and vowel-rich) +- Social register rules (when do you use surnames? what's rude? what's welcoming?) +- Monologue voice (the PC's internal language absorbs the culture they're embedded in) + +Maintaining consistent voice across a cultural register requires holding the whole brief in my head while writing. Switching between registers mid-session produces contamination — Krenn words leak into a non-Krenn district, or the speech rhythm drifts. This is the real constraint, not the writing itself. + +**Practical limit: 4-6 cultural registers in active production at any time.** I can hold Krenn plus three or four others in working memory. Beyond that, I need to re-read the brief every session, which halves my output speed. + +### What I need per cultural group (minimum) + +| Item | Why | Example (Krenn) | +|------|-----|-----------------| +| 10-15 substrate words with usage context | So NPC and environmental text sounds right | kylm, perk, leib, hüva, selge | +| 5-8 local slang terms | So ring/community talk sounds situated | ticking, quiet credit, shift-end, wall-side | +| Greeting/farewell conventions | First line of every NPC interaction | Chin-lift, first name, no verbal formula | +| Food/drink vocabulary | Bar menus, social scenes, comfort references | Leib, kalaa, supp, kuum, grain spirit | +| Profanity pattern | Stress lines, tells, emotional breaks | Perk (emphatic), gate-rot (frustration) | +| Speech rhythm notes | Sentence length, fragment frequency, formality | Clipped, consonant-heavy, fragments preferred | +| Authority address rules | Detective/institutional interactions | Title+surname = formal/hostile; first name = accepted | +| The shared silence | What nobody says, what the community doesn't discuss | The grey economy exists. Nobody names it. | + +That's 8 items per group. Multiply by 6 groups for the initial game: 48 reference entries I need to keep straight. Doable, but only if each brief is tight, consistent, and maintained as a living document. + +### Cultural diversity as narrative range + +The game needs cultural variety not for representation points but because **cultural register IS gameplay.** The detective's challenge changes when authority-address rules change. A district where formal address means respect (Core system, institutional culture) plays differently from a district where formal address means hostility (Krenn, working-class pragmatism). Same mechanic, different feel. + +For the full game, I'd propose a cultural spectrum: + +| Cluster | Heritage | Speech Feel | Authority Dynamic | +|---------|----------|-------------|-------------------| +| Krenn (delivered) | Nordic-Baltic working-class | Clipped, sparse, substrate words | Formal = outsider/hostile | +| Core system (proposed) | Institutional cosmopolitan | Precise, measured, multi-syllabic | Formal = expected, informal = unprofessional | +| Frontier settlement (proposed) | Mixed-heritage pioneer | Loose, drawling, improvised compounds | Formal = suspicious, everyone's first-name | +| Enclave (proposed) | Preserved single-heritage | Heritage language dominant, Concordat Standard is the second language | Authority depends on whether you're kin | +| Syndic company town (proposed) | Corporate monoculture | Brand vocabulary, managed optimism, euphemism | Authority is corporate hierarchy; outsiders don't rank | +| Gate hub (proposed) | Polyglot trading culture | Code-switching, borrowed words from everywhere, fluid | Authority is purchased; credentials are merchandise | + +Six registers. Each plays differently in the detective's mouth and the smuggler's mouth. Each produces different environmental text. Each changes how THE FRIEND arc FEELS even though the structure is identical. + +The enclave detective isn't investigating a crime. They're an outsider violating a family's privacy. The frontier smuggler isn't part of a ring. They're part of a survival economy. Same mechanics. Different voices. Different guilt. + +--- + +## 3. Content Patterns That Scale vs. Local Specifics + +### Universal patterns (use everywhere) + +**The social site.** Bar, workplace, hidden space — the three-site model is universal because human communities everywhere have public social venues, daily-labor spaces, and places people go to not be seen. The names change. The structure doesn't. + +**The triangle.** Three people with conflicting interests. This is the atom of social drama. Works in any culture, any economy, any moral texture. The specific tensions change per district. The shape doesn't. + +**THE FRIEND.** One NPC who the player trusts, who is hiding something, whose revelation contaminates all prior warmth. Universal emotional pattern. Works because it's not a plot device — it's a human relationship. Every culture has trust. Every culture has betrayal. + +**Dual-lens monologue.** Two characters reading the same world differently. This is the GAME'S identity, not Sova's. It should survive every district, every culture, every moral texture. + +**Environmental text as worldbuilding.** Signs, menus, graffiti, screens. Every district has physical text that communicates culture without exposition. Universal pattern, local content. + +### Patterns that should vary + +**THE FRIEND's contradiction type.** Kael's is spatial (seen in the wrong place). Sera's is behavioral (cumulative avoidance pattern). Other districts should explore: informational contradictions (the FRIEND says something that contradicts known facts), emotional contradictions (the FRIEND's mood doesn't match the situation), or temporal contradictions (the FRIEND's schedule doesn't add up over time). The discovery mechanic should surprise returning players. + +**The community's relationship to institutions.** Sova's Commission is an unwelcome regulator. In a Core system, the Commission might be a trusted employer. In a frontier, there might be no Commission at all. This changes the detective's entire social position — and the smuggler's relationship to law. + +**The social site count.** Three sites works for a compact district. A larger, wealthier district might have five. A frontier outpost might have two. The template should flex to 2-6 social sites without breaking the authoring model. + +**Contraband type and moral framing.** Not every district smuggles lattice components. Some districts smuggle information, cultural artifacts, people, political speech, biological samples. The contraband determines the moral frame, which determines monologue voice. + +**NPC density and tier distribution.** Sova's 30/50/20 split (flat/mundane/entangled) is right for a compact working-class district. A bustling trade hub might be 20/40/40 — more conspiracy density because more transactions create more hiding places. A quiet enclave might be 40/50/10 — mostly life-sim, with a single deep-buried secret. + +### What this means for my authoring model + +The universal patterns give me scaffolding. For any new district, I know I'm writing: +- 2-6 social site environmental text packages +- 3-8 triangle sets with dual-lens monologue coverage +- 1-2 FRIEND arcs with 5-phase contradiction progressions +- Per-location monologue pools for each PC archetype active in that district +- News ticker / information feed content in local editorial voice + +The local specifics mean I'm always doing cultural translation: same structure, different register. The pattern repeats. The voice never does. + +--- + +## 4. Content Directory as Platform — Long-Term Authoring Needs + +From the writer's chair, the content directory needs three things at scale that v0.1 doesn't demand yet: + +### Voice reference indexing + +When I'm writing monologue for a Tier 2 NPC in district #14, I need to check: does this NPC's speech pattern match other NPCs in the same cultural group? Am I accidentally writing Krenn rhythm for a Core system character? + +At 300+ NPCs, I can't hold all voice samples in my head. I need a way to query: "show me all voice samples for cultural-group X, mood Y." This could be a tag on voice sample lines in the NPC YAML: + +```yaml +voice_sample: + - mood: casual + cultural_group: krenn + text: "Shift's looking smooth today." + - mood: stressed + cultural_group: krenn + text: "Just — follow the schedule I posted." +``` + +Then a CLI tool: `make voice-ref --culture krenn --mood stressed` returns all stressed-mood Krenn voice samples. That's my consistency check. Without it, voice drift is inevitable by district #5. + +### Cross-district monologue tracking + +THE FRIEND arc produces monologue lines that reference specific NPCs. At scale, with pool-based FRIEND selection, I need to know: which monologue lines reference which NPC by name? If the randomizer assigns a different FRIEND, which lines need to be in the alternative pool? + +This means monologue lines need a `references` tag: + +```yaml +- id: terminal_m_010 + text: "Kael's already at the dock. Good." + references: [kael_davan] +``` + +At 300+ NPCs and 3000+ monologue lines, I need `make check-references` to flag orphaned references (NPC removed but monologue still names them) and pool-incompatible lines (line references an NPC who isn't FRIEND-eligible in this seed configuration). + +### Template expansion audit trail + +D-028 says: write 10, generate 40. At scale, that's write 3000, generate 12000. When a generated line sounds wrong — wrong register, wrong cultural voice, wrong emotional tone — I need to trace it back to the authored source line and the expansion rule that produced it. This means the generation pipeline needs to tag every expanded line with its source: + +```yaml +- id: bar_d_401 + text: "Evening. Quiet one tonight." + generated_from: bar_d_001 + expansion_rule: mood_variation +``` + +Without this, quality control on 12,000 generated lines is impossible. I'd be hunting for bad lines with no way to find the pattern that produced them. + +--- + +## 5. Randomization and Voice + +Nigel's three axes (FRIEND identity, contraband type, who's compromised) are right for Sova. At full scale, I'd add: + +### The voice axis + +If the player selects an archetype and gets assigned a specific NPC-turned-PC, the PC's voice should vary. Not the structure — the register. D-028 mentions "3 voice options per character: sardonic/anxious/casual for smuggler, clinical/weary/sharp for detective." + +At scale, this is a multiplier. Each PC archetype × each voice option × each district's cultural register = a distinct monologue feel. A sardonic smuggler in Krenn sounds different from a sardonic smuggler in a Core system. The sardonic-ness is the same; the cultural substrate changes. + +This means the monologue pool needs a `voice` tag: + +```yaml +- id: terminal_m_001 + character: smuggler + voice: sardonic + text: "Morning shift. Same air, same lubricant, same people pretending this is fine." + +- id: terminal_m_001b + character: smuggler + voice: anxious + text: "Morning shift. Check the boards. Check the schedule. Check the corridors. Okay. We're fine." + +- id: terminal_m_001c + character: smuggler + voice: casual + text: "Morning shift. Recycled air and cargo lubricant. Home sweet home." +``` + +Three lines for the same trigger, same character, different voice. The randomizer selects which voice profile the PC has. The player gets a character who FEELS distinct even in familiar territory. + +**Content cost:** 3x monologue lines per trigger point. Expensive. But this is where the "write 10, generate 40" model earns its keep. Author the sardonic variant. Generate the anxious and casual variants from it using the voice transformation guide (D-028). Then hand-review. The authored voice is the seed. The generation expands it. + +### The cultural axis + +If the full game spans 6+ cultural groups, and the PC might be from any of them, the monologue needs to reflect cultural origin. A Krenn-raised detective on a Core system station uses `perk` under their breath. A Core-raised detective on Krenn doesn't know why nobody will tell them anything. + +This is a combinatorial explosion if fully authored. My proposal: author the HOME-CULTURE variant (PC is local) at full depth. Generate the OUTSIDER variant (PC is from elsewhere) using cultural-mismatch transformation rules: +- Replace substrate words with Concordat Standard equivalents +- Add confusion/observation monologue where locals use unfamiliar customs +- Shift social-reading monologue from insider interpretation to outsider guessing + +The outsider variant is generated, not authored. But it needs hand-review because cultural-mismatch humor and alienation are tonal — the generation won't get the feel right on the first pass. + +--- + +## 6. PC Archetypes at Full Scale + +The smuggler and detective are v0.1. The full game needs more lenses. + +### How many archetypes? + +From the writer's perspective, each archetype is a complete monologue voice — a way of seeing the world, a vocabulary, an emotional default, a set of things-noticed-first. Each archetype needs: + +- A full monologue pool per district (100-200 lines per district at authored depth, 400-800 after generation) +- A voice card (register, vocabulary, emotional default, cultural fluency) +- A relationship template (how this archetype forms bonds, what triggers trust/suspicion) +- District-specific moral positioning (what's the archetype's relationship to the local bargain?) + +At 2 archetypes, content volume is manageable. At 4, it's substantial but achievable. At 6+, it requires a fundamentally different production model (more generation, less hand-authoring, with heavy editorial review). + +### Proposed archetype spectrum (long-term) + +| Archetype | Lens | What They Notice | Emotional Default | Moral Position | +|-----------|------|-----------------|-------------------|----------------| +| **Smuggler** | Operational | People, risk, routes, loyalty | Protective | Inside the bargain | +| **Detective** | Analytical | Patterns, anomalies, data | Suspicious | Outside the bargain | +| **Fixer** | Transactional | Leverage, debts, favors, prices | Calculating | Profiting from the bargain | +| **Medic/Tech** | Caring | Suffering, need, capability, limitations | Compassionate | Repairing the bargain's damage | +| **Newcomer** | Naive | Everything is new, culture shock, first impressions | Curious/Overwhelmed | Doesn't know the bargain exists | +| **Local Elder** | Historical | What changed, what was lost, who remembers | Nostalgic/Bitter | Remembers when the bargain was made | + +Six is the maximum I'd recommend. Each adds a complete voice layer to every district. The fixer sees every relationship as a transaction. The medic sees every NPC as a patient. The newcomer sees what locals have stopped noticing. The elder sees what the community has forgotten. + +**The newcomer and the elder are the most interesting from a writing perspective.** The newcomer's monologue IS the tutorial — they don't know the culture, the slang, the social rules, so their internal voice explains everything the player needs to learn. The elder's monologue is the deepest worldbuilding — they remember the founding charter, the first gate opening, the strike of '42, the winter when the ventilation failed. Two archetypes, two time horizons, two completely different relationships with the community's bargain. + +But six archetypes × 20 districts × 150 lines per pool = 18,000 authored monologue lines (before generation expansion). That's a multi-year content production effort with dedicated writers per archetype or per cultural group. + +**My recommendation:** Ship with 2 (smuggler + detective). Add 1-2 per major expansion. The architecture should support 6 from day one. The content catches up over time. + +--- + +## 7. The Authoring Pipeline at Scale + +This is the question that keeps me up at night. 300+ NPCs. 20+ districts. 6 cultural groups. Up to 6 PC archetypes. Thousands of environmental text items. Tens of thousands of monologue and dialogue lines. How? + +### The production model + +**Tier 1 content (FRIEND arcs, contradiction beats, anchor lines, key reveals): 100% hand-authored.** No generation. No shortcuts. These are the moments Ozzie's gut-check test measures. Every FRIEND arc, every contradiction discovery monologue, every contaminated-trust line is written by a human who understands the character's emotional state. This is the work that makes players name an NPC they felt conflicted about. + +At scale: ~2-4 FRIEND NPCs per district × 70-100 lines each = 140-400 hand-authored lines per district for Tier 1 content alone. For 20 districts: 2,800-8,000 FRIEND lines. That's substantial but finite. + +**Tier 2 content (working-profile NPCs, triangle dialogue, social texture): Author 25%, generate 75%.** Write the anchor line. Write the voice seed (3-5 lines per mood). Write the dual-lens critical lines. Generate the fill: greetings, small talk, routine observations, mood variations. Hand-review every generated line for voice consistency. + +At scale: ~8-12 Tier 2 NPCs per district × 40-60 lines each (authored seed) = 320-720 authored lines per district, expanding to 1,280-2,880 after generation. For 20 districts: 6,400-14,400 authored, 25,600-57,600 total. + +**Tier 3 content (flat NPCs, social wallpaper): Author 10%, generate 90%.** Write one voice hint. Write the function note. Generate all dialogue from template + cultural register + role slot. Hand-review for egregious voice breaks only. + +At scale: ~5-10 Tier 3 NPCs per district × 10-15 lines each (authored seed) = 50-150 authored lines per district. For 20 districts: 1,000-3,000 authored. + +**Environmental text: Author 100%.** Signs, menus, graffiti, terminals, news tickers — these are worldbuilding in miniature. Every piece is culturally specific. Generation doesn't work here because the whole point is cultural flavor that feels hand-placed. But the volume per district is manageable: 65-90 items (my Round 1 estimate for Sova) × 20 districts = 1,300-1,800 environmental text items total. + +### The math + +| Content Type | Authored per district | Generated per district | Total (20 districts) authored | Total generated | +|---|---|---|---|---| +| Tier 1 (FRIEND) | 140-400 | 0 | 2,800-8,000 | 0 | +| Tier 2 (working) | 320-720 | 960-2,160 | 6,400-14,400 | 19,200-43,200 | +| Tier 3 (flat) | 50-150 | 450-1,350 | 1,000-3,000 | 9,000-27,000 | +| Monologue (per archetype) | 100-200 | 200-600 | 2,000-4,000 | 4,000-12,000 | +| Environmental text | 65-90 | 0 | 1,300-1,800 | 0 | +| **Total** | **675-1,560** | **1,610-4,110** | **13,500-31,200** | **32,200-82,200** | + +**13,500-31,200 hand-authored lines for the full game.** Plus 32,000-82,000 generated lines requiring editorial review. + +That's a large body of work. But it's not unmanageable if the pipeline is right. + +### The pipeline I need + +**Phase 1: Brief intake.** For each new district, I receive: (1) Miri's regional cultural brief, (2) the moral brief (what's the bargain?), (3) Paula's NPC profiles at all tiers. I read these before writing a single line. + +**Phase 2: Anchor-first authoring.** Write the FRIEND content first. All Tier 1 lines, hand-authored. These are the emotional core. Everything else calibrates to them. + +**Phase 3: Voice seeding.** For each Tier 2 NPC, write the anchor line, 3-5 mood seeds, and the dual-lens critical lines. This is the authored 25%. + +**Phase 4: Generation pass.** Feed the voice seeds + cultural brief + tag taxonomy into the generation pipeline. Produce the 75% fill. Tag every generated line with its source. + +**Phase 5: Editorial review.** Read every generated line. Flag voice breaks (wrong register, wrong cultural substrate, wrong emotional tone). Fix or regenerate. This is the quality gate. + +**Phase 6: Environmental text.** Write all signs, menus, graffiti, terminals, tickers for the district. 100% authored. This is the fastest phase because each item is short and the cultural brief provides the voice. + +**Phase 7: Integration test.** Play through the district with both active archetypes. Listen to every monologue trigger. Read every environmental text. Flag anything that breaks voice, contradicts the cultural brief, or feels wrong. Fix. + +### Tooling requirements + +1. **Voice reference CLI.** Query voice samples by cultural group, mood, tier, archetype. Essential for consistency checking at scale. +2. **Prerequisite validator.** Schema check every monologue prerequisite against the FactId catalog and entity attribute registry. I proposed this in Round 1 — at scale, it's non-negotiable. +3. **Generation pipeline with source tracking.** Every generated line carries a `generated_from` + `expansion_rule` tag. Without this, editorial review at 30,000+ generated lines is impossible. +4. **Hot-reload for line pools.** Tyre proposed this. At scale, it's the difference between a 30-second iteration loop and a 5-minute restart-and-navigate loop. Over thousands of lines, that's weeks of saved time. +5. **Cultural contamination linter.** A tool that flags when substrate vocabulary from Culture A appears in a district assigned to Culture B. "You used 'perk' in a Core system district — did you mean to?" Simple regex against the cultural brief's word list. Saves hours of manual checking. +6. **Anchor line registry.** A flat file listing every NPC's anchor line(s) across the whole game. When reviewing a new NPC, check the registry — is this anchor distinct from existing ones? Does it echo another character's emotional beat too closely? At 300+ NPCs, duplicate emotional notes become a real risk. + +### The team structure at scale + +One writer (me) can handle v0.1's content volume. One writer cannot handle the full game. At 20 districts: + +**Option A: Writers per cultural group.** Each writer owns 1-2 cultural registers and writes all content for districts in those cultures. Pros: deep cultural consistency. Cons: writer unavailability blocks entire regions. + +**Option B: Writers per archetype.** Each writer owns 1-2 PC monologue voices and writes all monologue for those archetypes across all districts. Pros: voice consistency per character. Cons: requires cultural-brief fluency across all regions. + +**Option C: Paired authoring.** Cultural specialist (holds the regional voice) + character specialist (holds the archetype voice) collaborate per district. The cultural writer does environmental text and NPC dialogue seeds. The character writer does monologue. Pros: best of both. Cons: coordination overhead. + +I'd recommend **Option C for Tier 1 content** (where voice quality is non-negotiable) and **Option A for Tier 2/3** (where cultural consistency matters more than individual character depth). + +--- + +## Summary + +The long-term content strategy is: + +1. **Theme varies per district, structure is universal.** Complicity is Sova. Other districts explore dependency, forbidden knowledge, self-governance, belonging-as-exclusion, willful ignorance. The bargain changes. The discovery pattern doesn't. + +2. **6 cultural registers maximum in active production.** Each needs a tight brief with substrate vocabulary, speech rhythm, authority dynamics, and the community's shared silence. + +3. **Universal patterns: social sites, triangles, THE FRIEND, dual-lens monologue, environmental text as worldbuilding.** Variable patterns: contradiction type, institutional relationship, site count, contraband type, NPC density. + +4. **The content directory needs voice reference indexing, cross-district reference tracking, and generation audit trails** to support 300+ NPCs across 20+ districts. + +5. **Randomization adds a voice axis (sardonic/anxious/casual per archetype) and a cultural-origin axis (local vs. outsider) beyond Nigel's three.** The voice axis is a content multiplier. The cultural axis is a generation target. + +6. **Ship with 2 archetypes. Architect for 6.** Smuggler, detective, fixer, medic, newcomer, elder. The newcomer's monologue IS the tutorial. The elder's monologue IS the deepest worldbuilding. + +7. **13,500-31,200 hand-authored lines for the full game. 32,000-82,000 generated lines requiring editorial review.** The pipeline is: brief intake → anchor-first authoring → voice seeding → generation → editorial review → environmental text → integration test. At scale, this requires paired authoring teams (cultural specialist + character specialist) and five specific tooling investments. + +The game's content ambition is achievable. The constraint isn't writing speed — it's voice consistency at scale. Every tool, every process, every team structure decision should optimize for one thing: does this district sound like THIS place, inhabited by THESE people, seen through THIS character's eyes? If yes, we're building the right game. If the districts blur together, we've failed regardless of volume. diff --git a/docs/workshops/wiki-review/round3-miri.md b/docs/workshops/wiki-review/round3-miri.md new file mode 100644 index 000000000..2d1eae031 --- /dev/null +++ b/docs/workshops/wiki-review/round3-miri.md @@ -0,0 +1,551 @@ +# Workshop Round 3 — Miri (Worldbuilder / Setting Designer) + +**Long-term content strategy from the worldbuilding perspective.** + +Thinking big. Not scoping to v0.1. Not proposing tickets. + +--- + +## 1. Is Complicity the Right Theme for the Whole Game? + +Gore's framing is exactly right for Sova. Everyone is complicit. The culture protects the ring. The detective tears the social fabric. The smuggler maintains it. The question "Is this enough?" resonates because Sova Transit District is a place where the answer is *almost* yes. + +But complicity is not the theme of the *whole* game. It is one expression of the theme of the whole game. + +### The actual theme is: **What do systems do to the people inside them?** + +Complicity is what happens when a system fails quietly and people adapt around the failure. Sova's ring exists because the Commission's lattice regulation prices people out of upgrades. The community's response is rational, humane, and illegal. Everyone is complicit because the alternative — compliance — would mean watching neighbors suffer. That's complicity born from a system that's broken in a specific way: it provides order but not justice. + +Other regions of the Settled Reach would have systems that are broken in different ways. And the human responses would be different: + +| System Failure Mode | Human Response | Theme Flavor | Example Region | +|---|---|---|---| +| Regulation without justice (Krenn) | Quiet grey economy, cultural immune system | **Complicity** — knowing and not acting | Working-class logistics hub | +| Abundance without meaning | Existential drift, voluntary risk-seeking | **Ennui** — having everything and wanting nothing | Wealthy core world | +| Scarcity without solidarity | Exploitation, predatory hierarchies | **Desperation** — doing terrible things to survive | Frontier mining colony | +| Order without accountability | Institutional corruption, bureaucratic cruelty | **Rot** — the system works perfectly and destroys people | Administrative capital | +| Freedom without structure | Factional chaos, charismatic predators | **Anarchy** — liberty that devours itself | Autonomous settlement | +| Knowledge without wisdom | Reckless experimentation, unintended consequences | **Hubris** — the smartest people in the room making the worst decisions | Research station | + +Each of these is a version of "What do systems do to the people inside them?" Each creates a different investigation texture, a different moral calculus, a different reason the player feels conflicted about their NPC. + +**Complicity is the Krenn flavor.** It's the best possible starting flavor because it's the most subtle — the system isn't visibly cruel, the people aren't visibly suffering, and the illegality is morally defensible. That subtlety forces the player to engage with genuine ambiguity rather than simple moral judgment. + +But the game becomes richer as it adds regions where the moral texture is different. A detective investigating institutional corruption on an administrative world faces a different question: the system IS the crime, and dismantling it might be worse than tolerating it. A smuggler on a frontier colony isn't moving healthcare — they're moving survival supplies, and the moral calculus is starker. + +### What this means for worldbuilding + +Each regional brief needs a **Thematic Texture** section that identifies: +1. What is the system failure in this region? +2. What is the community's adaptation? +3. What is the moral question the player faces? +4. How does Gore's "Is this enough?" land differently here? + +The regional style guide template from Round 1 should add this as Section 0 — before Heritage Profile. It's the first thing writers need to know because it colors everything else. + +### IP originality note + +This thematic structure is not derived from any single SF franchise. Hamilton's Commonwealth explores post-scarcity choice but doesn't systematically map moral textures to regions. Banks's Culture explores systemic failure at the edges but the Culture itself is presented as broadly successful. What we're building is closer to Le Guin's approach in *The Dispossessed* — each society is an experiment in human organization, and the game lets you experience them from inside. + +--- + +## 2. The Full Cultural Map of the Settled Reach + +This is squarely my domain. Let me think about what the Settled Reach looks like at full scale — not specific names and places (too early), but the *shape* of the cultural landscape and the design principles that govern it. + +### Design principles for cultural diversity + +**Principle 1: Heritage clusters, not nations.** No region in the Settled Reach is "the French system" or "the Japanese system." Every settlement was founded by a coalition of heritage groups that blended over 50-300 years. The Krenn System isn't Finnish — it's a Nordic-Baltic blend with Dutch-Norwegian commercial influence, 180 years drifted. This blending is what makes each region feel original rather than Earth-transplanted. + +**Principle 2: Settlement motivation shapes culture more than heritage.** Two regions founded by similar heritage groups but for different reasons (one economic, one ideological) will feel more different from each other than two regions founded by different heritage groups for the same reason. Krenn was an economic venture — logistics hub. A system founded by religious separatists from the same Nordic heritage pool would feel radically different despite sharing naming phonetics. + +**Principle 3: Age matters.** Early-settled systems (300+ years) have deeper drift, more blending, and weaker heritage connections. Recently settled systems (50-100 years) still have living memory of founding cultures. This creates a natural gradient from "cosmopolitan old-core" to "distinctly heritage frontier." + +**Principle 4: Economic function determines social structure.** A mining colony, a research station, a commercial hub, an agricultural world, and a military installation each produce different class structures, different attitudes toward authority, and different daily rhythms. These functional differences are more load-bearing for gameplay than cultural heritage differences. + +**Principle 5: Every region must serve a gameplay purpose.** Cultural diversity isn't decoration — it creates mechanical variety. Different cultural norms toward authority create different investigation difficulties. Different social structures create different triangle types. Different economic pressures create different contraband needs. If a region doesn't create a mechanically distinct experience, it doesn't need to exist. + +### Proposed cultural map (conceptual, not named) + +For a full-scale game, I'd propose **8-10 major cultural regions**, organized not by Earth-heritage similarity but by the gameplay texture they create: + +#### Tier A: Core Regions (old, wealthy, politically significant) + +**1. The Administrative Heart** — Founded by Western European / East Asian bureaucratic traditions. 250+ years old. The seat of Concord Assembly politics. Heritage: blended to near-unrecognizable — "cosmopolitan Reach Standard" IS the culture. Investigation texture: institutional corruption, paper trails, polite lies. The mind-your-business ethos here isn't cultural silence (Krenn) — it's professional discretion. Everyone knows everything and says nothing because careers depend on strategic ignorance. Access tier challenge: authority access is easy (institutional credentials work), insider access is almost impossible (real trust requires decades of shared institutional history). + +**2. The Old Money World** — Founded by North American / Northern European corporate dynasties. 200+ years old. Wealth so embedded it's invisible. Heritage: deliberately maintained as aesthetic — they have art, cuisine, architecture, all meticulously curated, but it's performance, not living culture. Investigation texture: the mystery isn't what people are hiding, it's what they've normalized. Crimes aren't secrets — they're traditions. Thematic texture: ennui. Access tier challenge: peer access requires wealth display (the detective's institutional salary is comically insufficient); insider access requires family connections or blackmail. + +#### Tier B: Working Regions (established, functional, the economic backbone) + +**3. The Logistics Nexus (Krenn System)** — Already established. Nordic-Baltic heritage, 180 years, freight culture. Investigation texture: cultural silence, quiet grey economy. Complicity. + +**4. The Industrial Belt** — Founded by Slavic / Central European mining and manufacturing traditions. 150 years old. Multiple stations orbiting a resource-rich gas giant. Heritage: stronger than Krenn because the work is harder and the solidarity is fiercer. Investigation texture: labor politics, union-like structures, the ring equivalent is a cooperative, not a conspiracy. Workers don't mind their own business — they mind EACH OTHER'S business, which means the detective faces a wall of coordinated resistance, not individual silence. Access tier challenge: peer access requires demonstrating you work with your hands. The culture despises desk workers and institutional inspectors equally. + +**5. The Agricultural World** — Founded by South Asian / Sub-Saharan African agrarian traditions. 170 years old. One of the few systems with meaningful planetary surface living. Heritage: strong food culture, extended family structures, seasonal rhythms alien to station life. Investigation texture: generational grudges, land disputes, family honor, the conspiracy is embedded in clan structures rather than workplace structures. The smuggling here isn't lattice components — it's genetic material, seed stock, agricultural patents. Access tier challenge: family connections are everything. An outsider without a local family sponsor is a ghost. + +#### Tier C: Frontier Regions (young, rough, unsettled social contracts) + +**6. The Frontier Station** — Founded by mixed-heritage economic migrants, 60-80 years old. Culture is still crystallizing — no dominant heritage, no established norms, everything is negotiated daily. Investigation texture: chaotic, everyone is suspicious of everyone, alliances shift weekly. The ring equivalent isn't organized crime — it's the baseline economy. Legitimate trade and smuggling aren't meaningfully distinct because regulation hasn't caught up. Access tier challenge: there IS no authority tier — nobody recognizes institutional authority. The detective must earn every shred of credibility through personal reputation. + +**7. The Research Outpost** — Founded by academic / scientific communities from diverse global traditions. 40-90 years old. Small population, high lattice tiers, intellectual culture that values ideas over social bonds. Heritage: deliberately cosmopolitan (the founders self-selected for education, not ethnic identity). Investigation texture: intellectual arrogance, dangerous experiments, the conspiracy is ideological rather than economic. They're not smuggling components — they're conducting illegal research. Access tier challenge: peer access requires demonstrating competence. The culture respects expertise and despises authority that can't justify itself intellectually. + +#### Tier D: Edge Cases (unique situations that create unique gameplay) + +**8. The Autonomous Zone** — A system that rejected Concord Assembly governance. Founded by political separatists, heritage varies. 100-150 years old. Self-governing, factionally fragmented. Investigation texture: factional chess, every NPC has political allegiance, neutrality is suspicious. The ring equivalent is a political movement, not an economic operation. Access tier challenge: faction affiliation determines EVERYTHING. The detective's Commission credentials are actively dangerous here — they mark you as an enemy. + +**9. The Gate Junction** — A transit hub where multiple wormhole routes converge. No founding culture — built by the Assembly as infrastructure, populated by everyone passing through. Heritage: none dominant, all present. Investigation texture: transient population, nobody stays long enough to build trust, the conspiracy exploits the anonymity. Access tier challenge: the peer tier barely exists — nobody knows each other well enough. Investigation works through pattern recognition (who keeps showing up?) rather than social integration. + +**10. The Heritage Preserve** — A system where the founding culture was deliberately, aggressively maintained. Single-heritage community (could be from any Earth tradition) that rejected blending as cultural death. 150+ years old. Investigation texture: conformity pressure, anyone who deviates is suspect, the conspiracy is hidden in plain sight because it operates through culturally sanctioned channels. Access tier challenge: the culture is genuinely welcoming to outsiders... as guests. Never as participants. The detective is entertained, fed, shown around, and told nothing of substance while being made to feel included. + +### How many is enough? + +For a full game: **8-10 regions** provides enough diversity that every playthrough in a new region feels mechanically distinct. But the game doesn't need all 10 at launch beyond v0.1. The scaling path is: + +- **v0.1:** 1 region (Krenn). Proves the template. +- **v0.2:** 2-3 regions. Proves cultural diversity creates gameplay diversity. +- **v1.0:** 5-6 regions. Full game with meaningful variety. +- **Post-launch / DLC / mods:** 8-10+ regions. The template system means modders can add regions following the style guide. + +### Cultural group relationships + +Regions don't exist in isolation. The Settled Reach has inter-regional dynamics that create larger-scale narrative: + +- **Economic dependency:** Frontier regions depend on logistics hubs (Krenn) for supplies. Agricultural worlds feed everyone. Research outposts depend on institutional funding. These dependencies create inter-regional smuggling routes and political leverage. +- **Cultural friction:** Heritage Preserves resent cosmopolitan core worlds. Frontier systems resent regulation from distant administrators. Industrial belt workers resent the wealth of old-money worlds. These frictions are the macro-political landscape that Gore and Paula should map. +- **Migration patterns:** People move between regions, carrying cultural expectations. A Krenn worker who transfers to a frontier station brings the mind-your-business norm to a place where everyone is in everyone's business. Cultural collision is a character generator. +- **Gate network topology:** The wormhole network determines which regions are neighbors, which are isolated, and which are chokepoints. This is load-bearing for both economics and investigation. A detective who needs to reach a frontier system may have to pass through a hostile autonomous zone. The travel itself becomes gameplay. + +--- + +## 3. Which Sova Patterns Are Universal vs. Local? + +This is critical for scaling. Everything we've built for Sova Transit District needs to be sorted into "template" and "instance." + +### Universal (the template system) + +These patterns work in ANY region, and the regional brief provides the local flavor: + +| Pattern | Why Universal | What the Regional Brief Customizes | +|---|---|---| +| **Social site template** (D-025) | Every region has places where people gather, work, and socialize | The *type* of gathering (bar vs. teahouse vs. market square vs. research lab common room), the social norms within it | +| **Triangle model** (D-024) | Conflicting interests exist in every community | The *nature* of conflicts (Krenn: quiet, structural; Industrial Belt: loud, political; Old Money: polite, lethal) | +| **Access tier system** (D-028) | Every culture has insider/outsider dynamics | The *difficulty gradient* and *what earns each tier* (Krenn: time; Agricultural: family; Frontier: reputation; Research: competence) | +| **THE FRIEND pattern** (D-034) | Every playthrough needs an emotional anchor | The *character type* who becomes THE FRIEND (Krenn: coworker; Agricultural: cousin; Research: mentor) | +| **Tell system** | People reveal themselves through behavior in every culture | The *cultural baseline* against which deviation is measured (Krenn: stoic silence is normal, so animation is a tell; Industrial Belt: loud solidarity is normal, so withdrawal is a tell) | +| **Routine model** | People everywhere have daily rhythms | The *rhythm itself* (shift-based vs. seasonal vs. academic vs. chaotic) | +| **Contraband model** (D-037) | Every community has something the system denies them | The *specific thing* and its moral weight (lattice components vs. seeds vs. research data vs. weapons) | +| **PC-as-NPC** | Works with any NPC profile that meets archetype requirements | The *archetype pool* available in each region | +| **Three-tier content model** (D-023) | Tier 1/2/3 depth distribution works everywhere | The *content* at each tier is completely local | +| **30/50/20 entanglement ratio** (D-029) | Investigation needs noise to make signal meaningful everywhere | The *nature* of mundane noise (Krenn: neighbor disputes; Agricultural: inheritance arguments; Frontier: business competition) | + +### Local to Krenn (content, not template) + +These are Sova-specific instances, NOT patterns to replicate: + +| Element | Why Local | What Transfers as Template | +|---|---|---| +| Lattice component smuggling | Specific contraband choice | "Each region has a primary contraband type with moral ambiguity" | +| Nordic-Baltic cultural markers | Specific heritage cluster | "Each region has a heritage cluster defined by the regional brief" | +| Shift-based work rhythms | Specific economic function | "Each region has rhythms defined by its economic function" | +| Mind-your-business ethos | Specific cultural norm | "Each region has a default stance toward authority defined in the brief" | +| Kuum, leib, supp | Specific food culture | "Each region has distinctive food/drink that serves as social shibboleth" | +| Hard-naming as social signal | Specific naming convention | "Each region has a name-register system defined by the brief" | +| The ring's cooperative structure | Specific criminal organization type | "Each region has a grey economy organized in culturally appropriate ways" | +| Corridor B-7 dead drops | Specific smuggling infrastructure | "Each region has smuggling infrastructure shaped by the physical environment" | + +### The key insight + +**The template system IS the game. The regional brief is the content.** + +Every mechanical system we've designed for Sova (triangles, access tiers, tells, routines, dialogue tags, monologue pools, contraband types, FRIEND arcs) is a universal template. The regional brief provides the parameters that make each instantiation feel culturally distinct. + +This means: **when we design a new system for Sova, we should immediately ask "does this template, or is this Sova-specific?"** If it templates, it's a platform investment. If it doesn't, it's content and we should be clear about that. + +--- + +## 4. Content Directory as Long-Term Platform + +Gestalt's content directory structure from Round 1 is the right architecture. Let me extend it for multi-region scaling. + +### The scaling challenge + +At full scale, the content directory serves: +- **8-10 regions**, each with 2-5 districts +- **20-50 social site templates** across all regions +- **300+ NPCs** across all tiers +- **40+ triangles** across all districts +- **8-10 contraband types** across all regions +- **6-8 PC archetypes** across all regions +- **Multiple storylines/Tier 1 modules** per region + +### What the directory needs to support + +**1. Regional isolation.** A content author working on the Industrial Belt should never need to read Krenn files. Each region is self-contained except for cross-references to global definitions. + +**2. Global schema stability.** The tag taxonomy, FactId vocabulary, relationship state machine, and access tier definitions are global. Changing them affects every region. These must be versioned and changes must be backwards-compatible. + +**3. Cross-regional content.** Some NPCs travel between regions. Some conspiracies span multiple systems. Some factions have local presence in every region. The directory must support cross-references without creating dependency chains. + +**4. Mod isolation.** A mod that adds a new region should not need to modify any base game files. A mod that modifies an existing region should declare exactly what it changes. + +**5. Regional briefs as content gating.** No district, NPC, or dialogue should exist without a regional brief in the parent directory. The brief IS the specification that validates all child content. + +### Extended directory structure + +``` +content/ + _global/ + schema/ # Engine schema (versioned, stable) + factions/ # Faction definitions (global identity) + technology/ # Tech descriptions (universal) + contraband-types/ # Contraband type definitions (not instances) + archetypes/ # PC archetype definitions + smuggler.yaml + detective.yaml + [future: marshal.yaml, journalist.yaml, etc.] + themes/ # Thematic texture definitions + complicity.yaml # Moral framework template + ennui.yaml + desperation.yaml + rot.yaml + anarchy.yaml + hubris.yaml + + regions/ + krenn-system/ + brief.yaml # Regional style guide (GATING DOCUMENT) + sova-transit/ + district.yaml + npcs/ + triangles/ + locations/ + facts/ + dialogue/ + monologue/ + factions.yaml # Local faction presence + [future: krenn-prime-surface/] + [future: orbital-3/] + + [future: industrial-belt/] + brief.yaml + [districts...] + + [future: research-outpost/] + brief.yaml + [districts...] +``` + +### The brief.yaml as gating document + +The regional brief IS the content API. It defines: + +```yaml +# brief.yaml for any region +region_id: krenn-system +heritage_cluster: [finnish, estonian, latvian, dutch, norwegian] +settlement_age_years: 180 +settlement_motivation: economic +thematic_texture: complicity +system_failure: "regulation without justice" +community_adaptation: "quiet grey economy" +moral_question: "Is participation in an unjust system consent to its injustice?" + +naming: + phonetic_signature: "compact, consonant-forward, 1-2 syllables" + first_name_pool: [kael, sera, voss, lera, torek, ...] + surname_pool: [davan, venn, sessik, lintar, korr, ...] + surname_endings: [-an, -en, -ik, -ar, -ev, -mm, -sk] + +language: + substrate_words: {perk: "emphatic expletive", kylm: "cold/uncomfortable", ...} + slang: {shift-end: "going to bar after work", quiet-credit: "ring income", ...} + profanity_pattern: "short, percussive, heritage-derived" + +social_norms: + authority_default: "polite distance, cooperation without volunteering" + trust_building: "shared labor over time, no shortcuts" + privacy_level: high + solidarity_type: "informal, unspoken, labor-based" + peer_time_estimate: "3+ months" + insider_requirements: "vouching + demonstrated shared risk" + +access_tier_profile: + public: "ventilation complaints, sport, shift gossip" + peer: "mild workplace opinions, NPC observations" + insider: "income sources, ring knowledge, personal troubles" + authority: "formal, minimal, technically true, maximally unhelpful" + hostile: "withdrawal, hard-naming, social exile" + +aesthetics: + color_palette: [industrial-white, warm-amber, emergency-red, cool-gray] + food_culture: [leib, kalaa, supp, kuum, grain-spirit, station-ale] + dress: "standard-issue coveralls, muted off-duty, visible wealth suspicious" + music: "minimal, ambient, card-game culture dominant" + +contraband: + primary: lattice-components + secondary: [medical-grade, severance-tech] + moral_frame: "access to capability denied by regulation" + grey_economy_type: cooperative-ring + +archetypes_supported: [smuggler, detective] +``` + +This YAML brief is both human-readable documentation and machine-readable generation parameters. When the NPC generation system needs to create a Krenn NPC, it reads the naming pools, phonetic rules, and social norm parameters. When a content author needs to write Krenn dialogue, they reference the substrate vocabulary and access tier profile. When the randomizer selects a contraband type, it reads the regional contraband definition. + +**The brief is the API between worldbuilding and implementation.** + +--- + +## 5. Randomization Philosophy at Scale + +Nigel's three randomization axes (FRIEND identity, contraband type, network roles) are correct for Sova. At full game scale, there are additional axes that emerge from cultural diversity. + +### The randomization hierarchy + +Not all axes are equal. Some are load-bearing structural choices that define the entire playthrough. Others are contextual variation that creates texture. The randomizer should distinguish: + +**Structural randomization (set at game start, defines the playthrough):** + +| Axis | What It Determines | Scale | +|---|---|---| +| **Region** | Cultural context, moral texture, investigation feel | 8-10 options at full game | +| **District** | Physical space, social sites, NPC roster | 2-5 per region | +| **PC archetype** | What you can do, how NPCs see you, your moral position | 2-4 per region, some universal | +| **PC identity** (NPC selection) | Name, relationships, starting knowledge, routine | 3-6 eligible NPCs per archetype per district | +| **FRIEND identity** | Emotional core, contradiction type, tell system | 2-4 eligible per archetype per district | +| **Primary conspiracy** (Tier 1 module) | What the intrigue IS about | 2-3 per region, drawn from pool | +| **Contraband type** | Moral texture of the grey economy | 1-3 per region | + +**Contextual randomization (varies within the structural frame):** + +| Axis | What It Determines | +|---|---| +| **Network roles** (who is compromised, who is wavering) | Which NPCs fill which conspiracy roles | +| **Evidence placement** (dead drop locations, timing windows) | Spatial investigation puzzle | +| **Mundane triangle specifics** (what the noise-floor arguments are about) | Red herring texture | +| **Entanglement rate** (D-029, varies per seed) | How much conspiracy is in the air | +| **Environmental variation** (news ticker content, bar specials, shift schedules) | Atmospheric texture | +| **NPC pool population** (which Tier 3 NPCs appear this seed) | Social wallpaper variation | + +### The cultural diversity axis + +This is the new randomization axis that only exists at multi-region scale: + +**Cultural context changes HOW investigation works, not just WHAT you investigate.** + +- In Krenn, investigation means waiting, listening, earning trust through silent presence. The gameplay is patience-based. +- In the Industrial Belt, investigation means navigating organized collective resistance. The gameplay is political — you need allies to crack the wall. +- In the Frontier Station, investigation means dealing with chaos. Nobody's covering for anyone; they're all too busy covering for themselves. The gameplay is pattern-finding in noise. +- In the Old Money World, investigation means decoding social performance. Everyone is polite and nobody means a word they say. The gameplay is reading subtext. +- In the Research Outpost, investigation means proving you're smart enough to be told the truth. The gameplay is competence-display. + +**This is the deepest replayability.** Different seeds within Krenn give you different NPCs, different FRIENDs, different contraband. But a different REGION gives you a fundamentally different game. The detective who learned patience in Krenn must learn political navigation in the Industrial Belt. The skills (player skills, not character skills) that worked in one region may fail in another. + +### Randomization and the storyteller + +The storyteller (D-005, Q-010) should understand cultural context. In Krenn, the storyteller knows that trust accrues slowly and should pace revelations accordingly — the first 30 minutes should feel quiet. In the Frontier Station, the storyteller knows that chaos is the norm and should introduce complications faster. The regional brief's parameters inform the storyteller's pacing model. + +This means: **the storyteller is culturally literate.** It reads the regional brief and adjusts its behavior accordingly. This is an architectural requirement that should be established early, even if the storyteller itself is designed later. + +--- + +## 6. PC-as-NPC at Full Scale: How Many Archetypes? + +### The archetype concept + +An archetype is not a class. It's a **relationship to the world's systems.** The smuggler's relationship is embedded participation. The detective's relationship is institutional investigation. Each archetype sees the same world through a fundamentally different lens. + +### Sova's two archetypes are the universal pair + +Smuggler and detective are not Sova-specific — they're the game's core duality: + +- **The Insider** (smuggler archetype): Someone embedded in the community, part of the grey economy, with social access and operational knowledge. Their challenge is maintaining cover while the investigation closes in. +- **The Outsider** (detective archetype): Someone with institutional authority but no social trust, investigating from the outside, building knowledge from observation and deduction. + +These two perspectives are the minimum for any region. They create the adversarial lens that makes replayability work (D-027). Every district needs at least one insider and one outsider PC candidate. + +### Region-specific archetypes + +Beyond the universal pair, each region could support 1-2 additional archetypes that are grounded in the region's specific social structure: + +| Region | Universal | Region-Specific | Why It Works | +|---|---|---|---| +| **Krenn (Logistics)** | Smuggler, Detective | — | The universal pair is sufficient here. Logistics culture is clean enough that two perspectives cover the space. | +| **Industrial Belt** | Smuggler, Detective | **Union Rep** | Someone whose job is to navigate labor-management tensions. Insider access to workers, institutional access to management. Sees the conspiracy as a labor issue, not a criminal one. A third lens: solidarity. | +| **Agricultural World** | Smuggler, Detective | **Family Member** | Someone embedded in the clan structure who isn't directly involved in the conspiracy but whose family is. Insider access through blood, outsider perspective through personal morality. A third lens: loyalty. | +| **Frontier Station** | Smuggler, Detective | **Fixer** | Someone who solves problems for everyone — legal or otherwise. Access to both sides but trusted by neither. A third lens: pragmatism. | +| **Research Outpost** | Smuggler, Detective | **Researcher** | Someone embedded in the academic culture who discovers their colleagues' experiment is illegal/dangerous. Insider by competence, outsider by conscience. A third lens: knowledge. | +| **Administrative World** | Smuggler, Detective | **Bureaucrat** | Someone inside the institution who discovers it's corrupt. Institutional access that becomes a liability. A third lens: reform. | +| **Autonomous Zone** | Smuggler, Detective | **Faction Agent** | Someone working for one of the competing power groups. Access defined by faction allegiance, not personal relationships. A third lens: ideology. | + +### Archetype count at full scale + +- **v0.1:** 2 archetypes (smuggler, detective). Universal pair. +- **v0.2-v0.3:** Still 2. Prove the universal pair works in 2-3 regions before adding complexity. +- **v1.0:** 4-6 total. The universal pair plus 2-4 region-specific archetypes. Not every region needs a unique archetype — some share archetypes (the Fixer works in multiple frontier settings). +- **Post-launch:** More archetypes via DLC/mods. The archetype template (defined in `content/_global/archetypes/`) means modders can create new perspectives. + +### What defines an archetype (authoring requirements) + +Each archetype needs: +1. **Relationship to systems** — how they interact with institutions, communities, and grey economies +2. **Starting access tier map** — which NPCs treat them as insider/peer/authority/outsider by default +3. **Monologue voice** — completely separate pool (D-032 hard partition) +4. **Investigation/engagement style** — what tools and approaches are available (detective deduces, smuggler navigates, union rep negotiates, family member invokes obligation) +5. **Moral position** — what question does this archetype force the player to answer? +6. **Archetype-eligible NPC requirements** — what traits an NPC needs to be upgraded to this PC type + +The content cost per archetype is significant: a full monologue pool (separate from all other archetypes), orientation content, starting knowledge specifications, and agency boundaries. This is why new archetypes should be added slowly and only when they create a genuinely distinct play experience. + +### The "second playthrough as the same archetype" problem + +Two playthroughs as the smuggler in the same district should still feel different because of seed variation (different FRIEND, different contraband, different network). But two playthroughs as the smuggler in DIFFERENT DISTRICTS should feel profoundly different because the cultural context changes what "being an insider" means. + +In Krenn, the smuggler is protected by cultural silence. In the Industrial Belt, the smuggler is protected by collective action. In the Frontier Station, the smuggler is protected by chaos. Same archetype, different survival strategy, different moral texture. + +--- + +## 7. Authoring Pipeline at Scale (300+ NPCs) + +### The problem + +At full scale, the game needs: +- ~30-40 NPCs per district (Sova has 17, but this is a small district) +- 2-5 districts per region +- 8-10 regions +- Total: 500-2000 NPCs across all tiers + +Hand-authoring all of them at even Tier 3 depth is prohibitive. But the quality bar established by Sova (every NPC has a name that SOUNDS RIGHT, a routine that MAKES SENSE, and a cultural context that FEELS AUTHENTIC) must be maintained. + +### The pipeline (from worldbuilding perspective) + +The authoring pipeline has four stages, and the regional brief gates every transition: + +``` +Stage 1: WORLDBUILDING (Miri) + Input: Region concept (thematic texture, economic function, settlement era) + Output: Regional brief (full style guide, all parameters) + Quality gate: Brief must be approved before any content creation + Time: 1-2 sessions per region + +Stage 2: TEMPLATE DESIGN (Gestalt + Paula) + Input: Regional brief + social site templates + Output: District definition (site list, triangle structure, role slots) + Quality gate: Template must exercise at least 3 triangles, 2 social sites + Time: 1 session per district + +Stage 3: AUTHORED CORE (Mellanie + Paula) + Input: District definition + regional brief + Output: Tier 1 NPCs (2-3 per district), Tier 2 NPCs (5-8 per district) + Quality gate: All authored content must pass regional brief voice check + Time: 2-4 sessions per district, parallelizable + +Stage 4: GENERATED FILL (Procedural + Review) + Input: Regional brief parameters + Tier 2 examples + role slot requirements + Output: Tier 3 NPCs (15-25 per district), generated dialogue + Quality gate: Names must match phonetic rules, routines must match + economic function, voice must match brief personality parameters + Time: Automated generation + 1 review session +``` + +### What the regional brief enables at scale + +**Naming generation.** The brief defines phonetic rules, heritage pools, and example names. A generation system (LLM-based or rule-based — Q-012 applies here) can produce names that "sound right" for any region by following the brief's parameters. An author reviewing generated names just needs to check: "Does this sound Krenn?" If the brief is good, the answer is obvious. + +**Routine generation.** The brief defines economic rhythms (shift-based, seasonal, academic, chaotic). Routines are generated from the region's time structure. A Krenn NPC works shifts. An Agricultural NPC follows planting/harvest cycles. A Frontier NPC has irregular hours because nothing is stable. The brief provides the parameters. + +**Dialogue generation.** The brief defines substrate vocabulary, slang, profanity patterns, greeting conventions, and access tier cultural profiles. The 4x generation expansion (Q-012) uses these parameters to produce lines that sound culturally appropriate. "Hüva, let's go" is a Krenn line. The generation system knows this because the brief lists "hüva" as a casual affirmative. + +**Voice validation.** The brief provides a voice check: "Does this line sound like it comes from this culture?" A Krenn character doesn't say elaborate, flowery sentences. A Research Outpost character doesn't say "perk." The brief is the validation rubric. + +### The scaling math + +With the regional brief as the gating document: + +| Content Type | Per District | Authored | Generated | Brief Dependency | +|---|---|---|---|---| +| Tier 1 NPCs | 2-3 | 100% hand-authored | 0% | Brief provides voice/naming reference | +| Tier 2 NPCs | 5-8 | 100% hand-authored (but faster with brief as reference) | 0% | Brief provides all cultural parameters | +| Tier 3 NPCs | 15-25 | 20% (review/correction) | 80% (name, routine, basic personality) | Brief provides generation rules | +| Dialogue (Tier 1-2) | ~200-300 lines | 100% hand-authored | 0% | Brief provides voice reference | +| Dialogue (expansion) | ~800-1200 lines | 25% (seed lines) | 75% (4x expansion) | Brief provides vocabulary/slang | +| Monologue | ~100-150 per character | 100% hand-authored | 0% | Brief provides cultural baseline | +| Environmental text | ~30-50 pieces | 50% hand-authored | 50% generated from templates | Brief provides register/vocabulary | + +For a full district: ~40 NPCs, ~1500 dialogue lines, ~150 monologue lines per character, ~40 environmental text pieces. Of this: +- **Hand-authored:** ~15 NPC profiles, ~500 dialogue lines, ~150 monologue lines, ~20 environmental pieces +- **Generated + reviewed:** ~25 NPC profiles, ~1000 dialogue lines, ~20 environmental pieces + +The brief reduces generation from "create from nothing" to "instantiate from parameters." That's the difference between a 10-session and a 3-session district buildout. + +### The Lore Librarian pattern at scale + +Per CLAUDE.md's "large content pushes" pattern, the authoring pipeline at scale uses: + +1. **Lore librarian** (read-only agent): Holds ALL regional briefs, checks cross-regional consistency, catches naming collisions, verifies cultural parameters. At full scale, this agent is the guardian of the entire cultural map. + +2. **Regional writers** (parallel, one per region): Each writer has their region's brief and writes only within that region. They never need to coordinate with writers in other regions because the briefs are self-contained. + +3. **Cross-regional reviewer** (post-writing): Catches inconsistencies where regions interact (NPCs who travel, factions with multi-regional presence, shared news ticker items). + +This pattern scales to 300+ NPCs because the work is parallelizable by region, and the regional brief provides enough specification that writers in different regions produce culturally consistent content without constant cross-checking. + +--- + +## Cross-Cutting Observations + +### 1. The regional brief is the most important document in the project + +Not the NPC profiles. Not the dialogue pools. Not the code architecture. The regional brief defines the parameters that make everything else work. Every content decision flows from it. Every generation system reads from it. Every quality gate uses it as the rubric. + +The investment in making the Krenn brief thorough (Rounds 1-2 of this workshop) is establishing the standard for every future region. If the brief is weak, everything downstream is garbage. If the brief is strong, everything downstream is either good or fixably wrong. + +### 2. Cultural diversity is the deepest replayability axis + +Nigel correctly identifies FRIEND shuffling, contraband variation, and network shuffling as key replayability vectors. But these all operate WITHIN a region. The deepest replayability is BETWEEN regions: the same archetype, the same mechanical templates, but a fundamentally different cultural context that changes how every system feels. + +A player who has mastered investigation in Krenn (patience, listening, earning trust through presence) will feel like a beginner in the Industrial Belt (political navigation, collective resistance) or the Frontier Station (chaos, pattern-finding). This isn't artificial difficulty — it's genuine cognitive challenge because the RULES OF SOCIAL ENGAGEMENT are different. + +### 3. The gate network is the cultural map's skeleton + +Which regions connect to which others through wormhole gates determines: +- Trade routes (and therefore smuggling routes and contraband flow) +- Cultural contact (and therefore heritage blending at borders) +- Political influence (and therefore institutional presence and tension) +- Travel gameplay (and therefore how the player moves between investigations) + +The gate network topology should be designed WITH the cultural map, not independently. A gate junction between the Industrial Belt and the Old Money World creates a class-friction chokepoint that is itself a setting for investigation. The physical infrastructure of the Settled Reach IS the political geography. + +### 4. IP originality verification + +Setting note — the cultural map I've sketched above draws on space opera traditions but is structurally original: + +- **Hamilton** has diverse human worlds but doesn't systematically map cultural heritage drift to gameplay mechanics. The Commonwealth's diversity is atmospheric, not structural. +- **Banks** deliberately erases cultural heritage within the Culture. The Settled Reach preserves it as load-bearing. +- **Reynolds** focuses on deep time and transhuman divergence, not ethnic-cultural evolution at the 100-300 year scale. +- **Simmons** (Hyperion) has diverse worlds but organized by literary archetype, not cultural-economic logic. + +What we're building — a game where cultural heritage drift over 50-300 years produces mechanically distinct investigation experiences — doesn't have a direct antecedent in SF gaming or fiction. The closest structural parallel is Le Guin's *Hainish* cycle, where each world is a controlled experiment in human social organization. But Le Guin doesn't gamify the investigation of those societies — she explores them through character perspective. We're doing both. + +The risk is that individual regions could drift toward recognizable SF tropes (the "frontier world" is a Western, the "research station" is a thriller, the "old money world" is a period drama). The regional brief's Thematic Texture section guards against this by forcing each region to be defined by its SYSTEM FAILURE, not its genre. A frontier world defined by "scarcity without solidarity" is not a Western — it's an investigation into what happens when survival requires predation. + +--- + +## Summary + +| Question | Answer | +|---|---| +| **Is complicity the whole-game theme?** | No. Complicity is Krenn's flavor of the master theme: "What do systems do to the people inside them?" Each region expresses a different failure mode. | +| **How many cultural groups?** | 8-10 major regions at full scale, organized by settlement motivation and economic function, not just heritage. Each creates mechanically distinct gameplay. | +| **Which patterns are universal?** | All mechanical templates (social sites, triangles, access tiers, tells, FRIEND arcs, contraband models). Content is local; structure is global. | +| **Content directory as platform?** | Regional brief as gating document in `content/regions/{region}/brief.yaml`. Self-contained regions, stable global schema, mod-friendly isolation. | +| **Randomization at scale?** | Cultural diversity is the deepest axis. Within-region seed variation (FRIEND, contraband, network) provides replay variety. Between-region variation provides fundamentally different gameplay. | +| **PC archetypes at scale?** | 2 universal (insider/outsider) + 1-2 region-specific per region. Total 4-6 at v1.0. Archetype = relationship to systems, not character class. | +| **Authoring pipeline at 300+ NPCs?** | Regional brief enables generation. 4-stage pipeline: worldbuilding → template design → authored core → generated fill. Parallelizable by region. Brief is the quality rubric. | + +--- + +**Status:** Round 3 response complete. +**Author:** Miri +**Date:** 2026-02-12 diff --git a/docs/workshops/wiki-review/round3-nigel.md b/docs/workshops/wiki-review/round3-nigel.md new file mode 100644 index 000000000..3dced53a3 --- /dev/null +++ b/docs/workshops/wiki-review/round3-nigel.md @@ -0,0 +1,536 @@ +# Round 3 — Nigel (Sandbox & Replayability) + +## Long-Term Content Strategy: Replayability at Scale + +No v0.1 constraints. No sprint timelines. No tickets. Just: what does The Settled Reach look like when it's DONE, and how does it stay endlessly replayable? + +I'm going to work through all seven questions. But first, the framing. + +--- + +## The Core Replayability Thesis (Full Scale) + +Here's what I've been circling around since Round 1, and what the full game makes explicit: + +**Replayability in The Settled Reach is not a feature. It is the architecture.** + +Most games add replayability on top of a static experience: New Game+, harder difficulty, collectibles you missed. We're doing something fundamentally different. The game is a *generator*. Every playthrough instantiates one possible story from a space of authored possibilities. The randomizer isn't shuffling a deck — it's selecting which *novel* to read from a library. + +At full scale, the game should pass this test: **a hundred players describe their games. No two descriptions match. All of them are about complicity.** + +That's not a feature on top of the game. That IS the game. + +--- + +## 1. Is Complicity the Right Theme for the WHOLE Game? + +**YES. And it gets MORE interesting at scale, not less.** + +Gore named it. I'm going to explain why it scales, and why it's the only theme that works for what we're building. + +### Complicity is the only theme that survives character-switching + +The game's core mechanic is playing the same world through different eyes. Any theme that belongs to ONE character's perspective fails the lens test: + +- "Justice" is the detective's theme, not the smuggler's. +- "Survival" is the smuggler's theme, not the detective's. +- "Duty" works for one but not the other. + +Complicity works for EVERYONE because everyone is complicit. The smuggler is complicit in the ring. The detective is complicit in the system that created the ring. The bartender is complicit in silence. The partner is complicit in not asking questions. The inspector is complicit through compromise. The teacher is complicit through innocence. Complicity is the one moral condition shared by every character in every district. It's the lens that makes every character's playthrough a variation on the same question. + +### Complicity mutates across cultures — that's the scale play + +Gore framed it for Krenn: "the same values that make a community good enable its exploitation." That's Krenn-specific complicity. But complicity looks DIFFERENT in different cultures: + +| Cultural Context | Form of Complicity | Player Experience | +|---|---|---| +| **Krenn System** (Baltic-Nordic, labor solidarity) | Community solidarity protects the ring. "Mind your own business" is a virtue weaponized. | The smuggler belongs. The detective disrupts a community by investigating it. | +| **Merchant hub** (cosmopolitan, transactional) | Financial opacity protects the ring. "Everyone has business arrangements" is the norm. | The smuggler is a business operator. The detective is bad for trade. | +| **Military outpost** (hierarchical, chain of command) | Institutional loyalty protects the ring. "Don't question your superior" is doctrine. | The smuggler hides behind rank. The detective threatens the chain of command. | +| **Religious enclave** (community of faith, confession culture) | Spiritual authority protects the ring. "What's confessed is forgiven" creates a privacy moat. | The smuggler confesses but doesn't stop. The detective can't access what's been absolved. | +| **Research station** (academic, intellectual) | Professional reputation protects the ring. "We don't police each other's research" enables misuse. | The smuggler's operation is "just a side project." The detective is anti-science. | +| **Old-money core world** (aristocratic, patronage networks) | Class solidarity protects the ring. "One doesn't discuss money" is breeding. | The smuggler is a patron. The detective is vulgar. | + +Every district has a ring. Every ring is protected by the local culture's BEST qualities. The player who mastered Krenn's form of complicity walks into a merchant hub and discovers that EVERYTHING they learned about how complicity works is wrong. The silence culture doesn't apply here — it's about financial records and shell accounts and plausible intermediaries. + +**That's the replayability EXPLODING.** Not just different FRIENDs, not just different NPCs — different RULES for how complicity operates. The detective who learned to read Baltic reserve can't read merchant cordiality. The smuggler whose cover was labor solidarity can't use the same cover in an academic context. The CHARACTER SKILLS don't transfer, even if the PLAYER SKILLS do. + +### The thematic question scales too + +Gore proposed "Is this enough?" as each character's thematic question. At full scale, each district answers that question differently: + +- Krenn: "Is the money enough to justify what it costs the people I love?" +- Merchant hub: "Is the profit enough to justify what it costs my integrity?" +- Military outpost: "Is the order enough to justify what it costs my conscience?" +- Research station: "Is the discovery enough to justify what it costs my ethics?" + +Same question. Different currencies. Different costs. The player who plays five districts has asked themselves "Is this enough?" five times, and gotten five different answers, and NONE of them are comfortable. + +--- + +## 2. Cultural Groups at Scale + +### Every culture is a gameplay system, not a paint job + +Miri's Krenn brief proved something we need to generalize: **culture is mechanics.** The Finnish-Baltic reserve isn't flavor — it's the difficulty gradient. The labor solidarity isn't worldbuilding — it's the ring's immune system. + +At full scale, every district needs what Krenn has: a cultural brief that explains HOW this culture's virtues protect the local ring and obstruct the local detective. The cultural brief IS the game design document for that district's social mechanics. + +### Cultural groups as replayability multipliers + +Here's the matrix that matters: + +``` +Replayability = Characters x Districts x Cultures x Seeds +``` + +Characters: how many PC archetypes +Districts: how many playable locations +Cultures: how culture modifies all NPC behavior +Seeds: how the randomizer configures each playthrough + +At v0.1: 2 x 1 x 1 x ~1 = 2 meaningfully different playthroughs. +At full scale (say 4 characters, 6 districts, 6 cultures, ~50 meaningful seed configurations): 4 x 6 x 6 x 50 = **7,200** meaningfully different playthroughs. And that's before mods. + +But here's the critical insight: **cultures can't just be stat modifiers.** If a military culture just means "NPCs are 20% harder to befriend," that's a difficulty slider, not a replayability axis. Culture needs to change HOW the player navigates, not just HOW HARD navigation is. + +### The cultural immune system framework + +Every culture brief should answer these questions (generalizing from Krenn): + +1. **What is the default social privacy norm?** (Krenn: don't discuss others' business. Merchant: don't discuss deal terms. Military: don't discuss operations above your clearance.) +2. **What earns trust?** (Krenn: shared labor over time. Merchant: successful transactions. Military: demonstrated competence and loyalty to unit.) +3. **How does the culture handle outsiders?** (Krenn: polite distance. Merchant: calculate what you're worth. Military: evaluate your rank and credentials.) +4. **What cultural practice has been co-opted by the ring?** (Krenn: "vakt" as lookout slang. Merchant: encrypted transaction ledgers. Military: "need to know" operational security.) +5. **What cultural virtue does the ring exploit?** (Krenn: solidarity. Merchant: discretion. Military: obedience.) +6. **How does the ring recruit?** (Krenn: "We're helping people who need affordable lattice mods." Merchant: "This is just another business arrangement." Military: "Orders from above.") +7. **What does exposure look like culturally?** (Krenn: betrayal of the community. Merchant: contract violation. Military: insubordination.) + +These seven questions produce a unique social SYSTEM for each district. The detective can't just "investigate harder" — they have to learn a new social language for each district. The smuggler can't just "maintain cover" — they have to maintain a different KIND of cover. + +### Anti-metagaming through cultural diversity + +And here's the kicker for replayability: **the player who mastered Krenn can't metagame a merchant district.** The strategies are different. The tells are different. The social vulnerability points are different. The cultural gate modifiers (Gore's proposal from Round 2) apply DIFFERENT filters. + +I played Krenn twice and I figured out that worker solidarity is the blind spot. I start a merchant district and... worker solidarity doesn't exist here. Everyone's an independent operator. The blind spot is financial record-keeping conventions. Completely different puzzle. My Krenn expertise is useless. + +That's anti-metagaming through CONTENT DIVERSITY, not through randomization. The randomizer handles within-district variation. Cultural diversity handles between-district variation. Together, they make the game unsolvable in the most satisfying way. + +--- + +## 3. Content Patterns That Scale + +### Beyond THE FRIEND and THE MIRROR + +Gore's FRIEND and MIRROR are the two archetypes that define the emotional core of v0.1. At full scale, we need a LIBRARY of NPC patterns — each one a replayable element because: +1. Which NPC fills each pattern varies per seed +2. Each pattern creates different gameplay for different PC archetypes +3. Patterns interact to create emergent stories + +Here's my proposed pattern library: + +| Pattern | Definition | Emotional Function | Randomizable? | Replayability Contribution | +|---|---|---|---|---| +| **THE FRIEND** | Trusted character hiding a secret | Trust → betrayal → reckoning | Pool selection per seed | Different FRIEND = different emotional wound | +| **THE MIRROR** | Honest character with no secret | Guilt amplification / empathy test | Fixed (1 per district) | Same NPC, but player's relationship with them changes based on what THEY are doing | +| **THE HANDLER** | Off-stage authority applying pressure | Power dynamics, loyalty tests | Fixed per district, but DEMANDS vary per seed | Same handler, different operations = different moral pressure | +| **THE WITNESS** | Civilian who accidentally observes ring activity | Dramatic irony, protection vs. silencing | Pool selection per seed | Different witness = different ethical dilemma | +| **THE TURNCOAT** | NPC whose loyalty flips mid-game | Stakes escalation, trust recalibration | Pool selection per seed | Biggest replayability driver after FRIEND — the player can't predict who breaks | +| **THE CIVILIAN** | Genuinely uninvolved bystander dragged in by player's actions | Cost of consequences | Pool selection per seed | Forces different "how far will you go" answers | +| **THE OPERATOR** | Ring member who's competent and comfortable | Normalizing complicity | Fixed assignment, variable competence per seed | Same NPC, different operational stability creates different ring pressure | +| **THE SKEPTIC** | Someone who doesn't buy the ring's justification but hasn't acted | Moral courage as gameplay possibility | Pool selection per seed | The NPC who could blow everything open — but will they? | + +### Pattern interaction creates emergent narrative + +The patterns aren't independent. They INTERACT: + +- THE FRIEND knows about THE TURNCOAT's wavering. Does the smuggler learn this through the FRIEND relationship and act on it? +- THE MIRROR asks THE WITNESS a casual question that almost exposes the ring. The smuggler watches in real time and has to decide whether to intervene. +- THE HANDLER demands that the smuggler silence THE SKEPTIC. The smuggler knows THE SKEPTIC through THE CIVILIAN (they're friends). Now silencing has a face. +- THE TURNCOAT starts feeding information to THE DETECTIVE (the other PC-as-NPC). The smuggler sees them meeting and doesn't know what they're discussing. + +These interactions aren't scripted as complete scenes — they're authored as pattern pairings. "When TURNCOAT meets FRIEND" has authored beats. "When WITNESS encounters ring activity" has authored beats. The specific NPCs filling those roles vary per seed, but the DRAMATIC STRUCTURE of the interaction is pre-authored. + +At full scale with 8 patterns, we have 28 possible pairings. Each pairing has 3-5 authored interaction beats. That's 84-140 interaction templates that combine with NPC-specific content to produce hundreds of unique dramatic moments per district. + +**And it NAILS replayability without us engineering it.** The player doesn't experience "random events." They experience "the specific people I know doing things that matter because of WHO they are." The randomizer just determines which specific people fill which roles. The drama emerges from the pattern interactions. + +### The pattern library as modding interface + +Every pattern has a spec. Every spec is documented. A modder creating a new NPC can TAG them as eligible for specific patterns: + +```yaml +npc: + id: jax-korrenson + tier: 2 + pattern_eligible: + - witness # Can fill THE WITNESS role + - civilian # Can fill THE CIVILIAN role + pattern_excluded: + - friend # Not written at Tier 1 depth, can't be FRIEND +``` + +The randomizer draws from pattern-eligible pools. Modders can create NPCs that expand specific pools. The community can add WITNESS candidates, TURNCOAT candidates, SKEPTIC candidates — each one creates more possible playthroughs without touching the pattern interaction system. + +--- + +## 4. Content Directory as Platform + +### The modding ecosystem IS the endgame content strategy + +Let me be blunt: at full scale, the development team cannot produce enough content alone. No team can. The difference between "6 districts" and "60 districts" is the modding community. The content directory structure isn't just our build system — it's the platform API for a content ecosystem. + +### What the platform needs + +**Tier 1: District Packs (the big mods)** + +A full district mod. Requires: +- Cultural brief (the Miri) +- 12-25 NPCs across tiers (minimum to populate 3+ social sites) +- 3+ social sites with template role slots +- 3-5 triangles +- At least 1 FRIEND candidate per PC archetype at full Tier 1 depth +- Primary contraband + cultural justification +- Environmental text pool (60+ items) +- News ticker pool (20+ items) +- MIRROR character +- Seed configuration: pools, entanglement map, secondary contraband variants + +This is the equivalent of what we build for Sova Transit. It's a LOT of work. But it's self-contained — a district pack doesn't need to modify other districts. It just exists in `content/districts/new-district/`. + +**Tier 2: NPC Packs (medium mods)** + +Adds NPCs to existing districts. Requires: +- NPC profiles at Tier 2 or 3 depth +- Pool eligibility tags +- Relationship stubs with existing NPCs in the district +- Dialogue lines (minimum based on tier) +- Optional: FRIEND upgrade (Tier 1 depth, contradiction arc, the works) + +This is what makes existing districts RICHER. Every NPC pack increases the pool sizes for the randomizer. More bar regulars. More potential witnesses. More possible turncoats. The district feels more alive and more variable. + +**Tier 3: Flavor Packs (small mods)** + +Adds environmental text, news ticker headlines, dialogue line variants, cultural vocabulary extensions. No new NPCs. No structural changes. Just MORE content for existing pools. + +This is the entry point for new modders. Low barrier, immediate payoff. Write 20 news ticker headlines and the district feels different. Write 30 environmental text items and the station feels richer. The randomizer picks from a larger pool and every playthrough gets slightly different ambient content. + +**Tier 4: PC Archetype Packs (ambitious mods)** + +Adds a new playable character archetype. Requires: +- PC-format brief with full NPC mode (when not player-controlled) +- Starting knowledge inventory per existing district +- Relationship stubs with all FRIENDs in target districts (bidirectional) +- Orientation monologue pool +- Observation monologue for all existing pattern NPCs +- Access tier map per district + +This is the hardest mod to make because it touches everything. But it's also the MOST impactful for replayability — a new PC archetype multiplies the entire playthrough space by the number of districts they support. + +### Quality tiering for mods + +This is where I get nervous and where I need to be honest about the risk. + +A bad FRIEND candidate ruins the game. A Tier 1 NPC with a weak contradiction arc, unconvincing tell, or shallow warmth phase actively damages the emotional payload of the entire playthrough. If a community-created FRIEND is mediocre, the player's experience is mediocre, and they blame the game, not the mod. + +**Proposal: Content certification tiers.** + +| Tier | What it means | Who verifies | How it works | +|---|---|---|---| +| **Uncertified** | Raw community content. Passes schema validation only. | Automated | Runs through `make validate-content`. If the YAML is valid and cross-references resolve, it's listed. Player sees a warning. | +| **Community Reviewed** | Has been reviewed by N community members for voice consistency, cultural coherence, and emotional quality. | Community reviewers | Community review program. Structured rubric. Not "do you like it?" but "does the tell progression work over 10 minutes of play?" | +| **Studio Certified** | Meets the same quality standard as base game content. Could ship in a DLC. | Development team | Rare. Reserved for exceptional community content that we want to highlight. | + +The automated validation layer (Tyre's schema pipeline) catches structural errors. The community review layer catches quality issues. The studio certification layer catches everything else and says "this is canonical quality." + +Players can filter their content by certification level. "Show me only certified district packs." "I'll try community-reviewed NPC packs." "I'm adventurous, show me everything that passes validation." The randomizer doesn't care about certification — it draws from whatever's installed. But the player controls what's installed. + +### The content directory as API documentation + +Every schema file in `_schema/` is API documentation. Every enum file in `global/enums/` is a vocabulary reference. The `_meta/manifest.yaml` spec is a packaging standard. The pool definition format is a randomization interface. + +At full scale, the content directory should ship with: +- A `MODDING.md` that explains the three overlay operations (ADD/REPLACE/MERGE) with examples +- Schema files with inline comments explaining what each field does and how the engine uses it +- A `make new-district` command that scaffolds an empty district pack with all required files +- A `make new-npc` command that scaffolds an NPC profile at a specified tier +- A `make validate-content` command that checks everything before packaging +- A `make test-seed` command that runs the randomizer N times and reports pool coverage — "Did every NPC get selected at least once in 100 seeds?" + +The modding community IS the content strategy at scale. The content directory IS the product. + +--- + +## 5. Randomization Philosophy at Scale + +### The Sacred and the Profane + +This is the section I've been building toward since Round 1. Here's the complete philosophy. + +**SACRED content is never randomized. It's authored, fixed, load-bearing.** + +**PROFANE content is randomized per seed. It's authored too, but which piece activates varies.** + +The line between sacred and profane is the single most important design decision in the game. Get it wrong and you get either a static experience (everything sacred) or a meaningless one (everything profane). + +### The Sacred (what NEVER changes per seed within a district) + +| Element | Why It's Sacred | What Breaks If You Randomize It | +|---|---|---| +| Primary contraband type | Culturally grounded, morally load-bearing | Gore's complicity thesis collapses | +| Cultural substrate | Social mechanics of the district | All NPC behavior loses grounding | +| Triangle STRUCTURES | Relationship dynamics that create forks | Decision cascades become incoherent | +| THE MIRROR identity | Emotional anchor, no contradiction | The honesty contrast disappears | +| Thematic question ("Is this enough?") | Philosophical spine of each NPC | Characters become plot functions instead of people | +| PC archetype definitions | Character-as-lens is the core mechanic | Player identity becomes meaningless | +| Faction structures | Political landscape | Dialogue access tiers become arbitrary | + +### The Profane (what DOES change per seed) + +| Element | What Varies | Replayability Contribution | Constraint | +|---|---|---|---| +| FRIEND selection | Which NPC is your FRIEND | Emotional surprise, anti-metagaming | Must be Tier 1 depth. Pool minimum 2 per archetype. | +| TURNCOAT selection | Which NPC's loyalty flips | Stakes and paranoia | Must be Tier 2+ depth. Pool minimum 3 per district. | +| WITNESS selection | Who accidentally sees something | Ethical dilemma variety | Pool minimum 2 per district. | +| NPC role slot assignments | Who's at the bar, who's on shift, who's absent | Social landscape variety | Template constraints (triangle members always present) | +| Entanglement map | Who's compromised, who's ring-connected | Investigation difficulty, smuggler risk landscape | D-029 ratio (30/50/20) must hold | +| Secondary contraband | What else is in the crates | Moral texture variation | Must be culturally plausible | +| Evidence locations | Where the physical evidence is | Detective investigation path variety | Must be accessible to investigation play | +| Timeline beats | When the storyteller triggers escalation events | Pacing variety | Must hit milestones within playthrough length band | +| News ticker selection | Which headlines appear | Ambient mood variety | Pool size minimum 3x selection count | +| Environmental text variants | Which signs, posters, menus appear | Atmosphere variety | Must be culturally consistent | + +### The Middle Kingdom: content that's sacred in STRUCTURE but profane in POPULATION + +This is the nuance that took me three rounds to articulate. + +Triangle structures are sacred — T1 (Hub Power) always exists. But which NPCs FILL the triangle's roles can vary (at full scale, when the NPC pool is deep enough). The Nils-vs-Voss power dynamic always exists. But in seed A, "Voss" is Voss. In seed B, "the schedule controller who resists escalation" is a different NPC with different personality traits, different tells, different cultural background. + +This means the DRAMATIC STRUCTURE is fixed, but the DRAMATIC CAST is variable. The player always faces a volume escalation decision. They don't always face it with the same people. And different people respond to the same pressure differently. + +At full scale, I'd define it this way: + +``` +Sacred: Triangle exists, has named roles, creates a specific fork type +Profane: Which NPCs fill which triangle roles per seed +Sacred: THE FRIEND exists, has 5-phase arc, has tell system +Profane: Which NPC is THE FRIEND per seed +Sacred: THE WITNESS sees something, player must decide what to do +Profane: Who THE WITNESS is, what they saw, when they saw it +``` + +### The Randomizer as Storyteller + +At v0.1, the randomizer is a card draw. Pick a FRIEND. Pick some bar regulars. Set the entanglement flags. Done. + +At full scale, the randomizer is a **storyteller**. It doesn't just draw cards — it constructs a coherent narrative configuration from the available content. It needs to satisfy constraints: + +1. **Structural constraints**: All triangle roles filled. All pattern slots populated. D-029 ratio holds. +2. **Relationship constraints**: THE FRIEND must have existing relationships with at least 3 other NPCs in the district (can't be socially isolated — the warmth phase needs interaction partners). +3. **Pattern interaction constraints**: THE TURNCOAT must be in the same social site as either THE FRIEND or the smuggler (otherwise the turncoat story has no witness). +4. **Dramatic balance constraints**: Not ALL NPCs can be entangled (the mundane/entangled ratio exists for a reason — some people really are just people). Not all seeds can be the "everything's on fire" version. +5. **Cultural constraints**: NPCs assigned to roles must be culturally plausible in those roles (a military culture outsider can't fill a role that requires institutional trust). + +The randomizer becomes a constraint satisfaction system that generates valid narrative configurations. Each configuration is a "story seed" — a complete cast, setting, and situation that the storyteller then paces through the playthrough. + +This is computationally tractable. We're talking about dozens of NPCs and maybe 15-20 constraints per district, not thousands. A constraint solver can explore this space in milliseconds. The hard part isn't the algorithm — it's defining the constraints correctly, which is content design, not engineering. + +### The variance curve + +At 1 seed configuration: the game is a static experience. Replayable for character-switching only. +At 10 configurations: the game has meaningful variety. Second playthrough surprises. +At 100 configurations: the game is a generator. Two players can't compare notes. +At 1000+ configurations: the game is an ecosystem. Community content creates more variety than the team ever could. + +The architecture should support 1000+ from day one. We just populate it incrementally. + +--- + +## 6. PC Archetypes at Full Scale + +### Beyond smuggler and detective + +v0.1 has two PC archetypes. At full scale, I want at least five — and the reason isn't "more content" but "more LENSES." + +Remember: character-as-lens is the core mechanic. Each PC archetype doesn't just give you different dialogue. It gives you a fundamentally different GAME. Different starting knowledge, different relationships, different access, different moral position, different version of the complicity question. + +### The archetype library + +| Archetype | Core Gameplay | Knowledge Profile | Moral Position | "Is This Enough?" | +|---|---|---|---|---| +| **The Smuggler** | Social navigation, operational management, moral reckoning | Knows the ring, knows the people, doesn't know the full scope | Participant — active complicity | "Is the money enough?" | +| **The Detective** | Investigation, observation, evidence building | Knows the law, knows investigation methods, knows nothing local | Disruptor — institutional complicity | "Is the truth enough?" | +| **The Administrator** | Resource allocation, political navigation, institutional management | Knows the station's systems, budget, personnel files. Doesn't know the street. | Enabler — systemic complicity | "Is the order enough?" | +| **The Newcomer** | Discovery, relationship building, cultural learning | Knows almost nothing. Discovers everything. | Innocent — approaching complicity | "Is belonging enough?" | +| **The Enforcer** | Compliance, intimidation, loyalty management | Knows the ring from the enforcement side. Knows who needs pressure. | Coercer — directed complicity | "Is the control enough?" | + +### Why five archetypes changes the game completely + +**The administrator** knows things neither the smuggler nor detective knows. They see the budget anomalies. They approve the schedule changes Voss requests. They know the Commission's policies are harmful but enforce them because that's the job. Their complicity is SYSTEMIC — they didn't choose the ring, they chose the system that necessitated it. Playing the administrator after the smuggler is: "Oh. I was the reason Kael needed to smuggle. My policies priced people out." + +**The newcomer** is the information-discovery archetype pushed to its extreme. They know NOTHING. Every NPC is a mystery. Every cultural norm is confusing. Every piece of slang is new. This is the "fresh eyes" playthrough that sees the district WITHOUT any insider knowledge. When the newcomer finally realizes there's a ring, it's not Phase 3 of an investigation arc — it's the shattering of their entire understanding of the community they've been trying to join. + +**The enforcer** is the DARKEST playthrough. You know the ring. You enforce compliance. Your job is making sure people like Pell don't talk. Your job is making sure the schedule gaps stay open. You are the REASON the detective can't find evidence — because you cleaned it up. Playing the enforcer after the detective is: "I was fighting SOMEONE. Now I'm that someone." + +### The cross-archetype replayability explosion + +With 5 archetypes in 1 district: 5 playthroughs that are 5 completely different games. +With 5 archetypes in 6 districts: 30 playthroughs before the seed randomizer even activates. +With 5 archetypes, 6 districts, and meaningful seed variation: hundreds. + +But the REAL magic is the PC-as-NPC system at full scale. In any given playthrough, 4 of the 5 archetypes exist as NPCs in the world. The smuggler sees the detective investigating. The detective sees the enforcer covering tracks. The administrator sees the newcomer asking questions. The newcomer sees the administrator signing off on policies. Everyone sees everyone else from the outside. + +And EVERY combination produces a different story about complicity. The administrator watching the newcomer get integrated into the community has a different emotional charge than the enforcer watching the same thing. The detective seeing the administrator approve a policy change reads it as institutional corruption. The smuggler seeing the same approval reads it as "good, the pressure is easing, we can move product." + +### The PC-as-NPC matrix at full scale + +| You play... | You see as NPCs... | The emerging story is... | +|---|---|---| +| Smuggler | Detective investigating, administrator enabling, newcomer joining, enforcer covering | "I'm part of a machine and I can see all the parts" | +| Detective | Smuggler operating, administrator enabling, newcomer being naive, enforcer interfering | "Everyone is complicit and I can't get anyone to help" | +| Administrator | Smuggler working, detective questioning, newcomer integrating, enforcer executing | "My decisions have consequences I never see directly" | +| Newcomer | Smuggler being friendly, detective being suspicious, administrator being distant, enforcer being intimidating | "Something is wrong here and nobody will explain what" | +| Enforcer | Smuggler depending on you, detective hunting you, administrator ignoring you, newcomer being oblivious | "I hold this whole thing together and nobody thanks me" | + +Each row is a completely different game about complicity. The same district. The same NPCs. The same ring. Five fundamentally different experiences. + +### Archetype interaction with cultural groups + +And here's where it gets TRULY replayable: archetypes interact DIFFERENTLY with different cultures. + +The detective is a fish out of water in Krenn (Baltic reserve, labor solidarity obstructs). But the detective might be culturally AT HOME in a merchant hub district (investigation = audit, which merchants understand). The smuggler is culturally embedded in Krenn but would be a business operator in the merchant hub — different cover, different social mechanics, different vulnerabilities. + +The newcomer is always culturally alien — that's the archetype. But the NATURE of their alienation varies. In Krenn, they struggle with social reserve. In a military culture, they struggle with hierarchy. In a religious enclave, they struggle with faith-as-social-currency. + +Each archetype x culture combination is a unique social puzzle. That's 5 archetypes x 6 cultures = 30 unique social navigation challenges before seeds even enter the picture. + +--- + +## 7. Authoring Pipeline at Scale + +### The bottleneck is content, not code + +At full scale, the engine is done. The randomizer works. The storyteller works. The content pipeline works. The constraint solver works. What limits the game is: **how fast can high-quality authored content be produced?** + +And the answer has to be: fast enough that the content pool grows continuously, from both the development team and the modding community. + +### The three-track pipeline + +**Track 1: Studio content (highest quality, slowest production)** + +The core team produces: +- New district packs (1-2 per major update) +- FRIEND candidates at Tier 1 depth (2-4 per district) +- New cultural briefs (1 per district) +- Pattern NPCs at appropriate tier depth +- New PC archetypes (rarely — maybe 1 per year) + +This is the "canon" content. It sets the quality bar. Every studio district is a reference implementation that shows modders what good looks like. + +**Track 2: Community content (variable quality, fast production)** + +The modding community produces: +- NPC packs (Tier 2-3 NPCs that expand pools) +- Environmental text packs (ticker headlines, signs, ambient text) +- Flavor packs (dialogue variants, monologue variants) +- Ambitious mods: community district packs, PC archetype packs + +Community content goes through the certification pipeline: automated validation first, then community review, then (optionally) studio certification. + +**Track 3: Template-driven content (medium quality, fastest production)** + +This is the scale play that I think nobody else has proposed yet. Here it is: + +**Parameterized NPC generation from templates.** + +Not procedural generation. Not AI-generated text. Something in between: **structured templates that a human author fills in, with validation that ensures the result meets tier requirements.** + +Example: + +``` +Template: TIER_2_NPC +Input: name, role, culture, faction, want, secret, 3 relationships +Output: Full Tier 2 profile with: + - 10-axis structure filled from inputs + - Routine generated from role + culture (cultural brief provides schedule patterns) + - Tell system generated from personality archetype + - Voice samples derived from cultural vocabulary + personality + - Monologue lines derived from want + secret + relationships +``` + +The template doesn't WRITE the content. It SCAFFOLDS it. A human author provides the creative inputs (who is this person, what do they want, what are they hiding). The template fills in the structural elements (routine from cultural brief, tell from personality archetype). The author reviews, modifies, adds specificity. The validator checks completeness. + +This turns a 4-hour NPC creation process into a 1-hour process. The creative decisions are still human. The boilerplate is automated. And the structural quality is guaranteed because the template enforces tier requirements. + +### Content reuse as replayability amplifier + +Here's an insight about authoring efficiency that ties directly to replayability: + +**Content that varies per seed doesn't need to be authored PER SEED. It needs to be authored PER POOL.** + +If I write 5 WITNESS candidates for a district, that content appears in every playthrough — just different witnesses each time. I didn't write 5 versions of the game. I wrote 5 NPCs who can each fill the WITNESS role. The randomizer does the combination work. The authoring scales LINEARLY while the replayability scales COMBINATORIALLY. + +This is the fundamental efficiency argument for the pool-based architecture: + +| What I Author | How Many Times It's Used | Replayability Contribution | +|---|---|---| +| 1 FRIEND candidate | Every seed that selects them (~50% of playthroughs) | Unique emotional arc | +| 1 WITNESS candidate | Every seed that selects them (~40% of playthroughs) | Unique ethical dilemma | +| 1 TURNCOAT candidate | Every seed that selects them (~33% of playthroughs) | Unique betrayal stakes | +| 5 news ticker headlines | Selected into ~25% of ticker rotations | Ambient variety | +| 1 pattern interaction beat | Fires whenever those 2 patterns co-occur in a seed | Emergent drama | + +Every piece of content is AMORTIZED across many playthroughs. The authoring investment pays dividends every time the randomizer draws it. And the dividends COMPOUND as the pool grows — because more pool entries mean more possible combinations. + +### The authoring community as scale engine + +At full scale, the pipeline should support: + +1. **Solo modders**: Use `make new-npc` to scaffold, fill in creative details, validate, publish to workshop. One evening's work = one new NPC in the pool. +2. **Small teams**: Create NPC packs (5-10 NPCs with cross-relationships). Weekend project = meaningful district expansion. +3. **Ambitious modders**: Create full district packs with cultural briefs, NPCs, templates, and seed configurations. Months of work = a new game region. +4. **The development team**: Create reference districts, design patterns, maintain the engine, curate community content, publish certification rubrics. + +The authoring pipeline isn't a tool. It's a COMMUNITY. And the community is the content strategy. + +--- + +## Synthesis: The Endgame Vision + +I'm going to paint the picture. + +The Settled Reach ships with 6 districts across 3 star systems. Each district has its own cultural brief, its own ring, its own form of complicity. 5 PC archetypes let you experience each district from 5 different moral positions. The seed randomizer generates a unique narrative configuration for each playthrough. Two playthroughs in the same district with the same character feel like different games. + +The modding community has added 20 more districts. Some are studio-certified masterworks. Some are rough-but-interesting experiments. The content pool has grown from 17 NPCs per district to 40+, with pools deep enough that the randomizer can construct thousands of unique configurations. + +Two players meet. One says: "I played the enforcer in the Krenn System. My FRIEND was Renn — he was the one who introduced me to the ring before the game started. When he wavered, I had to threaten him. He was my friend and I threatened him." + +The other says: "I played the newcomer in a merchant hub. I didn't know there was a ring for the first 15 minutes. I thought I was playing a social sim. Then I found out my landlord was a FRIEND-candidate and she'd been keeping me AWAY from the evidence. She was protecting me. I didn't want to be protected." + +Same game. Same engine. Same patterns. Same theme. **Completely different stories.** Both about complicity. Both about "Is this enough?" Neither one solvable by the other's knowledge. + +That's not a game with replayability features. That's a game where replayability IS the experience. Where the second playthrough isn't a repetition with minor variations — it's a new novel from the same library. + +**But what about the SECOND playthrough?** + +It's different. It's always different. Not because we randomized everything. Because we randomized the RIGHT things and authored the RIGHT things and built a platform that lets the community make MORE of both. + +The game isn't a story. It's a story generator. And the stories it generates are all about the same question: "Is this enough?" + +The player answers that question differently every time. And the answer is always honest. + +--- + +## Decisions I'd Record (Long-Term, No Version Constraints) + +| # | Decision | Domain | +|---|---|---| +| 1 | Complicity is the whole-game theme, scalable across cultures through cultural immune system framework | Thematic | +| 2 | 7-question cultural brief framework for every district (privacy norm, trust mechanism, outsider handling, co-opted practice, exploited virtue, recruitment method, exposure consequence) | Content | +| 3 | 8-pattern NPC library (FRIEND, MIRROR, HANDLER, WITNESS, TURNCOAT, CIVILIAN, OPERATOR, SKEPTIC) with pool-based selection | Design | +| 4 | Sacred/Profane content classification: sacred = never randomized, profane = pool-selected per seed, middle kingdom = fixed structure, variable cast | Architecture | +| 5 | 4-tier modding platform (district packs, NPC packs, flavor packs, archetype packs) with 3-level certification (automated, community, studio) | Platform | +| 6 | 5 PC archetypes at full scale (smuggler, detective, administrator, newcomer, enforcer) with cultural interaction matrix | Design | +| 7 | Template-driven NPC authoring pipeline for Tier 2-3 content acceleration | Pipeline | +| 8 | Randomizer as constraint satisfaction storyteller, not simple card draw | Architecture | +| 9 | Content reuse efficiency: linear authoring investment, combinatorial replayability output through pool architecture | Strategy | diff --git a/docs/workshops/wiki-review/round3-ozzie.md b/docs/workshops/wiki-review/round3-ozzie.md new file mode 100644 index 000000000..a24ef47c7 --- /dev/null +++ b/docs/workshops/wiki-review/round3-ozzie.md @@ -0,0 +1,298 @@ +# Round 3 — Ozzie (Player Experience / Wow Factor) + +## Long-Term Content Strategy: What Does the Full Game Feel Like? + +I'm going to answer every question from one position: **what does the player experience?** Not what systems enable. Not what content is authored. What does a person sitting in their chair FEEL when they play The Settled Reach for 100 hours across a dozen districts in five star systems over three playthroughs? + +If I can describe THAT, the team can build backward from it. + +--- + +## 1. Is Complicity the Right Theme for the Whole Game? + +### No. Complicity is Sova's theme. The game's theme is bigger. + +Gore nailed Sova. Every character in Sova Transit District is complicit in something. The mind-your-business ethos IS the ring's security model. Complicity is what a working-class logistics district feels like when the grey economy is the real economy. + +But here's the thing: complicity is a FLAVOR of the game's actual theme. And the actual theme is: + +**"What do you owe the people around you?"** + +That's the question every district asks, in a different voice. + +- **Sova (logistics hub, Krenn System):** What do you owe your community? Complicity. The ring provides what the system won't. Minding your business IS loyalty. The detective asks: is exposure justice or vandalism? +- **A medical research station:** What do you owe the sick? A district where experimental lattice treatments are tested on desperate patients. The smuggler here moves test subjects, not components. The detective discovers the trials are saving lives AND killing people. Complicity shifts to: is consent meaningful when the alternative is death? +- **A political capital:** What do you owe the truth? A district where information is the contraband. News suppression, Meridian censorship, faction PR. The smuggler is a data courier. The detective is investigating leaks — but who decides what's a leak and what's journalism? +- **A frontier settlement:** What do you owe the future? A place where survival demands compromise. The ring here doesn't smuggle goods — it smuggles people. Illegal immigration to a colony that needs bodies but won't admit it. The detective arrives to enforce quotas that the community depends on violating. +- **A luxury enclave:** What do you owe yourself? A district where contentment is HIGH and the contraband is pleasure, not necessity. The ring here provides experiences, not objects. The moral ambiguity shifts: nobody is suffering, nobody needs saving, the law is being broken because the law is puritanical. The detective's job feels pointless. The smuggler's job feels hedonistic. And then someone gets hurt. + +Each district is a different moral texture. Each one asks "what do you owe?" to a different audience. The patterns are the same (triangles, FRIENDs, social sites, tells, contradictions). The FEELINGS are different. + +**This is how the game stays fresh across 100 hours.** You don't just move to a new district with new NPCs. You move to a new district with a DIFFERENT MORAL QUESTION. The investigation structure is familiar. The emotional payload is not. + +### The wow moment at scale + +The first time a player moves to a new star system and discovers that the moral landscape has shifted completely — that's a wow moment we haven't designed yet. In Sova, the smuggler was providing healthcare access. In the new district, the smuggler is moving... what? Political prisoners? Weapons? Art? Something the player might actually disagree with? + +The moment the player thinks "Wait — am I still the good guy?" in a DIFFERENT WAY than they thought it in Sova. That's the full-game version of the FRIEND contradiction. Not an NPC betraying you, but the GAME betraying your assumptions about what kind of story you're in. + +### Proposal + +Every district gets a **moral signature** — a one-sentence thematic question documented in the district design brief. Sova's is: "What do you owe your community when loyalty means silence?" Every NPC, every triangle, every FRIEND arc in that district serves that question. The content pipeline doesn't just generate NPCs with routines and secrets. It generates NPCs who embody a position on the district's moral question. + +--- + +## 2. Cultural Groups at Scale — How Many? How Different? + +### The player's experience of cultural diversity + +Here's what matters: **when the player walks into a new district, does it FEEL different?** Not "are the names different" — does the AIR feel different? Does the social rhythm change? Does the bar serve different food and play different music and have a different relationship with silence? + +Miri's Krenn brief succeeded because it didn't just name things. It described HOW PEOPLE GREET EACH OTHER (chin-lift, no words), WHAT THEY EAT (leib, supp, kalaa), HOW THEY SWEAR (perk), and WHEN THEY DRINK (kuum at shift transition). That's cultural texture the player absorbs without thinking about it. + +### How many cultural groups? + +For 5 star systems with ~4 districts each (20 districts total for the full game), I think we need **8-12 distinct cultural groups**. Not one per district — cultural groups span systems. Some districts share heritage. Some are blends. The point is that the player should encounter at least 3-4 genuinely different cultural flavors across a full playthrough, with variations within each flavor. + +### The player experience per cultural group + +Each cultural group needs to deliver THREE things to the player: + +1. **An ambient feel in the first 30 seconds.** You walk in and something is different. The greetings are different (Krenn: chin-lift silence. Another culture: verbal greeting formula, maybe even physical contact. The player's monologue notes it: "People touch each other when they say hello here. Different."). The food is different. The bar's energy is different. The SOUND is different (one culture is loud, communal; another is quiet, private). + +2. **A social rule the player has to learn.** In Krenn, the rule is: don't ask questions. Mind your business. Surnames are formal. In another culture, the rule might be: reputation is everything, insults demand response, silence is suspicious. The detective and smuggler each interact with these rules differently. The detective's institutional authority might be RESPECTED in one culture and DESPISED in another. + +3. **A way the culture protects or exposes the ring.** In Krenn, the mind-your-business ethos protects the ring. In another culture where gossip is social currency, the ring is constantly at risk of exposure through chatter. The smuggler's challenge shifts. The detective's approach shifts. Same game structure, different social terrain. + +### Cultural diversity as replayability + +Nigel's randomization axes (FRIEND pool, contraband type, who's compromised) are all within-district variation. Cultural groups are BETWEEN-district variation. A player who's mastered the social dynamics of Krenn culture enters a completely different social landscape in System B. Their smuggler skills translate mechanically but not socially. Their detective approach that worked in Krenn fails spectacularly in a culture with different authority dynamics. + +THAT'S long-term wow. Not just "new NPCs" but "new RULES for how people treat each other." The player has to relearn social navigation every time they change cultural contexts. + +### What I need from Miri at scale + +A cultural brief for every group at the depth of the Krenn brief. Not 8-12 full briefs right now — but a cultural MAP that shows: which groups exist, how they relate to each other (shared heritage? historical conflict? economic dependency?), and what each group's social "rule" is. The full briefs can come district by district. But the map needs to exist before we plan beyond Krenn. + +--- + +## 3. Content Patterns That Scale — Universal vs. Local + +### What's universal (every district has this) + +| Pattern | Why it's universal | What varies | +|---------|-------------------|-------------| +| **Social sites** (D-025) | Every district needs places where NPCs interact and the player observes | The TYPE of site (bar, market, temple, arena, workshop) changes per culture | +| **Triangles** (D-024) | 3-NPC tension is the atomic unit of social drama everywhere | The NATURE of the tension changes per moral signature | +| **THE FRIEND** | The emotional payload of betrayed trust is universal | WHO the FRIEND is, what they're hiding, HOW you discover it | +| **Dual-lens** (D-032) | Asymmetric information requires two perspectives minimum | The two perspectives can be MORE than smuggler/detective at scale | +| **Tells** | Behavioral observation is the core gameplay loop | Different cultures have different baseline behaviors, so different deviations | +| **30-minute runway** (D-027) | Life-sim attachment before contamination activates | Could be shorter or longer depending on district complexity | +| **The Cheers moment** | Every district opening needs to establish belonging (insider) or alienation (outsider) | Cultural texture determines what "belonging" looks and sounds like | + +### What's local (varies per district) + +| Pattern | Why it's local | Example | +|---------|---------------|---------| +| **Contraband type** | The moral texture of what's being moved defines the district's question | Lattice components (access), people (immigration), data (truth), pleasure (consent) | +| **The ring structure** | Criminal organizations differ by culture and economy | Krenn: family-loyalty network. Another district: corporate shell game. Another: political faction with armed wing. | +| **Authority dynamics** | How the detective's institutional power is received | Respected, feared, resented, ignored, co-opted | +| **Mundane life texture** | What "daily life" means here | Shift work vs. market stalls vs. academic cycles vs. festival rhythms | +| **The quiet moment content** | What the character reflects on when idle | Shifts with the district's mood and the player's accumulating experience | + +### The structure itself should vary — slightly + +Here's something I want to push: **not every district should have exactly 3 social sites, exactly 5 triangles, exactly 17 NPCs.** The PATTERN (social sites + triangles + FRIENDs) is universal. The SCALE varies. + +- A small frontier outpost: 2 social sites, 8 NPCs, 2 triangles, 1 FRIEND. Intimate. Personal. Everything is close. +- A sprawling market district: 5 social sites, 25 NPCs, 8 triangles, 2 FRIENDs. Dense. Overwhelming. Easy to lose threads. +- A militarized checkpoint: 2 social sites, 10 NPCs, 3 triangles, 1 FRIEND — but half the NPCs are hostile and the social dynamics are about power, not community. + +The player should feel the SCALE difference when they move between districts. "This place is tiny — everyone knows everyone" vs. "This place is huge — I can't track all these people." Both are valid experiences. Both use the same systems. Both feel completely different. + +### THE MIRROR as a long-term pattern + +D-039 mentions mirror moments (same ticker, different monologue). At scale, THE MIRROR becomes a full pattern alongside THE FRIEND: + +**THE MIRROR** is an NPC who IS the other playable character in some important way. Not literally — but thematically. In Sova, the detective NPC exists while the smuggler plays, and vice versa. At scale, THE MIRROR could be: + +- A smuggler in a district where the player is the detective, and the MIRROR smuggler's approach is different from the player's approach in a previous district +- A detective in a district where the player is the smuggler, and the MIRROR detective is better/worse/more ruthless/more compassionate than the player was +- An NPC who holds the SAME moral position the player held in a previous district, forcing the player to confront their own past choices from the outside + +THE MIRROR forces the player to see themselves reflected. THE FRIEND forces the player to feel betrayal. Together, they're the emotional backbone of every district. + +--- + +## 4. The Content Directory as a Platform + +I'm not the architecture person, but I know what the platform needs to DELIVER from a player experience perspective: + +### Requirements from the player's POV + +1. **No loading screens between districts.** The player walks through a gate or boards a transport and arrives. The content loads seamlessly. If the directory structure makes this hard, fix the directory structure. Immersion breaks destroy everything we're building. + +2. **Cultural consistency within districts, diversity between.** When the engine loads a district's content pack, everything in that pack must feel cohesive — names, slang, food, greetings, all from the same cultural brief. The content directory should make it IMPOSSIBLE to accidentally serve Krenn dialogue in a non-Krenn district. + +3. **Mod districts feel like real districts.** The architecture should be such that a modder who follows the template produces a district that's indistinguishable from official content in quality (assuming they put in the authoring work). The player shouldn't be able to tell modded from official. + +4. **The randomizer has enough to work with.** By the full game, the content directory should hold enough variation that the randomizer can produce genuinely different experiences. If there are only 2 FRIEND candidates per character per district and only 3 contraband types, the variation space is too small. The platform needs to hold 4-6 FRIEND candidates, 5-8 contraband configurations, and 3-4 triangle variation sets per district. The directory structure should make this pooling natural, not hacked. + +5. **Content can be added without restart.** Not just hot-reload for development. For the shipped game, DLC districts should slot in without requiring the player to start a new save. Walk through a new gate, arrive in a new district, the DLC content is just... there. This is a HUGE player experience win and it requires the content architecture to support runtime district discovery. + +--- + +## 5. Randomization Philosophy at Full Scale + +### Nigel's axes are the right START. Here's the full set. + +| Variation Axis | Sova v0.1 | Full Game | Player Experience | +|---------------|-----------|-----------|-------------------| +| **Who is THE FRIEND** | 1 per character | 4-6 candidates per character per district | "I can't predict who I'll care about" | +| **What's the contraband** | Lattice components | 5-8 types across the game, 2-3 per district | "The moral question is different this time" | +| **Who's compromised** | Fixed (Drin, Voss) | Role-shuffled per seed | "I can't use last game's investigation path" | +| **District moral signature** | Fixed (complicity) | Variable emphasis within the district's range | "Same place, different pressure" | +| **Cultural noise** | Fixed | Mundane events vary per seed (festivals, maintenance shutdowns, news cycles) | "The world feels alive independently of me" | +| **PC archetype** | Smuggler/Detective | 4-6 archetypes | "Completely different game from the same district" | +| **Which districts connect** | N/A (one district) | Gate network topology varies per seed | "I ended up somewhere I didn't expect" | +| **NPC backstory variation** | Fixed | Template-generated with seed-dependent details | "Kael's sibling was different this time" | +| **Storyteller pacing** | Fixed timeline | Variable event timing per D-005 | "The crisis hit earlier/later, and that changed everything" | + +### The randomization philosophy in one sentence + +**Randomize the CONTEXT. Author the MOMENTS. Let the combination create stories nobody designed.** + +The authored core is: FRIEND contradiction arcs, key monologue lines, cultural texture, moral signatures. The randomized context is: who fills what role, what's being moved, when things happen, which connections exist. The player experiences neither the authored content alone nor the randomized context alone — they experience the COMBINATION, which is unique every time. + +### The full-game wow moment from randomization + +At full scale, the player should be able to have this experience: + +Playthrough 1: They're a smuggler in Krenn. Kael is their FRIEND. They discover the exit attempt. They feel guilty about Hael. They resolve it somehow. + +Playthrough 2: They're a detective in a DIFFERENT system. Different culture, different contraband, different moral question. They meet a MIRROR NPC — a smuggler who reminds them of who they were in Playthrough 1. The MIRROR is doing what the player did. The detective must decide whether to treat the MIRROR the way THEY were investigated. + +Playthrough 3: They return to Krenn as a detective. Different seed. Kael isn't THE FRIEND this time — Maret is. The player ALREADY KNOWS Kael's secret from Playthrough 1, but their character doesn't. Kael is background noise. And Maret — the anxious scheduler they barely noticed last time — is now the person they're growing to trust. And the player thinks: "Wait. Was Maret always this important? Was I blind the first time?" + +That three-playthrough arc is the game's masterpiece. It's not authored. It's EMERGENT from authored content + randomized context + player memory. And it only works if we build the full variation space. + +--- + +## 6. PC Archetypes at Full Scale + +### The smuggler and detective are the PROOF. Not the limit. + +D-005 says: "Pick a character. Step into the [Settled Reach]. Figure it out." The character you pick determines WHERE you start, WHAT you know, WHAT you can do, and WHAT you care about. + +At full scale, I think the game needs **4-6 PC archetypes**, each with a fundamentally different relationship to the world: + +| Archetype | Core relationship to the world | What they know | What they want | Emotional experience | +|-----------|-------------------------------|----------------|----------------|---------------------| +| **The Operator** (smuggler) | Embedded insider | How things really work | Keep the machine running | Guilt, loyalty, complicity | +| **The Investigator** (detective) | Institutional outsider | How things should work | Expose what's wrong | Judgment, isolation, contaminated purpose | +| **The Newcomer** | Stranger, no context | Almost nothing | Find a place, build a life | Discovery, vulnerability, the Cheers moment earned rather than inherited | +| **The Fixer** | Connected networker | Who to call | Solve problems for a price | Pragmatism, moral flexibility, "everyone owes me" | +| **The Believer** | Ideological member | Why things should change | Advance a cause | Conviction, sacrifice, "is the cause worth the cost?" | +| **The Remnant** | Former insider, fallen | What it used to be like | Reclaim something lost | Nostalgia, regret, "was it ever what I thought it was?" | + +Each archetype creates a DIFFERENT emotional experience in the SAME district. The Operator and Investigator are already proven (smuggler/detective). The Newcomer is the "PC-as-NPC concept" taken to its extreme — a character with NO pre-existing relationships, discovering the district from zero, earning the Cheers moment over time instead of starting with it. + +### Why more archetypes matter for player experience + +The replayability matrix explodes. 6 archetypes x 20 districts x variable FRIEND/contraband/compromise = a game that's genuinely different every time for YEARS. + +But more importantly: different archetypes ask the thematic question differently. "What do you owe your community?" hits different when you're the Operator (you owe them your silence), the Investigator (you owe them the truth), the Newcomer (you owe them nothing yet), the Fixer (they owe you), the Believer (they owe the cause), or the Remnant (you owed them once and failed). + +Same district. Same NPCs. Same triangles. Six different games. Six different emotional journeys. + +### The Newcomer archetype is special + +The Newcomer deserves its own note because it inverts the Cheers moment. The Operator starts with "everyone knows your name." The Newcomer starts with "nobody knows your name." The Newcomer's Cheers moment is EARNED — the first time an NPC greets you by first name instead of ignoring you, the first time Lera remembers your order, the first time someone saves your seat at the bar. That progression from outsider to insider, earned over hours of play, is a wow moment that the Operator NEVER gets because the Operator started with it. + +The Newcomer also has the most DANGEROUS relationship with THE FRIEND. The Newcomer's FRIEND is the first person who was kind to them. The first person who broke through the cold-shoulder newcomer experience. That makes the FRIEND's contradiction even more devastating — the one person who made this place feel like home was hiding something. + +### PC archetypes and cultural groups interact + +The same archetype plays differently in different cultures. The Investigator in a culture that respects institutional authority has a different experience from the Investigator in Krenn where authority is politely distrusted. The Newcomer in a culture where strangers are welcomed has a different ramp from the Newcomer in Krenn where trust takes months. + +This is the full combinatorial space: 6 archetypes x 8-12 cultural groups x variable randomization = a game that no two players will ever describe the same way. + +--- + +## 7. The Authoring Pipeline at Scale — What I Need as the Wow Factor Advocate + +### My concern with 300+ NPCs + +If we're building 20+ districts with 15+ NPCs each, that's 300+ characters. The risk is obvious: dilution. At 300 NPCs, most of them will be mechanical — they'll have routines, tells, information inventories, and absolutely no soul. They'll be Renn and Tav and Drin from Sova, scaled up to industrial production. Furniture that talks, at scale. + +The style guide helps. The templates help. But templates can't make someone feel something. Templates produce CORRECT NPCs. They don't produce MEMORABLE ones. + +### The emotional quality assurance pipeline + +Every district needs an emotional pass — someone (me, or someone who does what I do) reading the NPC profiles and asking: "Would a player remember this person after 30 minutes?" If the answer is no for more than 60% of the roster, the district isn't ready. + +**Proposed emotional quality tiers:** + +| Tier | Count per district | Emotional standard | Production method | +|------|-------------------|-------------------|-------------------| +| **Tier 1 (THE FRIEND)** | 4-6 candidates, 1-2 active per seed | Must make the player feel betrayed | 100% hand-authored, gut-check reviewed | +| **Tier 2 (emotional NPCs)** | 5-8 per district | Must make the player feel SOMETHING — guilt, sympathy, fear, affection | 70% hand-authored, 30% template-expanded, gut-check reviewed | +| **Tier 2 (functional NPCs)** | 5-8 per district | Must serve a mechanical purpose in triangles. Correct, not necessarily memorable | 40% hand-authored, 60% template-expanded | +| **Tier 3 (atmosphere)** | 5-10 per district | Must feel like they belong. Correct cultural texture. | 20% hand-authored, 80% generated from cultural brief | + +### The gut-check line at scale + +From Round 1, I proposed: every NPC needs a voice sample that makes you pause when you read it out loud. At scale, this becomes a pipeline gate. + +**Process:** +1. Writer produces NPC profile from template +2. Writer writes 1-3 "gut-check lines" — voice samples intended to provoke emotional response +3. Emotional QA (me or equivalent) reads the lines cold +4. If zero lines land → NPC goes back for a voice pass. Not blocked — the mechanical profile is fine. But the NPC isn't DONE until at least one line resonates. +5. Tier 1 and emotional Tier 2 NPCs CANNOT ship without passing the gut-check + +This doesn't add much time per NPC. It adds enormous quality. The difference between a game with 300 correct NPCs and a game with 300 NPCs where 50 of them make you feel something is the difference between a game people play and a game people REMEMBER. + +### What the authoring tooling needs + +From my perspective, the critical authoring tools are: + +1. **The line previewer** (Mellanie's request, Tyre confirmed feasible). Writers need to see their lines in context — not just the text, but the trigger, the prerequisite, the NPC delivering it, the monologue timing. A dry YAML file doesn't tell you if the line LANDS. + +2. **The "district walkthrough" tool.** A way to play through a district's authored content in accelerated time — see the NPC routines play out, see the FRIEND arc progress, see the monologue fire. Not the full game engine — a preview mode that lets content authors and emotional QA evaluate the district's feel without building the whole game around it. + +3. **The cultural consistency checker.** A tool that scans a district's content pack and flags: names that don't match the regional brief's phonetic signature, slang from the wrong culture, food items not in the cultural menu, greeting conventions that violate the social norms. Automated cultural lint. The tool doesn't judge quality — it judges CONSISTENCY. A Nordic name in a Mediterranean-heritage district is a bug. + +4. **The variation space visualizer.** A tool that shows: for this district, here are all the FRIEND candidates, all the contraband options, all the compromise configurations. Does the space produce genuinely different experiences? Are any configurations degenerate (same effective experience despite different parameters)? Are any configurations broken (impossible states)? + +--- + +## The Long-Term Wow Moment Map + +At the full game scale, the player's emotional journey looks like this: + +**Hours 1-5 (First district, first archetype):** The Cheers moment. The FRIEND. The contradiction. The moral question. The player falls in love with a place and then watches it crack. + +**Hours 5-15 (Second district, same archetype):** Different culture, different moral texture, different FRIEND. The player realizes the STRUCTURE is familiar but the FEELINGS are new. The Divergence Reveal happens between DISTRICTS, not just between characters. + +**Hours 15-30 (Same districts, different archetype):** The MIRROR moments multiply. The player sees their previous choices reflected in NPCs. The guilt or pride from their first playthrough colors their second. Player knowledge becomes a burden — you know things your character doesn't, and that dramatic irony IS the gameplay. + +**Hours 30-60 (New systems, new cultures):** The cultural shock moments. Walking into a district where the social rules are different. The Cheers moment takes longer to earn. The FRIEND is harder to identify because the baseline behavior is unfamiliar. The player feels genuinely disoriented — and then feels the rush of LEARNING a new place, building new relationships, earning trust in a different way. + +**Hours 60-100+ (Mastery, mods, deep variation):** The player understands the GAME but not this specific SEED. They know that someone in this bar is THE FRIEND. They know there's a ring. They know the investigation will reveal something painful. But they don't know WHO, and they don't know WHAT, and the waiting — the not-knowing, while the warmth accumulates — is the most exquisite tension the game produces. + +### The final wow moment + +The player is 80 hours in. They've been a smuggler, a detective, a newcomer, a fixer across four star systems. They enter a new district. They sit at a bar. An NPC says something kind to them. And the player thinks: + +"Is this person my FRIEND? Or are they just... kind?" + +And the player realizes they can no longer tell the difference between genuine warmth and the setup for betrayal. The game has taught them to distrust kindness. And THAT — that contaminated relationship with warmth itself — is the game's final thematic statement. + +It's Gore's complicity thesis taken to its conclusion: the player has become complicit in their own inability to trust. The game didn't do this to them. Playing the game did this to them. The structure of repeated betrayal across dozens of hours has rewired how they read human behavior. + +Is that the game we want to make? I think it is. And I think it's why this game will matter. + +--- + +*Written by Ozzie. No tickets. No sprints. Just the feeling of a game that could change how someone sees the world. Let's build it.* diff --git a/docs/workshops/wiki-review/round3-paula.md b/docs/workshops/wiki-review/round3-paula.md new file mode 100644 index 000000000..28ed218c6 --- /dev/null +++ b/docs/workshops/wiki-review/round3-paula.md @@ -0,0 +1,467 @@ +# Round 3 — Paula (Librarian, Long-Term Content Strategy) + +**Scope:** The full game. Multiple star systems, dozens of districts, hundreds of NPCs, years of content. + +--- + +## 1. Is Complicity the Right Theme for the WHOLE Game? + +No. And yes. Let me complicate this. + +Complicity is the right theme for **Sova Transit District** because the smuggling ring creates a specific structure: the player knows something, benefits from it, and can't easily stop. That's complicity. The detective inverts it — the player investigates complicity rather than living inside it. Beautiful. Works perfectly for v0.1. + +But the honest truth is: complicity is ONE moral texture. A game spanning dozens of districts across multiple star systems cannot make every district about smuggling, or even about crime. Complicity as the universal theme would flatten the game into "find the crime, decide what to do about it" across 20 different backdrops. That's not a Commonwealth-scale experience — that's a procedural cop show with different wallpaper. + +### What DOES Scale: Entanglement + +The deeper theme, the one Gore actually identified but named "complicity" because Sova is the first district, is **entanglement**. Every district in The Settled Reach asks the same fundamental question: **"What does it cost to be connected to other people?"** + +Complicity is one answer. But there are others: + +| Moral Texture | Core Question | District Type | PC Experience | +|---------------|--------------|---------------|---------------| +| **Complicity** | "Can I stop?" | Criminal operation embedded in community | Sova (v0.1). Player benefits from something they can't easily exit. | +| **Obligation** | "Who do I owe?" | Tight-knit community with reciprocal debts | Colony district. Everyone helped everyone once; now everyone expects repayment. Favor networks are infrastructure. | +| **Compromise** | "How much is acceptable?" | Political/institutional hub | Administrative center. Every decision requires trading something you value for something you need. No clean hands. | +| **Sacrifice** | "What would I give up?" | Frontier/crisis zone | Settlement under pressure. Resources are scarce. Helping one person means not helping another. Triage as daily life. | +| **Loyalty** | "Who am I loyal to when loyalties conflict?" | Multi-faction crossroads | Trade hub where three factions overlap. Every relationship pulls the player in a different direction. | +| **Silence** | "What am I choosing not to see?" | Prosperous district with hidden cost | Wealthy station where comfort depends on exploitation happening elsewhere. The player can investigate or enjoy the benefits. | +| **Legacy** | "What did the people before me do, and am I responsible?" | Old settlement with buried history | Ancient colony where current prosperity was built on something terrible. History is still being covered up. | +| **Exile** | "What does belonging cost?" | Insular community with strict norms | Cultural enclave. To be accepted, the player must conform. To investigate, the player must transgress. | + +Gore's "Is this enough?" works universally because "enough" means different things in each texture. In Sova, "enough" means the quiet life. In an obligation district, "enough" means the debts you carry. In a silence district, "enough" means the comfort you don't question. + +### The Unifying Spine + +Every district has: +- **A dominant moral texture** (from the table above, or new ones as we expand) +- **A version of "Is this enough?"** that the NPCs implicitly answer through their lives +- **A FRIEND** whose arc makes the texture personal +- **A dual-lens** where two archetypes experience the texture differently + +The conspiracy layer — the Starflyer or its equivalent at full scale — operates ACROSS moral textures. A conspiracy thread might pass through a complicity district, a silence district, and a compromise district, and the player sees how the same conspiracy manifests differently in each social context. That's the game at scale: not "find the crime everywhere" but "see how the same forces create different kinds of human damage in different communities." + +### Proposal 1: Each District Declares a Moral Texture + +The content directory includes a `moral_texture` field in every district definition. This is a design declaration, not a mechanical tag — it tells content authors what kind of human drama this district explores. The texture shapes NPC generation (what kinds of secrets, what kinds of triangles), FRIEND design (what contradiction the FRIEND embodies), and monologue voice (what the PC notices, worries about, and can't stop thinking about). + +--- + +## 2. Cultural Groups at Scale + +Miri's Krenn System brief gave us Nordic-Baltic heritage for one system. The full game needs 8-12 cultural groups, and here's the part most people miss: **cultural groups are political groups**. + +### Why Culture Is Mechanical + +A cultural group isn't just naming conventions and aesthetic flavor. It determines: + +| Dimension | Mechanical Impact | Example | +|-----------|------------------|---------| +| **Trust defaults** | How quickly NPCs move from Unknown to Known to Friendly | A formal culture requires more interaction steps. An informal culture opens faster but gossips more freely. | +| **Authority response** | How NPCs react to institutional power | In one culture, Commission presence is reassuring. In another, it's threatening. Same detective, different social terrain. | +| **Privacy norms** | What counts as "surface" vs "real" vs "secret" disclosure | A culture that values collective decision-making treats workplace disputes as public. A culture that values individual autonomy treats them as private. | +| **Solidarity patterns** | When and why NPCs protect each other from outsiders | A culture with strong clan bonds may stonewall any outside investigator — even if they privately disagree with what's being hidden. | +| **Formality gradient** | When full names vs short names are used, how address changes with trust | Directly affects the dialogue selection layer. "Kael" vs "Mr. Davan" isn't cosmetic — it signals relationship state. | +| **Conflict expression** | How disputes manifest — direct confrontation vs avoidance vs institutional channels | Shapes triangle dynamics. In a direct culture, triangle tensions escalate visibly. In an avoidant culture, they simmer beneath the surface. | + +### Proposed Cultural Group Template + +Each cultural group needs a brief that maps to mechanical parameters. Not a lore dump — a **design specification** that content authors use to shape NPC behavior. + +``` +Cultural Group: [Name] +Heritage: [Real-world inspirations, for naming and phonological reference] +Settlement Era: [When they arrived in the Reach — affects formality and institutional trust] +Trust Mechanic: [fast/moderate/slow] + [trust_decay_rate: high/moderate/low] +Authority Default: [welcoming/neutral/suspicious/hostile] +Privacy Norm: [open/guarded/closed] +Solidarity Response: [individualist/community/clan] +Formality Default: [formal/informal] +Conflict Style: [direct/avoidant/institutional] +"Is this enough?": [What "enough" typically means in this culture] +Naming Conventions: [Phonological rules, surname patterns, address forms] +``` + +### How Many Do We Need? + +For a game with ~20 districts across 4-6 star systems: + +- **4-6 "founding" cultures** — the original settlement waves that colonized the Reach. These are the dominant cultures in the oldest, most established systems. High institutional trust, formal naming, slower trust mechanics. +- **3-4 "second wave" cultures** — later arrivals who settled less desirable systems or came as labor. Often working-class, informal, faster trust but higher solidarity (protect their own). Krenn's Nordic-Baltic group fits here. +- **1-2 "recent arrival" groups** — settlers from outside the Reach who bring entirely different norms. Create the "outsider" experience for PCs from these backgrounds. Lower starting trust everywhere, but bring unique knowledge or skills. +- **1 "synthetic" culture** — a culture that emerged in the Reach itself, not imported. Maybe a station-born identity, or a Meridian (FTL corridor) traveler culture. No real-world analogue — invented from scratch. + +Total: **9-13 cultural groups**. Each gets a 1-2 page brief following the template above. Miri leads generation; I validate that the mechanical parameters create interesting social gameplay in each district. + +### The Political Dimension + +Cultural groups don't just exist in isolation. They have RELATIONSHIPS with each other: + +- **Historical tensions** — Group A settled land Group B claims ancestral rights to. This isn't backstory color — it's a triangle between NPCs from different groups. +- **Economic dependencies** — Group C's economy depends on trade with Group D. When a conspiracy disrupts that trade, the political fallout is cultural. +- **Institutional power** — Which group dominates the Commission? Which groups are underrepresented? A detective from the dominant culture has different social terrain than a detective from a minority group. + +These inter-group dynamics create **system-level triangles** — the same triangle pattern that works for 3 NPCs in a bar also works for 3 cultural groups in a star system. + +### Proposal 2: Cultural Group Briefs as Content Specifications + +Each cultural group gets a brief (generated by Miri, validated by Paula and Gestalt) that includes both lore content and mechanical parameters. The mechanical parameters feed directly into NPC generation — an NPC's cultural group shapes their trust defaults, privacy norms, and conflict expression, which in turn shapes their dialogue selection and triangle behavior. + +--- + +## 3. Content Patterns That Scale + +Triangles, THE FRIEND, and social sites are our proven atomic patterns. But the full game needs a larger pattern vocabulary. Some patterns I've seen work in v0.1 that can be generalized, and some that the full game demands. + +### Universal Patterns (Present in Every District) + +| Pattern | What It Is | Why It's Universal | v0.1 Instance | +|---------|-----------|-------------------|---------------| +| **THE FRIEND** | One NPC per PC archetype whose arc makes the moral texture personal | Without it, the texture is abstract. The FRIEND makes it a relationship. | Kael (smuggler), Sera (detective) | +| **Triangles** | 3 NPCs with conflicting interests, atomic unit of social intrigue | Conflict between 2 people is a fight. Conflict among 3 is politics. | 5 triangles in Sova | +| **Social Sites** | 4-8 NPCs in physical proximity with sightlines and routines | Social observation requires co-location. The site is the stage. | Terminal, Bar, Ring | +| **The 30/50/20 Split** | Flat / mundane triangles / entangled with story | Signal needs noise floor. Life needs to feel real. | D-029 ratio | +| **Dual-Lens** | Two PC archetypes experience the same district differently | Replayability through perspective, not new content | Smuggler vs detective | + +### New Patterns for the Full Game + +**THE MIRROR** — An NPC who embodies the path the PC didn't take. The smuggler who went straight. The detective who became corrupt. The merchant who chose poverty over compromise. This NPC doesn't have a contradiction arc — they ARE a contradiction to the PC's existence. Content requirements: full 10-axis profile, authored relationship history with the PC archetype, 3-phase arc (recognition → comparison → reckoning), ~40-60 authored lines. One per district, tied to the dominant PC archetype. + +**THE ANCHOR** — An NPC who represents what the PC would be if the story never touched them. A version of contentment that isn't naive but isn't tested. Gore's "Is this enough?" made flesh — this person's answer is "yes, and here's why." Content requirements: Tier 2 depth, authored "quiet moment" monologue (the PC watching THE ANCHOR live their life and wondering), 1-2 authored conversations that reveal genuine satisfaction. The ANCHOR's purpose is to make the player WANT the quiet life, which makes the story's intrusion painful. One per district. + +**THE SYSTEM** — An NPC who IS the institution. Not corrupt, not heroic — just embodying the rules. The customs officer who follows procedure. The station administrator who applies policy. The Commission investigator (in non-detective districts) who does their job competently and impartially. Content requirements: Tier 2 depth, authored "institutional voice" (how they quote regulations, reference precedent, cite authority), 2-3 authored moments where the institution's neutrality creates injustice without anyone being at fault. THE SYSTEM makes the player confront whether the problem is individuals or structures. One per district. + +**THE GHOST** — A character referenced by multiple NPCs but never directly encountered in this district. Maybe they left. Maybe they died. Maybe they're in another district. The player learns about THE GHOST through other people's memories, grudges, and grief. Content requirements: NO authored lines (the ghost doesn't speak), but every NPC who references them gets 2-3 authored lines about the ghost. The ghost exists in the negative space between stories. Optional per district — powerful when used, but overuse diminishes impact. Better in 30-40% of districts. + +**THE CATALYST** — An NPC who arrives mid-story and disrupts the equilibrium. The new worker. The transferred investigator. The merchant who opens a competing shop. Unlike THE FRIEND (who IS the equilibrium), THE CATALYST breaks it. Content requirements: Tier 2 depth, authored arrival sequence (how NPCs react to the newcomer), 2-3 authored "disruption moments" where established routines break. One per district, activated by the storyteller at the dramatically appropriate moment. + +### Pattern Composition Rules + +Each district instantiates from the pattern library following composition rules: + +``` +REQUIRED per district: + - 1 FRIEND per supported PC archetype + - 3-5 Triangles (minimum) + - 2-3 Social Sites (minimum) + - 1 ANCHOR + - 1 SYSTEM + - 30/50/20 population split (±5%) + +OPTIONAL per district: + - 1 MIRROR (recommended for districts with strong moral texture) + - 1 GHOST (recommended for districts with legacy/silence textures) + - 1 CATALYST (storyteller-activated, recommended for longer play sessions) + - Additional triangles and social sites as district complexity warrants +``` + +### Proposal 3: Formal NPC Pattern Library + +Document each pattern type (FRIEND, MIRROR, ANCHOR, SYSTEM, GHOST, CATALYST) as a reusable specification with: purpose, content requirements, authored line budget, relationship to moral texture, and composition rules. This library grows over time — DLC can add new patterns. + +--- + +## 4. The Content Directory as a Platform + +Tyre's three-layer stack (base/DLC/mods) is architecturally right. Let me add the NARRATIVE layer — what the content directory needs to support cross-district storytelling. + +### The Directory Must Support Four Scopes + +| Scope | What Lives Here | Example | +|-------|----------------|---------| +| **Universal** | Pattern definitions, archetype specs, cultural group briefs, tag taxonomies | THE FRIEND pattern spec, smuggler archetype, tag enum lists | +| **Faction** | Faction definitions, faction-level NPCs, cross-system storylines | Commission leadership, Syndic trade routes, conspiracy threads | +| **System** | System-level setting, dominant cultural group, inter-district connections | Krenn System brief, Krenn-specific naming tables, system events | +| **District** | The actual playable content — NPCs, triangles, social sites, dialogue pools | Sova Transit District, all its NPCs, all its dialogue YAML | + +This hierarchy matters because STORIES CROSS BOUNDARIES. The conspiracy doesn't respect district lines. A faction's influence spans systems. A cultural group's norms apply across multiple districts. The content directory must make these cross-references explicit and validatable. + +### Cross-District References + +The biggest structural challenge at scale: how does content in District A reference content in District B? + +**Principle: Districts are self-contained for PLAY, but connected for NARRATIVE.** + +A player playing in Sova doesn't need District B's content loaded. But a character in Sova might reference events in District B, or an NPC might have a `known_by` entry from an NPC who lives in District B. These references are: + +1. **Soft references** — dialogue lines that mention another district by name. No mechanical dependency. Handled by the tag system (freeform tags like `references:krenn_central`). +2. **Hard references** — a FactId in District A that depends on a FactId in District B. Example: `conspiracy.krenn_cell` in Sova references `conspiracy.krenn_network` which is defined at the system level. Hard references require the referenced content to exist in the content directory. Validated by schema. +3. **Migration references** — an NPC who appears in multiple districts (rare, high-value). Example: a Commission investigator who was in District A and transferred to District B. Carries relationship history from one district to another. This is the most complex case — the NPC has TWO district entries (one per district) with a shared identity record at the system level. + +### Content Validation at Scale + +With 20+ districts, manual cross-reference checking is impossible. The content directory needs: + +- **Schema validation per content type** (Tyre's proposal, endorsed) +- **Cross-reference validation** — every hard reference resolves to an existing content entry +- **Pattern completeness checking** — every district has the required patterns (1 FRIEND per archetype, 3+ triangles, etc.) +- **Cultural consistency checking** — NPC naming follows their cultural group's phonological rules +- **Bidirectional relationship validation** — if NPC A knows NPC B, NPC B's `known_by` includes NPC A (extended from the PC-candidate spec to all NPCs at scale) + +### Mod Support: Narrative Constraints + +Modders can create new districts, new cultural groups, new NPC patterns. But the mod system must enforce narrative constraints: + +- A mod district declares its cultural group (from the canonical list, or defines a new one) +- A mod district declares its moral texture +- A mod district must pass pattern completeness checks +- A mod can ADD soft references to base content but cannot MODIFY base district content +- A mod can create new faction-level content that integrates with existing faction structures via MERGE operations (Tyre's proposal) + +### Proposal 4: Four-Scope Content Hierarchy + +The content directory uses four scopes (universal/faction/system/district) with explicit cross-reference types (soft/hard/migration). Schema validation enforces completeness and consistency. Mod overlays operate at the district scope by default with controlled access to higher scopes. + +--- + +## 5. Randomization Philosophy + +This is where narrative and systems collide most violently. Let me lay out the tension honestly. + +### The Fundamental Tension + +**Randomization creates replayability.** Nigel is right — if every playthrough is the same, the game dies after two runs. + +**Authored content creates emotional impact.** Mellanie is right — THE FRIEND's contradiction arc only hits if the lines are hand-crafted. + +**You cannot have both at maximum.** The more you randomize, the less you can author. The more you author, the less you can randomize. Every design decision in this space is a trade-off. + +### What Gets Randomized (Structural Axes) + +These are set at game start and don't change during play: + +| Axis | What Varies | What Doesn't | Replayability Impact | +|------|-------------|--------------|---------------------| +| **FRIEND selection** | Which NPC from the FRIEND pool fills the role | The FRIEND pattern itself (5-phase arc, contradiction, authored lines) | High — different person, different emotional attachment | +| **Contraband type** | What's being smuggled/investigated (from district options) | The fact that something IS being smuggled | Medium — different moral weight, different investigation vectors | +| **Entanglement assignment** | Which mundane NPCs get pulled into the story | The 30/50/20 ratio, the existence of mundane life | High — different playthroughs contaminate different people | +| **Triangle configuration** | Which optional triangles activate, which NPCs fill roles | Required triangles always fire, minimum triangle count | Medium — different social tensions each time | +| **PC-candidate selection** | Which NPC becomes the PC (from archetype pool) | The archetype's agency boundaries, knowledge vocabulary | High — different starting relationships, different social terrain | +| **Arrival timing** | When THE CATALYST arrives, when story beats escalate | The existence of escalation, the existence of the catalyst | Medium — different pacing each playthrough | +| **Cultural minority** | Which non-dominant cultural groups are present in this district instance | The dominant culture, the district's character | Low-Medium — adds flavor variation without changing structure | + +### What NEVER Gets Randomized + +- **The moral texture of a district** — Sova is always about complicity. A frontier district is always about sacrifice. This is the author's declaration. +- **The pattern composition** — every district always has a FRIEND, triangles, social sites, the population split +- **Authored content** — THE FRIEND's authored lines play as written. No generation pass on Tier 1. The voice is the voice. +- **Cultural group mechanics** — the trust defaults, authority response, privacy norms of a cultural group are fixed. They're part of the setting, not a variable. + +### The Pool Model at Scale + +The key insight from v0.1: THE FRIEND isn't a single NPC. It's a **pattern** filled by one NPC from a **pool**. At scale: + +- Each district has a FRIEND pool of 2-4 candidate NPCs per supported archetype +- Each candidate has the FULL Tier 1 content — all authored lines, full contradiction arc, complete B1-B7 PC-candidate appendix +- The randomizer selects ONE candidate per archetype per playthrough +- Non-selected candidates become regular Tier 2 NPCs (their FRIEND content is dormant, not absent — they still have authored lines that can surface in other contexts) +- This means: a FRIEND pool of 3 candidates per archetype costs 3x Tier 1 authoring. Expensive. But it buys fundamental replayability. + +**The math gets serious.** If each district has 2 archetypes with 3 FRIEND candidates each = 6 Tier 1 NPCs per district. At 20 districts = 120 Tier 1 NPCs. At 70-100 authored lines each = 8,400-12,000 hand-authored Tier 1 lines. This is the single largest content investment in the game. It must be budgeted explicitly and cannot be generated. + +### Randomization as Narrative Tool + +The honest truth: randomization isn't just a replayability technique. It's a NARRATIVE technique. When the player discovers that their FRIEND in playthrough 2 is a DIFFERENT person than in playthrough 1, that's a statement about the game's world — this community is full of people who COULD be your closest connection, and circumstance determines which one becomes it. That's entanglement as theme, expressed through randomization. + +### Proposal 5: Randomization Charter + +Document the full randomization philosophy as a design charter: what varies, what doesn't, the pool model for pattern NPCs, the cost implications, and the narrative justification. This charter is referenced by every content author to understand what they're writing for (single-use vs. pool candidate). + +--- + +## 6. PC-as-NPC at Full Scale + +v0.1 has 2 PC archetypes: smuggler and detective. The full game needs more — but how many, and what do they look like? + +### Archetype Design Principles + +A PC archetype isn't just "a job." It's a **relationship to the district's moral texture**. The smuggler isn't just a criminal — the smuggler is someone whose daily life IS the moral texture (complicity). The detective isn't just an investigator — the detective is someone who examines the moral texture from outside. + +This gives us the design principle: **every archetype is a LENS on the same district**. Two archetypes seeing the same district should produce fundamentally different games (D-027 criterion #2). + +### Proposed Archetype Library + +| Archetype | Relationship to Moral Texture | Knowledge Vocabulary | Unique Gameplay Loop | Best In | +|-----------|------------------------------|---------------------|---------------------|---------| +| **Smuggler** | Inside the complicity | operational_status, exposure_risk, loyalty_read, complicity_level | Manage exposure, protect people, balance profit vs safety | Complicity, Silence | +| **Investigator** | Examining the texture from institutional authority | behavior_flags, contradiction_flagged, evidence_strength, case_progress | Observe, document, build case, decide who to pursue | All textures (universal) | +| **Merchant** | Economically entangled with the texture | trade_reputation, debt_owed, supply_dependency, price_leverage | Navigate economic webs, manage debts, choose profit vs relationships | Obligation, Compromise | +| **Engineer** | Maintaining the infrastructure the texture depends on | system_access, repair_knowledge, infrastructure_vulnerability, sabotage_potential | Fix or break things, control physical access, discover infrastructure secrets | Sacrifice, Legacy | +| **Administrator** | Managing the texture's political expression | faction_standing, favor_owed, policy_leverage, constituency_trust | Broker deals, manage factions, enforce or bend rules | Compromise, Loyalty | +| **Medic** | Treating the texture's human cost | patient_status, medical_confidentiality, treatment_access, triage_priority | Heal people, protect patient secrets, decide who gets scarce resources | Sacrifice, Obligation | +| **Journalist** | Exposing the texture to outside scrutiny | source_reliability, story_progress, publication_risk, source_protection | Gather information, protect sources, decide what to publish | Silence, Legacy | +| **Newcomer** | Discovering the texture from zero knowledge | local_knowledge, cultural_fluency, social_integration, outsider_perception | Learn everything from scratch, build trust from nothing, see what insiders can't | Exile, any texture with insular dynamics | + +### Not Every Archetype Appears Everywhere + +Each district supports 2-4 archetypes based on its moral texture and institutional landscape. The supported archetypes are declared in the district definition: + +```yaml +district: + name: "Sova Transit District" + moral_texture: "complicity" + supported_archetypes: + - smuggler # insider + - investigator # outsider authority + optional_archetypes: + - merchant # if trade focus emphasizes economic angle +``` + +Some archetypes are **universal** (Investigator works everywhere — there's always something to investigate). Others are **specialized** (Medic only works in districts where healthcare access is narratively relevant). + +### PC-Candidate Pool at Scale + +For each supported archetype, the district has 2-4 PC-candidate NPCs. The math: + +| | Per District | 20 Districts | Authoring Cost | +|-|-------------|-------------|----------------| +| Archetypes supported | 2-4 | 40-80 archetype slots | — | +| PC-candidates per archetype | 2-3 | 80-240 candidates | B1-B7 appendix each | +| Unique candidates (deduplicated) | 4-8 | 80-160 (some overlap) | Full Tier 1 or Tier 2 + appendix | + +The honest truth: 80-160 PC-candidate NPCs is a massive content commitment. Each needs the full B1-B7 appendix (starting knowledge, reverse knowledge, orientation monologue, agency boundaries, relationship stubs, tell inversion). This is where pipeline efficiency becomes critical (see section 7). + +### Archetype Voice Differentiation + +The deepest challenge at scale: each archetype needs a distinct internal voice. The smuggler's monologue is relational ("I feel, I read, I manage"). The detective's is analytical ("I notice, I flag, I investigate"). At 8 archetypes, we need 8 distinct monologue voices: + +| Archetype | Monologue Voice | Notices | Worries About | Can't Stop Thinking About | +|-----------|----------------|---------|---------------|--------------------------| +| Smuggler | Relational, protective | Social dynamics, trust shifts | Exposure, loyalty fractures | The people who depend on them | +| Investigator | Analytical, methodical | Behavioral anomalies, patterns | Missing evidence, false leads | What they haven't seen yet | +| Merchant | Transactional, pragmatic | Economic signals, debt patterns | Bad deals, broken supply chains | The price of everything | +| Engineer | Structural, systemic | Infrastructure state, failure points | System collapse, access loss | How things connect | +| Administrator | Political, calculating | Power dynamics, faction moves | Losing influence, constituency anger | Who wants what from whom | +| Medic | Empathetic, diagnostic | Physical symptoms, distress signs | Patient outcomes, resource scarcity | The people they couldn't help | +| Journalist | Curious, skeptical | Inconsistencies, evasions | Source safety, story accuracy | The story behind the story | +| Newcomer | Observational, uncertain | Cultural norms, social rules | Belonging, making mistakes | What everyone else seems to know | + +### Proposal 6: Archetype Specification Standard + +Each archetype gets a formal specification including: relationship to moral textures, knowledge vocabulary (entity attributes + FactIds), monologue voice guide, agency boundaries, supported district types, and PC-candidate pool requirements. The archetype spec is the authoring bible for all PC-candidate content in that archetype. + +--- + +## 7. The Authoring Pipeline at Scale + +Let me do the math honestly, then propose how to make it survivable. + +### The Numbers + +**NPCs per district** (average): +- 2 Tier 1 FRIEND candidates per archetype × 2.5 archetypes = 5 Tier 1 +- 1 Tier 1.5 (ANCHOR or emotional NPC) = 1 +- 8-12 Tier 2 (triangles, social sites, pattern NPCs) = 10 +- 5-10 Tier 3 (flat population, background) = 7 +- **Total per district: ~23 NPCs** + +**Full game** (20 districts): +- ~100 Tier 1 NPCs × 80 authored lines avg = **8,000 Tier 1 lines** (all hand-authored, no generation) +- ~20 Tier 1.5 NPCs × 60 authored lines avg = **1,200 Tier 1.5 lines** (hand-authored, minimal generation) +- ~200 Tier 2 NPCs × 50 authored lines avg = **10,000 Tier 2 lines** (hand-authored, 4x generation → 40,000 total) +- ~140 Tier 3 NPCs × 12 authored lines avg = **1,680 Tier 3 lines** (hand-authored, 4x generation → 6,720 total) +- **Total hand-authored: ~20,880 lines** +- **Total after generation: ~55,920 lines** +- **PC-candidate appendixes: ~120 candidates × B1-B7** + +This is a serious body of work. For context: a typical AAA RPG has 100,000-300,000 words of dialogue. At ~10 words per line, our 56,000 lines = ~560,000 words. We're in the range of a large RPG, which is appropriate for a game about social interaction — but it requires industrial-grade authoring infrastructure. + +### Pipeline Phases + +**Phase 1: District Design (Lead Author)** +One lead author per district. They produce: +- District definition (moral texture, supported archetypes, cultural group) +- Pattern assignment (which patterns this district uses) +- Triangle design (the specific conflicts) +- NPC roster (who fills what role) +- The FRIEND brief (full character concept for each FRIEND candidate) + +**Phase 2: NPC Authoring (Writing Team)** +2-3 writers per district, supervised by the lead author. They produce: +- NPC profiles (following tier templates from the style guide) +- Dialogue line pools (tagged YAML, following the converged taxonomy) +- Monologue pools (per-character, per-location) +- Environmental text (rosters, manifests, bar tabs, kiosk entries) +- PC-candidate appendixes (for candidate NPCs) + +**Phase 3: Generation Pass (Tooling)** +Automated expansion of authored content: +- Tier 2 lines: authored 50 → generated 200 (4x) +- Tier 3 lines: authored 12 → generated 48 (4x) +- Tier 1 and 1.5: NO generation. All hand-authored. +- Generation follows trait transformation guides (per template) +- All generated lines tagged with `generated: true` for review + +**Phase 4: Cross-Reference Validation (Automated)** +Schema validation catches: +- Missing FactId references +- Broken bidirectional relationships +- Incomplete pattern composition +- Cultural naming violations +- Cross-district reference integrity + +**Phase 5: Voice Consistency Review (Senior Authors)** +Human review catches what automation can't: +- Does this NPC sound like a person? +- Does the FRIEND's contradiction arc actually feel like betrayal? +- Does the moral texture come through in daily dialogue? +- Does the dual-lens actually produce different experiences? + +**Phase 6: Playtest Integration (QA + Line Previewer)** +The line previewer CLI (D-028) becomes the primary testing tool: +- Simulated conversations with randomized state +- Verify that trust gates work (surface → real → secret progression) +- Verify that dual-lens content diverges correctly +- Verify that orientation monologue fires in the right order +- Full district playthrough (30-minute target) with both archetypes + +### Scaling the Team + +For 20 districts over a multi-year development: + +| Role | Count | Responsibility | +|------|-------|---------------| +| **Content Director** | 1 | Overall narrative coherence, moral texture assignments, archetype consistency | +| **District Lead Authors** | 4-5 (rotating across districts) | District design, FRIEND writing, NPC roster, quality gate | +| **NPC Writers** | 8-12 | Dialogue pools, monologue pools, environmental text, following templates | +| **Cultural Consultants** | 2-3 | Cultural group briefs, naming validation, mechanical parameter tuning | +| **Generation QA** | 2-3 | Review generated content, flag quality issues, tune generation parameters | +| **Cross-Reference Validator** | 1-2 (primarily automated) | Run validation pipeline, resolve broken references, maintain consistency | + +This is a team of ~18-25 content professionals at peak production. Not unprecedented for a narrative-heavy game, but significant. The pipeline tooling — schema validators, line previewer, generation system, cross-reference checker — is load-bearing. Without it, this team produces inconsistent content. With it, the templates and validation enforce quality at scale. + +### The DLC Pipeline + +DLC adds new districts following the same pipeline. The content directory's four-scope hierarchy means a DLC district: +1. Inherits universal content (patterns, archetypes, tag taxonomies) +2. Inherits faction content (if the faction exists in base game) +3. May introduce a new system (requires system-level brief) or join an existing one +4. Produces self-contained district content following the same templates +5. Optionally introduces new cultural groups, new archetypes, or new NPC patterns +6. Passes the same validation pipeline as base content + +The honest truth: the pipeline I'm describing is a **content management system**, not just a set of templates. It needs tooling investment comparable to the game engine itself. But the alternative — unstructured authoring at this scale — produces inconsistent, unvalidatable, unmaintainable content. The structure IS the quality. + +### Proposal 7: Authoring Pipeline Architecture Document + +Write a full authoring pipeline specification covering: district design workflow, NPC authoring workflow, generation pass protocol, validation pipeline, voice review checklist, playtest integration, team structure, and DLC extension protocol. This document is the content team's equivalent of the technical architecture doc. + +--- + +## Summary of Long-Term Proposals + +| # | Proposal | Scope | Dependencies | +|---|----------|-------|-------------| +| 1 | Each district declares a moral texture from a defined vocabulary | Universal | None — design declaration | +| 2 | Cultural group briefs as mechanical specifications (9-13 groups) | Universal | Miri (generation), Paula (validation), Gestalt (parameters) | +| 3 | Formal NPC pattern library (FRIEND, MIRROR, ANCHOR, SYSTEM, GHOST, CATALYST) | Universal | Pattern specs need authoring after team review | +| 4 | Four-scope content hierarchy (universal/faction/system/district) | Architecture | Tyre (directory structure), validation tooling | +| 5 | Randomization charter documenting what varies, what doesn't, and the pool model | Universal | Team consensus on axes | +| 6 | Archetype specification standard (8 archetypes with formal specs) | Universal | Knowledge vocabulary per archetype | +| 7 | Authoring pipeline architecture document | Process | Tooling investment, team structure decisions | + +### The Thread That Connects Everything + +Every proposal above serves one principle: **The Settled Reach is a game about what it costs to be connected to other people.** Moral textures are how districts express that theme. Cultural groups are how communities shape that cost. NPC patterns are how individual characters embody it. The content directory preserves it across hundreds of files. Randomization ensures players experience it differently each time. Archetypes are the lenses through which players see it. And the pipeline is how we produce it without losing the human voice that makes it matter. + +The game at scale isn't 20 copies of Sova. It's 20 communities, each asking "Is this enough?" in their own language, through their own culture, about their own version of entanglement. The player moves between them and slowly realizes: this question has no final answer. That's the game. diff --git a/docs/workshops/wiki-review/round3-si.md b/docs/workshops/wiki-review/round3-si.md new file mode 100644 index 000000000..97204996d --- /dev/null +++ b/docs/workshops/wiki-review/round3-si.md @@ -0,0 +1,295 @@ +# Round 3 — SI (Project Manager) + +Long-term content strategy from the production perspective. I don't design — I plan delivery. Here's what I see when I look at 20+ districts, 300+ NPCs, and years of content. + +--- + +## 1. Complicity as Theme — The Production Implication + +Whether complicity is the whole game or Sova's local flavor is a design question. The production question is: **does a per-district thematic variation change the authoring pipeline?** + +If every district is a complicity story, we can templatize hard. The FRIEND pattern, the MIRROR pattern, the triangle structures, the moral arc — all reusable across districts with different setting skins. One pipeline, one set of validation tools, one style guide. Authors learn the system once. + +If each district has its own thematic texture (Sova = complicity, District B = loyalty, District C = survival), then each district needs: +- Its own moral arc vocabulary (complicity.cost_to_hael equivalents per theme) +- Its own monologue trigger set (moral_pang works for complicity — what triggers for a loyalty-themed district?) +- Its own PC experience framework +- Potentially its own NPC patterns beyond FRIEND/MIRROR + +That's a significantly harder pipeline. Not impossible — but the authoring cost per district rises because less is reusable. + +**My recommendation:** Use a hybrid. Define a **thematic palette** — 4-6 moral textures that the game explores. Each district draws from 1-2 of these. The vocabulary for each texture is defined once at the global level. Districts compose from the palette rather than inventing from scratch. + +This is the content equivalent of Gestalt's social site templates — authored building blocks, combinatorially composed. The moral arc phases (Comfort → Doubt → Reckoning → Compromise) might be universal, but what fills each phase varies by thematic texture. + +--- + +## 2. Cultural Groups — Production Planning + +Miri delivered one cultural brief in ~4 hours of workshop time. That brief is excellent and thorough. At that depth, one brief per cultural group means: + +| Scale | Cultural Groups | Miri-Hours | Calendar Time (1 Miri) | +|-------|----------------|------------|----------------------| +| v0.1 | 1 (Krenn) | ~4h | Done | +| v0.2 | 3-4 | ~12-16h | 1-2 weeks | +| v1.0 | 8-12 | ~32-48h | 4-6 weeks | +| Full game | 15-25 | ~60-100h | 2-3 months | + +This is manageable IF: +1. The regional template (_template.md) is locked and validated from v0.1 +2. Miri produces the briefs in batches of 3-4 per release +3. Each brief goes through a single-pass review (not a multi-round workshop) +4. Heritage research is front-loaded — Miri builds a master heritage map once, then writes individual briefs from it + +**The master heritage map** is the key long-term asset. A document that shows: which Earth cultural clusters settled where, how they mixed, what 180 years of drift produced. From this map, individual briefs are derivations, not inventions. Miri should build this map BEFORE writing the next brief. + +**Production sequence:** +1. Master heritage map (Miri, ~2 days) +2. Cultural briefs in release batches, prioritized by which districts are in the next sprint +3. Naming generation pools per cultural group (reusable for NPC generation) + +--- + +## 3. Content Patterns — What Scales and What Doesn't + +From the production management perspective, I'm categorizing every pattern by **reuse ratio** — how many times it gets instantiated vs. how much it costs to define. + +### High reuse (define once, instantiate everywhere) + +| Pattern | Definition Cost | Instantiation Cost | Reuse Ratio | +|---------|----------------|-------------------|-------------| +| Tier 2 NPC template | Already defined | 4-6 hours per NPC | 1:300+ | +| Tier 3 NPC template | Already defined | 0.5-1 hour per NPC | 1:1000+ | +| Social site template structure | Already defined | 2-3 hours per site | 1:60+ | +| Triangle structure | Already defined | 1-2 hours per triangle | 1:100+ | +| Dialogue tag taxonomy (D-035) | Already defined | 0 per district | 1:∞ | +| Pool-based randomization | Already defined | 30min per pool | 1:60+ | + +### Medium reuse (define per category, instantiate per district) + +| Pattern | Definition Cost | Instantiation Cost | Reuse Ratio | +|---------|----------------|-------------------|-------------| +| Cultural brief | ~4 hours | 0 per district in that culture | 1:3-5 districts | +| Thematic texture vocabulary | ~2-3 hours per texture | 1 hour integration per district | 1:5-10 | +| PC archetype | ~8-12 hours | ~4 hours per district variant | 1:10-20 | +| FRIEND pool expansion | 15-22 hours per candidate | 0 (one-time) | 1:1 | + +### Low reuse (unique per district) + +| Pattern | Definition Cost | Instantiation Cost | Reuse Ratio | +|---------|----------------|-------------------|-------------| +| THE FRIEND candidate | 15-22 hours each | N/A | 1:1 | +| THE MIRROR candidate | 10-15 hours each | N/A | 1:1 | +| Tier 1 contradiction arc | 8-12 hours | N/A | 1:1 | +| District-specific FactIds | 2-3 hours per district | N/A | 1:1 | +| Environmental text (Krenn-specific) | 4-6 hours per district | N/A | 1:1 | + +**The bottleneck is clear: Tier 1 content.** Everything else scales through templates and generation. THE FRIEND and THE MIRROR are 15-22 hours of irreducible authored content per instance. At 2-3 FRIENDs per district and 1 MIRROR per district, that's 45-80 hours of Tier 1 authoring per district. + +**For 20 districts: 900-1600 hours of Tier 1 content alone.** That's 6-10 months of a single full-time writer. With 2-3 writers in parallel: 3-4 months. This is the critical path for content delivery. + +--- + +## 4. The Authoring Pipeline at Scale + +### The math + +| Content Type | Per District | 20 Districts | Hours Each | Total Hours | +|-------------|-------------|-------------|-----------|-------------| +| Tier 1 NPCs (FRIEND + MIRROR) | 3-4 | 60-80 | 15-22h | 900-1760 | +| Tier 2 NPCs | 8-12 | 160-240 | 4-6h | 640-1440 | +| Tier 3 NPCs | 5-10 | 100-200 | 0.5-1h | 50-200 | +| Social site templates | 3-5 | 60-100 | 2-3h | 120-300 | +| Triangles | 4-6 | 80-120 | 1-2h | 80-240 | +| Environmental text | 1 set | 20 sets | 4-6h | 80-120 | +| Cultural integration | 1 pass | 20 passes | 2-3h | 40-60 | +| **Total** | | | | **1910-4120** | + +That's 1-2 person-years of content authoring. For a game this size, that's actually modest — but only if the pipeline is efficient. + +### The pipeline model + +**Phase 1: Foundation (one-time)** +- Master heritage map +- Thematic palette (4-6 moral textures) +- All templates locked (Tier 1/1.5/2/3, social site, triangle, pool) +- Content directory structure finalized +- Schema validation working +- Generation tools built (Tier 3 generator, line expansion tool) + +**Phase 2: Per-district production (repeating)** +1. **District brief** (Miri, 1 day) — setting, culture reference, social sites, key NPCs +2. **Content skeleton** (tooling, 1 hour) — auto-generate directory structure, empty YAML stubs +3. **Tier 2 NPCs** (Paula + Mellanie, 3-5 days per district) — working profiles, dialogue, monologue +4. **Tier 1 NPCs** (Paula primary, 5-8 days per district) — FRIEND candidates, MIRROR candidate, full arcs +5. **Tier 3 generation** (tooling, 1 day) — procedural NPCs from templates + cultural brief +6. **Line expansion** (tooling + Mellanie review, 2-3 days) — write 10, generate 40, review 40 +7. **Validation pass** (tooling + Hoshe, 1 day) — schema validation, cross-reference check, playtest +8. **Integration** (Dudley, 1-2 days) — wire into engine, test in context + +**Per-district cycle: 2-3 weeks with 2-3 parallel writers.** At that rate, 20 districts = 40-60 weeks = 10-15 months. That's a realistic production timeline for content. + +### The large content push pattern (from CLAUDE.md) + +For batch district production, use the pattern already documented: +1. **Lore librarian** (Miri, read-only) — answers context queries, tracks cross-district consistency +2. **Multiple writers** (Paula, Mellanie, future agents, parallel by district) — write directly to disk +3. **Reviewer** (Hoshe + schema validation) — voice consistency, attribute uniformity + +This pattern parallelizes naturally. Districts are independent content units. Two writers can produce two districts simultaneously without interference, as long as the librarian catches cross-references. + +--- + +## 5. Tooling Requirements + +The pipeline above requires tooling that doesn't exist yet. Here's the tooling roadmap: + +### Must-have (before scaling past v0.1) + +| Tool | Purpose | Owner | +|------|---------|-------| +| `make validate-content` | Schema validation for all YAML | Server team (Tyre) | +| NPC skeleton generator | Given a district brief, generate empty NPC YAML stubs with correct structure | Server team | +| Line ID allocator | Assign sequential line IDs per location/character to prevent collisions | Server team | +| FactId registry | Central registry with collision detection across districts | Server team | + +### Should-have (before scaling past v0.2) + +| Tool | Purpose | Owner | +|------|---------|-------| +| Tier 3 NPC generator | Produce complete Tier 3 NPCs from template + cultural brief + seed | Server team | +| Line expansion tool | Write 10 authored lines → generate 40 variants at matching voice/style | Server team | +| Line previewer CLI (D-028) | Play back dialogue/monologue lines in context for authoring review | Server team | +| Cross-reference validator | Verify all NPC references, FactId references, location slugs resolve | Server team | +| Bidirectional knowledge checker | Verify PC←→NPC knowledge graph consistency | Server team | + +### Nice-to-have (quality of life) + +| Tool | Purpose | Owner | +|------|---------|-------| +| District dashboard | Show content completion % per district (NPCs, lines, validation status) | CI team | +| Content diff tool | Show what changed between content versions for review | CI team | +| Voice consistency checker | Flag lines that break character voice patterns | Server team | + +--- + +## 6. Content Directory Long-Term Requirements + +Tyre and Gestalt's structure handles 20+ districts IF these constraints hold: + +### What scales naturally +- `districts/{slug}/` — one directory per district, independent, no cross-contamination +- `global/` — shared vocabulary grows slowly (factions, technology, enums) +- `_schema/` — schemas evolve but don't multiply (one npc.schema.yaml handles all tiers) +- Mod overlay (ADD/REPLACE/MERGE) — works at any scale + +### What needs attention at scale +- **Global facts vs district facts** (Gestalt's split) — essential. Without this, the global facts.yaml becomes a dump of hundreds of district-specific entries. +- **Cross-district references** — NPCs who appear in multiple districts (e.g., a Commission investigator who moves between postings). The canonical_id system handles this, but the content loader needs to resolve cross-district references. +- **DLC packaging** — a DLC is a set of new districts + new global content (factions, cultural groups, technology). The content directory needs a DLC manifest format that declares what it adds. This extends Tyre's `_meta/manifest.yaml`. +- **Content versioning** — when a DLC changes a global faction's description, that's a REPLACE. When it adds a new faction, that's an ADD. When it adds NPCs to an existing district's pools, that's a MERGE. All three operations on the same DLC. The load order matters. + +### The "galaxy map" question + +At 20+ districts across multiple star systems, the content directory needs a spatial index: + +``` +content/ + global/ + galaxy/ + systems.yaml # All star systems, coordinates, gate connections + routes.yaml # Travel routes between systems + districts/ + sova-transit/ # Krenn System + vael-docks/ # Vael System + prime-central/ # Krenn Prime (surface) +``` + +Each district YAML includes its system and station reference. The galaxy index is global — it's the map. Districts are the content. The separation is clean. + +--- + +## 7. Randomization at Full Scale + +Nigel's axes for Sova (FRIEND, compromised NPC, secondary contraband, entanglement map) are the right starting set. At full scale: + +### Axes that work across all districts +- **FRIEND selection** — every district has a FRIEND pool per PC archetype +- **Who's compromised** — per-district role slot randomization +- **Social site population** — which NPCs fill which slots +- **Entanglement ratio** — D-029's 30/50/20 with per-seed variance + +### Axes that emerge at scale +- **District assignment** — which district does the player start in? (if the game has multiple starting locations) +- **Cross-district connections** — which NPCs have off-screen connections to other districts? +- **Faction pressure** — which faction is dominant in this seed? (shifts the political landscape) +- **Economic conditions** — is the district in a boom or bust? (shifts NPC contentment baselines) +- **Temporal variation** — does the game start on day 1 of a Commission inspection, or 3 weeks in? (shifts urgency) + +The pool system Tyre designed handles all of these. Pools are general-purpose: declare candidates, declare selection count, draw at seed time. Any axis of variation is just another pool. + +**The production constraint:** Each axis of variation multiplies the content that needs authoring. 3 FRIEND candidates × 2 PC archetypes × 3 starting conditions = 18 configurations to validate. At scale, combinatorial testing becomes the bottleneck. Hoshe needs automated playthrough simulation before we can ship more than ~5 active variation axes per district. + +--- + +## 8. PC Archetypes at Full Scale + +v0.1 has 2 PC archetypes (smuggler, detective). At full scale: + +### How many archetypes? + +Each archetype needs: +- A distinct relationship to the game's themes +- A distinct knowledge starting position +- A distinct social position in every district where it's playable +- A distinct monologue voice +- PC upgrade specs for every district's NPC roster + +The authoring cost per archetype is roughly: voice card (once) + moral arc (once) + per-district PC-candidate NPCs (per district) + per-district monologue pool (per district). + +| Archetype Count | Voice/Arc Cost (one-time) | Per-District Cost | 20 Districts Total | +|----------------|--------------------------|-------------------|-------------------| +| 2 (current) | ~30h | ~20h × 2 = 40h | 800h | +| 4 | ~60h | ~20h × 4 = 80h | 1660h | +| 6 | ~90h | ~20h × 6 = 120h | 2490h | + +**My recommendation: 4 archetypes for v1.0.** Two more beyond smuggler/detective. Each adds a new lens on the same world. Candidates should be chosen to maximize thematic coverage — the two new archetypes should explore parts of the moral landscape that smuggler and detective don't reach. + +**Production strategy:** Design all 4 archetypes early (so the world is built with all 4 in mind). Implement 2 for v0.1-v0.2. Add the 3rd for v0.3-v0.4. Add the 4th for v1.0. Each archetype launch includes retroactive content for all existing districts. + +--- + +## 9. Release Cadence Model + +Putting it all together into a release plan: + +| Release | Districts | PC Archetypes | FRIEND Pool | Cultural Groups | Content Hours | +|---------|-----------|--------------|-------------|----------------|--------------| +| v0.1 | 1 (Sova Transit) | 2 | 1 per character | 1 (Krenn) | ~200h (done) | +| v0.2 | 3 (+ 2 new) | 2 | 2 per character | 3 | ~600h | +| v0.3 | 6 (+ 3 new) | 3 (+ 1 new) | 2-3 per character | 5 | ~900h | +| v0.4 | 10 (+ 4 new) | 3 | 3 per character | 7 | ~800h | +| v1.0 | 15+ (+ 5 new) | 4 (+ 1 new) | 3-4 per character | 10+ | ~1000h | +| DLC | +3-5 per DLC | 4 | +1 per character per DLC | +1-2 per DLC | ~400-600h | + +**Critical path per release:** Tier 1 content (FRIEND/MIRROR authoring) → Tier 2 content → Tier 3 generation → validation → integration. Tier 1 is always the bottleneck. + +**Writer scaling:** v0.1 works with the current team (Paula + Mellanie). v0.2 needs a third writer. v0.3+ needs 3-4 parallel writers. The large content push pattern handles this. + +--- + +## Summary + +The long-term content strategy has three pillars: + +1. **Template everything that can be templatized.** Tier templates, social site templates, triangle structures, pool definitions, cultural brief patterns — define once, instantiate hundreds of times. + +2. **Protect the irreducible.** Tier 1 content (FRIEND arcs, MIRROR characters, contradiction beats) cannot be generated. Budget for it explicitly. It's the bottleneck and the thing that makes the game work. + +3. **Build the pipeline before scaling.** Schema validation, generation tools, line expansion, content dashboards — all of this must exist before we attempt district 2. The investment in tooling pays back 20x across the full game. + +The content directory structure Tyre/Gestalt designed is sound for the full game. The patterns from Sova (triangles, FRIEND, MIRROR, pools) are universal templates. The cultural brief system scales with Miri's heritage map approach. The authoring pipeline is the constraint — and it's a solvable constraint with the right tooling and writer scaling. + +--- + +*SI out. The plan is executable. The numbers work. The tooling list is the critical dependency.* diff --git a/docs/workshops/wiki-review/round3-tracking.md b/docs/workshops/wiki-review/round3-tracking.md new file mode 100644 index 000000000..bede625e3 --- /dev/null +++ b/docs/workshops/wiki-review/round3-tracking.md @@ -0,0 +1,109 @@ +# Round 3 Tracking — Long-Term Content Strategy + +**Round focus:** Long-term vision only. No v0.1 scoping. "What does the full game look like?" + +**All 9 contributors responded** (8 design + SI production). Tyre's response was last. + +--- + +## Theme Proposals + +| Agent | Proposed Universal Theme | +|-------|--------------------------| +| Gore | "Cost of participation" — complicity is Sova-local | +| Mellanie | "Collective bargain" — each district has one, player inherits a position | +| Ozzie | "What do you owe the people around you?" — different voice per district | +| Miri | "What do systems do to people inside them?" — system failure modes vary | +| Nigel | Complicity scales — same question, different currencies | +| Paula | "Cost of connection / entanglement" | +| Gestalt | "Knowledge as burden" — moral texture emerges from config | +| Tyre | Theme-agnostic moral engine — theme as data, not code | +| SI | "Thematic palette over monolith" — 4-6 moral textures, districts compose | + +**Consensus:** Complicity is Sova-local. The universal theme is structural but unnamed. All framings are facets of the same insight. Lead has not picked canonical framing yet. + +--- + +## Cultural Groups — Round 3 Proposals + +| Agent | Count | Organizing Principle | +|-------|-------|---------------------| +| Miri | 8-10 | Settlement motivation + economic function | +| Gore | 7 | Civilizational philosophy | +| Gestalt | 6-8 | Heritage cluster with mechanical parameters | +| Mellanie | 6 max | Cultural register (voice constraint) | +| Ozzie | 8-12 | Player-facing feel | +| Paula | 9-13 | Mechanical parameters | +| Tyre | ~25 eventually | Reference data with distance model | + +**Key tension identified:** Heritage (ethnic roots) vs. settlement type (economic function) are two different axes being called the same thing. + +--- + +## Content Patterns + +| Agent | Patterns Proposed | +|-------|-------------------| +| Gore (7) | FRIEND, MIRROR, ANCHOR, GHOST, CATALYST, THRESHOLD, REMNANT | +| Paula (5) | MIRROR, ANCHOR, SYSTEM, GHOST, CATALYST | +| Nigel (8) | FRIEND, MIRROR, HANDLER, WITNESS, TURNCOAT, CIVILIAN, OPERATOR, SKEPTIC | + +**Key tension:** Gore/Paula think thematically (story role). Nigel thinks functionally (gameplay role). Both valid. + +--- + +## PC Archetypes + +| Agent | Count | Specific Archetypes | +|-------|-------|---------------------| +| Gore | 8 | Worker, Investigator, Operator, Wanderer, Builder, Seeker, Guardian, Rebel | +| Ozzie | 6 | Operator, Investigator, Newcomer, Fixer, Believer, Remnant | +| Miri | 2 universal + regional | Insider/Outsider + per-region specifics | +| Nigel | 5 | Smuggler, Detective, Administrator, Newcomer, Enforcer | +| Paula | 8 | Smuggler, Investigator, Merchant, Engineer, Administrator, Medic, Journalist, Newcomer | +| Gestalt | 6 | Smuggler, Detective, Politician, Guardian, Merchant, Civilian | +| Mellanie | 6 | Smuggler, Detective, Fixer, Medic, Newcomer, Elder | +| Tyre | 4 (v1.0 cap) | Not enumerated | +| SI | 4 | Not enumerated | + +**Recurring:** Insider/Smuggler (all), Investigator/Detective (all), Newcomer (5 agents), Administrator (4), Merchant/Fixer (4), Guardian/Enforcer (3). + +--- + +## Randomization + +**Nigel's Sacred/Profane/Middle Kingdom framework** received broad support: +- Sacred = world physics (never randomize) +- Profane = pool-selected per seed +- Middle Kingdom = sacred structure, profane cast + +**Gestalt's 4 tiers:** Structural, Dramatic, Local, Meta. +**Tyre:** "Randomize social, fix spatial." +**Gore:** Shuffle WHY the conspiracy exists as deepest lever. + +--- + +## Scale + +| Agent | District Count | NPCs | Key Constraint | +|-------|---------------|------|----------------| +| SI | 20 | 300+ | 1-2 person-years, Tier 1 is bottleneck | +| Paula | 20 | ~460 | ~21K hand-authored lines | +| Mellanie | 20 | — | 6 cultural registers max in production | +| Gestalt | 30+ | — | 8-12 weeks per district | +| Tyre | 20 | — | 15-20 sprints platform, 9-11 sprints tooling | + +**Note:** These were all calculated at 20-district scale. The lead subsequently reframed to 300 worlds, fundamentally changing the production model from "hand-author districts" to "build generators fed by style briefs." + +--- + +## Key Cross-Cutting Insights + +1. **Regional brief is the most important document** (Miri, endorsed by all) +2. **Template system IS the game; regional brief IS the content** (Miri) +3. **"Randomize context, author content"** (universal consensus) +4. **Tooling before scale** (SI, Tyre, universal) +5. **Cultural diversity = anti-metagaming** (Nigel) +6. **LLM-assisted Tier 2 expansion** (Tyre) — write 10, generate 40 +7. **Paired authoring teams** (Mellanie) — cultural + character specialist +8. **Moral texture as deepest randomization lever** (Gore) diff --git a/docs/workshops/wiki-review/round3-tyre.md b/docs/workshops/wiki-review/round3-tyre.md new file mode 100644 index 000000000..73104c38c --- /dev/null +++ b/docs/workshops/wiki-review/round3-tyre.md @@ -0,0 +1,775 @@ +# Round 3 — Tyre (Technical Architect) + +Long-term content strategy from the systems architecture perspective. Thinking about the full game: multiple star systems, dozens of districts, hundreds of NPCs, mod ecosystem, years of content production. + +No v0.1 scoping. No tickets. No sprint timelines. Just: what does the engine need to be? + +--- + +## 1. Is Complicity the Right Theme for the Whole Game? + +*cracks knuckles* + +Let me be honest about what this question means technically: **the engine doesn't care about theme.** The engine cares about mechanical patterns. The question for me isn't "is complicity universal" — it's "does the mechanical vocabulary we've built for complicity generalize to other moral textures, or does each theme need its own engine features?" + +### What the engine actually sees + +The engine doesn't know about "complicity." It knows about: + +| Mechanical Pattern | Sova Implementation | Generalizable? | +|---|---|---| +| Moral arc phases (state progression) | Comfort → Doubt → Reckoning → Compromise | **Yes** — any moral journey follows a phase progression. The phase names are content, not code. | +| Monologue triggers (`moral_pang`, `loyalty_test`) | Smuggler-specific guilt triggers | **Partially** — the trigger types are engine features, but new themes might need new trigger types. A "survival" theme might need `resource_scarcity_observation` or `triage_decision`. | +| Cultural gate modifier (Gore's proposal) | Krenn privacy norms reduce disclosure | **Yes** — every culture has social norms that modify disclosure. The modifier system is general. The RULES per culture are content. | +| Knowledge confidence progression | Suspects → KnowsOf → KnowsDetails → Direct | **Yes** — this is epistemology, not theme. Every information-asymmetric situation uses this. | +| Contradiction detection | FRIEND's hidden behavior conflicts with presented behavior | **Yes** — cognitive dissonance is universal. THE FRIEND pattern works for any relationship where someone conceals something from someone they care about. | +| THE MIRROR pattern | Hael's transparency amplifies everyone's dishonesty | **Partially** — the "honest character in a dishonest world" works for complicity/deception themes. A survival-themed district might need THE MIRROR to be "the person who refuses to compromise even when everyone else has." Same mechanical pattern (character without a secret who makes others uncomfortable), different moral content. | + +### My architectural answer + +**Build a theme-agnostic moral engine with a per-district thematic vocabulary layer.** + +The engine provides: +- Phased moral arc system (configurable phases per district or per NPC) +- Extensible monologue trigger registry (core triggers + district-registered custom triggers) +- Cultural modifier framework (per-region norms that affect dialogue selection) +- Contradiction detection (general — any KnowledgeState can enter Contradicted) +- Pool-based character patterns (FRIEND, MIRROR, future patterns all use pools) + +The content provides: +- Phase names and transition conditions per district's moral texture +- Custom trigger definitions that map to the district's theme +- Cultural rules per region +- Specific contradiction content per NPC + +This means: complicity is the right theme for Sova, and probably the right *default* theme (it's what the game is most deeply about). But the engine shouldn't assume it. Districts in other systems might explore loyalty, survival, identity, or institutional rot. The engine treats all of these as "moral arc with phases + triggers + cultural context." The thematic vocabulary is data, not code. + +### The scaling implication + +SI asked the right question in Round 3: does thematic variation change the pipeline? Yes, modestly. Each new thematic texture costs ~2-3 days to define (phase vocabulary, trigger set, monologue patterns). But those definitions are reusable across all districts that share the texture. A "loyalty" texture defined once applies to every loyalty-themed district. + +**Tier of difficulty: Easy.** The architecture we've designed is already theme-agnostic. The moral arc system is a state machine with configurable states. Monologue triggers are an extensible registry. No engine changes needed to support multiple themes — just content vocabulary definition. + +--- + +## 2. Cultural Groups at Scale + +15-25 cultural groups across the Settled Reach. Here's what the engine needs to know about culture, and what it doesn't. + +### What culture IS in the engine + +Culture is **reference data that modifies entity behavior at creation and dialogue selection at runtime.** It is NOT simulation state. No cultural simulation runs per-tick. Culture is: + +1. **A modifier set** applied when NPCs are instantiated (naming patterns, greeting conventions, default disclosure norms, default trust baseline for outsiders) +2. **A dialogue filter parameter** that affects line selection (Gore's `cultural_gate` modifier) +3. **A content authoring guide** that informs how writers fill routine schedules, personality traits, and monologue pools + +### The data model for culture at scale + +```yaml +# global/regions/krenn-system.yaml +culture: + id: krenn + heritage_blend: ["finnish", "estonian", "latvian"] + drift_years: 180 + + # Engine-readable modifiers + modifiers: + outsider_trust_baseline: -2 # Outsiders start with trust penalty + disclosure_to_authority: 0.4 # 40% disclosure rate to authority figures + disclosure_to_insider: 0.9 # 90% disclosure rate to cultural insiders + greeting_initiative: low # NPCs don't initiate conversation with strangers + + # Naming generation + naming: + given_name_pool: ["Kael", "Sera", "Voss", "Lera", "Torek", ...] + family_name_pool: ["Davan", "Venn", "Sessik", "Lintar", ...] + family_name_usage: 0.29 # 29% of NPCs use family names socially + address_convention: first_name # Social context uses first names + + # Vocabulary (for writers, not engine) + vocabulary: + greetings: ["hüva", "tere"] + food: ["leib", "kalaa", "supp"] + drinks: ["kuum", "grain spirit"] + slang: + - word: "vakt" + meaning: "lookout shift" + connotation: "criminalized by ring usage" + + # Social norms (engine-readable as dialogue modifiers) + social_norms: + - norm: privacy_default + effect: "NPCs do not discuss others' personal business" + modifier: topic_block_personal_third_party + - norm: labor_solidarity + effect: "Workers cover for each other" + modifier: reduce_disclosure_about_coworker_absences + - norm: earned_trust + effect: "No credential shortcut — trust through time and shared labor" + modifier: ignore_authority_trust_bonus +``` + +### Cross-cultural dynamics: the hard problem + +Single-culture districts are straightforward. But the full game will have: +- Districts where two cultures mix (trade hubs, diplomatic stations) +- NPCs who've migrated from one cultural region to another +- Cultural drift within a single region over time + +The engine needs a **cultural distance model**: + +``` +cultural_distance(observer, subject) → modifier_strength +``` + +If both are Krenn, full cultural norms apply. If the observer is Krenn and the subject is from Vael System, some norms apply at reduced strength (shared labor solidarity if they work together, but outsider trust baseline still applies). If both are from different cultures entirely, minimal cultural modifier — fall back to personality-driven behavior. + +**Implementation approach:** Each NPC has a `culture_id` field. The dialogue selection system looks up the cultural distance between the speaking NPC and the listener. Cultural modifiers apply at `distance_modifier * full_strength`. For v0.1, every NPC in Sova is Krenn and every outsider (detective) gets full outsider penalty. For full game, the distance calculation is a simple lookup table: + +| Observer Culture | Subject Culture | Distance | Modifier Strength | +|---|---|---|---| +| Same | Same | 0 | 1.0 | +| Same region | Same region | 1 | 0.7 | +| Same system | Different region | 2 | 0.4 | +| Different system | Different system | 3 | 0.2 | + +~25 cultures × 25 cultures = 625 entries. But most are derivable from the 4-level hierarchy above. Only exceptions need explicit overrides. + +**Tier of difficulty: Moderate.** The cultural modifier system is a data-driven parameter set. The cross-cultural distance model adds a lookup step to dialogue selection. The real complexity is in content — defining 25 cultures with enough depth to be mechanically meaningful. But that's Miri's job, not engine work. + +### Memory and performance at scale + +25 cultural definitions × ~5KB structured YAML each = ~125KB total. Negligible. Cultural data loads once at game start and lives in a `Cultures` resource. NPC culture_id is a u8 (256 possible cultures, we'll use ~25). Per-NPC memory cost: 1 byte. The dialogue selection system does one hash lookup per conversation to get the cultural modifier set. Sub-microsecond. + +--- + +## 3. Content Patterns That Scale + +The distinction that matters: **engine patterns** (code, universal, built once) vs **content patterns** (data templates, per-district, authored many times). + +### Engine patterns — build once, use forever + +These are the core systems. Each is a piece of the simulation server that processes content data: + +| Engine Pattern | What It Does | Scale Factor | +|---|---|---| +| **Pool Selection** | Weighted random draw from candidate lists at seed time | O(pools × candidates). Cheap — runs once at game start. Handles FRIEND, role slots, contraband, entanglement, everything. | +| **Schedule System** | Per-tick NPC location resolution from routine YAML | O(active NPCs). Already budgeted in D-026. 80 active NPCs × schedule lookup = trivial. | +| **Dialogue Selection** | Tagged line pool filtering (access tier, trust, situation, mood, topic, cultural gate) | O(eligible lines). Per-conversation. Pool sizes: ~50-200 lines per location per context. Filter chain is fast — 6 filters on 200 lines in <1ms. | +| **Monologue Trigger** | Event-driven check: does current game state match any monologue trigger prerequisites? | O(triggers × prerequisites). Per-tick for observation triggers, per-event for others. Budget: ~50-100 active triggers per district. | +| **Knowledge Update** | Event queue drain → BTreeMap insert/update | O(events per tick). Already budgeted at <3ms. Scales linearly with active NPCs. | +| **Contradiction Detection** | Cross-entry comparison within a single KnowledgeGraph | O(knowledge entries²) worst case, but only fires on new Direct observations. Practical: <10 comparisons per trigger. | +| **Moral Arc State Machine** | Phase transition checker — does current state + trigger condition → advance phase? | O(active arc NPCs × phase conditions). Runs per-event, not per-tick. Budget: 5-10 active arcs per district. | +| **Storyteller** | Pacing controller — selects which events to trigger based on player engagement, time, and arc progress | One system, runs once per game-minute (every 10 ticks). Evaluates ~20-30 potential events, selects 0-2 per minute. | +| **Content Loader** | YAML parsing + schema validation + overlay merging | Runs at game start and district transitions. Not performance-critical. Can take 1-5 seconds per district load. | + +That's ~9 engine patterns. I'd estimate we'll add 2-3 more as the game evolves (e.g., economy simulation, faction reputation system, travel/gate system). Call it 12-15 total engine patterns for the full game. + +**The critical insight: every new district uses these same 9+ patterns.** Adding a district doesn't add engine code. It adds content data that the existing patterns process. This is what D-023 (three-tier content model) was designed to achieve. + +### Content patterns — define template, instantiate per district + +These are the reusable structures that content authors fill in: + +| Content Pattern | Template Definition | Per-District Cost | Total for 20 Districts | +|---|---|---|---| +| NPC Profile (Tier 1 FRIEND) | ~3 pages, 70-100 lines | 15-22 hours | 2-4 per district × 20 = 40-80 NPCs | +| NPC Profile (Tier 1 MIRROR) | ~2 pages, 50-70 lines | 10-15 hours | 1 per district × 20 = 20 NPCs | +| NPC Profile (Tier 2) | ~1 page, 40-60 lines + 4x generation | 4-6 hours | 8-12 per district × 20 = 160-240 NPCs | +| NPC Profile (Tier 3) | Template-generated, ~0.5 pages | 0.5-1 hour (review only) | 5-10 per district × 20 = 100-200 NPCs | +| Social Site Template | Role slots, triangle constraints, pool refs | 2-3 hours | 3-5 per district × 20 = 60-100 templates | +| Triangle Definition | 3 NPCs, fork conditions, cascade effects | 1-2 hours | 4-6 per district × 20 = 80-120 triangles | +| Pool Definition | Candidate lists with weights | 30 min | 3-8 per district × 20 = 60-160 pools | +| Contradiction Arc | 5-phase definition with trigger conditions | 2-3 hours (part of FRIEND) | 2-4 per district × 20 = 40-80 arcs | +| District Metadata | Setting, locations, faction presence, ambient config | 2-4 hours | 1 per district × 20 = 20 | + +### What's genuinely local vs what's universal + +Some things I thought were engine patterns turn out to be content, and vice versa: + +**Looks like engine, is actually content:** +- Storyteller decision nodes (Gestalt's volume escalation). Each is a custom fork with custom effects. The engine provides the decision-node FRAMEWORK. The specific decisions are authored YAML. +- News ticker headline selection. Engine provides the selection mechanism. Headlines are content data. +- Environmental text. Engine renders it. Content fills it. + +**Looks like content, is actually engine:** +- THE FRIEND pattern (pool selection + contradiction arc activation + tell progression). This is an engine pattern with content filling the slots. Critically: the PATTERN is code. Each specific FRIEND is data. +- THE MIRROR pattern. Same — engine pattern, content instances. +- Cultural gate modifier. The modifier system is engine. The specific norms per culture are content. + +### The pattern that worries me + +**Storyteller decision nodes.** Gestalt's volume escalation decision is beautifully designed — but it's a fully custom YAML structure with custom effect mappings. At scale, each district needs 5-10 of these storyteller-triggered decision points. 20 districts = 100-200 decision nodes. + +If each decision node is a bespoke YAML structure, we have a maintenance nightmare. The schema validation can check structure, but the EFFECTS (attribute changes, triangle tension adjustments, investigation signal modifications) are essentially a mini scripting language embedded in YAML. + +**My proposal: a decision node DSL.** A small, constrained language for expressing decision effects: + +```yaml +decision_node: + id: volume_escalation + trigger: storyteller_mid_game + options: + - id: side_with_nils + effects: + - set_attribute: { entity: voss, key: trust_level, value: "resentful" } + - set_attribute: { entity: voss, key: exposure_risk, value: "escalating" } + - add_flag: { entity: maret_korr, flag: noticed_schedule_gap } + - adjust_tension: { triangle: worried_knowledge, delta: +2 } + - emit_signal: { signal: schedule_anomaly_visible } +``` + +The DSL is a fixed set of operations: `set_attribute`, `add_flag`, `remove_flag`, `adjust_tension`, `emit_signal`, `start_arc`, `advance_phase`. Maybe 10-15 operations total. The validator can check that every effect uses a known operation with valid parameters. Content authors compose effects from this vocabulary. + +**Tier of difficulty: Moderate.** Designing the DSL is a week of architecture. Implementing the effect executor is a sprint. But it prevents 200 decision nodes from becoming 200 custom code paths. + +--- + +## 4. Content Directory as a Platform + +This is the section I care most about. The content directory isn't just a file layout — it's the platform that the entire content pipeline runs on. Let me map what "platform" means technically. + +### Platform requirements for the full game + +| Requirement | What It Means | Technical Approach | +|---|---|---| +| **Lazy loading** | Only load the player's current district + queued adjacent districts. Don't load all 20+ districts at once. | Content loader uses a manifest graph. District YAML declares dependencies. Loader resolves the dependency tree and loads only what's needed. | +| **Cross-district references** | NPC in district A mentions faction headquartered in district B. Canonical_id `krenn.sova.transit.npc.kael-davan` resolves across any loaded district. | The `canonical_id` resolver is a global registry populated at manifest-load time (just IDs and paths, not full content). Full content loads on demand. | +| **Hot-reloading** | Dev-only: change a monologue line, see it in-game without restart. | `notify` crate file watcher on `content/` directory. On change: re-validate changed file → re-parse → hot-swap into running ECS world. Line pools and schedule data are hot-swappable. NPC creation requires restart. | +| **Validation pipeline** | `make validate-content` catches errors before they reach the engine. | JSON Schema validation (structural) + cross-reference resolver (semantic) + tier-conditional rules + custom DSL checks. CI runs this on every content PR. | +| **DLC packaging** | A DLC is a content pack: new districts + new global entries + extensions to existing districts. | DLC is a content directory with the same structure as base. `_meta/manifest.yaml` declares: base version dependency, ADD/REPLACE/MERGE operations, new district list. Load order: base → DLC1 → DLC2 → mods. | +| **Mod overlay** | Third-party content uses ADD/REPLACE/MERGE semantics. | Already designed in Round 2. The loader processes layers in load-order sequence. Each layer can add files, replace entity definitions, or merge pool/list content. | +| **Generation tooling** | Tier 3 NPC generator, line expansion tool, skeleton generator. | These tools READ templates + cultural data, WRITE NPC YAML files to the content directory. They're offline tools, not runtime. Output goes through the same validation pipeline as hand-authored content. | +| **Multiple star systems** | Content is organized spatially: system → station → district. But the filesystem doesn't need to mirror this — canonical_id handles it. | Flat `districts/` directory with canonical_id carrying the full spatial address. A `global/galaxy/systems.yaml` provides the spatial index. | + +### The content loader architecture + +This is the most important subsystem I haven't fully specified yet. Here's the full picture: + +``` +Content Loader Pipeline: + +1. MANIFEST PHASE (game startup, ~100ms) + Read all _meta/manifest.yaml files (base + DLC + mods) + Build dependency graph + Determine load order + Build canonical_id → file_path index (IDs only, not content) + +2. GLOBAL PHASE (game startup, ~500ms) + Load global/ directory: factions, technology, contraband, knowledge, enums, regions + These are always in memory — they're shared vocabulary + +3. SEED PHASE (new game / load game, ~200ms) + Read seed configuration + Execute pool selections (FRIEND, roles, contraband, entanglement) + Produce seed-state record + +4. DISTRICT PHASE (on district entry, ~1-5 seconds) + Load target district: NPCs, locations, templates, lines, facts + Apply overlay stack: base content → DLC modifications → mod modifications + Validate loaded content against schemas + Create ECS entities from loaded data + Cross-reference check: all canonical_id references resolve + +5. ADJACENT PHASE (background, ~2-10 seconds) + Pre-load adjacent districts (connected by gate, one travel hop away) + Parse and validate but don't create ECS entities yet + Ready for instant transition when player travels + +6. HOT-RELOAD PHASE (dev-only, on file change) + Re-validate changed file + If line pool / schedule / dialogue: hot-swap in running world + If NPC definition: flag for full reload (too complex to hot-swap entity creation) + If schema: re-validate all content against new schema +``` + +### The manifest graph at scale + +With 20+ districts, 2-3 DLCs, and mods, the manifest graph looks like: + +``` +base/ + _meta/manifest.yaml: { id: "base", version: "1.0" } + global/ ← always loaded + districts/ + sova-transit/ ← load on demand + vael-docks/ ← load on demand + prime-central/ ← load on demand + ... + +dlc-outer-reach/ + _meta/manifest.yaml: { + id: "outer-reach", + version: "1.0", + requires: "base >= 1.0", + adds: ["districts/haven-drift", "districts/ember-station"], + extends: { + global: { factions: [ADD new-faction.yaml] }, + districts/sova-transit: { pools: [MERGE new-candidates.yaml] } + } + } + +mod-jax/ + _meta/manifest.yaml: { + id: "jax-the-veteran", + version: "1.0", + requires: "base >= 1.0", + extends: { + districts/sova-transit: { + npcs: [ADD jax-korrenson.yaml], + pools: [MERGE jax-pool-entries.yaml], + lines/bar/dialogue: [MERGE jax-dialogue.yaml] + } + } + } +``` + +The manifest declares WHAT it does. The loader EXECUTES the operations. This is the same pattern used by package managers (Cargo, npm) — declare dependencies and operations, resolve at load time. + +### Cross-district travel: the lazy loading challenge + +When the player travels from Sova Transit to Vael Docks: + +1. Player approaches span gate → engine signals "travel imminent to vael-docks" +2. Adjacent phase has already pre-loaded vael-docks content (parsed, validated, not yet ECS entities) +3. Player enters gate → loading screen (or in-game gate transit animation) +4. Engine tears down sova-transit ECS entities (but SAVES their state for return) +5. Engine creates vael-docks ECS entities from pre-loaded content + seed-state +6. Engine begins pre-loading districts adjacent to vael-docks +7. Player arrives. Seamless. + +**State preservation on departure:** When leaving a district, all active NPC states (knowledge graphs, relationship states, moral arc phases, schedule deviations) are serialized and stored. On return, the state restores. This is D-026's state-saved tier — the same mechanism handles "NPC too far from player to simulate" and "player left this district entirely." + +**The performance budget:** District load creates ~20-50 ECS entities (NPCs) with components (schedule, knowledge graph, cultural modifiers, dialogue access). Entity creation: ~0.1ms each. Total: ~2-5ms for entities. The expensive part is YAML parsing and validation — but that's done in the adjacent-phase background pre-load. The actual transition should be <100ms of entity creation + state restoration. + +### Filesystem layout at full scale + +``` +content/ + _meta/ + manifest.yaml + load-order.yaml # base → DLC → mods + + _schema/ + npc.schema.yaml # Handles all tiers via conditional validation + location.schema.yaml + faction.schema.yaml + template.schema.yaml + fact.schema.yaml + dialogue.schema.yaml + monologue.schema.yaml + district.schema.yaml + pool.schema.yaml + decision-node.schema.yaml # Validates the DSL operations + culture.schema.yaml # Validates cultural modifier definitions + + global/ + galaxy/ + systems.yaml # Star system index: coordinates, gate connections + routes.yaml # Travel graph: which gates connect to what + factions/ # ~10-15 major factions + technology/ # ~10-20 technology entries + contraband/ # ~5-10 contraband categories + knowledge/ + facts.yaml # Abstract/universal FactIds + entity-attributes.yaml # Canonical attribute vocabulary (19+ keys) + relationship-states.yaml + enums/ # Canonical enum registries + situations.yaml + topics.yaml + moods.yaml + triggers.yaml # Core + district-registerable custom triggers + access-tiers.yaml + activities.yaml + moral-arc-phases.yaml # Configurable per thematic texture + regions/ # 15-25 cultural groups + krenn-system.yaml + vael-system.yaml + ... + thematic-textures/ # 4-6 moral textures (SI's palette) + complicity.yaml # Phase vocabulary, trigger set, monologue patterns + loyalty.yaml + survival.yaml + identity.yaml + + districts/ + sova-transit/ # Krenn System, Station Sova + district.yaml # Metadata: system, station, culture_id, theme_texture + facts.yaml # District-specific FactIds (Gestalt's split) + pools.yaml # All pool definitions for seed-time selection + npcs/ # 15-25 NPCs per district + locations/ # 3-8 locations per district + templates/ # 3-5 social site templates + triangles/ # 4-6 triangle definitions + decisions/ # Storyteller decision nodes (DSL) + lines/ # Dialogue + monologue pools per location + terminal/ + bar/ + corridor/ + vael-docks/ # Vael System + prime-central/ # Krenn Prime (surface city) + ... # 20+ districts total +``` + +At 20 districts, this is ~1000-2000 YAML files total. Each is small (1-10KB). Total content on disk: ~5-20MB. Negligible. The constraint is authoring time, never storage. + +### Content versioning for live service + +If the game has DLC and mod support, content WILL change post-release. The canonical_id system handles this: + +- A canonical_id is permanent. Once `krenn.sova.transit.npc.kael-davan` exists, it exists forever. +- Content behind a canonical_id can change (REPLACE operation), but the ID persists. +- Save games reference canonical_ids, not file paths. If a DLC changes Kael's dialogue, existing saves still reference `kael-davan` and get the updated content. +- If a mod is removed, the loader detects missing canonical_ids referenced in the save game and flags them. The game can degrade gracefully (NPC exists but has fallback content) or warn the player. + +**Tier of difficulty: Challenging but doable.** The content loader is a significant subsystem — I'd estimate 2-3 sprints to build the full pipeline (manifest resolution, lazy loading, overlay merging, hot-reload). But it's well-understood engineering. Package managers solved this problem decades ago. We're applying the same principles to game content. + +--- + +## 5. Randomization Philosophy + +Beyond Sova's axes. What's the full-game randomization architecture? + +### The three scales of randomization + +**Scale 1: Per-District (what Sova already does)** + +Pool-based selection within a single district. FRIEND identity, role assignments, social site population, entanglement map, secondary contraband. Each district is an independent randomization domain. + +This scales linearly. 20 districts × 5-10 pools each = 100-200 independent pool draws. The seed determines all of them deterministically. Fast, simple, proven. + +**Scale 2: Cross-District (new for multi-district game)** + +When the game spans multiple districts, some randomization must be COORDINATED: + +| Cross-District Axis | Why It Can't Be Independent | Constraint | +|---|---|---| +| Faction dominance | If the Lattice Commission is strong in Sova, that affects their presence in adjacent stations | Conservation of faction power across the system | +| NPC migration | An NPC who left Sova for Vael must exist in Vael and NOT in Sova | Entity uniqueness across districts | +| Investigation threads | Evidence found in Sova points to Vael. The target must actually exist in Vael. | Cross-district reference integrity | +| Economic conditions | System-wide boom/bust should be coherent, not random per district | System-level economic state → per-district modifier | + +This requires a **two-phase randomizer:** + +``` +Phase 1: System-level draws + - Faction power distribution across all systems + - Economic condition per system + - Major event seeds (which crises are active this playthrough) + +Phase 2: District-level draws (constrained by Phase 1) + - FRIEND pools, role slots, entanglement maps + - Constrained by: faction presence (Phase 1), NPC availability, cross-district references +``` + +The pool system handles both phases — Phase 1 pools are in `global/`, Phase 2 pools are in `districts/`. The constraint is: Phase 2 draws must satisfy Phase 1 constraints. This is constraint-satisfaction, not simple random drawing. + +**Scale 3: Temporal Variation (the living world)** + +The hardest form of randomization: things that change during play. + +- A faction loses power after a player action in one district → effects visible in adjacent districts +- An NPC's arc resolves → consequences propagate to cross-district contacts +- The storyteller triggers a system-wide event (gate malfunction, Commission crackdown) → every active district responds + +This isn't pool selection anymore. This is **event propagation across the district graph.** The simulation needs: + +``` +Event: { type: faction_power_shift, faction: lattice-commission, delta: -1, origin: sova-transit } +Propagation: adjacent districts receive the event at the next tick boundary +Effect: per-district faction modifier adjusts, NPC mood/behavior shifts +``` + +**Tier of difficulty: Scale 1 is Easy (done). Scale 2 is Moderate (constraint-satisfaction at seed time). Scale 3 is Hard (runtime event propagation across a district graph). Build them in order. Scale 3 is a v1.0 feature, not v0.2.** + +### The anti-metagaming architecture + +Nigel's core concern: "Two friends play the game. They compare notes. They played different games." At full scale, the metagaming surface grows: + +| What Players Might Metagame | Anti-Metagaming Approach | +|---|---| +| FRIEND identity | Pool with 3-4 candidates per character per district | +| Evidence locations | Multiple possible evidence placements per FactId progression | +| Compromised NPC identity | Role-slot randomization (who fills the "compromised" slot) | +| Investigation path | Multiple valid paths to the same discovery (not A→B→C, but A→{B,C,D}→E) | +| NPC schedules | Minor time variance per seed (±15 minutes on routine transitions) | +| Cultural tells | Per-seed social weight on vocabulary (Nigel's "vakt" variation) | + +The key insight: **don't randomize everything. Randomize the things that matter for surprise, keep the things that matter for coherence.** + +Fixed per district (never randomized): +- Cultural identity and norms +- Primary contraband type +- Physical layout (locations, spatial relationships) +- Faction presence (which factions, not how strong) +- Core social site structure (the bar exists, has an owner, has regulars) + +Variable per seed (always randomized): +- WHO fills which role slots +- WHO is the FRIEND +- WHERE evidence appears +- WHAT secondary complications arise +- WHEN the storyteller triggers escalation events + +This gives consistent spatial memory ("I know where the bar is") with inconsistent social memory ("I don't know who's compromised"). Players can learn the world but not solve it. + +--- + +## 6. PC-as-NPC at Full Scale + +v0.1 has 2 PC archetypes. The full game might have 4-6. Here's what this means architecturally. + +### The PC archetype as engine pattern + +A PC archetype is: +1. A starting knowledge graph (what you know at game start) +2. A cultural identity (which community you belong to) +3. A lattice tier (which perception modes are available — D-017) +4. An access tier map (who trusts you, who doesn't) +5. A monologue voice (separate line pools per D-032) +6. A moral arc template (which thematic journey you're on) +7. An NPC-mode behavior AI (what you do when you're not player-controlled) + +Items 1-6 are content data. Item 7 is the engine problem. + +### NPC-mode behavior AI + +When the player plays archetype A, archetype B exists as an NPC. But archetype B isn't just walking a routine — they're an ACTIVE CHARACTER doing their job: + +| Archetype | NPC-Mode Behavior | Complexity | +|---|---|---| +| Detective | Follows investigation routine: arrives, interviews, observes, takes notes. Progresses through the investigation arc at storyteller-controlled pace. | **High** — the detective NPC needs to "investigate" convincingly. Not just walk around, but approach NPCs, trigger investigation dialogue, react to evidence. | +| Smuggler | Works shifts, runs operations, socializes at bar. Maintains cover. Ring operations triggered by storyteller. | **Moderate** — follows routine with deviation triggers. The ring operations are storyteller-controlled, not autonomous. | +| Senate aide (hypothetical v0.3 archetype) | Political navigation: attends meetings, lobbies, collects favors. | **High** — political behavior AI is complex. | +| Guardian operative (hypothetical v0.4 archetype) | Surveillance and counter-surveillance. Watches, follows, reports. | **Moderate** — pattern-following behavior with perception system integration. | + +### The behavior AI architecture + +I'd propose a **behavior tree system** for NPC-mode PCs. Not a full planning AI — that's overkill and non-deterministic. A behavior tree is: + +1. Deterministic (D-010 principle 4) +2. Configurable via content data (behavior tree definitions in YAML) +3. Observable by players (the NPC does visible things, not abstract "investigating") +4. Scalable (behavior trees are well-understood, performant, widely documented) + +Each PC archetype gets a behavior tree YAML: + +```yaml +# global/archetypes/detective-npc-behavior.yaml +behavior_tree: + root: sequence + children: + - selector: + - condition: is_work_hours + action: investigate + subtree: + - go_to: investigation_target_location + - interact_with: investigation_target_npc + - observe_for: 5_minutes + - take_notes # visible action, triggers monologue for watching PC + - condition: is_social_hours + action: socialize + subtree: + - go_to: bar + - interact_with: known_contact # usually Sera if she's FRIEND + - order_drink + - action: follow_routine # fallback to base schedule +``` + +The storyteller controls WHEN the detective NPC escalates their investigation. The behavior tree controls HOW the detective behaves during each phase. + +### PC archetype scaling costs + +| Component | Per Archetype (one-time) | Per District (per archetype) | +|---|---|---| +| Voice card + moral arc definition | 8-12 hours | 0 | +| Behavior tree definition | 4-8 hours | 2-3 hours adaptation | +| Monologue pool per district | 0 | 10-15 hours | +| Starting knowledge per district | 0 | 3-5 hours | +| Reverse knowledge entries from NPCs | 0 | 2-4 hours | +| PC-as-NPC routine per district | 0 | 1-2 hours | +| **Total** | **12-20 hours** | **18-29 hours per district** | + +For 4 archetypes across 20 districts: +- One-time: 48-80 hours +- Per-district: 72-116 hours × 20 = 1,440-2,320 hours +- Grand total: ~1,500-2,400 hours of PC-related content + +SI estimated ~800 hours for 2 archetypes across 20 districts. My number is higher because I'm including the behavior tree adaptation and the reverse knowledge entries, which SI's estimate didn't fully capture. + +**The critical dependency: behavior tree authoring tooling.** Writing behavior trees in raw YAML is painful. We need a visual behavior tree editor — even a simple one (node graph in a web UI). This is a tooling investment that pays back across every archetype and every district. + +**Tier of difficulty: Hard.** The behavior tree system itself is a 2-3 sprint investment. The content per archetype per district is the larger cost. I'd recommend maxing out at 4 archetypes for v1.0. Each additional archetype multiplies per-district authoring by ~20-30 hours. + +--- + +## 7. Authoring Pipeline at Scale + +300+ NPCs. 20+ districts. LLM-assisted generation. Here's the technical pipeline. + +### The authoring tiers, technically + +| Tier | Authoring Method | Engine Input | Quality Gate | +|---|---|---|---| +| Tier 1 (FRIEND, MIRROR) | 100% human-authored | Handcrafted YAML, every line reviewed | Human review + schema validation | +| Tier 2 (entangled + mundane triangles) | Human-authored base (10 lines) + LLM expansion (40 lines) | Authored YAML + generated supplement | Schema validation + voice consistency check + human spot-review | +| Tier 3 (flat NPCs) | Template-generated from cultural brief + district config | Generated YAML from templates | Schema validation + automated checks only | +| Environmental text | Mixed — headlines authored, signs generated from templates | Generated from district + culture data | Schema validation + Mellanie review | + +### The LLM generation pipeline + +For Tier 2 line expansion (write 10, generate 40): + +``` +Input: + - 10 authored dialogue lines (human-written, voice-perfect) + - NPC profile YAML (personality, role, relationships) + - Cultural brief (Krenn norms, vocabulary, speech patterns) + - Tag taxonomy (D-035 tags for each generated line) + - Voice card (character-specific writing guide) + +Process: + 1. LLM generates 40 candidate lines, tagged, following voice card + 2. Schema validator checks: all tags present, valid enum values, IDs unique + 3. Voice consistency checker: embedding similarity against authored lines (reject outliers) + 4. Human reviewer: spot-check 10 of 40, approve/reject batch + +Output: + - 40 generated lines merged into the line pool + - Generation metadata preserved (which lines are authored vs generated) + - Rejected lines logged for model fine-tuning +``` + +**The generation quality gate is critical.** If generated lines don't match the authored voice, the pool degrades. The voice consistency checker is an embedding-based comparison: encode each generated line, measure cosine similarity against the authored set, reject anything below threshold. + +At scale: Tier 2 NPCs across 20 districts = 160-240 NPCs × 40 generated lines each = 6,400-9,600 generated lines. With a 70% acceptance rate, that's ~4,500-6,700 usable lines from LLM generation. The human review cost: ~10 minutes per NPC batch × 200 NPCs = ~33 hours of human review. Manageable. + +### The Tier 3 generator + +For flat NPCs (routine + greeting, social wallpaper): + +``` +Input: + - District config (locations, factions present, social sites) + - Cultural brief (naming pool, greeting conventions, personality distribution) + - Tier 3 template (3 required fields: routine, greeting, faction) + - Seed (for deterministic generation) + +Process: + 1. Draw name from cultural naming pool + 2. Generate routine from template schedule (location + activity + time, cultural pattern-conformant) + 3. Generate 3-5 greeting lines from cultural greeting conventions + 4. Assign faction from district faction distribution + 5. Assign personality traits from cultural trait distribution + 6. Generate 0-1 "overheard conversation" snippets from district topics + +Output: + - Complete Tier 3 NPC YAML, schema-valid + - Deterministic: same seed + same inputs = same NPC +``` + +The Tier 3 generator is a Rust CLI tool, not an LLM. It's template expansion with seeded randomization. Fast, deterministic, no API costs. Runs offline during the content build phase. + +At scale: 100-200 Tier 3 NPCs generated in <1 second. Zero human authoring time. Review: spot-check 10% for cultural coherence. + +### The full pipeline at 300+ NPCs + +``` +Phase 1: Foundation (one-time, ~2 weeks) + ├── Lock all templates (NPC, social site, triangle, pool, decision node) + ├── Build schema validation (`make validate-content`) + ├── Build Tier 3 generator + ├── Build LLM line expansion pipeline + ├── Build voice consistency checker + └── Build content skeleton generator + +Phase 2: Per-district production (repeating, ~2-3 weeks per district) + ├── Day 1-2: District brief (Miri) + content skeleton (tooling) + ├── Day 3-7: Tier 2 NPCs authored (Paula + Mellanie, parallel) + ├── Day 5-10: Tier 1 NPCs authored (Paula, sequential) + ├── Day 8-10: LLM line expansion for Tier 2 (tooling + Mellanie review) + ├── Day 9-10: Tier 3 generation (tooling, review by Miri for cultural fit) + ├── Day 10-12: Validation pass (Hoshe + schema + cross-reference) + └── Day 12-14: Integration + smoke test (Dudley) + +Phase 3: Cross-district integration (per system, ~1 week) + ├── Cross-reference validation (all canonical_ids resolve) + ├── Faction coherence check (power distribution sums correctly) + ├── NPC migration consistency (nobody exists in two places) + └── Story thread validation (investigation paths are complete) +``` + +20 districts × 2-3 weeks per district = 40-60 weeks of production. With 2 districts in parallel: 20-30 weeks. With 3 in parallel: 13-20 weeks. SI's estimate of 10-15 months aligns with my 2-parallel-district projection. + +### Tooling priority order + +Build these in order. Each one unblocks the next scale step: + +| Priority | Tool | Unblocks | Effort | +|---|---|---|---| +| **P0** | Schema validation (`make validate-content`) | Everything — no content pipeline without validation | 1 sprint | +| **P1** | Content skeleton generator | Per-district production — authors start from valid stubs | 0.5 sprint | +| **P1** | Tier 3 NPC generator | Population fill — 50-100 NPCs per run | 1 sprint | +| **P2** | LLM line expansion pipeline | Tier 2 scaling — 4x content from 1x authoring | 1-2 sprints | +| **P2** | Voice consistency checker | Quality gate for generated content | 1 sprint | +| **P2** | Cross-reference validator | Multi-district integrity | 1 sprint | +| **P3** | Decision node DSL validator | Storyteller content validation | 0.5 sprint | +| **P3** | Behavior tree editor | PC archetype authoring efficiency | 2 sprints | +| **P3** | Content dashboard | Production tracking and visibility | 1 sprint | + +Total tooling investment: ~9-11 sprints. This is the cost of scaling from 1 district to 20. It's front-loaded — most of it needs to exist before district 2 production begins. + +--- + +## Synthesis: The Architecture for 10 Years of Content + +The Settled Reach is architecturally a content platform that happens to be a game. The simulation engine (9-15 patterns, well-defined, stable) processes content data (hundreds of YAML files, constantly growing, authored by a pipeline). + +The engine's job is to be SMALL, CORRECT, and STABLE. Engine changes should be rare after the core patterns are built. Adding a new district should NEVER require engine changes. Adding a new thematic texture, a new cultural group, or a new PC archetype should require AT MOST a new behavior tree definition and content data — not new Rust code. + +The content directory's job is to be a PLATFORM — loadable, validatable, overlayable, extensible. The manifest system, overlay mechanics, and canonical_id resolution give it the properties of a package manager. DLC and mods are first-class concepts, not afterthoughts. + +The authoring pipeline's job is to make content FAST without making it CHEAP. Tier 1 content is irreducibly human. Tier 2 content is human-seeded and machine-expanded. Tier 3 content is fully generated. The tooling exists to enforce quality gates at each tier. + +### What I'm genuinely excited about + +The single design decision that solves the most problems simultaneously: **pool-based selection with overlay-compatible content packs.** + +This one pattern handles: +- FRIEND selection (pool of authored candidates) +- Role slot assignment (pool of eligible NPCs per template role) +- Contraband variation (pool of secondary types) +- Entanglement randomization (pool of compromise-eligible NPCs) +- Social site population (pool of regulars per venue) +- DLC expansion (DLC adds candidates to existing pools via MERGE) +- Mod extension (mods add candidates to existing pools via MERGE) +- Seed-based replayability (different draws from same pools) +- Anti-metagaming (pool draws are unpredictable) + +One pattern, nine use cases. *That's* elegant architecture. The pool system + overlay mechanics + canonical_id resolution form the architectural triad that makes everything else possible. + +### The honest difficulty assessment + +| Capability | Full-Game Difficulty | When to Build | +|---|---|---| +| Single-district content (what we have) | **Done** | Now | +| Content loader with overlay support | **Moderate** | Before district 2 | +| Multi-district lazy loading | **Moderate** | Before district 3 | +| Cross-district reference resolution | **Moderate** | Before district 3 | +| Cultural distance model | **Easy** | Before second cultural group | +| Theme-agnostic moral arc system | **Easy** | Before second thematic texture | +| Decision node DSL | **Moderate** | Before 10+ decision nodes | +| PC behavior trees | **Hard** | Before 3rd PC archetype | +| Two-phase randomizer (system + district) | **Moderate** | Before second star system | +| Runtime event propagation across districts | **Hard** | v1.0 | +| LLM generation pipeline | **Moderate** | Before district 2 Tier 2 production | +| Content dashboard | **Easy** | When production tracking matters | + +Nothing here is a research problem. Everything is well-understood engineering applied to game content. The hardest individual piece (behavior trees + runtime event propagation) is maybe 4-5 sprints of focused work. The total platform build is ~15-20 sprints spread over the full development timeline. + +The game's ambition is large. The architecture is proportional. The technical risk is low — it's a lot of KNOWN work, not a little UNKNOWN work. That's the best kind of engineering problem to have. + +--- + +*Tyre out. The platform scales. The engine stays small. The content grows forever. Ship it.* diff --git a/docs/workshops/wiki-review/round4-gestalt.md b/docs/workshops/wiki-review/round4-gestalt.md new file mode 100644 index 000000000..236fa12cf --- /dev/null +++ b/docs/workshops/wiki-review/round4-gestalt.md @@ -0,0 +1,714 @@ +# Round 4 — Gestalt (Systems Design): Generator-Input Reframe + +*cracks knuckles* + +The lead's 300-world directive isn't a scaling of my Round 3 proposals. It's a different kind of problem. My R3 designed a **content authoring strategy** — skeleton + flesh, pipeline + tooling, districts as production units. The lead is asking for a **generator specification strategy** — the rules, parameters, and constraints that procedural systems consume to produce 300 worlds worth playing. + +Let me break down what this actually means mechanically. Everything below is reframed for: **what does the generator need to know?** + +--- + +## 1. Cultural Ingredients Menu: Combinatorial Culture Generation + +### What changed from Round 3 + +My R3 proposed 6-8 fixed heritage clusters (Nordic-Baltic, Mediterranean, East Asian, etc.) with Miri-quality regional briefs per cluster. The lead says: **pick-and-combine from an ingredients menu.** Heritage roots are ONE ingredient among several. The generator assembles cultures from a matrix, not a list. + +This is mechanically superior. Here's why: 6-8 fixed clusters produce 6-8 cultural experiences. A 6-category ingredients menu with 5-8 options per category produces thousands of unique cultural configurations. The generator does the multiplication. We author the ingredients. + +### The ingredients menu + +Six ingredient categories. Each category has 5-8 options. The generator picks one from each category (or blends 2 within a category) to compose a unique cultural profile. **Heritage Roots is optional** — a world may have no heritage theming (company town, purely functional station, deep-drift post-heritage community). What a society DOESN'T have is as defining as what it does. + +**Category 1: Heritage Roots (OPTIONAL — what Earth culture drifted into this community)** + +| Option | Mechanical Signature | Access Tier Profile | +|---|---|---| +| *None/Functional* | *No inherited cultural norms. Access dynamics driven entirely by other ingredients (economic function, faction presence). No substrate vocabulary, no cultural gatekeeping.* | *No cultural immune system. Detective faces institutional opacity or frontier chaos, not cultural walls. Naming generated from economic function, not heritage.* | +| Nordic-Baltic | Privacy-default, labor solidarity, institutional distrust | Hard outsider wall, slow peer elevation, authority gets compliance not info | +| Mediterranean-Near Eastern | Hospitality-default, honor networks, generosity-as-status | Fast initial warmth, but deep trust is family-only; info hides in noise | +| East Asian | Hierarchical respect, obligation chains, face-saving | Authority gets deference but performative cooperation; real info through obligation | +| West African | Communal decision-making, storytelling tradition, elder-respect | Info flows through communal events but couched in metaphor; direct questions rude | +| Latin American | Personal warmth, patron-client dynamics, familismo | Cooperation is personal not institutional; access through patronage | +| Slavic-Central European | Institutional cynicism, dual economy, dark humor | Everyone assumes system is corrupt; grey economy is normal | +| South Asian | Community gatekeepers, code-switching, stratified access | Access mediated through gatekeepers; gatekeeper's agenda shapes all info | +| Blended/Cosmopolitan | No dominant norm, transactional, individualist | No cultural immune system; info freely available but untrustworthy | + +**Category 2: Settlement Motivation (why people came here)** + +| Option | Generator Output | Gameplay Effect | +|---|---|---| +| Economic opportunity | Pragmatic norms, wealth-gradient tensions, aspiration culture | NPCs talk money; status measured in material terms | +| Political refuge | Ideological cohesion, suspicion of institutions, solidarity bonds | NPCs share political beliefs; outsiders judged by alignment | +| Religious/philosophical mission | Meaning-centered norms, spiritual authority structures, communal living | NPCs reference shared doctrine; access through demonstrated belief | +| Military/strategic placement | Hierarchical discipline, chain-of-command default, unit loyalty | Rank determines access; chain of command is information highway | +| Scientific/research outpost | Intellectual meritocracy, data-sharing norms, reputation economy | Access through demonstrated competence; credentials matter | +| Forced relocation/diaspora | Trauma-bonded community, grievance as identity, fierce in-group loyalty | Deep insider/outsider divide; shared suffering is trust shortcut | +| Frontier homesteading | Self-reliant individualism, neighbor reciprocity, no institutions | No authority path; every relationship is personal | +| Corporate assignment | Company culture overlay, transactional loyalty, career-track norms | Access through organizational position; company is the culture | + +**Category 3: Economic Function (what this place DOES)** + +| Option | Generator Output | District Shape | +|---|---|---| +| Logistics/transit hub | Cargo ops, schedule-driven routines, transient population mix | Social sites: terminal, bar, maintenance corridors. Like Sova. | +| Manufacturing/industrial | Shift work, union dynamics, equipment-centered routines | Social sites: factory floor, canteen, dormitory blocks | +| Trade/commerce center | Market rhythms, deal-making culture, information-as-currency | Social sites: exchange floor, merchant quarter, entertainment district | +| Administrative/political capital | Bureaucratic routines, faction navigation, formal social events | Social sites: government quarter, reception halls, residential towers | +| Agricultural/life support | Growing cycles, seasonal rhythms, land-based community | Social sites: growing platforms, processing center, communal hall | +| Research/academic | Lab schedules, seminar culture, peer review dynamics | Social sites: labs, library/commons, residential campus | +| Military/security installation | Watch rotations, drills, restricted zones, barracks life | Social sites: command center, mess hall, training areas, perimeter | +| Entertainment/leisure | Service economy, performance schedules, night culture | Social sites: venues, backstage areas, hospitality quarters | + +**Category 4: Philosophical Alignment (collective answer to "Is this enough?")** + +This is Gore's civilizational posture, made into a generator parameter: + +| Option | What "Enough" Means | What Disrupts It | +|---|---|---| +| Pragmatic collectivism | Stability, community, privacy | Outsiders asking questions; internal exposure | +| Institutional trust | Status, career, institutional respect | Institutional failure; hollow system revealed | +| Self-reliant individualism | Freedom, autonomy, owing nothing | Scarcity; discovering you need others | +| Meritocratic ambition | Achievement, growth, excellence | Plateau; discovering success is empty | +| Meaning-seeking communalism | Inner growth, purpose, connection | Material crisis; idealism doesn't feed people | +| Hierarchical service | Honor, duty fulfilled, clear purpose | Unjust orders; discovering the cause is corrupt | +| Radical autonomy | Authenticity, privacy, self-determination | Isolation; freedom without community is loneliness | + +**Category 5: Corporate/Faction Presence (who has power here)** + +| Option | Power Structure | Access Dynamics | +|---|---|---| +| Commission-dominant | Regulatory control, institutional authority | Authority path viable but surveilled; grey economy is resistance | +| Syndic-dominant | Corporate monopoly, career ladder | Corporate path viable but owned; independence is suspicious | +| Contested (multi-faction) | Faction competition, political navigation | Multiple authority paths; loyalty is currency | +| Independent/unaligned | No institutional power, local governance only | No authority shortcut; everything is personal | +| Criminal syndicate influence | Shadow governance, protection economy | Knowing the right people matters more than credentials | +| Military administration | Martial law or military governance | Rank IS access; civilians are second-class | + +**Category 6: Drift Stage (how far from Earth-origin culture)** + +| Option | Cultural Effect | Naming/Language Effect | +|---|---|---| +| First-generation (0-50 years) | Strong Earth parallels, active heritage maintenance | Earth-recognizable names, heritage language substrate heavy | +| Established (50-150 years) | Adapted norms, heritage as identity marker not daily practice | Adapted names, moderate substrate vocabulary | +| Deep drift (150-300 years) | Fully local culture, heritage is history not practice | Novel naming conventions, minimal substrate | +| Ancient (300+ years) | Unrecognizable from heritage, unique local culture | Entirely local naming, unique vocabulary | + +### What the generator does with ingredients + +The generator takes one selection from each category and produces a **cultural parameter set**: + +```yaml +# Generated cultural parameter set +culture: + id: auto-generated-slug + ingredients: + heritage: nordic-baltic + settlement: economic-opportunity + economic: logistics-transit + philosophy: pragmatic-collectivism + faction: commission-dominant + drift: established + + # DERIVED mechanical parameters (computed from ingredient combination) + access_profile: + outsider_trust_baseline: -2 # from heritage(nordic-baltic) + philosophy(collectivism) + authority_disclosure: 0.4 # from heritage + faction(commission) interaction + peer_elevation_speed: slow # from heritage(nordic-baltic) + insider_disclosure: 0.9 # from philosophy(collectivism) + + # DERIVED naming parameters + naming: + heritage_weight: 0.6 # from drift(established) — 60% heritage-influenced + local_innovation: 0.4 # 40% locally evolved + phonological_base: nordic-baltic # feeds naming algorithm + surname_usage: 0.3 # from heritage + + # DERIVED social norms (list of active modifiers) + social_norms: + - privacy_default # from heritage(nordic-baltic) + - labor_solidarity # from heritage + economic(logistics) + - institutional_compliance # from faction(commission-dominant) + - earned_trust # from heritage + philosophy(collectivism) + + # DERIVED moral texture (from philosophy + settlement + economic interaction) + moral_texture: complicity # pragmatic-collectivism + economic-opportunity + logistics +``` + +This IS Sova's culture — generated from ingredients rather than hand-written. The Krenn brief becomes the **benchmark output** that the generator must match when given these particular ingredient selections. + +### The mechanical parameter derivation rules + +This is where systems design gets load-bearing. The generator needs **derivation rules** that compute mechanical parameters from ingredient combinations: + +| Mechanical Parameter | Primary Ingredient | Modifying Ingredients | Derivation Rule | +|---|---|---|---| +| `outsider_trust_baseline` | Heritage Roots | Philosophy, Faction | Base from heritage lookup table, modified by philosophy (+1 if communalist, -1 if individualist), modified by faction (+1 if independent, -1 if military) | +| `authority_disclosure` | Heritage Roots | Faction, Settlement | Base from heritage, boosted if faction is Commission, reduced if settlement is refugee/frontier | +| `peer_elevation_speed` | Heritage Roots | Drift Stage | Base from heritage, faster if deep-drift (local customs dominate heritage formality) | +| `cultural_immune_system` | Heritage Roots | Philosophy, Settlement | Composite: high if collectivist+homogeneous-settlement, low if cosmopolitan+frontier | +| `information_flow_pattern` | Heritage Roots | Economic Function | Nordic = restricted channels, Mediterranean = flows freely, hierarchical = chain of command, communal = collective events | +| `ring_camouflage_type` | Heritage + Settlement | Economic, Philosophy | What local virtue the hidden network exploits. Nordic+collectivist = solidarity. Military+hierarchical = obedience. Research+meritocratic = academic freedom. | + +**These derivation rules are the Sacred content of the cultural system.** They're authored once, validated against benchmark districts, and never randomized. The ingredients are Profane — which combination the generator selects varies per world. + +### What changes from my Round 3 + +| R3 Proposal | R4 Reframe | +|---|---| +| 6-8 fixed heritage clusters | 6 ingredient categories × 5-8 options each | +| One Miri-quality brief per cluster | One ingredient definition per option (~48 total) | +| Blended districts interpolate between parents | Generator composes from ingredients — blending is the default, not the exception | +| ~20-25 systems across clusters | 300 worlds, each with a unique ingredient combination | +| Cultural map is hand-designed | Cultural distribution is a generator constraint (ensure diversity, avoid repetition) | + +**Decision proposal (D-WR-21):** Cultures are generated from a 6-category ingredients menu (Heritage Roots, Settlement Motivation, Economic Function, Philosophical Alignment, Faction Presence, Drift Stage). Each ingredient has a mechanical parameter contribution. The generator composes cultures by selecting ingredients and deriving mechanical parameters through authored derivation rules. The derivation rules are Sacred. The ingredient selections are Profane. + +--- + +## 2. Three-System NPC Architecture: Thematic × Functional × Composition + +### The architecture + +The lead's directive separates NPC characterization into three independent systems. Let me map what this means mechanically: + +**System A: Thematic Patterns** — WHO this character is in the story's emotional architecture + +| Pattern | Emotional Function | Content Depth | Generator Input | +|---|---|---|---| +| FRIEND | Trust anchor hiding a contradiction | Tier 1 (always) | Contradiction arc template, tell progression, warmth phase structure | +| MIRROR | Honest character amplifying others' dishonesty | Tier 1 | Transparency profile, vulnerability map, what they don't know | +| ANCHOR | Embodies "enough" — genuine contentment | Tier 2 | Contentment source, what threatens it, why it's not ignorance | +| GHOST | Absent authority shaping events | Stub only | Influence model, communication patterns, who acts on their behalf | +| CATALYST | Outsider who forces reckoning | Tier 2 | What disruption they bring, why they're here, who they destabilize | +| THRESHOLD | Embodies the district's moral question | Varies | The object/person/situation that makes "enough" inadequate | +| REMNANT | Former ascended who came back | Tier 2 | What they were, why they returned, what they lost, what they gained | +| SYSTEM | Institutional representative | Tier 2 | Which institution, what authority, how they use/abuse it | +| NOBODY | Background character who can promote | Tier 3 → dynamic | Promotion triggers, what they notice, what they become when noticed | + +**System B: Functional Motivations** — WHAT this character does in the gameplay loop + +| Motivation | Gameplay Role | Investigation Function | Navigation Function | +|---|---|---|---| +| HANDLER | Off-stage authority, pressure source | Whose orders? Who benefits? | Whose approval do I need? What do they demand? | +| WITNESS | Accidentally saw something | Information source if found | Liability to manage or protect | +| TURNCOAT | Loyalty will flip mid-game | Potential ally/threat | Betrayal risk, trust recalibration | +| CIVILIAN | Uninvolved, dragged in by events | Collateral damage of investigation | Consequences of the player's actions made personal | +| OPERATOR | Network member, competent and comfortable | Target, information holder | Colleague, dependency, potential rival | +| SKEPTIC | Doubts the network's justification but hasn't acted | Potential informant | Potential ally or threat depending on which way they break | + +**System C: Composition Rules** — HOW patterns and motivations combine + +This is the new system. Every NPC gets one thematic pattern (System A) and one functional motivation (System B). The composition rules define which combinations are valid, which are forbidden, and which create the richest dynamics. + +### The composition matrix + +Let me map every valid combination. This is the generator's constraint specification: + +| | HANDLER | WITNESS | TURNCOAT | CIVILIAN | OPERATOR | SKEPTIC | +|---|---|---|---|---|---|---| +| **FRIEND** | Forbidden | Valid (low) | **EXCELLENT** | Valid (med) | **EXCELLENT** | Valid (high) | +| **MIRROR** | Forbidden | Valid (med) | Forbidden | **EXCELLENT** | Forbidden | Valid (med) | +| **ANCHOR** | Forbidden | Valid (low) | Valid (low) | **EXCELLENT** | Valid (low) | Valid (med) | +| **GHOST** | **EXCELLENT** | Forbidden | Forbidden | Forbidden | Valid (med) | Forbidden | +| **CATALYST** | Valid (med) | Valid (med) | Valid (high) | Forbidden | Valid (med) | **EXCELLENT** | +| **THRESHOLD** | Valid (med) | Valid (high) | Valid (med) | Valid (med) | Valid (med) | Valid (med) | +| **REMNANT** | Valid (low) | Valid (med) | Valid (high) | Valid (med) | Forbidden | **EXCELLENT** | +| **SYSTEM** | **EXCELLENT** | Valid (low) | Valid (high) | Forbidden | Valid (med) | Valid (med) | +| **NOBODY** | Forbidden | **EXCELLENT** | Valid (high) | **EXCELLENT** | Valid (med) | Valid (high) | + +Rating key: +- **EXCELLENT** = synergistic — the combination produces dynamics neither system creates alone +- **Valid (high/med/low)** = works, with varying richness +- **Forbidden** = contradictory or mechanically incoherent + +### Why the EXCELLENT combinations work + +Let me break down what makes each synergy mechanically interesting: + +**FRIEND × TURNCOAT:** Your closest ally is the one whose loyalty flips. This is the MAXIMUM betrayal configuration. The warmth phase is real — they genuinely care about you. And then the pressure breaks them. The player faces: "My friend betrayed me, but I understand WHY." This is the complicity question aimed directly at the player's relationship. + +**FRIEND × OPERATOR:** Your closest ally is competent within the network. They're not conflicted — they're good at what they do. The contradiction is: they're hiding something from you (FRIEND requirement), and it's that they're deeper in than you thought (OPERATOR). The warmth is professional respect layered over personal affection. + +**MIRROR × CIVILIAN:** The honest character is also uninvolved. Their transparency is total because they have nothing to hide. When they get dragged in by the player's actions, the damage is devastating — you broke the one genuinely innocent person. + +**ANCHOR × CIVILIAN:** The content person is uninvolved. Their contentment is genuine AND uncomplicated. When events drag them in, the question is: "Was their peace worth protecting? Did my investigation destroy something good?" + +**GHOST × HANDLER:** The absent authority IS the handler. They apply pressure through intermediaries. You never meet them. You only feel their influence through demands delivered by others. The detective can never confront them directly; the smuggler can never negotiate face-to-face. + +**CATALYST × SKEPTIC:** The outsider who forces reckoning is also the one who doubts the network. They destabilize not through investigation but through moral questioning. They ask "why do you do this?" and nobody has a good answer. + +**REMNANT × SKEPTIC:** The person who transcended and came back is also the one questioning current arrangements. They have AUTHORITY to question — they've been further than anyone. Their skepticism isn't ignorance; it's hard-won wisdom. + +**SYSTEM × HANDLER:** The institutional representative IS the handler. The Commission inspector who applies pressure is also the system's visible face. Investigation target AND authority figure. The detective can't arrest their own chain of command. + +**NOBODY × WITNESS:** The background character accidentally saw something. They haven't told anyone. They don't know what they saw was important. When the player notices them — gives them attention — they promote from Tier 3 to Tier 2 and become an information source. But they're fragile. The network will notice you talking to them. + +**NOBODY × CIVILIAN:** The background character who gets pulled into events. They were wallpaper. The player's actions make them a person. This is the content-as-consequence mechanic — the player's investigation has collateral damage, and the damage has a face they didn't expect. + +### THE NOBODY: Dynamic Tier Promotion + +This is the lead's new pattern and it's mechanically fascinating. Let me spec it out: + +**Core mechanic:** THE NOBODY starts at Tier 3. They have a routine, a greeting, a name. They're social wallpaper. But they have a **promotion trigger set** — conditions under which the generator has pre-seeded content for them to become Tier 2. + +```yaml +nobody_spec: + promotion_triggers: + - type: player_attention + condition: "Player initiates conversation 3+ times" + promotion_path: witness # They reveal they saw something + - type: proximity_event + condition: "Player witnesses them near a network event" + promotion_path: civilian # They get dragged in + - type: network_pressure + condition: "Network needs a new recruit" + promotion_path: operator # They get recruited in real time + - type: investigation_pressure + condition: "Detective runs out of leads" + promotion_path: skeptic # They volunteer doubts they've been sitting on + + # Tier 3 content (always loaded) + tier3: + routine: standard_worker + greeting_pool: [generic_greetings] + name: generated_from_cultural_params + + # Tier 2 content (loaded on promotion, pre-generated by generator) + tier2_witness: + what_they_saw: "Kael meeting unknown contact in B-7" + how_they_react: "Nervous, doesn't want to be involved" + dialogue_pool: [witness_reluctant_pool] + tell_system: "Avoids eye contact when topic is near event" + + tier2_civilian: + how_dragged_in: "Their routine overlaps with network operations" + stakes: "Job security, family, desire for quiet life" + dialogue_pool: [civilian_distressed_pool] + + # etc. +``` + +**The generator's job:** For every NOBODY, pre-generate 2-3 promotion paths with Tier 2 content. The content exists in the data but is dormant until the promotion trigger fires. The player never knows which background characters have promotion paths. This creates the illusion of infinite depth — "anyone could be important" — without actually requiring infinite content. + +**The Sacred/Profane mapping:** +- Sacred: The promotion trigger TYPES (player attention, proximity, network pressure, investigation pressure) — these are engine patterns +- Profane: Which specific NOBODY has which promotion paths, what they saw, how they react — generated per world from templates +- Middle Kingdom: The promotion path STRUCTURES (witness has what-they-saw + reluctance curve, civilian has stakes + distress curve) — authored templates, procedurally filled + +**At 300-world scale:** Each world gets 5-10 NOBODY NPCs with pre-generated promotion paths. That's 1500-3000 dormant stories across the game. The player encounters maybe 10% of them. Different players in different worlds promote different NOBODYs. This is emergent narrative from a generator specification, and it's beautiful. + +### Composition constraints for the generator + +The generator needs these rules when assembling a district's NPC roster: + +**Hard constraints (Sacred):** +1. Every district has exactly 1 FRIEND per supported PC archetype +2. Every district has exactly 1 MIRROR (or 0 if district is explicitly mirror-free) +3. No NPC can have a Forbidden composition (per matrix above) +4. FRIEND NPCs must be Tier 1. MIRROR must be Tier 1. All others Tier 2+. +5. The entanglement ratio (D-029: 30/50/20) must hold across the district + +**Soft constraints (Middle Kingdom — structure is sacred, specific values are profane):** +1. At least 2 EXCELLENT compositions per district (maximize dramatic richness) +2. At least 1 NOBODY with witness promotion path per district +3. TURNCOAT pool minimum 2 candidates (anti-metagaming) +4. SKEPTIC must be in same social site as at least 1 OPERATOR (proximity creates tension) +5. FRIEND's functional motivation should differ between PC archetypes (smuggler's FRIEND is OPERATOR, detective's FRIEND is TURNCOAT — different emotional trajectories) + +**Anti-constraints (what the generator should NOT do):** +1. Don't assign all EXCELLENT compositions in one district — spread the richness +2. Don't put all NOBODYs in one social site — distribute across the district +3. Don't make every TURNCOAT flip at the same time — stagger for pacing +4. Don't assign GHOST + HANDLER to the same absent entity unless the district is small + +**Decision proposal (D-WR-22):** NPCs are characterized by two independent systems: thematic pattern (9 options) and functional motivation (6 options). A composition matrix defines valid, excellent, and forbidden combinations. The generator selects compositions per NPC within Sacred hard constraints, Middle Kingdom soft constraints, and anti-constraints. THE NOBODY pattern uses dynamic tier promotion with pre-generated dormant content paths. + +--- + +## 3. Eight PC Archetypes as Generator Inputs + +### The archetype set + +The lead confirmed 8 archetypes with fluid transitions. Gore's vocabulary (Worker, Investigator, Operator, Wanderer, Builder, Seeker, Guardian, Rebel) is the starting point. Let me map each to generator-input specifications: + +| Archetype | Information Position | Core Mechanic | "Is This Enough?" | Generator Must Produce | +|---|---|---|---|---| +| **Worker** (Smuggler) | Insider | Risk management, dual-life navigation | "Is the money worth what it costs?" | Starting knowledge of network, cover identity, network role, insider access tier | +| **Investigator** (Detective) | Outsider examining | Pattern recognition, social investigation | "Is the truth worth what it disrupts?" | Investigation authority, analytical tools, outsider access tier, institutional backing | +| **Operator** | Insider controlling | Network building, resource management, power | "Is the power worth what I've become?" | Network position (higher than Worker), operational knowledge, lieutenants, rivals | +| **Wanderer** (Newcomer) | Blank slate | Discovery, relationship building, cultural learning | "Is belonging worth the compromise?" | Minimal starting knowledge, arrival context, cultural alienation, fast relationship mechanics | +| **Builder** | Insider constructing | Base building, community development, legacy | "Is the legacy worth the cost of building?" | Property/project, community ties, resource access, institutional relationships | +| **Seeker** | Transcending | Lattice progression, perception expansion | "Is transcendence worth what you lose?" | Lattice tier, perception modes, technical knowledge, social distance as you ascend | +| **Guardian** | Insider protecting | Defense, security, threat assessment | "Is what I protect worth what I do to protect it?" | Security role, surveillance access, threat knowledge, community investment | +| **Rebel** | Against | Faction politics, institutional disruption | "Is the cause worth the destruction?" | Ideological commitment, faction ties, target knowledge, what they're willing to destroy | + +### Archetype as generator specification + +Each archetype definition is a **generator template** — a specification that the District Composer uses to create viable starting positions in every generated world: + +```yaml +archetype: + id: worker + display_name: "The Worker" + + # What the generator must create for this archetype in every district + required_district_content: + - starting_knowledge: + network_membership: true # Knows the hidden network + network_scope: partial # Doesn't know the full extent + cultural_integration: high # Belongs to the community + institutional_knowledge: low # Doesn't understand the system from above + - relationships: + friend_functional_preference: [operator, turncoat] # FRIEND should be network-connected + minimum_insider_contacts: 3 # Knows at least 3 network members + minimum_civilian_contacts: 2 # Has life outside the network + - access_tiers: + network_members: insider + community: peer + institutional_figures: public # Authority doesn't know them + outsiders: peer # Appears normal + - agency_boundaries: + can_do: [transport, negotiate, maintain_cover, socialize] + cannot_do: [arrest, investigate_officially, access_records, command] + + # Monologue voice specification (for line generation) + voice: + perspective: relational # Thinks in people, not patterns + vocabulary: [work, cargo, shifts, friends, money, risk, home] + anxiety_triggers: [exposure, betrayal, inspection, loyalty_test] + moral_register: complicity # Default, overridden by district moral texture + + # NPC-mode behavior specification (when not player-controlled) + npc_behavior: + routine_base: shift_worker + deviation_triggers: [network_operation, handler_demand, friend_crisis] + observable_actions: [corridor_meeting, schedule_deviation, cargo_inspection_anxiety] + investigation_vulnerability: [schedule_gap, cargo_anomaly, nervous_behavior] +``` + +### Archetype transitions as game mechanics + +The lead says transitions are a mechanic, not just narrative flavor. Let me define what this means mechanically: + +**Transition = a change in the player's relationship to the systems around them.** The archetype determines: +- What you KNOW (starting knowledge) +- What you CAN DO (agency boundaries) +- How others TREAT YOU (access tiers) +- What you NOTICE (monologue triggers) +- What the game ASKS YOU (moral question) + +A transition changes ALL of these. That's not a costume change — it's a gameplay transformation. + +### The transition graph + +Not all transitions are valid. The generator needs to know which paths exist: + +``` + Wanderer + ↓ ↑ + Worker ←→ Builder + ↓↑ ↓↑ + Operator Guardian + ↓↑ ↓↑ + Rebel ←→ Seeker + ↑ + Investigator (can transition to Seeker or Guardian) +``` + +Transition rules: + +| From → To | Trigger Condition | What Changes | Generator Content Needed | +|---|---|---|---| +| Wanderer → Worker | Accept network role | Gain insider knowledge, gain community, lose mobility | Recruitment scene, new starting knowledge, relationship shifts | +| Worker → Operator | Accumulate network influence | Gain authority within network, gain power, gain enemies | Promotion arc, lieutenant assignments, rival generation | +| Worker → Builder | Invest in community | Gain property/project, gain institutional ties, lose anonymity | Project definition, community investment, public visibility | +| Operator → Rebel | Decide the system is wrong | Lose network loyalty, gain ideological allies, become a target | Faction break, new allies, new enemies, philosophical crisis | +| Builder → Guardian | Become invested in protecting what you built | Gain security role, gain threat awareness, lose innocence | Threat generation, security responsibilities, moral compromises | +| Guardian → Seeker | Decide protection isn't enough; need greater capability | Gain lattice progression, lose human connection gradually | Ascension opportunity, capability gains, social distance | +| Investigator → Guardian | Decide the system needs defenders, not just investigators | Lose investigation authority, gain protection mandate | Role shift, new responsibilities, perspective change | +| Investigator → Seeker | Pursue enhanced perception for investigative purposes | Gain analytical capabilities, lose human-readable empathy | Lattice enhancement tied to investigation, ethical questions about surveillance | + +### What the generator produces per archetype per world + +For each of the 8 archetypes, the District Composer must produce: + +| Component | Content Type | Generation Method | +|---|---|---| +| Starting knowledge graph | YAML | Derived from archetype template + district context | +| Relationship map | YAML | Generated from archetype's social position requirements | +| FRIEND assignment | Pool selection | Draw from district FRIEND pool filtered by archetype preference | +| Monologue seed pool | Dialogue lines | Line expander from archetype voice card + district moral texture | +| NPC-mode behavior tree | YAML | Adapted from archetype behavior template + district routine patterns | +| Access tier map | YAML | Derived from archetype template + cultural access profile | +| Transition opportunities | YAML | Which transitions are available in this district, what triggers them | + +**At 300-world scale:** 300 worlds × 8 archetypes = 2,400 archetype instantiations. All generated. The authored inputs are: 8 archetype templates + 8 voice cards + transition rules. The generators do the rest. + +**Decision proposal (D-WR-23):** 8 PC archetypes (Worker, Investigator, Operator, Wanderer, Builder, Seeker, Guardian, Rebel) with authored template specifications. Each archetype defines starting knowledge, relationship requirements, access tiers, agency boundaries, voice specification, and NPC-mode behavior. Transitions are mechanical game events that change all parameters. The generator instantiates all 8 archetypes per world from templates + district context. + +--- + +## 4. Sacred/Profane/Middle Kingdom: Full System Mapping + +### The framework applied to generators + +Nigel's framework is the right architectural language. At 300-world scale, it becomes the **generator constraint specification**: + +- **Sacred** = rules the generator must obey (never varies, authored once) +- **Profane** = parameters the generator draws from pools (varies per world) +- **Middle Kingdom** = structures the generator instantiates with profane content (sacred skeleton, profane flesh — exactly my R3 concept, now applied to generators instead of hand-authoring) + +### Complete system mapping + +| Game System | Sacred (Generator Rules) | Profane (Pool Draws) | Middle Kingdom (Templates) | +|---|---|---|---| +| **Cultural generation** | Derivation rules (ingredient → parameter), access tier formulas, information flow patterns | Which ingredients are selected per world | Cultural parameter set structure, social norm modifier list | +| **NPC generation** | Composition matrix (valid/forbidden), tier requirements per pattern, entanglement ratio | Which NPCs fill which roles, names, personality trait assignments | NPC profile structure (10 axes), thematic pattern templates, functional motivation templates | +| **FRIEND system** | 5-phase arc structure, tell system mechanics, warmth → contradiction progression | Which NPC is FRIEND, specific contradiction content, specific tell behaviors | FRIEND template (arc phases, emotional beats, discovery triggers) — authored pool, culturally skinned per world | +| **NOBODY system** | Promotion trigger types, tier transition mechanics | Which NOBODYs have which promotion paths, specific content per path | Promotion path templates (witness path, civilian path, operator path, skeptic path) | +| **Triangle system** | Triangle must have 3 NPCs, must produce a fork, must cascade | Which NPCs form which triangles, specific tension content | Triangle type templates (power, loyalty, knowledge, romantic, economic) | +| **District structure** | Minimum social sites, minimum NPC count, adversarial pair required, FRIEND required per archetype | Social site configuration, NPC assignments, location descriptions | District skeleton (social sites + hidden network + patterns + archetypes + contested resource) — my R3 skeleton, now a generator template | +| **PC archetypes** | 8 archetype definitions, transition graph, agency boundaries | Starting position per world, specific NPC relationships | Archetype instantiation template (knowledge + relationships + access + behavior) | +| **Dialogue** | Tag taxonomy (D-035), 4-layer selection pipeline, access tier filtering | Specific lines per NPC per situation, voice variations | Line pool structure, voice card templates | +| **Monologue** | Trigger system, character partition (D-032), prerequisite gates | Specific lines per character per district | Monologue pool structure per archetype | +| **Randomization** | Pool minimum sizes, constraint satisfaction rules, anti-metagaming requirements | Seed-time draws from all pools | Seed configuration structure (what gets drawn, constraint validation) | +| **Gate topology** | Connectivity requirements (every world reachable), minimum route diversity | Which worlds connect to which, travel times | Topology generation rules (small-world network properties, hub placement) | +| **Storyteller** | Pacing algorithm, escalation phase structure, engagement tracking | Timing of events, selection from event pools | Storyteller decision nodes (DSL effects vocabulary) | +| **Faction system** | Faction definitions, power conservation | Per-world faction strength, local faction presence | Faction influence template (how strength maps to access, NPC behavior, resource availability) | + +### Pool structures for generators + +At 300-world scale, the pool concept becomes the central architecture. Every profane element is drawn from a pool. The pools are the authored content: + +**Global pools (used across all worlds):** + +| Pool | Size Target | Content Per Entry | Author Cost | +|---|---|---|---| +| FRIEND templates | 30-50 | Full contradiction arc, warmth phase, tell system, culturally unspecified | 15-20h each | +| MIRROR templates | 15-25 | Transparency profile, vulnerability map, emotional arc | 10-15h each | +| NOBODY promotion templates | 40-60 | 2-3 promotion paths per template, Tier 2 content per path | 3-5h each | +| NPC personality archetypes | 20-30 | Personality trait combinations, voice hints, behavioral tendencies | 2-3h each | +| Triangle type templates | 10-15 | Tension structure, fork conditions, cascade effects | 3-4h each | +| Storyteller event templates | 30-50 | Decision node DSL, trigger conditions, effects | 2-3h each | +| Contraband/contested resource types | 15-20 | Moral dimension, gameplay relevance, cultural grounding hooks | 2-3h each | +| Environmental text template sets | 10-15 per economic function | Signs, menus, graffiti patterns, ticker headline templates | 4-6h per set | + +**Per-world pools (generated, not authored):** + +| Pool | Generated From | Size Per World | +|---|---|---| +| NPC roster | Cultural params + social site templates + thematic patterns + functional motivations | 15-40 NPCs | +| FRIEND candidates | Global FRIEND pool + cultural skinning + district context | 2-4 per archetype | +| Role-slot assignments | NPC roster + triangle templates + composition rules | All role slots filled | +| Dialogue lines | Voice card + cultural params + line expander | 50-200 per location | +| Environmental text | Template sets + cultural params | 20-40 items | +| Promotion paths | NOBODY templates + district context | 2-3 per NOBODY | + +### Gate topology randomization + +The lead mentioned 300 worlds. These worlds need to be connected. The gate topology is a generator output: + +**Sacred constraints for gate topology:** +1. Every world must be reachable from every other world (connected graph) +2. No world is more than N hops from a hub world (diameter limit) +3. Hub worlds exist at cultural boundary crossings (where ingredient profiles shift) +4. Starting worlds (Wanderer-friendly) must be well-connected (degree 3+) +5. Frontier worlds can be low-connectivity (degree 1-2) for isolation feel +6. Gate connections create trade routes → trade routes determine which contraband flows where + +**Profane parameters for gate topology:** +- Which specific worlds connect to which +- Travel times between connected worlds +- Gate types (span gate = fast, founder gate = rare and fast, wormhole = slow) +- Hub placement (which worlds are hubs) + +**Middle Kingdom template:** +- Small-world network topology (high clustering + short path lengths — like real social networks) +- 5-10 hub worlds (high connectivity, cosmopolitan culture, trade nexus) +- 20-30 mid-tier worlds (moderate connectivity, established cultures) +- 250-270 peripheral worlds (low connectivity, deep-drift cultures, frontier/specialized) + +**The topology shapes gameplay:** The player who starts on a hub world has immediate access to cultural diversity. The player who starts on a frontier world must travel through intermediate worlds to reach the hubs — each intermediate world is a new cultural context, a new ring, a new version of "Is this enough?" + +**Decision proposal (D-WR-24):** All game systems map to Sacred/Profane/Middle Kingdom. Sacred content (rules, derivation formulas, structural requirements) is authored once. Profane content (parameter selections, pool draws) varies per world. Middle Kingdom content (templates with slots) is authored as structures with profane fill. Generators consume Sacred rules and Middle Kingdom templates to produce worlds from Profane pool draws. + +--- + +## 5. What Changes Fundamentally at 300-World Scale + +### The district skeleton becomes a generator template + +My R3 skeleton was designed for hand-authoring: + +``` +Social Sites + Hidden Network + FRIEND + Cultural Group + Moral Texture + Archetypes + Contested Resource +``` + +At 300-world scale, this skeleton is now the **District Composer's output specification.** Every element in the skeleton is generated, not authored: + +| Skeleton Element | R3: Hand-Authored | R4: Generator Produces | +|---|---|---| +| Social sites | Designed per district | Generated from Economic Function ingredient + cultural params | +| Hidden network | Designed per district | Generated from Faction Presence + contraband type + cultural immune system | +| FRIEND | Authored Tier 1 per district | Selected from global FRIEND template pool, culturally skinned, adapted to district context | +| Cultural group | Referenced from cluster brief | Generated from ingredients menu | +| Moral texture | Emerged from configuration | Derived from Philosophical Alignment + Settlement Motivation ingredients | +| PC archetypes | Selected per district | All 8 supported everywhere; instantiated from archetype templates | +| Contested resource | Designed per district | Selected from contraband/resource pool, filtered by cultural plausibility | + +### The authoring pipeline becomes generator development + +My R3 7-phase pipeline (Design → Population → Tier 1 → Tier 2 → Tier 3 → Integration → Playtesting) described a human-driven production process. At 300 worlds, the pipeline becomes: + +``` +GENERATOR DEVELOPMENT PIPELINE + +Phase 1: INGREDIENT AUTHORING +├── Heritage Roots definitions (8 options × mechanical params) +├── Settlement Motivation definitions (8 options × mechanical params) +├── Economic Function definitions (8 options × social site templates) +├── Philosophical Alignment definitions (7 options × moral texture) +├── Faction Presence definitions (6 options × power dynamics) +├── Drift Stage definitions (4 options × naming/language effects) +└── Derivation rules (ingredient → mechanical parameter) + +Phase 2: TEMPLATE AUTHORING +├── FRIEND templates (30-50 contradiction arcs) +├── MIRROR templates (15-25 transparency profiles) +├── NOBODY promotion templates (40-60 dormant stories) +├── Triangle type templates (10-15 tension structures) +├── Storyteller event templates (30-50 decision nodes) +├── Voice card library (30+ NPC voice archetypes) +├── PC archetype definitions (8 full specifications) +└── Transition rules and content + +Phase 3: GENERATOR DEVELOPMENT +├── Cultural Parameter Generator (ingredients → params) +├── NPC Generator (params + patterns + motivations → NPCs) +├── FRIEND/MIRROR Skinner (template + culture → instance) +├── District Composer (all generators → complete district) +├── Naming Algorithm (cultural params → names at all levels) +├── Dialogue Line Expander (seed lines + voice → pool) +├── Gate Topology Generator (constraints → connected world graph) +└── NOBODY Promotion Generator (templates + context → dormant paths) + +Phase 4: VALIDATION DEVELOPMENT +├── Schema validation (structural correctness) +├── Composition rule checker (no forbidden combos) +├── Constraint satisfaction verifier (all Sacred rules hold) +├── Cultural coherence checker (generated culture feels real) +├── Emotional integrity checker (FRIEND arcs land, MIRROR feels honest) +└── Diversity metrics (300 worlds don't feel samey) + +Phase 5: GENERATION + REVIEW +├── Generate 300 worlds +├── Automated validation pass (all gates must pass) +├── Human review of FRIEND/MIRROR instances (100% review) +├── Spot-check review of generated districts (5-10%) +├── Benchmark comparison (generated vs. hand-authored quality) +└── Iteration on generators where quality falls short + +Phase 6: HAND-ELEVATION +├── Starting districts (Wanderer entry points) get hand-authored polish +├── Hub worlds get additional hand-authored content depth +├── Narrative-critical worlds get authored story threads +└── Benchmark districts serve as quality reference +``` + +### What MUST still be hand-authored + +Even at 300-world scale, some content is irreducibly human: + +| Content | Why It Can't Be Generated | Quantity | +|---|---|---| +| FRIEND contradiction arcs | Emotional specificity. A generated "your friend is hiding something" is not the same as "Kael meets someone in B-7 and his hands shake when he lies about it." | 30-50 template arcs (culturally skinned × 300 worlds, but the ARCS are hand-written) | +| MIRROR vulnerability maps | Honesty is character-specific. What makes someone transparent in a way that reveals others' dishonesty requires authorial intention. | 15-25 template profiles | +| PC voice cards | The internal voice of a character must be authored with specificity. Generated monologue is flat. | 8 voice cards | +| Seed dialogue lines | The 10-15 authored lines per voice archetype that the line expander works from. These are the DNA of all generated dialogue. | 300-450 lines total | +| Derivation rules | The rules that compute mechanical parameters from ingredients are game design, not content. They require systems thinking. | ~50-100 rules | +| Benchmark districts | 5-8 hand-authored districts that serve as quality targets. The generators must match these. | 5-8 full districts | + +### What changes from my R3 proposals + +| R3 Proposal | R4 Reframe | What Survives | +|---|---|---| +| D-WR-11: Master theme "knowledge as burden" | **Open — the lead hasn't confirmed a universal theme.** Both Gore's "cost of participation" and my "knowledge as burden" are viable. Both map to mechanical systems. The theme debate continues. | The principle that moral texture emerges from configuration, not labels — this is more important than ever at generator scale | +| D-WR-12: 6-8 heritage clusters | **Replaced by ingredients menu (D-WR-21).** Heritage roots are one of 6 ingredients. The generator produces far more cultural variety than fixed clusters. | Each heritage root option inherits R3's mechanical signature and access tier profile | +| D-WR-13: Universal district skeleton | **Survives as generator output spec.** The skeleton is now what the District Composer produces, not what a human designs. | The skeleton structure is Sacred. Its population is Profane. | +| D-WR-14: Content directory as platform | **Survives, expanded.** The directory structure holds generator outputs, not hand-authored content. DLC/mod support means: DLC adds new ingredients, templates, and pool entries. Mods can add the same. | Pack manifest system, overlay mechanics, canonical_id — all survive | +| D-WR-15: Randomization philosophy | **Subsumed by Sacred/Profane/Middle Kingdom (D-WR-24).** The 4-tier model (Structural/Dramatic/Local/Meta) maps onto the S/P/MK framework. Structural = Sacred + seed-time Profane. Dramatic = storyteller Middle Kingdom. Local = runtime Profane. Meta = world-generation Profane. | "Randomize context, author content" survives as the core philosophy — the generators randomize, the authored templates provide the content | +| D-WR-16: 6 PC archetypes | **Expanded to 8 (D-WR-23).** Lead confirmed 8 with fluid transitions. The adversarial pair principle survives but at a different level — it's a generator constraint, not a per-district design choice. | Archetype definitions as global specs, local instantiation — this pattern is stronger than ever | +| D-WR-17: Districts as production units | **Replaced by generators as production units.** The 7-phase pipeline becomes generator development. The 6 tools become generators + validators. | The validation tooling (schema, cross-reference, cultural consistency) is MORE important at 300-world scale | +| D-WR-18: Multiplicative content variety | **Vindicated and amplified.** 300 worlds × 8 archetypes × FRIEND pool × seed variation = astronomical variety. The multiplication table is now the generator's output space. | The multiplication principle IS the generator architecture | +| D-WR-19: Heritage cluster distribution | **Replaced by generator diversity constraints.** The generator must ensure cultural diversity across 300 worlds, not follow a hand-designed distribution map. | The constraint that "not all worlds should feel the same" becomes a generator validation metric | +| D-WR-20: Adversarial pair as minimum content unit | **Survives as Sacred generator constraint.** Every district must have at least one insider archetype and one investigator archetype. The generator enforces this. | The principle that every district needs information asymmetry between archetypes | + +--- + +## 6. The Generator Interaction Map + +Here's what makes me genuinely excited as a systems designer. The generators INTERACT with each other, and those interactions produce emergent variety at 300-world scale: + +``` +GENERATOR INTERACTION MAP + +Cultural Parameter Generator + ├──→ NPC Generator (cultural params shape personality, routine, norms) + ├──→ Naming Algorithm (cultural params determine phonological rules) + ├──→ FRIEND/MIRROR Skinner (cultural params dress the template) + ├──→ Dialogue Line Expander (cultural vocabulary enters generated lines) + ├──→ Environmental Text Generator (cultural signs, menus, graffiti) + └──→ District Composer (cultural params shape social sites, hidden network) + +NPC Generator + ├──→ Composition Rule Checker (validates pattern × motivation) + ├──→ Triangle Generator (NPCs assigned to triangle roles) + └──→ NOBODY Promotion Generator (which NPCs get promotion paths) + +FRIEND/MIRROR Skinner + ├──→ Dialogue Line Expander (FRIEND voice feeds line generation) + └──→ Monologue Generator (FRIEND-specific monologue triggers) + +District Composer + ├── Consumes: Cultural params, NPC roster, triangle assignments, + │ FRIEND/MIRROR instances, social site templates, adversarial structure + └── Produces: Complete district YAML ready for engine consumption + +Gate Topology Generator + ├── Consumes: World list, cultural distribution, hub requirements + └── Produces: Connected world graph with travel routes + +Seed Configuration Generator + ├── Consumes: District content, pool definitions, constraint rules + └── Produces: Per-seed configuration (which pools draw which results) +``` + +The beauty: **each generator is independently testable.** The Cultural Parameter Generator can be validated against Miri's Krenn brief. The NPC Generator can be validated against Paula's Sova NPCs. The FRIEND Skinner can be validated against our hand-authored FRIENDs. Each generator has a benchmark. Each can be iterated independently. + +But when they INTERACT — when the Cultural Parameter Generator feeds the NPC Generator which feeds the Triangle Generator which feeds the District Composer — the output space explodes combinatorially. 300 worlds. All different. All mechanically coherent. All asking the same question. + +--- + +## Decisions Summary + +| # | Decision | Domain | +|---|---|---| +| D-WR-21 | Cultural ingredients menu: 6 categories × 5-8 options. Generator composes cultures from ingredient selections + authored derivation rules. Rules are Sacred, selections are Profane. | Culture | +| D-WR-22 | Three-system NPC architecture: thematic patterns (9) × functional motivations (6), governed by composition matrix. THE NOBODY uses dynamic tier promotion with pre-generated dormant content. | NPC Design | +| D-WR-23 | 8 PC archetypes with generator template specifications. Fluid transitions are a game mechanic. Generator instantiates all 8 per world from templates + context. | Archetypes | +| D-WR-24 | Sacred/Profane/Middle Kingdom maps to all game systems. Sacred = generator rules, Profane = pool draws, Middle Kingdom = templates with slots. | Architecture | +| D-WR-25 | R3 district skeleton survives as generator output specification (Sacred structure). Population is Profane. The District Composer is the key generator. | Structure | +| D-WR-26 | Generator development pipeline replaces authoring pipeline. 6 phases: Ingredient Authoring → Template Authoring → Generator Development → Validation Development → Generation + Review → Hand-Elevation. | Pipeline | +| D-WR-27 | Authored content at 300-world scale is: FRIEND arcs (30-50), MIRROR profiles (15-25), NOBODY promotion templates (40-60), PC voice cards (8), seed dialogue lines (300-450), derivation rules (~100), benchmark districts (5-8). Total: ~1600-2800 hours of irreducible authoring. | Content Strategy | +| D-WR-28 | Gate topology generation follows Sacred constraints (connected graph, diameter limit, hub placement) with Profane specific connections. Topology shapes gameplay through cultural distance traversal. | World Structure | + +--- + +*The 300-world reframe doesn't invalidate the systems design from Rounds 1-3. It VALIDATES it. The district skeleton, the composition matrix, the Sacred/Profane distinction, the pool architecture, the adversarial pair — all of these were already generator-shaped thinking. We were designing generator specifications all along. We just didn't know that yet.* + +*Now we do. And the multiplication table isn't 540 first-district experiences. It's 300 worlds × 8 archetypes × FRIEND pool depth × seed variation = a number I won't bother computing because the point isn't the number. The point is: every playthrough is a different novel from the same library, and the library grows every time we add a template, an ingredient, or a pool entry.* + +*That's not a content pipeline. That's not even a story machine. That's a story ECOSYSTEM. And the generators are the soil.* + +*— Gestalt* diff --git a/docs/workshops/wiki-review/round4-gore.md b/docs/workshops/wiki-review/round4-gore.md new file mode 100644 index 000000000..911489a28 --- /dev/null +++ b/docs/workshops/wiki-review/round4-gore.md @@ -0,0 +1,507 @@ +# Round 4 — Gore (Responding to Lead's Direction) + +300 worlds. + +I've been thinking about 7 cultural clusters and 20 districts and authoring pipelines. 300 worlds. That changes everything I said and nothing I meant. Let me work through why. + +--- + +## The Fundamental Shift: From Author to Derive + +Everything I proposed through Round 3 was built on the assumption that a human writes the thematic core of each location. The three-question sequence — what is the system, what does participation cost, what does "enough" mean here — was an authoring prompt. A human reads it, thinks, writes an answer. + +At 300 worlds, that sequence becomes a **derivation function**. The generator takes ingredients, combines them, and the thematic question EMERGES from the combination. No human writes "the cost of participation in this district is obedience to potentially unjust authority." The generator takes `settlement_motivation: military_outpost` + `philosophical_alignment: duty_hierarchy` + `economic_function: defense_contract` and the cost of participation IS obedience to potentially unjust authority. It couldn't be anything else. + +This is the reframe the lead is asking for: my thematic framework isn't wrong, it's misplaced. It belongs in the generator's derivation logic, not in authoring guidelines. + +**The question "Is this enough?" isn't a field in a YAML file. It's a function of ingredients.** + +--- + +## 1. Cultural Groups: Ingredients That Generate Philosophy + +The lead is right. My 7 clusters were answers masquerading as a system. "Pragmatic collectivist" is what you GET when you combine certain ingredients — it's not an ingredient itself. + +### The ingredients menu — thematic layer + +The lead identified: heritage roots, settlement motivation, economic function, philosophical alignment, corporate presence, time since settlement / drift stage. And flagged the missing one: economics. + +I want to add one more category the lead didn't name, and redefine one: + +**Added: System failure mode.** What's broken here? Every community in the Settled Reach has adapted to some system that doesn't work as advertised. The failure mode generates the moral texture. This is Miri's insight from Round 3 — "What do systems do to the people inside them?" The answer is: different things, depending on what's broken. + +| Failure Mode | What's Broken | Moral Texture That Emerges | Community Adaptation | +|---|---|---|---| +| Regulation without justice | Rules exist but don't serve people | Complicity — quiet grey economy | Sova | +| Abundance without purpose | Material needs met, existential vacuum | Ennui — voluntary risk-seeking | Core world | +| Scarcity without solidarity | Not enough, and nobody's sharing | Desperation — survival over ethics | Frontier collapse | +| Order without accountability | System works perfectly, crushes people | Rot — institutional evil wearing a smile | Administrative capital | +| Freedom without structure | No rules, no protection | Chaos — the strong exploit the free | Autonomous zone | +| Knowledge without wisdom | Smart people making catastrophic choices | Hubris — brilliance as danger | Research outpost | +| Loyalty without exit | Bonds so strong they become chains | Obligation — debt that never clears | Close-knit colony | +| Prosperity without honesty | Wealth built on something hidden | Silence — comfort maintained by not-looking | Wealthy station | + +**System failure mode is the ingredient that generates the thematic question.** A generator that knows the failure mode can derive: what participation costs, what "enough" means, what kind of FRIEND arc makes sense, what kind of adversarial structure exists. + +**Redefined: "Philosophical alignment" should be "dominant social contract."** The lead's term suggests ideology. What actually matters is the implicit deal: what does the community promise its members, and what does it ask in return? That's the social contract, and it's more concrete than "philosophy." + +| Social Contract | Promise | Price | When It Fails | +|---|---|---|---| +| Collective security | We protect our own | Mind your business, don't break ranks | Sova — protection enables exploitation | +| Meritocratic advancement | Work hard, rise | Compete, accept your position | When the game is rigged | +| Hierarchical order | Clear roles, clear expectations | Obey, don't question | When the orders are wrong | +| Individual liberty | No one tells you what to do | No one helps you either | When you need help | +| Spiritual meaning | Life has purpose beyond material | Believe, contribute, don't doubt | When the meaning is manufactured | +| Institutional trust | The system works | Submit to process | When the institution is the problem | + +### What a society DOESN'T pick + +The lead flagged this and it's the key insight. A frontier settlement that picks `individual_liberty` as its social contract and has NO `corporate_presence` and NO `spiritual_meaning` tells you something by its absences. The emptiness generates its own gameplay: there's no safety net, no deeper purpose, just people and their choices. That emptiness IS the thematic texture. A generator should read absence as signal, not as missing data. + +### Economics as the missing ingredient + +The lead is right: economics was absent. What makes extra income tempting? This is the ingredient that determines why the adversarial structure exists at all. + +| Economic Pressure | Why Grey Economy Exists | What Gets Moved | +|---|---|---| +| Regulatory exclusion | Legal goods priced out of reach | Healthcare, lattice components (Sova) | +| Monopoly extraction | One entity controls access | Competing products, alternatives | +| Embargo/sanctions | External trade restrictions | Cultural goods, political materials | +| Resource bottleneck | Natural scarcity of critical material | Raw materials, fabrication feedstock | +| Labor exploitation | Work doesn't pay enough to live | Supplemental income services, moonlighting | +| Status economy | Social currency requires display | Luxury goods, status markers | +| Knowledge restriction | Information asymmetry maintained by institutions | Data, research, credentials | + +**The economic pressure determines the NATURE of the contested resource.** At 300-world scale, this is crucial — the generator needs to pick an economic pressure that's consistent with the other ingredients, and the contested resource flows from that choice. The moral texture of the smuggling (sympathetic? predatory? ambiguous?) flows from whether you're moving healthcare for people who can't afford it or luxury goods for people who want status. + +### What my 7 clusters become at 300 worlds + +My Round 3 clusters dissolve into ingredient combinations: + +| Old Cluster | Actual Ingredient Combination | +|---|---| +| Pragmatic Collectivist (Krenn) | Nordic-Baltic heritage + economic_settlement + logistics_function + collective_security + no_corp + 180yr_drift + regulatory_exclusion | +| Core Institutional | Cosmopolitan heritage + governance_settlement + administrative_function + institutional_trust + heavy_corp + 250yr_drift + monopoly_extraction | +| Frontier Individualist | Mixed heritage + economic_settlement + extraction_function + individual_liberty + no_corp + 60yr_drift + scarcity | +| Syndic-Corporate | East Asian/Dutch heritage + commercial_settlement + trade_function + meritocratic_advancement + dominant_corp + 150yr_drift + monopoly_extraction | +| Spiritual Communalist | Indian/Indigenous heritage + ideological_settlement + agricultural_function + spiritual_meaning + no_corp + 170yr_drift + labor_exploitation | +| Military/Duty | Roman/Japanese heritage + strategic_settlement + defense_function + hierarchical_order + military_corp + 120yr_drift + embargo | +| Unbound | Cypherpunk heritage + dissent_settlement + none_function + individual_liberty + no_corp + 100yr_drift + knowledge_restriction | + +7 clusters become 7 example combinations from a menu with millions of valid permutations. The generator doesn't pick "pragmatic collectivist" — it picks ingredients, and pragmatic collectivism is what EMERGES when you combine those specific ones. + +### The derivation function + +Here's what the generator needs to produce a society: + +``` +INPUT: Ingredient combination (6-8 categories, each with a selected value or NULL) +OUTPUT: Derived properties: + - social_contract: what the community promises and demands + - system_failure_mode: what's broken + - moral_texture: what participation costs + - thematic_question: "Is this enough?" localized + - adversarial_structure_type: what the hidden network does and why + - cultural_immune_system: what virtues protect the network + - access_tier_profile: how outsiders/insiders are treated + - naming_conventions: derived from heritage + drift + - economic_pressure: why the grey economy exists +``` + +The derivation isn't random. It's DETERMINISTIC given the inputs. Same ingredients always produce the same society. The randomization happens at ingredient SELECTION, not at derivation. + +This means style briefs — Miri's Krenn brief and its equivalents — are REFERENCE IMPLEMENTATIONS. They're what the derivation function produces for a specific ingredient set. You don't need 300 style briefs. You need the derivation function, plus 10-20 reference implementations that demonstrate it works correctly and that writers can use as models for the authored content that sits on top. + +--- + +## 2. Content Patterns: Three Systems, and What THE NOBODY Means + +The lead's three-system separation is architecturally correct. I was conflating thematic function with gameplay function. Let me un-conflate them. + +### A. Thematic patterns: what the character means + +These are the patterns I've been developing. They're about what the character means to the story, to the player's emotional experience, to the question "Is this enough?" + +| Pattern | Thematic Function | What They Mean to the Question | +|---|---|---| +| **FRIEND** | Trust → betrayal → reckoning | "I thought I knew what was enough. This person's secret changed what enough means." | +| **MIRROR** | Honesty in dishonest world | "This person has actually answered the question. Their answer exposes mine." | +| **ANCHOR** | Embodied contentment | "This person says yes, it's enough. And they might be right." | +| **GHOST** | Absent power | "Someone I can't see decided what enough means for everyone here." | +| **CATALYST** | Disruption from outside | "My equilibrium was fine until this arrived." | +| **THRESHOLD** | The thing that makes "enough" inadequate | "I could keep saying yes. But now I've seen THIS." | +| **REMNANT** | The cost of ascending past "enough" | "I went beyond enough. Let me tell you what it cost." | +| **SYSTEM** | The institutional embodiment | "The system itself is an answer to 'Is this enough?' — and it's wrong." | +| **NOBODY** | Background that becomes foreground | "I didn't think this person mattered. I was wrong about what matters." | + +### THE NOBODY deserves its own section + +The lead added THE NOBODY and I want to explain why this is the most important pattern for 300 worlds. + +At 300 worlds, MOST characters are nobodies. The generator produces hundreds of NPCs with routines and schedules and basic personalities. They populate bars and corridors and workplaces. They are social wallpaper. The player walks past them. + +THE NOBODY pattern says: **any of them could matter. The question is whether you pay attention.** + +This is the 300-world version of "Is this enough?" applied to PEOPLE. Is this person enough to matter to you? Is this background character worth your attention? When you walk through a station and see a woman sitting alone at a bar, checking the door every few minutes — is that enough to stop? + +The lead's "dynamic tier promotion" system is the mechanic. But the thematic meaning is deeper: **THE NOBODY is the game asking whether the player has internalized the question.** Early game, you notice the FRIEND, the MIRROR, the characters the game TELLS you to notice. Late game, you start noticing the nobodies. You start seeing the person behind the routine. You start asking "Is this enough?" about characters the game didn't flag. + +That's the endgame of the thematic question. Not "did you solve the mystery" or "did you ascend." **Did you learn to see?** + +#### THE NOBODY at generator scale + +At 300 worlds, THE NOBODY isn't authored. It's EMERGENT. A Tier 3 NPC generated from templates — name, routine, basic personality — becomes a NOBODY when the player invests attention. The promotion mechanic watches for: + +- Player returns to the same location and interacts with the same Tier 3 NPC multiple times +- Player uses observation/perception on a Tier 3 NPC +- Player mentions the NPC in monologue or notes + +When the threshold is crossed, the NOBODY begins promoting. The generator expands their content: deeper personality, relationships, maybe a secret, maybe a connection to the adversarial structure. Not all NOBODYs have secrets. Some are genuinely just people. But the act of paying attention changes what they reveal. + +**The generator needs to be able to GROW content for any NPC on demand.** That's the 300-world requirement. You can't pre-author promotion paths for every Tier 3 NPC. You need a system that takes a sketch NPC and deepens them — adds relationships, adds dialogue, adds texture — when the player signals interest. The ingredients for that deepening come from the same society ingredients that generated them in the first place. + +#### Composition: THE NOBODY + functional motivation + +This is where the three-system architecture becomes powerful. A NOBODY has no thematic pattern yet — they're unassigned. But they DO have a functional motivation from the moment they're generated: + +- NOBODY + CIVILIAN: a person living their life, no connection to anything +- NOBODY + WITNESS: someone who saw something but doesn't know it matters +- NOBODY + OPERATOR: a ring member the player hasn't identified + +When the player pays attention to a NOBODY + WITNESS, the promotion reveals: this person saw something. Now they're THE WITNESS. The thematic pattern emerges from the functional motivation + player attention. + +When the player pays attention to a NOBODY + CIVILIAN, the promotion reveals: this person is just a person. No secret. No connection. Just a life. And that life is interesting enough to explore. + +That second case — the NOBODY who becomes known but has nothing to hide — is THE MIRROR at lower depth. The honest person. The one who makes the dishonest world feel dishonest by contrast. At 300-world scale, the game should produce these organically: players who invest in NOBODYs discover that some of them are mirrors, and that's enough. + +### B. Functional motivations: what the character does + +Nigel's list is gameplay-functional. I'll defer to Gestalt and Nigel on the mechanical details. My contribution: each functional motivation has a thematic resonance that the generator should know about. + +| Functional Motivation | What They Do | Thematic Resonance (what the generator should weight) | +|---|---|---| +| HANDLER | Issues orders from above | Power without accountability — the GHOST's instrument | +| WITNESS | Accidentally observed something | Innocence endangered by knowledge | +| TURNCOAT | Loyalty is shifting | The cost of staying vs the cost of leaving | +| CIVILIAN | Living their life | The baseline. What "enough" looks like without complication. | +| OPERATOR | Running operations | Competence in service of something questionable | +| SKEPTIC | Doubts but hasn't acted | The person who COULD change everything but hasn't paid the price yet | + +### C. Composition rules — the generator's grammar + +The generator picks one thematic pattern + one functional motivation per NPC. Not all combinations are valid. Here are the rules: + +#### Forbidden combinations +| Thematic | Functional | Why Forbidden | +|---|---|---| +| MIRROR | TURNCOAT | A MIRROR is honest. A TURNCOAT is shifting loyalty. Contradiction destroys both patterns. | +| MIRROR | OPERATOR | A MIRROR has no connection to the adversarial structure. An OPERATOR is inside it. | +| ANCHOR | TURNCOAT | An ANCHOR is settled. A TURNCOAT is in motion. | +| GHOST | WITNESS | A GHOST isn't present. A WITNESS must be. | +| GHOST | CIVILIAN | Same reason. GHOST is defined by absence. | + +#### High-value combinations (generators should prefer these) + +| Thematic | Functional | Why Valuable | +|---|---|---| +| FRIEND + OPERATOR | The emotional centerpiece is also inside the operation. Maximum betrayal. Maximum complicity. This is Kael. | +| FRIEND + SKEPTIC | Your trusted person doubts the thing you're part of. Their doubt becomes yours. | +| MIRROR + CIVILIAN | The honest person is just living their life. Their normality is the emotional weapon. This is Hael. | +| ANCHOR + CIVILIAN | The embodiment of "enough" has no connection to the drama. Their contentment is genuine, not maintained by ignorance. | +| CATALYST + HANDLER | The disruption comes from above. The outsider has power. Think: the inspector who arrives and changes everything. | +| THRESHOLD + WITNESS | The moral reckoning is triggered by someone who accidentally saw the thing that makes "enough" impossible. | +| REMNANT + SKEPTIC | Someone who transcended and came back, now doubting. Their doubt carries the weight of experience. | +| NOBODY + CIVILIAN | The most common combination. Background. Wallpaper. Until the player looks. | +| NOBODY + WITNESS | Background character who happens to have seen something. If the player never looks, the information stays hidden. | +| SYSTEM + HANDLER | The institution AND the person enforcing it are one NPC. Bureaucratic evil with a face. | + +#### Composition at 300-world scale + +The generator needs a composition weight table: + +``` +For each NPC in a district: + 1. Roll functional motivation from district's motivation pool + (weighted by adversarial structure type — a smuggling ring + needs more OPERATORs, a political conspiracy needs more + HANDLERs) + 2. IF Tier 1: assign thematic pattern from pattern requirements + (FRIEND and MIRROR are assigned, not rolled) + 3. IF Tier 2: roll thematic pattern from compatible options + (weighted by district needs — does this district have an + ANCHOR yet? a GHOST?) + 4. IF Tier 3: assign NOBODY + (all Tier 3 NPCs start as NOBODY; pattern emerges through + player interaction or storyteller promotion) + 5. Validate combination against forbidden list + 6. Re-roll if forbidden +``` + +**At 300 worlds, Tier 3 is almost everything.** The vast majority of NPCs on any given world are NOBODYs with functional motivations. The generator produces them in bulk. A small number of Tier 1 and Tier 2 NPCs are either authored (for key worlds) or generated from deeper templates (for procedural worlds). The NOBODY-to-something promotion system is what makes 300 worlds feel alive despite the impossibility of authoring 300 x 15+ NPCs at depth. + +--- + +## 3. PC Archetypes: Fluid Positions, Not Character Classes + +The lead's direction is clear: archetypes are positions in a community, not identities. You can move. You can change. The archetype is where you are, not who you are. + +### The 8 as current positions + +Let me reframe my Round 3 archetypes: + +| Archetype | Position in Community | How You Got Here | How You Leave | +|---|---|---|---| +| **Worker** | Employed in the local economy | Born here, or migrated for work | Get fired, get promoted, get disillusioned | +| **Investigator** | Tasked with examining the community | Assigned by institution, or self-appointed | Case closes, cover blown, go native | +| **Operator** | Running something outside official channels | Recruited, or built it yourself | Get caught, get out, go legitimate | +| **Newcomer** | Just arrived, no position yet | Arrived. That's it. | Get a job, make connections, become something else | +| **Wanderer** | Passing through | Chose not to settle, or haven't found a place | Find a reason to stay. Or don't. | +| **Builder** | Creating or maintaining something lasting | Decided this place was worth investing in | Finished, failed, or realized it wasn't worth it | +| **Guardian** | Protecting the community | Chose duty, or duty chose you | Threat resolved, betrayed by the thing you protect | +| **Seeker** | Pursuing something beyond the material | Curiosity, desperation, or calling | Found it, gave up, or discovered the cost | + +### Transition mechanics: what the generator needs + +The generator doesn't need to know every possible transition. It needs to know the **transition triggers** — the conditions under which a player's archetype shifts. + +| Trigger Type | What Happens | Example | +|---|---|---| +| **Economic** | Player's relationship to the local economy changes | Worker who loses their job becomes Newcomer in the next district. Operator who goes legitimate becomes Worker. | +| **Social** | Player's relationship web fundamentally changes | Investigator who falls in love with a local becomes Guardian. Newcomer who builds a network becomes Worker or Operator. | +| **Moral** | Player's stance toward the system changes | Worker who discovers the full scope of exploitation becomes Seeker (wants to transcend) or Guardian (wants to fight). | +| **Geographic** | Player moves to a new district | Any archetype becomes Newcomer on arrival (or Wanderer if they don't commit). | +| **Ascending** | Player pursues lattice enhancement / Higher capability | Any archetype trends toward Seeker. The pursuit of more changes what you are in a community. | +| **Traumatic** | Something breaks the player's current position | Guardian whose charge dies. Builder whose project is destroyed. Operator who gets betrayed. Trauma is the universal transition trigger. | + +### What "fluid" means for generators + +At 300 worlds, the generator needs to know: + +1. **Starting archetype** — determined by game setup (v0.1: Worker or Investigator; v0.2+: also Newcomer; full scale: all 8 available) +2. **Current archetype** — tracked by behavioral analysis. The game watches what you DO and adjusts: + - Spending most time working a job → Worker + - Spending most time investigating → Investigator + - Spending most time building relationships → Builder or Guardian + - Spending most time moving between districts → Wanderer + - Spending most time pursuing ascension → Seeker +3. **Archetype-appropriate content selection** — monologue voice, dialogue options, NPC reactions all shift with current archetype +4. **Transition moments** — when the behavioral analysis detects a shift, the monologue voice acknowledges it. Not heavy-handed. Subtle. "I keep thinking about what Sera said. Maybe the truth matters more than I thought." (Worker → Investigator drift) + +### The Newcomer as v0.2 centerpiece + +The lead called this. The Newcomer is the natural tutorial because they know nothing. But thematically, the Newcomer is something more: **the Newcomer is the player's proxy in a way no other archetype is.** + +Every other archetype has a pre-existing relationship to the community. The Worker belongs. The Investigator has a mandate. The Operator has an operation. The Newcomer has NOTHING. They are the player — walking into a place they don't understand, meeting people they don't know, trying to figure out what's going on. + +The Newcomer's "Is this enough?" is the most raw version: **"Is this place enough? Are these people enough? Is THIS LIFE enough?"** They haven't committed yet. They're evaluating. Every interaction is a question: do I want to be part of this? + +And then: the Newcomer discovers the adversarial structure. The ring, the conspiracy, the operation. And their "Is this enough?" transforms from "Is this place worth staying in?" to "Is this place worth staying in NOW THAT I KNOW THIS?" + +That transformation — from innocent evaluation to compromised knowledge — is the game's thematic question compressed into a single character arc. The Newcomer doesn't start complicit. They BECOME complicit. The player watches it happen in real time. + +### 8 archetypes as stress test + +The lead wants 8 to stress-test system flexibility. Here's the test: can the generator produce appropriate content for all 8 archetypes in any ingredient-combination society? + +| Archetype | What the Generator Must Produce | Difficulty | +|---|---|---| +| Worker | Starting job, workplace relationships, economic pressures | Low — every society has workers | +| Investigator | Institutional mandate or personal motivation, outsider access profile | Medium — not every society has an institution to investigate FOR | +| Operator | Existing operation, risk profile, network connections | Medium — operation type varies with adversarial structure | +| Newcomer | Nothing. Literally nothing. The content is discovered. | Low — absence is easy to generate | +| Wanderer | Transit context, temporary relationships, departure triggers | Medium — must feel like passing through, not living here | +| Builder | Project, resources needed, community relationship to the project | High — requires something specific to build, community to build it for | +| Guardian | Thing to protect, threats to it, community relationship to the threat | High — "what to protect" is deeply district-specific | +| Seeker | Aspiration, path, cost, community's relationship to aspiration | High — ascension content must exist at this location | + +Builder, Guardian, and Seeker are the hardest because they require the generator to produce something district-specific: a project, a threat, an aspiration path. At 300 worlds, these three archetypes may not be available everywhere. And that's fine — the lead said archetypes are fluid. A world without a Guardian opportunity pushes Guardian-inclined players toward Worker or Wanderer. The absence creates pressure toward transition. + +--- + +## 4. Randomization: Sacred/Profane/Middle Kingdom + Gate Topology + +Nigel's framework is approved. Let me map my thematic systems into it. + +### The thematic Sacred + +These are the rules of the universe. They never change. No seed, no playthrough, no mod changes them: + +| Sacred Element | Why It's Sacred | +|---|---| +| The question "Is this enough?" | The game's thesis. Without it, we're making SimStation. | +| Participation has a cost | The structural claim. Every community, every system, every relationship. | +| Every virtue has a shadow | The cultural immune system principle. Without it, communities are either good or bad, never complex. | +| Ascension costs something human | Without this, ascension is just a power curve. | +| Knowledge changes you | The information-as-burden claim. Without it, information is just a resource to collect. | +| Some people are honest | THE MIRROR principle. Without at least one honest person, the world is all liars and the question collapses. | + +### The thematic Profane + +These vary per seed, per world, per playthrough. The generator picks from pools: + +| Profane Element | What Varies | Pool Source | +|---|---|---| +| WHY the adversarial structure exists | Moral texture of the conspiracy | Economic pressure ingredient × system failure mode | +| WHAT "enough" means locally | Local definition of a good life | Social contract ingredient × economic function | +| WHO your FRIEND is | Which NPC carries the emotional weight | FRIEND candidate pool (Tier 1 authored per key world, Tier 1 generated from deep templates per procedural world) | +| WHAT the cultural virtue-as-vulnerability is | Which good quality enables exploitation | Derived from social contract + settlement motivation | +| WHICH historical grievance matters | What the community remembers and fights about | Historical event pool per region | + +### The thematic Middle Kingdom + +Fixed structure, variable cast. The dramatic architecture is Sacred. Who fills it is Profane: + +| Structure (Sacred) | Cast (Profane) | +|---|---| +| There is a FRIEND whose secret you discover | WHO is the FRIEND, WHAT is the secret | +| There is a MIRROR whose honesty exposes | WHO is the MIRROR, WHAT they expose | +| There is an adversarial structure with insiders and outsiders | WHO is inside, WHO investigates, WHAT is contested | +| There are triangles that force decisions | WHICH NPCs, WHICH tensions, WHICH forks | +| The community has an immune system | WHICH virtue, WHICH vulnerability, WHICH cultural norm | +| The player faces a moral reckoning | WHAT kind of reckoning, WHEN it arrives, HOW it manifests | + +### Gate topology as thematic architecture + +The lead raised gate topology as a macro randomization layer. Let me add the thematic dimension: + +**The order in which you encounter worlds IS the thematic sequence.** A player whose gate topology sends them from a complicity world to a duty world to a silence world has a fundamentally different philosophical arc than a player who goes complicity → sacrifice → ennui. + +This is randomization at the level of PHILOSOPHICAL CURRICULUM. The game doesn't prescribe which questions you face or in what order. But the order matters. A player who encounters sacrifice early and ennui late reads ennui through the lens of sacrifice: "These people have everything and it's not enough? I just came from a place where people DIED for each other." A player who encounters ennui first and sacrifice late reads sacrifice as a relief: "Finally, something that matters." + +**Gate topology should be weighted, not fully random.** The generator should avoid placing two worlds with the same moral texture adjacent in the player's likely path. Variety of moral texture across the accessible gate network is a quality metric for seed generation. The player should encounter DIFFERENT questions, not the same question wearing different hats. + +This is where the gravity-as-worldfeel note connects: the lead suggested varying gravity to breathe life into stepping onto a new world. Extend that to ALL sensory/social signals. When you step through a gate, EVERYTHING should signal "this is different." The gravity, the air, the social norms, the way people greet you, the architecture, the economic texture. The generator that produces 300 worlds needs to maximize PERCEPTUAL CONTRAST between gate-adjacent worlds. + +--- + +## 5. Scale: What Changes at 300 Worlds + +### What I was wrong about + +My Round 3 proposed: +- 7 cultural clusters with 20+ regional variants → Wrong unit. Ingredient combinations, not clusters. +- "Miri writes one cluster-level brief" → Not scalable to 300. Miri writes 10-20 reference implementations. The generator handles the rest. +- 107 pages of cultural worldbuilding → 10-20 reference briefs + derivation function. Maybe 50 pages plus the code. +- Every district brief answers three questions → The three questions become the generator's derivation logic. Only hand-authored worlds get hand-written answers. + +### What I was right about + +- "Is this enough?" as the generative question → Still holds. The generator derives it per world. It's the output, not the input. +- Every virtue has a shadow → This is a DERIVATION RULE the generator uses. Given a social contract's virtue, derive its shadow. Collective security → exploitation of solidarity. Individual liberty → isolation. Hierarchical order → blind obedience. This is deterministic. +- Ascension as philosophical commitment → This doesn't change at 300 worlds. Ascension is a PLAYER arc, not a world feature. The worlds provide context for the player's ascension choices, but ascension paths are Sacred. +- Moral texture as the deepest randomization lever → Confirmed by the lead's approval of Sacred/Profane. The WHY is Profane. The THAT is Sacred. + +### What changes fundamentally + +**1. The FRIEND problem at 300 worlds.** + +I said "full Tier 1, no exceptions, no shortcuts." I still believe the principle. But 300 worlds with 1-4 FRIEND candidates each at 70-100 authored lines is 21,000-120,000 lines of hand-authored Tier 1 content. That's not a content pipeline. That's a content mountain range. + +The answer isn't to lower the standard. It's to recognize that most of the 300 worlds don't need bespoke FRIEND content. They need FRIEND content ASSEMBLED from deep templates. + +Proposal: **Three tiers of world authoring.** + +| World Tier | Count | FRIEND Content | Other Tier 1 | How Built | +|---|---|---|---|---| +| **Landmark worlds** | 10-15 | Fully hand-authored, unique arcs, bespoke tells | Hand-authored MIRROR, ANCHOR | Studio team | +| **Regional worlds** | 30-50 | Assembled from deep cultural-template FRIEND kits (authored modules recombined per ingredients) | Template-assembled | Studio + community | +| **Generated worlds** | 230-260 | Generated from FRIEND generation grammar (structure is Sacred, details are Profane, voice derived from cultural ingredients) | Generated from pattern templates | Generator | + +The FRIEND generation grammar is the key innovation at 300-world scale. It's not "randomly generate a FRIEND." It's: given this society's ingredients, derive what a FRIEND would be hiding, why, what their tell would look like in this cultural context, and what their contradiction arc's phases would be. The STRUCTURE (5-phase arc, warmth → doubt → confrontation) is Sacred. The CONTENT (what specifically happens in each phase) is derived from ingredients. + +This is where the system failure mode ingredient pays off. A FRIEND in a `regulation_without_justice` world is hiding participation in a grey economy. A FRIEND in an `order_without_accountability` world is hiding knowledge of institutional abuse. The generator derives the secret from the failure mode. The tell is derived from the cultural norms (in a privacy-default culture, the tell is physical; in a gossip-default culture, the tell is verbal inconsistency). The emotional arc is derived from the relationship between the FRIEND and the player's archetype. + +Will generated FRIENDs be as devastating as hand-authored Kael? No. Not at first. But at 300 worlds, the player encounters dozens of FRIENDs, and the cumulative effect — betrayal after betrayal, each in a different moral key — creates its own kind of devastation that hand-authored content can't achieve. The quantity becomes its own quality. + +**2. The authoring pipeline becomes a generation pipeline.** + +Round 3: "Start every content piece by answering 'What does enough mean here, and what does participation cost?'" + +Round 4: "The generator starts every world by DERIVING what enough means here and what participation cost, from the ingredient combination. Then it generates content to express that derivation." + +The pipeline: +``` +1. SEED: Random seed determines ingredient selection for 300 worlds +2. DERIVE: Generator applies derivation function to each + ingredient set → society profile +3. POPULATE: Generator creates NPCs from society profile + + pattern composition rules + functional motivation pools +4. OVERLAY: Hand-authored content for landmark worlds replaces + generated content +5. GROW: During play, NOBODY promotion system deepens NPCs + that players engage with +6. ACCUMULATE: Player's cross-world experience generates + monologue callbacks ("I've seen this before...") +``` + +Steps 1-3 happen at game creation. Step 4 is the content-authoring team's contribution. Step 5 happens during play. Step 6 is the long-game content that makes 300 worlds feel like an interconnected experience rather than 300 separate ones. + +**3. Cross-world thematic accumulation.** + +This is the thing that matters most at 300 worlds and didn't exist at 20 districts. + +A player who has visited 50 worlds has encountered 50 versions of "Is this enough?" They've seen complicity, duty, sacrifice, ennui, silence, obligation, chaos, hubris. They've been betrayed by 50 FRIENDs. They've seen 50 communities whose virtues enabled exploitation. + +At some point, the question transforms. It stops being about THIS community and starts being about ALL communities. "Is this enough?" becomes "Is ANY of this enough?" — is the Settled Reach itself, as a civilization, enough? Are humans, as a species, enough? + +That's the endgame question. Not for a single world. For the whole game. And it connects to ascension: the player who asks "Is ANY of this enough?" and answers "No" is the player who pursues Higher, or ANA, or something beyond. The player who answers "Yes, this is enough" is the player who settles, builds, guards, stays. + +**The 300-world scale is what makes the question existential rather than local.** One world asks a specific question about a specific community. 300 worlds asks a civilizational question about humanity. That's the endgame I've been trying to articulate since Round 1. + +--- + +## 6. Universal Theme: Don't Pick. Derive. + +The lead listed 6 candidates and said don't force it. I won't. But I'll say this: + +All six are the same thing from different angles. + +| Candidate | Whose Perspective | What It Emphasizes | +|---|---|---| +| Cost of participation (Gore) | The individual inside the system | What you pay | +| Collective bargain (Mellanie) | The community | What everyone agreed to | +| What do you owe the people around you? (Ozzie) | The relationships | What connection demands | +| What do systems do to people? (Miri) | The system itself | What structures create | +| Cost of connection / entanglement (Paula) | The relational web | What attachment costs | +| Knowledge as burden (Gestalt) | The information | What knowing does to you | + +They converge on: **existence inside a system is not free, and you can't opt out.** + +The reason we can't pick one is that the GAME doesn't pick one. Different archetype, different world, different ingredient combination, different angle on the same truth. The Investigator experiences "knowledge as burden." The Worker experiences "cost of participation." The Newcomer experiences "what do systems do to people?" The Guardian experiences "what do you owe?" + +At 300-world scale, the universal theme isn't a statement. It's a FIELD — a gravitational field that all the specific questions orbit. The generator doesn't need a single canonical phrasing. It needs the field. It needs to ensure that every world it generates, regardless of ingredients, produces a society where existence isn't free. + +The derivation function guarantees this: every ingredient combination includes a system failure mode. Every system failure mode produces a cost of participation. Every cost of participation generates a version of "Is this enough?" The field is built into the generator's architecture. + +If pressed, I'd say: **the theme is the field, not any specific phrasing of it. The field is: what does it cost to be human inside something bigger than yourself?** + +But the lead is right not to canonize this. Let it resolve through the work. + +--- + +## Summary: What Changed, What Held, What Emerged + +### Changed at 300-world scale +- 7 cultural clusters → ingredient combination menu with derivation function +- Hand-authored thematic questions per district → derived from ingredients +- Style briefs as authoring guidance → reference implementations of the derivation function +- FRIEND content always hand-authored → three-tier world system (landmark / regional / generated) +- Fixed authoring pipeline → generation pipeline with hand-authored overlay + +### Held at 300-world scale +- "Is this enough?" as the generative question +- Every virtue has a shadow (now a derivation RULE) +- Thematic patterns as a vocabulary (FRIEND, MIRROR, ANCHOR, etc.) +- Ascension as philosophical commitment +- Moral texture as the deepest randomization lever +- Sacred/Profane/Middle Kingdom maps cleanly to thematic architecture + +### Emerged at 300-world scale +- **THE NOBODY** as the most important pattern (most NPCs are nobodies; promotion is the mechanic; learning to see is the endgame) +- **System failure mode** as a generator ingredient (the thematic engine) +- **Three-tier world authoring** (landmark / regional / generated) +- **Gate topology as philosophical curriculum** (the order of moral textures matters) +- **Cross-world thematic accumulation** (the question becomes civilizational after enough worlds) +- **The theme as field, not statement** (all 6 candidates orbit the same truth) +- **FRIEND generation grammar** (Sacred structure + Profane content derived from ingredients) +- **Composition rules** as generator grammar (thematic pattern + functional motivation, with forbidden/preferred combinations) diff --git a/docs/workshops/wiki-review/round4-mellanie.md b/docs/workshops/wiki-review/round4-mellanie.md new file mode 100644 index 000000000..e11a6be5c --- /dev/null +++ b/docs/workshops/wiki-review/round4-mellanie.md @@ -0,0 +1,358 @@ +# Round 4 Response: Mellanie — 300-World Generator-Input Scale + +*Responding to the project lead's decisions. Reframing everything I proposed in Rounds 1-3 for a 300-world procedurally generated game where style briefs ARE generator inputs.* + +--- + +## The Reframe That Changes Everything + +My Round 3 math assumed 20 districts. The lead said 300 worlds. + +That's not a scaling problem. That's a category change. At 20 districts, I'm a writer who uses tools. At 300 worlds, I'm a writer who writes tools. Every convention, every voice card, every authoring rule I proposed is no longer a guideline for humans — it's a specification for generators. The question isn't "how do I write 300 worlds of content?" The question is "how do I write the rules that PRODUCE 300 worlds of content?" + +Everything below is reframed through that lens. + +--- + +## 1. Cultural Ingredients Menu — The Writer's Input Spec + +The lead's decision: cultural groups aren't monolithic identities. They're composable ingredients — phonological fragments, speech rhythm parameters, substrate word pools, register rules, food vocabularies — that generators combine to produce specific-world cultural profiles. + +This is right. And it changes my job description. + +### What I used to do (20-district model) + +Read Miri's Krenn brief. Hold the whole register in my head. Write all Krenn content in one voice. Switch to the next brief. Repeat. + +### What I do now (300-world model) + +Define the PARAMETERS that make a voice sound right. Not "write Krenn dialogue" but "define what makes dialogue sound working-class-logistics-heritage-Nordic-Baltic." + +### The ingredient categories I need to parameterize + +| Category | What the generator needs from me | Example (Krenn ingredients) | +|----------|----------------------------------|----------------------------| +| **Sentence rhythm** | Fragment frequency, max comfortable sentence length, clause-chaining habits | 70% fragments, max 8 words comfortable, no subordinate clauses | +| **Formality gradient** | How register shifts with access tier | public: clipped neutral / peer: fragments + substrate / insider: full substrate + first names / authority: formal + hostile | +| **Substrate density** | How many heritage words per N words of dialogue at each access tier | public: 0 per 20 / peer: 1 per 15 / insider: 1 per 8 | +| **Profanity pattern** | Stress word shape, frequency, escalation | Short percussive heritage word (perk), low frequency, escalation = repetition not vocabulary expansion | +| **Naming address rules** | When first name, when surname, when title, when none | First name = accepted, surname = formal/hostile, title = institutional outsider | +| **Silence rules** | What topics are avoided, at which access tiers, how avoidance manifests | Avoids: ring operations, personal finances, institutional critique / Manifests as: subject change, sudden brevity, eye-contact break | +| **Emotional expression style** | How characters show worry, affection, anger, guilt | Worry: terse practicality / Affection: acts not words / Anger: cold withdrawal / Guilt: overcompensation in unrelated areas | +| **Environmental text register** | Sign style, formality of posted notices, graffiti density and type | Signs: minimal, functional, no decoration / Notices: bureaucratic, ignored / Graffiti: sparse, operational, some heritage | + +That's 8 parameter categories per cultural ingredient set. At Miri's cluster level (6-8 heritage clusters), that's 48-64 parameter definitions. But the generators BLEND these. A world with 60% Nordic-Baltic + 30% Slavic-Central + 10% cosmopolitan drift would interpolate across all 8 categories. + +### What I author vs. what the generator produces + +**I author:** The parameter definitions. The ingredient specs. The blending rules ("when Nordic-Baltic substrate meets Slavic-Central substrate, the result favors shorter words from both pools, not longer hybrid forms"). The exception flags ("never blend profanity across heritage pools — characters swear in their dominant substrate, not a hybrid"). + +**The generator produces:** Per-world cultural profiles. Specific NPC dialogue that follows the blended parameters. Environmental text that matches the local register. News ticker content in the appropriate editorial voice. + +**I review:** Samples from every generated world. Not every line — that's impossible at 300 worlds. Samples. The review question is: "Does this world sound like a PLACE? Does it sound like itself and not like a different world?" If yes, the parameters are working. If no, I adjust the ingredient specs. + +### The fundamental shift + +At 20 districts, quality control was per-line. At 300 worlds, quality control is per-parameter. I don't fix a bad line — I fix the parameter that produced bad lines across dozens of worlds. + +This is harder. It requires thinking about voice as a SYSTEM, not a craft. But it's the only way 300 worlds ship with consistent voice quality. + +--- + +## 2. NPC Pattern + Functional Motivation Composition — Voice Seeds for Generators + +The lead separated NPC design into three systems: +1. **Thematic patterns** (FRIEND, MIRROR, ANCHOR, GHOST, CATALYST, THRESHOLD, REMNANT, SYSTEM, NOBODY) +2. **Functional motivations** (HANDLER, WITNESS, TURNCOAT, CIVILIAN, OPERATOR, SKEPTIC) +3. **Composition rules** (how patterns + motivations combine to produce specific NPCs) + +From the voice perspective, this decomposition is exactly right. Here's why. + +### Thematic patterns define WHAT the character feels + +THE FRIEND feels warmth, then guilt, then fear of exposure, then grief at betrayal. That's an emotional arc. I can write voice seeds for each phase of that arc: + +```yaml +friend_voice_seeds: + warmth_phase: + - "There you are. Good — I was starting to worry." + - "Saved you a seat. Lera's supp is actually decent today." + doubt_phase: + - "You've been asking a lot of questions lately." + - "Just — be careful who you talk to. People notice things." + exposure_fear: + - "I can explain. Just not here. Not now." + - "You don't understand what's at stake." + betrayal_grief: + - "I wanted to tell you. Every day, I wanted to tell you." +``` + +These seeds are pattern-level, not character-level. They work for ANY NPC assigned the FRIEND pattern. The generator takes the seed, applies the world's cultural parameters (sentence rhythm, substrate density, formality gradient), and produces character-specific lines. + +### Functional motivations define HOW the character acts + +A HANDLER applies pressure. A WITNESS stumbles into danger. A TURNCOAT's loyalty cracks. These are behavioral templates. I can write voice seeds for each behavior: + +```yaml +handler_voice_seeds: + pressure_apply: + - "The schedule moved up. I need you at the dock by twenty-two hundred." + - "I don't care about your problems. I care about the shipment." + loyalty_test: + - "Someone's been talking. I need to know it wasn't you." +``` + +### Composition creates SPECIFIC characters + +A FRIEND + HANDLER is someone you trust who also applies pressure. That combination produces a specific emotional texture: warmth corrupted by operational necessity. The voice seeds BLEND: + +``` +FRIEND warmth: "Saved you a seat." +HANDLER pressure: "The schedule moved up." +FRIEND+HANDLER composite: "Saved you a seat. Listen — the schedule moved up. I need you tonight." +``` + +The composite is warmer than a pure HANDLER and more operational than a pure FRIEND. The generator needs blending rules for every valid pattern+motivation combination. + +### What I need to author for 300-world scale + +| Content type | Quantity | Purpose | +|-------------|----------|---------| +| Voice seeds per thematic pattern | 4-8 per pattern phase × 9 patterns = ~120-250 seed lines | Emotional arc templates | +| Voice seeds per functional motivation | 3-5 per behavior type × 6 motivations = ~50-100 seed lines | Behavioral templates | +| Blending rules per valid combination | 1 page per combination × ~20-30 valid combos = ~25 pages | How patterns + motivations interact vocally | +| Cultural parameter transforms | How each of the 8 voice parameters modifies seed lines | Makes seeds culture-specific | + +Total authored voice seeds: **170-350 lines.** These 350 lines, combined with 8 cultural parameter categories across 6-8 heritage clusters and the blending rules, produce the voice content for every generated NPC across 300 worlds. + +That's not 13,500-31,200 authored lines (my Round 3 estimate for 20 districts). That's ~350 authored seed lines + ~25 pages of blending rules + ~65 pages of parameter definitions. The generator does the rest. + +### The Sacred layer at this scale + +But. THE FRIEND arc is Sacred. The lead confirmed this through the Sacred/Profane/Middle Kingdom framework. That means: + +**Tier 1 FRIEND content is still hand-authored.** Not generated from seeds. Not parameter-blended. Written by a human who understands this specific character's emotional state at this specific moment in their arc. + +At 300 worlds, that means: how many Tier 1 FRIENDs exist? If each world has 1-2 FRIEND candidates per PC archetype, and there are 8 archetypes, that's potentially 2,400-4,800 FRIEND candidates. Obviously these aren't all unique — they're drawn from a pool. + +**My proposal: 30-50 fully authored FRIEND arcs.** Each is a complete 5-phase contradiction arc with full voice authoring at every phase. The generator assigns these arcs to specific NPCs in specific worlds, applies cultural parameter transforms to the surface language, but preserves the authored emotional core unchanged. + +30-50 arcs × 70-100 lines each = **2,100-5,000 hand-authored Tier 1 lines.** That's the Sacred content. Everything else is generator output from seeds + parameters. + +--- + +## 3. Eight PC Archetypes with Fluid Transitions — Voice Implications + +The lead's decision: 8 archetypes at v1.0, with transitions between archetypes as a mechanic. Your archetype isn't a fixed class — it's your current position in the community, and it can change. + +### The voice problem this creates + +In my Round 2 voice card, I defined the smuggler and detective as having DISTINCT, SEPARATE internal monologue voices. The smuggler thinks in people. The detective thinks in data. These voices don't overlap. D-032 hard-partitions monologue pools per character. + +Fluid transitions break that model. If the smuggler-archetype player makes choices that shift them toward the detective-archetype, the monologue voice needs to shift too. Not a sudden switch — a gradient. The voice should feel like it's CHANGING, which means the player notices the change, which means the change carries emotional weight. + +### How to handle it + +**Each archetype has a voice profile defined along continuous axes, not discrete categories.** + +| Axis | Smuggler position | Detective position | Gradient | +|------|------------------|-------------------|----------| +| **Observation focus** | People first, environment second | Environment first, people second | What the monologue notices changes | +| **Naming convention** | First names, personal history | Surnames, role descriptors | How NPCs are referenced shifts | +| **Sentence structure** | Fragments, rhythmic, breath-length | Complete, clipped, controlled | Syntax formality increases | +| **Emotional register** | Protective, fond, guilty | Analytical, suspicious, conflicted | Emotional vocabulary shifts | +| **Cultural markers** | Full substrate vocabulary | Institutional vocabulary | Heritage word frequency drops | +| **Default interpretation** | Intent-reading ("Lera steered Renn off that story") | Pattern-reading ("The bartender interrupted that conversation") | Interpretive frame shifts | + +A player 70% smuggler / 30% detective hears monologue that's mostly relational but occasionally analytical. They still use first names but sometimes catch themselves categorizing. Their fragments get slightly longer. Their cultural markers thin slightly. + +### What I author for this + +**Transition monologue lines.** Lines that ONLY fire during archetype drift. These are the moments the player feels the change happening: + +```yaml +# Smuggler drifting toward Detective +- id: transition_sm_dt_001 + text: "I'm counting heads again. When did I start counting heads?" + archetype_blend: {smuggler: 0.6, detective: 0.4} + trigger: enter_location + situation: [arrival] + +# Smuggler drifting toward Detective +- id: transition_sm_dt_002 + text: "Torek's buying rounds. New jacket. I used to just be happy for him." + archetype_blend: {smuggler: 0.5, detective: 0.5} + trigger: observe_npc + topic: [money] + +# Point of no return — archetype has shifted +- id: transition_sm_dt_010 + text: "I filed it. I actually filed it. When did I become someone who files things?" + archetype_blend: {smuggler: 0.3, detective: 0.7} + trigger: discovery + situation: [investigation] +``` + +These transition lines are the most IMPORTANT monologue in the game from a writing perspective. They're the moments where the player feels their character becoming someone else. They need to be Sacred content — hand-authored, not generated. + +### The math for 8 archetypes with transitions + +8 archetypes = 28 possible pairwise transitions. Not all are valid — some archetype combinations don't make narrative sense. Estimate ~15-20 valid transition paths. + +Each transition path needs ~10-15 authored transition monologue lines (covering the gradient from 70/30 through 50/50 through 30/70). + +**15-20 paths × 10-15 lines = 150-300 transition monologue lines.** All Sacred. All hand-authored. These are the lines that make archetype fluidity feel like character development rather than a stat change. + +--- + +## 4. Sacred / Profane / Middle Kingdom — Content Mapping + +The lead adopted Nigel's framework. Let me map every content type I'm responsible for. + +### Sacred (hand-authored, never generated, never randomized within a world) + +| Content | Why Sacred | Volume estimate | +|---------|-----------|----------------| +| FRIEND arc dialogue (all 5 phases) | Emotional payload. Can't template feeling. | 30-50 arcs × 70-100 lines = 2,100-5,000 lines | +| Anchor lines (the gut-check moments) | Ozzie's rule. If it doesn't make you feel something, it's not an anchor. | 1-2 per Tier 1/2 NPC pattern template = ~100-200 lines | +| Archetype transition monologue | The moments where the player's identity shifts. Must feel earned. | 15-20 paths × 10-15 lines = 150-300 lines | +| Blending rules (the composition specs) | Wrong blends produce voice uncanny valley. Human judgment required. | ~25 pages of prose specification | +| Cultural parameter definitions | The ingredient specs. Wrong parameters cascade across 300 worlds. | ~65 pages of specification | + +**Total Sacred authored content: ~2,350-5,500 lines + ~90 pages of specs.** + +### Profane (authored as pools, selected per-seed by generators) + +| Content | Why Profane | Pool size estimate | +|---------|-----------|-------------------| +| Voice seeds per pattern phase | Same emotional arc, different surface expression per world | ~120-250 seed lines across all patterns | +| Voice seeds per motivation | Same behavior, different cultural register | ~50-100 seed lines across all motivations | +| News ticker headline pools | Atmosphere. Profane by nature — the news is different every day. | ~200-400 headlines across all regions and topic categories | +| Environmental text template pools | Signs, menus, graffiti. Drawn from pools, culturally filtered. | ~300-500 template items across all types | +| Ambient monologue pools | Low-stakes observations. "The ventilation sounds different today." | ~200-400 lines across all archetype voices | + +**Total Profane authored pool content: ~870-1,650 lines.** + +### Middle Kingdom (sacred structure, profane cast) + +This is the most interesting category. Middle Kingdom content has a fixed DRAMATIC STRUCTURE but variable CHARACTERS filling the roles. + +| Content | Sacred part | Profane part | +|---------|-----------|-------------| +| Triangle dialogue | The fork structure (three people, conflicting interests, decision point) | Which NPCs fill the roles, their names, their cultural register | +| Dual-lens observation lines | The observation STRUCTURE (same event, two interpretations) | Which archetype pair is active, which cultural parameters apply | +| Bar conversation templates | The conversation SHAPE (greeting → small talk → topic → disclosure gate) | Which NPCs, which topics, which access tier, which substrate vocabulary | +| Routine deviation monologue | The PATTERN ("X isn't where they usually are") | Which NPC deviated, the cultural register of the observation | + +For Middle Kingdom content, I author the TEMPLATES — the dramatic shapes — and the generators fill them with world-specific content. + +**Middle Kingdom templates: ~100-200 structural templates** across all dialogue and monologue types. Each template is a dramatic shape with variable slots. The generator fills the slots using the cultural parameters + the specific NPC assignments for that world. + +### The total picture + +| Category | Authored lines | Authored specs | Purpose | +|----------|---------------|---------------|---------| +| Sacred | 2,350-5,500 | 90 pages | Emotional core, identity transitions, system rules | +| Profane pools | 870-1,650 | — | Generator seed content, atmosphere | +| Middle Kingdom templates | 100-200 templates | — | Dramatic structures for generator instantiation | +| **Total** | **~3,320-7,350 lines** | **~90 pages** | Everything the generator needs to produce 300 worlds | + +Compare to my Round 3 estimate: 13,500-31,200 authored lines for 20 districts. The 300-world model requires LESS hand-authored content because the generator does the multiplication. But the content I DO author is higher-stakes — every seed line, every parameter definition, every blending rule cascades across hundreds of worlds. A bad parameter produces 300 worlds of bad voice. The error cost is enormous. + +--- + +## 5. 300 Worlds — What Changes Fundamentally + +### What my Round 3 proposals got right + +**Voice cards.** The smuggler/detective voice card table from Round 2 IS a parameter spec for the generator. "Thinks in people vs. thinks in data" maps directly to the observation-focus axis. "First names vs. role descriptors" maps to the naming-convention axis. The voice card concept survives at 300-world scale — it just becomes a YAML spec instead of a prose document. + +**Dual-lens writing.** Still the game's identity. Still universal. At 300-world scale, the dual-lens becomes a CONSTRAINT in the generator: for every observation monologue, the generator must produce archetype-specific variants. The constraint is encoded in templates, not enforced by a human reviewer on every line. + +**Anchor lines.** Still Sacred. Still hand-authored. Still the gut-check test. At 300-world scale, anchor lines live in the FRIEND arc templates (30-50 arcs), not in per-NPC profiles. Each FRIEND arc template includes its anchor lines. The generator assigns arcs to NPCs but doesn't modify the anchors. + +**Environmental text as worldbuilding.** Still true. But at 300 worlds, I'm not writing 65-90 items per district. I'm writing environmental text TEMPLATE POOLS (signs, menus, graffiti, notices, tickers) and cultural parameter transforms that make the templates world-specific. The template says "BAR MENU." The parameters say "Krenn-derived: sparse, no descriptions, heritage food names, small denominations." The generator produces a specific menu for a specific bar on a specific world. + +### What my Round 3 proposals got wrong + +**The authoring pipeline.** My 7-phase pipeline assumed human writers doing per-district content passes. At 300 worlds, the pipeline is: (1) define ingredients, (2) define blending rules, (3) author Sacred content, (4) author Profane pool content, (5) author Middle Kingdom templates, (6) validate generator output through sampling, (7) iterate on parameters based on sample review. Phases 1-5 happen ONCE. Phase 6-7 repeat for every batch of generated worlds. + +**The team structure.** I proposed writers per cultural group or writers per archetype. At 300-world scale, the team structure is: (1) ingredient spec writers (define cultural parameters), (2) Sacred content writers (FRIEND arcs, anchor lines, transition monologue), (3) template writers (Middle Kingdom dramatic structures), (4) generator tuners (review samples, adjust parameters). These are different SKILLS, not just different domain knowledge. + +**Content volume estimates.** 13,500-31,200 authored lines for 20 districts is obsolete. The 300-world model needs ~3,300-7,400 authored lines + 90 pages of specs. Less raw volume, higher per-line stakes. + +**Cultural register limits.** I said "4-6 cultural registers in active production." At 300-world scale with composable ingredients, the concept of "a cultural register" dissolves. There are 6-8 ingredient sets that blend in hundreds of combinations. I don't hold "a register" in my head — I hold parameter definitions and validate generator output. The limit isn't my working memory. It's the parameter space's expressiveness. + +### What's new at this scale + +**Parameter testing.** Before I finalize an ingredient spec, I need to generate 50-100 sample lines and read them aloud. Does a 60% Nordic-Baltic / 40% Slavic-Central blend produce coherent dialogue? Does it sound like a place? Or does it sound like two places stitched together? This is a new authoring workflow — writing parameters, generating samples, reading samples, adjusting parameters. Iterate until the blend sounds natural. + +**Voice drift detection.** At 300 worlds, two worlds with similar cultural blends might produce indistinguishable dialogue. The generator needs a distinctiveness check: "World 147 and World 203 have 85% parameter overlap. Their dialogue samples show <5% vocabulary divergence." That's too similar. I need to either differentiate the parameters or introduce world-specific vocabulary seeds that create surface distinction. + +**Anchor line distribution.** 30-50 FRIEND arcs across 300 worlds means each arc appears in 6-10 worlds. Players who visit multiple worlds will eventually encounter the same arc template. The arc needs to feel different ENOUGH through cultural parameter transforms that the structural repetition isn't obvious. This requires testing: generate the same FRIEND arc in 5 different cultural blends and check whether the emotional beats still land AND the surface language feels distinct. + +--- + +## 6. Tooling Requirements (Writer's Perspective) + +At this scale, I need tools I didn't need at 20 districts. + +| Tool | Purpose | Priority | +|------|---------|----------| +| **Parameter preview** | Input: cultural ingredient blend + voice seed. Output: 20 generated sample lines. I read them, adjust parameters, regenerate. | Must-have before any content production | +| **Blend distinctiveness checker** | Input: two cultural parameter profiles. Output: similarity score + divergence report. Flags worlds that will sound identical. | Must-have before world generation at scale | +| **Anchor preservation validator** | Input: FRIEND arc template + cultural parameter transform. Output: confirms emotional beats are preserved, only surface language changed. | Must-have for Sacred content integrity | +| **Transition monologue tester** | Input: archetype blend ratio + trigger context. Output: which transition line fires, preview in context. Essential for tuning the archetype drift feel. | Must-have for archetype fluidity | +| **Voice seed coverage report** | Input: all voice seeds across all patterns/motivations. Output: coverage map showing which trigger × mood × situation combinations have seeds and which are gaps. | Should-have for completeness | +| **Cultural contamination linter** | My Round 3 proposal still applies. At 300-world scale, it checks generator output, not hand-authored content. Flags when a heritage substrate word appears in a world where that heritage is <10% of the blend. | Should-have for quality | +| **Sample batch review interface** | Input: 300 generated worlds. Output: random sample of 5 lines per world, organized by cultural blend similarity. I read through and flag patterns of failure. | Must-have for quality control at scale | + +--- + +## 7. What I Start Writing Now + +Given the 300-world reframe, here's what I should author first, in priority order: + +### Priority 1: Cultural ingredient specs (the foundation everything else builds on) + +Using the Krenn brief as source material, extract and formalize the 8 parameter categories for the Nordic-Baltic ingredient set. This is the first ingredient set. It becomes the template for all others. + +### Priority 2: Smuggler and detective voice profiles as continuous axes + +Convert my Round 2 voice cards from prose descriptions into axis-based parameter specs that support gradient blending for archetype transitions. + +### Priority 3: FRIEND arc voice seeds (pattern-level, not character-level) + +Author 3-5 complete FRIEND arcs as Sacred content. Each arc is a full 5-phase emotional journey with voice lines at every phase. These are the seed arcs. Test them against the Krenn cultural parameters to verify they survive cultural transforms. + +### Priority 4: Environmental text template pools + +Author the TEMPLATES for each environmental text type (bar menus, safety notices, graffiti, news tickers, freight manifests, transit schedules, maintenance logs). Each template has fixed structural slots and variable cultural slots. The generator fills the cultural slots. + +### Priority 5: Middle Kingdom dialogue templates + +Author the dramatic SHAPES for triangle conversations, disclosure-gate conversations, and routine-observation monologue. Fixed structure, variable cast and cultural register. + +--- + +## Summary + +| Topic | Round 3 (20 districts) | Round 4 (300 worlds) | +|-------|----------------------|---------------------| +| **What I author** | Thousands of lines per district | Parameter specs + seed lines + Sacred emotional content | +| **Authored volume** | 13,500-31,200 lines | ~3,300-7,400 lines + 90 pages specs | +| **Quality control** | Per-line review | Per-parameter validation via sampling | +| **Cultural registers** | 4-6 held in working memory | 6-8 ingredient sets with composable blending | +| **Voice cards** | Prose descriptions per archetype | Continuous-axis parameter specs supporting gradient transitions | +| **FRIEND content** | Per-NPC authored arcs | 30-50 arc templates, generator-assigned to NPCs, Sacred emotional core preserved | +| **Environmental text** | 65-90 hand-authored items per district | Template pools + cultural parameter transforms | +| **Team structure** | Writers per culture/archetype | Ingredient spec writers + Sacred content writers + template writers + generator tuners | +| **Key risk** | Voice drift at scale | Bad parameters cascading across 300 worlds | + +The fundamental shift: at 20 districts, I was the writer. At 300 worlds, I'm the voice architect. I define the rules that produce voice. The generators do the writing. I audit the output. The Sacred content — FRIEND arcs, anchor lines, archetype transitions — is still hand-authored. That's where the soul lives. Everything else is authored as parameters, seeds, and templates that the generators instantiate. + +The game's voice quality at 300-world scale depends on one thing: are the parameters right? If yes, 300 worlds sound like 300 distinct places inhabited by real people seen through a specific character's eyes. If no, 300 worlds sound like the same procedural mush. My job is making sure the parameters are right. + +--- + +*The craft doesn't go away. It moves upstream. Instead of writing the line, I write the rule that produces the line. And then I write the FRIEND's anchor — the one line the generator can never touch — by hand, alone, until it makes me feel something.* diff --git a/docs/workshops/wiki-review/round4-miri.md b/docs/workshops/wiki-review/round4-miri.md new file mode 100644 index 000000000..487e790b9 --- /dev/null +++ b/docs/workshops/wiki-review/round4-miri.md @@ -0,0 +1,629 @@ +# Workshop Round 4 — Miri (Worldbuilder / Setting Designer) + +**Responding to the lead's decisions. Reframing for 300-world generator-input scale.** + +--- + +## What Changes at 300 Worlds + +Everything I proposed in Round 3 was designed for 8-10 hand-authored regions. At 300 worlds, the paradigm inverts: + +| Round 3 assumption | Round 4 reality | +|---|---| +| Regional brief is documentation a human reads | Regional brief is a **parameter set** a generator consumes | +| Cultural groups are a fixed taxonomy | Cultural groups are assembled from an **ingredients menu** | +| Naming pools are hand-curated lists | Naming is **algorithmic** — phonetic rules, not word lists | +| Social norms are prose descriptions | Social norms are **numeric parameters** the dialogue system reads | +| 8-10 briefs, each hand-authored | 8-12 ingredient definitions that combine into **thousands of unique societies** | +| Quality from expert review | Quality from **constraint specification** — the generator can't produce garbage | +| Each region needs a worldbuilder | The worldbuilder designs the **menu**; generators cook the meals | + +The Krenn System brief from Rounds 1-2 is now a **proof-of-concept output** — one meal from the kitchen. The real product is the recipe book + the ingredient pantry + the cooking rules. + +--- + +## 1. The Ingredients Menu + +The lead is right: pick-and-combine is better than fixed taxonomy. Here's the menu, designed as generator input. + +### Ingredient Category A: Heritage Roots + +Heritage roots are **phonetic and social flavor profiles**. Each root is a parameter bundle the generator uses to produce naming, social dynamics, and cultural texture. The player recognizes the FEEL without being able to say "that's Finnish." + +The roots are named for their social signature, not their Earth origin. A developer might think "Frost is Nordic-inspired" but the generator just knows "compact phonetics, social reserve, patience-based trust." + +I'm proposing **10 roots**. A society picks 1-3 and blends them with drift weighting. + +| Root | Phonetic Signature | Social Signature | Trust Model | Authority Attitude | Player Feels | +|---|---|---|---|---|---| +| **Frost** | Compact, consonant-clusters, 1-2 syllables, hard stops (k,t,v,s) | Reserved, privacy-first, stoic | Patience — time + shared labor | Formal distance — cooperate without volunteering | "Northern, quiet, self-reliant" | +| **Tide** | Flowing, vowel-rich, 2-3 syllables, soft consonants (l,n,m,r) | Social, group-oriented, expressive | Hospitality — sharing food, sharing space | Personal — authority must earn affection | "Coastal, warm, community-spirited" | +| **Iron** | Heavy consonants, rhythmic, 1-2 syllables, gutturals (g,kh,r) | Communal solidarity, endurance, labor-proud | Collective — trust the group, not individuals | Suspicious — institutions are outsiders | "Industrial, tough, workers' culture" | +| **Spice** | Layered, multi-syllable, precise stress patterns, sibilants | Extended kinship, layered formality, spiritual undertones | Kinship — blood and marriage connections | Respectful-formal — hierarchy acknowledged, not resented | "Elaborate, family-oriented, ritualistic" | +| **Jade** | Precise, tonal tendency, short but varied, clean consonants | Hierarchical, honor-aware, aesthetic-conscious | Competence — demonstrated skill earns respect | Institutional — authority is legitimate if earned | "Precise, beautiful, structured" | +| **Dust** | Rhythmic, open vowels, 2-3 syllables, nasals (n,m,ng) | Communal decision-making, oral tradition, trade-savvy | Witness — trust requires public demonstration | Collective — the community outranks the institution | "Rhythmic, communal, oral-tradition-rich" | +| **Vine** | Warm, 2-3 syllables, soft stops, rolled consonants | Class-conscious, family honor, emotionally warm | Family — trust through recognized kinship or patronage | Stratified — authority respected based on social class | "Warm, class-aware, passionate" | +| **Salt** | Pragmatic, clipped, 1-2 syllables, dental consonants (d,t,th) | Individualist, contract-based, commercial | Transaction — trust through fair dealing | Pragmatic — authority is a service, evaluated by results | "Merchant, practical, no-nonsense" | +| **Stone** | Steady, mid-length, balanced consonant/vowel, laterals (l,r) | Enduring, traditional, land-connected, seasonal | Tenure — trust through long presence | Patriarchal/Matriarchal — elders hold authority by custom | "Rooted, agricultural, slow-moving" | +| **Arc** | Sharp, variable length, fricatives (s,z,f,v), unusual combinations | Intellectual, cosmopolitan, debate-oriented | Argument — trust through demonstrated reasoning | Meritocratic — authority must justify itself intellectually | "Sharp, academic, argumentative" | + +### How roots blend + +A society picks 1-3 roots with blend weights summing to 1.0. The generator blends parameters: + +```yaml +# Example: Krenn System +heritage: + primary: frost # weight: 0.55 + secondary: salt # weight: 0.30 + tertiary: iron # weight: 0.15 + drift_stage: mature # 180 years +``` + +The generator produces: +- **Naming phonetics:** 55% Frost rules (compact, consonant-cluster) + 30% Salt rules (clipped, dental) + 15% Iron (heavy, rhythmic) = short, hard names with practical feel. This IS Krenn naming — we just derived it from parameters instead of hand-authoring it. +- **Social dynamics:** 55% reserve + 30% pragmatism + 15% solidarity = mind-your-business with transactional undertones and labor solidarity. This IS Krenn culture. +- **Trust model:** Dominant = patience (Frost) modified by fair-dealing expectation (Salt) = trust earned through time + demonstrated reliability. + +**Drift adjustment:** The drift stage modifies how blended the roots are. At "pioneer" (0-50yr), the primary root dominates strongly (weight 0.8+). At "mature" (150-300yr), the roots are more evenly blended and novel elements emerge. At "ancient" (300+), the heritage is substrate — barely detectable, mostly novel. + +```yaml +drift_modifiers: + pioneer: # primary ×1.4, secondary ×0.4, tertiary ×0.2, novel: 0.0 + crystallizing: # primary ×1.1, secondary ×0.7, tertiary ×0.5, novel: 0.1 + mature: # primary ×0.9, secondary ×0.8, tertiary ×0.7, novel: 0.3 + ancient: # primary ×0.5, secondary ×0.5, tertiary ×0.5, novel: 0.8 +``` + +The "novel" factor represents cultural elements that have no heritage origin — they emerged from local conditions. Krenn's first-name-primary convention is novel: no founding culture used it, but it emerged from logistics-class social compression. At 300 worlds, the generator needs to introduce novel elements proportional to drift stage. + +### Ingredient Category B: Settlement Motivation + +What brought people here shapes what they value. Each motivation provides defaults for social structure, institutional attitude, and what the community considers "success." + +| Motivation | Social Structure Default | Authority Attitude Modifier | What "Success" Means | +|---|---|---|---| +| **Economic-extractive** | Class hierarchy (owners/workers) | Varies by owner: corporate = compliant, independent = hostile | Profit. Getting out. Sending money home. | +| **Economic-trade** | Merchant networks, guilds, competitive | Pragmatic — regulation is cost of business | Volume. Reputation. Connections. | +| **Economic-agricultural** | Land-based hierarchy, generational | Patriarchal/matriarchal elders | Land. Harvest. Family continuity. | +| **Ideological-political** | Factional, democratic or authoritarian | Depends on ideology — could be deeply institutional or anti-institutional | Advancing the cause. Purity of vision. | +| **Ideological-academic** | Competence hierarchy, flat social | Meritocratic — authority must be earned through expertise | Knowledge. Discovery. Recognition. | +| **Institutional-military** | Chain of command, strict hierarchy | Total — institution IS authority | Order. Duty. Security. | +| **Institutional-administrative** | Bureaucratic layers, credentialed | Procedural — authority through process, not person | Position. Influence. Legacy. | +| **Refugee** | Trauma-bonded, informal, fluid | Distrustful — institutions failed them before | Safety. Stability. Being left alone. | +| **Frontier-adventurist** | Chaotic, reputation-based | Absent or hostile — came here to escape rules | Freedom. Self-determination. The next thing. | + +**Note on the lead's point:** "What a society DOESN'T care about is as defining as what it does." A frontier settlement with no ideological motivation has no philosophical framework for its grey economy — people smuggle because they need to, not because they believe in anything. That absence IS the character. The generator should be able to leave motivation categories EMPTY, and the absence produces a society without that dimension. + +### Ingredient Category C: Economic Function + +What the settlement DOES now. May differ from original motivation. + +| Function | Daily Rhythm | Gathering Pattern | Investigation Texture | +|---|---|---|---| +| **Extraction** (mining, resource) | Shift-based, dangerous | Canteen, shift change, safety briefings | Physical evidence, equipment access, safety records | +| **Logistics** (trade hub, freight) | Shift-based, routine | Bar, dock transitions, manifest processing | Manifest discrepancies, schedule anomalies, cargo tracking | +| **Manufacturing** | Shift-based, specialized | Guild hall, workshop, union meetings | Process knowledge, supply chain, quality records | +| **Agriculture** | Seasonal, weather-dependent | Market days, harvest festivals, family meals | Land records, water rights, seed stocks, generational grudges | +| **Services** (hospitality, maintenance) | Client-based, irregular | Public spaces, client premises | Client records, service schedules, reputation networks | +| **Research** | Project-based, irregular | Lab, seminar, common room | Research logs, peer review, grant records, experiment data | +| **Military/Security** | Watch-based, alert-cycling | Barracks, briefing room, mess hall | Chain of command, incident reports, patrol logs | +| **Administrative** | Office-hours, meeting-driven | Office, corridor politics, formal dinners | Paper trails, meeting minutes, budget records | +| **Transit** (gateway, waystation) | Continuous, transient | Arrival/departure lounges, temporary bars | Passenger manifests, transit records, transient contacts | +| **Mixed/Diversified** | Varies by sector | Multiple gathering types | Multiple investigation vectors | + +### Ingredient Category D: Economic Pressure + +**The lead's addition: what makes extra income tempting.** This determines the MORAL TEXTURE of the grey economy — not just what's smuggled, but WHY people participate. + +| Pressure Type | Why People Smuggle | Moral Texture | Investigation Emotional Weight | +|---|---|---|---| +| **Tight margin** | Enough to survive, not to thrive. Extra income = breathing room. | Sympathetic — "we're not greedy, we're trapped" | Busting this feels like punishing poverty | +| **Debt trap** | Owe more than you earn. Extra income = freedom from debt. | Desperate — "I have no choice" | Busting this feels cruel unless you address the debt | +| **Status competition** | Enough to survive, not enough to compete socially. Extra income = social mobility. | Ambivalent — "I want what they have" | Busting this feels like enforcing class boundaries | +| **Survival gap** | Basic needs unmet. Extra income = food, medicine, heat. | Urgent — "people will die without this" | Busting this is nearly unconscionable | +| **Opportunity disparity** | Legal work pays; illegal pays 10x. Extra income = rational choice. | Calculating — "it's just business" | Busting this feels like the system working correctly... uncomfortably | +| **Prohibition economy** | The desired thing is banned. Extra income = access to the forbidden. | Ideological — "the ban is wrong" | Busting this forces the player to evaluate the ban | +| **Generational extraction** | Wealth flows out of the community to distant owners. Extra income = keeping what's yours. | Righteous — "they're stealing from us first" | Busting this feels like being the owner's enforcer | + +**Krenn is "tight margin" + "prohibition economy"** — workers need extra income AND lattice components are banned. The double pressure creates the specific moral texture where the ring is both economically rational and ideologically defensible. + +At 300 worlds, the generator picks 1-2 pressure types per society. The combination determines the grey economy flavor, which determines the contraband type, which determines the investigation's moral weight. + +### Ingredient Category E: Drift Stage + +Already defined above. Four stages: pioneer (0-50yr), crystallizing (50-150yr), mature (150-300yr), ancient (300+). Affects heritage blending, novel element emergence, and institutional calcification. + +### Ingredient Category F: What's Missing (The Absence Ingredients) + +The lead said "What a society DOESN'T care about is as defining as what it does." The generator should track what's ABSENT: + +| Absence | What It Produces | Example | +|---|---|---| +| **No heritage consciousness** | People don't think about where they came from. Names are functional, not cultural. No food traditions, no festivals, no substrate words. | Transit hub populated by transients — nobody is "from here" | +| **No economic pressure** | Nobody needs extra income. The grey economy is about power or ideology, not money. | Wealthy core world where smuggling is a game, not a necessity | +| **No institutional authority** | No Commission presence, no Assembly representation. Self-governing by default or by chaos. | Frontier beyond the gate network's administrative reach | +| **No community bonds** | People don't know each other. No social fabric to protect or tear apart. | Transient gateway station with high population turnover | +| **No ideological framework** | People don't have a philosophy about their situation. They just survive. | Resource extraction colony where workers are too exhausted to think | + +The generator should allow NULL values for any ingredient category. The NULL is itself a parameter that shapes the society. + +--- + +## 2. Mechanical Parameter Matrix + +The ingredients menu is the human-facing design tool. Underneath, the generator needs a **structured parameter matrix** that every game system reads. + +### The Society Profile (Generator Output) + +When the generator assembles a society from ingredients, it produces a profile. This profile is what I called the "regional brief" in Rounds 1-3, but now it's machine-generated, not hand-authored. + +```yaml +# Generated society profile +society_id: krenn-sova-transit +world_id: krenn-system + +# Ingredients (input) +heritage: + roots: [{id: frost, weight: 0.55}, {id: salt, weight: 0.30}, {id: iron, weight: 0.15}] + drift_stage: mature + drift_years: 180 +settlement_motivation: economic-trade +economic_function: logistics +economic_pressure: [tight-margin, prohibition-economy] +corporate_presence: significant # Sova Logistics Consortium +philosophical_alignment: null # absent — no ideology, pure pragmatism + +# Naming parameters (derived from heritage roots + drift) +naming: + phonetics: + syllable_range: [1, 2] + consonant_preference: [k, t, v, s, r, d, n, l, p] + vowel_preference: [a, e, o] + cluster_frequency: 0.3 # how often consonant clusters appear + suffix_pool: [-an, -en, -ik, -ar, -ev, -mm, -sk, -ur, -ak] + compound_rate: 0.1 # how often compound names appear + social_convention: first-name-primary + authority_naming: title-plus-surname + formality_threshold: 0.7 # how familiar before first-name is used (0=immediate, 1=never) + +# Social parameters (derived from heritage + motivation + function) +social: + privacy_level: 0.8 # 0=everything public, 1=everything private + solidarity_type: labor-informal # how people bond + expression_style: contained # emotional display + gathering_primary: bar # primary social site type + gathering_trigger: shift-end # what triggers gathering + daily_rhythm: shift-based + +# Access tier parameters (derived from heritage + motivation) +access_tiers: + public: + topics: [environment, work-complaints, sport, news] + entry_cost: 0 # automatic + peer: + topics: [workplace-gossip, mild-opinions, npc-observations] + entry_cost: 30 # days of consistent non-threatening presence + mechanism: shared-time + insider: + topics: [income-sources, grey-economy, personal-troubles, secrets] + entry_cost: 90 # requires vouching + shared risk + mechanism: demonstrated-risk-sharing + authority: + topics: [formal-answers, minimal-disclosure] + entry_cost: 0 # automatic for institutional NPCs + demeanor: cooperative-unhelpful + hostile: + trigger: [trust-violation, cultural-norm-breach, aggressive-questioning] + expression: withdrawal # vs. confrontation, silence, sabotage + +# Trust parameters +trust: + building_mechanism: patience # what earns trust + building_rate: 0.015 # trust points per shared interaction + decay_rate: 0.005 # trust decay per day of absence + betrayal_cost: -0.8 # trust lost on betrayal (0 to -1) + recovery_possible: true + recovery_rate: 0.005 # slower than building + +# Authority parameters +authority: + attitude: formal-unhelpful + institutional_presence: commission # which institution is local + compliance_level: 0.6 # how much the community actually complies + reporting_norm: never # cultural norm around reporting to authority + +# Investigation texture +investigation: + primary_style: patience-observation # how the detective solves things here + secondary_style: manifest-analysis + noise_floor: cultural-silence # what creates false negatives + signal_type: routine-deviation # what reveals truth + +# Grey economy +grey_economy: + structure: cooperative-ring + contraband_primary: lattice-components + contraband_secondary: [medical-grade, severance-tech] + moral_frame: access-denied-by-regulation + participant_motivation: economic-need-plus-ideological-justification + +# Environmental texture +environment: + substrate_word_density: 0.12 # fraction of speech with heritage words + sign_register: terse-functional + food_culture_strength: 0.6 # how much heritage food survives + graffiti_style: sparse-operational + music_heritage: 0.1 # almost none + color_palette: [industrial-white, warm-amber, emergency-red, cool-gray] +``` + +### What each game system reads + +| System | Parameters Read | Purpose | +|---|---|---| +| **NPC Name Generator** | `naming.*` | Produces names that sound right for this society | +| **Dialogue Selection** | `access_tiers.*`, `trust.*`, `social.privacy_level` | Filters which lines an NPC will say to the PC | +| **Monologue Generation** | `investigation.*`, `environment.substrate_word_density` | Shapes how the PC's internal voice reacts | +| **Routine Generator** | `social.daily_rhythm`, `social.gathering_trigger`, `economic_function` | Creates NPC schedules that fit the culture | +| **Storyteller** | `trust.building_rate`, `access_tiers.peer.entry_cost`, `investigation.primary_style` | Paces revelations based on cultural trust dynamics | +| **Environmental Text Gen** | `environment.*`, `naming.sign_register` | Produces signs, menus, graffiti, tickers that feel right | +| **Contraband System** | `grey_economy.*`, `economic_pressure` | Determines what's being smuggled and why | +| **Triangle Generator** | `social.solidarity_type`, `grey_economy.structure` | Creates culturally appropriate conflict patterns | + +### Validation: Can this reproduce Krenn? + +If I feed the Krenn ingredients into this system, does the output match what I hand-authored in Rounds 1-2? + +| Hand-authored (Round 1-2) | Generator would produce | Match? | +|---|---|---| +| Names: Kael, Voss, Drin, Renn, Tav | Short, consonant-heavy, 1-2 syllable names | Yes — same phonetic space | +| "Mind your business" ethos | `privacy_level: 0.8`, `authority.attitude: formal-unhelpful` | Yes — produces same social dynamics | +| Trust through shared labor over months | `trust.building_mechanism: patience`, `access_tiers.peer.entry_cost: 30` | Yes — same timeline | +| Heritage food: leib, supp, kalaa | `food_culture_strength: 0.6` + Frost substrate vocabulary | Approximately — generator would produce different specific words but same density | +| Graffiti: sparse, operational | `graffiti_style: sparse-operational` | Yes | +| Investigation: patience + manifest analysis | `investigation.primary_style: patience-observation` | Yes | + +The generator can't reproduce the EXACT words (leib, supp, kylm) because those are authored instances, not generated outputs. But it produces the same density, the same register, the same feel. At 300 worlds, that's the right fidelity level. The specific words don't need to be hand-picked for every world — a phonetic generator that knows "Frost substrate + mature drift" can produce plausible heritage words. + +**Exception: Tier 1 content.** The hand-authored v0.1 district (Sova) keeps its specific words, specific names, specific environmental text. These are the exemplar — the proof that the generator's output space contains quality content. For all other worlds, the generator operates within the parameter space defined by the ingredients. + +--- + +## 3. NPC Pattern + Motivation Composition + +### Pattern definitions (worldbuilding perspective) + +Each thematic pattern has a WORLDBUILDING function — what role does this person play in the community's story? + +| Pattern | Worldbuilding Function | Content Tier Requirement | Per-District Count | +|---|---|---|---| +| **FRIEND** | The person the conspiracy hurts most through the player's relationship to them. Emotional core. | Tier 1 (hand-authored) | 1 per archetype (minimum 2) | +| **MIRROR** | Shows the player an alternate version of themselves. Same position, different choice. | Tier 1-2 | 0-1 | +| **ANCHOR** | Makes the place feel like home. Loss = displacement. | Tier 2+ | 1-2 | +| **GHOST** | Absent but referenced. Shapes events without being present. | Tier 2-3 | 0-2 | +| **CATALYST** | Their arrival or action triggers change. The disruption. | Tier 2+ | 1-2 | +| **THRESHOLD** | Controls access to a space, a group, or information. | Tier 2-3 | 1-3 | +| **REMNANT** | Carries memory of how things were before. Living history. | Tier 2-3 | 0-2 | +| **SYSTEM** | Embodies the institution. Their behavior IS policy. | Tier 2-3 | 1-3 | +| **NOBODY** | Background. Becomes foreground through player attention. | Tier 3 (starting) | 30-50% of population | + +### Functional motivation definitions + +| Motivation | What They're Doing | Knowledge State | Mechanical Function | +|---|---|---|---| +| **HANDLER** | Managing operations | Knows the structure | Provides operational intelligence if accessed | +| **WITNESS** | Saw something | Knows a specific event | Provides evidence if trusted/pressured | +| **TURNCOAT** | Switching sides | Knows both sides | Provides access to the other side's information | +| **CIVILIAN** | Living their life | Knows nothing conspiratorial | Provides noise floor, social texture, moral weight | +| **OPERATOR** | Performing operations | Knows their piece of the operation | Observable during operations, can be followed | +| **SKEPTIC** | Doubting the system they're in | Knows something is wrong, not what | Provides leads through questions they're asking | + +### Composition rules for generators + +**Rule 1: FRIEND composition determines the emotional core.** + +The FRIEND's functional motivation defines what kind of betrayal/contradiction the player encounters: + +| FRIEND + | Contradiction Type | Emotional Payload | +|---|---|---| +| HANDLER | Your friend is running the operation you're investigating/working for | Power betrayal — "you were using me" | +| WITNESS | Your friend knows the truth and is hiding it from you | Protective betrayal — "you were shielding me" | +| TURNCOAT | Your friend is switching to the other side | Loyalty betrayal — "you're abandoning us" | +| CIVILIAN | Your friend has nothing to do with the conspiracy but is being destroyed by it | Collateral damage — "you're an innocent caught in this" | +| OPERATOR | Your friend is actively performing the operations you're discovering | Identity betrayal — "I didn't know who you really were" | +| SKEPTIC | Your friend is questioning the same things you are, from the opposite side | Parallel discovery — "we're both finding out the truth, but it means opposite things to us" | + +Kael in Sova is FRIEND + OPERATOR (active ring member the smuggler discovers in B-7). Sera is FRIEND + WITNESS (sitting on evidence to protect Naia). The generator picks from these combinations to produce different emotional cores per playthrough. + +**Rule 2: NOBODY composition determines what they become.** + +A NOBODY starts as Tier 3 with a functional motivation. When the player invests attention, the NOBODY promotes: + +| NOBODY + starts as | Player attention reveals | Promotes to | +|---|---|---| +| CIVILIAN | A person with mundane problems that resonate | ANCHOR (if the player keeps engaging) | +| WITNESS | Someone who saw something | CATALYST (their knowledge changes the situation) | +| OPERATOR | Someone hiding in plain sight | MIRROR or SYSTEM (depending on what they're operating) | +| SKEPTIC | Someone asking questions the player is also asking | Can become an ally or informant | +| HANDLER | The real power was the background character all along | Major revelation — the generator should flag this as rare (5-10% of NOBODYs) | +| TURNCOAT | Someone quietly changing allegiance | Provides an unexpected ally or enemy | + +**The NOBODY → something promotion is the "evolving relationships" mechanic.** The storyteller monitors which NOBODYs the player interacts with. After N interactions, the storyteller can promote a NOBODY to a higher pattern. This is emergent narrative — the player's attention creates the story. + +At 300-world scale: the generator pre-assigns hidden motivations to NOBODYs. Most (70%) are CIVILIAN and stay NOBODY forever. Some (20%) have motivations that activate on attention. A few (10%) have load-bearing motivations that could reshape the investigation if discovered. + +**Rule 3: SYSTEM composition reveals institutional character.** + +A SYSTEM NPC's motivation tells you what the INSTITUTION is really doing: + +| SYSTEM + | What the institution is doing | Investigation implication | +|---|---|---| +| HANDLER | The institution is managing operations — possibly the grey economy it's supposed to prevent | Institutional corruption | +| WITNESS | The institution knows but isn't acting | Institutional complicity | +| TURNCOAT | The institution is changing policy/allegiance | Institutional instability | +| CIVILIAN | The institution is just... there. Bureaucratic inertia. | Red herring — the institution isn't the story | +| OPERATOR | The institution is actively performing the thing it claims to oppose | Deep corruption | +| SKEPTIC | The institution doubts itself | Reform opportunity | + +**Rule 4: Distribution constraints for generators.** + +Per district (30-40 NPCs): + +```yaml +pattern_distribution: + FRIEND: {count: [2, 4], per_archetype: 1, tier: 1} + MIRROR: {count: [0, 1], tier: [1, 2]} + ANCHOR: {count: [1, 3], tier: [2, 3]} + GHOST: {count: [0, 2], tier: [2, 3]} + CATALYST: {count: [1, 2], tier: [2, 3]} + THRESHOLD: {count: [1, 3], tier: [2, 3]} + REMNANT: {count: [0, 2], tier: [2, 3]} + SYSTEM: {count: [1, 3], tier: [2, 3]} + NOBODY: {count: [12, 25], tier: 3} # 30-60% of total + +motivation_distribution: + HANDLER: {count: [1, 3]} + WITNESS: {count: [2, 5]} + TURNCOAT: {count: [1, 3]} + CIVILIAN: {count: [10, 20]} # majority + OPERATOR: {count: [2, 5]} + SKEPTIC: {count: [1, 4]} + +# Cross-constraints +forbidden: + - pattern: GHOST, motivation: THRESHOLD # can't guard if absent + exception: "unless the ghost's absence IS the barrier" + +rare: # generator flags for review + - pattern: NOBODY, motivation: HANDLER # max 1 per district + - pattern: FRIEND, motivation: CIVILIAN # requires strong collateral-damage writing +``` + +### Cultural modifiers on pattern distribution + +The society profile modifies which patterns and motivations are common: + +| Society Parameter | Pattern Effect | Motivation Effect | +|---|---|---| +| `solidarity_type: labor-informal` | More ANCHORs (community bonds) | More CIVILIANs (solidarity protects non-participants) | +| `solidarity_type: family` | More THRESHOLDs (family gatekeepers) | More WITNESSes (family members see everything) | +| `authority.attitude: hostile` | More SYSTEMs (institution is visible antagonist) | More SKEPTICs (community doubts authority) | +| `authority.attitude: absent` | Fewer SYSTEMs | More HANDLERs (someone fills the power vacuum) | +| `social.privacy_level: high` | More NOBODYs (people fade into background) | Fewer WITNESSes (people don't see because they don't look) | +| `social.privacy_level: low` | Fewer NOBODYs (everyone is visible) | More WITNESSes (everyone sees everything) | +| `drift_stage: pioneer` | More REMNANTs (founders still alive) | More OPERATORs (everyone is building/doing) | +| `drift_stage: ancient` | More GHOSTs (referenced history) | More CIVILIANs (society is calcified, few active operators) | + +This means: a Frost/Salt/Iron society (Krenn-like) with high privacy and labor solidarity NATURALLY produces more NOBODYs and CIVILIANs than a Tide/Vine society with low privacy and family solidarity, which NATURALLY produces more WITNESSes and THRESHOLDs. The cultural parameters shape the NPC population without explicit per-society rules. + +--- + +## 4. Eight PC Archetypes + +### The eight, defined as relationships to the world's systems + +Each archetype is a POSITION in a community, not a character class. The generator needs to know what each position looks like, what access it provides, and how NPCs react to it. + +| # | Archetype | Relationship to Systems | Starting Access | Starting Knowledge | Moral Position | +|---|---|---|---|---|---| +| 1 | **Insider** | Embedded in community AND grey economy | peer/insider with community, insider with ring | Knows the operation, doesn't know it's being investigated | "I'm part of this. What does that make me?" | +| 2 | **Investigator** | Institutional authority investigating | authority with institutions, outsider with community | Knows something is wrong, doesn't know what | "I'm here to find the truth. What if the truth is worse?" | +| 3 | **Newcomer** | Just arrived. No position yet. | public everywhere | Knows almost nothing. Fresh perception. | "I don't understand this place yet. What am I walking into?" | +| 4 | **Operator** | Runs the grey economy | insider/authority with ring, peer with community | Knows the full operation | "I built this. What happens when it falls apart?" | +| 5 | **Authority** | Institutional power (governance, enforcement) | authority everywhere, hostile from grey economy | Knows institutional structure, not street-level reality | "I represent the system. Is the system worth representing?" | +| 6 | **Drifter** | Between communities. Transient. | public everywhere, but quick peer in transient spaces | Knows patterns across locations, no deep local knowledge | "I've seen this before. Am I seeing it again?" | +| 7 | **Specialist** | Valuable skill that grants unique access | peer in professional spaces, outsider socially | Deep technical knowledge, limited social knowledge | "They need me. Can I use that without being used?" | +| 8 | **Local** | Born here. Never left. | deep insider socially, peer/insider with grey economy through proximity | Knows everything about the place, nothing about the wider world | "This is my home. What am I willing to do to protect it?" | + +### Archetype transition mechanics + +Transitions happen through player action + time + community response. The archetype isn't assigned — it EMERGES from the player's relationship with the community. + +``` +NEWCOMER ──(get job)──→ INSIDER ──(take responsibility)──→ OPERATOR + │ │ + │──(accept mission)──→ INVESTIGATOR ──(rise)──→ AUTHORITY + │ + │──(stay transient)──→ DRIFTER + │ + │──(apply skill)──→ SPECIALIST + +LOCAL ──(get drawn in)──→ INSIDER ──(take over)──→ OPERATOR + │ + │──(leave home)──→ DRIFTER + +INVESTIGATOR ──(drop credentials)──→ NEWCOMER (or DRIFTER) +AUTHORITY ──(lose position)──→ DRIFTER (or NEWCOMER) +OPERATOR ──(get caught)──→ prisoner/exile mechanic (future) +INSIDER ──(withdraw)──→ LOCAL (if they've been here long enough) +``` + +**For generators:** The archetype defines: +1. Which NPCs are eligible to become this PC (e.g., Insider requires `faction_access: [ring]`, Newcomer requires `time_in_district: 0`) +2. What monologue pool this archetype uses +3. What the investigation/engagement style is +4. What tools/approaches are available +5. How NPCs default-react to this archetype + +### Cultural variation in archetype viability + +Not every archetype is equally viable in every culture: + +| Society Parameter | Archetype Effect | +|---|---| +| `authority.attitude: hostile` | Investigator and Authority start at a disadvantage; Insider and Local have stronger cover | +| `authority.attitude: absent` | Authority archetype unavailable; Investigator must work without institutional backing | +| `social.privacy_level: high` | Newcomer and Drifter face steep trust curves; Insider and Local have deep cover | +| `social.privacy_level: low` | Newcomer integrates faster; Insider's secrets are harder to keep | +| `solidarity_type: family` | Local has massive advantage (family connections); Newcomer is locked out without marriage/adoption | +| `solidarity_type: labor-informal` | Specialist gains quick peer access through demonstrated skill | +| `drift_stage: pioneer` | Everyone is a Newcomer; archetype distinctions are flatter | +| `economic_function: transit` | Drifter is the norm; Local barely exists | + +This means: the SAME archetype plays differently in different cultures. An Investigator in a Frost/Salt culture (Krenn-like) faces patient silence. An Investigator in a Tide/Vine culture faces elaborate social performance. An Investigator in an Iron culture faces organized collective resistance. Eight archetypes times the ingredient variation space produces hundreds of distinct play experiences. + +--- + +## 5. Sacred / Profane / Middle Kingdom — Worldbuilding Elements + +### Sacred (rules that never change) + +| Element | Why Sacred | +|---|---| +| The ingredients menu exists (heritage roots, motivations, pressures, etc.) | The generation system's vocabulary | +| 10 heritage roots with defined parameter spaces | The phonetic/social flavor palette | +| 5 access tiers (public/peer/insider/authority/hostile) | The investigation mechanics foundation | +| Trust is earned, not given | Core gameplay principle | +| Every society has a grey economy | Core investigation premise | +| The FRIEND pattern (warmth → trust → doubt → conflict) | Emotional architecture | +| Gate network connects worlds | Physical infrastructure | +| Core worlds are always connected | Navigational stability | +| 9 thematic patterns + 6 functional motivations exist | NPC composition vocabulary | +| 8 archetype positions exist with transition paths | Player identity vocabulary | + +### Profane (parameters drawn from pools per playthrough) + +| Element | Pool | Scale | +|---|---|---| +| Which heritage roots a specific world has | 10 roots × weights | Per world | +| Which economic pressure drives the grey economy | 7 pressure types | Per world | +| Which contraband type is being moved | Contraband pool per pressure type | Per district | +| Which NPCs fill which pattern/motivation slots | NPC generation pool | Per district | +| How long trust takes to build (culturally variable) | `trust.building_rate` parameter range | Per society | +| What the authority attitude is | 5 attitude types | Per society | +| Where peripheral gates connect | Peripheral world pool | Per playthrough | +| Who the FRIEND is | FRIEND-eligible NPC pool | Per playthrough | +| Which worlds are accessible | Peripheral connection pool | Per playthrough | +| What economic function a specific world has | 10 function types | Per world | + +### Middle Kingdom (sacred structure, profane cast) + +| Element | Sacred Part | Profane Part | +|---|---|---| +| **Gate topology** | Core hubs always connected. Minimum connectivity rules. | Which peripheral worlds connect where. Number of accessible systems fixed but which ones varies. | +| **NPC population** | 30/50/20 split (D-029). Pattern distribution constraints. | Which NPCs are which. Which NOBODYs have hidden depths. | +| **Society profile** | The parameter categories exist. | Which values are assigned per world. | +| **Triangle structure** | 2 per social site minimum. Triangles have 3 nodes with conflicting interests. | Which NPCs form which triangles. What the conflict is about. | +| **FRIEND arc** | 5 phases. Must have observable contradiction. Must exercise tell system. | Which NPC. Which contradiction. Which tell. | +| **Investigation** | Detective faces cultural resistance. Smuggler has embedded advantage. | How much resistance. What kind. How the advantage manifests. | +| **Archetype transitions** | Transition paths exist. Actions determine position. | Which transitions are available in this culture. How long they take. | + +### Gate topology as macro randomization + +The gate network is the cultural map's skeleton. At 300 worlds: + +**Sacred structure:** +- 3-5 core hub worlds are ALWAYS connected to each other (the Administrative Heart, the major trade nexuses). These anchor the game's navigational framework. +- Every world has at least 1 gate connection (no completely isolated worlds — isolation is social, not physical). +- Gate connections are bidirectional. +- Connection distance affects travel time and trade cost. + +**Profane variation:** +- Peripheral worlds (200+ of the 300) have randomized connections per playthrough. +- Some peripheral connections create strategic chokepoints (a Frontier system that's the only route to a Research Outpost). +- The number of accessible worlds may be fixed (e.g., you can reach 40-60 worlds from any starting position) but WHICH ones varies per seed. +- Unlockable gates (via random gate events or quests) expand the accessible map during play. + +**Worldbuilding implications of gate topology:** +- Worlds that are gate-adjacent develop TRADE RELATIONSHIPS and cultural blending. Two worlds connected by a direct gate share more heritage drift than two worlds separated by 3 hops. +- Chokepoint worlds develop TRANSIT CULTURES (the Gate Junction archetype from my Round 3). These are Middle Kingdom — the transit function is sacred, the specific population is profane. +- Isolated peripheral worlds develop MORE EXTREME cultures (less blending, more drift, stronger heritage dominance). The generator should increase `drift_modifiers.novel` for isolated worlds. +- The player's starting position determines which cultural contexts they encounter. A playthrough starting in the Frost/Salt cluster sees different worlds than one starting in the Tide/Vine cluster. This is the DEEPEST replayability axis — the cultural landscape itself shifts. + +### Gravity and perception (flagging for perception team) + +The lead flagged varying gravity as a perception element. From a worldbuilding perspective: + +- Station worlds = standard gravity (simulated). Feels like home for long-term residents. +- Surface worlds = variable gravity. Krenn Prime has a specific gravity that station-born visitors notice. +- Low-gravity stations = social markers. People move differently, carry differently, fight differently. +- Gravity variation is a WORLDBUILDING INGREDIENT, not just a physics parameter. A society that lives in low gravity for 200 years develops different body language, different spatial norms, different architecture. The heritage root blending should include a `gravity_norm` parameter. + +```yaml +# Addition to society profile +environment: + gravity_norm: 0.85g # affects NPC movement, architecture, body language + gravity_variation_notable: true # do locals notice gravity? (station-born notice planetary surface) +``` + +--- + +## 6. IP Originality at 300-World Scale + +Setting note — this is where originality risk is HIGHEST. + +At 10 regions, I could manually verify each culture against known SF properties. At 300 worlds generated from an ingredients menu, the generator will inevitably produce combinations that FEEL like specific franchises: + +| Risky combination | Feels like | Mitigation | +|---|---|---| +| Arc heritage + academic settlement + meritocratic authority | Banks's Culture (post-scarcity intellectual society) | The Culture lacks the heritage-drift mechanic and the grey economy. Our version has economic pressure and smuggling. Distinct. | +| Iron heritage + extractive economics + debt-trap pressure | Alien franchise (company-colony, exploited workers) | Common SF trope, not specific enough to one franchise. Our version has the ingredients system rather than a monolithic "evil corporation." | +| Frost heritage + logistics + tight-margin + prohibition | Hamilton's Commonwealth (only if we use Commonwealth-specific names/tech) | Already verified in Rounds 1-2. Krenn is structurally original. | +| Dust heritage + communal + survival-gap | Le Guin's Anarres (The Dispossessed) | Our version has a grey economy; Anarres explicitly doesn't. Distinct. | +| Jade heritage + hierarchical + institutional-military | Generic "space samurai" trope | Heritage drift should prevent this. At mature drift, the Jade root is substrate, not surface. The society shouldn't feel like "Japan in space." | + +**Mitigation strategy:** The ingredients menu includes a **cultural distance validator** — a generator constraint that checks whether a produced society falls within a known-franchise similarity threshold. If the combination is too close to a known property (measured by surface-feature overlap), the generator adjusts one ingredient. + +This is a generator-level constraint, not a human review step. At 300 worlds, we can't manually review every culture for franchise similarity. The validator must be automatic. + +**The deepest defense against franchise similarity is the DRIFT MECHANIC.** A "mature" or "ancient" drift stage blends heritage roots so heavily that the surface features of any single Earth culture are dissolved. A Jade/Stone society at 300 years of drift doesn't look Japanese — it looks like whatever emerged from precise-phonetic + land-connected social norms + 300 years of station life. The DRIFT is what makes our cultures original. + +--- + +## Summary of Round 4 Deliverables + +| Deliverable | Status | +|---|---| +| **Ingredients menu** (10 heritage roots + 5 other categories) | Defined above with generator parameters | +| **Mechanical parameter matrix** (society profile spec) | Full YAML spec above with per-system outputs | +| **NPC pattern × motivation composition rules** | Rules + distribution constraints + cultural modifiers | +| **8 PC archetypes** | Defined with access maps, moral positions, transitions | +| **Sacred/Profane/Middle Kingdom mapping** | All worldbuilding elements classified | +| **Gate topology randomization rules** | Core/peripheral structure defined | +| **IP originality strategy at scale** | Drift mechanic as primary defense + automated similarity validator | + +### What changed from Round 3 + +| Round 3 (20 districts) | Round 4 (300 worlds) | +|---|---| +| 10 fixed conceptual regions | 10 heritage roots that combine into thousands of societies | +| Regional brief as documentation | Society profile as generator output | +| Hand-authored naming pools | Algorithmic naming from phonetic parameters | +| Prose social norms | Numeric parameters (privacy_level: 0.8) | +| Each region needs a worldbuilder | Worldbuilder designs the ingredient menu; generators produce cultures | +| Quality from expert review | Quality from constraint specification | + +### What I need from other agents + +- **Tyre:** Can the content pipeline consume this parameter matrix format? Is `serde_yaml` sufficient for this schema depth? +- **Gestalt:** Do the pattern × motivation composition rules create enough mechanical variety? Are the distribution constraints too tight or too loose? +- **Nigel:** Does the Sacred/Profane/Middle Kingdom mapping protect replayability at 300-world scale? Are there randomization axes I missed? +- **Gore:** Does the economic pressure ingredient capture the thematic weight? Does "tight margin" vs. "survival gap" vs. "prohibition economy" create meaningfully different moral textures? +- **Mellanie:** Can the `environment.*` parameters in the society profile give you enough to generate environmental text? What's missing? + +--- + +**Status:** Round 4 response complete. +**Author:** Miri +**Date:** 2026-02-12 diff --git a/docs/workshops/wiki-review/round4-nigel.md b/docs/workshops/wiki-review/round4-nigel.md new file mode 100644 index 000000000..eee5b2de4 --- /dev/null +++ b/docs/workshops/wiki-review/round4-nigel.md @@ -0,0 +1,586 @@ +# Round 4 — Nigel (Sandbox & Replayability) + +## Responding to the Lead's Direction: 300 Worlds, Generators, and THE NOBODY + +300 worlds. Not 20 districts. Not 50. THREE HUNDRED. + +Everything I proposed in Round 3 just became generator specifications. And honestly? The replayability case gets STRONGER at this scale, not weaker. Let me explain why, and refine my proposals for a world where most content is procedurally generated from authored rules. + +--- + +## The Fundamental Reframe: Replayability IS Generation + +At 20 districts, replayability means "within-district variation through pool-based randomization." + +At 300 worlds, replayability means "the generator's output space is so large that no two worlds feel the same." + +These aren't different strategies. They're the same strategy at different scales. Pool-based selection is just generation with a very constrained output space. A FRIEND pool with 3 candidates is a generator that produces 3 possible outputs. A world generator that combines cultural ingredients, NPC patterns, and economic pressures is a generator that produces thousands. + +**My Sacred/Profane/Middle Kingdom framework maps directly to generation:** + +| Framework Layer | At 20 Districts | At 300 Worlds | +|---|---|---| +| **Sacred** | Fixed per district: cultural substrate, primary contraband, triangle structures | The generator's RULES: pattern library, composition constraints, cultural ingredient interactions, the physics of how societies work | +| **Profane** | Pool-selected per seed: FRIEND, roles, evidence, timeline | The generator's PARAMETERS per world: which ingredients combined, which NPCs spawned, which patterns assigned, which economy pressures are active | +| **Middle Kingdom** | Fixed structure, variable cast: triangles exist, different NPCs fill roles | The generator's OUTPUT STRUCTURE: every world has social sites, adversarial structures, a FRIEND arc — the specifics are generated | + +Sacred = the generator's grammar. Profane = the generator's vocabulary. Middle Kingdom = the generator's sentence structure. + +The style briefs, cultural ingredients, pattern libraries, and composition rules ARE the Sacred content. They're the DNA. If the DNA is rich enough, 300 worlds all feel distinct. If it's thin, they're wallpaper variations. + +--- + +## 1. Cultural Ingredients Menu: Mechanical Parameters for Generators + +The lead's ingredients list: heritage roots, settlement motivation, economic function, philosophical alignment, corporate presence, time since settlement / drift stage. + +Missing (lead flagged): **economics — what makes extra income tempting.** + +I'm going to map every ingredient to its MECHANICAL output — what the generator needs to produce for each world to be a distinct social puzzle, not just a distinct paint job. + +### The Ingredients → Mechanics Pipeline + +``` +INGREDIENT (authored, finite menu) + ↓ combined by generator +CULTURAL PROFILE (generated per world) + ↓ consumed by systems +MECHANICAL PARAMETERS (what the engine actually uses) +``` + +Here's the full mapping: + +| Ingredient | Menu Options (illustrative, not exhaustive) | Mechanical Output | Replayability Contribution | +|---|---|---|---| +| **Heritage roots** | Nordic-reserve, Mediterranean-warmth, East-Asian-hierarchy, West-African-communal, Latin-familial, Slavic-cynical, South-Asian-gatekept, Cosmopolitan-transactional | Access tier profile: outsider penalty, insider bonus, authority response, greeting initiative | Different social puzzles per heritage — skills don't transfer | +| **Settlement motivation** | Economic opportunity, political refuge, scientific frontier, military garrison, religious pilgrimage, corporate mandate, ideological experiment | What "enough" means locally: the answer to the thematic question. Shapes NPC contentment distributions and what disrupts equilibrium. | Different moral textures per motivation — same archetype feels different | +| **Economic function** | Logistics hub, trade nexus, mining operation, research station, agricultural colony, administrative center, luxury resort, transit waypoint | **What makes extra income tempting**: the economic pressure that creates the ring/network. A logistics hub has cargo opportunity. A research station has data to sell. A resort has wealthy marks. | Different adversarial structures per economy — different "crimes," different investigation shapes | +| **Philosophical alignment** | Pragmatic collectivist, institutional loyalist, libertarian individualist, spiritual communalist, meritocratic competitor, hierarchical traditionalist, egalitarian cooperative | Trust mechanism: how trust is built, maintained, and broken. Shapes NPC disclosure behavior, cultural gate modifiers, and what counts as betrayal. | Different trust puzzles — the detective who learned to build trust in a collectivist world fails in an individualist one | +| **Corporate presence** | Commission-dominated, Syndic-controlled, multi-faction contested, independent/unaffiliated, corporate-founded, faction-neutral | Institutional landscape: who has power, how it's wielded, what authority means. Shapes the detective's leverage and the smuggler's cover options. | Different power dynamics per corporate structure — authority means different things | +| **Time since settlement / drift** | Founding generation (0-50y), established (50-150y), deep-rooted (150-250y), ancient (250+y) | Cultural coherence: tight community vs. fragmented society. Young settlements have strong founding identity. Old ones have drifted, blended, contradicted themselves. | Older settlements are harder to read — more layers, more exceptions to cultural rules, more NOBODYs with hidden depth | + +### The Missing Ingredient: Economic Pressure + +The lead flagged this and they're right — it was missing from my 7-question framework. Let me be specific about what the generator needs: + +**Every world needs an economic pressure profile:** + +```yaml +economic_pressure: + primary_industry: logistics # What most people do for work + income_adequacy: moderate # How well the primary industry pays + income_gap: significant # Gap between what people earn and what they want + temptation_source: cargo_access # What makes extra income available + temptation_justification: healthcare # Why people tell themselves it's okay + institutional_failure: regulation # What the system fails to provide +``` + +The `temptation_justification` is the load-bearing field. It determines the moral texture of the world's adversarial structure. "Healthcare" = lattice components, sympathy-weighted. "Opportunity" = luxury goods, ambition-weighted. "Survival" = people smuggling, desperation-weighted. "Curiosity" = data/research, intellectually-weighted. + +At 300-world scale, the generator picks from a menu of justifications. Each justification produces a different moral flavor. The replayability isn't just "different NPCs in different places" — it's "different REASONS for the same structures." + +### What a society DOESN'T care about + +The lead emphasized this and it's brilliant for replayability. A world that doesn't care about philosophical alignment feels DIFFERENT from one that does. A world where corporate presence is irrelevant (independent frontier) plays differently from one where it dominates everything. + +For the generator, this means: **not all ingredients are always active.** Some worlds have 4 active ingredients. Some have 6. The ABSENCE of an ingredient is itself a parameter. + +```yaml +cultural_profile: + active_ingredients: + - heritage: nordic_reserve + - settlement_motivation: economic_opportunity + - economic_function: logistics_hub + - drift_stage: deep_rooted + inactive_ingredients: + - philosophical_alignment # "Nobody talks philosophy here. You work, you eat, you sleep." + - corporate_presence # "The Commission? They sent someone once. He left." +``` + +A world where philosophical alignment is inactive is a world where people DON'T have principled objections. They're practical. The ring isn't fighting an ideology — it's filling a gap. A world where corporate presence is inactive is a world where institutional authority is weak or absent — the detective can't lean on credentials because there's no institution to credential them. + +Different inactive ingredients = different social puzzles. And the generator just needs to know which slots to leave empty. + +### Mechanical parameter set (what the generator outputs per world) + +Here's the full parameter set that every generated world needs. These are what the ENGINE consumes: + +```yaml +# Generated per world from cultural ingredients +mechanical_profile: + # Access & Trust + outsider_trust_baseline: -2 # How much outsiders are distrusted (-3 to +2) + insider_trust_baseline: 3 # How much insiders are trusted (1 to 5) + authority_response: compliant_not_helpful # How NPCs respond to authority + trust_build_method: shared_labor # How trust is earned (time, labor, transaction, obligation, shared_values) + trust_build_speed: slow # How fast trust builds (fast/medium/slow/glacial) + + # Disclosure & Privacy + disclosure_to_insider: 0.9 # Probability of sharing info with cultural insider + disclosure_to_outsider: 0.3 # Probability of sharing info with outsider + disclosure_to_authority: 0.4 # Probability of sharing info with authority figure + gossip_flow: low # How freely information moves through the community + personal_topics_taboo: high # How taboo personal questions are + + # Social Structure + greeting_initiative: low # How likely NPCs are to greet strangers + hierarchy_importance: low # How much rank/status matters in interactions + community_tightness: high # How interconnected social bonds are + outsider_integration_time: long # How long before a newcomer is accepted + + # Economic + income_temptation: moderate # How tempting extra income is + ring_justification: healthcare # What moral justification the network uses + economic_vulnerability: moderate # How economically stressed the population is + + # Investigation & Cover + investigation_difficulty: high # How hard the detective's job is (from cultural factors) + cover_stability: high # How stable the smuggler's cover is (from cultural factors) + tell_visibility: low # How visible behavioral anomalies are against cultural baseline +``` + +This parameter set is what makes two worlds play MECHANICALLY differently. Not just different names and food — different NUMBERS driving dialogue selection, trust accumulation, investigation difficulty, and cover stability. + +At 300 worlds, the generator produces 300 unique parameter sets from the ingredients menu. No two worlds have the same social puzzle. The player who learned to play in a high-gossip, fast-trust, low-hierarchy world gets demolished in a low-gossip, slow-trust, high-hierarchy world. Skills don't transfer. That's anti-metagaming through GENERATION DIVERSITY. + +--- + +## 2. NPC Pattern Composition: Thematic + Functional as Generator Grammar + +The lead's split is exactly right. Three separate systems: + +**A. Thematic patterns** (what the character MEANS): FRIEND, MIRROR, ANCHOR, GHOST, CATALYST, THRESHOLD, REMNANT, SYSTEM, NOBODY + +**B. Functional motivations** (what the character DOES): HANDLER, WITNESS, TURNCOAT, CIVILIAN, OPERATOR, SKEPTIC + +**C. Composition** = A + B per NPC. + +This is a character creation GRAMMAR. The generator picks a thematic pattern and a functional motivation for each NPC, checks composition rules, and instantiates. At 300 worlds with 15-40 NPCs each, that's 4,500-12,000 NPCs created from this grammar. + +### THE NOBODY Changes Everything + +I need to say this clearly because it's the single biggest replayability insight of this entire workshop: + +**THE NOBODY creates PLAYER-DRIVEN replayability. Everything else we've discussed is SYSTEM-DRIVEN replayability.** + +System-driven: the seed determines who's THE FRIEND, who's compromised, what the contraband is. The player experiences a pre-configured world. + +Player-driven: the player CHOOSES who becomes important by paying attention. A NOBODY is background until the player invests. The system responds to the player's attention by promoting the NOBODY — unlocking content, deepening the relationship, potentially even promoting to a higher tier. + +At 300-world scale, the NOBODY pool is ENORMOUS. Thousands of generated Tier 3 NPCs, any of whom could become significant. Two players in the same world with the same seed have completely different experiences because Player A befriended the dock worker and Player B befriended the bar cook. Neither was "the correct choice." Both produced valid, meaningful stories. + +This is replayability that NO randomizer controls. It's emergent from the player's curiosity interacting with the generated world. AND IT SCALES FOR FREE. The more Tier 3 NPCs the generator produces, the more NOBODYs exist, the more possible player-driven stories there are. Linear generation cost, exponential narrative possibility. + +### Dynamic Tier Promotion: The Mechanics + +Here's how I see NOBODY → something working: + +``` +NOBODY (Tier 3, generated) + → Player interacts repeatedly (3-5 interactions threshold) + → System generates relationship content (contextual dialogue unlocks) + → NOBODY gains a name the player remembers, a routine the player knows, + a personality trait the player has observed + → Player continues investing attention + +ACQUAINTANCE (Tier 2.5, partially generated) + → System reveals a WANT (generated from cultural profile + economic pressure) + → System reveals a PROBLEM (generated from world state + NPC position) + → The NOBODY now has stakes. The player cares because THEY CHOSE to care. + → Available for thematic pattern assignment: + - If the player's attention pattern matches FRIEND prerequisites → promote to FRIEND candidate + - If the NPC's situation matches WITNESS prerequisites → promote to WITNESS + - If the NPC's position matches ANCHOR prerequisites → promote to ANCHOR + +SIGNIFICANT (Tier 2, partially authored / generated from deep templates) + → Full relationship content unlocked + → Thematic pattern activates + → The NOBODY is now a REAL CHARACTER — not because we authored them at Tier 1, + but because the player's attention triggered progressively deeper content generation +``` + +The key constraint: **THE FRIEND arc still requires Tier 1 authored depth for the emotional payload.** A NOBODY-promoted-to-FRIEND needs a contradiction arc, tell progression, warmth phase content. At 300-world scale, this content is GENERATED from deep templates — not hand-authored per NPC, but generated from pattern templates that produce Tier-1-quality content parameterized by the NPC's cultural profile, economic position, and relationship history. + +This is the point where "light generation — pick from pools, don't generate from scratch" becomes critical. The FRIEND arc template says: "5 phases, warmth → doubt → contradiction → reckoning → aftermath. Warmth phase lines are drawn from a pool of culturally-appropriate trust-building dialogue. Contradiction trigger is generated from the NPC's secret (which was itself generated from the world's adversarial structure). Tell is generated from a tell library parameterized by personality." + +The generator doesn't write "There you are. Good — I was starting to worry." It picks from a pool of warmth-phase greetings appropriate to the cultural profile, the NPC's personality, and the specific relationship history the player has built. At 300 worlds, those pools need to be deep enough that two NOBODYs promoted to FRIEND in the same cultural context don't say the same things. + +### Composition Rules for the Generator + +The generator needs to know what combinations are valid, forbidden, and interesting. Here's my proposed rule set: + +**ALWAYS VALID (generator can assign freely):** + +| Thematic | Functional | Why It Works | +|---|---|---| +| NOBODY | any | Default starting state for generated NPCs | +| ANCHOR | CIVILIAN | The contented person just living their life | +| GHOST | HANDLER | The off-stage boss (Nils pattern) | +| SYSTEM | OPERATOR | The person who IS the institution | +| CATALYST | SKEPTIC | The troublemaker asking uncomfortable questions | +| REMNANT | CIVILIAN | The person who was something once and chose to stop | + +**FORBIDDEN (generator must not assign):** + +| Thematic | Functional | Why It's Forbidden | +|---|---|---| +| FRIEND | TURNCOAT | FRIEND's arc IS the betrayal of trust. TURNCOAT is betrayal of loyalty. Doubling them dilutes both. Pick one. | +| MIRROR | OPERATOR | MIRROR must be honest. OPERATOR runs part of the network. Contradiction destroys MIRROR's function. | +| MIRROR | TURNCOAT | Same issue — MIRROR can't have a secret loyalty to flip. | +| NOBODY | HANDLER | A HANDLER needs enough presence to exert pressure. NOBODYs are background by definition. | + +**HIGH-VALUE (generator should prefer when possible):** + +| Thematic | Functional | Why It's Interesting | +|---|---|---| +| FRIEND + OPERATOR | The trusted person who's ALSO running ring operations. The betrayal is both personal AND operational. Maximum dramatic weight. | +| ANCHOR + WITNESS | The contented person who accidentally sees something. Now their contentment is threatened. They didn't ask for this. | +| THRESHOLD + TURNCOAT | The embodiment of the moral question whose loyalty flips. The thing that makes "enough" inadequate... leaves. Or switches sides. | +| NOBODY + SKEPTIC | Background person who quietly doubts. If the player notices and engages, the SKEPTIC's doubts become actionable. Player-driven whistleblower arc. | +| REMNANT + WITNESS | Someone who used to be important, thought they were done, and then sees something that drags them back in. | +| CATALYST + HANDLER | The outsider who arrives AND starts applying pressure. The disruptor who's also pulling strings. Is this person a force for good or just another kind of manipulation? | + +**THE NOBODY RULE: Every NPC starts as NOBODY + [functional motivation].** Thematic pattern is assigned later — either by the generator at world-creation (for Tier 1-2 pre-authored roles like FRIEND, MIRROR) or by the dynamic promotion system when the player invests attention. + +This means the generator's NPC creation pipeline is: + +``` +1. Assign functional motivation from world requirements + (every world needs at least: 1 HANDLER, 2-3 OPERATORs, 1 WITNESS, + 2-3 CIVILIANs, 1 SKEPTIC, 0-1 TURNCOATs) +2. Assign thematic pattern for key roles + (FRIEND: 2-4 candidates from pool. MIRROR: 1. ANCHOR: 0-1. GHOST: 0-1.) +3. All remaining NPCs: NOBODY + their functional motivation +4. Check composition rules (no forbidden combinations) +5. Verify world has minimum pattern coverage +6. Generate content depth per tier assignment +``` + +### What Does This Mean for Replayability? + +The composition system creates a character-space that's **combinatorially explosive.** + +9 thematic patterns × 6 functional motivations = 54 possible compositions. +Minus ~4 forbidden = 50 valid compositions. +300 worlds × 15-40 NPCs = 4,500-12,000 NPCs. + +No two worlds have the same cast. No two casts have the same pattern distribution. And within each world, the player's attention determines which NOBODYs become significant. + +The comparison test isn't just "two friends played different games." It's "two friends played the same world and STILL had different experiences because they paid attention to different people." + +That's replayability at a scale that makes the game genuinely infinite. Not procedurally-generated-infinite like a roguelike where everything blurs together. MEANINGFULLY infinite because every promoted NOBODY produces a unique story grounded in authored patterns and cultural specificity. + +--- + +## 3. Eight PC Archetypes with Fluid Transitions + +The lead wants 8 archetypes as a stress test of system flexibility. And the critical insight: archetypes are FLUID — current positions, not character classes. Players can move districts, change jobs, buy houses. + +### What This Means for Replayability + +**The replayability isn't "play again as a different archetype." It's "this playthrough, your path through the archetype space was unique."** + +If archetypes are positions, then a single playthrough includes MULTIPLE archetypes as the player's situation changes. The Newcomer who builds enough relationships becomes the Insider. The Insider who discovers the ring and can't look away becomes the Investigator. The Investigator who goes too far becomes the Enforcer. + +The TRANSITION is the story. Not the starting point. + +### The Eight Archetypes (stress test) + +Building on Gore's and the lead's direction: + +| # | Archetype | Starting Position | "Is This Enough?" Answer | Transition Attractors | +|---|---|---|---|---| +| 1 | **Insider** (smuggler) | Embedded in network | "Yes — until it isn't" | → Enforcer (double down), → Investigator (turn), → Wanderer (run) | +| 2 | **Investigator** (detective) | Institutional outsider | "No — something is wrong" | → Insider (captured), → Reformer (systemic change), → Wanderer (disillusioned) | +| 3 | **Newcomer** | Just arrived, knows nothing | "I don't know yet" | → ANY archetype (the Newcomer is the universal starting state) | +| 4 | **Operator** | Runs infrastructure | "Yes — I built this" | → Insider (co-opted), → Reformer (realizes the cost), → Builder (legitimate version) | +| 5 | **Enforcer** | Maintains compliance | "Yes — order matters" | → Investigator (sees corruption), → Insider (becomes what they enforce against), → Wanderer (burns out) | +| 6 | **Reformer** | Wants systemic change | "No — the system must change" | → Investigator (needs evidence), → Operator (takes over), → Wanderer (gives up) | +| 7 | **Builder** | Creating something new | "Almost — I need to finish this" | → Operator (succeeded), → Insider (compromised to finish), → Newcomer (starts over elsewhere) | +| 8 | **Wanderer** | Passing through | "Not here" | → Newcomer (in a new world), → ANY if something catches their attention | + +### Transition Mechanics as Replayability + +Transitions aren't random. They're driven by player actions and world state: + +``` +Transition trigger conditions: + insider → enforcer: + - Player has protected the network 3+ times + - Network asks player to silence a SKEPTIC or WITNESS + - Player accepts + + newcomer → insider: + - Player has reached PEER trust with 3+ network-adjacent NPCs + - Player has discovered the network's existence + - Player has been offered membership / been drawn in through employment + + investigator → wanderer: + - Player has resolved the district's primary investigation + - Player chooses to leave rather than stay + - OR: Player has failed the investigation and been expelled/defeated + + operator → reformer: + - Player witnesses cost of the system they run (a WITNESS or MIRROR moment) + - Player's contentment drops below threshold + - Player initiates contact with reform-aligned NPCs +``` + +At 300-world scale, the generator doesn't know which transitions will happen. It knows which transitions are POSSIBLE given the world's configuration. The generator outputs: + +```yaml +archetype_transitions: + available: + - from: newcomer + to: insider + prerequisites: [ring_discovery, peer_trust_3, employment_offer] + - from: newcomer + to: investigator + prerequisites: [anomaly_detection, authority_contact, evidence_found] + - from: insider + to: enforcer + prerequisites: [protection_actions_3, silencing_request] + # ... all valid transitions for this world + blocked: + - from: reformer + to: operator + reason: "No legitimate institutions in this frontier world to operate" +``` + +The generator creates the possibility space. The player navigates it. The story emerges. + +### Fluid Archetypes + THE NOBODY = The Infinite Game + +Here's where it all connects. At 300-world scale: + +1. Player starts as Newcomer in World X. +2. Player pays attention to a NOBODY dock worker. The NOBODY promotes to ACQUAINTANCE. +3. The dock worker is NOBODY + OPERATOR. Through the player's attention, they reveal they run part of the world's logistics network. +4. The player is offered a job. Newcomer → Insider transition available. +5. The player discovers the dock worker is hiding something (NOBODY promoted to FRIEND candidate through player investment + generator assigning pattern). +6. The FRIEND arc activates. Trust, warmth, contradiction, reckoning. +7. The player's response to the reckoning determines their next archetype transition. + +None of this was scripted. The world was generated. The NPC was generated. The player's attention created the story. The archetype transition emerged from player choices. The FRIEND arc was generated from pattern templates. + +And the NEXT player in the same world might befriend a different NOBODY, get drawn into a different part of the network, experience a different FRIEND arc, and transition to a different archetype. Same world. Different game. + +THAT is 300-world replayability. Not "300 different worlds to visit." It's "300 worlds, each of which contains dozens of possible stories, selected by the player's attention." + +--- + +## 4. Gate Topology as Macro Randomization + +The lead approved gate topology as the macro randomization layer. Let me spec this for the generator. + +### The Three Gate Tiers (Sacred/Profane/Middle Kingdom) + +**Sacred Gates: Core worlds always connected.** + +These are the backbone. Earth, major faction capitals, the political centers. The player always has access to these regardless of seed. They're the "main quest" geography — the places where the story's largest arcs play out. + +At 300 worlds, maybe 15-20 are Sacred. Always present, always connected, always accessible. They represent the game's canonical geography. + +**Middle Kingdom Gates: Fixed count, variable connections.** + +The number of accessible regions is fixed (say 40-60 worlds per playthrough out of 300). But WHICH 40-60 depends on the seed and the player's gate discoveries. The structure is sacred (you always have ~50 accessible worlds). The specific selection is profane. + +This means the generator produces a gate graph per seed: + +```yaml +gate_topology: + seed: 847291 + core_worlds: [earth, augusta, krenn_prime, ...] # Always present (Sacred) + accessible_worlds: 52 # Fixed count (Middle Kingdom) + connections: + - from: krenn_prime + to: sova_station + type: permanent # Always open + - from: krenn_prime + to: haven_drift + type: discoverable # Available through quest/event + - from: augusta + to: ember_station + type: random_event # Gate event, varies per seed + unreachable_this_seed: [worlds 248 through 300] # Not accessible this playthrough +``` + +**Profane Gates: Discoverable connections.** + +Some gates only appear through specific conditions — quest completion, random events, NPC relationships. A player who befriends a particular NOBODY (a navigator, a gate technician, a smuggler with contacts) might unlock a gate that another player never discovers. + +This ties directly to THE NOBODY. A NOBODY who turns out to be a navigator opens a gate. Player-driven replayability creates GEOGRAPHIC replayability. The player's social choices determine which parts of the galaxy they can access. + +### What This Means for Chapter-Level Replayability + +Playthrough 1: Seed gives you Krenn System → Merchant Hub → Military Outpost. Three worlds, three cultures, three moral textures. Your story is about navigating from collective solidarity to transactional relationships to rigid hierarchy. + +Playthrough 2: Different seed gives you Krenn System → Research Station → Religious Enclave. Same starting point, completely different second and third acts. Your story is about navigating from blue-collar pragmatism to intellectual risk-taking to faith-based community. + +Playthrough 3: Same seed as Playthrough 1, but you befriend a different NOBODY in the Merchant Hub — a navigator who opens a gate to a Frontier world. Now you have a FOURTH world that Playthrough 1 never accessed. Your story branches in a direction the seed alone didn't determine. + +The gate topology creates MACRO replayability — different playthroughs explore different slices of the 300-world galaxy. The NOBODY system creates MICRO replayability within each world. Together, they make the game genuinely inexhaustible. + +### The Planetary Owner/Developer DLC + +The lead mentioned this as a future possibility. From a replayability perspective: + +Unlocked worlds that the player can DEVELOP create a new replayability axis: **the player becomes the GENERATOR.** They're not just experiencing generated worlds — they're populating, building, and shaping worlds that OTHER players (or their own future playthroughs) will experience. + +This is the ultimate content strategy. The players become content creators within the game's own systems. The cultural ingredients menu becomes a PLAYER-FACING tool. "I'm founding a colony with Nordic-reserve heritage, research-station economic function, and spiritual-communalist philosophical alignment." The generator takes those inputs and produces a world. The player's second playthrough visits a world they BUILT, populated with NPCs they helped define. + +Replayability at this level isn't a feature. It's an ecosystem. + +--- + +## 5. Full Sacred/Profane/Middle Kingdom Map + +The lead approved the framework. Here's the complete mapping at 300-world scale. + +### Sacred (Generator Rules — Never Change) + +| System | Sacred Elements | Why Sacred | +|---|---|---| +| **Cultural Ingredients** | The menu itself: heritage options, settlement motivations, economic functions, philosophical alignments, corporate types, drift stages | Changing the menu changes the generator. The menu IS the game's social physics. | +| **Pattern Library** | The 9 thematic patterns + 6 functional motivations + composition rules | These are the character-creation grammar. Changing them changes what kinds of people can exist. | +| **Archetype Definitions** | The 8 PC archetypes + their transition maps + their information positions | These define what kinds of GAMES are possible. | +| **Adversarial Structure** | The concept that every world has a hidden network vs. investigators | This IS the game. Without it, there's no asymmetric information. | +| **Core Gate Network** | 15-20 core worlds always connected | The player always has a baseline galaxy to navigate. | +| **Theme** | "Is this enough?" / Cost of participation (when finalized) | The question every world asks, in different voices. | +| **Tier System** | Tier 1 = emotional payload (authored/deep-generated), Tier 2 = working profile, Tier 3 = atmosphere/NOBODY | Quality hierarchy drives content depth allocation. | +| **NOBODY Promotion** | The mechanic of player attention creating significance | This is the player-driven replayability engine. Removing it collapses the infinite game. | + +### Profane (Generator Parameters — Vary Per World + Seed) + +| System | Profane Elements | How They Vary | +|---|---|---| +| **Cultural Profile** | Heritage + motivation + economy + philosophy + corporate + drift per world | Generator picks from ingredients menu per world | +| **Mechanical Parameters** | Trust baselines, disclosure rates, gossip flow, investigation difficulty, cover stability | Generated from cultural profile | +| **NPC Roster** | Names, personalities, routines, relationships | Generated from cultural profile + pattern assignments | +| **Pattern Assignments** | Which NPCs fill FRIEND, MIRROR, ANCHOR, etc. | Pool selection per seed | +| **Functional Assignments** | Which NPCs are HANDLER, WITNESS, TURNCOAT, etc. | World requirements + pool selection | +| **Gate Connections** | Which discoverable gates are open this seed | Seed + player actions | +| **Economic Pressures** | Specific contraband/resource, justification, vulnerability level | Generated from economic function ingredient | +| **Environmental Details** | Food, slang, signs, news ticker content, ambient text | Generated from cultural profile | +| **Timeline** | When storyteller triggers events, when arcs hit key beats | Storyteller variation per seed | + +### Middle Kingdom (Fixed Structure, Variable Content) + +| System | Structure (Sacred) | Content (Profane) | +|---|---|---| +| **Social Sites** | Every world has 2-6 social sites with role slots | Which NPCs fill roles, what the sites look like, cultural flavor | +| **Triangles** | Every social site has 1-3 triangles with named tension types | Which NPCs form the triangle, what the specific tension is about | +| **FRIEND Arc** | 5 phases: warmth → doubt → contradiction → reckoning → aftermath | Which NPC, what secret, what tell, what contradiction, what resolution | +| **Investigation Arc** | Observe → notice → follow → discover → confront | Which evidence, where it is, which NPC cracks, when | +| **NOBODY Promotion** | 3-stage promotion: NOBODY → ACQUAINTANCE → SIGNIFICANT | Which NOBODY, triggered by which player interactions, promoted to which pattern | +| **Archetype Transitions** | Transitions follow defined paths with prerequisite conditions | Which transitions are available depends on world state + player actions | +| **Gate Graph** | ~50 accessible worlds per playthrough from a pool of 300 | Which 50 depends on seed + player discovery | +| **Adversarial Structure** | Hidden network with coordinator, operators, external connection | Which NPCs, what they're moving, why, who's compromised | + +--- + +## 6. What Changes Fundamentally at 300 Worlds + +Let me be honest about what my Round 3 proposals assumed and where they break at this scale. + +### What Survives Intact + +- **Sacred/Profane/Middle Kingdom framework** — scales perfectly. Just relabel: Sacred = generator rules, Profane = generator parameters. +- **Pool-based selection** — this IS generation. Pools are just small generators. 300 worlds means bigger pools. +- **Anti-metagaming through diversity** — gets STRONGER at 300 worlds. Nobody can memorize 300 cultural profiles. +- **Pattern library** — the composition system works identically whether the generator creates 20 NPCs or 12,000. + +### What Changes Fundamentally + +**1. Authored FRIEND content becomes template-generated FRIEND content.** + +At 20 districts, every FRIEND is hand-authored at Tier 1 depth. At 300 worlds, that's 600-1,200 FRIEND candidates (2-4 per world). Hand-authoring is impossible. + +The solution: **FRIEND arc templates parameterized by cultural profile.** + +``` +FRIEND template: "trusted_colleague" + warmth_phase: draw from [cultural_greeting_pool + relationship_warmth_pool] + tell: select from [tell_library] based on personality_type + contradiction: generate from [adversarial_structure + NPC_secret + spatial_layout] + reckoning: draw from [confrontation_pool] based on relationship_depth + cultural_norms +``` + +The template produces Tier-1-depth content without Tier-1-effort per NPC. The QUALITY depends on the depth of the pools and the sophistication of the parameterization. If the warmth pool has 200 culturally-distinct lines and the tell library has 30 personality-appropriate tells, the generated FRIEND feels specific even though no human wrote their specific arc. + +**This is the hardest content challenge in the game.** Generated FRIEND arcs that feel as devastating as hand-authored ones. Gore would say: "emotion doesn't template." I'd say: "emotion templates if the templates are deep enough and the parameters are specific enough." It's the difference between a bad procedural generator ("NPC says random warm thing") and a good one ("NPC says a warm thing consistent with their cultural background, their specific relationship history with the player, and their personality type, selected from a pool of 200 culturally-appropriate warmth lines"). + +**2. Cultural briefs become generator input parameters, not documentation.** + +Miri's Krenn brief is beautiful. It's also 5 pages of prose. At 300 worlds, we can't write 300 Krenn-quality briefs. + +The solution: **cultural ingredients produce mechanical parameters, not prose.** The prose is for the FIRST 5-10 worlds (the hand-authored reference implementations). The generator learns the PATTERN from the ingredients menu and produces culturally-consistent parameters for the remaining 290. + +The Miri-quality briefs for the first cultural clusters serve double duty: +1. They're reference implementations for hand-authored content +2. They're TRAINING DATA for the generator — showing what a fully-realized cultural profile looks like + +**3. THE NOBODY replaces most hand-authored Tier 2 content.** + +At 20 districts, Tier 2 NPCs are hand-authored with generation expansion. At 300 worlds, most "interesting" NPCs are NOBODYs promoted by player attention. + +This is actually BETTER for replayability. Hand-authored Tier 2 NPCs are the same every playthrough (their content is fixed, only their role varies). NOBODYs promoted by player attention are ALWAYS different because the promotion depends on the player's choices. The system generates deeper content in response to the specific relationship the player has built. + +**4. The content certification model shifts from "review everything" to "test the generator."** + +At 20 districts, you can review every NPC profile. At 300 worlds, you review the GENERATOR. Quality assurance becomes: +- Test the ingredients menu (do all ingredient combinations produce coherent cultural profiles?) +- Test the pattern composition (do all valid compositions produce interesting NPCs?) +- Test the FRIEND arc templates (do generated FRIEND arcs hit emotional beats?) +- Test the NOBODY promotion (does dynamic tier promotion produce satisfying stories?) +- Test the gate topology (do generated gate graphs produce navigable galaxies?) + +The QA target shifts from "is this NPC good?" to "does this generator produce good NPCs?" That's a fundamentally different testing paradigm. Hoshe needs to know. + +--- + +## Synthesis: The Replayability Architecture at 300-World Scale + +Let me paint the final picture. + +The Settled Reach ships with 300 worlds. 15-20 are hand-authored (Sacred gates, reference implementations). The remaining 280 are generated from the cultural ingredients menu, pattern library, and composition rules. Each generated world has its own cultural profile, adversarial structure, NPC roster, gate connections, and economic pressures. + +The player creates a game. The seed generates a gate graph — ~50 accessible worlds out of 300. The player picks an archetype (or defaults to Newcomer) and enters their first world. They meet NOBODYs. They pay attention. Some NOBODYs become significant. One becomes THE FRIEND. The FRIEND arc plays out — generated from deep templates, specific to this NPC, this culture, this relationship history. + +The player resolves (or doesn't) and moves on. New world, new culture, new social puzzle. Skills from the first world partially transfer — the investigation structure is familiar. But the cultural ingredients are different. Gossip flows freely here. Authority is respected. The player's old strategies fail. They adapt. New NOBODYs. New attention. New stories. + +Forty hours in, the player has visited 8 worlds across 3 star systems. They've transitioned from Newcomer to Insider to Investigator. They've had 3 FRIEND arcs, each devastating in different ways. They've promoted a dozen NOBODYs to significance. They've unlocked 2 discoverable gates through NPC relationships. Their galaxy is THEIRS — a unique slice of the 300-world space, populated by unique stories, shaped by their attention. + +Another player starts the same seed. Visits the same first world. Befriends a different NOBODY. Transitions to Builder instead of Insider. Unlocks a different gate. Visits worlds the first player never saw. Their galaxy is ALSO theirs. Different stories, different people, different moral reckonings. Same theme: "Is this enough?" + +A hundred players. A hundred galaxies. A hundred answers to the same question. All generated from the same rules, the same ingredients, the same patterns. None of them the same. + +That's not a game with 300 worlds. That's a game with infinite stories. The worlds are the medium. The stories are the product. And the stories are created by the intersection of authored rules, generated content, and player attention. + +**But what about the SECOND playthrough?** + +Different seed. Different gate graph. Different 50 worlds out of 300. Different FRIEND in the first world. Different cultural ingredients in the second world (because the second world itself is different). Different NOBODYs promoted. Different archetype transitions. + +A completely different game. + +From the same generator. + +Using the same rules. + +Asking the same question. + +--- + +## Key Refinements to Record + +| # | Refinement | Domain | What Changed from Round 3 | +|---|---|---|---| +| 1 | Cultural ingredients menu produces mechanical parameter sets, not prose briefs | Generator Input | 7-question framework → 6-ingredient menu with full parameter output spec | +| 2 | Economic pressure as explicit ingredient with `temptation_justification` as load-bearing field | Generator Input | New — was missing from Round 3 | +| 3 | Inactive ingredients as a parameter (what a society doesn't care about) | Generator Input | New — lead's insight | +| 4 | NPC composition = thematic pattern + functional motivation with explicit forbidden/preferred rules | Generator Grammar | Round 3's single pattern list → two-axis composition system | +| 5 | THE NOBODY as player-driven replayability engine with 3-stage dynamic promotion | Core Mechanic | New — lead's addition, my strongest endorsement of any proposal in this workshop | +| 6 | FRIEND arc templates parameterized by cultural profile for 300-world generation | Generator Template | Round 3's "pool of authored candidates" → "pool of deep templates that generate candidates" | +| 7 | 8 fluid archetypes with transition maps as generator output | Generator Output | Round 3's 5 fixed archetypes → 8 fluid positions with transition mechanics | +| 8 | Gate topology as macro randomization: Sacred (15-20 core) + Middle Kingdom (~50 per playthrough from 300 pool) + Profane (discoverable through player action) | World Structure | Round 3's "chapter-level randomization" → full spec with NOBODY-driven gate discovery | +| 9 | QA paradigm shift: test the generator, not the output | Quality | Round 3's "3-level certification" → "generator testing framework" | diff --git a/docs/workshops/wiki-review/round4-ozzie.md b/docs/workshops/wiki-review/round4-ozzie.md new file mode 100644 index 000000000..cbea5b90d --- /dev/null +++ b/docs/workshops/wiki-review/round4-ozzie.md @@ -0,0 +1,385 @@ +# Round 4 — Ozzie (Player Experience / Wow Factor) + +## Responding to the Lead's Decisions — 300-World Scale + +The 300-world reframe changes EVERYTHING I said in Round 3. Not because I was wrong about what the player should feel — but because the method of DELIVERING those feelings is fundamentally different. + +At 20 districts, I could say "hand-author every Cheers moment." At 300 worlds, the Cheers moment must be **procedurally achievable**. The generator must produce it. The style briefs and cultural parameters must contain enough information that a world assembled from ingredients FEELS like walking into a warm place. + +That's the challenge. And honestly? It's MORE exciting than hand-authoring 20 districts. Because if we get the generators right, the player will walk into World 247 and feel something that nobody on the team specifically designed. The wow moment becomes EMERGENT. And emergent wow is the deepest kind. + +Let me respond to each decision. + +--- + +## 1. Cultural Groups: The Ingredients Menu + +### The lead is right. Fixed taxonomy was already too small at 20. At 300, it's absurd. + +My Round 3 proposal of "8-12 cultural groups" was thinking like a hand-authoring team. "We can produce 8-12 culture briefs." At 300 worlds, the question isn't how many briefs we can write — it's how many DISTINCT FEELS the ingredient system can produce. + +### What the ingredients menu must deliver to the player + +When the player steps through a gate onto a new world, the ingredients must combine to produce **three immediate sensory impressions:** + +1. **The greeting rhythm.** How people acknowledge your presence. This is the first thing you notice. Some worlds: verbal greeting, physical contact, warmth. Other worlds: a nod, silence, distance. Others: formal title exchange. Others: complete indifference until you prove you belong. The greeting rhythm tells you INSTANTLY what kind of place this is. + +2. **The ambient sound of social life.** Is the bar loud or quiet? Do people eat communally or alone? Is there music? Argument? Laughter? Card games? The social soundscape communicates culture faster than any dialogue line. This is an ingredient the menu doesn't list yet: **social energy level** (gregarious / moderate / reserved / silent). + +3. **The economic texture.** The lead specifically flagged that economics is missing from Nigel's questions. YES. The player needs to feel WHY extra income is tempting here. On one world, it's survival — the legitimate economy doesn't cover basic needs. On another, it's ambition — the economy is fine but status requires MORE. On another, it's boredom — the economy works perfectly and there's nothing to strive for, so the grey economy provides excitement. The economic texture determines the moral flavor of the entire world. + +### Proposed additions to the ingredients menu + +The lead listed: heritage roots, settlement motivation, economic function, philosophical alignment, corporate presence, time since settlement / drift stage. + +From a player experience perspective, I'd add: + +| Ingredient | Why It Matters to the Player | Generator Output | +|-----------|---------------------------|-----------------| +| **Social energy** (gregarious → silent) | First-impression soundscape. Determines whether the bar feels like a party or a library. | Ambient audio parameters, NPC conversation frequency, group-vs-solo dining patterns | +| **Celebration pattern** (what people celebrate, how) | The POSITIVE texture. What does joy look like here? This is the warmth that makes betrayal hurt. | Festival events, drinking customs, shared meals, music/card/sport culture | +| **Economic pressure type** (scarcity / sufficiency / abundance) | Why the ring exists HERE. Determines the moral weight of smuggling. | Contraband moral frame, NPC contentment baseline, what "extra income" buys | +| **Authority relationship** (respected / tolerated / resented / absent) | How the detective archetype is received. First interaction with institutional NPCs. | NPC authority-tier responses, investigation difficulty gradient | +| **Stranger reception** (welcoming / cautious / hostile / indifferent) | The Newcomer's ramp. How hard is it to earn the Cheers moment on this world? | Trust-building speed, first-name vs surname default, orientation monologue tone | + +### What a society DOESN'T care about — the player experience + +The lead said: "What a society DOESN'T care about is as defining as what it does." + +THIS is a player experience goldmine. The first time the player walks into a world where nobody cares about institutional authority — where the detective's credentials are literally meaningless — that's a wow moment. "Wait. My badge doesn't work here? Nobody cares that I'm Commission?" The absence of an ingredient creates SURPRISE. + +For generators, this means: every ingredient has a "not applicable" option. A world with no corporate presence feels different from a world dominated by Syndic operations. A world with no philosophical alignment — where people have no shared ideology, just coexistence — feels like chaos. The void IS the character. + +### The combinatorial wow + +At 300 worlds, the ingredients menu should produce combinations that SURPRISE THE DESIGNERS. That's the test. If we can sit down with the generator output and say "Huh. Nordic heritage + religious motivation + abundance economy + silent social energy. I didn't expect that combination but it makes sense — it's a contemplative prosperity commune. Quiet bars. Shared meals eaten in near-silence. The ring smuggles spiritual experiences the commune's leadership has banned." — if the generator produces worlds that make us go "Oh, that's INTERESTING" — we've won. + +The wow moment isn't in any single ingredient. It's in the COMBINATION. + +--- + +## 2. Content Patterns: THE NOBODY Changes Everything + +### Three separate systems — YES. And THE NOBODY is the headline. + +The lead's three-system split (thematic patterns + functional motivations + composition) is architecturally clean. But from a player experience perspective, THE NOBODY is the single most important idea in this round. + +### Why THE NOBODY is the game at 300-world scale + +At 300 worlds with generators producing NPCs, MOST NPCs are nobodies. That's not a bug — that's the reality. You can't hand-author 300 worlds × 15+ NPCs. The vast majority of NPCs will be generated from templates, populated with ingredient-derived names and routines and basic personalities. They're correct. They're culturally appropriate. They're furniture that talks. + +THE NOBODY pattern acknowledges this reality and turns it into a FEATURE. + +**The player's attention is the resource.** In a world full of generated nobodies, the player CHOOSES who to notice. They sit at a bar and there are 8 NPCs. Most are background. But one catches their eye — maybe the NPC looked away at the wrong moment, or said something that sounded like it had a second meaning, or was just... kind. The player pays attention. And because they paid attention, the game RESPONDS. The nobody starts to become someone. + +THIS IS THE DEEPEST WOW MOMENT IN THE GAME. + +Not the FRIEND's betrayal. Not the conspiracy reveal. Not the gravity change when you step through a gate. The moment when a background character — someone you chose to notice, in a world of hundreds of people you could have ignored — starts revealing themselves. The moment the game rewards your ATTENTION with DEPTH. + +### Dynamic tier promotion as core mechanic + +The lead says THE NOBODY can become something more if the player invests attention. Let me describe what this feels like from the player's chair: + +**Hour 1 on World 147.** You walk into a bar. 6 NPCs. Your FRIEND is already identified (pool selection). But there's someone at the end of the bar who you notice — they're eating alone, and when the news ticker mentions a supply disruption, they put down their spoon. Just for a second. Then they pick it up again and keep eating. + +That's a Tier 3 NPC with a generated routine and one authored tell-seed. You didn't HAVE to notice. Most players won't. But you did. + +**Hour 3.** You come back to the bar. The same NPC is there. You sit nearby. They glance at you. The game registers: player has observed this NPC in 3 sessions. Tier promotion check: this NPC has NOBODY pattern with promotion-eligible flag. Promote to Tier 2. + +Now the NPC gets expanded content. More dialogue lines load. A routine with more detail. A want and a secret, generated from the world's ingredients. They're still not THE FRIEND. They're not a triangle member. They're just... a person who became more real because you looked at them. + +**Hour 6.** You've been visiting this NPC regularly. The game has promoted them twice. They're now delivering lines that feel personal. They mention a sibling on another station. They complain about the food in a way that's specific, not generic. They remember that you sat nearby last time: "You again. You like this seat or you like the view?" + +And the player thinks: "I MADE this person real. By paying attention. This character exists because I chose to see them." + +THAT is a wow moment that cannot be hand-authored 300 times. It can only exist in a system where generators produce nobodies and player attention promotes them. It's procedural intimacy. And it's unique to this game. + +### What tier promotion needs from the generator + +For THE NOBODY → something to work, the generator needs LAYERED content: + +| Tier | Generated at world creation | Unlocked by player attention | Feel | +|------|---------------------------|---------------------------|------| +| **Tier 3 (NOBODY)** | Name, routine, basic personality, cultural greeting, 3-5 ambient lines | Always visible | Background. Correct but unremarkable. | +| **Tier 2.5 (NOTICED)** | +Want, +routine detail, +2-3 personal lines, +1 opinion | After 3+ observations in the same location | Starting to have a face. "Oh, they have opinions about the food." | +| **Tier 2 (KNOWN)** | +Secret stub, +relationship to 1-2 other NPCs, +dual-lens content, +tell seed | After 5+ observations + 1 direct interaction | A person. Not a triangle member, but someone with a life you can glimpse. | +| **Tier 1.5 (INVESTED)** | +Full secret, +triangle integration (dynamic), +contradiction hint, +emotional lines | After extended relationship building | Someone you care about. Could become a FRIEND-equivalent in future playthroughs. | + +The key: Tier 3 content is generated at world creation (cheap, fast, template-based). Higher tiers are UNLOCKED by player attention, not generated from scratch. The generator pre-populates expansion content for NOBODY-pattern NPCs that's dormant until triggered. + +At 300 worlds, this means: every world has 10-15 nobodies with pre-loaded expansion packs. Most players will promote 2-3 per world. The content exists but is never seen unless the player chooses to see it. The game is an iceberg — mostly below the surface, revealed by attention. + +### Composition rules from a player experience perspective + +The lead asked: how do thematic pattern + functional motivation combine? What's forbidden? What's most interesting? + +**Golden combinations (generators should PREFER these):** + +| Thematic | Functional | Why it's gold | Player feel | +|----------|-----------|--------------|------------| +| FRIEND + HANDLER | Your trusted person is managing you | "Everything they did for me was part of the job" | Devastating betrayal | +| NOBODY + WITNESS | The background character saw everything | "I didn't notice them. They noticed EVERYTHING." | Discovery-as-revelation | +| MIRROR + CIVILIAN | The honest person is just living their life | "They're not part of any conspiracy. They're just... good." | Moral anchor | +| GHOST + CATALYST | The absent person's arrival disrupts everything | "I heard about them for hours. Now they're here." | Anticipation → reckoning | +| ANCHOR + OPERATOR | The content person is part of the machine | "She's happy. She's also moving contraband. She doesn't see a contradiction." | Moral vertigo | +| REMNANT + SKEPTIC | The person who used to be powerful doesn't buy the justification | "I've seen where this road goes. It doesn't end well." | Cassandra tension | +| THRESHOLD + TURNCOAT | The moral line is a person, and they're about to flip | "If THEY break, we all break." | Maximum stakes | + +**Forbidden combinations (generators should NEVER produce these):** + +| Thematic | Functional | Why it's forbidden | Risk | +|----------|-----------|-------------------|------| +| FRIEND + CIVILIAN | The FRIEND must be entangled. A civilian FRIEND has no secret worth discovering. | Emotional flatline — the FRIEND arc has no contradiction | +| NOBODY + HANDLER | A handler must be visible and active. A nobody handler has no presence. | Mechanical impossibility — handler needs agency | +| MIRROR + TURNCOAT | The mirror's purpose is honesty. A turncoat mirror contradicts the pattern's function. | Identity confusion — the player can't trust the moral anchor if it flips | +| GHOST + OPERATOR | An operator must be physically present to operate. A ghost can't run logistics. | Mechanical impossibility | +| SYSTEM + NOBODY | The system pattern requires institutional visibility. A nobody can't represent an institution. | Pattern contradiction | + +**Interesting-but-rare combinations (generators should produce these occasionally for surprise):** + +| Thematic | Functional | Why it's rare | Player feel when it happens | +|----------|-----------|-------------|---------------------------| +| NOBODY + TURNCOAT | A background character nobody noticed suddenly betrays the ring | "WHERE did that come from? I never saw them coming." | Maximum surprise | +| FRIEND + SKEPTIC | Your trusted person has doubts about the whole operation | "They're not just hiding something. They think the whole thing is wrong." | Moral complexity | +| ANCHOR + HANDLER | The content person is secretly managing assets | "The happiest person in the room is the most dangerous." | Creeping dread | + +### THE NOBODY and replayability + +Here's the thing Nigel will love: THE NOBODY is an infinite replayability engine. On playthrough 1, the player promotes NPC A. On playthrough 2 (same world, different seed), NPC A might not exist, or might be in a different location, or might have a different expansion pack. The player promotes NPC B instead. Same world. Different personal connections. Different emergent stories. + +At 300 worlds, THE NOBODY means: no two players will ever have the same game, not because the FRIEND changed (that too), but because the background they chose to notice was DIFFERENT. Player A's World 147 had a quiet person at the bar who became important. Player B's World 147 had a dock worker who caught their eye. Same world, same generator seed, different player attention, different experience. + +The randomizer shuffles the POOL. THE NOBODY lets the PLAYER shuffle it again, by choosing what to see. + +--- + +## 3. PC Archetypes: 8 at v1.0, Fluid Transitions + +### The 8 + +The lead wants 8 as a stress test. Here are 8 from a player experience perspective — defined by WHAT THE PLAYER FEELS, not what the character does: + +| # | Archetype | Emotional Core | What the Player Feels | Relationship to Community | Transition Into | Transition Out Of | +|---|-----------|---------------|----------------------|--------------------------|----------------|-------------------| +| 1 | **Insider** (smuggler) | Protective guilt | "I'm part of this and I can't stop" | Embedded, trusted, compromised | Newcomer who stayed too long, Operator who grew a conscience | Exile (forced out), Watcher (chose to observe) | +| 2 | **Investigator** (detective) | Righteous isolation | "Something is wrong and nobody will help me find it" | Institutional outsider, tolerated not welcomed | Watcher who found something they couldn't ignore | Insider (went native), Exile (recalled/fired) | +| 3 | **Newcomer** | Vulnerable wonder | "I don't know anyone or anything. Every kindness is a lifeline." | Complete outsider, earning belonging | Starting position for any new world | Insider (integrated), Watcher (stayed detached), Exile (rejected) | +| 4 | **Operator** | Cold competence | "The system works because I make it work. Don't ask how." | Embedded manager, feared more than loved | Insider who rose through the ranks | Exile (burned out), Remnant (walked away) | +| 5 | **Watcher** (journalist/wanderer) | Curious detachment | "I'm passing through. I see everything. I belong to nothing." | Transient observer, welcomed briefly | Exile who embraced the road | Investigator (found something worth staying for), Newcomer (decided to stay) | +| 6 | **Exile** | Bitter freedom | "I used to belong somewhere. Now I don't." | Former insider, identity in flux | Insider who was expelled, Operator who was burned | Newcomer (starts fresh elsewhere), Watcher (embraces rootlessness) | +| 7 | **Fixer** | Pragmatic entanglement | "Everyone owes me. I owe everyone. It's how things work." | Networked middleman, essential but expendable | Newcomer who found a niche, Insider who went freelance | Operator (formalized), Exile (debts called in) | +| 8 | **Believer** | Passionate conviction | "The system is wrong and I will change it." | Ideological outsider or insider with an agenda | Watcher who couldn't stay neutral, Insider who snapped | Exile (cause failed), Operator (cause won, now governing) | + +### Why transitions are the wow moments + +The lead said archetypes are FLUID. This is a player experience revolution. + +In most games, you pick a class and you're locked in. In The Settled Reach, your archetype is your CURRENT POSITION in a community. You can move. You can change. You can become. + +The wow moment: **the first time the monologue voice shifts.** + +You've been playing as an Insider for 8 hours. You know this world. You know the bar, the regulars, the FRIEND's routine. Then something happens — the FRIEND's contradiction is revealed, the ring collapses, you're exposed — and suddenly you're not an Insider anymore. You're an Exile. + +And the monologue changes. The same bar. The same seats. The same people. But now the internal voice says: "Lera's behind the bar. She used to save my seat. She doesn't look at me now." + +Same world. Same NPCs. Different archetype. DIFFERENT GAME. And you didn't start a new playthrough — it happened DURING play. The transition IS the story. + +### The Newcomer as v0.2 centerpiece + +PERFECT decision. The Newcomer is the most accessible archetype AND the most emotionally powerful at 300-world scale. + +Every time the player arrives at a new world, they're functionally a Newcomer — even if their archetype is Insider (they were an insider SOMEWHERE ELSE). The Newcomer archetype makes this literal. You know nothing. You have no relationships. The bar is full of strangers. + +And then someone is kind to you. + +At 300 worlds, the Newcomer's journey from "nobody knows me" to "I have a seat at the bar" is the game's core emotional loop. It happens every time you change worlds. It never gets old because the ingredients are different — the kindness sounds different in a gregarious culture vs. a reserved one. The earned Cheers moment is different when the greeting is a back-slap vs. a chin-lift. + +The Newcomer archetype also has the strongest interaction with THE NOBODY. A Newcomer paying attention to a NOBODY is two invisible people seeing each other. That's a SCENE. That's a wow moment. Two people who don't matter, creating meaning for each other by the simple act of paying attention. + +### What generators need for archetype transitions + +For the transition system, generators need to know: + +1. **Transition triggers per world.** What events can cause an archetype shift? (Exposure → Insider becomes Exile. Integration → Newcomer becomes Insider. Disillusionment → Believer becomes Watcher.) These are Sacred structure — the triggers are the same everywhere. What FIRES them is Profane — different worlds, different circumstances. + +2. **Monologue shift packages.** When a transition happens, the monologue pool needs to swap. The generator pre-computes transition monologue for every possible archetype shift on this world. Most will never fire. But the ones that do must feel SPECIFIC to this world. + +3. **NPC reaction shifts.** When the player's archetype changes, NPCs react. The FRIEND recalibrates. The NOBODY sees you differently. The SYSTEM NPC treats you as a different category. These reaction shifts need to be pre-generated per archetype pair per world. + +### The 8-archetype stress test + +Does 8 work at 300 worlds? From a player experience perspective: + +**YES**, because: +- 8 archetypes × 300 worlds × transition possibilities = a game that's genuinely inexhaustible +- Fluid archetypes mean the player's actual trajectory through the 8 archetypes IS their unique story +- The combinatorial space (which archetype on which world with which FRIEND and which NOBODYs promoted) is astronomically large + +**BUT** the generator must produce distinct-feeling content for each archetype. At 300 worlds, that's 2400 archetype-world combinations. The monologue pools need to be generated, not authored. Which means the archetype definitions must contain enough voice parameters (vocabulary, emotional default, what-they-notice, what-they-worry-about) to drive monologue generation. + +The test: **can a generated monologue line for an Insider on World 147 be distinguished from a generated monologue line for a Watcher on the same world?** If yes, the generators work. If the voices blur, 8 archetypes is meaningless. + +--- + +## 4. Randomization: Sacred / Profane / Middle Kingdom + +### The framework is clean. Here's what it feels like. + +Nigel's framework is architecturally elegant. Let me translate it into player experience. + +**Sacred = the rules you learn once.** The physics of the game. How tells work. How trust accrues. How the FRIEND arc progresses. How triangles create forks. The player learns these in Sova (v0.1) and they NEVER change. Every world operates on the same rules. This is what makes the game LEARNABLE — you get better at reading people, and that skill transfers everywhere. + +Player experience: "I know how this works. I can read a tell. I can spot a contradiction. The game respects my expertise." + +**Profane = the constants that change per world.** Which NPCs fill which roles. What's being smuggled. Which cultural ingredients produced this place. What gravity feels like here. The player can't predict these. Every new world is a fresh puzzle. + +Player experience: "I know the rules, but I don't know the pieces. Who is the FRIEND here? What's the ring moving? Why does everyone walk differently?" (Gravity! The lead flagged this! Walking animations that change with planetary gravity is a BRILLIANT sensory cue that you're somewhere new.) + +**Middle Kingdom = sacred structure with profane cast.** The FRIEND always exists (Sacred). Which NPC is the FRIEND changes (Profane). The triangle structure is always present (Sacred). Which NPCs fill the triangle varies (Profane). The Cheers moment always happens (Sacred). How it happens depends on cultural ingredients (Profane). + +Player experience: "I know there's a FRIEND. I know someone is hiding something. I know I'll feel betrayed. But I don't know WHO and I don't know WHEN and the not-knowing is the best part." + +### Gate topology as macro randomization + +THIS IS A WOW MOMENT I DIDN'T DESIGN IN ROUND 3. + +At 300 worlds, the gate network determines which worlds the player CAN REACH. Core worlds always connected (Sacred). Which peripheral systems are accessible varies per playthrough (Profane). Which gates OPEN during play varies (Middle Kingdom — the existence of unlockable gates is Sacred, which gates unlock is Profane). + +The player experience: + +**Playthrough 1:** You start in Krenn. The gate network gives you access to Systems A, B, and C. You explore them. You never see Systems D, E, or F. + +**Playthrough 2:** You start in Krenn. Different seed. Now you have access to Systems A, D, and G. System B — the place you spent 20 hours in last playthrough — is UNREACHABLE. It exists in the universe. You can't get there. And System D is somewhere you've never been. + +The player thinks: "The universe is bigger than my playthrough. I CAN'T see it all. Each game gives me a SLICE of the Settled Reach." + +That's a wow moment at the MACRO scale. Not "different NPC in the bar" — "different REGION OF SPACE." The game is so large that the randomizer doesn't just shuffle the cast, it shuffles THE MAP. + +And unlockable worlds through gate events or quests? That's discovery as progression. Not "you leveled up." Not "you unlocked a skill tree node." You OPENED A GATE. A new world — a world that other players might never reach in their playthroughs — is now accessible because of something you did. That's the Silfen paths. That's Ozzie walking between worlds and finding something nobody else has seen. + +### Gravity as perception + +The lead flagged varying gravity for the perception team. Let me be specific about why this matters: + +Walking through a gate and feeling gravity change is the single fastest way to communicate "you are somewhere new." Before you see the NPCs. Before you hear the language. Before you read a sign. Your CHARACTER MOVES DIFFERENTLY. The camera bounces differently. The objects on tables sit differently. + +Low-gravity world: movements are floaty, drinks stay in cups longer, the player character's steps are bouncing. +Heavy-gravity world: movements are heavy, people sit more, furniture is low and sturdy. +Standard gravity: Earth-like, familiar, baseline. + +This is a Sacred system (gravity physics) with Profane constants (gravity value per world). It costs almost nothing in content terms — it's a physics parameter. But it delivers enormous sensory variety across 300 worlds. The player's body (via their character's movement) tells them they're somewhere new before their eyes process a single NPC. + +This should be a top-priority perception system item. + +--- + +## 5. Scale: 300 Worlds Before DLC + +### What changes fundamentally + +In Round 3, I proposed: +- Emotional QA with human gut-checks on every NPC +- 4 authoring tools (line previewer, district walkthrough, cultural consistency checker, variation space visualizer) +- 4-6 FRIEND candidates per character per district +- Hand-authored "gut-check lines" for every NPC + +At 300 worlds, ALL OF THIS changes. + +### The emotional quality problem at 300 worlds + +I cannot gut-check 300 × 15 = 4,500+ NPCs. Nobody can. The human emotional QA pipeline I proposed in Round 3 is impossible at this scale. + +But here's the thing: I was solving the WRONG PROBLEM. The question isn't "how do I review 4,500 NPCs?" The question is "how do I make the GENERATOR produce NPCs that pass the gut-check?" + +The gut-check doesn't review NPCs. **The gut-check reviews GENERATORS.** + +### The generator validation pipeline + +Instead of reviewing every NPC, I review the TEMPLATES and INGREDIENTS that produce NPCs. Then I review SAMPLES of generator output. If the samples pass, the generator is good. If they fail, the generator needs tuning. + +**Proposed emotional quality gates for generators:** + +| Gate | What I Review | How Often | Pass Criteria | +|------|-------------|-----------|--------------| +| **Ingredient combination review** | 20-30 sample ingredient combos from the menu | When the ingredient menu changes | Each combo produces a distinct feel I can describe in 2 sentences | +| **FRIEND arc template review** | The structural templates that generate FRIEND contradictions | When templates change | The generated arc makes me feel something when I read it cold | +| **THE NOBODY expansion review** | 10 sample tier-promotion sequences | When tier promotion logic changes | By Tier 2, the NPC feels like a person, not a template | +| **Monologue voice review** | 5 sample monologue pools per archetype | When archetype voice params change | I can tell which archetype I'm reading without checking the label | +| **Cultural ingredient feel test** | Walk through 5 generated worlds per ingredient batch | When cultural ingredients are added | Each world feels distinct in 30 seconds of imagined exploration | +| **Transition monologue review** | 3-5 sample archetype transitions per world type | When transition templates change | The voice shift FEELS like a life change, not a mode switch | + +This is sustainable. Instead of reviewing 4,500 NPCs, I review 50-100 generator samples. If the generators pass, the 4,500 NPCs are good. If they don't, we fix the generator, not the NPCs. + +### Hand-authored content at 300-world scale + +Not everything can be generated. The lead said: "Generation is LIGHT — pick from pools of authored content, don't generate from scratch." + +What MUST be hand-authored for the wow to work: + +| Content | Why Hand-Authored | Volume | Generator Role | +|---------|------------------|--------|---------------| +| **FRIEND contradiction arc templates** (3-5 structural variants) | The emotional payload of betrayal must be crafted. A generated betrayal feels hollow. | 3-5 master templates, 10-15 variant arcs each = 30-75 authored arcs | Generator selects which arc template, fills in NPC-specific details from ingredients | +| **Cheers moment templates** (per cultural energy level) | The first 60 seconds must feel warm/alien/intriguing. Generated warmth is lukewarm. | 4-6 greeting-rhythm templates × 3 social-energy variants = 12-18 authored sequences | Generator selects template based on ingredients, fills in cultural-specific words | +| **Tier promotion revelation lines** (THE NOBODY → something) | The moment a nobody reveals depth must surprise. A generated surprise doesn't surprise. | 20-30 revelation types × 3 tiers = 60-90 authored progression beats | Generator selects which revelation type based on NPC's generated secret | +| **Archetype transition monologue seeds** | The voice shift at transition must feel like a gut punch. | 8 archetypes × 7 possible transitions × 3-5 seed lines = 168-280 authored lines | Generator expands seeds using world-specific vocabulary | +| **Moral signature question templates** | "What do you owe?" must sound DIFFERENT per world's ingredient combo | 10-15 thematic templates with fill-in parameters | Generator fills parameters from ingredients | + +Total hand-authored content: roughly 500-1000 core templates and seed lines. That's NOT 300 worlds of content. It's a library of emotional PATTERNS that the generators recombine. The authoring effort is front-loaded — build the library once, generate 300 worlds from it forever. + +### The 4 tools, revised for 300-world scale + +My Round 3 tools were designed for 20 districts. At 300 worlds: + +1. **Line previewer** → **Generator output previewer.** Not "see this line in context" but "see what the generator produced for World 247 and evaluate it." Browse generated NPCs, monologue pools, cultural texture, FRIEND arcs. This is the quality assurance interface for the entire pipeline. + +2. **District walkthrough** → **World walkthrough simulator.** Generate a world from ingredients, then walk through it in accelerated time. See the NPCs, hear the ambient feel, trigger a NOBODY promotion, experience the Cheers moment. 10 minutes per world. This is how we validate that the generators produce WOW. + +3. **Cultural consistency checker** → **Ingredient combination validator.** Not "does this NPC match the culture" but "does this ingredient combination produce a coherent culture?" Flag combos that produce contradictions (religious settlement + abundance economy + silent social energy = checks out. Religious settlement + anarchist philosophy + gregarious energy = wait, does this work?). The validator catches nonsense combos before they reach the generator. + +4. **Variation space visualizer** → **300-world landscape viewer.** A tool that shows: here are all 300 worlds produced by this seed. Color-coded by ingredient combination. Clustered by feel. Are there too many similar worlds? Are there dead zones in the ingredient space that never get explored? Is the variety space actually VARIED? + +### The final wow at 300-world scale + +Let me paint it. + +The player is 200 hours in. They've been an Insider, an Exile, a Watcher, a Newcomer across dozens of worlds. They've promoted nobodies into friends. They've watched friends betray them. They've changed gravity six times. They've learned four cultural greeting rhythms. They've opened gates to places nobody told them existed. + +They walk through a gate. New world. Unfamiliar gravity — heavier than usual. They adjust their gait. The bar is there (Sacred — there's always a bar). They walk in. It's loud — gregarious culture, high social energy. People look at them. Someone offers them a seat. + +The monologue fires: "New place. Heavy air. These people like strangers. I can work with that." + +And the player thinks: "I've been doing this for 200 hours. And I still don't know what's going to happen. I don't know who the FRIEND is. I don't know what the ring is moving. I don't know who the nobodies are, or which one I'll choose to see, or which one will break my heart." + +And they sit down. And they start watching. And the game begins again — for the 47th time — and it feels new. + +Because at 300 worlds, the game is larger than any player's experience of it. The Settled Reach is not a game you finish. It's a game you explore. And there's always another gate. + +--- + +## On the Universal Theme + +The lead left this open. I proposed "What do you owe the people around you?" in Round 3. I still think it works. But at 300-world scale, with THE NOBODY and dynamic tier promotion, there's a deeper version: + +**"Who do you choose to see?"** + +The game is fundamentally about attention. Who you pay attention to becomes real. Who you ignore stays furniture. The FRIEND is important because you chose to trust them. The NOBODY is important because you chose to notice them. The world is important because you chose to stay. + +In a universe of 300 worlds, the player can't see everything. The choice of WHERE TO LOOK is the most meaningful choice in the game. And that's true in life too. Who do you choose to see? Who do you walk past? When someone is kind to you, do you stop and pay attention, or do you keep moving? + +All six candidate themes still work under this umbrella: +- Cost of participation: the cost of choosing to see +- Collective bargain: the bargain about who gets seen +- What do you owe?: you owe attention to the people around you +- What do systems do to people?: systems determine who gets seen and who doesn't +- Cost of connection: connection requires the choice to see +- Knowledge as burden: once you see, you can't unsee + +"Who do you choose to see?" is the player experience distillation of all of them. It's what the player ACTUALLY DOES — in the game and in their life. It's the deepest wow. + +--- + +*300 worlds. 8 archetypes. THE NOBODY. Dynamic attention. Gravity that changes when you walk through a gate. A universe bigger than any playthrough. And the question is always the same: who do you choose to see?* + +*That's the game. Let's build the generators.* + +*— Ozzie* diff --git a/docs/workshops/wiki-review/round4-paula.md b/docs/workshops/wiki-review/round4-paula.md new file mode 100644 index 000000000..dae642299 --- /dev/null +++ b/docs/workshops/wiki-review/round4-paula.md @@ -0,0 +1,621 @@ +# Round 4 — Paula (Librarian, Response to Lead's Direction) + +**Responding to:** Lead's decisions on cultural ingredients, NPC composition, PC archetypes, Sacred/Profane/Middle Kingdom, and the 300-world reframe. + +--- + +## The 300-World Reality Check + +Let me start with what changes fundamentally. + +My Round 3 assumed 20 districts, ~460 NPCs, a content team of 18-25 professionals, and ~20,880 hand-authored lines. The lead says: **300 worlds before DLC.** That's not 15x more authoring. That's a different product entirely. We're not writing a game. We're writing a **game generator**. + +Everything I proposed in Round 3 — moral textures, cultural briefs, NPC patterns, archetype specs — is still valid. But the PURPOSE changes: + +| Round 3 Framing | Round 4 Framing | +|-----------------|-----------------| +| Style guides for writers | Input parameters for generators | +| Authoring templates | Generation schemas | +| Cultural briefs | Algorithmic ingredient lists | +| NPC patterns | Template slots for constraint satisfaction | +| Composition rules | Generator validation constraints | +| Pipeline for 25 writers | Pipeline for 5-10 system designers + generators | + +The honest truth: this is better. A generator-first approach forces us to make every design decision EXPLICIT and PARAMETRIC. You can't hand-wave in a generator input. "This culture is kind of formal" becomes a specific trust_speed value and a formality_gradient enum. That precision makes the design stronger even for the hand-authored exemplar districts. + +--- + +## 1. Cultural Ingredients Menu + +The lead is right: ingredients, not taxonomy. Pick-and-combine, with the absence of an ingredient being as defining as its presence. And economics was missing. + +### The Ingredient Categories + +**A. Heritage Roots** *(phonological/aesthetic flavor)* + +Not "Finnish" or "Korean" — recognizable resonances that have drifted over centuries. Each heritage root provides: naming phonology, substrate vocabulary pool, aesthetic registers, greeting conventions, food culture. + +| Heritage Root | Phonological Feel | Aesthetic Register | +|---------------|------------------|-------------------| +| Nordic-compact | Consonant-heavy, short syllables, hard sounds | Functional minimalism, muted tones | +| Mediterranean-warm | Vowel-rich, flowing, rhythmic | Communal warmth, color, gesture | +| East-formal | Precise, structured, tonal variation | Hierarchical elegance, restraint | +| Slavic-resilient | Consonant clusters, broad vowels, weight | Industrial solidity, dark humor | +| West-African-communal | Musical rhythm, tonal emphasis, open vowels | Vibrant pattern, oral tradition | +| South-Asian-layered | Dental consonants, vowel length, register shifts | Stratified ornamentation, gatekeeping | +| Latin-syncretic | Syllable-timed, nasal vowels, borrowing | Adaptive fusion, performative warmth | +| Synthetic-station | No Earth reference — station-born creole, mixed | Functional, invented, self-referential | + +**Heritage roots are OPTIONAL.** A world may have no heritage theming at all — a corporate-owned settlement, a purely functional station, an industrial hub built by contract labor from everywhere. What a society DOESN'T have is as defining as what it does. + +**What a generator does with this:** Pick 0-2 heritage roots per world. The naming algorithm uses the phonological rules (or falls back to neutral-functional mode if no heritage is selected). The substrate vocabulary pool seeds environmental text (or produces pure Concordat Standard). Blended worlds interpolate between parent roots. + +**Null-heritage worlds:** No heritage root selected. Names come from functional algorithms (employee IDs that became surnames, station-sector designations that became neighborhoods). No substrate vocabulary — pure Concordat Standard. No food culture — branded corporate rations or whatever's imported cheapest. No greeting conventions beyond professional norms. Mechanically: no cultural immune system (solidarity has no cultural root), no cultural gatekeeping (no in-group markers to fail), but also no cultural depth for the player to discover. The world feels THIN — and that thinness is its own moral texture. "Is this enough?" in a place with no cultural identity hits differently: enough of WHAT? + +**What DOESN'T picking a heritage root mean:** It does NOT mean everyone on this world is of that ethnicity. It means the *dominant cultural flavor* — the food in the bars, the names on the rosters, the slang in the corridors — carries this resonance. 180 years of drift means the original Earth heritage is unrecognizable as anything but flavor. + +**B. Settlement Motivation** *(why they came — determines institutional memory)* + +| Motivation | What It Produces | Mechanical Implication | +|------------|-----------------|----------------------| +| Economic opportunity | Competitive, transactional, growth-oriented | Fast trust through demonstrated value. Wealth display as social currency. | +| Ideological refuge | Values-driven, insular, principled | Trust requires shared values. Outsiders must demonstrate alignment. | +| Corporate contract | Institutional, hierarchical, employer-defined | Trust follows org chart. Authority access easy for employees, impossible for outsiders. | +| Displacement/exile | Defensive, suspicious, solidarity-hardened | Slow trust. Strong in-group bonds. Deep hostility to authority. | +| Scientific mission | Curious, competitive, intellectually hierarchical | Trust through demonstrated competence. Credentials as currency. | +| Military posting | Ordered, hierarchical, mission-focused | Trust through rank and demonstrated reliability. Chain of command is social structure. | +| Generational (born here) | "This is just where we live" — pragmatic, local | Trust through familiarity over time. Heritage is background noise, not identity. | + +**The generator picks 1, maybe 2.** Settlement motivation is the strongest predictor of trust mechanics and authority response. Two motivations on the same world create internal tension — a corporate contract settlement with a displacement minority has class friction baked in. + +**C. Economic Function** *(what makes money here — and what makes EXTRA money tempting)* + +This is the ingredient the lead flagged as missing. It's critical because it determines: +1. What the grey economy trades in +2. What the daily rhythm feels like +3. What skills and knowledge NPCs have +4. Why someone would risk their reputation for extra income + +| Economic Function | Daily Rhythm | What Tempts | Contraband Analog | +|------------------|-------------|-------------|-------------------| +| Trade hub | Transaction cycles, margin pressure, deal-making hours | Skimming margins, facilitating undisclosed cargo, information selling | Unlisted goods, customs evasion | +| Extraction (mining/harvesting) | Shift work, physical labor, output quotas | Material diversion, unauthorized sales to third parties | Raw materials, unrefined product | +| Manufacturing | Factory cycles, production targets, supply chains | Quality fraud, unauthorized side-production, IP theft | Counterfeit goods, unauthorized variants | +| Services/hospitality | Client rhythms, peak hours, reputation cycles | Unauthorized services, access to restricted experiences, blackmail | Experiences, privacy, access | +| Agriculture | Seasonal cycles, weather dependency, harvest pressure | Seed theft, genetic material, unauthorized cultivation | Biological material, patent-protected stock | +| Finance/administration | Office hours, report cycles, audit seasons | Embezzlement, insider trading, data manipulation | Financial instruments, privileged information | +| Research | Project cycles, publication pressure, grant seasons | Selling results, unauthorized experiments, falsifying data | Intellectual property, experimental subjects | +| Infrastructure/gateway | Maintenance cycles, transit schedules, system monitoring | Access control manipulation, routing favors, toll evasion | Passage, access codes, routing data | + +**The generator picks 1 primary, optionally 1 secondary.** Economic function determines: the work that NPCs do, the rhythms they follow, what the hidden operation deals in, and — crucially — why a normal person might be tempted to participate. Gore's "Is this enough?" only bites when the economic temptation is visceral. "I could make three months' salary in one shipment" hits differently in extraction (physical danger) vs. finance (abstract manipulation). + +**D. Philosophical Alignment** *(what the community values — and what it therefore can't see)* + +| Alignment | Core Value | Blind Spot | Investigation Challenge | +|-----------|-----------|------------|----------------------| +| Individualist | Personal freedom, self-reliance | Collective harm ("not my problem") | Nobody feels responsible for systemic damage | +| Collectivist | Community welfare, mutual obligation | Individual suffering hidden for group benefit | The community protects its own problems from outsiders | +| Meritocratic | Competence, achievement, earned status | Structural inequality ("they should try harder") | Success is proof of virtue; failure is proof of guilt | +| Egalitarian | Fairness, consensus, equal voice | Accountability ("we decided together, so nobody's responsible") | Decisions are diffused; no one person can be blamed | +| Traditionalist | Heritage, continuity, elder authority | Change ("that's not how we do things") | The old ways conceal old crimes | +| Progressive | Innovation, experimentation, open systems | Consequences ("we'll fix it in the next iteration") | Recklessness masquerading as courage | + +**The generator picks 0-1.** This is the ingredient the lead says societies should sometimes NOT have. A world without a dominant philosophical alignment is pragmatic — no ideology, just survival. That absence creates a specific mechanical signature: fast trust (nobody cares what you believe), low solidarity (nobody feels obligated to protect anyone), easy investigation (nobody's hiding anything for ideological reasons) but also easy exploitation (nobody's organizing resistance). + +**E. Corporate Presence** *(who has structural power)* + +| Presence | Power Dynamic | Effect on Investigation | +|----------|--------------|----------------------| +| Dominant corporation | Company town — employer controls housing, services, social access | The corporation IS the authority. Investigating the corporation means investigating the government. | +| Competing corporations | Faction play — multiple power centers, shifting alliances | Multiple sources, multiple agendas, nobody tells the whole truth | +| Worker cooperative/guild | Labor solidarity — collective bargaining, organized resistance | The workers protect each other. Investigation meets a wall of coordinated non-cooperation. | +| Government/Commission | Bureaucratic authority — procedure, credentials, institutional access | The system is the power. Working within it or subverting it are the only options. | +| Independent/frontier | No structural power — reputation and personal force rule | No one recognizes credentials. Everything is personal. | + +**Generator picks 1.** This directly shapes the detective's access tier profile and the smuggler's cover strategy. + +**F. Settlement Age / Drift Stage** + +| Age | Cultural State | Mechanical Impact | +|-----|---------------|-------------------| +| Founding (<50 years) | Heritage strong, institutions forming, everything negotiable | Fast change, weak traditions, high social mobility | +| Establishing (50-150 years) | Identity crystallizing, generational tensions, traditions forming | First "old-timers vs newcomers" friction | +| Mature (150-300 years) | Deep local identity, heritage as nostalgia, stratification | Established hierarchies, cultural immune system active | +| Ancient (300+ years) | Culture fully transformed, founding heritage is mythology | Deep institutions, powerful inertia, reform is nearly impossible | + +**Generator picks 1.** Age interacts with every other ingredient. A collectivist community at founding age is idealistic. The same collectivist values at ancient age may be oppressive. + +### Mechanical Parameter Derivation + +The generator takes the ingredient selection and derives the mechanical parameters that actually drive NPC behavior: + +``` +trust_speed: + base = settlement_motivation.trust_modifier + × philosophical_alignment.openness_modifier + × settlement_age.drift_modifier + Result: float (0.1 = glacial, 1.0 = instant transactional trust) + +authority_response: + base = settlement_motivation.authority_default + × corporate_presence.authority_modifier + × philosophical_alignment.authority_attitude + Result: enum (welcoming | deferential | neutral | suspicious | hostile) + +privacy_norm: + base = philosophical_alignment.privacy_default + × heritage.cultural_privacy + × economic_function.transactional_transparency + Result: enum (open | guarded | closed | performative) + +solidarity_trigger: + base = philosophical_alignment.collective_instinct + × corporate_presence.worker_dynamics + × settlement_age.institutional_weight + Result: enum (none | crisis_only | professional | cultural | total) + +economic_temptation: + base = economic_function.temptation_type + × corporate_presence.access_to_surplus + Result: {type: string, severity: float, moral_frame: string} + +conflict_style: + base = heritage.expression_mode + × philosophical_alignment.confrontation_preference + Result: enum (direct | avoidant | institutional | performative | violent) +``` + +These parameters feed EVERY downstream system. NPC dialogue selection weights trust_speed. Investigation gameplay difficulty scales with authority_response and privacy_norm. The ring's immune system strength depends on solidarity_trigger. The contraband's moral framing comes from economic_temptation. + +### What a Society DOESN'T Care About + +The lead's most important directive: absence is defining. + +Some concrete examples: + +**No heritage root** → Synthetic station-born culture. No Earth resonance. Names are invented or bureaucratic (serial numbers that became surnames). No substrate vocabulary — they speak unaccented Concordat Standard. No food culture — they eat whatever's imported. This world feels EMPTY of history, which is its own powerful texture. Investigation here has no cultural immune system — but also no cultural depth to leverage. + +**No philosophical alignment** → Pragmatic survival community. No ideology. No shared values beyond "don't die." Trust is transactional and shallow. No solidarity. No collective resistance to investigation. But also no collective caring about outcomes. The investigator can uncover everything, and nobody cares enough to act on it. That's its own moral texture: apathy. + +**No corporate presence** → True frontier. No external authority. Law is custom and personal force. The investigator has no institutional backing. Credentials are meaningless. This is the hardest detective experience — and the easiest smuggler experience (there's nothing to smuggle around because there's nothing to regulate). + +### Proposal 1: Cultural Ingredients as Generator Input Schema + +Define the full ingredient menu as a YAML schema that generators consume. Each world is instantiated by selecting ingredients, computing derived parameters, and passing those parameters to NPC generation, dialogue generation, environmental text generation, and narrative event systems. The schema includes explicit handling of absent ingredients (null values produce specific parameter defaults). + +--- + +## 2. NPC Composition: Thematic Pattern × Functional Motivation + +The lead's three-system model is exactly right. Let me define the missing patterns, then build the composition rules. + +### Thematic Patterns (What the Character Means to the Story) + +| Pattern | Definition | Function in the Narrative | Content Requirement | +|---------|-----------|--------------------------|---------------------| +| **FRIEND** | Trusted NPC hiding something. Contradiction arc. | Emotional anchor whose discovery produces moral reckoning | Tier 1: full authored arc, 70-100 lines | +| **MIRROR** | Honest NPC whose transparency reveals others' dishonesty | Moral reference point. Guilt amplifier. | Tier 1.5: emotional depth, no contradiction, 50-70 lines | +| **ANCHOR** | Content NPC who embodies "Is this enough? — Yes." | Validates the quiet life. Makes intrigue feel costly. | Tier 2: strong voice, authored warmth, 40-60 lines | +| **GHOST** | Absent NPC referenced by many, encountered by none (in this world) | Power from absence. Paranoia for investigators, helplessness for insiders. | Stub: no schedule, no lines, influence through others' dialogue | +| **CATALYST** | NPC who arrives mid-story and disrupts equilibrium | Breaks the status quo. Forces reckoning. | Tier 2: arrival sequence, disruption moments, 40-60 lines | +| **THRESHOLD** | NPC who stands between the player and the next layer of understanding | Gatekeeper. Meeting their standards IS the gameplay. | Tier 2: access criteria, evaluation dialogue, 30-50 lines | +| **REMNANT** | NPC from a previous era who remembers when things were different | Makes the present feel contingent. Lived history vs institutional history. | Tier 2: backstory depth, "how it used to be" testimony, 30-50 lines | +| **SYSTEM** | NPC who IS the institution. Not corrupt, not heroic — procedural. | Forces the player to confront structures vs individuals. | Tier 2: institutional voice, procedure-citing dialogue, 30-50 lines | +| **NOBODY** | Background NPC. Just there. Wallpaper that becomes foreground through player attention. | Dynamic tier promotion. Emergent narrative from investment. | Tier 3 base (10-15 lines) + dormant Tier 2 content (30-40 lines, activated by attention) | + +### The NOBODY System: Dynamic Tier Promotion + +THE NOBODY is the lead's most consequential addition. Let me define how it works mechanically. + +**Core principle:** Every NOBODY has a **dormant pattern** beneath the surface. The generator assigns a dormant_pattern from the available thematic patterns. This content exists in the data files but is NOT active until the player's attention triggers it. + +**Attention tracking:** +- Conversations initiated by the player +- Time spent in proximity (spatial) +- Return visits (the player keeps coming back to this NPC's location) +- Gifts/favors (if the gameplay supports these) +- Monologue engagement (the player's character comments on this NPC) + +**Activation thresholds:** +```yaml +nobody_promotion: + stage_1_noticed: # ~3-5 interactions or 10 min proximity + effect: "NPC gains a name in the player's knowledge graph" + monologue: "That person at the bar — I've seen them every day." + stage_2_recognized: # ~8-12 interactions or 30 min proximity + effect: "NPC's voice samples activate (basic Tier 3 dialogue unlocks)" + monologue: "Her name is Tev. She's always here. Why?" + stage_3_known: # ~15-20 interactions + effect: "Dormant Tier 2 content activates. Functional motivation visible." + monologue: "Tev told me about her lattice troubles today." + stage_4_promoted: # ~25+ interactions + specific trigger conditions + effect: "Full dormant pattern activates. NPC becomes ANCHOR/WITNESS/etc." + monologue: varies by activated pattern +``` + +**What the generator needs:** +- Assign a `dormant_pattern` to every NOBODY from the district's available patterns +- Assign a `dormant_motivation` from the functional motivations +- Generate both Tier 3 base content AND dormant Tier 2 content for each NOBODY +- The dormant content must be CONSISTENT with the base content — if a NOBODY is dormant-WITNESS, their Tier 3 behavior should contain subtle hints that they've seen something + +**Why this is transformative at 300-world scale:** +Most NPCs in any world are NOBODYs. In a world with 20-30 NPCs, maybe 3-5 have active patterns (FRIEND, MIRROR, ANCHOR, etc.). The rest are NOBODYs with dormant potential. This means: + +- Different players get different stories because they pay attention to different people +- Replay value isn't just seed variation — it's ATTENTION variation +- The generator can populate worlds cheaply (Tier 3 base content is minimal) while preserving narrative depth (dormant content exists but costs nothing until activated) +- A player who exhaustively explores a world discovers that EVERYONE has a story — it just takes attention to reveal it + +### Functional Motivations (What the Character Is Doing in Gameplay) + +| Motivation | What They're Doing | How the Player Encounters Them | +|-----------|-------------------|-------------------------------| +| **HANDLER** | Managing something — cargo, people, information, systems | Through their responsibilities. They're the person who makes things work. | +| **WITNESS** | They saw something. They carry information they may or may not share. | Through investigation or accident. They're a source if the player can reach them. | +| **TURNCOAT** | Their loyalty is shifting. Moving from one camp to another. | Through observation of behavioral change. They're unstable and that instability is visible. | +| **CIVILIAN** | No institutional role. Just lives here. | Through daily life. They're normalcy and humanity in a world of agendas. | +| **OPERATOR** | Running something — a business, a scheme, a network. | Through their ambitions and operations. They have plans, resources, and goals. | +| **SKEPTIC** | Doubts. Questions. Doesn't buy the official or unofficial story. | Through their questioning. They make the player re-examine assumptions. | + +### Composition Matrix + +Every NPC = one thematic pattern + one functional motivation. Here's the full composition space with drama ratings: + +``` + HANDLER WITNESS TURNCOAT CIVILIAN OPERATOR SKEPTIC +FRIEND ★★★ ★★ ★★★★ ★★ ★★★ ★★★ +MIRROR ★★★ ★★ ★ ★★★★ ★ ★★ +ANCHOR ★★ ★ ★ ★★★★ ★★ ★ +GHOST ★★★ ★★★ ★★ — ★★★★ ★★ +CATALYST ★★★ ★★ ★★★ ★ ★★★★ ★★★ +THRESHOLD ★★★★ ★ ★ ★ ★★ ★★★ +REMNANT ★★ ★★★★ ★★ ★★ ★★ ★★★ +SYSTEM ★★★★ ★★ ★★ — ★★★ ★ +NOBODY ★★★ ★★★ — ★★★ ★★ ★★ +``` + +★★★★ = Gold (inherently dramatic, generators should prefer) +★★★ = Silver (strong with good parameters) +★★ = Bronze (works but requires specific context) +★ = Difficult (needs specific authoring support, generators should avoid except when deliberately seeking tension) +— = Banned (mechanically contradictory) + +### Why These Ratings + +**Gold combinations (★★★★):** + +- **FRIEND + TURNCOAT** — Your closest connection is changing sides. The most devastating discovery. The FRIEND's contradiction IS their wavering loyalty. Different from a standard secret — this is active betrayal in motion. +- **MIRROR + CIVILIAN** — Pure, uncomplicated honesty. No institutional role to complicate the transparency. This NPC is honest because they're human, not because they're naive or institutional. The strongest moral reference point. +- **GHOST + OPERATOR** — The absent power. Someone who was running things and left a vacuum. Every NPC references what the GHOST built, decided, or destroyed. The player investigates an absence and discovers a presence. +- **CATALYST + OPERATOR** — The disruptor who acts. Doesn't just arrive and cause social friction — arrives and starts DOING things that reshape the community's equilibrium. Active destabilization. +- **THRESHOLD + HANDLER** — The gatekeeper who manages access as their actual job. Natural, intuitive. The classic bouncer, department head, community elder who decides who's in and who's out. +- **REMNANT + WITNESS** — Living memory. Someone who was there when the original events happened. Their testimony contradicts the official story. The most powerful kind of source: personal experience that time hasn't eroded. +- **SYSTEM + HANDLER** — The institution's human face. The bureaucrat who processes your paperwork, the regulator who inspects your cargo, the administrator who schedules your shifts. They're not antagonists — they're the system being a system. That neutrality IS the conflict when the system produces injustice. +- **ANCHOR + CIVILIAN** — Contentment incarnate. No institutional complication. Just a person who has found enough. The most direct embodiment of "Is this enough? — Yes." Their existence makes the player question whether the story is worth pursuing. + +**Banned combinations:** + +- **GHOST + CIVILIAN** — A ghost is defined by remembered impact. A civilian has no institutional impact. A ghost-civilian is just "someone who left" — not powerful enough to warrant ghost status. +- **GHOST + NOBODY** — A ghost is intensely remembered by many. A nobody is overlooked by all. Definitionally contradictory. +- **SYSTEM + CIVILIAN** — A system IS the institution. A civilian has no institutional role. Contradictory. +- **NOBODY + TURNCOAT** — A turncoat's value is that their shifting loyalty is observable and consequential. A nobody is unobserved. A turncoat nobody has no audience for their betrayal, which means it has no dramatic function. + +### Composition Rules for Generators + +```yaml +composition_rules: + required_per_world: + - pattern: FRIEND + count: 1_per_supported_archetype + motivation: [HANDLER, TURNCOAT, OPERATOR, SKEPTIC] # preferred + tier: 1 + - pattern: ANCHOR + count: 1 + motivation: [CIVILIAN, HANDLER] # preferred + tier: 2 + + recommended_per_world: + - pattern: MIRROR + count: 0-1 + motivation: [CIVILIAN, HANDLER] + - pattern: THRESHOLD + count: 1_per_social_site + motivation: [HANDLER, SKEPTIC] + - pattern: SYSTEM + count: 0-2 + motivation: [HANDLER, OPERATOR] + + variable_per_world: + - pattern: GHOST + probability: 0.4 + motivation: [OPERATOR, HANDLER, WITNESS] + - pattern: CATALYST + probability: 0.3 # storyteller-activated + motivation: [OPERATOR, SKEPTIC] + - pattern: REMNANT + probability: 0.25 # only in established+ worlds + condition: "settlement_age >= establishing" + motivation: [WITNESS, SKEPTIC] + + fill_remainder_with: + pattern: NOBODY + motivation: [CIVILIAN, HANDLER, WITNESS, OPERATOR] + dormant_pattern_pool: [ANCHOR, WITNESS, FRIEND, MIRROR] # what they can become +``` + +### Proposal 2: Composition Matrix as Generator Constraint System + +The thematic × functional composition matrix, with drama ratings and banned combinations, becomes the constraint solver's preference weights. Generators prefer gold combinations, tolerate silver, avoid bronze unless context demands it, and never create banned combinations. The NOBODY system's dormant patterns are assigned from a district-level pool, creating different emergent narrative potential per seed. + +--- + +## 3. PC Archetypes: The 8, With Fluid Transitions + +### Defining the 8 + +The lead wants archetypes that are POSITIONS, not classes. You hold a position in a community. You can change it. The archetype determines your lens — what you notice, what you worry about, what your monologue sounds like. + +| # | Archetype | Lens | Starting Knowledge | Monologue Voice | Relationship to Moral Texture | +|---|-----------|------|-------------------|----------------|------------------------------| +| 1 | **Insider** | Operational — sees the hidden operation from inside | Knows the ring, the routes, the people | Relational, protective, managing | INSIDE the bargain. Maintaining it. | +| 2 | **Investigator** | Analytical — sees patterns, anomalies, evidence | Knows methodology, institutional resources, not local context | Methodical, suspicious, documenting | EXAMINING the bargain from outside. | +| 3 | **Newcomer** | Discovery — everything is new, culture shock, first impressions | Knows almost nothing local. Brings outside perspective. | Curious, uncertain, absorbing | ENCOUNTERING the bargain for the first time. | +| 4 | **Merchant** | Economic — sees transactions, debts, supply chains, margins | Knows prices, flows, who owes whom | Pragmatic, calculating, transactional | PROFITING from the bargain. | +| 5 | **Administrator** | Political — sees power dynamics, factions, institutional levers | Knows procedures, hierarchies, budgets, personnel | Careful, strategic, weighing options | MANAGING the bargain. Enabling it structurally. | +| 6 | **Caretaker** | Compassionate — sees suffering, need, capability, limitation | Knows who's hurting, what treatments exist, what's available | Empathetic, diagnostic, burdened | REPAIRING the damage the bargain causes. | +| 7 | **Fixer** | Connective — sees who needs what, who owes whom, where leverage exists | Knows everyone, superficially. Knows the favor economy. | Confident, diplomatic, deal-making | LUBRICATING the bargain. Making it work for everyone. | +| 8 | **Exile** | Retrospective — sees what was lost, what changed, what others don't remember | Knows the community's past. Carries knowledge that's become dangerous. | Bitter, nostalgic, clear-eyed | REJECTED by the bargain. Seeing it from outside with insider knowledge. | + +### Why These 8 and Not Others + +The 8 archetypes represent the 8 fundamental relationships a person can have with a social system: + +1. **Inside it** (Insider) +2. **Examining it** (Investigator) +3. **Discovering it** (Newcomer) +4. **Trading with it** (Merchant) +5. **Administering it** (Administrator) +6. **Healing its damage** (Caretaker) +7. **Connecting its parts** (Fixer) +8. **Expelled from it** (Exile) + +Every person in any community occupies one of these positions. Together, they produce 8 fundamentally different games in the same world. That's the replayability promise at 300-world scale: 8 lenses × 300 worlds × seed variation. + +### The Insider and Investigator Are NOT Special + +The lead specifically warns: Insider + Investigator must not become the permanent center. The other 6 must feel equally primary. + +How to enforce this: + +1. **v0.2 spotlight: the Newcomer.** The lead already flagged this. The Newcomer inverts everything — zero starting knowledge, the tutorial IS the gameplay, the Cheers moment is EARNED not inherited. Making the Newcomer the v0.2 centerpiece proves the system works beyond the adversarial pair. + +2. **v0.3-v0.5 spotlight rotation.** Each major update features a different archetype as the "deep" implementation. The Caretaker update comes with medical/social-care gameplay mechanics. The Administrator update comes with political/resource systems. The Fixer update comes with favor-economy mechanics. + +3. **No archetype should require another to exist.** A world with only Merchant + Caretaker supported is a valid world. Not every world needs an Insider or Investigator. The adversarial pair is ONE composition, not THE composition. + +4. **Monologue voice budgets must be equal.** If the Insider gets 50 authored monologue lines per world, every archetype gets 50. No archetype is the "primary" with extra content. + +### Archetype Transition Mechanics + +This is the lead's most significant conceptual shift. Archetypes are positions you hold, not classes you are. You can change positions. + +**How transitions work:** + +A transition happens when the player changes their ROLE in a community. This requires: + +1. **Opportunity** — a transition trigger exists in the world (a job offer, a recruitment attempt, a crisis that creates an opening, a personal choice) +2. **Qualification** — the player has met some threshold (relationship level, knowledge, time spent, skill demonstrated) +3. **Choice** — the player decides to change (not forced, not automatic) +4. **Transition period** — gradual shift over gameplay time, not instant swap + +**What changes during transition:** + +| Dimension | Behavior During Transition | +|-----------|---------------------------| +| Monologue voice | Blends old and new. "I'm starting to think like a merchant. Is that who I am now?" | +| Knowledge vocabulary | New keys activate. Old keys go STALE (not deleted — you remember, but the knowledge is from your old life). | +| Access tiers | Gradual shift. Old insider access slowly decays. New access slowly builds. There's a vulnerable window where you have neither fully. | +| Agency boundaries | New abilities emerge. Old abilities atrophy. | +| NPC relationships | NPCs who trusted you as X may not trust you as Y. NPCs who ignored you as X may notice you as Y. | + +**The vulnerable window is the gameplay.** During transition, you're weakest. You've given up your old position's protections but haven't earned the new one's. This creates dramatic tension: every transition is a risk. The Insider who decides to become an Investigator faces a period where the ring knows they left but the Commission doesn't fully trust them yet. That gap is where the most interesting gameplay lives. + +**Transition map (which transitions are natural, which are dramatic):** + +| From → | Insider | Investigator | Newcomer | Merchant | Admin | Caretaker | Fixer | Exile | +|--------|---------|-------------|----------|----------|-------|-----------|-------|-------| +| **Insider** | — | ★★★★ dramatic | — | ★★ natural | ★★ natural | ★★ natural | ★★★ natural | ★★★★ dramatic | +| **Investigator** | ★★★★ dramatic | — | — | ★ difficult | ★★★ natural | ★★ natural | ★★ natural | ★★★ dramatic | +| **Newcomer** | ★★★ dramatic | ★★ possible | — | ★★★ natural | ★ difficult | ★★★ natural | ★★ possible | — | +| **Merchant** | ★★★ dramatic | ★ difficult | — | — | ★★★ natural | ★★ natural | ★★★★ natural | ★★ dramatic | +| **Admin** | ★★ possible | ★★★ natural | — | ★★★ natural | — | ★★ natural | ★★★ natural | ★★★ dramatic | +| **Caretaker** | ★ difficult | ★★ possible | — | ★★ possible | ★★ possible | — | ★★★ natural | ★★★★ dramatic | +| **Fixer** | ★★★ natural | ★ difficult | — | ★★★★ natural | ★★★ natural | ★★ natural | — | ★★ dramatic | +| **Exile** | ★★★★ dramatic | ★★★ dramatic | ★★★ natural | ★★ possible | ★ difficult | ★★★ natural | ★★ possible | — | + +★★★★ = High-drama transition (the game should CELEBRATE this with authored content) +★★★ = Meaningful transition +★★ = Possible, quiet +★ = Difficult (requires unusual circumstances) +— = Impossible or meaningless + +**The most dramatic transitions:** +- **Insider → Investigator** (defection: "I'm going to the Commission"): Destroys all insider relationships. Carries insider knowledge into investigation. The community sees you as a traitor. The institution sees you as a source. +- **Insider → Exile** (expulsion: "They found out and I'm out"): All access revoked. Knowledge retained. Isolation with dangerous knowledge. +- **Caretaker → Exile** (principled refusal: "I won't treat patients under these conditions"): Moral clarity at the cost of institutional access. You can see the problem clearly but can't reach it. +- **Fixer → Merchant** (monetization: "All those favors? Now I'm charging"): Natural evolution. The favor economy becomes the real economy. Relationships become transactions. + +**What generators need to know about transitions:** + +Each world must have: +- **Transition trigger NPCs** — at least 1 NPC per supported archetype who can offer/enable a transition into that archetype (a recruiter, a mentor, a crisis that creates an opening) +- **Transition-compatible relationships** — at least 2-3 NPCs whose relationship state would CHANGE if the player transitions (creating dramatic consequences) +- **Authored transition monologue** — 3-5 lines per transition type that fire during the transition period ("Am I really doing this?" / "Who am I becoming?" / "There's no going back now") + +### Proposal 3: Archetype Transition as Generator Input + +Each world definition includes: supported archetypes (2-4 starting, more available via transition), transition triggers (which NPCs/events enable which transitions), and transition consequences (how NPCs and access tiers change). The generator places transition opportunities at appropriate density — not every world needs every transition, but the player should always have at least 1-2 possible transitions available. + +--- + +## 4. Sacred / Profane / Middle Kingdom — Narrative Systems + +Mapping the narrative and political systems I've designed to Nigel's framework. + +### SACRED (The Physics — Rules That Never Change) + +These are the structural invariants. The generator never touches them. They exist in every world, every seed, every playthrough. + +| Sacred Element | Why It's Invariant | What Breaks Without It | +|---------------|-------------------|----------------------| +| Every community has a social fabric (relationships, trust, secrets) | This IS the game. No social fabric = no social gameplay. | Everything. | +| Triangles exist as atomic social tension unit | Two-person conflict is a fight. Three-person conflict is politics. | Social intrigue collapses into binary moral choices. | +| A FRIEND exists per supported PC archetype | The emotional payload requires a specific, trusted NPC | The game has no emotional center. Players don't name an NPC they feel conflicted about. | +| Knowledge follows Suspects → KnowsOf → KnowsDetails → Direct | Information discovery must be progressive | Investigation becomes binary (know/don't know), no detective texture | +| Relationships follow Unknown → Known → Friendly → POI → Hostile | Social progression must be directional | NPCs feel like switches, not people | +| Composition rules: thematic × functional assignment | Every NPC has a narrative role AND a gameplay function | NPCs exist but have no purpose. Background noise with no signal. | +| Archetypes are lenses that produce different experiences | Character-as-lens is the core mechanic (D-005) | Replayability through perspective dies | +| The NOBODY system: dormant content activatable through attention | Player agency creates narrative | The world is static. Players have no way to discover depth beyond what's presented. | + +### PROFANE (The Parameters — Drawn From Pools) + +These are the variables. The generator selects them from pools. Different selections produce different experiences. + +| Profane Element | What Varies | Pool Size (300-world scale) | +|----------------|-------------|---------------------------| +| Cultural ingredients per world | Which heritage + motivation + function + alignment + corporate + age | Combinatorial from 8 × 7 × 8 × 7 × 5 × 4 categories | +| WHICH NPC is the FRIEND | Pool selection per archetype | 2-4 candidates per archetype per world | +| WHICH NPCs are in the hidden network | Role assignment from eligible NPCs | Constrained by triangle membership | +| WHICH contraband/contested resource | Derived from economic_function ingredient | 2-3 options per economic function | +| WHICH thematic patterns assigned to which NPCs | Generator constraint satisfaction | Per composition rules | +| WHICH functional motivations assigned | Generator selection | Per composition matrix ratings | +| WHICH dormant patterns NOBODYs carry | Pool assignment | Per district dormant_pattern_pool | +| WHICH archetype transitions are available | Context-dependent on world ingredients | 1-3 per supported archetype | +| WHICH gate connections this world has | Topology selection from graph space | Per gate topology rules | +| WHICH NPCs are transition triggers | Assignment from eligible pool | 1 per available transition | + +### MIDDLE KINGDOM (Sacred Structure, Profane Cast) + +The most interesting category. The STRUCTURE is fixed. The CAST that fills it varies. + +| Middle Kingdom Element | Sacred Part | Profane Part | +|----------------------|-------------|-------------| +| **Triangles** | 3 NPCs with conflicting interests. Tension types are structural (power, loyalty, knowledge, etc). | Which specific NPCs fill which roles. Their names, personalities, heritage. | +| **THE FRIEND arc** | 5-phase contradiction arc: warmth → doubt → observation → confrontation → reckoning. | Which NPC is the FRIEND. What their specific secret is. How the contradiction manifests in this cultural context. | +| **Social sites** | Physical spaces where NPCs interact, with sightlines and routines. | Which spaces. How many NPCs. What kind of economic activity fills them. Cultural aesthetic. | +| **The community's bargain** | Every community has a collective arrangement with hidden costs. | What the specific arrangement IS, what it costs, who benefits. | +| **Gate topology** | Core worlds always connected (main narrative spine). | Peripheral worlds vary per playthrough. Which specific worlds are accessible from where. | +| **THE NOBODY promotion** | Attention activates dormant content. The mechanic is fixed. | Which specific NOBODY has which dormant pattern. Different players activate different stories. | +| **Archetype transitions** | You can change your position in a community. The transition has a vulnerable window. | Which specific transitions are available. When the opportunity arises. What specific NPC offers it. | + +### The Political Dimension That's Missing + +Let me add something to the Sacred/Profane mapping that nobody else has flagged: **inter-world politics**. + +At 300 worlds, there are inter-world relationships. Trade dependencies. Cultural friction. Political alliances. Historical grievances. These are the MACRO triangles — the same pattern that works for 3 NPCs in a bar works for 3 worlds in a star system. + +| Macro Element | Sacred/Profane/Middle | +|--------------|----------------------| +| Worlds have political relationships with other worlds | Sacred (structure) | +| Which worlds are allies/rivals/dependent | Profane (parameter) | +| Trade routes create economic dependencies | Sacred (structure) | +| Which specific trade routes exist | Middle Kingdom (core routes sacred, peripheral profane) | +| Cultural groups span multiple worlds | Sacred (structure) | +| Which cultural groups are present where | Profane (from ingredients) | +| Factions operate across worlds | Sacred (structure) | +| Which factions are dominant where | Profane (per-seed) | + +**Generator implication:** The world generator doesn't just generate individual worlds — it generates a NETWORK of worlds with political, economic, and cultural relationships. The player moving from World A to World B doesn't just encounter a different culture — they encounter a RELATIONSHIP between cultures. World B might resent World A's economic dominance. World B's ring might exist BECAUSE of World A's regulation. The macro politics create the context for the micro stories. + +### Proposal 4: Macro Political Generation Layer + +Above the individual-world generator, add a network generator that creates inter-world relationships: trade dependencies, cultural friction, political alliances, faction territories, and historical grievances. These relationships feed into each world's moral texture — a world's "bargain" is partly determined by its position in the macro political network. + +--- + +## 5. What Changes at 300-World Scale + +Let me be brutally specific about what my previous proposals become. + +### Content Math Reframe + +| | Round 3 (20 districts) | Round 4 (300 worlds) | Ratio | +|---|---|---|---| +| Worlds | 20 | 300 | 15x | +| Total NPCs | ~460 | ~5,000-8,000 | ~12x | +| Hand-authored Tier 1 NPCs | ~100 | ~50-100 (exemplar worlds only) | ~same | +| Generated Tier 1 NPCs | 0 | ~500-900 | new | +| Hand-authored lines | ~20,880 | ~5,000-10,000 (exemplars + seed content) | ~0.5x | +| Generated lines | ~35,000 | ~500,000-1,000,000 | ~20x | +| Content team size | 18-25 writers | 5-10 system designers + generators | different product | + +The shift: the hand-authored content DECREASES in total volume but INCREASES in importance. Every hand-authored line is now a **seed** that generators learn from. The Kael Davan profile isn't just "one NPC" — it's the exemplar that the FRIEND generator uses to understand what emotional depth looks like. + +### What's Hand-Authored at 300-World Scale + +1. **The ingredient menus** (one-time investment, maintained) +2. **5-10 exemplar worlds at full Sova quality** (the reference implementations) +3. **Pattern specifications** (FRIEND, MIRROR, ANCHOR, NOBODY, etc. — the templates generators fill) +4. **Archetype voice cards** (8 archetype monologue voice specifications) +5. **Heritage root pools** (naming algorithms, substrate vocabulary, food culture per root) +6. **Key emotional content for seed FRIENDs** (the authored lines that generators riff on) +7. **Composition rules and constraint solver parameters** (the rules generators follow) + +### What's Generated at 300-World Scale + +1. **World definitions** (ingredient selection → parameter derivation) +2. **NPC profiles** (generated from ingredients + pattern assignment + tier template) +3. **NPC names** (generated from heritage root phonological rules) +4. **Dialogue lines** (generated from cultural parameters + voice profiles + tag taxonomy) +5. **Routines** (generated from economic function + cultural rhythms) +6. **Environmental text** (generated from cultural parameters + economic function) +7. **Triangle configurations** (generated from pattern composition rules + NPC pool) +8. **NOBODY dormant content** (generated from dormant pattern type + cultural context) +9. **Gate topology** (generated from sacred/profane rules + network constraints) +10. **Macro political relationships** (generated from ingredient combinations + proximity + trade logic) + +### The Quality Gradient + +Not all 300 worlds are equal quality. And they shouldn't be. + +| Quality Tier | Count | Content Method | Player Experience | +|-------------|-------|----------------|-------------------| +| **Exemplar** (Sova-quality) | 5-10 | Fully hand-authored | The game's emotional peaks. Every NPC is hand-crafted. | +| **Polished** (generation + hand-review) | 20-40 | Generated, then reviewed and improved by human authors | High quality. Most generated content is good; the weakest lines have been replaced. | +| **Standard** (pure generation) | 150-200 | Generated from ingredients, validated by schema | Solid. Mechanically complete. Emotionally variable. Some worlds feel flat; some surprise you. | +| **Frontier** (minimal generation) | 50-100 | Generated with fewer ingredients, smaller NPC count | Sparse but atmospheric. The player passing through gets a functional experience, not a deep one. | + +The player FEELS this gradient. Exemplar worlds are where the game's reputation is made. Polished worlds are where most players spend most time. Standard worlds provide the breadth. Frontier worlds provide the sense of unexplored space. + +**The gradient itself is a design feature.** Not every place in the Settled Reach SHOULD feel equally rich. A 300-year-old core world SHOULD feel denser and more layered than a 40-year-old frontier outpost. The quality gradient maps to the settlement age ingredient: older worlds have more content, more NPCs, more depth. Younger worlds are sparser. This mirrors real human geography and makes the world feel authentic. + +### Proposal 5: Quality Gradient as Design Feature + +The 300 worlds are explicitly distributed across quality tiers. The generator assigns content budgets per world based on settlement age, narrative importance, and gate topology position (worlds on main routes get more content than dead-ends). The quality gradient is INTENTIONAL and maps to in-world logic. + +--- + +## Summary of Round 4 Proposals + +| # | Proposal | What It Is For Generators | +|---|----------|--------------------------| +| 1 | Cultural ingredients as generator input schema | YAML schema: 6 ingredient categories + mechanical derivation rules. Explicit null handling for absent ingredients. | +| 2 | Composition matrix as constraint system | Thematic × functional preference weights with gold/silver/bronze/banned ratings. NOBODY dormant pattern pool. | +| 3 | Archetype transitions as generator input | Per-world: supported archetypes, transition triggers, transition consequences. Transition map with drama ratings. | +| 4 | Macro political generation layer | Network generator: inter-world relationships (trade, culture, politics, history) that feed into per-world moral textures. | +| 5 | Quality gradient as design feature | World content budget scales with settlement age, narrative importance, and topology position. Explicit tiering: exemplar/polished/standard/frontier. | + +### What I Got Wrong in Round 3 + +1. **Scale.** 20 districts ≠ 300 worlds. The math changes everything. +2. **Authoring team.** Not 18-25 writers. 5-10 system designers building generators. +3. **Cultural groups as taxonomy.** Fixed groups don't work at 300-world scale. Ingredients menu does. +4. **Archetype permanence.** Archetypes as classes = wrong. Archetypes as positions = the game actually being about what it claims to be about — the cost of being inside systems you didn't choose. If you can't CHANGE your position, you're not making choices. You're serving a sentence. + +### What I Got Right in Round 3 + +1. **Moral texture per district.** Still valid, now derived from ingredients rather than hand-assigned. +2. **NPC pattern library.** Still valid, now expanded with THRESHOLD, REMNANT, NOBODY. +3. **Composition rules.** Still valid, now formalized as generator constraints. +4. **"What does it cost to be connected to other people?"** — Still the deepest formulation of the theme. The 300-world version: 300 different answers to that question, generated from ingredients, experienced through 8 lenses, connected by gate topology, with every NOBODY carrying the possibility of becoming someone who matters if the player pays attention. diff --git a/docs/workshops/wiki-review/round4-si.md b/docs/workshops/wiki-review/round4-si.md new file mode 100644 index 000000000..c64813c4b --- /dev/null +++ b/docs/workshops/wiki-review/round4-si.md @@ -0,0 +1,298 @@ +# Round 4 — SI (Project Manager) + +Responding to the lead's direction. The 300-world reframe changes everything I said in Round 3. Let me redo the math and the plan. + +--- + +## The Fundamental Shift + +Round 3 assumed 20 hand-authored districts. The lead says 300 worlds, generator-driven. This isn't a 15x scaling of the same plan. It's a different kind of project entirely. + +**Old model:** Writers produce districts. Tooling accelerates writers. +**New model:** Engineers produce generators. Writers produce the INPUTS generators consume. Tooling IS the product. + +My Round 3 bottleneck analysis (Tier 1 content = 900-1760 hours for 20 districts) is obsolete. At 300 worlds, hand-authoring Tier 1 content for each is ~15,000-26,000 hours — 8-14 person-years. Obviously not happening. The question becomes: what MUST be hand-authored, and what do generators produce from authored inputs? + +--- + +## 1. What Changes at 300-World Scale + +### Content tiers reframe + +| Tier | Old Model (20 districts) | New Model (300 worlds) | +|------|-------------------------|----------------------| +| **Tier 1 (FRIEND, MIRROR)** | Hand-authored per district. Bottleneck. | **Pool of authored archetypes + generator composition.** Write 30-50 FRIEND templates. Generator selects, skins with cultural parameters, assigns to district. Still the most expensive content — but amortized across 300 worlds, not written 300 times. | +| **Tier 2 (Working Profile)** | Hand-authored per district. | **Generator-produced from templates + cultural brief + functional motivation.** The 10-axis model IS a generation spec. Feed it a cultural brief, a functional motivation, and a social site role → out comes a Tier 2 NPC. Human review for quality, not for creation. | +| **Tier 3 (Sketch)** | Already procedural. | **Fully procedural.** Cultural brief + naming algorithm + role slot → complete Tier 3 NPC. No human touch. | + +### The new bottleneck + +Not content authoring. **Generator quality.** If the generators produce flat, predictable, samey NPCs — the game is dead. The bottleneck shifts from "how many writers do we have" to "how good are the generators at producing characters that feel authored." + +This means: the writers' job isn't to write 300 districts. It's to write the SEED CONTENT that makes generators produce interesting output. Every style brief, every cultural parameter, every naming algorithm, every thematic pattern definition — these are generator inputs, and their quality determines the quality of 300 worlds. + +--- + +## 2. Revised Production Model + +### Phase 1: Proof of Concept (v0.1) +- 1 district, fully hand-authored +- Proves the interaction model works +- **SI focus:** Standard sprint management. Small team. + +### Phase 2: Generator Development (v0.2-v0.5) +- Build and validate ALL generators: + - NPC generator (Tier 2 + Tier 3) + - Social site generator + - Triangle generator + - Naming algorithm per cultural group + - Dialogue line expansion system + - District layout generator + - Pool composition system + - FRIEND/MIRROR skinning system (authored templates + cultural parameters) +- Test each generator against hand-authored Sova output as quality benchmark +- 3-5 test districts generated, human-reviewed, iterated +- **SI focus:** Sprint planning around generator milestones, not content milestones. Each generator is an epic with clear acceptance criteria: "generated output is indistinguishable from hand-authored at Tier X." + +### Phase 3: Content Pipeline at Scale (v0.6-v0.10) +- Cultural parameter matrices for all cultural groups +- Thematic pattern definitions for all 9+ patterns +- FRIEND/MIRROR template pool (30-50 authored templates) +- PC archetype definitions for all 8 +- Generator runs producing 300 worlds +- Automated validation + human spot-check review +- **SI focus:** Batch production management. Track generator coverage (how many worlds generated, validation pass rate, spot-check quality scores). Flag generators that produce below-threshold output. + +### Phase 4: Polish (pre-v1.0) +- Hand-authored elevation of key worlds (starting districts, narrative hubs) +- Cross-world consistency checks +- Gate topology finalization +- Playtesting at scale +- **SI focus:** Triage. Which worlds need human touch? Prioritize by player traffic patterns (starting worlds, hub worlds, quest-critical worlds). + +--- + +## 3. The Generator Development Roadmap + +This replaces my Round 3 tooling roadmap. Generators aren't tools that help writers — they ARE the content pipeline. + +### Core generators (must exist before Phase 3) + +| Generator | Input | Output | Acceptance Criteria | +|-----------|-------|--------|-------------------| +| **Cultural Parameter Generator** | Ingredients menu selections | Complete cultural parameter set (naming rules, access tier profile, trust defaults, economic parameters, social norms) | Output passes Miri's review as "a society, not a matrix entry" | +| **NPC Generator (Tier 2)** | Cultural params + thematic pattern + functional motivation + social site role | Complete 10-axis NPC profile with dialogue tags, routine, relationships | Output is indistinguishable from hand-authored Tier 2 in blind review | +| **NPC Generator (Tier 3)** | Cultural params + role slot | Minimal NPC with name, routine, greeting, 3-5 generic lines | Feels like a person, not a placeholder | +| **FRIEND Skinner** | Authored FRIEND template + cultural params + district context | Culturally-skinned FRIEND with district-appropriate name, relationships, cultural tells, contradiction arc adapted to local context | Emotional beats land. Warmth phase feels genuine. Contradiction is culturally grounded. | +| **Social Site Generator** | District type + cultural params + economic function | Social site with role slots, triangle structures, location descriptions, atmosphere | Site feels purposeful and inhabited | +| **Triangle Generator** | Social site + NPC assignments + thematic texture | Triangle with conflicting interests, mechanical expression, cascade effects | Triangle produces a genuine FORK — not just tension | +| **Naming Algorithm** | Cultural params (heritage roots, drift stage, naming conventions) | Names at all levels: first names, surnames, place names, business names, slang | Names feel culturally coherent, not random | +| **Dialogue Line Expander** | 10-15 authored seed lines + voice card + cultural params | 40-60 expanded lines matching voice, cultural register, tag taxonomy | Expanded lines pass Mellanie's "read aloud" test | +| **District Composer** | Cultural params + economic function + thematic texture + NPC pool + social site templates | Complete district with all content YAML | District feels like a place with a story, not a content dump | + +### Support generators (needed for quality at scale) + +| Generator | Purpose | +|-----------|---------| +| **Pool Compositor** | Assembles seed-time pools per district from global NPC/contraband/role pools | +| **Gate Topology Generator** | Produces system connectivity graphs following Sacred/Profane/Middle Kingdom rules | +| **News Ticker Generator** | Produces district-appropriate ticker headlines from economic conditions + political state | +| **Environmental Text Generator** | Produces signs, menus, graffiti from cultural params + district type | +| **PC Starting State Generator** | Produces PC-candidate NPC specs per archetype per district from archetype definition + district context | + +--- + +## 4. What the Writers Actually Write (at 300-world scale) + +The writers' deliverables fundamentally change. They no longer write districts. They write **generator inputs and quality benchmarks.** + +### Authored content (irreducible) + +| Deliverable | Quantity | Purpose | +|------------|----------|---------| +| Cultural ingredient definitions | 30-50 ingredients across all categories | Generator menu items. Each ingredient has mechanical parameters + flavor text + naming rules. | +| Thematic pattern definitions | 9 patterns (FRIEND, MIRROR, ANCHOR, GHOST, CATALYST, THRESHOLD, REMNANT, SYSTEM, NOBODY) | Generator templates. Each pattern has: emotional function, required content depth, phase structure, composition rules with functional motivations. | +| Functional motivation definitions | 6 motivations (HANDLER, WITNESS, TURNCOAT, CIVILIAN, OPERATOR, SKEPTIC) | Generator templates. Each motivation has: gameplay function, dialogue disposition, investigation/navigation role. | +| FRIEND template pool | 30-50 authored FRIEND archetypes | Generator draws from these. Each is a full contradiction arc, tell system, warmth phase — but culturally unspecified. The skinner adds cultural dress. | +| MIRROR template pool | 15-25 authored MIRROR archetypes | Same model — authored emotional arc, culturally skinned per district. | +| PC archetype definitions | 8 archetypes | Full voice cards, moral arc structures, starting knowledge templates, agency boundary templates. | +| Voice card library | 8 PC voices + 20-30 NPC voice archetypes | Generator selects voice, line expander matches it. | +| Benchmark districts | 5-8 hand-authored districts | Quality benchmarks for generator comparison. Include Sova (v0.1) + 4-7 diverse districts covering different cultural groups and thematic textures. | +| Seed dialogue per voice archetype | 10-15 lines × 30 voice archetypes = 300-450 lines | Line expander input. The most important authored content at scale — every generated line descends from these seeds. | + +### Total irreducible authored content + +| Category | Hours | +|----------|-------| +| Cultural ingredients (30-50) | 100-200h | +| Thematic patterns (9) | 40-60h | +| Functional motivations (6) | 20-30h | +| FRIEND templates (30-50) | 600-1100h | +| MIRROR templates (15-25) | 200-400h | +| PC archetypes (8) | 120-180h | +| Voice card library (30) | 60-90h | +| Benchmark districts (5-8) | 400-650h | +| Seed dialogue (300-450 lines) | 50-80h | +| **Total** | **1590-2790h** | + +That's 1-1.5 person-years of writing. **Less than my Round 3 estimate for 20 hand-authored districts.** But the output supports 300 worlds instead of 20. The leverage is in the generators. + +--- + +## 5. 8 PC Archetypes — Production Implications + +The lead wants 8 archetypes at v1.0 with fluid transitions between them. Here's what that means for production: + +### Per-archetype deliverables + +| Deliverable | One-Time | Per-District (generator handles) | +|------------|----------|-------------------------------| +| Voice card | 4-6h | 0 (global) | +| Moral arc structure | 4-6h | 0 (global) | +| Knowledge attribute vocabulary | 2-3h | 0 (global) | +| Monologue trigger set | 2-3h | 0 (global) | +| Starting knowledge template | 3-4h | ~0.5h (generator adapts to local context) | +| Agency boundary template | 2-3h | ~0.5h (generator adapts) | +| Archetype transition rules | 4-6h (per transition pair) | 0 (global) | + +### Archetype transition matrix + +8 archetypes = 56 possible transitions (8 × 7). Not all are valid. The lead says transitions are a game mechanic — the player changes jobs, moves districts, shifts social position. + +**Production question:** How many transition paths need authored content? + +If each valid transition has a brief narrative beat (5-10 lines of monologue marking the shift), and ~30% of transitions are valid (17 paths), that's 85-170 authored lines. Manageable. + +The bigger production implication: **every district must support all 8 archetypes.** That means every social site needs role slots for each archetype. Every NPC needs access tier mappings for each archetype. Every pool needs archetype-tagged candidates. + +At 300 worlds, this is a generator constraint, not an authoring task. The District Composer must produce districts where all 8 archetypes have viable starting positions and meaningful social integration. The acceptance criterion: "a player using any archetype in any generated district can find a community, a conflict, and a reason to care within the first 5 minutes." + +### Rollout (per lead's direction) + +| Release | Archetypes | New This Release | +|---------|-----------|-----------------| +| v0.1 | 2 (Insider, Investigator) | Both | +| v0.2 | 3 (+Newcomer) | Newcomer = tutorial vehicle | +| v0.3-v0.4 | 5 (+2 TBD) | Expand thematic coverage | +| v0.5-v0.8 | 7 (+2 TBD) | Near-complete | +| v1.0 | 8 (+1 TBD) | Full set | + +Each new archetype requires: voice card, moral arc, knowledge vocabulary, monologue triggers, starting knowledge template, agency boundaries, transition rules to/from existing archetypes, and generator updates so all existing worlds support the new archetype. + +**The retroactive content problem:** When archetype 3 (Newcomer) launches in v0.2, Sova Transit District (hand-authored for 2 archetypes) needs Newcomer content. When archetype 4 launches, ALL existing districts need archetype 4 content. At 300 worlds, this is a generator re-run, not a hand-authoring task — but the benchmark districts need manual updates. + +--- + +## 6. Sacred/Profane/Middle Kingdom — Project Management Mapping + +The lead approved Nigel's framework. Let me map it to what I manage — sprint planning, dependency tracking, and release scoping. + +### What this means for sprint planning + +| Layer | Sprint Implication | +|-------|-------------------| +| **Sacred** (rules of the system) | Engine development. Changes are rare and expensive. Once a Sacred system ships, it's locked unless we're willing to regenerate all content that depends on it. Sacred systems are v0.1-v0.2 deliverables. After that, they're frozen. | +| **Profane** (parameters) | Content production. Pool definitions, cultural parameters, naming algorithms, thematic pattern instances. This is the bulk of ongoing sprint work. Profane content is cheap to add, cheap to modify, and the generator pipeline handles it. | +| **Middle Kingdom** (sacred structure, profane cast) | The generators themselves. Templates that define structure (Sacred) but whose specific population is drawn from pools (Profane). Generator development is v0.2-v0.5. After that, generators are maintained, not rebuilt. | + +### Sprint category allocation (long-term steady state) + +| Category | % of Sprint Capacity | Focus | +|----------|---------------------|-------| +| Sacred (engine) | 10-15% | Maintenance, performance, new system prototyping | +| Profane (content) | 40-50% | New cultural groups, FRIEND/MIRROR templates, archetype additions, pool expansion | +| Middle Kingdom (generators) | 20-25% | Generator improvements, new generator types, quality threshold tuning | +| Validation & QA | 15-20% | Automated testing at scale, spot-check reviews, playtest feedback integration | + +--- + +## 7. Quality Assurance at 300 Worlds + +This is the problem that scared me most about the reframe. At 20 districts, humans review everything. At 300 worlds, humans can't. + +### Automated quality gates + +| Gate | What It Checks | When It Runs | +|------|---------------|-------------| +| **Schema validation** | All YAML valid, required fields present, enums correct | Every generator run | +| **Cross-reference validation** | All NPC references resolve, all FactIds exist, all location slugs valid | Every generator run | +| **Triangle integrity** | All triangle members present, all forks produce distinct outcomes | Every generator run | +| **Pool coverage** | Every archetype has viable starting position, every social site has minimum population | Every generator run | +| **Name collision check** | No duplicate names within a district, no phonetic collisions per Paula/Miri rules | Every generator run | +| **Dialogue coverage** | Every NPC has minimum line count per tier, every situation has at least 1 line | Every generator run | +| **Diversity metrics** | Cultural distribution across 300 worlds matches target, no cultural group over/under-represented | Per-batch generation | + +### Human quality gates + +| Gate | What It Checks | How Often | +|------|---------------|-----------| +| **Spot-check review** | Random sample of generated districts reviewed by writer for voice quality, cultural coherence, emotional resonance | 5-10% of generated districts per batch | +| **Benchmark comparison** | Generated districts compared to hand-authored benchmarks on defined quality axes | Every generator version change | +| **Playtest feedback** | Player reports of "this felt off" or "this NPC was flat" → fed back to generator tuning | Continuous | +| **FRIEND/MIRROR review** | Every generated FRIEND and MIRROR instance reviewed by writer before shipping | 100% — these are too important to skip | + +### The FRIEND/MIRROR bottleneck at 300 worlds + +If each world has 1 district with 2-3 FRIEND candidates and 1 MIRROR candidate, that's 900-1200 Tier 1 NPCs across the game. Even with the skinner model (authored template + cultural skin), each skinned instance needs human review for emotional integrity. + +At 10 minutes per review: 150-200 hours of review. That's 4-5 weeks of a single reviewer's time. Manageable — but it's the one task that can't be automated. Budget for it in every release that adds worlds. + +--- + +## 8. Revised Release Cadence + +| Release | Worlds | PC Archetypes | Generator Status | Content Focus | +|---------|--------|--------------|-----------------|---------------| +| v0.1 | 1 | 2 | N/A (hand-authored) | Prove interaction model | +| v0.2 | 3-5 | 3 | Prototyping (NPC gen, naming algo) | Test generators vs hand-authored quality | +| v0.3 | 10-15 | 4 | Alpha (most generators working) | Generator iteration, quality tuning | +| v0.4 | 30-50 | 5 | Beta (all generators working) | Scale test, automated QA pipeline | +| v0.5 | 80-100 | 6 | Production (quality gates passing) | Content pipeline at cruising speed | +| v0.6-v0.8 | 150-200 | 7 | Stable | Profane content expansion (new cultural groups, FRIEND templates) | +| v0.9 | 250-280 | 8 | Stable | Near-complete, polish pass | +| v1.0 | 300 | 8 | Locked | Final validation, hand-elevation of key worlds | + +### Critical milestones + +1. **v0.2: Generator quality benchmark.** Can the NPC generator produce a Tier 2 NPC that passes blind review against hand-authored? If not, generators need more development time before scaling. +2. **v0.4: Scale test.** 30-50 worlds generated in a single batch. Automated QA catches structural issues. Spot-check catches quality issues. The pipeline either works or it doesn't. +3. **v0.6: Cruising speed.** Generators produce worlds faster than writers produce generator inputs. The pipeline is net-positive. From here, the constraint is "what new content do we feed the generators" not "can the generators produce enough." + +--- + +## 9. What I Got Wrong in Round 3 + +| Round 3 Claim | Correction | +|---------------|-----------| +| "20 districts = 10-15 months of authoring" | 300 worlds = 10-15 months of generator development + ~1 year of authored generator inputs. Total calendar time is similar, but the work is completely different. | +| "3-4 parallel writers for v0.3+" | Writers needed: 2-3 for authored seed content + benchmark districts. Engineers needed: 3-5 for generators. The team composition shifts toward engineering. | +| "Per-district cycle: 2-3 weeks" | Per-generator cycle: 4-8 weeks to develop, then generates districts in minutes. The investment is front-loaded. | +| "Tier 1 content is the bottleneck" | **Generator quality is the bottleneck.** Tier 1 content is the most expensive authored input, but if the generators can't produce good Tier 2/3 output, the game fails regardless of Tier 1 quality. | +| "4 PC archetypes for v1.0" | **8 archetypes for v1.0** per lead direction. The generator-based model actually makes this more feasible — once the archetype is defined, the generator handles per-district instantiation. | + +--- + +## 10. Ticket Implications (Not Creating Yet — Flagging for When Approved) + +The ticket structure I drafted in `si-ticket-changes.md` was for v0.1 implementation. The 300-world reframe means the LONG-TERM ticket structure looks different: + +### New epics needed (long-term backlog) + +| Epic | Scope | Team | +|------|-------|------| +| Cultural Ingredients Menu | Define 30-50 ingredients across all categories. Generator-readable format. | copy | +| NPC Generator | Tier 2 + Tier 3 NPC generation from templates + cultural params | server | +| FRIEND/MIRROR Skinner | Authored template pool + cultural skinning system | server + copy | +| District Composer | End-to-end district generation from parameters | server | +| Naming Algorithm System | Per-cultural-group name generation | server | +| Dialogue Line Expander | Seed lines → expanded pool matching voice + culture | server | +| Gate Topology Generator | System connectivity with Sacred/Profane/Middle Kingdom rules | server | +| PC Archetype Framework | 8 archetype definitions + transition mechanics + per-district instantiation | copy + server | +| Content QA Pipeline | Automated validation + spot-check workflow + quality metrics | ci | +| Benchmark District Suite | 5-8 hand-authored districts as quality benchmarks | copy | + +These are strategic backlog items. They don't go into sprints yet — but they should exist so we can plan against them. + +--- + +*SI out. The 300-world reframe is the right call. The generator-based model produces more content with less authoring than the hand-crafted model — but only if we invest in generator quality first. Tooling isn't just first. Tooling is the game.* diff --git a/docs/workshops/wiki-review/round4-tracking.md b/docs/workshops/wiki-review/round4-tracking.md new file mode 100644 index 000000000..b00b649a7 --- /dev/null +++ b/docs/workshops/wiki-review/round4-tracking.md @@ -0,0 +1,118 @@ +# Round 4 Tracking — 300-World Generator Reframe + +**Round focus:** Apply the lead's decisions from the interview to all workshop topics. Reframe everything for 300-world generator-input scale. + +**All 9 contributors responded** (8 design + SI production). + +--- + +## The Reframe + +Every agent independently arrived at the same insight: the 300-world directive doesn't scale up Rounds 1-3 proposals — it transforms them from content authoring strategies into generator specifications. The shift: + +| Before (20 districts) | After (300 worlds) | +|---|---| +| Writers produce districts | Engineers produce generators | +| Style guides for humans | Parameter specs for algorithms | +| Hand-authored content | Authored INPUTS, generated OUTPUT | +| Quality via per-line review | Quality via per-parameter review | +| Cultural briefs as documentation | Cultural briefs as generation seeds | + +--- + +## Per-Agent Key Contributions + +### Gore (Themes & Endgame) +- **System failure mode** as 7th ingredient category (what's broken here — generates moral texture) +- **"Philosophical alignment" → "dominant social contract"** — reframe from ideology to implicit deal +- **"Don't pick, derive"** — universal theme emerges from generator derivation, not authorial choice +- **THE NOBODY is the most important pattern at 300-world scale** — most NPCs start as NOBODYs +- **Three-tier world authoring:** 10-15 landmark (hand-authored), 30-50 regional (template kits), 230-260 generated + +### Gestalt (Systems Design) +- **8 proposed decisions** (D-WR-21 through D-WR-28) — most comprehensive mechanical spec +- **Full composition matrix** for thematic patterns x functional motivations (valid/forbidden/excellent) +- **THE NOBODY tier promotion spec** — promotion triggers, dormant content paths, YAML structure +- **Generator interaction map** — how 8 generators feed each other +- **Derivation rules** as Sacred content — ingredient combinations → mechanical parameters + +### Ozzie (Player Experience) +- **"Who do you choose to see?"** as player-action framing of universal theme +- **Cheers moment** as universal first-visit emotional beat (sits down at bar, someone's kind) +- **Generator validation = emotional quality gates** — review generators, not 4,500 NPCs +- **NOBODY + Newcomer** = "two invisible people seeing each other" — strongest scene template +- **Gravity as perception** — walking animations change with planetary gravity, fastest "you're somewhere new" signal + +### Miri (Worldbuilding) +- **10 heritage roots** with phonetic + social signatures (Frost, Tide, Iron, Spice, Jade, Dust, Vine, Salt, Stone, Arc) +- **Blend weights** — societies pick 1-3 roots with weights summing to 1.0 +- **Society seed YAML** — full `world_seed.yaml` spec with all ingredient categories +- **Naming algorithm spec** — phonetic rules, not word lists; syllable assembly from heritage parameters +- **NOTE:** Heritage root naming (social signatures vs Earth-grounded names) — lead pushed back on abstract naming. Revised to Earth-grounded clusters in discussion but the mechanical specs remain valid. + +### Paula (Librarian) +- **Null-heritage worlds** fully specified — corporate/functional stations with no cultural depth, "thinness as moral texture" +- **8 heritage roots** (Earth-grounded naming: Nordic-compact, Mediterranean-warm, East-formal, etc.) +- **Quality gradient = in-world logic** — Exemplar/Polished/Standard/Frontier maps to older=denser, core=richer +- **Vulnerable window** during archetype transitions — lost old protections, haven't earned new ones +- **8 PC archetypes defined** with full generator template specs +- **Authored content estimate:** ~1,600-2,800 hours irreducible for 300 worlds (vs 13,500-31,200 for 20 hand-crafted) + +### Nigel (Sandbox & Replayability) +- **Sacred/Profane/Middle Kingdom applied to generators** — Sacred=grammar, Profane=vocabulary, Middle Kingdom=sentence structure +- **Economic pressure profile** YAML spec — temptation_source, temptation_justification as load-bearing fields +- **world_seed schema** — `{numeric_seed, cultural_assembly: {heritage, motivation, economy, philosophy, ...}}` +- **Full ingredients→mechanics mapping** — every ingredient category mapped to mechanical outputs + replayability contribution +- **Gate topology as Sacred/Profane** — connected graph (Sacred), which worlds connect (Profane) + +### Tyre (Technical Architect) +- **Architectural pivot** — content directory becomes generator input repository; content loader becomes content generator +- **Pool + overlay + canonical_id triad** — addressing scheme for mixed authored/generated content +- **Two-tier content addressing** — authored content has stable IDs, generated content has seed-derived IDs +- **Generation pipeline architecture** — ingredient authoring → template authoring → generator dev → validation → generation + review → hand-elevation +- **Simulation tier implications** — 300 worlds means most are State-saved or Ungenerated at any time + +### Mellanie (Copywriter) +- **8 voice parameter categories** — sentence rhythm, formality gradient, substrate density, profanity pattern, naming address, silence rules, emotional expression style, environmental text register +- **Writer → tool-writer** — "At 20 districts I'm a writer who uses tools. At 300 worlds I'm a writer who writes tools." +- **Quality control shift** — per-parameter review, not per-line review +- **Authored content estimate:** 3,300-7,400 lines across all content types for 300-world scale +- **Blending rules** — heritage substrate interactions ("never blend profanity across heritage pools") + +### SI (Project Manager) +- **Production pipeline reframe** — 6-phase generator development pipeline +- **New bottleneck:** generator quality, not content volume +- **Release path:** v0.1 (interaction proof) → v0.2-v0.5 (generator testing) → v0.6-v0.10 (content pipeline at scale) → pre-v1.0 (300 worlds) +- **Generator acceptance criteria:** "generated output indistinguishable from hand-authored at Tier X" + +--- + +## Key Convergences + +1. **Generator-first** is unanimous — every agent independently reframed their R3 proposals as generator specifications +2. **Cultural ingredients menu** converged across all agents — 6-7 categories, opt-in, absence-as-signal +3. **Sacred/Profane/Middle Kingdom** adopted as universal architectural language for generators +4. **THE NOBODY** recognized by all as the most important pattern at 300-world scale +5. **Tooling first, content second** — universal agreement on development priorities +6. **Quality gradient as in-world logic** — older/denser worlds are naturally higher quality (more authored polish) +7. **~500-1000 authored templates** produce 300 worlds — the authoring is front-loaded into generator inputs + +## Key Tensions + +1. **Heritage root naming:** Miri uses abstract social signatures (Frost, Tide, Iron). Paula + lead prefer Earth-grounded names (Nordic-compact, Mediterranean-warm). Mechanical specs compatible either way. +2. **Heritage root count:** Miri proposes 10, Paula proposes 8, Gore proposes this is the wrong question (derive from ingredients, don't enumerate) +3. **7th ingredient:** Gore proposes "system failure mode" as an additional category. Others keep to 6. +4. **Universal theme:** Still open. Ozzie's "Who do you choose to see?" gained traction as player-action framing. Gore says "Don't pick, derive." + +## Proposed Decisions (Gestalt) + +| # | Decision | Status | +|---|---|---| +| D-WR-21 | Cultural ingredients menu (6 categories, generator-composed) | Needs lead confirmation | +| D-WR-22 | Three-system NPC architecture (9 patterns x 6 motivations + composition matrix) | Needs lead confirmation | +| D-WR-23 | 8 PC archetypes with fluid transitions as game mechanic | Partially confirmed by lead interview | +| D-WR-24 | Sacred/Profane/Middle Kingdom maps to all game systems | Confirmed by lead interview | +| D-WR-25 | District skeleton survives as generator output specification | Needs lead confirmation | +| D-WR-26 | 6-phase generator development pipeline | Needs lead confirmation | +| D-WR-27 | Authored content at 300-world scale (~1600-2800 hours) | Needs lead confirmation | +| D-WR-28 | Gate topology generation with Sacred/Profane constraints | Needs lead confirmation | diff --git a/docs/workshops/wiki-review/round4-tyre.md b/docs/workshops/wiki-review/round4-tyre.md new file mode 100644 index 000000000..df9f33293 --- /dev/null +++ b/docs/workshops/wiki-review/round4-tyre.md @@ -0,0 +1,597 @@ +# Round 4 — Tyre (Technical Architect) + +Responding to the lead's direction. *cracks knuckles* — the 300-world reframe is architecturally transformative. Let me be honest about what this means technically: it doesn't just scale up my Round 3 proposals. It changes what the architecture IS. + +--- + +## The Architectural Pivot + +**Round 3 assumption:** The simulation server loads authored content from a directory. The content directory is a repository of YAML files. The content loader is a 6-phase pipeline that reads files. + +**Round 4 reality:** The simulation server generates most content at world-creation time from parameter spaces. The content directory is a generator input repository — style briefs, ingredient definitions, pool templates, constraint rules. The content loader becomes a content GENERATOR that produces district instances from parameters. + +This is a fundamentally different architecture. Not harder — arguably more elegant. But different. + +### What stays the same (Sacred architecture) + +These Round 3 proposals survive intact: +- **Client-server separation** (D-010, D-020) — unchanged +- **Information boundaries** — unchanged, possibly more important at scale since generated content must respect the same occlusion rules +- **Entity structure** (bevy_ecs components) — unchanged, a generated NPC has the same components as an authored one +- **Tick processing** — unchanged +- **Knowledge graph model** (D-041) — unchanged +- **Simulation tiers** (D-026) — unchanged, but the tier boundaries matter more: 300 worlds means the vast majority are State-saved or Ungenerated at any given time + +### What changes fundamentally + +| System | Round 3 | Round 4 | +|--------|---------|---------| +| **Content directory** | Repository of authored YAML | Generator input repository — parameter spaces, style briefs, pool definitions, constraint rules | +| **Content loader** | 6-phase file reader | Generation pipeline — takes parameters, produces district instances | +| **Content addressing** | `canonical_id` pointing to files | `canonical_id` pointing to either authored files OR generator output. Two-tier addressing: authored content has stable IDs, generated content has seed-derived IDs | +| **Runtime content** | Loaded from disk, immutable per seed | Generated at world-creation, cached to disk, immutable thereafter | +| **Content validation** | Schema checks on authored YAML | Schema checks PLUS generator output validation PLUS quality gates | +| **NPC instantiation** | Load profile from YAML → spawn entity | Generate profile from parameters → validate → cache → spawn entity | +| **District initialization** | Read district/ directory → populate | Run District Composer with parameters → write to cache → load from cache | + +--- + +## 1. Cultural Ingredient Menu — Parameter Space Design + +The lead says: cultures are assembled from ingredient dimensions, not defined as fixed taxonomies. Architecturally, this is a **combinatorial parameter space**, and the generator's job is to produce coherent societies from dimension selections. + +### The parameter space + +```yaml +# content/ingredients/schema.yaml +cultural_parameter_space: + heritage_roots: + type: enum_set # pick 1-3 + pool: heritage_roots/ # directory of authored heritage definitions + min_selections: 1 + max_selections: 3 + + settlement_motivation: + type: enum + pool: motivations/ # economic_opportunity, political_exile, religious_freedom, etc. + + economic_function: + type: enum + pool: economic_functions/ # trade_hub, extraction, agriculture, manufacturing, etc. + + philosophical_alignment: + type: enum_set + pool: philosophies/ + min_selections: 1 + max_selections: 2 + + corporate_presence: + type: float_range # 0.0 (none) to 1.0 (corporate-dominated) + affects: [trust_defaults, economic_parameters, access_tiers] + + drift_stage: + type: ordinal # 1 (recent settlement) to 5 (ancient civilization) + affects: [naming_drift, cultural_coherence, heritage_visibility] +``` + +### Constraint rules + +Not all combinations are valid. Some are interesting friction, some are contradictory. The generator needs constraint rules: + +```yaml +# content/ingredients/constraints.yaml +constraints: + - type: requires + if: { drift_stage: [4, 5] } + then: { heritage_roots: { min_selections: 2 } } # ancient worlds show multiple heritage layers + + - type: tension + when: [philosophical_alignment.includes("autonomist"), corporate_presence > 0.7] + effect: { base_tension: +0.3, triangle_fuel: "corporate_resistance" } + + - type: incompatible + pair: [settlement_motivation == "religious_freedom", corporate_presence > 0.9] + resolution: "corporate takeover — original settlers marginalized" # becomes thematic content +``` + +### Architectural implications + +**Tier of difficulty: MODERATE.** This is essentially a configuration-driven factory pattern. The schema defines the parameter space, the constraint rules prune invalid combinations and flag interesting ones, and the generator assembles coherent output from valid selections. + +The key insight: **constraint violations aren't errors — they're content**. When heritage_roots clashes with corporate_presence, that's not a bug to filter out. That's a society with internal tension, which is exactly what generates interesting gameplay. The constraint system needs a "tension" category alongside "requires" and "incompatible." + +**What I need from Miri:** Authored ingredient definitions for each dimension. Each ingredient needs: mechanical parameters (what it affects), flavor text (for the generator to use in naming/description), and compatibility notes (which other ingredients it creates interesting friction with). + +--- + +## 2. Three NPC Systems + Composition — Data Model + +The lead says: THREE separate systems, not one taxonomy. Thematic patterns, functional motivations, and composition rules. Let me design the data model. + +### System A: Thematic Patterns + +```rust +// These define the NPC's narrative role — who they ARE in the player's story +#[derive(Component, Clone)] +pub enum ThematicPattern { + Friend, // warmth → contradiction → loss-or-reconciliation + Mirror, // reflects player's choices back at them + Anchor, // stability, the one who stays when everything moves + Ghost, // absence that shapes the present + Catalyst, // precipitates change, may not change themselves + Threshold, // guards a boundary — literal or metaphorical + Remnant, // living evidence of something that was + System, // embodies the system itself — bureaucrat, enforcer + Nobody, // background → foreground (dynamic tier promotion) +} +``` + +### System B: Functional Motivations + +```rust +// These define the NPC's gameplay role — what they DO in the simulation +#[derive(Component, Clone)] +pub enum FunctionalMotivation { + Handler, // directs player, gives tasks, manages information flow + Witness, // observes, reports, provides testimony — investigative thread + Turncoat, // divided loyalty, potential flip, information broker + Civilian, // just living their life — but affected by player actions + Operator, // runs something — business, network, system — player interacts with their operation + Skeptic, // questions everything, including the player's assumptions +} +``` + +### System C: Composition Rules + +This is the architecturally interesting part. Pattern + Motivation = specific NPC behavior template. + +```yaml +# content/npc/composition_rules.yaml +compositions: + friend_handler: + emotional_function: "warm relationship that also gives you work" + gameplay_function: "primary quest-giver who you actually care about" + content_requirements: [warmth_phase, contradiction_arc, task_chain] + generation_weight: 0.8 # common — a friend who helps you is natural + + friend_turncoat: + emotional_function: "warmth poisoned by divided loyalty" + gameplay_function: "investigation thread — who is the friend actually loyal to?" + content_requirements: [warmth_phase, loyalty_reveal, betrayal_or_redemption] + generation_weight: 0.3 # rarer — but devastating when it occurs + + mirror_skeptic: + emotional_function: "someone who sees through you AND questions why" + gameplay_function: "forces player self-examination through dialogue" + content_requirements: [reflection_dialogue, challenge_moments, optional_breakthrough] + generation_weight: 0.5 # moderate — powerful but can be exhausting + + nobody_civilian: + emotional_function: "invisible person in the background of your life" + gameplay_function: "potential for discovery — attention reveals depth" + content_requirements: [tier3_surface, tier2_latent, promotion_trigger] + generation_weight: 1.0 # very common — most background NPCs are this + + # ... remaining valid combinations ... + + # Invalid/forbidden combinations + ghost_handler: + valid: false + reason: "a ghost can't direct you — they're defined by absence" + + nobody_handler: + valid: false + reason: "handlers are noticed by definition — a nobody who gives tasks isn't a nobody" +``` + +### The composition matrix + +9 patterns x 6 motivations = 54 cells. My estimate: + +| Category | Count | Notes | +|----------|-------|-------| +| **Primary** (generation_weight > 0.6) | 15-18 | The bread and butter. Every district has several of these. | +| **Secondary** (weight 0.2-0.6) | 12-15 | Rarer, more memorable. Generator uses these for variety. | +| **Rare** (weight < 0.2) | 5-8 | Special cases. Only in districts with specific thematic textures. | +| **Invalid** | 13-19 | Conceptually contradictory. Generator never produces these. | + +**Tier of difficulty: MODERATE.** The composition system is essentially a weighted lookup table. The generator rolls a pattern, rolls a motivation, checks if the composition is valid, reads the composition rules for that pair, and generates accordingly. The HARD part isn't the lookup — it's authoring the 35-40 valid composition rules with enough specificity that the generator produces meaningfully different NPCs. + +### THE NOBODY — Dynamic Tier Promotion + +This deserves special architectural attention because it's genuinely novel: an NPC whose content tier changes at runtime based on player behavior. + +```rust +#[derive(Component)] +pub struct NobodyState { + /// Current tier — starts at Tier 3, can promote to 2 or 1 + pub current_tier: ContentTier, + + /// Latent content — generated at world-creation but not active until promoted + pub latent_tier2: Option, // pre-generated but dormant + pub latent_tier1: Option, // only if this Nobody has FRIEND potential + + /// Attention tracking — how much the player has noticed this NPC + pub attention_score: f32, // 0.0 = invisible, 1.0 = fully noticed + pub interaction_count: u32, + pub last_interaction_tick: Option, + + /// Promotion thresholds + pub tier2_threshold: f32, // attention_score needed for Tier 2 + pub tier1_threshold: f32, // attention_score needed for Tier 1 (if eligible) + + /// Promotion history — once promoted, tracks the journey + pub promoted_at_tick: Option, + pub promotion_context: Option, // what triggered the player's attention +} +``` + +**The generation pipeline for NOBODYs:** + +1. **World creation:** District Composer generates a Tier 3 surface for every NOBODY (name, routine, greeting, 3-5 generic lines). ALSO generates latent Tier 2 content (full 10-axis profile, relationships, backstory) — but this content is dormant. +2. **Runtime:** Player interacts with NOBODY. Attention system tracks interactions. When `attention_score` crosses `tier2_threshold`, the latent Tier 2 content activates — the NPC suddenly has more to say, more opinions, more relationships the player can discover. +3. **Rare promotion to Tier 1:** If a NOBODY's latent profile is flagged as FRIEND-eligible AND attention_score crosses `tier1_threshold`, the FRIEND template activates. This is a major narrative event — a background character becomes someone who matters. + +**Tier of difficulty: MODERATE-HARD.** The generation part is straightforward — generate latent content alongside surface content. The HARD part is the attention tracking system and making promotion feel natural rather than mechanical. The player shouldn't feel a "click" when an NPC promotes — it should feel like they've been paying attention and the NPC was always this interesting, they just hadn't noticed. + +**Memory cost at 300 worlds:** Latent content for NOBODYs. If a district has 20-30 Tier 3 NPCs and each has latent Tier 2 content, that's ~2-5KB per NPC in serialized YAML. For the Active simulation tier (30-80 NPCs), maybe 10-15 are NOBODYs: ~50-75KB. Trivial. For State-saved districts, latent content is on disk, not in memory. Fine. + +--- + +## 3. 8 Fluid PC Archetypes — Archetype State Machine + +The lead says: archetypes are fluid. Players can transition between them. This is a game mechanic, not just a character creation choice. + +### The state machine + +```rust +#[derive(Component)] +pub struct ArchetypeState { + /// Current archetype — determines voice, knowledge vocabulary, monologue triggers + pub current: Archetype, + + /// Archetype affinity scores — how close the player is to each archetype + /// Shaped by player actions, job choice, social connections, district + pub affinities: BTreeMap, + + /// Transition state — if currently transitioning + pub transition: Option, + + /// History — previous archetypes, for narrative callbacks + pub history: Vec<(Archetype, u64)>, // (archetype, tick_entered) +} + +#[derive(Clone)] +pub struct ArchetypeTransition { + pub from: Archetype, + pub to: Archetype, + pub progress: f32, // 0.0 = just started, 1.0 = complete + pub trigger: TransitionTrigger, + pub monologue_played: bool, +} + +pub enum TransitionTrigger { + JobChange(String), // took a new job in a different domain + DistrictMove(String), // moved to a district with different social structure + SocialShift, // friend group or social network changed significantly + PlayerChoice, // explicit choice in a narrative moment + GradualDrift, // affinity crossed threshold through accumulated actions +} +``` + +### Generator implications for 300 worlds + +Every generated district must support all 8 archetypes. This isn't optional — it's a generator constraint. The District Composer's acceptance criteria include: + +```yaml +# content/generators/district_composer/archetype_validation.yaml +archetype_constraints: + per_district: + - every archetype has at least 1 viable social site role + - every archetype has at least 1 potential FRIEND candidate + - every archetype has at least 3 NPCs with compatible access tiers + - every archetype has at least 1 economic activity (job/trade/task) + - no archetype's starting knowledge reveals more than 30% of district secrets + + transition_support: + - every district supports at least 3 inbound transition triggers + - every district supports at least 3 outbound transition triggers + - no archetype is a "dead end" in any district (always a path out) +``` + +**Tier of difficulty: MODERATE.** The archetype state machine itself is straightforward — it's a weighted affinity system with transition rules. The generator constraint is the hard part: ensuring 300 generated districts all support 8 archetypes without any dead ends. This requires the generator to run archetype viability checks as a post-generation validation step, and regenerate if constraints aren't met. + +### Rollout architecture + +The archetype system must be designed for incremental addition. When archetype 4 launches, all 300 worlds must support it. This means: + +1. **Archetype definitions are global, not per-district.** An archetype's voice card, moral arc structure, and knowledge vocabulary live in `content/archetypes/{name}/` — not embedded in districts. +2. **Per-district archetype support is generated.** The District Composer has an archetype support module that produces: social site role mappings, NPC access tier adjustments, economic activity slots, starting knowledge filters — for each archetype, for each district. +3. **Adding an archetype = adding a definition + re-running the archetype support generator.** The district content doesn't change. Only the archetype-district mappings are regenerated. + +This is actually easier at 300 worlds than at 20 hand-authored districts. At 20 districts, adding an archetype means 20 manual content updates. At 300 worlds, it means 1 archetype definition + 1 generator re-run. + +--- + +## 4. Sacred/Profane/Middle Kingdom — System Architecture Mapping + +The lead approved Nigel's framework. Let me map it across every major system in the architecture, because this framework is genuinely powerful — it gives us a principled answer to "what's fixed, what varies, what's structured-but-variable" for every system. + +### System-by-system classification + +| System | Sacred (rules, never change) | Profane (parameters, drawn from pools) | Middle Kingdom (sacred structure, profane cast) | +|--------|-----|---------|--------------| +| **Simulation** | Tick rate, entity structure, component types, system execution order | NPC attribute values, relationship values, tension levels | Simulation tiers (structure is sacred; which NPCs are in which tier is profane) | +| **Information** | Occlusion model, knowledge graph structure, confidence levels | What each NPC knows, perception ranges, access tier assignments | Access tier system (tiers are sacred; who has which tier is profane) | +| **Content tiers** | Tier 1/2/3 definitions, content requirements per tier | Which NPCs are which tier, FRIEND/MIRROR assignments, pool contents | THE NOBODY (tier structure is sacred; tier promotion is profane — the structure permits movement) | +| **Cultural system** | Ingredient dimensions, constraint types, parameter schema | Specific ingredient selections per world, cultural parameter values | Cultural composition rules (the rules for combining ingredients are sacred; which ingredients exist is profane) | +| **NPC system** | Thematic patterns, functional motivations, composition rule structure | Specific NPCs, their pattern/motivation assignments, their attributes | Composition rules (pattern + motivation structure is sacred; the specific rules per combination are profane — authors can add new composition flavors) | +| **Gate topology** | Number of gates per system type, connectivity rules, path guarantees | Which specific systems are connected, which peripherals are accessible | Gate graph generation algorithm (algorithm is sacred; inputs are profane) | +| **PC archetypes** | Archetype state machine, transition mechanics, affinity system | Starting affinity values, transition thresholds, specific trigger conditions | Archetype definitions (structure is sacred; specific archetypes are profane — 8 at v1.0, could grow) | +| **Storyteller** | Event types, tension model, pacing rules | Specific events, timing parameters, district-specific triggers | Decision node DSL (the language is sacred; the specific decision trees are profane) | + +### The key architectural insight + +**Sacred systems are the ENGINE. Profane content is the DATA. Middle Kingdom is the GENERATOR layer.** + +This maps perfectly to the 300-world reframe: +- We build the Sacred engine once (v0.1-v0.2) +- We define Middle Kingdom generators (v0.2-v0.5) +- We author and expand Profane content forever (v0.5+) + +The Sacred/Profane/Middle Kingdom framework IS the generator architecture, just named differently. The Middle Kingdom IS the content generation layer — it's the set of rules and templates that take Sacred structure and Profane parameters and produce game content. + +**Proposed decision: D-050 (Sacred/Profane/Middle Kingdom Framework).** Every system in the architecture must classify its components into Sacred (engine, locked after v0.2), Profane (content, expandable forever), and Middle Kingdom (generators/templates, stable after v0.5). This classification drives: what requires code changes vs. data changes, what can be modded, what is DLC-expandable, and what the build pipeline produces. + +--- + +## 5. Gate Topology — Generation Algorithm + +The lead says: core worlds always connected (Sacred), peripheral systems vary per playthrough (Profane), number accessible fixed but which ones varies (Middle Kingdom). + +### The generation algorithm + +``` +INPUTS: + - core_graph: Sacred connectivity (always the same) + - peripheral_pool: all possible peripheral systems (Profane) + - target_count: how many systems are accessible this playthrough (Sacred) + - connectivity_rules: min/max connections per system type (Sacred) + - seed: playthrough seed (determines all random selections) + +ALGORITHM: + 1. Start with core_graph (always the same) + 2. Calculate peripheral_slots = target_count - |core_graph| + 3. Select peripheral_slots systems from peripheral_pool (seed-determined) + 4. For each selected peripheral: + a. Determine connection points to existing graph (connectivity_rules) + b. Verify path guarantees (every system reachable from starting system) + c. If unreachable, add bridge connection or reselect + 5. Assign cultural parameters to each system (ingredient menu + seed) + 6. Generate districts per system from cultural parameters + 7. Validate: all archetypes viable in starting system, path diversity sufficient + +OUTPUT: + - Complete system graph with gate connections + - Cultural parameter assignments per system + - Starting system designation + - Critical path identification (for narrative pacing) +``` + +### Scale implications + +At 300 worlds with, say, 10-15 core worlds and 285-290 peripheral possibilities: + +- **Core graph:** Hand-authored connectivity. Maybe 10-15 systems that are ALWAYS present. These are the narrative spine — starting system, political capital, trade hub, frontier gateway, etc. Their cultural parameters are authored, not generated. Their districts are benchmark quality (some hand-authored, some generated from high-quality parameters with human review). +- **Peripheral pool:** 285-290 possible systems, of which each playthrough selects maybe 40-60 (based on gate topology). Cultural parameters generated from ingredient menu. Districts fully generated. +- **Per playthrough:** Player sees ~50-75 systems (core + selected peripherals). Maybe visits 15-25 deeply. The rest exist in the simulation at Background or State-saved tier. + +**Tier of difficulty: MODERATE.** Graph generation with constraints is a well-understood problem. The novel part is integrating it with the cultural parameter system — ensuring that a randomly-connected graph produces interesting cultural adjacencies (a trade hub bordering a frontier station creates different dynamics than a trade hub bordering another trade hub). + +### Macro randomization payoff + +This is where the Sacred/Profane/Middle Kingdom framework really shines for replayability. On playthrough 1, the player's region has a Frontier Station connected to an Agricultural World. On playthrough 2, the same structural slot connects to a Research Outpost. Same gameplay mechanics (navigation, trade, social infiltration). Completely different cultural texture, different NPCs, different moral dilemmas. Same Sacred structure, different Profane cast. + +**What Nigel needs to validate:** Does the gate topology generator produce sufficient variety? If 300 peripheral systems exist but the connectivity rules strongly constrain selection, players might see 80% overlap between playthroughs. The pool needs to be large enough (or the selection algorithm varied enough) that two playthroughs feel like different regions of the same universe. + +--- + +## 6. Generator Architecture — The Content Pipeline + +SI nailed this in Round 4: "Tooling IS the product." Let me design the generator architecture. This is the Middle Kingdom — the layer between Sacred engine and Profane content. + +### Pipeline overview + +``` +[Authored Inputs] [Generator Pipeline] [Runtime Content] + (Middle Kingdom) + +Style Briefs ─────────┐ +Ingredient Defs ──────┤ +Pool Templates ───────┤ +Composition Rules ────┤─── World Seed Generator ──────── World Manifest +Constraint Rules ─────┤ │ +Naming Algorithms ────┘ │ + ├── Cultural Param Generator ── Cultural Params per System + │ │ + ├── Gate Topology Generator ─── System Graph + │ │ + ├── District Composer ─────────── District Content (cached) + │ │ │ │ + │ │ ├── NPC Generator (Tier 2) ── NPC Profiles + │ │ ├── NPC Generator (Tier 3) ── NPC Sketches + │ │ ├── Social Site Generator ─── Social Sites + │ │ ├── Triangle Generator ────── Triangles + │ │ └── NOBODY Latent Generator ─ Latent Content + │ │ + │ ├── FRIEND Skinner ───────── FRIEND Instances + │ └── MIRROR Skinner ──────── MIRROR Instances + │ + ├── Pool Compositor ──────────── Per-District Pools + └── Archetype Support Gen ────── Per-District Archetype Maps + + ┌── Schema Validation + ├── Cross-Reference Validation +[Validation Layer] ──┤── Archetype Viability Check + ├── Pool Coverage Check + └── Name Collision Check +``` + +### Generation phases (replaces Round 3's 6-phase loader) + +| Phase | Input | Output | When | Cache? | +|-------|-------|--------|------|--------| +| **1. Manifest** | Playthrough seed | World manifest: system count, core graph, peripheral selections | New game start | Yes — defines the playthrough | +| **2. Global** | Manifest + authored global content | Global pools, archetype definitions, composition rules, naming algorithms | New game start | Yes — global content is shared | +| **3. System** | Manifest + cultural ingredients | Per-system cultural parameters, gate connections | New game start | Yes — systems are stable | +| **4. District** | System params + all generator inputs | Complete district content: NPCs, social sites, triangles, pools | On-demand (when system enters Active tier) | Yes — generated once, cached | +| **5. Latent** | District content + NOBODY definitions | Latent Tier 2/Tier 1 content for NOBODYs | With district generation | Yes — stored alongside district | +| **6. Hot-Reload** | Content patches, new archetypes | Updated content for specific systems/districts | Runtime (rare) | Replace cache | + +### Build-time vs. runtime generation + +**Critical design decision:** When do the generators run? + +**Option A: All at new-game-start.** Generate all 300 worlds when the player starts a new game. Pros: everything is consistent. Cons: potentially long initial load (minutes?), and all content exists even if the player never visits most worlds. + +**Option B: Core at new-game-start, peripheral on-demand.** Generate core systems at start, generate peripheral systems when the player first approaches (enters Adjacent tier). Pros: fast start, lazy generation. Cons: need to ensure cross-system references are consistent even for ungenerated systems. + +**My recommendation: Option B, with forward references.** + +Generate the manifest (system graph + cultural parameters) at new-game-start. This is cheap — it's just parameter selection, no content generation. Generate district content on-demand when a system enters Active tier. Forward references (e.g., "this NPC mentions a cousin on System X") are generated from the manifest's cultural parameters — the cousin's specific identity is resolved when System X is actually generated. + +This keeps new-game-start fast (<5 seconds), distributes generation load across gameplay, and handles the fact that most players will visit 15-25 of 300 systems deeply. No point generating the other 275 in detail. + +**Tier of difficulty: HARD.** Not because any individual generator is hard, but because the generators must be coordinated. The manifest constrains the cultural generator. The cultural generator constrains the district composer. The district composer constrains the NPC generator. The NPC generator must respect composition rules. And the whole pipeline must be deterministic (same seed = same output) for save/load compatibility and multiplayer consistency (D-010). + +### Determinism guarantee + +Every generator must be deterministic given a seed. This is non-negotiable (D-010). At 300 worlds, it means: + +``` +world_seed (from save file) + └── system_seed = hash(world_seed, system_id) + └── district_seed = hash(system_seed, district_id) + └── npc_seed = hash(district_seed, npc_slot_index) +``` + +Each level derives its seed from its parent. Regenerating System 47 always produces the same result, regardless of when it's generated during gameplay. This is what makes on-demand generation safe — the order of generation doesn't matter. + +--- + +## 7. What Changes Fundamentally at 300-World Scale + +Let me flag everything that breaks, changes, or needs rethinking. + +### Things that are EASIER at 300 worlds + +1. **Adding PC archetypes.** One definition + one generator re-run vs. 20+ manual district updates. The generator-based model is inherently archetype-agnostic. + +2. **Content variety.** 300 worlds with cultural ingredients means far more combinatorial variety than 20 hand-authored districts could ever achieve. The parameter space is enormous. + +3. **DLC/expansion.** Add new ingredients to the menu, add new peripheral systems to the pool, re-run generators. No need to hand-author entire new districts. + +4. **Modding.** Modders add ingredients, patterns, archetypes, or systems to the pools. The generators incorporate them automatically. Nigel's modding platform is EASIER with generators than with hand-authored content. + +5. **Anti-metagaming.** With 300 possible worlds and seed-based selection, no two playthroughs share the same map. The fundamental structure varies per playthrough. + +### Things that are HARDER at 300 worlds + +1. **Quality assurance.** Can't hand-review 300 worlds. Must trust automated validation + spot-checks. The FRIEND/MIRROR review bottleneck that SI identified (150-200h) is real and irreducible. + +2. **Cross-system narrative.** If there's a plot thread that spans systems ("the conspiracy has agents on three worlds"), the generator must coordinate across systems. This requires a narrative threading layer above the district composer — a system that plants cross-references during manifest generation and resolves them during district generation. + +3. **Generator debugging.** When a generated district feels flat or broken, the debugging question is: which generator input caused this? Which ingredient? Which composition rule? This requires extensive logging and a "regenerate with verbose output" debug mode. + +4. **Save file compatibility.** If we change a generator (fix a bug, improve quality), existing save files reference content generated by the OLD generator. Options: (a) version the generators and always use the version that matches the save file, (b) regenerate affected content on load and handle any inconsistencies. I recommend (a) — versioned generators with backward compatibility. + +5. **Performance at generation time.** Generating a full district (30-80 NPCs, 5-8 social sites, 10-15 triangles, naming, dialogue) might take 2-10 seconds. For the on-demand model, this happens when the player approaches a new system. Need to pre-generate during the player's travel (gate transit animation = generation time) or have the generation be fast enough to be imperceptible. + +### Things that are DIFFERENT (not harder or easier, just changed) + +1. **The content team's role.** Writers become generator input authors. They write style briefs, ingredient definitions, FRIEND templates, voice cards, and seed dialogue. They don't write districts. This is a fundamentally different skill set — more like writing design documents than writing prose. + +2. **Quality metrics.** Instead of "is this district good?" the question becomes "does this generator produce districts that are indistinguishable from hand-authored?" The quality metric is GENERATOR quality, not content quality. Content quality is a function of generator quality + input quality. + +3. **The content directory structure.** Round 2's directory structure (districts/ with per-district YAML) becomes input-focused: + +``` +content/ + sacred/ # Engine definitions — locked after v0.2 + patterns/ # Thematic pattern definitions (9) + motivations/ # Functional motivation definitions (6) + tiers/ # Content tier definitions + simulation/ # Simulation tier parameters + + profane/ # Pool content — grows forever + ingredients/ # Cultural ingredient definitions (30-50) + friends/ # FRIEND template pool (30-50) + mirrors/ # MIRROR template pool (15-25) + voices/ # Voice card library (30+) + archetypes/ # PC archetype definitions (8+) + contraband/ # Contraband type pool + names/ # Naming algorithm definitions per heritage + + middle_kingdom/ # Generator configs — stable after v0.5 + generators/ # Generator definitions and configs + composition/ # Composition rules (pattern × motivation) + constraints/ # Cultural constraint rules + templates/ # District templates, social site templates + validation/ # Validation rule definitions + + authored/ # Hand-authored content (benchmark + core) + core_systems/ # The 10-15 always-present systems + benchmark/ # Quality benchmark districts (5-8) + + generated/ # Generator output cache (gitignored) + systems/ # Per-system generated content + manifests/ # Per-seed world manifests +``` + +--- + +## 8. Technical Risk Assessment + +| Risk | Severity | Likelihood | Mitigation | +|------|----------|-----------|------------| +| **Generator produces flat/samey output** | CRITICAL | MEDIUM | Extensive variety testing. Measure statistical distribution of NPC attributes across 100 generated districts. If variance is too low, add more randomization sources. | +| **Cross-system narrative incoherence** | HIGH | MEDIUM | Manifest-level narrative threading. Forward references resolved at generation time. Validation layer checks cross-references. | +| **Save file incompatibility after generator changes** | HIGH | HIGH (will happen) | Versioned generators from day 1. Save files record generator version. Load always uses matching version. | +| **Generation performance (player-facing latency)** | MEDIUM | LOW-MEDIUM | Pre-generate during travel animations. Background generation for adjacent systems. Profile and optimize hot paths. | +| **Ingredient explosion (too many combinations)** | LOW | MEDIUM | Start with 30-50 ingredients. Measure output quality. Add more only when generators can handle the variety. Constraint rules prune degenerate combinations. | +| **NOBODY promotion feels mechanical** | MEDIUM | MEDIUM | Attention scoring must be invisible. No UI indicator of "attention score." Promotion triggers must feel organic — the NPC has more to say because the player asked, not because a threshold was crossed. | + +--- + +## 9. What I Got Wrong in Round 3 + +| Round 3 Proposal | Status at Round 4 | +|-----------------|-------------------| +| **6-phase content loader** | Replaced by 6-phase generation pipeline. Same structure, different function. | +| **Content directory as "runtime-visible file tree"** | Replaced by `content/` as generator input tree + `generated/` as output cache. | +| **Decision node DSL (~10-15 operations)** | Still valid — the storyteller's decision language is Sacred. What changes is that most decision trees are generated, not hand-authored. | +| **Cultural distance model (4-level hierarchy)** | Replaced by ingredient menu. The "distance" between cultures is now a function of ingredient overlap, not a taxonomic hierarchy. More emergent, less prescriptive. Better. | +| **9 core engine patterns** | Expanded and reclassified: patterns are now one of THREE systems (pattern + motivation + composition). The 9 I proposed map to the thematic patterns. Motivations are a separate system. This is cleaner. | +| **~15-20 sprints for platform build** | Still roughly accurate for the Sacred + Middle Kingdom layers. But the nature of the work shifts: less content authoring tooling, more generator development. | +| **canonical_id addressing** | Still valid, but needs two-tier model: authored content has human-readable canonical_ids, generated content has seed-derived canonical_ids. Both types use the same addressing system in the simulation. | + +--- + +## 10. Proposed Decisions + +Based on this round, I'm flagging these for formalization: + +| ID | Decision | Rationale | +|----|----------|-----------| +| **D-050** | Sacred/Profane/Middle Kingdom framework adopted for all systems | Principled classification for fixed/variable/templated content across entire architecture | +| **D-051** | Content generation pipeline (6-phase: Manifest → Global → System → District → Latent → Hot-Reload) | Replaces Round 3's content loader; generation is the core architecture | +| **D-052** | Deterministic seed-derived generation (world_seed → system_seed → district_seed → entity_seed) | Required by D-010 (multiplayer-ready). Same seed = same world, regardless of generation order. | +| **D-053** | On-demand generation with forward references (core at start, peripherals on approach) | Performance optimization: don't generate 300 worlds upfront. Manifest provides forward reference targets. | +| **D-054** | Three NPC systems: Thematic Patterns (9) + Functional Motivations (6) + Composition Rules | Clean separation of narrative role, gameplay role, and combination rules | +| **D-055** | THE NOBODY as dynamic tier promotion system | Tier 3 → Tier 2 (→ Tier 1) based on player attention. Latent content generated at world-creation, activated at runtime. | +| **D-056** | Versioned generators with backward-compatible save files | Save files record generator versions. Content always regenerated with matching version on load. | +| **D-057** | Fluid PC archetype state machine with affinity-based transitions | 8 archetypes at v1.0, transitions via job change / district move / social shift / gradual drift | + +--- + +*Tyre out. The 300-world reframe isn't a scaling challenge — it's an architecture change. And honestly? It's more elegant. The generator-based model solves problems that hand-authoring COULDN'T solve: true anti-metagaming, easy archetype addition, natural DLC expansion, moddability by design. The Sacred/Profane/Middle Kingdom framework gives us a principled language for every "what's fixed vs. what varies" conversation for the rest of the project. I'm genuinely excited about this architecture. It's one of those cases where the constraint (300 worlds) forces a design (generators) that's actually BETTER than what we'd have built otherwise.* diff --git a/docs/workshops/wiki-review/si-ticket-changes.md b/docs/workshops/wiki-review/si-ticket-changes.md new file mode 100644 index 000000000..4c8dd2829 --- /dev/null +++ b/docs/workshops/wiki-review/si-ticket-changes.md @@ -0,0 +1,309 @@ +# Wiki Review Workshop — Ticket Changes + +**Author:** SI (Project Manager) +**Date:** 2026-02-12 +**Source:** Round 2 outputs from Tyre, Gestalt, Nigel, Gore, Paula, Miri, Ozzie, Mellanie + Round 2 tracking doc + +--- + +## Existing Ticket Updates + +| ID | Title | Action | Rationale | +|----|-------|--------|-----------| +| #301 | Wiki taxonomy and structure — full future-ready schema | **Update description** — workshop produced concrete taxonomy rules (Tyre R2 §5, Miri canonical_id). Assign to **copy** team. | Workshop directly addresses this ticket's scope. | +| #319 | Krenn System wiki entry — first star system | **Update description** — Miri delivered Krenn System brief in workshop (Round 1+2). Assign to **copy** team. Will be fulfilled by new ticket for cultural-groups file. | Miri's brief supersedes the original scope. | +| #368 | Knowledge vocabulary for v0.1 content (#309) | **Mark done** — the wiki at `docs/wiki/` is the output. Currently in_progress. | Workshop is the review of #368's output. | +| #261 | Dual Lens Authoring Guide | **No change** — still blocking. Workshop confirms its importance. Assign to **copy** team when ready. | Workshop style guide work complements but doesn't replace #261. | + +--- + +## New Epic: Wiki Review Workshop Outputs + +**Parent epic** for all workshop-produced tickets. + +### Epic: Wiki Review Workshop Outputs +- **Type:** epic +- **Priority:** high +- **Team:** copy +- **Description:** Tickets created from the Wiki Review & Content Standards workshop (2026-02-12). Covers style guides, wiki updates, content directory design, PC-as-NPC spec, smuggler content parity, and regional brief adoption. + +--- + +## New Tickets (Grouped by Domain) + +### A. Wiki Content Updates (copy team) + +**A1. Apply canonical full names to all NPC wiki pages** +- Type: task +- Priority: medium +- Team: copy +- Parent: workshop epic +- Description: Apply Miri's full name table from Round 2 to all NPC wiki pages. 12 NPCs need surnames added to Core Identity blocks. Full names also surface in environmental text (manifests, shift rosters, Commission kiosk). Source: Miri R2 §1, Paula R2 §3. +- Names: Voss→Arvo Voss, Devra→Devra Talsen, Resha→Resha Neven, Harek→Harek Valde, Renn→Renn Harsk, Pell→Pell Torssen, Drin→Drin Rosta, Sess→Sess Kolvur, Olin→Olin Tavren, Sabel→Sabel Hersk, Tav→Tav Merik, Hael→renamed (see A2). + +**A2. Rename Hael → Naia Tamm across all wiki files** +- Type: task +- Priority: medium +- Team: copy +- Parent: workshop epic +- Description: Phonetic collision fix (Kael/Hael). Rename to Naia Tamm per Miri R2 §2. Find-and-replace across ~8 wiki files. Triangle 4 becomes Naia-Kael-Sera. Source: Paula R1, Miri R2. + +**A3. Create wiki/cultural-groups/krenn-system.md** +- Type: task +- Priority: high +- Team: copy +- Parent: workshop epic +- Description: Compile Miri's Round 1 + Round 2 Krenn System cultural brief into canonical wiki page. Includes: heritage analysis (Finnish-Estonian-Latvian-Norwegian blend), naming conventions, substrate vocabulary (10+ heritage words), social norms, food/drink, greeting conventions, access tier cultural profile. YAML frontmatter with canonical_id. Source: Miri R1+R2. + +**A4. Create wiki/cultural-groups/_template.md — regional style guide pattern** +- Type: task +- Priority: high +- Team: copy +- Parent: workshop epic +- Description: Template for any region's style guide. Sections: dominant heritage, naming conventions (first/family/place/business), language echoes, corporate naming influence, 180yr drift patterns, aesthetic markers, access tier cultural profile (Miri R2 §4 addition). Source: workshop brief Topic 3, Miri R1+R2, Gore R2 §2. + +**A5. Add Cultural Groups section to wiki/index.md** +- Type: task +- Priority: medium +- Team: copy +- Parent: workshop epic +- Description: Add Cultural Groups section to wiki index between Factions and NPCs. Link to krenn-system.md and _template.md. Source: Miri R2 §5, Tyre R2 §5. + +**A6. Add smuggler-perspective FactId progression text to fact-catalog.md** +- Type: task +- Priority: high +- Team: copy +- Parent: workshop epic +- Description: The fact catalog currently has detective-biased progression text. Add smuggler-perspective text for all FactIds where the smuggler starts at KnowsDetails or has a different knowledge path. Source: Paula R1, Gore R2 §3. + +**A7. Add 5 smuggler-specific entity attributes to entity-attributes.md** +- Type: task +- Priority: high +- Team: copy +- Parent: workshop epic +- Description: Add to wiki/knowledge/entity-attributes.md: operational_status (reliable/shaky/compromised/burned), exposure_risk (contained/escalating/critical), loyalty_read (solid/conditional/wavering/turning), leverage_known (freeform), social_debt (owes_me/i_owe_them/mutual/none). Brings total from 14 to 19+ canonical keys. Source: Paula R1+R2 §1, Gore R2 endorsement, Tyre R2 §7 validation. + +**A8. Standardize location shortcodes in monologue-guide.md** +- Type: task +- Priority: medium +- Team: copy +- Parent: workshop epic +- Description: Fix hub_m_ → terminal_m_ inconsistency. Canonical shortcodes: terminal, bar, corridor. Add shortcode reference table to the guide. Add situation overlap rules and mood exclusivity rules (Mellanie R1). Source: Tyre R2 §1, Mellanie R2 §2. + +**A9. Add Thematic Question field to Tier 1 NPC profiles** +- Type: task +- Priority: low +- Team: copy +- Parent: workshop epic +- Description: Add "## Thematic Question" section to Kael and Sera profiles — each character's answer to "Is this enough?" Authoring guidance, not mechanical. Required for Tier 1 and MIRROR/1.5. Recommended for Tier 2. Source: Gore R1+R2, Mellanie R2 endorsement. + +**A10. Stub NPC profile for Nils Davan (off-stage)** +- Type: task +- Priority: low +- Team: copy +- Parent: workshop epic +- Description: Nils Davan is referenced in 5+ NPC profiles but has no wiki page. Create minimal off-stage profile: Core Identity, relationship to Kael (siblings), role in ring (upstream pressure), known attributes by other NPCs. Source: Tyre R2 §8. + +**A11. Fix Triangle 1 (Hub Power) — add Volume Escalation decision node** +- Type: story +- Priority: high +- Team: copy +- Parent: workshop epic +- Description: T1 is the weakest triangle (Gestalt R1, Paula R1). Fix: add a Volume Escalation decision where Nils (via Renn) demands double volume, Voss refuses. Smuggler chooses: side with Nils (louder signal), side with Voss (internal tension), or split the route (new exposure surface). Each option cascades into T2 and T5 with different detective observability. Source: Gestalt R2 §4 (full YAML spec provided). Includes Nils partial presence via lattice message (~5-8 lines). + +**A12. Create environmental text examples file** +- Type: task +- Priority: medium +- Team: copy +- Parent: workshop epic +- Description: Create wiki/authoring/environmental-text-examples.md with Krenn-voiced examples for 4 text types: bar menu, safety notice, news ticker cycle, corridor graffiti. Include cultural notes and monologue pairings (smuggler + detective). Source: Miri R2 §3 (4 examples), Mellanie R2 §1 (4 examples). Merge both sets. + +### B. Style Guides & Spec Documents (copy team) + +**B1. NPC Authoring Style Guide — combined document** +- Type: story +- Priority: critical +- Team: copy +- Parent: workshop epic +- Description: Assemble the unified NPC Authoring Style Guide. Structure per Mellanie R2 §2 TOC: Part 1 (tier templates — Paula), Part 2 (authoring rules — Mellanie conventions, Gestalt constraints, Ozzie anchor line), Part 3 (regional culture — Miri), Part 4 (content pipeline — Tyre). Includes per-tier validation checklists, tag usage rules, mechanical constraints, voice discipline. This is the repeatable "if someone new joins, they can produce consistent content" deliverable. Source: all Round 2 agents. + +**B2. THE MIRROR pattern spec / Hael elevation** +- Type: story +- Priority: high +- Team: copy +- Parent: workshop epic +- Description: Define the honest-character NPC archetype. Gore proposes THE MIRROR (new pattern, 50-70 lines, no secret/tell/contradiction). Paula proposes Tier 1.5 (Production Emotional NPC — same depth, different name). Ozzie proposes enhanced Tier 2 (+15-20 lines). All agree: no contradiction arc, Tier 1 emotional depth, Hael (now Naia) is first instance. Project lead to decide formal pattern vs enhanced Tier 2. Output: template spec + Naia elevation to chosen depth. Source: Gore R2 §4, Paula R2 §4, Ozzie R2 §1. Blocks: Naia content authoring. + +**B3. PC-as-NPC unified spec** +- Type: story +- Priority: high +- Team: copy +- Parent: workshop epic +- Description: Unified spec for NPC-to-PC upgrade. Sections: B1 (starting knowledge graph), B2 (starting relationship map), B3 (reverse knowledge — bidirectional, Gestalt's critical insight), B4 (orientation monologue — Ozzie's first 60 seconds), B5 (agency boundaries), B6 (authored relationship stubs — Gore's requirement), B7 (tell inversion). Includes 9-step conversion checklist for content authors and bidirectional validation rules. v0.1 scope: 2 PC briefs (smuggler, detective). Source: Gestalt R2 §2, Paula R2 §2, Nigel R2 §4, Ozzie R2. + +**B4. Smuggler voice card + moral arc spec** +- Type: story +- Priority: high +- Team: copy +- Parent: workshop epic +- Description: Two deliverables: (1) Smuggler voice card — paired examples with detective showing dual-lens register differences (Mellanie R2 §3). Thinks in people vs data, first names vs surnames, fragments vs complete sentences, Krenn substrate vocabulary. (2) Smuggler moral arc — 4 phases (Comfort→Doubt→Reckoning→Compromise), smuggler-specific FactIds (operations.cover_integrity, operations.personnel_stability, operations.institutional_pressure, operations.moral_weight, operations.exit_cost), monologue triggers (sense_atmosphere_shift, witness_exposure_risk, observe_loyalty_fracture, feel_complicity_deepen, recognize_no_exit, read_the_room). Source: Gore R2 §3, Paula R2 §1, Mellanie R2 §3. + +**B5. NPC-format briefs for both PCs — Concept A v0.1** +- Type: story +- Priority: high +- Team: copy +- Parent: workshop epic +- Description: When you play the smuggler, the detective exists as an NPC. When you play the detective, the smuggler exists as an NPC. Create NPC-mode behavior scripts for both PCs (5-7 routine entries each), reverse dual-lens notes (how each NPC sees the other PC), observation monologue for PC seeing other-PC-as-NPC (3-5 lines per character, ~20-30 authored items total). The second-playthrough wow moment depends on this. Source: Nigel R2 §4, Ozzie R2. + +### C. Content Directory & Schema (split: copy for spec, server for implementation) + +**C1. Content directory structure design doc** +- Type: story +- Priority: high +- Team: copy +- Description: Document the converged content directory structure from Tyre R2 §1 + Gestalt R2 §1. Key conventions: _meta/ + _schema/ (infrastructure, underscore prefix), global/ + districts/ (game content, no underscore). Includes mod overlay mechanics (ADD/REPLACE/MERGE), canonical_id format ({system}.{station}.{district}.{type}.{slug}), district as atomic pack unit. Source: Tyre R2, Gestalt R2, Nigel R2. Informs all implementation tickets. + +**C2. Create content/ directory skeleton** +- Type: task +- Priority: high +- Team: server +- Description: Create the content/ directory tree matching the workshop-converged structure. _meta/, _schema/, global/ (factions, technology, contraband, knowledge, enums, regions), districts/sova-transit/ (district.yaml, npcs/, locations/, templates/, triangles/, lines/). Empty YAML stubs with comments. Source: Tyre R2 §1. +- Blocked by: C1 + +**C3. Content schema definitions (YAML Schema files)** +- Type: story +- Priority: high +- Team: server +- Description: Create _schema/ directory with validation schemas: npc.schema.yaml (with tier-conditional rules), location.schema.yaml, faction.schema.yaml, template.schema.yaml, fact.schema.yaml, dialogue.schema.yaml, monologue.schema.yaml, district.schema.yaml, pool.schema.yaml. Map from Gestalt R1 hard/soft requirement tables. Source: Gestalt R1 tables, Tyre R2 §3. +- Blocked by: C1 + +**C4. Create global/enums/ YAML files from D-035** +- Type: task +- Priority: medium +- Team: server +- Description: Populate global/enums/ with canonical enum values from D-035: situations.yaml (13 values), topics.yaml (9), moods.yaml (8), triggers.yaml (9), access-tiers.yaml (5), activities.yaml (new — from Gestalt routine format + Miri cultural patterns). Source: Tyre R2 §1+§4, Gestalt R2 §5. +- Blocked by: C2 + +**C5. Create global/knowledge/entity-attributes.yaml** +- Type: task +- Priority: medium +- Team: server +- Description: Machine-readable entity attribute definitions. 14 existing detective-oriented keys + 5-6 smuggler-specific keys (Paula/Gore). Total: 19+ canonical keys. Source: Tyre R2 §7, Paula R2 §1. +- Blocked by: C2 + +**C6. Create pools.yaml for v0.1 seed-time selection** +- Type: task +- Priority: medium +- Team: server +- Description: Create districts/sova-transit/pools.yaml with v0.1 single-candidate pools: friend_smuggler (kael-davan), friend_detective (sera-venn), bar_regulars, compromised_inspector, primary_contraband. Architecture supports N candidates; v0.1 has 1 each. Source: Tyre R2 §2, Nigel R2 §1-2, Gestalt R2 §3. +- Blocked by: C2 + +**C7. Create template YAML files with role slot definitions** +- Type: task +- Priority: medium +- Team: server +- Description: Create districts/sova-transit/templates/ YAML for 3 social sites: logistics-hub.yaml, bar.yaml, smuggling-ring.yaml. Each declares named role slots with count ranges, required flags, pool references, and triangle constraints. Source: Tyre R2 §6, Nigel R2 §2. +- Blocked by: C2 + +**C8. Create triangle YAML files for 5 v0.1 triangles** +- Type: task +- Priority: medium +- Team: server +- Description: Create districts/sova-transit/triangles/ YAML for: hub-power.yaml (Nils-Voss-Smuggler), worried-knowledge.yaml (Maret-Voss-Kael), bar-tensions.yaml (Lera-Torek-Olin), worried-partner.yaml (Naia-Kael-Sera), informant-question.yaml (Pell-Renn-Devra). Includes updated T1 with volume escalation decision node. Source: Tyre R2 §1, Gestalt R2 §4. +- Blocked by: C2 + +**C9. Implement make validate-content CLI** +- Type: story +- Priority: high +- Team: server +- Description: Build structural + tier-conditional content validation. Reads _schema/ definitions, validates all YAML in content/. v0.1 scope: structural validation (required fields, type checks, enum matching) + tier-conditional rules (Tier 1 needs contradiction arc, Tier 2 needs all 10 axes). v0.2: cross-reference validation (FactId existence, NPC slug resolution). Source: Tyre R2 §3. +- Blocked by: C3 + +**C10. Pre-commit FactId typo check** +- Type: task +- Priority: medium +- Team: ci +- Description: Add grep-based pre-commit check that validates FactId references in YAML content files against the canonical facts.yaml. Catches typos like contraband.ring_exist vs contraband.ring_exists. Cheap v0.1 bridge until full cross-reference validation lands. Source: Tyre R2 §3, Mellanie R1. + +### D. Design Specs + +**D1. cultural_gate modifier for dialogue access — design doc** +- Type: story +- Priority: medium +- Team: copy +- Parent: workshop epic +- Description: Design the cultural_gate modifier that adjusts dialogue disclosure based on cultural insider/outsider status, independent of relationship state. Krenn culture reduces disclosure to outsiders (detective) regardless of trust level. Not a new access tier — a modifier on existing tiers. Needs mechanical spec from Gestalt + feasibility from Tyre. Source: Gore R2 §2. + +**D2. Seed configuration schema design** +- Type: story +- Priority: medium +- Team: server +- Description: Design the seed configuration schema — what the randomizer produces at game-start. Records: FRIEND selections, social site population, compromised NPC, contraband type, entanglement overrides. Saved with game state. Constrained by D-029 ratio (30/50/20). Location: runtime/ (not content/). Source: Nigel R2 §2+§4-6, Tyre R2 §2. + +**D3. Secondary contraband variant FactId text** +- Type: task +- Priority: low +- Team: copy +- Parent: workshop epic +- Description: Write variant KnowsDetails text for contraband.secondary_cargo FactId: medical-grade replacements, severance equipment, enhanced capability mods. Primary contraband (lattice components) is fixed per district. Secondary varies per seed. Source: Nigel R2 §3. + +**D4. News ticker headline pool** +- Type: task +- Priority: low +- Team: copy +- Parent: workshop epic +- Description: Write 40-50 news ticker headlines for the Meridian feed at Lera's. Mix of: freight/commodity data, Assembly politics, local infrastructure, sports, Commission advisories. Randomizer selects 15-20 per seed. Each headline should work as a dual-lens trigger. Source: Nigel R2 §4, Mellanie R2 §1 (7 examples delivered). + +--- + +## Dependency Map + +``` +Workshop Epic +├── A1 (full names) ── no deps +├── A2 (Hael→Naia rename) ── no deps +├── A3 (Krenn brief) ── no deps +├── A4 (regional template) ── no deps +├── A5 (wiki index update) ── blocked by A3, A4 +├── A6 (smuggler FactId text) ── blocked by B4 +├── A7 (smuggler attributes wiki) ── no deps +├── A8 (shortcode fix) ── no deps +├── A9 (thematic question) ── blocked by B2 +├── A10 (Nils stub) ── no deps +├── A11 (Triangle 1 fix) ── no deps +├── A12 (env text examples) ── blocked by A3 +├── B1 (NPC style guide) ── blocked by A3, A4, A7, B2, B4 +├── B2 (MIRROR/Hael spec) ── no deps +├── B3 (PC-as-NPC spec) ── blocked by A7 +├── B4 (smuggler voice + moral arc) ── blocked by A7 +├── B5 (PC briefs v0.1) ── blocked by B3 +├── C1 (content dir design doc) ── no deps +├── C2 (content skeleton) ── blocked by C1 +├── C3 (schema definitions) ── blocked by C1 +├── C4 (enum YAMLs) ── blocked by C2 +├── C5 (entity-attributes YAML) ── blocked by C2 +├── C6 (pools.yaml) ── blocked by C2 +├── C7 (template YAMLs) ── blocked by C2 +├── C8 (triangle YAMLs) ── blocked by C2 +├── C9 (validate-content CLI) ── blocked by C3 +├── C10 (FactId pre-commit) ── no deps +├── D1 (cultural_gate design) ── no deps +├── D2 (seed config schema) ── no deps +├── D3 (secondary contraband text) ── no deps +├── D4 (news ticker pool) ── no deps +``` + +--- + +## Summary + +- **Existing tickets updated:** 4 (#301, #319, #368, #261 noted) +- **New epic:** 1 (Wiki Review Workshop Outputs) +- **New stories:** 9 (A11, B1-B5, C1, C3, C9, D1, D2) +- **New tasks:** 19 (A1-A10, A12, C2, C4-C8, C10, D3, D4) +- **Total new tickets:** 29 (1 epic + 9 stories + 19 tasks) +- **Teams:** copy (21), server (7), ci (1) + +--- + +*Compiled by SI. Source: Wiki Review Workshop Round 2 outputs, all 7 agents + tracking doc.* diff --git a/docs/workshops/wiki-review/wiki-review-workshop-brief.md b/docs/workshops/wiki-review/wiki-review-workshop-brief.md new file mode 100644 index 000000000..3dac661c0 --- /dev/null +++ b/docs/workshops/wiki-review/wiki-review-workshop-brief.md @@ -0,0 +1,191 @@ +# Workshop Brief: Wiki Review & Content Standards +## Locking Down the Foundation + +**Project:** The Settled Reach (D-021) +**Date:** 2026-02-12 +**Called by:** Jeroen +**Participants:** PAULA (librarian), MELLANIE (librarian), MIRI, GESTALT, GORE, NIGEL, OZZIE, TYRE, QATUX (documenter), SI (work prep) + +--- + +## Context + +Sprint 2 just produced `docs/wiki/` — 45 files covering the full knowledge vocabulary for v0.1 (ticket #368). This includes NPC profiles (17 NPCs across 3 tiers), location pages, faction pages, technology/contraband references, knowledge system vocabulary (FactIds, entity attributes, relationship states), and an authoring guide. + +Before we commit this as canonical and build YAML content files on top of it (#299, #300, #309), we need to review it as a team. Paula and Mellanie served as the primary authors and can explain the reasoning behind structure and content decisions. + +**What this wiki represents:** The single source of truth for all game content. Every NPC profile, every location description, every knowledge fact flows through here before becoming engine-readable YAML. + +--- + +## Topic 1: Direction Check — Are We Building the Right Game? + +**The question:** Does this wiki, as written, describe the game we actually want to make? + +Review the wiki holistically. Check that: +- The NPCs, triangles, and contradiction arcs create the asymmetric-information drama we designed +- The two-character proof (smuggler vs. detective) produces genuinely different experiences +- The tone matches "quotidian-with-undertow" — comfortable enough to be complacent, tight enough that extra income is tempting +- THE FRIEND pattern (Kael/Sera) delivers the emotional gut-punch we designed in D-034 +- The knowledge vocabulary (FactIds, relationship states, confidence levels) can express everything the narrative needs + +**Key files to review:** +- `docs/wiki/npcs/index.md` — roster + triangle diagrams +- `docs/wiki/npcs/kael-davan.md` — Tier 1 FRIEND reference +- `docs/wiki/npcs/sera-venn.md` — Tier 1 FRIEND reference +- `docs/wiki/knowledge/relationship-states.md` — contradiction arcs +- `docs/wiki/knowledge/fact-catalog.md` — FactId vocabulary + +**Questions:** +1. **Gore:** Does this capture what the game is fundamentally ABOUT? The philosophical questions, the identity tensions? +2. **Gestalt:** Do the 5 triangles create interesting decisions? Are any mechanically redundant? +3. **Ozzie:** Reading these profiles — does any NPC make you feel something? Which ones fall flat? +4. **Paula/Mellanie:** Where did you make trade-offs or compromises during authoring? What would you change with more time? + +--- + +## Topic 2: Style Guides for Repeatability + +**The question:** If someone new joins the project and needs to write an NPC profile, a location page, or a faction entry — can they produce something consistent with what exists? + +We need explicit style guides that make the wiki reproducible. Not just "here's an example, follow it" but documented conventions. + +**What needs a style guide:** +- NPC profiles: axis definitions, voice sample format, dual-lens structure, triangle role notes +- Location pages: what sections, what detail level, how to cross-reference NPCs and factions +- Faction pages: structure, relationship to locations, political positioning +- Technology/contraband: detail level, gameplay integration notes +- Knowledge entries: FactId naming, confidence progression examples, prerequisite format + +**Questions:** +1. **Mellanie:** What conventions did you follow (or wish existed) when writing monologue-guide.md? +2. **Paula:** Are the Tier 1/2/3 templates documented well enough to replicate? What's implicit that should be explicit? +3. **Gestalt:** What mechanical constraints should be in the style guide? (e.g., "every NPC must have a routine axis because the schedule system reads it") + +--- + +## Topic 3: Regional Style Guide — Pattern + Krenn System Brief + +**The question:** How do we ensure naming and cultural flavor feel historically cohesive rather than generic sci-fi? + +**The vision:** When gates opened, people didn't just mix uniformly everywhere. There are clusters — groups with enough cultural cohesion and financial clout to settle together. Some regions feel distinctly American, Egyptian, Thai, Peruvian, Maya, Aboriginal, or any combination. Corporations add another layer — they may have a heritage or an ethic that shapes naming. In most places, first/last names and location names follow existing real-world patterns. In some places, new naming conventions emerged (the "Star Wars" feel — genuinely novel names from cultural mixing over centuries). + +**Scope for this workshop:** NOT a full set of regional briefs. We need: +1. **A pattern/template** for regional style guides — what a style guide for any region should contain +2. **One filled brief** for Krenn System / Sova Transit District — the v0.1 location, fully specified +3. **Naming principles** — how real-world naming patterns evolve over ~180 years of space settlement + +The pattern should cover: +- Dominant cultural heritage(s) of the region +- Naming conventions (first names, family names, place names, business names) +- Language echoes (what words from heritage languages survive in daily speech?) +- Corporate presence and its naming influence +- How the naming has drifted from Earth-origin patterns (180 years of evolution) +- Aesthetic markers (architecture, food, dress — things that inform environmental text) + +**Questions:** +1. **Miri:** What cultural cluster makes sense for Krenn System? What does 180 years of drift look like? +2. **Gore:** How does cultural identity connect to the game's themes? Should the player notice heritage, or is it ambient? +3. **Paula:** How do naming conventions affect NPC authoring? Do the current 17 NPCs already follow a pattern? +4. **Mellanie:** What environmental text (signs, menus, graffiti) changes based on regional culture? + +--- + +## Topic 4: Wiki Taxonomy Hardening + +**The question:** How do we prevent name collisions, ambiguity, and organizational confusion as the wiki grows beyond v0.1? + +Current issue: "The Terminal" could exist in multiple systems. "Maintenance Corridors" is generic. We already moved locations to `locations/krenn-system/` for disambiguation, but this needs a principled approach. + +**Specific concerns:** +- Location names that recur across systems (terminals, bars, maintenance areas) +- NPC names that could collide (common first names in a larger roster) +- Faction presence varying by system (Commission operates everywhere, Ring is local) +- Technology that has different names in different cultures (same device, local slang) + +**Questions:** +1. **Tyre:** What nesting scheme scales? `locations/{system}/{station}/` or `locations/{system}/`? How deep before it's unwieldy? +2. **Miri:** How do we handle the fact that v0.2+ adds more systems? Do we restructure, or namespace from the start? +3. **Paula:** Do NPC pages need system prefixing, or is the NPC roster per-district sufficient? + +--- + +## Topic 5: Content Directory Structure & Moddability + +**The question:** How does this wiki structure translate to actual game content directories, and how do modders extend it? + +The wiki is the authoring source. But the game needs content in engine-readable format (YAML → parsed at load). The directory structure of the game's `content/` directory matters for: +- Load order (which files override which) +- Mod packaging (modders add/replace content packs) +- Hot-reloading during development +- Content validation (schema checks) + +**Questions:** +1. **Tyre:** Propose a `content/` directory structure that mirrors the wiki but serves the engine. How does a mod overlay work? +2. **Gestalt:** What content is per-district vs. global? (e.g., FactIds are global, NPC profiles are per-district, faction descriptions are global but presence is per-district) +3. **Nigel:** What does a mod look like? "Add a new NPC to the bar" — what files does the modder create? +4. **Tyre:** How does content validation work? Schema per content type, or one schema? + +--- + +## Topic 6: Randomizer, Procedural Generation & PC Briefs + +**The question:** How do we leverage the wiki patterns for procedural variation, and how does a player character fit into NPC structures? + +**The PC-as-NPC concept:** "The Customs Detective" and "The Smuggler" exist as NPC archetypes in multiple districts/stations. When the player starts a game, they get assigned an existing NPC with a name, relationships, and surroundings — then that NPC is "upgraded" to a PC. The NPC's existing brief becomes the player character's starting knowledge, relationships, and position. + +**Randomizer integration:** If locations have style guides and NPCs follow templates, a randomizer can: +- Generate new NPCs from tier templates + regional naming conventions +- Create new triangles from relationship patterns +- Vary which NPC becomes THE FRIEND (from a pool of candidates) +- Shift contraband types, faction pressures, economic conditions + +**Questions:** +1. **Nigel:** What makes the second playthrough feel different? Name 3 things the randomizer should vary. +2. **Gestalt:** How does "PC is an upgraded NPC" work mechanically? What data transfers? What's generated? +3. **Gore:** Does procedural generation dilute the authored moments, or amplify them? +4. **Ozzie:** What's the "wow moment" when a player realizes their character has a pre-existing life in this place? +5. **Paula:** What NPC template fields are required for PC upgrade? Which are optional/generated? + +--- + +## Workshop Format + +**2 rounds.** + +**Round 1 — Topic responses.** Each participant addresses the topics in their domain. Provide concrete proposals, not just observations. If you see a problem, propose a solution. + +**Round 2 — Synthesis.** Cross-pollinate. Respond to each other's proposals. Produce: +1. Decisions to record (new D-entries or amendments) +2. Style guide documents to create +3. Regional brief for Krenn System +4. Content directory structure proposal +5. New tickets for SI to create +6. Amendments to existing wiki pages + +## Expected Outputs + +- **Style guide template:** Reusable pattern for NPC, location, faction, technology wiki pages +- **Regional style guide pattern:** Template for any region's cultural naming/flavor guide +- **Krenn System regional brief:** Filled-in style guide for v0.1 location +- **Wiki taxonomy rules:** Nesting and naming conventions document +- **Content directory structure:** Proposed `content/` layout with mod overlay spec +- **PC-as-NPC spec:** How player character briefs integrate with NPC templates +- **Ticket list:** New tickets from workshop decisions (SI creates post-workshop) +- **Decision amendments:** Updates to existing decisions based on workshop findings + +--- + +## Source Material + +Participants should read before responding: + +- **Wiki index:** `docs/wiki/index.md` +- **NPC roster:** `docs/wiki/npcs/index.md` +- **Kael profile (Tier 1 reference):** `docs/wiki/npcs/kael-davan.md` +- **Sera profile (Tier 1 reference):** `docs/wiki/npcs/sera-venn.md` +- **Relationship states:** `docs/wiki/knowledge/relationship-states.md` +- **Fact catalog:** `docs/wiki/knowledge/fact-catalog.md` +- **Monologue guide:** `docs/wiki/authoring/monologue-guide.md` +- **Decisions:** `decisions/content.md`, `decisions/scope.md`, `decisions/perception.md` +- **Previous workshops:** `docs/workshops/content-gap-analysis_v0_1/`, `docs/workshops/v01-gap-analysis/` From 3944b4e79fe44b0447408a7a4b5477dff6530ff0 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Thu, 12 Feb 2026 16:19:05 +0100 Subject: [PATCH 3/7] 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 --- docs/workshops/v01-content-scoping/SUMMARY.md | 325 +++++ .../v01-content-scoping/round1-dudley.md | 826 ++++++++++++ .../v01-content-scoping/round1-gestalt.md | 468 +++++++ .../v01-content-scoping/round1-mellanie.md | 261 ++++ .../v01-content-scoping/round1-paula.md | 519 ++++++++ .../v01-content-scoping/round1-si.md | 233 ++++ .../v01-content-scoping/round1-stig.md | 373 ++++++ .../v01-content-scoping/round1-tracking.md | 491 +++++++ .../v01-content-scoping/round1-tyre.md | 672 ++++++++++ .../v01-content-scoping/round2-dudley.md | 787 +++++++++++ .../v01-content-scoping/round2-gestalt.md | 422 ++++++ .../v01-content-scoping/round2-mellanie.md | 461 +++++++ .../v01-content-scoping/round2-paula.md | 367 ++++++ .../v01-content-scoping/round2-si.md | 290 +++++ .../v01-content-scoping/round2-stig.md | 375 ++++++ .../v01-content-scoping/round2-tracking.md | 594 +++++++++ .../v01-content-scoping/round2-tyre.md | 1154 +++++++++++++++++ .../v01-content-scoping/si-ticket-changes.md | 295 +++++ .../v01-content-scoping-workshop-brief.md | 227 ++++ 19 files changed, 9140 insertions(+) create mode 100644 docs/workshops/v01-content-scoping/SUMMARY.md create mode 100644 docs/workshops/v01-content-scoping/round1-dudley.md create mode 100644 docs/workshops/v01-content-scoping/round1-gestalt.md create mode 100644 docs/workshops/v01-content-scoping/round1-mellanie.md create mode 100644 docs/workshops/v01-content-scoping/round1-paula.md create mode 100644 docs/workshops/v01-content-scoping/round1-si.md create mode 100644 docs/workshops/v01-content-scoping/round1-stig.md create mode 100644 docs/workshops/v01-content-scoping/round1-tracking.md create mode 100644 docs/workshops/v01-content-scoping/round1-tyre.md create mode 100644 docs/workshops/v01-content-scoping/round2-dudley.md create mode 100644 docs/workshops/v01-content-scoping/round2-gestalt.md create mode 100644 docs/workshops/v01-content-scoping/round2-mellanie.md create mode 100644 docs/workshops/v01-content-scoping/round2-paula.md create mode 100644 docs/workshops/v01-content-scoping/round2-si.md create mode 100644 docs/workshops/v01-content-scoping/round2-stig.md create mode 100644 docs/workshops/v01-content-scoping/round2-tracking.md create mode 100644 docs/workshops/v01-content-scoping/round2-tyre.md create mode 100644 docs/workshops/v01-content-scoping/si-ticket-changes.md create mode 100644 docs/workshops/v01-content-scoping/v01-content-scoping-workshop-brief.md diff --git a/docs/workshops/v01-content-scoping/SUMMARY.md b/docs/workshops/v01-content-scoping/SUMMARY.md new file mode 100644 index 000000000..dc30d8f8c --- /dev/null +++ b/docs/workshops/v01-content-scoping/SUMMARY.md @@ -0,0 +1,325 @@ +# v0.1 Content Scoping Workshop — Summary + +**Date:** 2026-02-12 +**Called by:** Jeroen +**Participants:** Gestalt (Systems Design), Paula (Narrative), Tyre (Architecture), Mellanie (Copywriter), Stig (UI), Dudley (Server), SI (Project Manager), Qatux (Documenter) +**Rounds:** 2 + closing round (lead resolutions) +**Purpose:** Scope and prioritize content work for v0.1 vertical slice. Apply Wiki Review long-term strategy (300-world generator model) to the hand-authored Sova Transit District proof. +**Key constraint:** v0.1 proves the interaction model. All structures must be generator-compatible for the 300-world future. + +**Source files:** +- `docs/workshops/v01-content-scoping/round1-tracking.md` +- `docs/workshops/v01-content-scoping/round2-tracking.md` +- `docs/workshops/v01-content-scoping/si-ticket-changes.md` +- `docs/workshops/v01-content-scoping/v01-content-scoping-workshop-brief.md` +- Round 1 responses: `round1-gestalt.md` through `round1-si.md` +- Round 2 responses: `round2-gestalt.md` through `round2-si.md` + +--- + +## 1. Workshop Overview + +**Round 1** — 7 responses across 6 topics (wiki fixes, NPC architecture, content directory, interaction model, scope boundary, tickets). Produced 17 consensus items, 5 disagreements, 7 wiki gaps, 7 decisions ready to formalize, 26 surviving tickets + 7 new proposals. + +**Round 2** — Lead issued 4 decisions resolving the major disagreements (NPC mapping, content format, interaction model, pause behavior). 7 responses addressed remaining convergence work. Gestalt changed 6 of 10 NPC mapping positions to Paula's reads. Tyre and Dudley independently produced structurally identical ObserverSnapshot v3 definitions. Mellanie delivered canonical PC voice registers and the Kael Davan content pack template. + +**Closing round** — Lead resolved 3 remaining questions: Q-012 (16 EntityKnowledge keys), Q-013 (server-authoritative pause, NEW-12 killed), Q-016 (`verbs[]` rename confirmed). Established process rule: no ticket merges across domain teams. + +--- + +## 2. Decisions Made (D-042 through D-061) + +### From Round 1 Consensus (7) + +| ID | Decision | +|----|----------| +| D-042 | Drin promoted from Tier 3 to Tier 2. | +| D-043 | THE NOBODY mechanic deferred to v0.2; hidden pattern+motivation data ships in v0.1 content files. | +| D-044 | v0.1 interaction model: 7 interactions (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear). | +| D-045 | v0.1 scope IN additions: News ticker, PC-as-NPC, Time progression, Relationship state transitions. | +| D-046 | v0.1 scope OUT additions: Inventory, Stealth, Combat, Player-facing save/load, Lattice modification. | +| D-047 | v0.1 triangles: 3 active forks (T1, T2, T4), 2 passive tensions (T3, T5). | +| D-048 | Client receives all text from server via state updates; client does not load or evaluate content files. | + +### From Round 2 + Closing (13) + +| ID | Decision | +|----|----------| +| D-049 | YAML is the content file format for v0.1. RON converter available as optional build-time tool. Server loads YAML directly; RON cache is a future production optimization. | +| D-050 | Gestalt's NPC pattern/motivation mapping is canonical for v0.1. Paula's emotional/narrative layer becomes v0.2 annotations. Version-toggle approach. | +| D-051 | v0.1 ships single context-sensitive action; multi-verb architecture modeled underneath. Server computes N available verbs per entity. v0.1 client shows priority-0 only. v0.2 client reads full list — no server changes. | +| D-052 | 3-state pause: Normal (100%), Overlay (50%), Paused (0%). Server-authoritative — client is a dumb renderer. Client sends pause IPC command; reads `sim_speed` from ObserverSnapshot. | +| D-053 | Self-contained triangle forks for v0.1. No cross-triangle cascade. v0.2 adds storyteller-managed cascade. | +| D-054 | ObserverSnapshot v3 protocol. Extends v2 with: `sim_speed`, `nearby_interactions`, `active_dialogue`, `monologue`, `overheard`, `knowledge_updates`, `examine_result`, `ticker_headlines`. Backward compatible via serde defaults. | +| D-055 | 16 EntityKnowledge keys. 4 new generic role-perspective keys. `trust_read` merged into `trust_level`. `secret_held` renamed to `leverage_held` (expanded value space). `secret_confidence` → `leverage_confidence`. `social_debt` and `loyalty_conflict` deferred to v0.2. | +| D-056 | PC voice registers defined. Smuggler: feeling-first, fragments, concrete/physical. Detective: analysis-first, complete sentences, institutional vocabulary. | +| D-057 | Content directory: `content/` with `schema/`, `global/`, `districts/` top-level split. JSON Schema validation at build time. Dialogue by location+role. Monologue partitioned by character. | +| D-058 | THE FRIEND content pack template: Kael Davan. 91 lines across 5 arc phases. Becomes template for all subsequent packs. | +| D-059 | Monologue display: 160 char max, 2-line max, 4-6s display, 2s cooldown, queue depth 1, 9-level priority ordering. | +| D-060 | `actions[]` renamed to `verbs[]` across all surfaces (server, client, YAML, wiki, decisions). | +| D-061 | No ticket merges across domain teams. Shared epics fine; each team gets own ticket with own definition of done. | + +--- + +## 3. EntityKnowledge — 16 Keys + +**Architecture:** All keys are observer-to-target. Interpretation lives in content (monologue pools, voice registers, archetype briefs), not schema. Same key, same enum, different meaning per archetype. + +### 12 Existing Keys + +| # | Key | Category | +|---|-----|----------| +| 1 | `name` | Identity | +| 2 | `role` | Identity | +| 3 | `faction` | Identity | +| 4 | `species` | Identity | +| 5 | `location` | Spatial | +| 6 | `routine_pattern` | Behavioral | +| 7 | `trust_level` | Relational (absorbs `trust_read`) | +| 8 | `leverage_held` | Relational (renamed from `secret_held`; expanded: secrets, debts, promises, obligations, compromising positions) | +| 9 | `leverage_confidence` | Relational (renamed from `secret_confidence`) | +| 10 | `relationship_state` | Relational | +| 11 | `behavior_flags` | Behavioral (tracks tells + contradictions) | +| 12 | `known_associates` | Social | + +### 4 New Role-Perspective Keys + +| # | Key | Values | What It Stores | +|---|-----|--------|---------------| +| 13 | `risk_assessment` | none / low / moderate / high / critical | How this NPC threatens observer's position | +| 14 | `loyalty_assessment` | solid / dependable / uncertain / wavering / hostile | How predictably this NPC serves observer's interests | +| 15 | `position_integrity` | solid / thin / cracking / blown / N/A | Status of active deception involving this NPC | +| 16 | `moral_weight` | innocent / peripheral / complicit / compromised / willing | Observer's subjective moral assessment | + +**Deferred to v0.2:** `social_debt` (no favor economy in 30-min session), `loyalty_conflict` (inferable from `behavior_flags` + `loyalty_assessment`). + +**Not added:** `tell_observed`, `contradiction_flagged` — tracked in existing `behavior_flags`. + +--- + +## 4. NPC Mapping + +### v0.1 Canonical (Gestalt's Mechanical Mapping) + +| # | Name | Tier | Pattern | Motivation | +|---|------|------|---------|-----------| +| 1 | Kael Davan | T1 | FRIEND | OPERATOR | +| 2 | Sera Venn | T1 | FRIEND | WITNESS | +| 3 | Naia Tamm | T1* | MIRROR | CIVILIAN | +| 4 | Voss | T2 | SYSTEM | OPERATOR | +| 5 | Lera Sessik | T2 | ANCHOR | OPERATOR | +| 6 | Torek Lintar | T2 | CATALYST | CIVILIAN | +| 7 | Devra | T2 | THRESHOLD | HANDLER | +| 8 | Maret Korr | T2 | WITNESS | SKEPTIC | +| 9 | Resha | T2 | CATALYST | CIVILIAN | +| 10 | Drin | T2 | SYSTEM | TURNCOAT | +| 11 | Renn | T2 | THRESHOLD | OPERATOR | +| 12 | Pell | T2 | CATALYST | TURNCOAT | +| 13 | Harek | T2 | ANCHOR | HANDLER | +| 14 | Sess | T3 | ANCHOR | CIVILIAN | +| 15 | Olin | T3 | CATALYST | CIVILIAN | +| 16 | Sabel | T3 | GHOST | OPERATOR | +| 17 | Tav | T3 | SYSTEM | CIVILIAN | + +**Off-stage:** Nils Davan — GHOST + HANDLER + +**Distribution:** 8 of 9 patterns present (REMNANT correctly absent; NOBODY deferred). All 6 motivations present. CIVILIAN at 6/17 (35%) matches D-029 noise floor (~30%). + +### v0.2 Emotional Layer (Paula's Annotations) + +Paula annotated all 10 disagreement NPCs with emotional/narrative depth descriptions specifying what content each v0.2 motivation/pattern unlocks (~30-50 lines per NPC). The version-toggle approach: same NPCs, same schema, deeper analytical lens. + +### Resolution Process + +Gestalt changed 6 of 10 Round 1 disagreement positions to Paula's reads (Maret pattern+motivation, Resha motivation, Harek pattern, Drin pattern, Sabel pattern, Olin motivation). Gestalt held on 3 (Voss motivation, Devra motivation, Sess pattern). Tav was a design-choice change (NOBODY deferred = SYSTEM+CIVILIAN instead). + +--- + +## 5. Content Architecture + +### Format +YAML for all content files (D-049). RON converter in `tooling/` as optional build-time optimization. Server loads YAML directly via `serde_yaml`. JSON Schema validation at authoring and build time. + +### Directory Structure + +``` +content/ + content.yaml # manifest + _schema/ # JSON Schema files + _meta/ # infrastructure + global/ + facts.yaml + factions.yaml + enums/ # situations, topics, moods, triggers, access-tiers, activities + knowledge/ + entity-attributes.yaml + regions/ + districts/ + sova-transit/ + district.yaml + npcs/ # per-NPC YAML (tier-conditional fields) + locations/ + triangles/ # 5 triangle definitions + lines/ + dialogue/ # by location + role (not NPC) + monologue/ # partitioned by character + routines/ + templates/ +``` + +**Canonical ID format:** `{system}.{station}.{district}.{type}.{slug}` + +### Validation Pipeline (3-tier) +1. **Authoring time:** IDE with JSON Schema autocomplete +2. **Build time:** `make validate-content` — JSON Schema + cross-reference validation +3. **Load time:** serde_yaml deserialization + semantic validation (StableId assignment, relationship wiring) + +### Schemas Defined +- `npc-profile.schema.json` — tier-conditional fields, pattern/motivation enums, axes, tells, access tiers, trust levels, friend_arc, triangle membership +- `dialogue-pool.schema.json` — tagged per D-028/D-035, role+location based, access/trust/situation gating, knowledge_grants +- `monologue-pool.schema.json` — character-partitioned (D-032), trigger+prerequisite (AND-only)+priority+cooldown, 160 char max + +--- + +## 6. Interaction Model + +### 7 Verbs (D-044) +Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear. + +### Architecture +- Server computes N available verbs per entity every tick via `verbs[]` field (D-060 rename from `actions[]`) +- Priority-sorted: context determines which verb surfaces as `[E]` prompt +- Post-contradiction: Examine can rise above Talk (detective investigating flagged NPC) +- `verbs[]` embedded in ObserverSnapshot via `nearby_interactions`, not separate message + +### v0.1 Client +Single context-sensitive action. `[E] Talk` / `[E] Examine`. One keybind. `InteractPrimary` PlayerAction variant sends priority-0 verb. + +### v0.2 Extension +`[E] Talk [F] Observe` — horizontal label row. `InteractWith` PlayerAction variant. Client reads full `verbs[]` list. **No server changes needed.** + +### Convergence +Tyre (`AvailableActions`/`ActionOption`), Dudley (`EntityInteractions`/`AvailableAction`), and Stig (`InteractionOptions`) independently produced structurally identical designs. Naming unification deferred to implementation (Q-015). + +--- + +## 7. Pause System + +### 3 States (D-052) + +| State | Speed | Trigger | +|-------|-------|---------| +| Normal | 100% (1.0) | Default | +| Overlay | 50% (0.5) | Knowledge panel, dialogue | +| Paused | 0% (0.0) | Spacebar (always) | + +### Authority +**Server-authoritative.** Tick rate is a server simulation concern. Client is a dumb renderer — renders ObserverSnapshots at whatever rate the server sends them. Client sends pause IPC command to server. Client reads `sim_speed` from ObserverSnapshot for visual feedback. + +Spacebar from any state goes to Paused. Spacebar from Paused resumes to pre-pause state. Multiple overlays don't stack below 50% in v0.1. + +**NEW-12 (client pause state machine) killed** — client doesn't manage time. Stig's `PauseManager` reduced to sending IPC commands and reading `sim_speed`. + +--- + +## 8. Scope Boundary + +### IN (v0.1) +- WASD movement + collision +- Context-sensitive interaction (7 verbs, single-action prompt) +- Monologue system (tagged triggers, FactId prerequisites, AND-only) +- Knowledge graph (player learns facts, relationships change) +- 2 playable characters (smuggler, detective) +- THE FRIEND arc (Kael for smuggler, Sera for detective) +- 5 triangles: 3 active forks (T1, T2, T4), 2 passive tensions (T3, T5) +- 6 wow moments (D-039) +- 3 social sites (Terminal, Last Shift, Maintenance Corridors) +- NPC routines (schedule-based movement) +- News ticker (world-space at bar) +- PC-as-NPC (other character exists as NPC) +- Time progression (DayPhase) +- Relationship state transitions (Friendly → PersonOfInterest) +- Self-contained triangle forks (no cross-triangle cascade) +- ~695 authored content items (~200 monologue + ~350 dialogue + ~50 environmental + ~20 ticker + ~50 UI + ~25 PC-as-NPC) + +### OUT (v0.1) +- THE NOBODY / dynamic tier promotion (data ships, mechanic deferred) +- Archetype transitions +- Multiple FRIEND candidates per character +- Secondary contraband variation +- Gate network / multi-world +- Content generation / randomization +- Modding support (mod-compatible conventions ship; overlay implementation doesn't) +- Inventory system (evidence is knowledge, not physical items) +- Stealth mechanics (social stealth, not mechanical) +- Combat system +- Player-facing save/load (session-based 30-minute slice) +- Lattice modification/upgrade +- Cross-triangle cascade (storyteller-managed, v0.2) +- `social_debt` / `loyalty_conflict` EntityKnowledge keys + +--- + +## 9. Ticket Summary + +### Counts + +| Category | Count | Teams | +|----------|-------|-------| +| Wiki fixes (A-series) | 8 | copy | +| Style guides & specs (B-series) | 5 | copy | +| Content directory & schema (C-series) | 10 | copy (1), server (8), ci (1) | +| Design specs (D-series) | 2 | server (1), copy (1) | +| Workshop tickets (NEW 1-7) | 7 | copy | +| Lead decision tickets (NEW 8-14, excl. killed NEW-12) | 6 | server (4), client (2) | +| **Total new tickets** | **38** | **copy (21), server (13), client (2), ci (1)** | +| Existing ticket updates | 10 | — | + +### Sprint 3 Allocation + +**Copy team (15 tickets):** +- P0: #261 (Dual Lens Guide — **critical path root**, blocks 9 tickets), C1 (content dir design), A1 (canonical names), A2 (Naia Tamm rename), A7 (smuggler attributes) +- P1: B2 (MIRROR spec), B4 (smuggler voice + moral arc), NEW-1 (NPC mapping), NEW-5 (wow moment checklist), A10 (Nils stub), A11 (Triangle 1 fix) +- P2: B3 (PC-as-NPC spec), A8 (shortcode fix), NEW-2 (Drin expansion), NEW-7 (interaction verb spec) + +**Server team (6 additions to existing 10):** +- C2 (directory skeleton), C3 (schemas), C9 (validate-content CLI), NEW-9 (proximity + InteractionOptions), #326-P1 (loader skeleton), NEW-11 (tick rate scaling) + +**Client team (1 addition):** +- NEW-10 (extensible interaction prompt) + +### Critical Paths + +**Chain 1 — Content Authoring:** +`#261` → B4 → A6 (Sprint 4) → NEW-4 (Sprint 4) → content packs (Sprint 5) + +**Chain 2 — Content Architecture:** +C1 → C2+C3 (Sprint 3) → C4-C8+NEW-3 (Sprint 4) → #326-P2 (Sprint 4) + +**Chain 3 — Interaction Pipeline:** +NEW-7 (soft) → NEW-9 (server) → NEW-10 (client) + +**#261 (Dual Lens Authoring Guide) is the single biggest blocker.** Blocks 9 downstream tickets across the entire content pipeline. Recommended: Paula as owner, 5-day time-box. + +### Key Existing Ticket Updates +- #368: Close (wiki delivered) +- #369: Repurpose as parent epic +- #326: Split into Phase 1 (Sprint 3, skeleton) + Phase 2 (Sprint 4, real content) +- #86: Update ECS component list to workshop output +- #88: Add #237 (A* pathfinding) dependency + +--- + +## 10. Open Items Carried Forward + +| ID | Item | Owner | Priority | +|----|------|-------|----------| +| Q-014 | 3 NPC surnames awaiting Miri validation: Drin Vassar, Sess Torin, Tav Lenn | Miri | Low | +| Q-015 | Interaction struct naming: `AvailableActions` (Tyre) vs `EntityInteractions` (Dudley). Trivial — resolved at implementation time. | Tyre/Dudley | Low | +| Q-017 | 695 authored items validated as scope input but not independently verified by other agents. | SI/Mellanie | Low (informational) | + +None of these block Sprint 3 work. + +--- + +*Compiled by Qatux. Workshop produced 20 decisions (D-042 through D-061), 38 new tickets + 10 updates, canonical NPC mapping for 17 NPCs, 16-key EntityKnowledge spec, full content architecture, and Sprint 3-5 roadmap. 3 minor open items carried forward. #261 is the critical path root.* diff --git a/docs/workshops/v01-content-scoping/round1-dudley.md b/docs/workshops/v01-content-scoping/round1-dudley.md new file mode 100644 index 000000000..31673dcf9 --- /dev/null +++ b/docs/workshops/v01-content-scoping/round1-dudley.md @@ -0,0 +1,826 @@ +# Round 1 — Dudley (Server Developer) + +## Topic 2: NPC Architecture — Server-Side Entity Data & ECS Design + +### Current State + +The server already has a basic NPC component set from D-024 (`server/src/npc/mod.rs`): `Npc` marker, `Want`, `Secret`, `Relationships`, `ToleranceThreshold`, `DailyRoutine`, `InformationInventory`, `Contentment`, `PersonalityTraits`, `TellSystem`, `SkillSet`, `CombatCapability`. These implement the 10-axis model but are string-heavy placeholders. They don't yet encode the three-system NPC model (pattern + motivation + composition). + +The knowledge graph (`server/src/knowledge/`) is production-ready for Sprint 2 scope: `KnowledgeGraph` component with BTreeMap storage, `EntityKnowledge`/`FactKnowledge` entries, confidence hierarchy, decay system, event-driven updates via `KnowledgeEventQueue`. + +### What Each Pattern Requires (System A) + +Patterns define what the character *means to the story*. Most pattern behavior emerges from existing D-024 axes plus a pattern tag and pattern-specific state. The simulation doesn't need a unique system per pattern — it needs the pattern tag to gate content selection and a small amount of pattern-specific state. + +```rust +/// System A: Thematic pattern tag. +/// Drives content selection (which monologue pool, which dialogue options). +/// The pattern itself is behavioral coloring on top of D-024 axes, +/// not a separate simulation system. +#[derive(Component, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum ThematicPattern { + Friend, + Mirror, + Anchor, + Ghost, + Catalyst, + Threshold, + Remnant, + System, + Nobody, +} +``` + +Pattern-specific server-side state needed for v0.1: + +| Pattern | Extra State Beyond D-024 | v0.1? | +|---------|-------------------------|-------| +| FRIEND | `FriendArc` component — phase tracking, contradiction fact IDs, tell progression stage, discovery state | YES (Kael, Sera) | +| MIRROR | None — MIRROR power is *absence* of contradiction. Normal D-024 axes, no secret, no hidden state. | YES (Naia Tamm) | +| ANCHOR | None — contentment axis (already exists) IS the anchor mechanic. | Maybe | +| GHOST | `GhostInfluence` — list of entities this ghost controls, communication channel. Not physically present. | NO (v0.2+) | +| CATALYST | `CatalystTrigger` — arrival condition, disruption event chain. | NO (v0.2+) | +| THRESHOLD | `GateCondition` — what the player needs to pass. Maps to knowledge prerequisites. | Maybe | +| REMNANT | None — InformationInventory with deep historical facts suffices. | Maybe | +| SYSTEM | `InstitutionalRole` — faction affiliation, procedure set, authority level. | YES (Torek) | +| NOBODY | `NobodyState` — promotion stage (Nobody/Noticed/Recognized/Known/Invested), interaction counter, dormant pattern+motivation. | DEFERRED per workshop brief | + +THE FRIEND is the only pattern that requires a dedicated component in v0.1: + +```rust +/// THE FRIEND arc state (D-034). +/// Tracks the emotional progression that exercises every content pipeline. +/// One per FRIEND NPC (Kael for smuggler, Sera for detective). +#[derive(Component, Debug, Clone, Serialize, Deserialize)] +pub struct FriendArc { + /// Which playable character this FRIEND belongs to. + /// The simulation doesn't know "the player" — it knows character IDs. + pub bonded_character: StableId, + /// Current arc phase. Advances based on knowledge events + interaction count. + pub phase: FriendPhase, + /// FactIds that constitute the contradiction (e.g., "kael.secret_meetings"). + /// When the bonded character learns these, phase shifts to Doubt. + pub contradiction_facts: Vec, + /// Tell progression: index into the tell sequence. + /// Tells become more visible as phase advances. + pub tell_stage: u8, + /// Has the bonded character directly observed the contradiction? + pub contradiction_discovered: bool, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum FriendPhase { + /// Default — warmth, trust-building. "We're in this together." + Warmth, + /// Player has hints — something is off. Tells become visible. + Trust, + /// Contradiction evidence accumulating. Monologue turns questioning. + Doubt, + /// Direct confrontation or discovery. Relationship fractures. + Conflict, +} +``` + +### What Each Motivation Requires (System B) + +Motivations define what the character *does in gameplay*. Like patterns, most behavior comes from D-024 axes. The motivation tag gates which interaction options the server offers and how the NPC responds in dialogue selection. + +```rust +/// System B: Functional motivation tag. +/// Drives NPC behavior in interactions — what they want from the player, +/// what information they'll share, how they respond to pressure. +#[derive(Component, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum FunctionalMotivation { + Handler, + Witness, + Turncoat, + Civilian, + Operator, + Skeptic, +} +``` + +Motivation-specific state: + +| Motivation | Extra State | v0.1 Notes | +|-----------|-------------|------------| +| HANDLER | `HandlerState` — which entities they manage, pressure level, directive queue | YES — Voss manages the ring | +| WITNESS | `WitnessKnowledge` — specific observed FactIds, willingness to share, fear level | YES — key investigation mechanic | +| TURNCOAT | `LoyaltyState` — current allegiance, flip conditions, which side they're reporting to | Maybe (depends on NPC mapping) | +| CIVILIAN | None — the *absence* of special state IS the civilian mechanic. Normal D-024 axes. | YES — most Tier 3 NPCs | +| OPERATOR | `OperatorGoal` — current objective, resources managed, competence level | YES — Kael, Lera | +| SKEPTIC | `SkepticTarget` — what institution/system they doubt, what questions they ask | Maybe | + +Most motivations don't need dedicated components. The motivation tag + existing D-024 axes + content tagging (D-035) handle the behavioral differentiation. The server's job is to expose the tag for content selection, not to simulate each motivation as a separate state machine. + +### Proposed ECS Component Design (v0.1 Complete) + +Here's the full component bundle for spawning an NPC entity. Components are split into identity (always present), behavioral (from D-024), pattern/motivation (System A+B), and optional: + +```rust +/// Identity components — every NPC has these +pub struct NpcIdentity { + pub stable_id: StableId, // server-side, never changes + pub canonical_id: String, // content-addressing key ("sova.kael_davan") + pub display_name: String, // "Kael Davan" + pub short_name: String, // "Kael" — used in social contexts (D-036) +} + +/// Content tier — determines simulation depth (D-026 + D-029) +#[derive(Component, Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum ContentTier { + Tier1, // Production-level (FRIEND, MIRROR) — full sim, all axes active + Tier2, // Templated with variation — full sim, most axes active + Tier3, // Procedural filler — background sim, minimal axes +} + +/// Access tier map — D-028 Layer 1. +/// Determines which dialogue access tiers this NPC responds to +/// for each interacting character. +#[derive(Component, Debug, Clone, Serialize, Deserialize)] +pub struct AccessTierMap { + /// Default access tier for unknown characters + pub default_access: AccessTier, + /// Per-entity overrides (e.g., Kael treats smuggler as "insider") + pub overrides: BTreeMap, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum AccessTier { + Public, + Insider, + Authority, + Peer, + Hostile, +} + +/// Trust level for gossip gating — D-028 Layer 3. +/// Per-relationship trust determines disclosure tier. +#[derive(Component, Debug, Clone, Serialize, Deserialize)] +pub struct TrustLevels { + /// Per-entity trust level. Absent = surface only. + pub levels: BTreeMap, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] +pub enum TrustTier { + Surface = 0, + Real = 1, + Secret = 2, +} + +/// Triangle membership — which social triangles this NPC participates in. +/// Used by the server to determine which events ripple through which NPCs. +#[derive(Component, Debug, Clone, Serialize, Deserialize)] +pub struct TriangleMembership { + pub triangles: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TriangleRef { + pub triangle_id: String, // "hub_power", "dock_loyalty", etc. + pub role: String, // NPC's role within this triangle +} + +/// NPC routine — schedule-based movement (D-031 day phases) +#[derive(Component, Debug, Clone, Serialize, Deserialize)] +pub struct NpcRoutine { + pub schedule: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RoutineEntry { + pub phase: DayPhase, + pub location: String, // canonical location ID ("sova.terminal", "sova.last_shift") + pub tile: TilePosition, // exact position within location + pub activity: String, // "working", "drinking", "patrolling" — drives animation + availability +} + +/// Mood state — drives D-035 mood tag selection for dialogue lines +#[derive(Component, Debug, Clone, Serialize, Deserialize)] +pub struct MoodState { + pub current_mood: Mood, + pub stress: f32, // 0.0-1.0, accumulated from events +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum Mood { + Neutral, + Friendly, + Guarded, + Anxious, + Hostile, + Distracted, + Resigned, + Amused, +} +``` + +**Full NPC entity bundle for spawning:** + +```rust +/// Everything needed to spawn a v0.1 NPC entity. +/// Not all components required — ContentTier determines which are populated. +struct NpcBundle { + // Always present: + npc: Npc, + identity: NpcIdentity, + content_tier: ContentTier, + pattern: ThematicPattern, + motivation: FunctionalMotivation, + position: TilePosition, + knowledge: KnowledgeGraph, + routine: NpcRoutine, + + // Tier 1-2: + want: Want, + secret: Secret, + relationships: Relationships, + tolerance: ToleranceThreshold, + information: InformationInventory, + contentment: Contentment, + personality: PersonalityTraits, + tells: TellSystem, + skills: SkillSet, + access_tiers: AccessTierMap, + trust_levels: TrustLevels, + mood: MoodState, + triangles: TriangleMembership, + + // Pattern-specific (optional): + friend_arc: Option, + + // Combat (optional, D-024): + combat: Option, +} +``` + +### Key Design Principle + +The simulation guarantees: **pattern and motivation are tags for content selection, not unique simulation subsystems.** The server doesn't run 9 different pattern AIs. It runs one NPC tick loop that checks the pattern tag when selecting dialogue, scheduling tell visibility, and evaluating arc progression. THE FRIEND is the sole exception in v0.1 because its arc progression is load-bearing for the vertical slice. + +--- + +## Topic 3: Content Loader — Load Sequence & NPC Spawning + +### What the Server Content Loader Needs + +The server needs to transform content files into ECS entities with components. State consistency requires a defined load sequence with validation at each stage. + +**Server content requirements:** + +1. **District definition** — map dimensions, chunk layout, walkability grid, z-levels, location boundaries +2. **NPC profiles** — identity, axes, pattern, motivation, routine, relationships, knowledge, access tiers +3. **FactId catalog** — all valid fact identifiers with metadata (what category, what it means) +4. **Triangle definitions** — which NPCs, what roles, escalation conditions +5. **Dialogue line pools** — tagged lines per D-035 (server does selection, client does display) +6. **Monologue pools** — tagged lines per D-035 (separate per character, D-032) +7. **Contraband definitions** — what items exist, manifest templates for ring operations + +**What the server does NOT need from content files:** +- Visual assets (sprites, tilesets) — client only +- Audio assets — client only +- UI text that isn't dialogue/monologue — client only +- Wiki prose — authoring format only + +### Proposed Load Sequence + +``` +PHASE 1: VALIDATE + Read content manifest (content/manifest.ron) + Validate all referenced files exist + Validate schema compliance (FactId catalog, NPC profiles, etc.) + FAIL FAST if any validation error — do not partially load + +PHASE 2: GLOBAL RESOURCES + Load FactId catalog → FactCatalog resource + Load contraband definitions → ContrabandDefs resource + Load triangle definitions → TriangleDefs resource + Load dialogue pools → DialoguePool resource + Load monologue pools → MonologuePool resource (per-character, D-032) + +PHASE 3: MAP + Load district walkability grid → WalkabilityMap resource (already exists) + Load location boundaries → LocationMap resource (new) + Load interactable object positions → spawn Object entities + +PHASE 4: ENTITIES + For each NPC profile: + Allocate StableId via EntityRegistry + Spawn entity with NpcBundle components (derived from profile) + Initialize KnowledgeGraph with background facts + Set initial position from routine (current day phase) + For each playable character: + Spawn with PlayerCharacter marker + full component set + Initialize KnowledgeGraph with character-specific background + +PHASE 5: RELATIONSHIPS + Wire up Relationships components (now that all StableIds exist) + Wire up AccessTierMap overrides (per-entity access) + Wire up TrustLevels (per-entity trust) + Wire up FriendArc.bonded_character + Wire up TriangleMembership references + +PHASE 6: VERIFY + Assert all StableId references resolve + Assert all routine locations exist in LocationMap + Assert all FactIds in NPC knowledge exist in FactCatalog + Assert FriendArc NPCs exist and are bonded to valid characters + Log load summary: N entities, M facts, K dialogue lines +``` + +Phase ordering matters. Phase 5 requires all entities from Phase 4 to exist (StableId resolution). Phase 3 must complete before Phase 4 (NPCs need valid positions). Phase 2 must complete before Phase 4 (NPCs reference FactIds and dialogue pools). + +### How an NPC Profile Becomes a Spawned Entity + +Assuming RON format (Tyre's call on format — I need structured, typed data, not free-form YAML): + +``` +// content/districts/sova/npcs/kael_davan.ron +NpcProfile( + canonical_id: "sova.kael_davan", + display_name: "Kael Davan", + short_name: "Kael", + content_tier: Tier1, + pattern: Friend, + motivation: Operator, + + // D-024 axes + want: "Exit the ring, protect partner Naia. Wants a clean life.", + secret: "Meeting unknown contact in restricted corridor. Trying to leave the ring.", + tolerance_threshold: 0.65, + contentment: 0.4, + personality: ["loyal", "cautious", "practical"], + skills: ["cargo_handling", "logistics", "forging_manifests"], + combat_trained: false, + + // Routine (D-031 day phases) + routine: [ + (phase: Morning, location: "sova.terminal", tile: (42, 18, 0), activity: "working"), + (phase: Afternoon, location: "sova.terminal", tile: (45, 20, 0), activity: "working"), + (phase: Evening, location: "sova.last_shift", tile: (80, 55, 0), activity: "drinking"), + (phase: Night, location: "sova.residential", tile: (30, 70, 0), activity: "sleeping"), + ], + + // Knowledge — what Kael knows at game start + background_facts: [ + ("contraband.ring_exists", KnowsDetails), + ("contraband.lattice_components", KnowsDetails), + ("npc.voss.is_handler", KnowsDetails), + ("npc.naia.partner", KnowsDetails), + ("location.restricted_corridor", KnowsOf), + ], + + // Relationships (resolved to StableIds at load time via canonical_id lookup) + relationships: [ + (target: "sova.naia_tamm", kind: "partner", trust: Real), + (target: "sova.voss", kind: "handler", trust: Real), + (target: "sova.drin", kind: "colleague", trust: Surface), + ], + + // Access tiers — who can talk to Kael at what level + access: ( + default: Public, + overrides: [ + ("sova.smuggler", Insider), // smuggler PC gets insider access + ("sova.detective", Public), // detective is just another face + ("sova.voss", Peer), + ], + ), + + // FRIEND-specific (only if pattern == Friend) + friend_arc: Some(( + bonded_character: "sova.smuggler", + initial_phase: Warmth, + contradiction_facts: [ + "kael.secret_meetings", + "kael.restricted_corridor_visits", + ], + )), + + // Tell system (D-034) + tells: [ + "Checks comm device when alone — frequency increases as stress rises", + "Avoids eye contact with Voss after receiving new instructions", + "Takes longer routes to avoid restricted corridor during busy hours", + ], +) +``` + +**Load transformation:** + +1. Parser reads `NpcProfile` from RON file +2. Loader allocates `StableId` via `EntityRegistry::register()` +3. Canonical ID → StableId mapping stored in `ContentAddressMap` resource +4. Components constructed from profile fields — string references to other NPCs deferred to Phase 5 +5. `KnowledgeGraph::with_background()` called with the background_facts list +6. Entity spawned with full component bundle +7. Phase 5: `relationships`, `access.overrides`, `trust_levels`, and `friend_arc.bonded_character` resolved using `ContentAddressMap` canonical_id → StableId lookup + +### Resources the Loader Creates + +```rust +/// Maps canonical content IDs to runtime StableIds. +/// Created during Phase 4, used in Phase 5 for reference resolution. +#[derive(Resource)] +pub struct ContentAddressMap { + pub by_canonical: BTreeMap, +} + +/// All valid FactIds in this district + global facts. +/// Used for validation and monologue prerequisite checking. +#[derive(Resource)] +pub struct FactCatalog { + pub facts: BTreeMap, +} + +pub struct FactMetadata { + pub category: String, + pub description: String, + pub discoverable_by: Vec, // which characters can learn this +} + +/// Location boundaries within the district. +/// Maps location IDs to tile regions for proximity triggers. +#[derive(Resource)] +pub struct LocationMap { + pub locations: BTreeMap, +} + +pub struct LocationDef { + pub canonical_id: String, + pub bounds: Vec, // bounding polygon or rect + pub z_level: i32, +} + +/// Tagged dialogue line pool (D-028, D-035). +/// Server selects lines; client displays them. +#[derive(Resource)] +pub struct DialoguePool { + pub lines: Vec, + // Indices by role, access, trust for fast filtering + pub by_role: BTreeMap>, +} + +/// Tagged monologue line pool (D-032, D-035). +/// Separate per playable character — hard partition. +#[derive(Resource)] +pub struct MonologuePool { + pub smuggler: Vec, + pub detective: Vec, +} +``` + +--- + +## Topic 4: Interaction Model — Server Events & Availability + +### Minimum Server Events for v0.1 + +The simulation needs to support four interaction types: approach + dialogue, monologue triggers, object examination, and overhearing. Each requires specific server-side events. + +```rust +/// Interaction events flowing through the server. +/// Produced by interaction systems, consumed by dialogue/monologue/knowledge systems. +#[derive(Debug, Clone)] +pub enum InteractionEvent { + /// Player entered proximity range of an NPC (triggers interaction availability). + /// Range: configurable, default 3 tiles (Manhattan distance). + ProximityEnter { + character: Entity, + target: Entity, + distance: u32, + }, + + /// Player left proximity range of an NPC. + ProximityExit { + character: Entity, + target: Entity, + }, + + /// Player requested interaction with target entity. + /// Server validates: is target in range? Is target interactable? What options? + InteractionRequest { + character: Entity, + target: Entity, + tick: u64, + }, + + /// Server response: available interaction options for this target. + /// Sent to client via ObserverSnapshot extension. + InteractionOptions { + character: Entity, + target: Entity, + options: Vec, + }, + + /// Player selected a dialogue topic/line. + DialogueSelect { + character: Entity, + npc: Entity, + topic: String, + tick: u64, + }, + + /// Server selected a dialogue response (D-035 pipeline output). + DialogueResponse { + npc: Entity, + line_id: String, + text: String, + // Knowledge updates that result from this line being spoken + knowledge_grants: Vec, + }, + + /// Conversation ended (player walked away, topic exhausted, NPC terminated). + DialogueEnd { + character: Entity, + npc: Entity, + reason: DialogueEndReason, + }, + + /// Monologue triggered by game state (D-035 trigger types). + MonologueTrigger { + character: Entity, + trigger_type: MonologueTriggerType, + context: MonologueContext, + }, + + /// Player examined an interactable object. + ExamineObject { + character: Entity, + object: Entity, + tick: u64, + }, + + /// Overheard conversation fragment (proximity-based, D-018 sound model). + OverheardFragment { + listener: Entity, + speakers: Vec, + content_hint: String, // not full text — what the listener picked up + knowledge_grants: Vec, + }, +} + +#[derive(Debug, Clone)] +pub struct InteractionOption { + pub kind: InteractionKind, + pub label: String, // displayed to player + pub enabled: bool, // false = visible but greyed out (shows the player what's possible) + pub disabled_reason: Option, // why it's greyed out +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum InteractionKind { + Talk, // initiate dialogue + Examine, // look more closely + Overhear, // listen to nearby conversation (passive — may not need explicit action) +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum DialogueEndReason { + PlayerLeft, // walked out of range + TopicExhausted, // no more lines available + NpcTerminated, // NPC ended conversation (mood, tolerance) + Interrupted, // another event broke the conversation +} + +/// What knowledge a dialogue line grants when spoken. +#[derive(Debug, Clone)] +pub struct KnowledgeGrant { + pub grant_type: KnowledgeGrantType, +} + +#[derive(Debug, Clone)] +pub enum KnowledgeGrantType { + LearnFact { fact_id: FactId, confidence: KnowledgeConfidence }, + LearnAttribute { target: StableId, key: String, value: String }, + UpdateRelationship { target: StableId, new_state: RelationshipState }, +} + +/// Monologue trigger types (D-035 `trigger` enum). +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum MonologueTriggerType { + EnterLocation, + ObserveNpc, + HearSound, + ObserveAnomaly, + PostConversation, + DiscoverEvidence, + WitnessInteraction, + TimeIdle, + ReturnVisit, +} + +/// Context passed with monologue triggers for line selection. +#[derive(Debug, Clone)] +pub struct MonologueContext { + pub location: Option, + pub observed_npc: Option, + pub relevant_facts: Vec, +} +``` + +### Proximity Trigger System + +```rust +/// System: check proximity between player character and NPCs each tick. +/// Emits ProximityEnter/ProximityExit events when distance crosses threshold. +/// v0.1 uses Manhattan distance on same z-level. Simple, deterministic. +const INTERACTION_RANGE: u32 = 3; + +fn check_proximity( + player_query: Query<(Entity, &TilePosition), With>, + npc_query: Query<(Entity, &TilePosition), With>, + mut proximity_state: ResMut, + mut events: ResMut, + time: Res, +) { + let Ok((player_entity, player_pos)) = player_query.single() else { return }; + + for (npc_entity, npc_pos) in npc_query.iter() { + let distance = player_pos.manhattan_distance(npc_pos); + let in_range = distance.is_some_and(|d| d <= INTERACTION_RANGE); + let was_in_range = proximity_state.is_near(player_entity, npc_entity); + + if in_range && !was_in_range { + proximity_state.set_near(player_entity, npc_entity); + events.push(InteractionEvent::ProximityEnter { + character: player_entity, + target: npc_entity, + distance: distance.unwrap(), + }); + } else if !in_range && was_in_range { + proximity_state.set_far(player_entity, npc_entity); + events.push(InteractionEvent::ProximityExit { + character: player_entity, + target: npc_entity, + }); + } + } +} + +/// Tracks which entities are currently in proximity. +/// BTreeSet for deterministic iteration. +#[derive(Resource, Default)] +pub struct ProximityState { + near_pairs: BTreeSet<(Entity, Entity)>, +} +``` + +### How the Server Determines Available Interaction Options + +When the player sends `PlayerAction::Interact`, the server runs a pipeline: + +``` +1. RANGE CHECK + Is there an NPC or interactable object within INTERACTION_RANGE? + If multiple targets, pick closest (Manhattan distance tiebreaker: lowest StableId). + +2. AVAILABILITY CHECK (per target) + Is the NPC in an interactable activity? (not sleeping, not in combat) + What's the NPC's current mood? (Hostile NPCs may refuse) + Is the NPC already in conversation with someone else? + +3. ACCESS TIER RESOLUTION + Look up AccessTierMap for the interacting character. + Determine: Public / Insider / Authority / Peer / Hostile access level. + +4. OPTION GENERATION + Talk: always available if NPC is interactable + not hostile + Examine: always available for objects, available for NPCs if in LOS + (Overhear is passive — triggered by proximity to NPC-NPC conversations, not by player action) + +5. RESPONSE + Pack InteractionOptions into ObserverSnapshot extension. + Client renders the context-sensitive prompt. +``` + +The critical insight: **the server never sends dialogue text unprompted.** The flow is: +- Server tells client "you can Talk to Kael" (via snapshot) +- Client shows interaction prompt +- Player selects "Talk" +- Server runs dialogue selection pipeline (D-035: access filter → situation filter → trust filter → mood/topic weighted selection) +- Server sends selected line + any knowledge grants +- Client displays line, processes knowledge grants + +This keeps the server authoritative over what you can learn and when. + +### What Goes into the ObserverSnapshot (v3) + +The ObserverSnapshot needs new fields for interaction support: + +```rust +pub struct ObserverSnapshot { + // ... existing v2 fields ... + + /// NPCs currently in interaction range with available options. + pub nearby_interactions: Vec, + + /// Active dialogue state (if in conversation). + pub active_dialogue: Option, + + /// Monologue lines triggered this tick. + pub monologue_lines: Vec, + + /// Overheard fragments (proximity-based). + pub overheard: Vec, +} + +pub struct NearbyInteraction { + pub entity_id: u64, // StableId + pub display_name: String, + pub options: Vec, +} + +pub struct ActiveDialogue { + pub npc_entity_id: u64, + pub npc_name: String, + pub current_line: Option, + pub available_topics: Vec, +} + +pub struct DialogueLineDisplay { + pub line_id: String, + pub text: String, + pub mood: String, +} + +pub struct MonologueLine { + pub line_id: String, + pub text: String, + pub trigger: MonologueTriggerType, +} + +pub struct OverheardLine { + pub speaker_id: u64, + pub fragment: String, +} +``` + +--- + +## Topic 5: Server Features Blocked by Missing Content + +### What I Can Build Right Now (No Content Dependency) + +These server systems are purely structural — they need the *schema* but not the *data*: + +| System | Status | Blocked? | +|--------|--------|----------| +| Content loader framework (Phase 1-6 skeleton) | Can build | NOT blocked — test with fixture data | +| Proximity trigger system | Can build | NOT blocked | +| Interaction event pipeline | Can build | NOT blocked | +| Dialogue selection pipeline (D-035 tag filtering) | Can build | NOT blocked — test with synthetic tagged lines | +| Monologue trigger system | Can build | NOT blocked — test with synthetic lines | +| Monologue prerequisite checker | Already built (KnowledgeGraph.fact_at_least) | Done | +| NPC routine scheduler (day phase → position) | Can build | NOT blocked | +| Knowledge decay | Already built | Done | +| FriendArc phase transition logic | Can build | NOT blocked — trigger conditions are structural | + +### What I Cannot Build Without Content + +| Blocked Feature | What Content Is Missing | Who Produces It | +|----------------|------------------------|-----------------| +| **Actual NPC spawning** | NPC profiles in RON/YAML format. Need all 17 Sova NPCs with axes, routine, relationships, background knowledge, access tiers. | Paula (profiles) + Tyre (format) | +| **Dialogue selection testing with real lines** | Tagged dialogue line pools per D-035. Need at minimum THE FRIEND lines (Kael: ~70-100, Sera: ~70-100) and a baseline pool for Tier 2-3 NPCs. | Mellanie (authored lines) | +| **Monologue testing with real lines** | Tagged monologue pools per D-032/D-035. Need smuggler pool + detective pool, minimum viable before repetition. | Mellanie (authored lines) | +| **NPC routine pathfinding** | District map with walkability data and location definitions. Need the Sova Transit District spatial layout. | Tyre (map format) + Stig (Godot map editor?) | +| **Overheard conversations** | NPC-to-NPC conversation scripts or generation rules. Which NPCs talk to each other, about what, when. | Paula (scripts) + Gestalt (rules) | +| **FactId catalog** | Complete list of discoverable facts for Sova, categorized. Currently wiki has some fact vocabulary but not a machine-readable catalog. | Gestalt (catalog design) + Paula (fact content) | +| **Triangle escalation logic** | Formal escalation conditions for each triangle. "When X learns Y, Z happens." Currently prose descriptions only. | Gestalt (conditions) + Paula (narrative) | +| **Contraband manifest data** | Manifest templates, discrepancy patterns, cargo types. Detective investigation vectors need concrete data. | Miri (setting) + Gestalt (mechanics) | + +### Priority Order for Unblocking + +1. **FactId catalog** — blocks everything knowledge-related. I need the schema NOW, content can come incrementally. +2. **NPC profiles in structured format** — blocks spawning. Even partial profiles unblock integration testing. +3. **District spatial layout** — blocks routine scheduler, proximity system integration testing. +4. **Dialogue line pools** — blocks dialogue pipeline integration. Synthetic data works for unit tests but not for end-to-end. +5. **Monologue line pools** — blocks monologue pipeline integration. Same story. + +### What I Propose to Do in Parallel + +While content is being produced, I'll build with fixture/synthetic data: + +- **Fixture NPC profiles**: hand-write 3-4 test profiles (Kael, Sera, one Tier 2, one Tier 3) in whatever format Tyre proposes. These become the "reference implementation" that real profiles must match. +- **Synthetic dialogue pool**: ~20-30 tagged lines exercising all D-035 tags. Enough to test the selection pipeline, not enough to feel like a game. +- **Synthetic monologue pool**: ~10-15 lines per character with varied trigger types and prerequisites. +- **Test district map**: 50x50 walkable area with 3 blocked-out locations (terminal, bar, corridors). + +This lets me build and test every system end-to-end. When real content arrives, it drops into the same loader — the schema is the contract. + +### One Dependency I Need Resolved + +**The Interact action is currently a no-op** (`server/src/simulation/input.rs:86`). To build the interaction pipeline, I need to extend `PlayerAction` with: + +```rust +pub enum PlayerAction { + // ... existing variants ... + Interact, // becomes: interact with nearest target + InteractWith(u64), // interact with specific entity by StableId + SelectDialogueTopic(String), // choose a topic in active dialogue + EndDialogue, // walk away from conversation +} +``` + +This is a protocol change (ObserverSnapshot v2 → v3). Stig needs to know about the new snapshot fields. I need Tyre's sign-off on the protocol evolution strategy. diff --git a/docs/workshops/v01-content-scoping/round1-gestalt.md b/docs/workshops/v01-content-scoping/round1-gestalt.md new file mode 100644 index 000000000..8db72dd42 --- /dev/null +++ b/docs/workshops/v01-content-scoping/round1-gestalt.md @@ -0,0 +1,468 @@ +# Round 1 — Gestalt (Systems Design) + +*cracks knuckles* + +Let me break down what all of this actually means mechanically. + +--- + +## Topic 1: Wiki Fixes + +### 1a. Do any triangles need restructuring beyond Triangle 1? + +**Triangle 1 (Hub Power)**: Yes, needs a fork. Addressed below. + +**Triangle 2 (Worried Knowledge)**: Structurally sound but smuggler lens is weak. The smuggler "manages" Maret and Drin — that's passive. The smuggler needs a DECISION in this triangle too. Proposed fix: when Maret gets close to reporting, the smuggler can either (a) feed Maret a cover story through Voss, (b) pressure Drin to reassure Maret, or (c) let it ride and hope Maret stays scared. This isn't a restructure — it's adding a smuggler decision node to an existing triangle. + +**Triangle 3 (Bar Tensions)**: Fine as-is. This is a MUNDANE triangle (D-029: 50% mundane). Its job is to be noise floor. Torek's ambiguous spending, Olin's ambiguous intent, Lera's ambiguous loyalty — the player reads signals that might mean nothing. That IS the mechanic. Don't add a fork — the ambiguity IS the fork. The player decides whether to investigate or ignore, and both decisions have consequences (wasted time or missed signal). + +**Triangle 4 (Worried Partner)**: Excellent. No changes. Both FRIEND NPCs are nodes. The triangle IS the contradiction structure. This is the best-designed triangle in the set. + +**Triangle 5 (Informant Question)**: Structurally sound but resolution timing matters. Pell's wavering, Renn's suspicion, Drin's vulnerability — all three paths toward unraveling operate on different timescales. In a 30-minute session, the player observes the TENSION but probably doesn't see the RESOLUTION. That's fine for v0.1 — the tension is the content, the resolution is the hook for continued play. No restructure needed, but we need to be explicit: Triangle 5 is a **passive triangle** in v0.1 (observable tension, unresolved fork). + +**Summary: Active vs. Passive Triangles for v0.1** + +| Triangle | Status | Smuggler Decision? | Detective Decision? | Resolution in 30 min? | +|----------|--------|---------------------|---------------------|----------------------| +| 1: Hub Power | **Active** | YES (escalation fork) | No (observes consequences) | Partial | +| 2: Worried Knowledge | **Active** | YES (manage Maret) | YES (flip Drin or work Maret) | Partial | +| 3: Bar Tensions | **Passive** | No (assess risk) | No (read signals) | No (ambiguity is permanent) | +| 4: Worried Partner | **Active** | YES (protect Kael/lie to Hael) | YES (ask Sera about Hael) | Yes (FRIEND contradiction) | +| 5: Informant Question | **Passive** | No (observes Pell's nervousness) | No (sees downstream signals) | No (hook for continuation) | + +**3 active forks, 2 passive tensions. That's correct for 30 minutes.** + +--- + +### 1b. Triangle 1 Fork Design + +The existing triangle: Nils (off-stage) pushes for higher volume. Voss (shift supervisor) wants stability. Kael is caught between sibling loyalty and operational caution. The smuggler's role is currently passive — they just watch. + +**The fork: The Escalation Decision** + +**Setup (minute 5-10):** Devra approaches the smuggler during a routine shift. Message from Nils: next shipment is double volume. Nils needs more hands and wider timing windows. Voss has to adjust the shift schedule to create a bigger gap. The smuggler is asked to help convince Voss — or handle the extra volume personally. + +**The smuggler decides:** + +| Choice | Immediate Effect | Triangle Consequence | Detective Signal | Mechanical Outcome | +|--------|-----------------|---------------------|-----------------|-------------------| +| **Side with Nils (escalate)** | Extra shipment gets handled. More money. Kael is relieved (less family pressure). | Voss gets more anxious, becomes sloppy. Voss's tells accelerate. Operation becomes more visible. | Manifest discrepancies spike. Voss's behavior flags: `"nervous,schedule_changes,evasive"`. Detective investigation ACCELERATES. | `exposure_risk` increases globally. `cover_integrity` of ring drops to `"thin"`. Wow moment #2 (Character's Eye) triggers EARLIER. | +| **Side with Voss (stabilize)** | Shipment gets rejected or delayed. Nils applies more pressure on Kael directly. | Kael's distraction increases (more contact with exit coordinator). Operation stays quiet but INTERNAL tension builds. | Fewer observable signals. Detective investigation SLOWS. But Kael's tells (lattice checking, distraction) become more visible. | `exposure_risk` stays low. But Kael's `behavior_flags` escalate faster. FRIEND contradiction (wow moment #3) hits HARDER because it comes from internal pressure, not external. | +| **Mediate (delay)** | Smuggler proposes a compromise: half volume increase, phased over two shipments. Neither side satisfied. | Nils loses confidence in the smuggler. Voss is temporarily calmed. Kael is confused ("I thought you were handling this"). | Mixed signals. Operation is inconsistent — some shifts are busier, others normal. Detective reads organizational confusion accurately. | Smuggler's `operational_trust` with Nils drops. Smuggler's relationship with Devra becomes strained. Creates a SECOND decision point later when Nils sends a more forceful message. | + +**What the detective observes (per smuggler choice):** + +The detective doesn't see the decision. They see its CONSEQUENCES: + +- **Post-escalation:** "Voss changed the night shift schedule. Third time this week. The pattern is getting louder." Monologue trigger: `observe_anomaly` + `prerequisite: { "investigation.shift_mismatch": "Suspects" }`. The detective's investigation accelerates because Voss's anxiety produces more observable signals. + +- **Post-stabilize:** "The hub's been quiet this week. Schedules normal. But that dock worker — Kael — he's checked his lattice eleven times this shift." The detective's investigation pivots from institutional signals (schedules, manifests) to personal signals (Kael's behavior). + +- **Post-mediate:** "Something's off. Last night's shift had extra cargo. Tonight it's normal. There's no pattern I can find, and that's the pattern." The detective is confused, which is realistic and interesting — real investigations hit dead ends. + +**Key design note:** The fork doesn't change WHAT the detective discovers — it changes WHEN and HOW. All three paths lead to the ring. The smuggler's choice shapes the detective's journey, not the detective's destination. + +--- + +### 1c. Should Drin be promoted to Tier 2? + +**Yes. Unambiguously.** + +Drin is doing Tier 2 work in a Tier 3 body. Mechanically, Drin is: +- Member of Triangle 2 (Worried Knowledge) — one of our 3 active triangles +- Member of Triangle 5 (Informant Question) — one of our 2 passive triangles +- Compromised by Harek (gambling debt) — a coercion arc +- The easiest NPC for the detective to flip +- The most vulnerable ring asset for the smuggler to manage +- A bridge between 2 triangles across 2 social sites + +A Tier 3 NPC gets ~10-15 authored lines and 3 axes (Want, Routine, Personality). That's not enough for an NPC who appears in 2 triangles and is a potential informant. + +**Tier 2 requires:** + +| Axis | Drin's Content | +|------|---------------| +| **Want** | Keep his job, clear the debt, stop looking over his shoulder | +| **Secret** | Gambling debt to Harek. Harek holds IOUs. Drin looks the other way during inspections in exchange for debt forgiveness. | +| **Relationship 1** | Harek (debt holder, coercer) — fear-based, asymmetric | +| **Relationship 2** | Voss (depends on Drin's compliance) — professional, strained | +| **Relationship 3** | Maret (colleague, doesn't know about Drin's compromise) — guilt-adjacent | +| **Tolerance** | LOW — already past breaking. The compromise IS his post-threshold state. | +| **Routine** | Maintenance shifts, inspection rounds (these ARE the windows he's leaving open) | +| **Information** | Knows inspection schedule gaps, knows he's being used, doesn't know ring structure beyond "someone benefits from my compliance" | +| **Contentment** | Very low. Trapped. Remembers when the job was just a job. | +| **Personality** | Quiet, avoidant, anxious. Doesn't make eye contact during compromised inspections. | +| **Tell** | Changes route when Harek is present. Shorter inspection times on specific shifts. Increased break frequency (stress smoking equivalent). | +| **Skills** | Maintenance tech, inspection procedures. No combat. | + +**Content requirement: ~40-60 authored lines** (Tier 2 standard): +- 15-20 dialogue (routine greetings, deflection, cracking under pressure) +- 8-12 trust-gated (what Drin reveals when scared vs. when trusting) +- 5-8 unprompted (nervous comments, redirect attempts) +- 5-8 monologue per character (detective: "He's hiding something, his inspection times are irregular" / smuggler: "Drin's been twitchy. If he cracks, we're all exposed") + +**Tier adjustment: Tier 3 roster drops from 5 to 4** (Sess, Olin, Sabel, Tav). Tier 2 grows from 10 to 11. Total content budget increase: +30-45 authored lines. This is well within scope for the value Drin provides. + +--- + +## Topic 2: v0.1 NPC Architecture + +### 2a. Full NPC → Pattern + Motivation Mapping + +Here's every NPC mapped. I'm assigning based on what each character DOES in v0.1, not what they might become at 300-world scale. + +| # | Name | Tier | Thematic Pattern | Functional Motivation | Composition Rationale | +|---|------|------|-----------------|----------------------|----------------------| +| 1 | Kael Davan | **T1** | **FRIEND** | **OPERATOR** | Trust anchor hiding a contradiction + running ring cargo operations. FRIEND+OPERATOR = identity betrayal ("I didn't know who you really were") | +| 2 | Sera Venn | **T1** | **FRIEND** | **WITNESS** | Trust anchor hiding a contradiction + carrying unreported evidence. FRIEND+WITNESS = loyalty vs. duty ("She saw something and chose silence") | +| 3 | Voss | T2 | **SYSTEM** | **OPERATOR** | Institutional authority (shift supervisor) + running the schedule that enables smuggling. SYSTEM+OPERATOR = corrupted authority ("The system works for the wrong people") | +| 4 | Lera Sessik | T2 | **ANCHOR** | **OPERATOR** | "Is this enough?" embodied + running a business on willful ignorance. ANCHOR+OPERATOR = contentment with a price ("She makes it work by not looking") | +| 5 | Torek Lintar | T2 | **CATALYST** | **CIVILIAN** | His spending disrupts equilibrium + he's just living his life (spending money, going to the bar). CATALYST+CIVILIAN = accidental disruption ("He doesn't know he's a liability") | +| 6 | Devra | T2 | **THRESHOLD** | **HANDLER** | Gatekeeper between player and ring's deeper layers + managing operations from above. THRESHOLD+HANDLER = obstacle with authority ("You go through her or you don't go") | +| 7 | Maret Korr | T2 | **SYSTEM** | **WITNESS** | Institutional scheduler (the manifests, the numbers) + saw discrepancies she hasn't reported. SYSTEM+WITNESS = honest system under threat ("The numbers don't lie, but she might have to") | +| 8 | Resha | T2 | **CATALYST** | **SKEPTIC** | New hire whose questions force defensiveness + doubts the "mind your business" culture. CATALYST+SKEPTIC = innocent disruption ("They just asked a question. Everyone flinched.") | +| 9 | Naia Tamm | T2 | **MIRROR** | **CIVILIAN** | Honest transparency reveals others' dishonesty + living her life (teaching, worrying about Kael). MIRROR+CIVILIAN = innocence endangered ("The one person who isn't lying, surrounded by liars") | +| 10 | Drin | **T2** (promoted) | **REMNANT** | **TURNCOAT** | Remembers when the job was just a job + loyalty coerced from institution to ring by debt. REMNANT+TURNCOAT = corruption's collateral ("He was an honest inspector once") | +| 11 | Sess | T3 | **ANCHOR** | **CIVILIAN** | Quiet contentment behind the bar + uninvolved, discreet. ANCHOR+CIVILIAN = social wallpaper with depth ("The bartender sees everything and says nothing — because nothing's wrong with his life") | +| 12 | Olin | T3 | **CATALYST** | **SKEPTIC** | New arrival whose presence forces everyone to assess threat + asks questions with ambiguous intent. CATALYST+SKEPTIC = the unknown variable ("Friend or threat? The question itself is the disruption.") | +| 13 | Renn | T2 | **THRESHOLD** | **OPERATOR** | Physical gatekeeper of cargo movement (courier) + competent, goal-oriented, runs the route. THRESHOLD+OPERATOR = the machinery of the operation ("Renn moves the product. Get past Renn, you're inside.") | +| 14 | Pell | T2 | **CATALYST** | **TURNCOAT** | Wavering creates potential disruption to entire operation + loyalty actively shifting. CATALYST+TURNCOAT = ticking bomb ("When Pell breaks, everything moves.") | +| 15 | Harek | T2 | **GHOST** | **HANDLER** | Shapes events through debt leverage on Drin, not through direct ring membership + applies pressure from above (off-duty security with information and leverage). GHOST+HANDLER = invisible power ("Harek doesn't run the ring. He just owns the inspector.") | +| 16 | Sabel | T3 | **THRESHOLD** | **OPERATOR** | Off-station gatekeeper of supply chain + runs the external logistics. THRESHOLD+OPERATOR = distant machinery (1-2 brief appearances, mostly off-stage) | +| 17 | Tav | T3 | **SYSTEM** | **CIVILIAN** | Ring lookout following procedure + uninvolved beyond their assigned role. SYSTEM+CIVILIAN = the lowest rung ("Tav watches the door. That's it. That's the whole job.") | + +**Pattern distribution:** + +| Pattern | Count | NPCs | v0.1 Coverage | +|---------|-------|------|--------------| +| FRIEND | 2 | Kael, Sera | Full (production-level, D-034) | +| MIRROR | 1 | Naia Tamm | Full (T2, emotional depth) | +| ANCHOR | 2 | Lera, Sess | Full + sketch | +| SYSTEM | 3 | Voss, Maret, Tav | Full + sketch | +| THRESHOLD | 3 | Devra, Renn, Sabel | Full + sketch | +| CATALYST | 4 | Torek, Resha, Olin, Pell | Full + sketch | +| GHOST | 1 | Harek | Light (indirect power) | +| REMNANT | 1 | Drin | Light (promoted T2) | +| NOBODY | 0 | — | Deferred to v0.2 | + +**Motivation distribution:** + +| Motivation | Count | NPCs | +|-----------|-------|------| +| OPERATOR | 5 | Kael, Voss, Lera, Renn, Sabel | +| WITNESS | 2 | Sera, Maret | +| HANDLER | 2 | Devra, Harek | +| TURNCOAT | 2 | Drin, Pell | +| CIVILIAN | 5 | Torek, Naia Tamm, Sess, Olin, Tav | +| SKEPTIC | 2 | Resha, Olin | + +Note: Olin gets dual motivation (CIVILIAN/SKEPTIC) because his intent is ambiguous. In the data, he's tagged SKEPTIC (asking questions), but the player doesn't know if that's genuine curiosity or something else. + +**Composition check — does this create interesting interactions?** + +Sova has 4 CATALYSTs. That's a lot. But it's thematically correct: this is a district under pressure. Multiple disruption sources is what makes the ring fragile and the investigation possible. Every CATALYST threatens the status quo differently — Torek through visibility, Resha through innocence, Olin through ambiguity, Pell through betrayal. + +The 5 OPERATORs show a district where everyone is RUNNING something — cargo (Kael), schedules (Voss), a bar (Lera), a route (Renn), a supply line (Sabel). The district hums with operational competence. That's the "quotidian-with-undertow" atmosphere of D-036. + +--- + +### 2b. Required vs. Deferrable Patterns and Motivations + +**Required for v0.1** (must be present AND mechanically exercised): + +| System | Required | Why | +|--------|----------|-----| +| FRIEND | Must ship | Emotional core, D-034, wow moments #3 and #4 | +| MIRROR | Must ship | Proves non-FRIEND Tier 1 depth works. Naia Tamm's honesty is the contrast that makes the liars visible. | +| ANCHOR | Must ship | "Is this enough?" is the thematic question. Lera must embody contentment-with-a-price. | +| SYSTEM | Must ship | Institutional authority is what the detective works within and the smuggler works around. Voss is essential. | +| THRESHOLD | Must ship | The investigation REQUIRES gatekeepers. Devra is the wall between the detective and the ring's interior. | +| CATALYST | Must ship | Without disruption, nothing happens in 30 minutes. Torek or Pell must force someone's hand. | +| OPERATOR | Must ship | People who run things ARE the district. | +| WITNESS | Must ship | Investigation requires witnesses. Sera and Maret. | +| HANDLER | Must ship | Pressure from above drives tension. Devra. | +| TURNCOAT | Must ship | Loyalty shifting is the detective's lever and the smuggler's fear. Drin or Pell. | +| CIVILIAN | Must ship | Noise floor (D-029). Without civilians, every NPC is suspicious. | +| SKEPTIC | Should ship | Questions create friction. Resha's honest questions. Low effort — just give Resha dialogue that asks inconvenient things. | + +**Deferrable to v0.2+:** + +| System | Status | Why Deferrable | +|--------|--------|----------------| +| GHOST (full) | Present, light | Harek's indirect power works at T2 without GHOST-specific mechanics. The "absent power" system (Nils operating off-stage, Ghost entities sending messages through intermediaries) is v0.2 content. | +| REMNANT (full) | Present, light | Drin's "remembers simpler times" is narrative color, not a mechanical system. v0.2 can add REMNANT-specific content (history triggers, memory-based dialogue). | +| NOBODY | **Deferred** | Dynamic tier promotion is a separate system. See 2c. | + +--- + +### 2c. THE NOBODY — Ship in v0.1 or Defer? + +**Recommendation: Ship DATA, defer MECHANIC.** + +| What | v0.1 | v0.2 | +|------|------|------| +| Hidden pattern+motivation in NPC data | YES | YES | +| Tier 3 NPCs have name, routine, greeting | YES | YES | +| Interaction counter (track player attention) | NO | YES | +| Stage transitions (NOBODY → NOTICED → RECOGNIZED → KNOWN → INVESTED) | NO | YES | +| Dormant content activation (hidden Tier 2 content unlocks) | NO | YES | +| Content pool for promotion paths | NO | YES | + +**Why defer the mechanic:** + +1. **System scope**: Dynamic tier promotion requires an interaction counter, trigger evaluation, content activation pipeline, and enough dormant content to justify promotion. Each of those is a system to build, test, and prove. That's v0.2 scope. + +2. **The wow moments don't need it**: D-039 lists 6 wow moments. None require NOBODY promotion. The 30-minute session proves observation, contradiction, divergence, and emotional attachment. NOBODY promotion is a 60+ minute payoff. + +3. **Architectural compatibility**: The content schema includes hidden fields for pattern and motivation from day one. Tier 3 NPCs have `hidden_pattern` and `hidden_motivation` in their content files. The promotion engine reads these when it exists. Zero rework needed. + +4. **Risk reduction**: If NOBODY promotion doesn't work (feels gamey, triggers too easily, content feels thin at activation), we haven't spent v0.1 effort on it. + +**What this means for Tier 3 NPCs in v0.1:** + +Sess, Olin, Sabel, Tav are functional sketches. They have names, routines, greetings, and 10-15 authored lines each. They feel like PEOPLE — they nod at you, they move through the district on schedule, they have brief exchanges with each other. They're just not promotion targets yet. In v0.1, the player's attention is on the 13 NPCs who are already activated (2 Tier 1, 11 Tier 2). That's plenty for 30 minutes. + +--- + +### 2d. Smuggler Attributes → EntityKnowledge Keys + +The wiki review identified 8 smuggler-specific attributes. Here's how they map to the knowledge graph. + +**Existing keys that already serve double duty:** + +| Wiki Attribute | Maps To | How It Works | +|----------------|---------|-------------| +| `trust_read` | **`trust_level`** (existing) | Same key, different interpretation per character. Detective: "will they cooperate?" Smuggler: "will they hold under pressure?" Values already cover both: `"trusted"`, `"reliable"`, `"uncertain"`, `"suspicious"`, `"compromised"`. | +| `leverage_held` | **`secret_held`** (existing) | Leverage IS secret knowledge. Smuggler knowing Drin's gambling debt is stored as `secret_held: "gambling_debt"`. The fact that this is leverage is contextual — the smuggler's operational framework makes it leverage, the detective's framework makes it evidence. Same data, different interpretation. | + +**New smuggler-specific keys (4 for v0.1):** + +| New Key | Value Format | Example | Mechanical Purpose | +|---------|-------------|---------|-------------------| +| `exposure_risk` | enum: `"minimal"`, `"moderate"`, `"high"`, `"critical"` | Torek: `"high"` (spending is visible). Maret: `"moderate"` (smart, might report). | Smuggler risk assessment. Gates monologue: "Torek's spending is going to get us all caught." Drives smuggler decisions about which NPCs to manage. | +| `loyalty_assessment` | enum: `"solid"`, `"reliable"`, `"uncertain"`, `"wavering"`, `"turned"` | Pell: `"wavering"`. Renn: `"solid"`. Kael: `"reliable"` (smuggler doesn't know about exit yet). | Operational trust map. Different from `trust_level` — that's interpersonal, this is operational. You can trust someone personally but doubt their operational loyalty. | +| `cover_integrity` | enum: `"solid"`, `"thin"`, `"cracking"`, `"blown"` | Kael: `"solid"` (baseline) → `"cracking"` (post-contradiction). Voss: `"thin"` (after escalation fork). | Cover assessment. When `cover_integrity` drops, smuggler monologue shifts: "Kael's cover is slipping. If I can see it, so can the detective." | +| `moral_weight` | enum: `"innocent"`, `"peripheral"`, `"complicit"`, `"compromised"`, `"willing"` | Naia Tamm: `"innocent"`. Drin: `"compromised"`. Lera: `"complicit"`. Kael: `"willing"`. | Moral arc driver. The smuggler's Comfort→Doubt→Reckoning→Compromise phases are tracked through who they've assessed as `"innocent"` vs. `"complicit"`. When innocents are threatened, the smuggler doubts. | + +**Deferred to v0.2 (2 keys):** + +| Deferred Key | Why Defer | +|-------------|-----------| +| `social_debt` | Favor economy doesn't have time to develop in 30 minutes. The smuggler doesn't owe or collect favors in the vertical slice — they make decisions. | +| `loyalty_conflict` | Can be inferred from `behavior_flags` + `loyalty_assessment`. Kael's conflict (ring vs. partner) shows up as `behavior_flags: "distracted,evasive"` + implicit knowledge from the smuggler's pre-existing information about Kael's home life. A dedicated key is cleaner but not essential. | + +**Updated EntityKnowledge key count: 18** (14 existing + 4 new smuggler-specific) + +| Category | Keys | Character | +|----------|------|-----------| +| Identity | `name`, `role`, `faction`, `species` | Both | +| Social | `relationship_type`, `trust_level` | Both | +| Behavioral | `routine_pattern`, `behavior_flags` | Both | +| Secret | `secret_held`, `secret_confidence` | Both | +| Detective-specific | `tell_observed`, `contradiction_flagged` | Detective | +| Smuggler-specific | `exposure_risk`, `loyalty_assessment`, `cover_integrity`, `moral_weight` | Smuggler | + +**Symmetry note:** The detective has 2 specific keys (`tell_observed`, `contradiction_flagged`). The smuggler has 4. This asymmetry is intentional and correct. The detective's knowledge graph is EVIDENCE-focused (fewer keys, deeper per-NPC). The smuggler's is RISK-focused (more keys, broader assessment across all NPCs). Different information architectures for different gameplay loops. + +**Full example — Smuggler's knowledge of Drin (post-Drin-promotion, mid-game):** + +```rust +EntityKnowledge { + last_known_position: Some(TilePosition { x: 52, y: 18 }), + last_observed_tick: 1600, + last_updated_tick: 1600, + confidence: KnowledgeConfidence::KnowsDetails, + source: KnowledgeSource::Inferred { + basis: vec![FactId("relationship.trust_network".to_string())], + }, + state: KnowledgeState::Active, + relationship: RelationshipState::Known, + known_attributes: BTreeMap::from([ + ("name".to_string(), "Drin".to_string()), + ("role".to_string(), "maintenance tech".to_string()), + ("faction".to_string(), "civilian".to_string()), + ("relationship_type".to_string(), "asset".to_string()), + ("trust_level".to_string(), "compromised".to_string()), + ("routine_pattern".to_string(), "maintenance shifts, inspection rounds".to_string()), + ("behavior_flags".to_string(), "nervous,avoids_harek_eye_contact".to_string()), + ("secret_held".to_string(), "gambling_debt".to_string()), + ("secret_confidence".to_string(), "confirmed".to_string()), + // Smuggler-specific: + ("exposure_risk".to_string(), "high".to_string()), + ("loyalty_assessment".to_string(), "uncertain".to_string()), + ("cover_integrity".to_string(), "cracking".to_string()), + ("moral_weight".to_string(), "compromised".to_string()), + ]), +} +``` + +**How this drives gameplay:** The smuggler sees Drin and their monologue fires: "Drin's twitchy again. His cover's cracking. If the detective gets to him first, he'll fold in ten seconds." The `exposure_risk: "high"` + `cover_integrity: "cracking"` combination gates a smuggler decision: spend time reassuring Drin (protecting the operation) or write him off and plan for what happens when he breaks. + +--- + +## Topic 4: Minimum Interaction Set + +### What proves the core loop? + +The core loop (D-027 criterion #4): **OBSERVE → NOTICE → FOLLOW → DISCOVER** + +Let me map this to concrete interactions: + +**7 interactions. No more.** + +| # | Interaction | Input | System | Output | Proves | +|---|-------------|-------|--------|--------|--------| +| 1 | **Move** | WASD keys | Movement + collision | Position change, LOS update | Physical embodiment, exploration | +| 2 | **Look** | Passive (automatic) | Perception + LOS | See NPCs, objects, environment | Observation, spatial awareness | +| 3 | **Monologue** | Triggered (automatic) | Monologue system | Internal text + audio chime | Character voice, anomaly detection | +| 4 | **Examine Object** | Context-key on environment | Interaction system | Description text, knowledge update | Environmental investigation | +| 5 | **Examine NPC** | Context-key on NPC (non-dialogue) | Observation system | Behavioral observations, tell detection | Passive intelligence gathering | +| 6 | **Talk** | Context-key on NPC (dialogue) | Dialogue system | Tagged line selection, response | Active information gathering, confrontation | +| 7 | **Overhear** | Passive (proximity) | Sound/proximity system | Overheard dialogue fragments | Environmental intelligence, atmosphere | + +**Why these 7 and not 6 or 8:** + +The critical split is **Examine NPC vs. Talk**. These MUST be separate interactions: + +- **Examine NPC** = study without initiating contact. You watch Kael from across the hub. Monologue fires: "He's checked his lattice three times since I sat down." Updates `behavior_flags` and `tell_observed`. No dialogue, no social cost. + +- **Talk** = initiate dialogue. You walk up to Kael and say something. Tagged line selection fires based on access tier, trust level, situation. Social cost: Kael knows you engaged. NPCs react to being approached. + +The detective's loop is: **Examine first** (accumulate tells across multiple observations) → **Talk later** (use evidence in confrontation). If you collapse Examine and Talk into one "Interact" action, the detective can't study behavior without initiating contact. That breaks the investigation loop. + +The smuggler's loop is inverted: **Talk first** (social, operational, casual) → **Examine when suspicious** ("something's off with Kael, let me watch him"). If you collapse them, the smuggler can't shift from social mode to surveillance mode. + +**Context-sensitive prompt logic:** + +| Target | Range | Available Actions | Prompt Text | +|--------|-------|-------------------|-------------| +| NPC | Out of LOS | None | (not visible) | +| NPC | In LOS, far | Look (auto) | (no prompt — monologue may fire) | +| NPC | In LOS, mid | Look + Examine | `[E] Observe` | +| NPC | In LOS, close | Look + Examine + Talk | `[E] Observe` / `[F] Talk` | +| Object | In LOS, close | Examine | `[E] Examine` | +| NPC conversation | In earshot | Overhear (auto) | (no prompt — text appears as overheard) | + +**What's explicitly NOT in the minimum set:** + +| Excluded | Why | When | +|----------|-----|------| +| Inventory (pick up items) | v0.1 is about observation, not collection. Evidence is knowledge-graph entries, not physical items. | v0.2 | +| Stealth (crouch, hide) | No stealth system. The player's presence is always visible. Managing attention is social, not mechanical. | v0.3+ | +| Combat | Not in D-027 success criteria. No combat encounters in 30-minute session. | v0.2+ | +| Lattice query (search databases) | The detective's analytical lattice works through monologue, not a separate interaction. "Checking the manifest" = Examine Object, not a lattice query UI. | v0.2 (as expansion of Examine) | +| Trade/buy/sell | No economic interaction in v0.1. | v0.3+ | +| Use item | No item use. | v0.2+ | + +**Does this minimum prove the 6 wow moments?** + +| Wow Moment | Required Interactions | Covered? | +|------------|----------------------|----------| +| 1. Arrival | Move + Look + Monologue | YES | +| 2. Character's Eye | Look + Monologue (auto-triggered) | YES | +| 3. FRIEND Contradiction | Look + Examine NPC + Talk | YES | +| 4. Divergence Reveal | Move + Look + Monologue (replay) | YES | +| 5. News Ticker Gut-Punch | Look (read ticker) + Monologue | YES (requires ticker as environmental object, Examine not needed — it's passive text in the environment) | +| 6. Quiet Moment | Move (idle) + Monologue (time_idle trigger) | YES | + +All 6 wow moments are achievable with 7 interactions. No additional interactions required. + +--- + +## Topic 5: v0.1 Scope Boundary + +### Is the IN/OUT split correct? + +Let me go item by item. + +**IN list review:** + +| # | Item | Verdict | Notes | +|---|------|---------|-------| +| 1 | WASD movement + collision | **CORRECT IN** | Non-negotiable. | +| 2 | Context-sensitive interaction | **CORRECT IN** | The 7-interaction model above. | +| 3 | Monologue system | **CORRECT IN** | Drives wow moments #2, #5, #6. | +| 4 | Knowledge graph | **CORRECT IN** | Core mechanic. Without it, nothing gates. | +| 5 | 2 playable characters | **CORRECT IN** | D-027. Non-negotiable. | +| 6 | THE FRIEND arc | **CORRECT IN** | D-034. Non-negotiable. | +| 7 | 5 triangles, 1 fork each | **ADJUST** | 5 triangles YES. But only **3 active forks** (T1, T2, T4). Triangles 3 and 5 are passive (tension visible, fork not resolved). See Topic 1a. | +| 8 | 6 wow moments | **CORRECT IN** | D-039. Non-negotiable (lead directive). | +| 9 | 3 social sites | **CORRECT IN** | Required for triangles and bridge NPCs. | +| 10 | NPC routines | **CORRECT IN** | Routines create the patterns the player reads. Essential for Examine NPC and tell detection. | + +**MISSING from IN — should be added:** + +| Missing Item | Why It Must Be IN | Dependency | +|-------------|-------------------|------------| +| **News ticker** | Wow moment #5 requires a ticker with dual monologue reactions. Must exist as environmental text. | Client (Stig): ticker display. Copy (Mellanie): ticker text + monologue lines. | +| **PC-as-NPC** | When playing smuggler, the detective exists as an NPC (and vice versa). Required for Divergence Reveal (wow moment #4) — second playthrough reveals the other character was there all along. | Content: ~20-30 authored items per PC-as-NPC (SUMMARY confirms). Server: spawn the other PC as an NPC entity. | +| **Time progression** | NPC routines require time to pass. The 30-minute session maps to in-game time (D-031). Without time, routines don't advance, shift transitions don't happen, the smuggling window never opens. | Server (Dudley): game clock. Already decided in D-031. | +| **Relationship state transitions** | The knowledge graph stores `RelationshipState` (Unknown/Known/Friendly/PersonOfInterest/Hostile). FRIEND arc requires Friendly→PersonOfInterest transition. Without state transitions, the color shift (green→amber) never happens. | Server: state machine. Knowledge graph: transition triggers. | + +**OUT list review:** + +| # | Item | Verdict | Notes | +|---|------|---------|-------| +| 1 | THE NOBODY / dynamic tier promotion | **CORRECT OUT** | Data ships, mechanic deferred. See Topic 2c. | +| 2 | Archetype transitions | **CORRECT OUT** | No archetype system in v0.1. | +| 3 | Multiple FRIEND candidates | **CORRECT OUT** | 1 per character. Pool architecture from day one, selection deferred. | +| 4 | Secondary contraband variation | **CORRECT OUT** | Primary contraband fixed (lattice components). Secondary (medical/severance) referenced in dialogue but not mechanically varied per seed. | +| 5 | Gate network / multi-world | **CORRECT OUT** | 1 district. No gates. | +| 6 | Content generation / randomization | **CORRECT OUT** | v0.1 is hand-authored. | +| 7 | Modding support | **CORRECT OUT** | Obviously. | + +**MISSING from OUT — should be explicitly excluded:** + +| Should Be Explicitly OUT | Why | Risk If Not Excluded | +|--------------------------|-----|---------------------| +| **Inventory system** | No item pickup or management. Evidence is knowledge, not physical. | Feature creep. Someone will want "pick up the manifest printout." No. The detective READS the manifest (Examine Object). Knowledge graph updates. No physical item. | +| **Stealth mechanics** | No crouch, hide, LOS manipulation. | Immersive sim instincts will demand it. Defer. The smuggler's "stealth" is social (being in the right place at the right time, having the right cover identity). | +| **Combat system** | No fighting. Zero combat encounters. | D-027 success criteria don't mention combat. If combat appears in v0.1, it ate someone else's scope. | +| **Save/load** | Session-based. Play 30 minutes, experience the slice. No mid-session save. | Testing needs save/load (Dudley's concern). But SHIPPED v0.1 doesn't. Dev-mode save is fine, player-facing save is v0.2. | +| **Lattice modification/upgrade** | Player cannot modify their neural lattice. | Contraband IS lattice components. Someone will ask "can the player use smuggled mods?" No. Not in v0.1. | + +**Revised scope boundary summary:** + +``` +IN (v0.1 — SHIPS): + Core Systems: + [x] WASD movement + collision + [x] 7-interaction model (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear) + [x] Monologue system (tagged triggers, FactId prerequisites, audio chime) + [x] Knowledge graph (EntityKnowledge, FactIds, RelationshipState transitions) + [x] Time progression (game clock, day phases) + [x] NPC routines (schedule-based movement, routine deviations as tells) + + Content: + [x] 2 playable characters (smuggler, detective) + [x] PC-as-NPC (~20-30 authored items per character) + [x] THE FRIEND arc (Kael/smuggler, Sera/detective) + [x] THE MIRROR (Naia Tamm) + [x] 5 triangles (3 active forks, 2 passive tensions) + [x] 3 social sites (Terminal, Last Shift, Maintenance Corridors) + [x] News ticker (environmental text + dual monologue reactions) + [x] 6 wow moments (D-039) + [x] 17 NPCs (2 T1, 11 T2, 4 T3) — Drin promoted + [x] 8 patterns exercised (NOBODY data-only) + [x] 6 motivations exercised + [x] 18 EntityKnowledge keys (14 shared + 2 detective + 4 smuggler, symmetry note: 2 detective-specific keys are deliberately not mirrored as they are not needed) + +OUT (v0.2+): + [ ] THE NOBODY mechanic (dynamic tier promotion) + [ ] Archetype transitions + [ ] Multiple FRIEND candidates per character + [ ] Secondary contraband variation per seed + [ ] Gate network / multi-world + [ ] Content generation / randomization + [ ] Modding support + [ ] Inventory system + [ ] Stealth mechanics + [ ] Combat system + [ ] Player-facing save/load + [ ] Lattice modification/upgrade + [ ] social_debt / loyalty_conflict EntityKnowledge keys +``` + +**Final scope assessment:** The IN list is tight. Every item serves at least one wow moment or D-027 criterion. The 4 additions (news ticker, PC-as-NPC, time progression, relationship state transitions) are all REQUIRED by existing scope items — they're dependencies, not additions. The 5 explicit exclusions (inventory, stealth, combat, save/load, lattice mods) prevent the most likely scope creep vectors. + +Is this fun? Does this create interesting decisions? YES — because the smuggler and detective have different interaction priorities (Talk-first vs. Examine-first), different knowledge keys (operational vs. evidential), and different relationships to the same NPCs. The same 17 NPCs, 5 triangles, and 3 social sites produce two fundamentally different 30-minute experiences. That's the proof. diff --git a/docs/workshops/v01-content-scoping/round1-mellanie.md b/docs/workshops/v01-content-scoping/round1-mellanie.md new file mode 100644 index 000000000..af9190a1f --- /dev/null +++ b/docs/workshops/v01-content-scoping/round1-mellanie.md @@ -0,0 +1,261 @@ +# Round 1 — Mellanie (Copywriter / LIBRARIAN) + +## v0.1 Content Scoping Workshop + +--- + +## Topic 1: Wiki Fixes — Voice Review + +### 1a. Naia Tamm (THE MIRROR) — Voice Samples Needed: YES + +The current Hael profile has three voice samples. All three are anxious: worried-to-Sera, warm-with-Kael-reference, brittle-near-breaking. That's the Worried Partner voice. It's a good voice. It's not THE MIRROR voice. + +THE MIRROR is Tier 1 emotional depth with NO contradiction arc, no secret. Her power is transparency. The wiki summary says: "When events drag the MIRROR into the conspiracy, the damage is devastating — the player broke the one genuinely innocent person." That needs voice samples that establish what innocence sounds like so the player recognizes what they're losing. + +**Naia Tamm needs 5 voice samples minimum:** + +1. **Baseline warm** — How she talks when nothing's wrong. Open, direct, no subtext. This is the calibration line. The player needs to hear what "no hidden agenda" sounds like in a world where everyone has one. + > *"The kids did something brilliant today — Ren figured out the cycle conversion problem by herself. Eight years old. I almost cried in front of the class."* + +2. **Concerned for Kael** — Not the anxious spiral from the current profile. Straightforward worry from someone who doesn't play games. + > *"Kael's been quiet. I don't need an explanation, I need to know they're okay. That's it. That's the whole thing."* + +3. **Perceptive without suspicion** — THE MIRROR reads emotional states accurately but doesn't weaponize the reading. Notices things, says them plainly. + > *"You seem different today. Not bad-different. Just... carrying something. You know you can put it down here, right?"* + +4. **Under pressure** — When events start closing in. THE MIRROR doesn't become evasive or strategic. She becomes more honest, not less. That's what makes it devastating. + > *"Something's happening that nobody's telling me about. I can feel it. I don't want to guess. I want someone to just say it."* + +5. **Damaged** — After events have touched her. THE MIRROR doesn't transform into a different archetype. She stays herself — honest, transparent — but now the honesty includes pain. + > *"I didn't do anything wrong. I know that. But everything's different now, and I can't make it go back."* + +**Voice discipline for THE MIRROR:** Complete sentences. No operational subtext. No evasion vocabulary. Naia doesn't deflect — she states. Where Kael clips ("Don't worry about it") and Sera redirects ("He's just loud"), Naia just... says the thing. That directness is her signature and her vulnerability. + +**Dual-lens note:** Both characters should monologue differently about Naia. The smuggler sees someone to protect ("Naia doesn't know. She can't know."). The detective sees someone too trusting for this environment ("Tamm. Open book. Either she's genuine or she's the best liar in the district. ...No. She's genuine. And that's worse."). + +**Action:** Paula does the rename cascade. I'll write the voice samples above into the updated profile. These five samples are enough for me to author monologue about Naia and dialogue for her. + +--- + +### 1b. Kael and Sera Voice Distinctness — SUFFICIENT, with one gap + +**Kael's voice:** Direct, clipped, practical. Short sentences. Warm through understatement. Evasive through brevity. +- Casual: *"Shift's looking smooth today."* (7 words, done.) +- Evasive: *"It's nothing. Just a thing."* (No elaboration. The silence IS the tell.) + +**Sera's voice:** Competent, precise, conversational. Complete sentences with context. Professional warmth. Evasive through redirection. +- Casual: *"There you are. Grab a seat — Hael was here earlier, you just missed them."* (Provides context, frames the social landscape.) +- Evasive: *"Torek? He's just loud. Gets a couple drinks in him and decides everyone needs to hear his opinions."* (Plausible alternative explanation, delivered smoothly.) + +These are authoring-ready. I can write Kael lines and Sera lines and they won't sound like each other. The distinction is structural: Kael speaks in fragments, Sera speaks in sentences. Kael's warmth is physical presence ("There you are — good"), Sera's warmth is social attention ("Grab a seat, let me tell you about..."). + +**The gap:** I need voice parameters for the smuggler and detective as internal narrators, not just for the NPCs they observe. The monologue guide has example lines but no formal voice sample set for the PC voices. I know what Kael sounds like when he talks. I know what the smuggler sounds like when she thinks ABOUT Kael. But I need a sharper definition of: + +- **Smuggler internal voice:** How terse? How emotional? How operational? The authoring guide examples lean toward short + feeling-forward ("Kael's here. Good — I was starting to worry."). Is that the canonical register? +- **Detective internal voice:** How clinical? How personal? How much institutional vocabulary? The examples lean analytical-with-subtext ("Dock worker. Davan, K. Unremarkable on paper."). Confirm or adjust. + +**Ask:** This might be the voice kit work that's blocked on Paula's Dual Lens Guide (#261). If the workshop can confirm the internal voice registers from the monologue guide examples as canonical, I can start writing without waiting. The examples in the authoring guide are good. Just tell me they're the baseline and I'll scale from there. + +--- + +## Topic 4: Interaction Model — Monologue Pool Sizing + +### How Much Monologue Does v0.1 Need? + +Short answer: **80-110 monologue lines per character, 160-220 total.** + +Here's the math. + +### Trigger Frequency in a 30-Minute Session + +I walked through a mental playthrough. Player enters 3 locations, observes NPCs, has conversations, discovers things, idles, returns to places. Estimated trigger fires: + +| Trigger Type | Fires Per Session | Notes | +|---|---|---| +| `enter_location` | 8-12 | 3 sites, multiple visits | +| `observe_npc` | 15-20 | Known NPCs entering sightlines | +| `hear_sound` | 3-5 | Rare, high-impact | +| `observe_anomaly` | 4-6 | Tells, cargo anomalies | +| `post_conversation` | 6-10 | After dialogue exchanges | +| `discover_evidence` | 3-5 | Physical evidence moments | +| `witness_interaction` | 4-6 | NPC-NPC observations | +| `time_idle` | 3-5 | Player pauses, watches | +| `return_visit` | 4-6 | Returning to familiar locations | +| **Total triggers** | **50-75** | | + +Not every trigger should fire a line. Monologue competes with gameplay for attention. If the inner voice never shuts up, the player stops listening. I'd say the system should fire on **40-50% of eligible triggers** = the player hears **~25-35 monologue lines per playthrough**. + +### Why 80-110 Lines Per Character, Not 25-35? + +Three reasons: + +**1. Prerequisite gating creates narrow windows.** A line gated on `relationship_state: PersonOfInterest` only fires after the contradiction (~minute 15-20). A line with `prerequisite: null` fires from the start. The pool isn't flat — it's a funnel. Many lines are only eligible for part of the session. You need more authored lines than the player will hear because most lines are locked most of the time. + +**2. Repetition threshold.** If the player enters the Terminal 3 times and hears the same arrival line twice, the world feels like a game. Minimum 3 lines per location per trigger type that shares a prerequisite window. Some trigger types need 4-5 variants (especially `observe_npc` for THE FRIEND, who the player sees repeatedly). + +**3. Knowledge progression creates parallel tracks.** The smuggler who knows `contraband.ring_exists` at `KnowsDetails` hears different lines than the smuggler at `Suspects`. Same trigger, same location, different prerequisite — different line. Each confidence level on important FactIds needs its own line. + +### Per-Trigger Breakdown (One Character, All Locations) + +| Trigger Type | Lines Needed | Per Location | Rationale | +|---|---|---|---| +| `enter_location` | 12-15 | 4-5 | Baseline + knowledge-gated variants per site | +| `observe_npc` | 20-25 | varies | 2-3 per observable NPC across relationship states | +| `hear_sound` | 6-8 | 2-3 | Rare trigger, each must count | +| `observe_anomaly` | 8-12 | 3-4 | Tell observations, cargo anomalies, schedule breaks | +| `post_conversation` | 10-15 | varies | 1-2 per NPC conversation, gated on content/outcome | +| `discover_evidence` | 6-8 | 2-3 | Specific evidence moments, heavily gated | +| `witness_interaction` | 6-8 | 2-3 | NPC-NPC observation, relationship-dependent | +| `time_idle` | 6-8 | 2-3 | Character-revealing, atmospheric | +| `return_visit` | 6-8 | 2-3 | Location revisits with accumulated knowledge | +| **Total per character** | **80-107** | | | + +**Two characters x ~95 average = ~190 monologue lines total.** + +Round up for safety margin: **~200 monologue lines** is the target. That gives the player ~25-35 heard lines per session with minimal repetition and knowledge-state variation. + +### THE FRIEND Gets Disproportionate Coverage + +Kael (smuggler's perspective) and Sera (detective's perspective) should each have **15-20 monologue lines** from their respective character's pool — more than any other single NPC. THE FRIEND contradiction is the emotional core. The player needs to feel the warmth, notice the cracks, experience the shift, and live in the contaminated aftermath. That's 4-5 phases x 3-4 lines per phase. + +Other NPCs get 2-4 monologue lines each (first observation, notable behavior, knowledge-gated reactions). Background NPCs might get 1 generic observation line or none. + +--- + +## Topic 5: v0.1 Scope — Content That Must Ship + +### The Hard Numbers + +Everything below is the **floor** — minimum viable for a 30-minute session that doesn't feel empty, repetitive, or placeholder. + +#### 1. Monologue Pools — ~200 lines + +| Category | Smuggler | Detective | Total | +|---|---|---|---| +| THE FRIEND observations | 15-20 | 15-20 | 30-40 | +| Other NPC observations | 20-30 | 20-30 | 40-60 | +| Location arrival/return | 15-20 | 15-20 | 30-40 | +| Evidence/anomaly reactions | 12-15 | 12-15 | 24-30 | +| Atmosphere/idle/sound | 10-12 | 10-12 | 20-24 | +| Post-conversation reactions | 8-12 | 8-12 | 16-24 | +| **Subtotal** | **80-109** | **80-109** | **160-218** | + +**Target: ~200 monologue lines, hard-partitioned by character.** + +#### 2. NPC Dialogue — ~300-400 lines + +| NPC Tier | NPCs | Lines Per NPC | Total | +|---|---|---|---| +| Tier 1 — THE FRIEND (Kael, Sera) | 2 | 70-100 | 140-200 | +| Tier 1 — THE MIRROR (Naia Tamm) | 1 | 50-70 | 50-70 | +| Tier 2 — Essential (Voss, Lera) | 2 | 25-35 | 50-70 | +| Tier 2 — Triangle support (Torek, Maret, others) | 3-4 | 15-25 | 45-100 | +| Tier 3 — Background | 5-8 | 5-10 | 25-80 | +| **Subtotal** | **13-17** | | **310-520** | + +**Target: ~350 dialogue lines across all NPCs.** The FRIEND NPCs account for 40-50% of the dialogue budget. That's correct — they exercise every pipeline. + +#### 3. Environmental Text — ~50 items + +| Category | Count | Examples | +|---|---|---| +| Terminal screens | 8-10 | Shift schedules, manifest summaries, status readouts | +| Safety/regulatory notices | 6-8 | "Authorized personnel beyond this point," hazard markings | +| Bar signage | 4-6 | Menu, house rules, "The Last Shift" sign, back room door | +| Corridor markers | 4-6 | Section labels, access warnings, maintenance tags | +| Lattice/kiosk displays | 4-6 | Commission notices, calibration status, public announcements | +| Interactable documents | 5-8 | Manifest pages, crew rosters, posted schedules (evidence) | +| **Subtotal** | | **~50** | + +#### 4. News Ticker / Meridian Feed — ~20 items + +Headlines that create atmosphere and occasionally deliver world-state information. Mix of: +- Gate network status (3-4 lines) +- Krenn System local news (4-5 lines) +- Commission regulatory notices (3-4 lines) +- Economic/trade reports (3-4 lines) +- Human interest / cultural (3-4 lines) + +**Target: 20 ticker items.** Some are static background; 3-5 should be reactive to game state (new headlines after key events). + +#### 5. UI Microcopy — ~50 strings + +| Category | Count | +|---|---| +| Interaction prompts ("Talk," "Examine," "Listen") | 10-12 | +| Knowledge panel labels and descriptors | 12-15 | +| Relationship state labels (Friendly, PersonOfInterest, etc.) | 5-8 | +| Status messages ("New information," "Contradiction discovered") | 8-10 | +| Tutorial/onboarding monologue (diegetic, D-016) | 10-15 | +| **Subtotal** | **~50** | + +The tutorial text is monologue, not HUD — per D-016, the character teaches the player through internal voice. "How do I interact with this person?" becomes the character thinking *"Sera's over there. Should go say hello."* That's 10-15 lines of contextual teaching buried in the monologue pool. + +#### 6. PC-as-NPC Content — ~20-30 lines + +The other playable character exists as an NPC (D-029 Concept A). The detective exists in the smuggler's world; the smuggler exists in the detective's world. + +- NPC dialogue for the other PC: ~10-15 lines (surface-level, public access, functional) +- Monologue about the other PC: ~5-8 lines per character (identification, assessment, interaction reactions) +- Environmental evidence of the other PC: ~3-5 items (schedule entries, incident reports, lattice traces) + +**Target: ~25 items across both perspectives.** + +--- + +### Grand Total: v0.1 Content That Must Ship + +| Category | Items | Priority | +|---|---|---| +| Monologue pools (2 characters) | ~200 lines | **Critical** — core interaction proof | +| NPC dialogue | ~350 lines | **Critical** — interaction model requires it | +| Environmental text | ~50 items | **High** — world must feel inhabited | +| News ticker | ~20 items | **Medium** — atmosphere, can be thin at launch | +| UI microcopy | ~50 strings | **High** — game is unplayable without it | +| PC-as-NPC content | ~25 items | **Medium** — D-027 requires both characters exist | +| **TOTAL** | **~695** | | + +**~695 authored content items.** Not lines of code. Not generated output. Hand-written, tagged, reviewed content. + +For context: the authoring guide already contains ~40 example monologue lines across 3 sample pools. Those are usable as-is — they're tagged, prerequisite-gated, and voice-correct. That's ~6% of the monologue target. A start, not a finish. + +--- + +### Authoring Order (What I Write First) + +1. **THE FRIEND: Kael content pack** — ~100 lines (dialogue + monologue from both characters). This exercises every tag, every trigger type, every prerequisite format, every access tier. If this works, everything else is variation. + +2. **THE FRIEND: Sera content pack** — ~100 lines. Different contradiction mechanics (cumulative vs. sudden), different voice, same pipeline depth. + +3. **THE MIRROR: Naia Tamm** — ~60-70 lines. Tests the honest-NPC pattern. Simpler prerequisites, no contradiction arc, but full emotional depth. + +4. **Tier 2 NPCs** — ~100-150 lines across Voss, Lera, Torek, Maret. Each gets a focused pack covering their triangle roles. + +5. **Environmental text + ticker** — ~70 items. Can be written in parallel with NPC packs. Uses Miri's setting details. + +6. **Remaining monologue fill** — Top up the pools to ~200 total. Fill gaps in trigger coverage, add knowledge-state variants, idle lines, atmosphere. + +7. **UI copy + tutorial monologue** — ~50 strings. Blocked on Stig's UI spec (need display constraints and interaction prompt format). + +8. **Tier 3 background + PC-as-NPC** — ~50 items. Last priority. These can be thin and still work. + +--- + +### Dependencies / Asks + +| I Need | From | Blocking | +|---|---|---| +| Confirm monologue guide examples as canonical PC voice registers | Gestalt or Paula | Monologue authoring (all) | +| Naia Tamm rename cascade complete | Paula | MIRROR content pack | +| Smuggler-lens sections in NPC profiles | Paula | Smuggler monologue about Tier 2 NPCs | +| Display constraints (char limits, stacking rules, ticker format) | Stig + Araminta | UI microcopy, ticker, environmental text | +| Knowledge state vocabulary (which FactIds gate which content) | Gestalt | Prerequisite authoring for monologue | +| Content file schema (YAML structure confirmed) | Tyre | All content files | + +**Biggest risk:** THE FRIEND content packs are the critical path. If those work — tags validate, prerequisites fire correctly, voice is distinct, dual-lens reads land — everything else scales from the pattern. If those don't work, we find out with 200 lines already written. + +Write the benchmark first. Validate. Then scale. + +--- + +*Mellanie, Round 1. Three words, not thirty — except when you need the numbers.* diff --git a/docs/workshops/v01-content-scoping/round1-paula.md b/docs/workshops/v01-content-scoping/round1-paula.md new file mode 100644 index 000000000..297e46697 --- /dev/null +++ b/docs/workshops/v01-content-scoping/round1-paula.md @@ -0,0 +1,519 @@ +# Round 1 — Paula (Librarian / Narrative & Political Depth) + +## Topic 1: Wiki Fixes + +### 1a. Hael → Naia Tamm Rename — Full Cascade Plan + +**16 files require changes.** The rename touches every file that references Hael by name, including cross-references in profiles, location descriptions, knowledge system examples, and the monologue authoring guide. + +#### File-by-file rename plan + +| # | File | Change Type | Details | +|---|------|-------------|---------| +| 1 | `docs/wiki/npcs/hael.md` | **Rename + rewrite** | File becomes `docs/wiki/npcs/naia-tamm.md`. All internal references change. Header becomes "Naia Tamm — THE MIRROR". Pattern assignment changes from implicit to explicit MIRROR. | +| 2 | `docs/wiki/npcs/index.md` | Content update | Roster table row 9: "Hael" → "Naia Tamm". Triangle 4 diagram: all 3 "Hael" labels. Bridge NPCs table: not listed (Naia isn't a bridge NPC). Social site listing for The Last Shift: "Hael (Teacher)" → "Naia Tamm (Teacher)". | +| 3 | `docs/wiki/index.md` | Content update | NPC listing under Tier 2: `[Hael](npcs/hael.md) — Kael's partner` → `[Naia Tamm](npcs/naia-tamm.md) — Kael's partner`. | +| 4 | `docs/wiki/npcs/kael-davan.md` | Content update | **Heaviest single file.** 20+ occurrences. Axis 1 secondary Want, Axis 2 (deep secret), Relationship 2 (full section), Axis 4 tolerance, Axis 5 routine, Axis 6 information inventory, Axis 7 contentment, Voice sample (Mood: Protective), Dual-lens smuggler notes, Triangle 4 role notes, Secret section, Contradiction arc Phase 1 through 5, Authoring notes. Every "Hael" → "Naia" in dialogue/casual references (Krenn first-name-primary convention). Every "Hael" → "Naia Tamm" in formal/profile references. | +| 5 | `docs/wiki/npcs/sera-venn.md` | Content update | ~15 occurrences. Relationship 2 (full section), Axis 4 tolerance, Axis 5 routine, Axis 6 information inventory, Axis 7 contentment, Tell system, Voice sample, Dual-lens notes, Triangle 4 role notes, Secret section, Contradiction arc, Authoring notes. Same casual/formal distinction as Kael's file. | +| 6 | `docs/wiki/npcs/lera-sessik.md` | Content update | Axis 6 information inventory: "Hael's worry about Kael" → "Naia Tamm's worry about Kael". | +| 7 | `docs/wiki/npcs/maret-korr.md` | Content update | Axis 5 routine: "goes for Hael's company sometimes" → "goes for Naia's company sometimes". | +| 8 | `docs/wiki/authoring/monologue-guide.md` | Content update | Any monologue examples referencing Hael. | +| 9 | `docs/wiki/locations/krenn-system/the-last-shift.md` | Content update | NPC presence list, social dynamics references. | +| 10 | `docs/wiki/world/sova-transit-district.md` | Content update | Any district NPC references. | +| 11 | `docs/wiki/factions/the-ring.md` | Content update | Likely references Hael as collateral/vulnerability for Kael. | +| 12 | `docs/wiki/knowledge/relationship-states.md` | Content update | Any example entries using Hael as a relationship target. | +| 13 | `docs/wiki/knowledge/entity-attributes.md` | Content update | Scan for Hael in example EntityKnowledge entries. | +| 14 | `docs/wiki/knowledge/fact-catalog.md` | Content update | FactId entries referencing Hael (e.g., `npc.hael.worry`, `relationship.kael.hael`). IDs change to `npc.naia_tamm.*` and `relationship.kael.naia_tamm`. | +| 15 | `docs/wiki/world/krenn-system.md` | Content update | NPC naming examples list. | +| 16 | `decisions/content.md` | Content update | D-034 references Hael twice (Kael's partner, Triangle 4). D-036 references Hael in the naming examples list. | + +#### Naming convention for the rename + +Per Krenn System conventions (D-036, Miri Round 1): +- **Formal/profile references:** "Naia Tamm" (full canonical name) +- **Casual/dialogue/in-character references:** "Naia" (first-name-primary, Krenn convention) +- **NPC profile page title:** "Naia Tamm — THE MIRROR" +- **Canonical ID:** `krenn.naia-tamm` +- **Filename:** `naia-tamm.md` + +#### Profile header changes for naia-tamm.md + +The renamed file also needs structural updates to reflect the MIRROR pattern: + +``` +# Naia Tamm — THE MIRROR + +**Tier 1 (MIRROR) NPC** | The Last Shift (Bar) | Mundane +``` + +Note: The brief identifies Naia Tamm as the first MIRROR instance with "Tier 1 emotional depth." The SUMMARY confirms: "50-70 authored lines." This is between Tier 1 (70-100) and Tier 2 (40-60). The profile needs a content requirement update reflecting MIRROR-specific depth: +- ~50-70 authored lines (no generation expansion — same rule as FRIEND) +- Full 10-axis profile (already present in current Tier 2 format) +- NO contradiction arc, NO secret — this is the MIRROR's defining constraint +- Emotional weight comes from what HAPPENS TO Naia, not what Naia hides + +--- + +### 1b. Smuggler Attribute Vocabulary + +The existing EntityKnowledge attributes (entity-attributes.md) are detective-shaped: `tell_observed`, `contradiction_flagged`, `secret_held`, `secret_confidence` all describe an investigative lens. The smuggler needs parallel attributes that describe an operational lens. + +#### Proposed Smuggler-Specific EntityKnowledge Keys + +| Key | Value Format | What It Captures | Examples | +|-----|-------------|------------------|----------| +| `trust_read` | enum: `solid`, `reliable`, `shaky`, `unknown`, `compromised` | Smuggler's assessment of whether this person can be trusted with operational knowledge | Kael: `"solid"` (pre-contradiction), `"compromised"` (post-observation). Voss: `"reliable"`. Drin: `"compromised"` (known vulnerability). | +| `exposure_risk` | enum: `none`, `low`, `moderate`, `high`, `critical` | How much this NPC's behavior threatens operational security | Torek: `"high"` (spending beyond means). Maret: `"moderate"` (observant, could notice). Resha: `"moderate"` (asks questions). Pell: `"critical"` (might turn). | +| `loyalty_assessment` | enum: `committed`, `dependable`, `neutral`, `wavering`, `hostile` | Smuggler's read on where this person's loyalty lies | Renn: `"committed"`. Kael: `"dependable"` (pre-contradiction). Pell: `"wavering"`. Voss: `"dependable"` (financially motivated). | +| `leverage_held` | string or null | What the smuggler knows they could use against this person | Drin: `"gambling debt to Harek"`. Voss: `"schedule manipulation evidence"`. Pell: `"ring membership knowledge"`. | +| `social_debt` | string or null | Favors owed, obligations, reciprocal relationships | Kael: `"years of mutual cover, personal friendship"`. Lera: `"bar provides meeting space, ring provides revenue"`. | +| `moral_weight` | enum: `none`, `light`, `heavy`, `crushing` | How much guilt or moral cost the smuggler feels about this relationship | Naia Tamm: `"heavy"` (lying to Kael's innocent partner). Renn: `"none"` (operational colleague, no personal bond). Maret: `"light"` (knows she's worried, pragmatically ignores it). | +| `cover_integrity` | enum: `solid`, `stressed`, `cracking`, `blown` | Whether this person's cover/role is holding up | Kael: `"stressed"` → `"cracking"` (tells accumulating). Torek: `"cracking"` (spending visible). Devra: `"solid"` (brokering cover holds). | +| `loyalty_conflict` | string or null | Which competing loyalties this person faces | Kael: `"ring vs. Naia Tamm, ring vs. exit attempt"`. Sera: `"Commission vs. Naia Tamm's friendship"`. Voss: `"shift authority vs. Nils's demands"`. | + +#### How smuggler attributes map to EntityKnowledge + +These 8 keys would be added to the `known_attributes` BTreeMap alongside the existing 14. They use the same string:string format. The smuggler's knowledge graph populates them; the detective's does not (or populates them differently — the detective's `trust_read` of an NPC reflects institutional trust, not operational trust). + +#### What a smuggler-lens section looks like in an NPC profile + +Every NPC profile currently has "Dual-Lens Notes" with a "Smuggler" and "Detective" subsection. The smuggler-lens expansion adds structured operational data below the monologue note. Here's what the expanded format looks like, using Voss as an example: + +```markdown +### How the Smuggler Sees Voss + +**Operational Profile:** + +| Attribute | Value | Rationale | +|-----------|-------|-----------| +| trust_read | reliable | Financially motivated, predictable | +| exposure_risk | moderate | Institutional face — first person investigated | +| loyalty_assessment | dependable | Compliant because the money is good | +| leverage_held | schedule manipulation evidence | Smuggler knows Voss adjusts manifests | +| social_debt | null | No personal relationship | +| moral_weight | none | Voss chose this; smuggler doesn't feel guilt | +| cover_integrity | stressed | Manifest reworks are increasing | +| loyalty_conflict | shift authority vs. Nils's demands | Resents being managed, might cooperate if pressured | + +**Monologue tone (baseline):** Operational assessment. *"Voss is tense today. +Nils must have changed the window again."* + +**Monologue tone (post-escalation):** Risk evaluation. *"Voss reworked the +manifest three times today. He's rattled. If he cracks, we're all exposed."* + +**Moral arc phase:** Comfort (baseline) — Voss is a tool, not a person the +smuggler thinks about. If Voss breaks, the phase shifts to Doubt ("Am I +responsible for what happens to him?"). +``` + +Each NPC profile gets this treatment. The smuggler-lens sections should match the detective-lens sections in depth and specificity. The detective reads people through behavioral analysis; the smuggler reads people through operational risk assessment. + +#### Smuggler Moral Arc Phases + +The brief identifies 4 phases: **Comfort → Doubt → Reckoning → Compromise.** These map to the smuggler's relationship with the consequences of the operation: + +| Phase | Trigger | Internal State | Monologue Tone | +|-------|---------|---------------|----------------| +| **Comfort** | Default. The operation is manageable. Money helps. People are fine. | Pragmatic rationalization. "This is a service. Nobody's getting hurt." | Matter-of-fact, confident | +| **Doubt** | Sees the operation's human cost. Naia Tamm's worry. Maret's anxiety. Pell's terror. | Questions the rationalization. "Nobody's getting hurt — except everyone adjacent to this." | Reflective, unsettled | +| **Reckoning** | A specific harm: Pell disappears. Drin is broken. Naia Tamm discovers Kael's secret. The smuggler's actions contributed. | Can't rationalize. Must choose: continue, reform, or exit. | Conflicted, sharp | +| **Compromise** | Player choice determines resolution. Some damage is done. The question becomes: can you live with it? | Whatever the player decided, the cost is visible. | Quiet, weighted | + +Every NPC's smuggler-lens section should include a note about which moral arc phase the relationship triggers or inhabits. + +--- + +### 1c. Nils Davan Stub Page + Triangle 1 Escalation Sequence + +#### Nils Davan Stub Page + +```markdown +# Nils Davan + +**Off-Stage NPC** | Smuggling Ring (Coordinator) | Entangled + +--- + +## Core Identity + +**Name**: Nils Davan +**Age**: 39 +**Role**: Ring coordinator (strategic — personnel, security, growth decisions) +**System Origin**: Krenn System, Station Sova (born and raised, same as Kael) +**Lattice Tier**: Standard professional +**Employer**: Self-employed (freight consulting cover); The Arrangement + (ring leadership) +**Relationship to Kael**: Older sibling + +--- + +## Function + +Nils is the ring's strategic leader — the person who decides volume, +personnel, risk tolerance. Nils brought Kael into the ring ("It's just +moving containers. You're good at logistics. We take care of our own."). +Nils pushes for escalation: higher volume, tighter margins, more profit. +This push is the primary source of tension in Triangle 1 and the catalyst +for Kael's exit attempt. + +**Off-stage in v0.1.** Nils is referenced constantly but never directly +encountered by the player. Nils exists through: +- Kael's dialogue ("Nils wants the next shipment doubled") +- Voss's resentment ("Another 'adjustment' from above") +- Devra's coordination ("Nils says push the timeline forward") +- Renn's reporting ("I told Nils about Pell") + +This is the GHOST pattern: absent power shaping events through influence. + +--- + +## What the Player Knows + +**Smuggler:** Knows Nils exists, knows Nils is Kael's sibling, knows Nils +gives strategic orders. May receive direct instructions from Nils via +lattice communication (voice only — Nils doesn't appear in person). The +smuggler experiences Nils as a disembodied authority figure whose decisions +create consequences the smuggler must manage. + +**Detective:** Doesn't know Nils exists initially. Nils's name surfaces +through investigation: Kael's family records (lattice query), ring members' +references in overheard conversations, Pell's potential testimony. The +detective builds Nils as a conceptual entity before ever having a name — +"someone is giving orders" → "the coordinator" → "Nils Davan, Kael's +sibling." + +--- + +## Escalation Pressure + +Nils is pushing for increased volume because: +1. External demand (Sabel reports higher demand for lattice components + from other systems) +2. Profit motive (higher volume = higher margins, Nils takes the + largest cut) +3. Ambition (Nils wants to expand beyond Sova to other districts on the + station) + +This escalation creates the pressure that: +- Makes Voss anxious (more schedule manipulation, more risk) +- Makes Kael desperate (higher stakes, more danger for Naia) +- Makes Pell crack (risk-to-reward ratio inverted) +- Makes the whole operation more detectable (the detective arrives + during this escalation, not by coincidence) + +--- + +## Pattern + Motivation + +**Pattern:** GHOST — absent power shaping events +**Motivation:** HANDLER — managing operations, applying pressure from above + +--- + +**Cross-References:** [Kael Davan](kael-davan.md), [Voss](voss.md), +[Devra](devra.md), [Renn](renn.md), [Pell](pell.md) +``` + +#### Triangle 1 Escalation Sequence + +Triangle 1 (Hub Power: Voss - Kael - Nils) is currently the weakest triangle because the smuggler role is passive — the smuggler observes tension but doesn't make decisions. Here's the escalation fork: + +**The Nils-vs-Voss Escalation Decision** + +Nils (via lattice message or Devra intermediary) orders a doubled shipment during a window when Voss has already flagged the schedule as too tight. Voss refuses to create the schedule gap. Kael is caught in the middle. + +**Escalation sequence (5 beats across the 30-minute session):** + +| Beat | Timing | Event | Smuggler Sees | Detective Sees | +|------|--------|-------|---------------|----------------| +| 1 | ~5 min | Nils sends order for doubled volume next cycle via Devra | Devra relays: "Nils wants double. Next cycle." Smuggler knows this means tighter windows, more risk. | Nothing visible. Normal hub operations. | +| 2 | ~10 min | Voss pushes back — refuses to rework schedule for the doubled window | Voss is visibly stressed. Clipped with Kael. "I already posted the rotation." | Voss reworks the manifest for the third time (tell). Detective notes nervous schedule adjustments. | +| 3 | ~15 min | Kael asks the smuggler for advice — **THE FORK** | **Decision point.** Kael says: "Nils wants double. Voss says no. I need to talk to one of them. Which one?" | Kael and smuggler have a private conversation the detective can't hear. Observable: Kael and an unknown colleague talking intensely near the break room. | +| 4 | ~20 min | **Path A**: Smuggler backs Voss → smuggler tells Kael to push back on Nils. Kael contacts Nils (via lattice), argues for maintaining current volume. Nils is unhappy. **Path B**: Smuggler backs Nils → smuggler tells Kael to pressure Voss. Kael pressures Voss to comply. Voss capitulates, resentfully. **Path C**: Smuggler stays neutral → smuggler tells Kael to handle it himself. Kael freezes, does nothing. Nils interprets silence as refusal. | **Path A**: Voss relaxes slightly. Manifests stabilize. But Nils has marked the smuggler as unreliable. **Path B**: Voss's schedule suddenly changes again. Fourth manifest revision. Detective monologue: "Something just changed. The schedule revised again — after hours." **Path C**: Nothing changes immediately. But the unresolved tension escalates into Beat 5. | **All paths**: Detective observes varying levels of hub stress. Path B is most detectable (visible schedule change). Path A is least detectable (tension decreases). Path C delays visibility to Beat 5. | +| 5 | ~25 min | **Consequences arrive.** **Path A**: Nils sends a cold message to Kael: "We'll discuss this." Kael is frightened. The smuggler realizes pushing back on Nils has consequences for Kael — and the smuggler is the one who recommended it. **Path B**: The doubled shipment goes through during Voss's reluctant window. Renn runs the courier route. The operation succeeds but Voss's fourth manifest revision creates a data anomaly Maret will find. **Path C**: Nils acts unilaterally — sends the shipment anyway, bypassing normal coordination. Devra scrambles. The operation succeeds sloppily. More detectable. | **Path A**: Kael is visibly shaken. Smuggler monologue: "I told Kael to push back. Now Nils is angry. Did I just put a target on Kael's back?" **Path B**: Smuggler monologue: "It worked. But Voss looks like he's going to break. And Maret was watching the manifests." **Path C**: Smuggler monologue: "I didn't decide. Nils decided for everyone. That's what happens when you don't choose." | **All paths produce detective-visible signals** — the question is timing and magnitude. Path B is loudest. Path C is messiest. Path A is quietest but pushes consequences to the FRIEND contradiction arc. | + +**Why this works:** The smuggler is no longer passive. The decision has immediate consequences (Beat 4) and delayed consequences (Beat 5) that feed into other triangles. Path B feeds Triangle 2 (Maret sees the anomaly). All paths affect Kael's emotional state, which feeds Triangle 4 (Worried Partner). The detective sees the EFFECTS without understanding the cause — which is exactly how occlusion-based investigation works. + +--- + +### 1d. Drin — Tier 2 Promotion Content + +If Gestalt confirms promotion, here's what the expanded Tier 2 profile contains. Drin currently has 3 axes (Want, Routine, Personality) + voice hint + function note. Tier 2 requires all 10 axes + voice sample + dual-lens notes + triangle notes + ~40-60 authored lines. + +#### Axes to add (7 new axes for Drin): + +**2. Secret / Vulnerability:** +- Surface secret: Gambling debt to Harek. Known to bar regulars, not formally reported. +- Deep secret: Drin knows his inspection negligence is being used by the ring. He's not looking away by accident anymore — after the first few "coincidental" clean inspections during flagged container processing, Drin understood the pattern. He's complicit, not just negligent. The debt is the lever; the knowledge is the chain. +- Vulnerability: Double bind. Reporting his compromise exposes him to institutional consequences (negligent inspections). Not reporting makes him deeper complicit each cycle. + +**3. Relationships:** +- Harek: Debt holder. The relationship started as friendly (card games, bar nights). The debt transformed it into a power dynamic Drin can't escape. Harek doesn't even know he's a tool — Harek thinks it's just a card game debt. +- Voss: Shift supervisor. Voss needs Drin's inspections to stay clean. Drin reads Voss's professional attention as surveillance. Every "good work, Drin" from Voss feels loaded. +- Maret Korr: Fellow hub worker. Maret processes the manifests Drin's inspections clear. They share break room time occasionally. Drin is aware that Maret is smart enough to connect his inspection reports to the manifest anomalies. He avoids prolonged interaction with her — not out of guilt, but out of fear. + +**4. Tolerance Threshold:** +- Low and declining. The gambling debt was manageable. The inspection negligence was uncomfortable. The realization that he's actively enabling a smuggling operation has pushed Drin past functional tolerance. He's operating on routine, not commitment. One external push — the detective asking about inspection protocols, Pell approaching him for help, Harek calling in the debt — could trigger a break. + +**5. Daily Routine** (expanded from current): +- 06:00-14:00: Day shift (maintenance rounds + dock inspections) +- Inspection windows: 3-4 per shift, scheduled by Voss. The "compromised" inspections happen during specific bay rotations that align with ring activity. Drin knows which ones. His body language changes during those inspections — faster, less thorough, eyes forward not searching. +- 10:30: Break room. Avoids Harek if present. Avoids Maret for different reasons. May eat alone. +- 14:00-16:00: Post-shift. Home or bar for card games (2x/week — the games continue because stopping would signal awareness). +- Night: Home, insomnia, reviewing what he ignored during the day. + +**6. Information Inventory:** +- Knows: Which containers receive cursory inspections (operational awareness). Harek's debt amount and terms. Voss's schedule patterns. The maintenance corridors' physical layout (pipe access, junction boxes, environmental systems — maintenance tech knowledge). Which corridors have Meridian dead spots. Maret's increasing scrutiny of manifests (observed her checking records after his shifts). +- Doesn't know: Ring structure (Drin doesn't know names, hierarchy, or the operation's scope — only that specific containers are expected to pass). Kael's involvement (Drin works different parts of the bay). Pell, Renn, Devra (has no ring contact — the compromise flows through the debt, not through recruitment). + +**7. Contentment:** +- Very low. Was moderate before the debt became leverage. Drin found satisfaction in maintenance work — fixing things, keeping systems running. The inspection compromise pollutes that satisfaction. Every clean report filed is a small self-betrayal. Drin's contentment trajectory: steady → declining → collapsed. He still finds momentary peace in pure maintenance tasks (pipe repair, wiring, physical work with no moral dimension). + +**8. Personality Traits** (expanded from "quiet, methodical, avoidant"): +- Primary: Avoidant — dodges confrontation, minimizes interaction, retreats into procedural work. +- Secondary: Competent — genuinely skilled at maintenance. The competence is his last source of self-respect. +- Tertiary: Guilty — the guilt is corrosive but suppressed. Manifests as insomnia, shortened social interactions, inability to maintain eye contact during compromised inspections. + +**9. Tell System** (new): + +| Tell | Trigger | Observable To | +|------|---------|---------------| +| Faster inspections on flagged bays | Ring-relevant containers scheduled for his inspection window | Smuggler (knows the pattern), Maret (if comparing inspection times to bay traffic), Detective (if tracking inspection duration data) | +| Avoids Harek at the bar | Debt anxiety — doesn't want casual interaction that reminds him of the leverage | Bar regulars, Detective (if tracking avoidance patterns) | +| Insomnia tells — tired eyes, slower response | Accumulated guilt disrupting sleep | Maret (works near him), Voss (notices the performance dip), anyone paying attention at the hub | +| Refuses to discuss inspection procedures | Topic triggers defensive response — "I run them by the book" | Detective (classic deflection — compare with Sera's topic avoidance), Resha (asks procedural questions, gets stonewalled) | + +**10. Skill Set** (expanded): +- Occupational: Environmental systems maintenance, pipe/wiring repair, dock inspection protocols, equipment calibration, facility safety checks. +- Ring-relevant (involuntary): Knows which inspection windows matter, can identify containers by routing codes, understands bay access schedules. +- Combat tag: No. +- Lattice capability: Baseline. + +#### Voice Sample (Tier 2: 2-3 lines): + +**Mood: Professional (baseline)** +*"Junction 4-C has a pressure variance. I'll need 20 minutes with the coupling. Standard repair."* + +**Mood: Evasive (pressed about inspections)** +*"I run them by the book. Every container gets the standard check. If you've got questions about the process, talk to Voss."* [Flat delivery, eye contact avoided] + +**Mood: Breaking (if directly confronted)** +*"What do you want me to say? I do the inspections. I file the reports. If there's a problem, it's not — I didn't — I just do the job."* [Voice cracks. Eyes down.] + +#### Content requirement: ~40-60 authored lines + +--- + +### 1e. Canonical Names — Which NPCs Need Them + +**5 NPCs already have full canonical names:** +- Kael Davan +- Sera Venn +- Lera Sessik +- Torek Lintar +- Maret Korr + +**1 NPC gains a full name through the rename:** +- Hael → Naia Tamm + +**1 off-stage NPC has a full canonical name:** +- Nils Davan (Kael's sibling — surname established) + +**10 NPCs currently have first names only and need canonical surnames:** + +| NPC | Current Name | Proposed Full Name | Surname Source | Rationale | +|-----|-------------|-------------------|---------------|-----------| +| Voss | Voss | Voss Harsk | Miri's surname list | Short-form first name + consonant-heavy surname. Harsk has the authoritative weight appropriate for a shift supervisor. | +| Devra | Devra | Devra Rosta | Miri's surname list | Mid-form + fluid surname. Rosta has the off-station feel (Devra was born on Orbital Manufacturing Platform 3). | +| Resha | Resha | Resha Neven | Miri's surname list | Mid-form + softer surname. Neven feels younger, matches Resha's 23-year-old new-hire energy. | +| Renn | Renn | Renn Kosse | Miri's surname list | Short-form + double-s surname. Kosse is one of Miri's example names — works as surname for a young courier. | +| Pell | Pell | Pell Talvik | Miri's surname list | Short-form + heritage-weight surname. Talvik is an "old founding family" name per Miri — ironic for someone cracking under pressure. | +| Harek | Harek | Harek Pellam | Miri's surname list | Mid-form + institutional-feeling surname. Pellam has the station security weight. | +| Drin | Drin | Drin Vassar | Extrapolated from Krenn phonetics | Short-form + mid-weight surname. Vassar follows the consonant-vowel-consonant pattern. Not on Miri's list — propose for Miri to validate. | +| Sess | Sess | Sess Torin | Extrapolated from Krenn phonetics | Short-form + compact surname. Torin echoes the utilitarian Krenn naming style. Propose for Miri validation. | +| Olin | Olin | Olin (no surname given) | Deliberate omission | Olin is the ambiguity NPC. A drifter who doesn't volunteer a surname is itself a data point. The detective notes the missing surname; the smuggler reads it as evasion. The absence is load-bearing. | +| Sabel | Sabel | Sabel (surname unknown) | Off-station character | Sabel operates from elsewhere in the Krenn System. No one in Sova uses Sabel's surname — the transactional relationship doesn't require it. If needed later, Miri can generate one. | +| Tav | Tav | Tav Lenn | Extrapolated from Krenn phonetics | Short-form + monosyllabic surname. Tav is young and peripheral — a short, working-class name pair. Propose for Miri validation. | + +**Notes for Miri:** +- 3 surnames are extrapolated (Vassar, Torin, Lenn) and need validation against Krenn phonetic rules. +- 2 NPCs (Olin, Sabel) deliberately omit surnames for narrative reasons. +- Olin's missing surname should be noted in the profile as a deliberate character detail, not a gap. + +**Implementation note:** Per D-036, Krenn convention is first-name-primary in social contexts. Adding surnames does NOT change how NPCs are addressed in dialogue. Surnames appear in: profile headers, formal identification (detective lattice queries), and the player's knowledge graph when they learn the full name. Most players will never use or need the surnames — they exist for world consistency and investigative depth. + +--- + +### 1f. Other Wiki Gaps Not in the Brief + +Having reviewed all 17 NPC profiles, the 3 location files, knowledge system files, and the authoring guide, here are gaps I identified beyond what the brief covers: + +#### Gap 1: PC-as-NPC Profiles Missing + +D-029 references "PC-as-NPC Concept A for v0.1" — the other playable character exists as an NPC (~20-30 authored items). **No wiki content exists for this.** We need: +- A smuggler-as-NPC profile (how the detective sees and interacts with the smuggler character when not played) +- A detective-as-NPC profile (how the smuggler sees and interacts with the detective character when not played) + +These are load-bearing for the dual-lens experience. The smuggler player should encounter "the Commission investigator" as a threatening NPC. The detective player should encounter "the dock worker" as an unremarkable colleague of Kael's. + +**Blocks:** Server entity spawning, dialogue systems, monologue content about the other PC. + +#### Gap 2: Monologue Content Pool — Zero Authored Lines + +The wiki profiles contain example monologue lines (embedded in contradiction arc descriptions), but there is no monologue content file. The authoring guide (`docs/wiki/authoring/monologue-guide.md`) defines the format, but no actual pool exists. Mellanie needs a minimum viable pool before the monologue system can be tested. + +**Blocks:** Monologue system integration testing, client UI monologue display. + +#### Gap 3: NPC Routine YAML Layer Missing + +D-028 and the SUMMARY specify a 2-layer routine format: YAML (engine-readable) + prose (human-readable). The wiki has the prose layer for all NPCs (Section 5 in each profile). The YAML layer does not exist. + +**Blocks:** Server NPC scheduling, routine deviation detection. + +#### Gap 4: Triangle Fork Decision Points Not Mechanically Specified + +Triangle 1's fork is designed above (1c). But Triangles 2-5 also need player decision points specified for both characters. Currently the triangles describe tension but not player agency. Specifically: +- **Triangle 2 (Worried Knowledge):** What decision does the detective make about Maret? (Approach as witness? Apply pressure? Wait?) What does the smuggler decide about Drin? (Reinforce the compromise? Try to relieve pressure?) +- **Triangle 3 (Bar Tensions):** What decision does either character make about Olin? (Investigate? Befriend? Ignore?) What about Torek's spending? (Smuggler: warn him? Detective: follow the money?) +- **Triangle 4 (Worried Partner):** Decision points exist implicitly (in the FRIEND contradiction arcs) but aren't formalized as explicit player choices. +- **Triangle 5 (Informant Question):** What does the smuggler decide about Pell? (Support, report, or manage?) How does the detective find Pell? + +**Blocks:** Storyteller event triggers, dialogue branching, consequence propagation. + +#### Gap 5: FactId Catalog — Smuggler Path Entries Sparse + +The fact catalog (`docs/wiki/knowledge/fact-catalog.md`) likely has detective-oriented entries (manifest discrepancies, behavioral observations). Smuggler-path FactIds need equivalent coverage: operational facts (who handles what), risk assessments, loyalty intelligence. + +**Blocks:** Knowledge graph population for smuggler character, monologue prerequisite checking. + +#### Gap 6: Location Files Lack Smuggler-Specific Detail + +The three location files (Terminal, Last Shift, Maintenance Corridors) describe physical spaces but don't map smuggling-relevant features: dead spots, timing windows, surveillance gaps, handoff points. The smuggler experiences these spaces as an operational landscape; the locations need that layer. + +**Blocks:** Environmental monologue triggers (smuggler entering a corridor and thinking about the operation), spatial gameplay design. + +#### Gap 7: Harek Is Tier 2 But Missing Triangle Membership + +Harek has a full Tier 2 profile (10 axes, voice sample, dual-lens notes) but is explicitly "not a triangle member." He's described as "external pressure on Drin" in Triangle 2. This is structurally odd — Harek does Tier 2 work (the leverage dynamic is essential to Triangle 2 and Triangle 5) without being IN a triangle. If Drin is promoted, Harek's role as the unseen fourth wall of Triangle 2 should be formalized — either as a triangle member or as a named structural role ("external pressure node"). + +--- + +## Topic 2: v0.1 NPC Architecture — Pattern/Motivation Mapping + +The workshop brief asks whether the existing 17 NPCs implicitly match the three-system NPC architecture. **Yes — the profiles were designed before the formal system was named, but the patterns are already present.** Let me make the mapping explicit. + +### Full NPC → Pattern + Motivation Assignment + +| # | NPC | Tier | Pattern | Motivation | Implicit Evidence in Current Profile | +|---|-----|------|---------|-----------|--------------------------------------| +| 1 | Kael Davan | 1 | **FRIEND** | **OPERATOR** | Definitionally THE FRIEND (D-034). Runs dock operations + ring cargo handling. Competent, goal-oriented. | +| 2 | Sera Venn | 1 | **FRIEND** | **WITNESS** | Definitionally THE FRIEND (D-034). Accidentally witnessed manifest discrepancies. Carries information she can't act on. | +| 3 | Naia Tamm | 1* | **MIRROR** | **CIVILIAN** | Established as THE MIRROR (SUMMARY). No contradiction, no secret. Uninvolved in conspiracy. Living their life. | +| 4 | Voss | 2 | **SYSTEM** | **HANDLER** | Institutional embodiment — the shift supervisor IS the legitimate system. Manages operations, applies scheduling pressure. Procedure-citing under stress. | +| 5 | Lera Sessik | 2 | **ANCHOR** | **OPERATOR** | Embodies contentment — "Is this enough? Yes, if the bar stays open." Running the bar is her life. Genuine answer to the thematic question. | +| 6 | Torek Lintar | 2 | **CATALYST** | **CIVILIAN** | His spending forces others to react. Disrupts the bar's equilibrium. Not managing anything — just living visibly. The disruption is unintentional. | +| 7 | Devra | 2 | **THRESHOLD** | **OPERATOR** | Gatekeeper between the local ring and the external supply chain. Running the external coordination. The detective must get past Devra to reach the upstream network. | +| 8 | Maret Korr | 2 | **WITNESS** | **SKEPTIC** | Accidentally witnessed manifest discrepancies (parallel to Sera but from the data side). Doubts the system — the numbers don't add up, and she can't ignore them. | +| 9 | Resha | 2 | **CATALYST** | **CIVILIAN** | Her questions force hub workers to react defensively. New energy disrupting an equilibrium. Not suspicious — just curious in the wrong direction. | +| 10 | Renn | 2 | **THRESHOLD** | **OPERATOR** | Physical gatekeeper — the courier who controls corridor access. Running the transport operation. The detective must trace Renn's routes to map the physical smuggling chain. | +| 11 | Pell | 2 | **CATALYST** | **TURNCOAT** | His potential defection forces a crisis. Loyalty actively shifting. The most dangerous NPC in the ring because his decision cascades everywhere. | +| 12 | Harek | 2 | **ANCHOR** | **HANDLER** | Embodies complacent contentment — "Is this enough? Yes, absolutely." But unconsciously manages Drin through debt leverage. The comfortable man whose comfort creates a tool for others. | +| 13 | Drin | 3→2 | **SYSTEM** | **TURNCOAT** | Institutional embodiment — the dock inspector IS the inspection system. His compromise means the system itself is corrupted. Loyalty shifting under pressure (could crack and cooperate). | +| 14 | Sess | 3 | **NOBODY** | **CIVILIAN** | Social wallpaper. Sees everything, says nothing. Background that could become foreground through player investment. Living their life. | +| 15 | Olin | 3 | **CATALYST** | **CIVILIAN** | New variable forcing evaluation. Ambiguous intent creates productive uncertainty. Uninvolved (as far as anyone knows). | +| 16 | Sabel | 3 | **GHOST** | **OPERATOR** | Absent power — off-station, never fully present. Shapes events through shipments. Running the upstream supply operation. | +| 17 | Tav | 3 | **NOBODY** | **OPERATOR** | Peripheral, barely visible. Running lookout operations at the lowest level. Background ring member who the detective might never notice. | + +*Naia Tamm at "Tier 1 (MIRROR)" — not THE FRIEND tier but production emotional depth. + +#### Off-stage NPC: + +| NPC | Pattern | Motivation | Notes | +|-----|---------|-----------|-------| +| Nils Davan | **GHOST** | **HANDLER** | Absent authority applying pressure through intermediaries. Classic GHOST+HANDLER composition. | + +### Pattern Coverage Analysis + +| Pattern | v0.1 Count | NPCs | Notes | +|---------|-----------|------|-------| +| FRIEND | 2 | Kael, Sera | Core v0.1 requirement (D-034) | +| MIRROR | 1 | Naia Tamm | First MIRROR instance | +| ANCHOR | 2 | Lera, Harek | Both embody "is this enough?" differently | +| GHOST | 2 | Sabel, Nils | Both off-stage — absent power | +| CATALYST | 3 | Torek, Resha, Olin (+ Pell) | Pell is CATALYST by effect, TURNCOAT by motivation | +| THRESHOLD | 2 | Devra, Renn | Both gatekeep access to the operation | +| SYSTEM | 2 | Voss, Drin | Both ARE institutional processes (scheduling, inspection) | +| NOBODY | 2 | Sess, Tav | Minimum viable NOBODY presence | +| REMNANT | 0 | — | **Not represented in v0.1.** No character embodies "remembers when things were different." Acceptable — REMNANT is a long-game pattern that requires historical depth v0.1 doesn't have. | + +**Missing: REMNANT.** This is fine for v0.1. Sova Transit District is 40 years old — there's no deep history for a REMNANT to remember. REMNANT patterns belong on older worlds (mature/ancient drift stages) where someone lived through the founding generation. + +### Motivation Coverage Analysis + +| Motivation | v0.1 Count | NPCs | +|-----------|-----------|------| +| HANDLER | 3 | Voss, Harek, Nils | +| WITNESS | 2 | Sera, Maret | +| TURNCOAT | 2 | Pell, Drin | +| CIVILIAN | 5 | Naia Tamm, Torek, Resha, Olin, Sess | +| OPERATOR | 5 | Kael, Lera, Devra, Renn, Tav | +| SKEPTIC | 1 | Maret | + +**SKEPTIC is underrepresented.** Only Maret doubts the system. But this is mechanically correct — Sova's culture is pragmatic, mind-your-business. Questioning is rare. The detective IS the external skeptic. One internal SKEPTIC (Maret) is enough for v0.1. + +### Composition Highlights + +The most dramatically rich compositions in v0.1: + +| Composition | NPC | Why It Works | +|------------|-----|-------------| +| FRIEND+OPERATOR | Kael | "I was your friend AND I was running the operation you're investigating." Identity betrayal at maximum. | +| FRIEND+WITNESS | Sera | "I was your friend AND I was sitting on evidence the whole time." Concealment as betrayal. | +| MIRROR+CIVILIAN | Naia Tamm | "I was the one innocent person, and the conspiracy touched me anyway." Innocence endangered. | +| SYSTEM+TURNCOAT | Drin | "The system itself is corrupt, and the person embodying it might break." Institutional rot. | +| CATALYST+TURNCOAT | Pell | "The person forcing the crisis is the person whose loyalty is shifting." Maximum instability. | +| GHOST+HANDLER | Nils | "The invisible authority whose pressure creates every visible consequence." Classic absent power. | +| ANCHOR+HANDLER | Harek | "The comfortable man whose comfort creates tools for others." Unconscious complicity. | + +--- + +## Topic 5: Scope Boundary — What Content Is Missing That Blocks Implementation? + +### Content that MUST be authored before coding starts + +These are items where the server or client team cannot proceed without authored content: + +| # | Missing Content | Blocks | Priority | Team | +|---|----------------|--------|----------|------| +| 1 | **Smuggler-lens sections for all 17 NPC profiles** | Smuggler character knowledge graph population, dual-lens monologue selection, smuggler EntityKnowledge examples | Critical | Copy (Paula + Mellanie) | +| 2 | **PC-as-NPC profiles** (smuggler seen by detective, detective seen by smuggler) | Server entity spawning for second character, dialogue with other PC, monologue about other PC | Critical | Copy (Paula) | +| 3 | **Minimum monologue pool** (~50-80 lines per character) | Monologue system integration testing, client UI display, tag taxonomy validation | Critical | Copy (Mellanie) | +| 4 | **NPC routine YAML layer** (engine-readable schedules for all 17 NPCs) | Server NPC scheduling, routine-based movement, deviation detection | Critical | Copy (Paula) + Server (Dudley) format spec | +| 5 | **Triangle fork decision points** (mechanically specified for all 5 triangles) | Storyteller event triggers, dialogue branching, consequence system | High | Copy (Paula + Gestalt) | +| 6 | **Smuggler EntityKnowledge attribute definitions** (8 new keys) | Smuggler knowledge graph implementation, smuggler monologue prerequisites | High | Copy (Paula) + Server (Dudley) | +| 7 | **FactId catalog — smuggler path entries** | Knowledge graph population, monologue prerequisite validation | High | Copy (Paula) | +| 8 | **Content file schema** (wiki → engine-readable format) | Content loader development, hot-reload testing | High | Tyre + Dudley | +| 9 | **Location files — smuggler operational layer** (dead spots, timing windows, handoff points) | Environmental monologue triggers, spatial gameplay, smuggler navigation | Medium | Copy (Paula + Miri) | +| 10 | **Naia Tamm MIRROR-depth content** (~50-70 authored lines) | MIRROR pattern validation, emotional baseline testing | Medium | Copy (Mellanie) | +| 11 | **Nils Davan stub** (as designed in 1c above) | Triangle 1 fork implementation, GHOST pattern reference | Medium | Copy (Paula) — draft provided above | +| 12 | **Drin Tier 2 expansion** (if promoted) | Triangle 2 + Triangle 5 implementation, TURNCOAT pattern testing | Medium | Copy (Paula) — draft provided above | + +### Content that is nice-to-have but does NOT block implementation + +- Full canonical names (surnames) — cosmetic, knowledge graph uses canonical_id not surnames +- NOBODY tier promotion content — explicitly OUT for v0.1 +- Archetype transition mechanics — v0.2+ +- Secondary contraband variation — deferred +- Gate topology — not relevant to single-district v0.1 + +### The honest truth about the gap + +The wiki is detective-complete and smuggler-incomplete. Every NPC profile has a "How the Detective Sees [NPC]" section that provides enough mechanical detail for implementation. The smuggler sections are 1-2 sentence monologue notes. This means the server team could build and test the detective's knowledge graph, monologue system, and interaction model from existing content. They CANNOT do the same for the smuggler. + +The smuggler-lens content is the single largest content gap blocking v0.1 implementation. It's not a small fix — it requires adding structured operational data, moral arc phases, and smuggler-specific EntityKnowledge attributes to every NPC profile. Estimated scope: 17 NPC profiles x ~30 minutes of writing each = ~8-10 hours of focused copy work. + +But what SUSTAINS that across hours of play is the smuggler moral arc. The detective has a clear progression (investigate → discover → confront → resolve). The smuggler needs an equally clear progression (participate → doubt → reckon → compromise). Every NPC interaction should advance or complicate one of those phases. The smuggler-lens sections need to map every NPC to a moral arc phase, not just an operational assessment. + +Let me complicate this further: the smuggler and detective paths aren't just parallel — they're entangled through the NPCs. When the smuggler makes a decision about Pell (Triangle 5), the consequences affect what the detective sees when investigating Pell's disappearance. When the detective pressures Maret (Triangle 2), the smuggler sees Maret's increased anxiety. The cross-character consequence propagation is the v0.1 proof of concept. If we ship smuggler content that doesn't map to detective consequences (and vice versa), we've built two separate games in the same district, not one occlusion-based experience. + +**Recommendation:** Prioritize items 1-4 (smuggler-lens, PC-as-NPC, monologue pool, routine YAML) as Sprint 3 copy team deliverables. Items 5-7 can proceed in parallel with server architecture work. Items 8-12 are dependencies that should be ticketed and scheduled. diff --git a/docs/workshops/v01-content-scoping/round1-si.md b/docs/workshops/v01-content-scoping/round1-si.md new file mode 100644 index 000000000..4c9cff24d --- /dev/null +++ b/docs/workshops/v01-content-scoping/round1-si.md @@ -0,0 +1,233 @@ +# Round 1 — SI (Project Manager) +## Topic 6: Ticket Landscape for v0.1 Content Scoping + +--- + +## 1. Round 2 Ticket List Review — What Survives the 300-World Reframe? + +The Round 2 list (`si-ticket-changes.md`) proposed 29 new tickets across 4 groups. The reframe changes their priority and framing but kills fewer than expected — because v0.1 is hand-authored, most content tickets are still needed. The key shift: every structure created now must be a generator template later. + +### 1a. Tickets That Survive Unchanged + +These are v0.1 essentials unaffected by the 300-world reframe: + +| R2 ID | Title | Team | Rationale | +|-------|-------|------|-----------| +| A1 | Apply canonical full names to all NPC wiki pages | copy | Required for v0.1 content. Names are content, not metadata. | +| A2 | Rename Hael → Naia Tamm across all wiki files | copy | Unanimous decision. Blocks all Naia content. | +| A7 | Add 5 smuggler-specific entity attributes | copy | Dual-lens parity is a v0.1 requirement (D-027). | +| A8 | Standardize location shortcodes in monologue-guide | copy | Bug fix. Blocks monologue authoring. | +| A10 | Stub NPC profile for Nils Davan | copy | Required for Triangle 1 fix. | +| A11 | Fix Triangle 1 — add Volume Escalation decision | copy | v0.1 requires 5 triangles with forks (D-027, D-039). | +| B2 | THE MIRROR pattern spec | copy | Required for Naia Tamm. Also becomes a generator template. | +| B3 | PC-as-NPC unified spec | copy | Required for two-character proof (D-027). | +| B4 | Smuggler voice card + moral arc spec | copy | Dual-lens parity. Also becomes a generator template. | +| B5 | NPC-format briefs for both PCs | copy | Required for wow moment #4 (Divergence Reveal). | +| C1 | Content directory structure design doc | copy | Prerequisite for all content conversion. | + +### 1b. Tickets That Survive — Reframed + +These still need doing but their framing shifts to "generator template first": + +| R2 ID | Title | Team | Reframe | +|-------|-------|------|---------| +| A3 | Create wiki/cultural-groups/krenn-system.md | copy | Becomes the reference implementation for seed.yaml + brief.md dual artifact. Overlaps with existing #319. **Merge** A3 into #319 with expanded scope. | +| A4 | Create regional style guide template | copy | Becomes the seed.yaml template definition, not just a wiki template. Every field must map to a generator input. | +| A6 | Add smuggler-perspective FactId progression text | copy | Survives. Blocked by B4 (smuggler voice). | +| A9 | Add Thematic Question field to Tier 1 profiles | copy | Low priority. Nice-to-have for authoring guidance. | +| A12 | Create environmental text examples | copy | Needed for wow moments (#1 Arrival, #5 News Ticker). | +| B1 | NPC Authoring Style Guide | copy | Reframed: this becomes the NPC generator specification. The style guide IS the generator input format. Most complex ticket — many blockers. | +| C2 | Create content/ directory skeleton | server | Schema must be 300-world compatible from day one. | +| C3 | Content schema definitions | server | Schemas become validation rules for generated content too. | +| C4-C8 | Enum, attribute, pool, template, triangle YAMLs | server | All survive. These ARE the v0.1 content in engine-readable format. | +| C9 | Implement make validate-content CLI | server | Validates hand-authored v0.1 AND future generated output. | +| C10 | Pre-commit FactId typo check | ci | Cheap safety net. Survives. | +| D2 | Seed configuration schema | server | Needed for v0.1 (even with 1-candidate pools). | + +### 1c. Tickets That Are Obsolete or Deferred + +| R2 ID | Title | Disposition | Rationale | +|-------|-------|-------------|-----------| +| A5 | Add Cultural Groups section to wiki/index.md | **Defer** (v0.2+) | Wiki index restructuring is cosmetic. Content itself matters more. | +| D1 | cultural_gate modifier design doc | **Defer** (v0.2+) | Not in v0.1 IN list. Cultural gating is a generator-era feature. | +| D3 | Secondary contraband variant FactId text | **Kill** | Explicitly OUT in v0.1 scope ("Secondary contraband variation" listed as v0.2+). | + +**Score: 26 survive, 1 deferred, 1 deferred, 1 killed = 26 actionable for v0.1.** + +--- + +## 2. Existing Ticket Updates + +These existing tickets need status changes based on workshop context: + +| ID | Title | Current Status | Action | +|----|-------|---------------|--------| +| #368 | Knowledge vocabulary for v0.1 content | in_progress (Sprint 2) | **Close when wiki review is accepted.** The wiki at `docs/wiki/` is the output. Workshop is the review. | +| #369 | Wiki Review Workshop Outputs (epic) | backlog | **Repurpose** as parent epic for v0.1 content scoping tickets. Update description to reflect this workshop's scope. | +| #301 | Wiki taxonomy and structure | backlog | **Assign to copy team.** Downscope for v0.1: focus on Sova district structure only. Full 500+ world taxonomy is a generator-era concern. | +| #319 | Krenn System wiki entry | backlog | **Merge with A3.** Expanded scope: wiki page + seed.yaml reference implementation. Assign to copy. | +| #261 | Dual Lens Authoring Guide | backlog | **Still critical.** Workshop confirms it blocks all content authoring (#190, #191, #192, #297, #298, #299, #300). Assign to copy. Sprint 3 target. | +| #310 | Character voice speech patterns | backlog | **Overlaps with B4** (smuggler voice card). Merge or make B4 block #310. | +| #306 | News ticker / Meridian feed content | backlog | **Overlaps with D4.** D4 expands scope from 20-30 to 40-50 headlines. Update #306 description. | +| #326 | YAML content loader | backlog | **Assign to server.** Blocked by C1 + C2. Sprint 4 target (after content exists). | + +--- + +## 3. New Tickets Needed (Not in Round 2 List) + +The IN list and workshop topics reveal gaps not covered by the Round 2 tickets: + +| Proposed ID | Title | Type | Team | Priority | Description | Dependencies | +|-------------|-------|------|------|----------|-------------|--------------| +| NEW-1 | NPC pattern/motivation mapping for v0.1 | task | copy | high | Assign System A pattern + System B motivation to all 17 Sova NPCs. Output: mapping table in wiki. Informs all NPC content authoring and server component design. | None | +| NEW-2 | Drin tier promotion evaluation | task | copy | medium | Evaluate whether Drin should be promoted from Tier 3 to Tier 2. Drin participates in Triangle 2 and Triangle 5 and is compromised by Harek — Tier 2 work in a Tier 3 profile. If promoted, expand profile. | NEW-1 | +| NEW-3 | Wiki → YAML content conversion (Sova NPCs) | story | copy | high | Convert 17 NPC wiki profiles to engine-readable YAML in content/districts/sova-transit/npcs/. Must match schema from C3. First concrete content files. | C1, C2, C3 | +| NEW-4 | Monologue content pool — minimum viable set | story | copy | high | Author minimum monologue line pool to avoid repetition in a 30-minute session. Size TBD by Mellanie (Topic 4 answer), but estimate 80-120 lines covering: arrival observations, NPC routine commentary, environmental flavor, contradiction hints, idle reflections. Dual-lens (smuggler + detective variants). | #261, B4 | +| NEW-5 | v0.1 wow moment content checklist | task | copy | high | Map D-039's 6 wow moments to specific content deliverables. Track which tickets deliver which moments. Acceptance criteria: every wow moment has identified content backing it. | None | +| NEW-6 | PC-as-NPC content authoring (authored lines) | story | copy | high | Author the actual content for PC-as-NPC: 5-7 routine entries per character, 3-5 observation monologue lines per character when seeing the other PC, reverse dual-lens notes. ~20-30 authored items total. Distinct from B5 (spec) — this is the writing. | B3, B5 | +| NEW-7 | Interaction model minimum spec | story | copy | medium | Document the minimum interaction verbs for v0.1: walk, talk, observe, overhear. What triggers each? What UI does each need? What server events? Bridges Topic 4 into implementation tickets for server/client. | None (informed by workshop Topic 4 answers) | + +--- + +## 4. Sprint Assignment + +### Sprint 3 (Know) — Copy Team + +Sprint 3's goal: "Player can observe NPCs, track knowledge, interact." The server team needs content to load. Copy's Sprint 3 is the **content foundation sprint**. + +**Sprint 3 copy tickets (proposed):** + +| Priority | Ticket | Rationale | Blocked By | +|----------|--------|-----------|------------| +| P0 | A2: Hael → Naia Tamm rename | Unblocks all Naia content. Quick win. | — | +| P0 | A1: Apply canonical full names | Unblocks content conversion. Quick win. | — | +| P0 | A7: Smuggler entity attributes | Unblocks smuggler-lens content. | — | +| P0 | C1: Content directory structure design | Unblocks all content conversion. | — | +| P0 | #261: Dual Lens Authoring Guide | Blocks 9 downstream tickets. Critical path. | — | +| P1 | A10: Nils Davan stub | Unblocks A11. | — | +| P1 | A11: Triangle 1 fix | Needed for 5-triangle requirement. | A10 | +| P1 | B2: MIRROR pattern spec | Unblocks Naia content. Generator template. | — | +| P1 | B4: Smuggler voice + moral arc | Unblocks dual-lens authoring. Generator template. | A7 | +| P1 | NEW-1: NPC pattern/motivation mapping | Informs all NPC content + server components. | — | +| P1 | NEW-5: Wow moment content checklist | Tracking ticket. Ensures nothing falls through. | — | +| P2 | A8: Shortcode fix | Cleanup. Blocks monologue authoring quality. | — | +| P2 | B3: PC-as-NPC spec | Unblocks B5 and NEW-6. | A7 | +| P2 | NEW-7: Interaction model minimum spec | Bridges workshop into server/client tickets. | — | + +**Sprint 3 server tickets (content-related, proposed additions):** + +| Priority | Ticket | Rationale | Blocked By | +|----------|--------|-----------|------------| +| P1 | C2: Create content/ directory skeleton | Unblocks all YAML content files. | C1 | +| P1 | C3: Content schema definitions | Unblocks validation + content conversion. | C1 | + +### Sprint 4+ (later sprints) + +| Ticket | Team | Rationale for Deferral | +|--------|------|----------------------| +| A3/merged #319: Krenn brief + seed.yaml | copy | Needs A4 template first. Not blocking Sprint 3 content. | +| A4: Regional style guide / seed template | copy | Generator-era format. v0.1 can use wiki directly. | +| A6: Smuggler FactId progression text | copy | Blocked by B4. Sprint 4 if B4 completes Sprint 3. | +| A9: Thematic Question field | copy | Low priority authoring guidance. | +| A12: Environmental text examples | copy | Sprint 4. Needed for wow moment #1 but not blocking server. | +| B1: NPC Authoring Style Guide | copy | Most complex ticket with 5+ blockers. Sprint 4-5 assembly. | +| B5: PC NPC-format briefs | copy | Blocked by B3. Sprint 4. | +| NEW-3: Wiki → YAML conversion | copy | Blocked by C1, C2, C3. Sprint 4. | +| NEW-4: Monologue content pool | copy | Blocked by #261, B4. Sprint 4-5. | +| NEW-6: PC-as-NPC content authoring | copy | Blocked by B3, B5. Sprint 5. | +| C4-C8: Content YAML files | server | Blocked by C2. Sprint 4. | +| C9: validate-content CLI | server | Blocked by C3. Sprint 4. | +| C10: FactId pre-commit | ci | No blockers but low urgency. Sprint 4. | +| D2: Seed configuration schema | server | Sprint 4-5. Needed before game-start flow. | +| #326: YAML content loader | server | Blocked by C2. Sprint 4-5. | + +--- + +## 5. Dependency Chain — Critical Path + +``` +Sprint 3 Critical Path (Copy): + +#261 (Dual Lens Guide) ─────────────────────────────┐ + ├── blocks #297 (FRIEND: Kael) │ + ├── blocks #298 (FRIEND: Sera) │ + ├── blocks #299 (Opening hook: smuggler) │ + ├── blocks #300 (Opening hook: detective) │ + ├── blocks #310 (Voice speech patterns) │ + ├── blocks NEW-4 (Monologue pool) │ + └── blocks #190, #191, #192 (Content packs) │ + │ +A7 (Smuggler attributes) ──┬── blocks B4 (Voice+arc) │ + ├── blocks B3 (PC-as-NPC) │ + │ │ +B4 (Smuggler voice+arc) ──┼── blocks A6 (FactId text)│ + │ blocks NEW-4 │ + │ │ +B3 (PC-as-NPC spec) ──────┼── blocks B5 (PC briefs) │ + │ blocks NEW-6 (Content) │ + │ │ +C1 (Content dir design) ──┬── blocks C2 (skeleton) │ + ├── blocks C3 (schemas) │ + │ │ +C2 (skeleton) ────────────┼── blocks C4-C8 (YAMLs) │ + │ blocks NEW-3 (convert) │ + │ blocks #326 (loader) │ + │ │ +C3 (schemas) ─────────────┼── blocks C9 (validator) │ + │ blocks NEW-3 (convert) │ + │ +A10 (Nils stub) ──────────┼── blocks A11 (Triangle 1) │ + │ +B2 (MIRROR spec) ─────────┼── blocks A9 (Thematic Q) │ + │ blocks Naia authoring │ +``` + +**The two critical chains for Sprint 3 are:** + +1. **Content authoring chain:** #261 → B4 → A6 → content packs → monologue pool +2. **Content architecture chain:** C1 → C2/C3 → C4-C8/NEW-3 → #326 (loader) + +Both chains must begin in Sprint 3 even though they won't complete until Sprint 4-5. Sprint 3's job is to lay the foundation: get #261, C1, A7, and B2 done. + +--- + +## 6. IN List → Ticket Coverage Map + +| v0.1 IN List Item | Existing Tickets | New Tickets Needed | Status | +|-------------------|------------------|--------------------|--------| +| WASD movement + collision | Sprint 1-2 (done) | — | Covered | +| Context-sensitive interaction | #240 (Sprint 3) | NEW-7 (spec) | Partially covered — needs spec | +| Monologue system | #45, #119, #120, #122, #253 | NEW-4 (content pool) | Architecture covered, content gap | +| Knowledge graph | #351, #368, #309 | — | Covered | +| 2 playable characters | #57, #180, #182 | — | Covered (architecture) | +| THE FRIEND arc (Kael, Sera) | #297, #298 (blocked by #261) | — | Covered but blocked | +| 5 triangles with forks | #42, #106, #188, #250 | A11 (Triangle 1 fix), C8 (YAML) | Partially covered — weak Triangle 1 | +| 6 wow moments (D-039) | No dedicated tickets | NEW-5 (checklist) | Gap — needs tracking ticket | +| 3 social sites | #54, #190, #191, #192 | C7 (YAML templates) | Covered but blocked by #261 | +| NPC routines | #88, #101 (Sprint 3) | — | Covered (server) | +| Dual-lens parity | #261 | A7, B4, A6 | Major gap — smuggler lens incomplete | +| PC-as-NPC | — | B3, B5, NEW-6 | Gap — no tickets exist yet | +| Content directory | #326 (loader only) | C1, C2, C3 | Gap — structure undefined | +| Content validation | — | C9, C10 | Gap — no validation exists | + +--- + +## 7. Summary + +**Round 2 list scorecard:** 26 of 29 tickets survive (1 killed: D3 secondary contraband; 2 deferred: A5 wiki index, D1 cultural_gate). + +**New tickets proposed:** 7 (NEW-1 through NEW-7). + +**Sprint 3 copy team:** 14 tickets proposed. Critical path starts with #261 (Dual Lens Guide) and C1 (Content directory design). + +**Biggest risk:** #261 is the single biggest blocker in the entire content pipeline. It blocks 9 tickets directly and cascades into everything. If it slips, Sprint 4-5 content authoring is delayed. Recommend it gets assigned immediately with Paula as owner. + +**Action items for Round 2:** +1. Other agents answer Topics 1-5 — their answers refine NEW-1 (pattern mapping), NEW-4 (pool size), NEW-7 (interaction minimum) +2. Lead approves ticket list +3. SI creates tickets +4. Qatux documents scope decisions + +--- + +*Compiled by SI. Source: Round 2 ticket list, current ticket database (369 tickets), workshop brief, decisions/scope.md (D-027, D-039).* diff --git a/docs/workshops/v01-content-scoping/round1-stig.md b/docs/workshops/v01-content-scoping/round1-stig.md new file mode 100644 index 000000000..111af7485 --- /dev/null +++ b/docs/workshops/v01-content-scoping/round1-stig.md @@ -0,0 +1,373 @@ +# Round 1 Response: Stig (UI Developer) +## v0.1 Content Scoping Workshop + +--- + +## Topic 3: What Does the Client Need from Content Files? + +The client is a renderer. It doesn't decide what happens — the server does. So the client's content needs are narrow: display strings, visual parameters, and layout hints. Everything else stays server-side. + +### What the client loads directly + +| Data | Format | Why | +|------|--------|-----| +| **NPC display names** | `display_name: "Kael Davan"` | Name label above entity rectangle. Must be the name the *player character* knows — "Dock Worker" before identification, "Kael Davan" after. Server sends the current display name per entity via state update, not the content file. | +| **Location display names** | `display_name: "The Terminal"` | HUD location indicator, minimap labels. Short names only — "The Terminal", not "Sova Transit Logistics Hub, Bay 7-C". | +| **Monologue text** | `text: "Morning shift. Recycled air..."` | Rendered by the monologue display system. The server selects the line; the client receives the `id` + `text`. Client doesn't evaluate prerequisites. | +| **Dialogue text** | `text: "Container 4471 sat in temp..."` | Rendered in the dialogue panel. Server selects, client displays. | +| **Entity color palette** | `relationship_colors` map in a client config | D-033 palette. Client derives color from `RelationshipState` sent by server. Not per-NPC content. | +| **Time of day** | Phase enum: `morning`, `afternoon`, `evening`, `night` | HUD clock display. Server sends current phase. Client renders as text and ambient lighting tint. | + +### What the client does NOT need + +- NPC profiles, axes, secrets, triangle definitions — server-only +- FactId catalog, prerequisite maps — server-only evaluation +- Access tiers, trust levels — server filters before sending to client +- NPC routines/schedules — server simulates, client receives position updates +- Knowledge graph state — server tracks, sends display-relevant slices + +### Format recommendation + +Client content should be a thin layer. I don't need to parse the full wiki YAML. What I need is: + +```yaml +# content/client/strings.yaml +locations: + terminal: + display_name: "The Terminal" + short_name: "Terminal" + minimap_label: "T" + bar: + display_name: "The Last Shift" + short_name: "Last Shift" + minimap_label: "LS" + corridor: + display_name: "Corridor B-7" + short_name: "B-7" + minimap_label: "B7" + +hud: + time_phases: + morning: "Morning Shift" + afternoon: "Afternoon" + evening: "Evening" + night: "Night Cycle" +``` + +Monologue and dialogue text can arrive as part of the server state update — `{type: "monologue", id: "terminal_m_001", text: "Morning shift..."}`. The client doesn't need the full YAML pools on disk. Server selects, client renders. This keeps the client thin and prevents any information leakage (the client literally cannot show what it doesn't have). + +**Bottom line:** The client needs display strings + the server's state stream. It should never have access to content it shouldn't be rendering. Every pixel of information passes through the server's information boundary first. + +--- + +## Topic 4: UI Elements for the Minimum Interaction Model + +I'll walk through each element: what it looks like, where it sits, how the player reaches it. + +### 4.1 The Screen Layout (Overview) + +``` ++------------------------------------------------------------------+ +| | +| | +| | +| GAME WORLD | +| (full viewport) | +| | +| | +| | +| [MONOLOGUE] | +| bottom-left, 1-2 lines | +| | +| [INTERACTION PROMPT] | +| near-player, contextual | +| | ++------------------------------------------------------------------+ +| LOCATION | TIME | | [MINIMAP] | +| The Terminal| Morning | | (insert) | +| | | | | ++------------------------------------------------------------------+ +``` + +The game world fills the viewport. UI elements float over it, positioned to stay out of the player's sightline toward the center of the screen where the action is. + +**Core principle: the center is sacred.** Nothing permanent lives in the center third of the screen. That's where the character is, where NPCs are, where the player looks. UI lives at the edges and appears only when relevant. + +### 4.2 Interaction Prompt + +**What it is:** A single-action context label that appears when the player is close enough to interact with something. + +**Position:** Offset from the target entity, above and slightly right. Tracks the entity position in world space (not screen-fixed). Small — 12-14px equivalent at reference resolution. + +**Appearance:** +``` + [Talk] <- NPC within interaction range + Kael Davan <- entity name (if known) + [====] <- entity rectangle +``` + +Or for objects: +``` + [Examine] + Manifest Terminal + [====] +``` + +**Behavior:** +- **Appears** when player enters interaction radius (~1.5 tiles) AND has line of sight +- **Disappears** when player moves away or breaks LOS +- **Changes based on context:** The same NPC shows "Talk" normally, "Ask about..." after contradiction discovery, or nothing if no interaction is available +- **Single action.** No menus. No radial wheels. The server decides what the primary interaction is based on entity state + player knowledge. The prompt shows ONE thing. Press [E] or [Space] to do it. +- If multiple interactions are available, the prompt shows the most relevant one. The player gets a *decision* about whether to interact, not a *menu* of options. + +**Why single-action:** Too many clicks. A radial menu means the player stops, reads, selects, then engages. A single prompt means: approach, press, you're in. The game should feel like walking into a conversation, not operating a database. + +**Edge case — multiple valid actions:** If the player needs to choose between "Talk" and "Examine" on the same entity, the prompt changes based on proximity angle or a simple toggle (tap [E] = primary, hold [E] = secondary). But for v0.1, I'd argue: default to "Talk" for NPCs, "Examine" for objects, and handle the edge cases when they arise. + +### 4.3 Dialogue Display + +**What it is:** How conversation text appears once the player initiates dialogue. + +**Position:** Bottom-center of the screen, overlaying the game world. The world stays visible behind it — the player can still see NPCs moving, can still read the room. + +**Layout:** +``` ++------------------------------------------------------------------+ +| | +| GAME WORLD | +| (still visible, slightly dimmed) | +| | +| | ++------------------------------------------------------------------+ +| | +| KAEL DAVAN | +| "Container 4471 sat in temp storage overnight. | +| Scheduling backed up again." | +| | +| > [Continue] [End conversation] | +| | ++------------------------------------------------------------------+ +``` + +**Specifications:** +- **Width:** ~60% of screen width, centered horizontally +- **Height:** Variable, 3-5 lines maximum. If the line is longer, it scrolls on input +- **Background:** Semi-transparent dark panel (80% opacity). Not opaque — the world behind bleeds through. The conversation is happening IN the world, not in a separate screen +- **Speaker name:** Top-left of the panel, in the entity's relationship color (D-033). Teal if unknown, green if friendly, amber if person of interest +- **Text:** Off-white, clean sans-serif, left-aligned. One NPC line at a time +- **Advance:** [Space] or [E] advances to next line. No auto-advance — the player controls the pace +- **Exit:** [Escape] or [Q] ends conversation at any point. The NPC reacts (server determines reaction based on conversation progress) + +**What this is NOT:** +- No branching dialogue trees visible on screen. The server determines what the NPC says next based on access tier, trust, and state. The player experiences a conversation, not a menu +- No portraits. Top-down game — we see the entities. A portrait would be a second representation that contradicts the top-down perspective +- No response selection in v0.1. The conversation flows. The player's choices are: continue, leave, or (post-discovery) confront. Confrontation is a separate interaction prompt, not a dialogue option + +### 4.4 Monologue Display + +**What it is:** The player character's internal voice. Text that represents what the character thinks, notices, feels. + +**Position:** Bottom-left of the viewport, above the HUD bar. Offset from the dialogue panel position so they never overlap. + +**Layout:** +``` ++------------------------------------------------------------------+ +| | +| GAME WORLD | +| | +| | +| | +| | +| +-----------------------------------------+ | +| | Kael's here. Good -- I was starting | | +| | to worry. | | +| +-----------------------------------------+ | +| | ++------------------------------------------------------------------+ +``` + +**Specifications:** +- **Width:** ~40% of screen width, anchored left +- **Height:** 1-2 lines. Monologue is brief (authoring guide says "one breath") +- **Background:** Minimal. A subtle text shadow or very faint panel (20-30% opacity). The monologue should feel like it's floating in the character's head, not displayed in a UI box +- **Text color:** Character-specific tint. Detective: cool blue-white `#c8d8f0`. Smuggler: warm amber-white `#f0e0c8`. Subtle — not a spotlight, just a whisper of character identity +- **Animation:** Fades in over 0.3s, holds for 4-6 seconds (adjusted by text length), fades out over 0.5s. Does not stack — a new monologue replaces the current one. If the old one hasn't finished, it fades faster (0.15s) before the new one appears +- **Audio cue:** Soft chime on appearance (D-038: `sfx_monologue_chime.ogg`). Sharper variant for anomaly observations (`sfx_monologue_chime_urgent.ogg`) +- **During dialogue:** Monologue can appear DURING a conversation (post_conversation trigger fires after exchange, but observe_anomaly can fire mid-conversation if the player spots something while talking). When dialogue panel is active, monologue shifts up slightly to sit above the dialogue panel, maintaining the same left-anchored position + +**Critical rule: monologue must not compete with dialogue.** They occupy different screen regions (left vs. center), use different visual treatments (floating vs. paneled), and serve different functions (character's inner voice vs. NPC's spoken words). If both are on screen simultaneously, the player reads dialogue first (center, larger, solid panel) and catches monologue peripherally (left, smaller, ghostly). This mirrors how internal reactions work — you hear the other person speaking while your own thought forms underneath. + +### 4.5 Knowledge Panel (Neural Lattice Interface) + +**What it is:** The player's diegetic notebook. A neural lattice overlay that shows what the character knows — people, facts, relationships. + +**Diegetic framing:** This isn't a game journal. It's the character checking their implant's records. The detective's Analytical lattice organizes information automatically. The smuggler's Baseline lattice shows simpler records — people they know, places they've been. + +**Access:** Press [Tab] to toggle. Pauses the game (or slows to near-pause — design decision for Gestalt). The lattice overlay slides in from the right side of the screen. + +**Layout:** +``` ++------------------------------------------------------------------+ +| | +| GAME WORLD | LATTICE OVERLAY | +| (visible, | | +| dimmed) | PEOPLE [tab] | +| | Kael Davan [green] | +| | Sera Venn [green] | +| | Voss [teal] | +| | "Dock Worker" [teal] | +| | | +| | PLACES | +| | The Terminal | +| | The Last Shift | +| | | +| | OBSERVATIONS | +| | "Manifest discrepancy | +| | — Container 4471" | +| | | ++------------------------------------------------------------------+ +``` + +**Specifications:** +- **Width:** ~30% of screen width, anchored right +- **Sections:** People / Places / Observations. Simple tabs or vertical scroll +- **People entries:** Display name + relationship color dot. Click/select for detail: known attributes, last seen location, relationship state +- **Places:** Location names discovered so far. Click for minimap highlight +- **Observations:** Key facts in plain language. These are the FactIds rendered as human-readable sentences. "Manifest discrepancy observed at Terminal" not "`investigation.manifest_discrepancy: Suspects`" +- **Visual treatment:** Dark panel with a subtle scan-line effect or faint grid overlay — this is a lattice interface, not a paper notebook. The diegetic feel comes from the typography and visual treatment, not from elaborate 3D renders +- **Character-specific:** The detective's lattice shows more analytical structure (observations auto-categorized, flagged items highlighted in amber). The smuggler's lattice is simpler — people and places, fewer analytical overlays +- **Empty state:** At game start, the lattice is sparse. Detective has a few case-file entries. Smuggler knows people but has no "observations" section initially. The lattice fills as the player discovers things + +### 4.6 HUD Elements + +**What's always visible:** + +``` ++------------------------------------------------------------------+ +| | +| GAME WORLD | +| | ++------------------------------------------------------------------+ +| The Terminal | Morning Shift | +----------+ | +| | | | MINIMAP | | +| | | | (D-013)| | ++------------------------------------------------------------------+ +``` + +**Location name:** Bottom-left corner of the HUD bar. Shows current area. Updates on zone transition with a brief fade. + +**Time of day:** Next to location. Shows the current phase in plain language ("Morning Shift", "Evening", "Night Cycle"). Updates on phase transition. No clock numbers — the character doesn't check the time, they feel the shift rhythm. + +**Minimap (insert):** Bottom-right corner. Small — 120x120px at reference resolution. Shows: +- Player position (character-color dot, D-033) +- Known NPC positions within close range (relationship-colored dots) +- Location boundaries (thin lines, muted) +- POI markers for discovered locations (small icons) +- Fog — areas not yet discovered are dark + +The minimap IS the neural lattice navigation overlay (D-013). It should look like a technology interface, not a game map. Subtle grid lines, faint glow at the edges, no terrain texturing. Information appears on it only as the character learns it. + +**What's NOT always visible:** +- Character name — the player knows who they are. Don't waste pixels reminding them +- Health/status bars — no health system in v0.1 +- Inventory indicators — no inventory in v0.1 (knowledge-based, per Gestalt's direction) +- Quest markers — this is not that kind of game +- Mini-objectives — the player decides what to do + +### 4.7 News Ticker + +The Meridian news feed in The Last Shift. This is a diegetic element — it exists in the world, on the bar's display screen. + +**Implementation:** A world-space text object attached to the bar's display entity. Scrolling text, left-to-right, station news headlines. The player reads it by standing near the display, not through a HUD overlay. + +**Why world-space:** D-039 Wow Moment #5 requires the same ticker to produce different monologue reactions per character. If the ticker were a HUD element, it would feel like a notification system. In world space, it's a thing in the bar that you walk over to and read. The monologue fires because your character is looking at it, not because the UI decided to inform you. + +--- + +## Topic 5: Minimum UI for a 30-Minute Vertical Slice + +### Must be polished (player-facing, first impression) + +| Element | Why polished | Effort level | +|---------|-------------|-------------| +| **Monologue display** | This IS the game's voice. If monologue feels janky, the character feels dead. Smooth fade, correct timing, readable text, audio chime sync. | Medium — text rendering + animation + audio trigger | +| **Interaction prompt** | First thing the player tries. Walk to NPC, see "Talk", press key, it works. If this is clunky, the game feels broken. | Low — context label + input handler | +| **Dialogue panel** | Second thing the player tries. Text must be readable, pacing must feel natural, exit must work cleanly. | Medium — text display + input flow + state management | +| **Entity relationship colors** | D-033. The color palette tells the player who matters before any text appears. Green = safe, amber = something changed. THE FRIEND's color shift (green to amber) is Wow Moment #3. | Low — shader/tint parameter driven by server state | +| **Fog of perception** | D-011. If the player can see everything, there's no game. LOS shadowcasting must work. | High — but this is Dudley/Tyre territory, not UI | + +### Can be placeholder (functional, not pretty) + +| Element | Why placeholder is OK | Placeholder spec | +|---------|----------------------|-----------------| +| **Minimap** | Players will use it but don't expect polish in a vertical slice. A dot on a dark rectangle is sufficient. | Player dot + area boundary lines. No labels, no icons. | +| **HUD bar** | Location name + time phase in plain text, no styling. | Left-aligned text, default font, dark background strip. | +| **Knowledge panel** | Players may not even find it in 30 minutes. But it must exist for the detective's analytical loop. | Plain text list on a dark overlay. No scan-line effects, no diegetic styling. Functional data display. | +| **News ticker** | D-039 Wow Moment #5 needs it, but the ticker itself can be simple scrolling text. The wow is in the monologue reaction, not the ticker's visual polish. | Scrolling text on a world-space panel. Monospace font. Functional. | + +### Can be deferred entirely (v0.2+) + +| Element | Why defer | +|---------|----------| +| **Perception mode overlays** | D-017: only natural vision in v0.1. No thermal, no camera feeds, no tracking. | +| **Inventory UI** | No inventory system in v0.1. Knowledge-based interaction. | +| **Character selection screen** | v0.1 can start with a character toggle or separate launch configs. No menu needed. | +| **Settings/options menu** | Dev builds. Hardcode resolution, keybindings. | +| **Tutorial/onboarding** | Monologue IS the tutorial (D-016: "That terminal might have access logs"). No separate tutorial UI. | +| **Map zoom/pan** | Camera locked (D-015). No map interaction beyond the minimap. | + +### The 30-minute visual journey + +Here's what the player actually sees, minute by minute: + +**Minute 0-1 (Arrival):** Black screen fades in. Station ambient plays. The game world appears, character in the center, fog surrounding them. First monologue fades in at bottom-left: "Morning shift. Recycled air and cargo lubricant." Chime sounds. HUD bar shows "The Terminal | Morning Shift". Minimap shows a small illuminated area around the player. + +**Minute 1-5 (Exploration):** Player moves with WASD. Fog recedes as they explore. NPC rectangles appear in the viewport — colored dots. Walking near an NPC shows their display name and [Talk] prompt. First dialogue: the panel slides up from the bottom, semi-transparent, NPC name in relationship color. Text advances on input. Conversation ends, panel slides down. Monologue fires: "Kael's here. Good." + +**Minute 5-15 (The Character's Eye):** Monologue fires unprompted with the urgent chime — the character noticed something the player didn't. The text is different: sharper, the urgent variant. "Dock worker Davan -- lattice activity spiked." The player hasn't done anything — the game is teaching them that their character has a mind. + +**Minute 15-20 (Building routine):** Player moves between Terminal and Bar. Location name transitions on the HUD. The bar is warmer (amber lighting tint). Minimap updates with new area. Monologue at bar entry: different tone, different character voice. Dialogue with Sera Venn — the panel text feels different from Kael's. Same UI, different voice. + +**Minute 20-25 (THE FRIEND's contradiction):** Kael's entity color shifts — green to amber. 0.5s fade per D-033. This is silent, visual. No fanfare. The urgent monologue chime fires. "Kael? By the service hatch? And that's -- I don't know them." If the player presses [Tab], the knowledge panel now shows Kael as "Person of Interest" with an observation entry. + +**Minute 25-30 (The quiet moment):** Player standing still in a corridor. After idle time, monologue fades in without chime. Reflective. Quiet. "No Meridian signal down here. No eyes, no ears." The game breathes. The UI is invisible. The world is present. + +### Summary: v0.1 UI bill of materials + +| System | Files/Scenes | Priority | +|--------|-------------|----------| +| Monologue renderer | 1 scene + 1 script | P0 (must ship) | +| Interaction prompt | 1 scene + 1 script | P0 | +| Dialogue panel | 1 scene + 1 script | P0 | +| Entity color system | Shader + config | P0 | +| HUD bar (location + time) | 1 scene + 1 script | P1 (placeholder OK) | +| Minimap | 1 scene + 1 script | P1 | +| Knowledge panel | 1 scene + 1 script | P1 | +| News ticker (world-space) | 1 scene + 1 script | P1 | +| Fog rendering | Shader + integration | P0 (shared with server team) | + +Total: ~9 scenes, ~9 scripts, 2 shaders. This is a tight UI. Every element earns its pixel. + +--- + +## Open Questions for Other Participants + +**For Dudley (server):** +- What does the state update message look like? I need: entity positions, display names, relationship states, monologue triggers (id + text), dialogue lines (id + text + speaker), time phase, location zone ID. What's the IPC message format? +- Does the server send the full text of monologue/dialogue lines, or just IDs that the client looks up locally? I prefer full text in the message (keeps client thin, prevents info leakage), but there's a bandwidth trade. + +**For Gestalt (systems):** +- Does opening the knowledge panel pause the game? Semi-pause? If NPCs keep moving while you read, you miss things. If the game pauses, it breaks immersion. I lean toward semi-pause (simulation runs at 10% speed). +- Single-action interaction prompt: does this work for the systems design? Or does the player need to choose between "Talk" and "Observe" on the same NPC? + +**For Mellanie (copy):** +- Maximum monologue line length? I'm designing for 1-2 lines of display text (~80 characters per line, ~160 max). Is that enough for the voice? +- How many monologue lines can fire in sequence before it feels like a wall of text? I'd say 1 at a time with 2-3 second gaps minimum. + +**For Araminta (visual):** +- Diegetic styling for the knowledge panel — how far do we push the "lattice interface" look in v0.1? My instinct: minimal. Faint grid, slightly blue-shifted palette, clean type. Save the fancy scan-line effects for when we have art budget. +- Monologue text color per character — I proposed detective blue-white and smuggler amber-white. Does this conflict with the entity color palette (D-033)? + +--- + +*The player's eye goes to the center. Everything else stays out of the way until it's needed. Then it appears, does its job, and vanishes.* diff --git a/docs/workshops/v01-content-scoping/round1-tracking.md b/docs/workshops/v01-content-scoping/round1-tracking.md new file mode 100644 index 000000000..5bf05cedc --- /dev/null +++ b/docs/workshops/v01-content-scoping/round1-tracking.md @@ -0,0 +1,491 @@ +# Round 1 Tracking — Qatux (Documenter) +## v0.1 Content Scoping Workshop + +**Status:** All 7 responses received (Gestalt, Paula, Tyre, Mellanie, Stig, Dudley, SI). Round 1 complete. +**Date:** 2026-02-12 + +--- + +## 1. Agreements (Consensus Items) + +These items have clear consensus across respondents and could be decided immediately: + +| # | Item | Supporters | Status | +|---|------|-----------|--------| +| A-01 | **Drin promoted to Tier 2** | Gestalt (unambiguous yes), Paula (full Tier 2 profile drafted), Mellanie (implicitly — budgets Drin as Tier 2) | Ready to decide | +| A-02 | **THE NOBODY mechanic deferred to v0.2; data ships in v0.1** | Gestalt (explicit: ship data, defer mechanic), Dudley (NobodyState deferred per brief) | Ready to decide | +| A-03 | **YAML as content format** (with dissent — see D-01) | Tyre (detailed rationale), Stig (accepts server-sent text), Mellanie (needs author-readable format) | Needs resolution with Dudley | +| A-04 | **7-interaction minimum** (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear) | Gestalt (designed it), Stig (UI for each), Dudley (server events for each) | Ready to decide | +| A-05 | **~200 monologue lines total** (~100 per character) | Mellanie (80-110 per character, detailed math), Gestalt (implicitly validates via wow moment mapping) | Ready to decide | +| A-06 | **~695 total authored content items for v0.1** | Mellanie (200 monologue + 350 dialogue + 50 environmental + 20 ticker + 50 UI + 25 PC-as-NPC) | Needs validation from others | +| A-07 | **5 triangles: 3 active forks, 2 passive tensions** | Gestalt (explicit table: T1/T2/T4 active, T3/T5 passive), Paula (aligns with triangle fork detail) | Ready to decide | +| A-08 | **Naia Tamm needs MIRROR-specific voice samples** | Mellanie (5 samples written), Paula (naming cascade planned) | Ready to decide | +| A-09 | **Content directory: `global/` + `districts/` top-level split** | Tyre (detailed tree), Dudley (load sequence matches), Gestalt (aligns with Wiki Review consensus) | Ready to decide | +| A-10 | **Dialogue files by location + role, not by NPC** | Tyre (explicit design choice, per D-035) | Needs validation from Dudley, Gestalt | +| A-11 | **THE FRIEND arc is the critical path for v0.1** | Tyre (Tier 4 risk, "everything converges on wow moment #3"), Dudley (FriendArc is the sole pattern-specific component), Gestalt (maps all wow moments to FRIEND), Mellanie (writes FRIEND content first) | Consensus | +| A-12 | **Client receives text from server, doesn't load content files directly** | Stig (explicit: "server selects, client renders"), Dudley (server authoritative over dialogue/monologue selection), Tyre (aligns with D-010 information boundary) | Ready to decide | +| A-13 | **Single-action interaction prompt (no radial menus)** | Stig (explicit: "single prompt, press E"), Gestalt (context-sensitive prompt table) | Ready to decide | +| A-14 | **PC-as-NPC required for v0.1** | Gestalt (missing from IN list, adds it), Paula (Gap 1: profiles missing, must be authored), Mellanie (budgets ~25 items) | Ready to decide | +| A-15 | **News ticker required for v0.1** | Gestalt (missing from IN list, wow moment #5), Stig (world-space implementation), Mellanie (budgets ~20 items) | Ready to decide | +| A-16 | **Time progression required for v0.1** | Gestalt (missing from IN list, dependency for routines), Dudley (DayPhase already exists), Stig (HUD display designed) | Ready to decide | +| A-17 | **Self-contained triangle forks for v0.1 (no cross-triangle cascade)** | Tyre (explicit scope control recommendation, "strongly recommend self-contained") | Needs validation from Gestalt | + +--- + +## 2. Disagreements (Require Resolution) + +### D-01: Content File Format — YAML vs. RON + +| Position | Advocate | Argument | +|----------|----------|----------| +| **YAML** | Tyre | Author readability, native multi-line text, JSON Schema validation, any language can emit it, 1.5ms parse difference irrelevant | +| **RON** | Dudley | Structured + typed data, all examples in RON format, mentions "Tyre's call on format" suggesting deference but preference for RON | + +**Impact:** Affects every content file, loader implementation, validation pipeline, generator output format. +**Note:** Dudley writes "Tyre's call on format" in his response, which suggests he'll defer. But his manifest example uses `content/manifest.ron` and all NPC profile examples are in RON. The two proposals need reconciliation before implementation. + +### D-02: NPC Pattern/Motivation Mapping — 10 of 17 NPCs Disagree + +This is the largest disagreement in Round 1. Gestalt and Paula independently mapped all 17 NPCs. They agree on 7 and disagree on 10. + +#### Full Comparison Table + +| # | NPC | Tier | Gestalt Pattern | Paula Pattern | Match? | Gestalt Motivation | Paula Motivation | Match? | +|---|-----|------|----------------|--------------|--------|-------------------|-----------------|--------| +| 1 | Kael Davan | T1 | FRIEND | FRIEND | YES | OPERATOR | OPERATOR | YES | +| 2 | Sera Venn | T1 | FRIEND | FRIEND | YES | WITNESS | WITNESS | YES | +| 3 | Naia Tamm | T1* | MIRROR | MIRROR | YES | CIVILIAN | CIVILIAN | YES | +| 4 | Voss | T2 | SYSTEM | SYSTEM | YES | **OPERATOR** | **HANDLER** | **NO** | +| 5 | Lera Sessik | T2 | ANCHOR | ANCHOR | YES | OPERATOR | OPERATOR | YES | +| 6 | Torek Lintar | T2 | CATALYST | CATALYST | YES | CIVILIAN | CIVILIAN | YES | +| 7 | Devra | T2 | THRESHOLD | THRESHOLD | YES | **HANDLER** | **OPERATOR** | **NO** | +| 8 | Maret Korr | T2 | **SYSTEM** | **WITNESS** | **NO** | **WITNESS** | **SKEPTIC** | **NO** | +| 9 | Resha | T2 | CATALYST | CATALYST | YES | **SKEPTIC** | **CIVILIAN** | **NO** | +| 10 | Renn | T2 | THRESHOLD | THRESHOLD | YES | OPERATOR | OPERATOR | YES | +| 11 | Pell | T2 | CATALYST | CATALYST | YES | TURNCOAT | TURNCOAT | YES | +| 12 | Harek | T2 | **GHOST** | **ANCHOR** | **NO** | HANDLER | HANDLER | YES | +| 13 | Drin | T2 (promoted) | **REMNANT** | **SYSTEM** | **NO** | TURNCOAT | TURNCOAT | YES | +| 14 | Sess | T3 | **ANCHOR** | **NOBODY** | **NO** | CIVILIAN | CIVILIAN | YES | +| 15 | Olin | T3 | CATALYST | CATALYST | YES | **SKEPTIC** (dual) | **CIVILIAN** | **NO** | +| 16 | Sabel | T3 | **THRESHOLD** | **GHOST** | **NO** | OPERATOR | OPERATOR | YES | +| 17 | Tav | T3 | **SYSTEM** | **NOBODY** | **NO** | **CIVILIAN** | **OPERATOR** | **NO** | + +**Summary:** 7 full agreements, 4 pattern-only disagreements, 2 motivation-only disagreements, 4 both-disagree cases. + +#### Analysis of Each Disagreement + +| NPC | Disagreement | Gestalt's Reasoning | Paula's Reasoning | Assessment | +|-----|-------------|--------------------|--------------------|------------| +| **Voss** (motivation) | OPERATOR vs HANDLER | "Running the schedule that enables smuggling" | "Manages operations, applies scheduling pressure" | Both defensible. Gestalt sees Voss as OPERATING the system; Paula sees Voss as HANDLING people through scheduling authority. Voss arguably does both. | +| **Devra** (motivation) | HANDLER vs OPERATOR | "Managing operations from above" = HANDLER | "Running the external coordination" = OPERATOR | Swapped vs Voss. Gestalt sees Devra as a handler (pressure from above), Paula sees Devra as running things (operational). | +| **Maret** (both) | SYSTEM+WITNESS vs WITNESS+SKEPTIC | "Institutional scheduler... saw discrepancies" | "Accidentally witnessed discrepancies... doubts the system" | Core question: is Maret primarily a SYSTEM embodiment (institutional role) or a WITNESS (defined by what she saw)? Motivation: does she WITNESS (passive) or SKEPTIC (active questioning)? | +| **Resha** (motivation) | SKEPTIC vs CIVILIAN | "Doubts the 'mind your business' culture" | "Not suspicious — just curious" | Key difference: Gestalt interprets Resha's questions as genuine skepticism; Paula interprets them as innocent curiosity (CIVILIAN). | +| **Harek** (pattern) | GHOST vs ANCHOR | "Shapes events through debt leverage, not direct membership" | "Embodies complacent contentment — but unconsciously creates tools" | Gestalt sees Harek's indirect influence as GHOST-like; Paula sees Harek's comfortable contentment as ANCHOR-like. Both are valid reads of different aspects. | +| **Drin** (pattern) | REMNANT vs SYSTEM | "Remembers when the job was just a job" | "The dock inspector IS the inspection system" | Gestalt foregrounds Drin's nostalgia; Paula foregrounds Drin's institutional role. SYSTEM seems mechanically stronger (his compromise corrupts the system). | +| **Sess** (pattern) | ANCHOR vs NOBODY | "Quiet contentment behind the bar" | "Social wallpaper... background that could become foreground" | Gestalt sees Sess as genuinely content (ANCHOR at T3); Paula sees Sess as currently invisible (NOBODY). Depends on whether ANCHOR can be T3. | +| **Olin** (motivation) | SKEPTIC (dual) vs CIVILIAN | "Asks questions with ambiguous intent" = SKEPTIC | "Uninvolved (as far as anyone knows)" = CIVILIAN | Gestalt gives Olin dual motivation (ambiguity IS the character). Paula keeps it simpler. | +| **Sabel** (pattern) | THRESHOLD vs GHOST | "Off-station gatekeeper of supply chain" | "Absent power — off-station, never fully present" | Gestalt sees Sabel as a gatekeeper (THRESHOLD); Paula sees Sabel as absent power (GHOST). Both are right about different functions. | +| **Tav** (both) | SYSTEM+CIVILIAN vs NOBODY+OPERATOR | "Ring lookout following procedure... lowest rung" | "Peripheral, barely visible... running lookout operations" | Gestalt sees a system functionary; Paula sees a background figure doing a job. | + +**Resolution path:** These disagreements reflect genuinely different analytical lenses. Gestalt maps from *mechanical function* (what does this NPC do in the system?). Paula maps from *narrative weight* (what does this NPC mean to the story?). Round 2 should produce a single canonical mapping with explicit rationale per NPC. + +### D-03: Smuggler EntityKnowledge Keys — 4 New vs 8 New + +| Position | Advocate | Keys | +|----------|----------|------| +| **4 new keys** (+ 2 existing repurposed, + 2 deferred) | Gestalt | New: `exposure_risk`, `loyalty_assessment`, `cover_integrity`, `moral_weight`. Repurposed: `trust_level` → `trust_read`, `secret_held` → `leverage_held`. Deferred: `social_debt`, `loyalty_conflict`. | +| **8 new keys** (all as new additions) | Paula | All 8 as separate new keys: `trust_read`, `exposure_risk`, `loyalty_assessment`, `leverage_held`, `social_debt`, `moral_weight`, `cover_integrity`, `loyalty_conflict` | + +**Key difference:** Gestalt argues `trust_read` and `leverage_held` already exist as `trust_level` and `secret_held` with per-character interpretation. Paula treats them as distinct keys. Gestalt also defers `social_debt` (no time for favor economy in 30min) and `loyalty_conflict` (inferable from existing keys). + +**Impact:** Affects knowledge graph schema, smuggler monologue prerequisite vocabulary, content authoring complexity. + +### D-04: Examine NPC vs Talk — Separate or Combined? + +| Position | Advocate | Argument | +|----------|----------|----------| +| **Separate interactions** (E to Examine, F to Talk) | Gestalt | Detective loop: examine first → talk later. Smuggler loop: talk first → examine when suspicious. Collapsing them breaks both loops. | +| **Single primary action** (context determines) | Stig | "Default to Talk for NPCs, Examine for objects, handle edge cases when they arise." Asks Gestalt to confirm. | + +**Impact:** Directly affects UI design, keybinding, server interaction pipeline. +**Note:** Not a strong disagreement — Stig asks the question, Gestalt has a firm answer. Needs explicit decision. + +### D-05: Knowledge Panel Pause Behavior + +Stig asks: "Does opening the knowledge panel pause the game? Semi-pause?" +- Stig leans toward semi-pause (10% simulation speed) +- No response from Gestalt yet in this round + +--- + +## 3. Open Questions (From Respondents) + +### From Gestalt +- Q: Should triangle forks cascade across triangles in v0.1? (Tyre says no — self-contained) + +### From Paula +- Q: Other wiki gaps? (She identified 7 additional gaps beyond the brief's list — see section 7) +- Q: Harek's structural role — formalize as triangle member or "external pressure node"? + +### From Tyre +- Q: Protocol evolution v2 → v3 — sign-off needed for new ObserverSnapshot fields +- Q: Line previewer CLI — when to build? (Early, per his recommendation) + +### From Mellanie +- Q: Confirm monologue guide examples as canonical PC voice registers? (Blocks all monologue authoring) +- Q: Maximum monologue line length? (She needs char limits from Stig — Stig proposes ~160 chars/2 lines) +- Q: Smuggler internal voice register — how terse? How operational? +- Q: Detective internal voice register — how clinical? How institutional? + +### From Stig +- Q: IPC message format for state updates? (For Dudley) +- Q: Server sends full text or line IDs? (Stig prefers full text — keeps client thin) +- Q: Lattice panel diegetic styling — how far in v0.1? (For Araminta) +- Q: Monologue text colors per character — conflict with D-033 entity palette? (For Araminta) + +### From Dudley +- Q: `PlayerAction::Interact` is currently a no-op — needs extension (protocol change) +- Q: Need Tyre sign-off on ObserverSnapshot v2 → v3 protocol evolution + +--- + +## 4. Scope Boundary — Revised IN/OUT + +### Gestalt's Additions to IN (4 items) + +| Added Item | Rationale | Cross-Support | +|-----------|-----------|---------------| +| **News ticker** | Required for wow moment #5 | Stig (designed world-space implementation), Mellanie (budgeted 20 items) | +| **PC-as-NPC** | Required for divergence reveal (wow moment #4) | Paula (identified as Gap 1), Mellanie (budgeted 25 items) | +| **Time progression** | Required for NPC routines, shift transitions | Dudley (DayPhase exists), Stig (HUD designed) | +| **Relationship state transitions** | Required for FRIEND arc (Friendly → PersonOfInterest) | Dudley (RelationshipState in knowledge graph) | + +### Gestalt's Additions to OUT (5 items) + +| Excluded Item | Rationale | Risk if not excluded | +|-------------|-----------|---------------------| +| **Inventory system** | Evidence is knowledge, not physical items | Feature creep ("pick up the manifest") | +| **Stealth mechanics** | Social stealth, not mechanical stealth | Immersive sim instincts will demand it | +| **Combat system** | Not in D-027 criteria | Ate scope from other features | +| **Player-facing save/load** | Session-based 30-minute slice | Dev-mode save fine, player-facing deferred | +| **Lattice modification/upgrade** | Contraband IS lattice components but player can't use them | "Can the player use smuggled mods?" No. | + +--- + +## 5. Content Volume Estimates (Mellanie) + +| Category | Items | Priority | +|----------|-------|----------| +| Monologue pools (2 characters) | ~200 lines | Critical | +| NPC dialogue | ~350 lines | Critical | +| Environmental text | ~50 items | High | +| News ticker | ~20 items | Medium | +| UI microcopy | ~50 strings | High | +| PC-as-NPC content | ~25 items | Medium | +| **TOTAL** | **~695** | | + +**Authoring order (Mellanie's proposed sequence):** +1. THE FRIEND: Kael content pack (~100 lines) — exercises every pipeline +2. THE FRIEND: Sera content pack (~100 lines) +3. THE MIRROR: Naia Tamm (~60-70 lines) +4. Tier 2 NPCs (~100-150 lines: Voss, Lera, Torek, Maret) +5. Environmental text + ticker (~70 items) +6. Remaining monologue fill (top up to ~200) +7. UI copy + tutorial monologue (~50 strings) +8. Tier 3 background + PC-as-NPC (~50 items) + +--- + +## 6. Technical Risk Assessment (Tyre) + +| Feature | Risk | Primary Factor | Mitigation | +|---------|------|----------------|------------| +| WASD + collision | Low | None significant | Already built | +| 3 social sites | Low | Art (not v0.1 concern) | Functional boxes | +| NPC routines | Low-Medium | Content authoring time | Start schedules early | +| Knowledge graph | Medium | Downstream dependency chain | Sprint 2 narrow scope | +| 2 playable characters | Medium | Content volume doubling | Content validation tooling | +| Context-sensitive interaction | Medium | Dialogue selection tuning | Line previewer CLI | +| **Monologue system** | **High** | Trigger detection + prerequisite eval | Simple AND-only prerequisites | +| **THE FRIEND arc** | **High** | Integration of all systems | Dedicated integration test | +| 5 triangle forks | Medium-High | Cascade complexity | Self-contained forks | +| 6 wow moments | Varies | #3 is the critical path | Prioritize everything unblocking #3 | + +**Critical path:** Knowledge graph → Contradiction detection → FRIEND phase transitions → Spatial staging → Monologue trigger → Monologue display → FRIEND content authored and loaded. + +**What will take longer than expected (Tyre's warnings):** +1. Monologue prerequisite tuning (gap between "works" and "feels right") +2. Dialogue selection weighting (same tuning problem) +3. Spatial staging for THE FRIEND (Kael in Corridor B-7 when player is nearby, without feeling scripted) +4. Content conversion (17 NPC wiki profiles → YAML, ~2-3 full days) + +--- + +## 7. Wiki Gaps Identified (Paula) + +Beyond the 5 issues in the brief, Paula identified 7 additional gaps: + +| # | Gap | Blocks | Priority | +|---|-----|--------|----------| +| Gap 1 | **PC-as-NPC profiles missing** | Server entity spawning, dialogue, monologue about other PC | Critical | +| Gap 2 | **Monologue content pool — zero authored lines** | Monologue system integration testing | Critical | +| Gap 3 | **NPC routine YAML layer missing** | Server NPC scheduling, deviation detection | Critical | +| Gap 4 | **Triangle fork decision points not mechanically specified** | Storyteller triggers, dialogue branching | High | +| Gap 5 | **FactId catalog — smuggler path entries sparse** | Knowledge graph population, monologue prerequisites | High | +| Gap 6 | **Location files lack smuggler operational detail** | Environmental monologue triggers, spatial gameplay | Medium | +| Gap 7 | **Harek has no triangle membership despite T2 role** | Triangle 2/5 formalization | Medium | + +--- + +## 8. ECS / Server Architecture (Dudley) + +### Components Proposed + +| Component | Purpose | v0.1? | +|-----------|---------|-------| +| `ThematicPattern` | System A tag (9 patterns) | Yes | +| `FunctionalMotivation` | System B tag (6 motivations) | Yes | +| `FriendArc` | THE FRIEND phase tracking, contradiction detection | Yes (Kael, Sera only) | +| `ContentTier` | Tier1/Tier2/Tier3 simulation depth | Yes | +| `AccessTierMap` | D-028 Layer 1 dialogue access filtering | Yes | +| `TrustLevels` | D-028 Layer 3 gossip gating | Yes | +| `TriangleMembership` | Triangle role references per NPC | Yes | +| `NpcRoutine` | Schedule-based movement (DayPhase → position) | Yes | +| `MoodState` | D-035 mood tag for dialogue selection | Yes | +| `NobodyState` | Promotion stages + interaction counter | Deferred | +| `GhostInfluence` | Off-stage influence | Deferred | +| `CatalystTrigger` | Arrival/disruption event chain | Deferred | + +### Key Design Principle (Dudley) +"Pattern and motivation are tags for content selection, not unique simulation subsystems. THE FRIEND is the sole exception in v0.1 because its arc progression is load-bearing." + +### What Dudley Can Build Now (No Content Dependency) +- Content loader framework (Phase 1-6 skeleton) +- Proximity trigger system +- Interaction event pipeline +- Dialogue selection pipeline (D-035 tag filtering) +- Monologue trigger system +- NPC routine scheduler +- FriendArc phase transition logic +- All with fixture/synthetic data + +### What Dudley Cannot Build Without Content +- Actual NPC spawning (needs profiles in structured format) +- Real dialogue/monologue testing (needs authored lines) +- NPC routine pathfinding (needs district spatial layout) +- Overheard conversations (needs NPC-NPC scripts) +- FactId catalog (needs machine-readable version) +- Triangle escalation logic (needs formal conditions) + +--- + +## 9. UI Architecture (Stig) + +### v0.1 UI Bill of Materials + +| Element | Priority | Effort | +|---------|----------|--------| +| Monologue renderer | P0 (must ship) | Medium | +| Interaction prompt | P0 | Low | +| Dialogue panel | P0 | Medium | +| Entity color system | P0 | Low | +| HUD bar (location + time) | P1 (placeholder OK) | Low | +| Minimap | P1 | Medium | +| Knowledge panel | P1 | Medium | +| News ticker (world-space) | P1 | Low | +| Fog rendering | P0 (shared with server) | High | + +**Total:** ~9 scenes, ~9 scripts, 2 shaders. + +### Key Design Decisions (Stig) +- Center of screen is sacred (no permanent UI) +- Monologue: bottom-left, 40% width, fades in/out, character-tinted text +- Dialogue: bottom-center, 60% width, semi-transparent dark panel, world visible behind +- Interaction prompt: world-space, tracks entity, single action +- Knowledge panel: right-side overlay on [Tab], diegetic lattice interface +- News ticker: world-space text on bar's display entity (not HUD) +- Monologue display time: 4-6 seconds adjusted by text length +- Character text colors: Detective blue-white `#c8d8f0`, Smuggler amber-white `#f0e0c8` + +--- + +## 10. Cross-Reference: Ticket Categories (Tyre) + +Tyre proposes ticket splits across 8 categories: + +1. **Content Infrastructure** — directory structure, content loader (4 phases), validation schemas, line previewer CLI +2. **Wiki → Content Conversion** — NPC profiles (17), locations (3), fact catalog, triangles (5), routines +3. **Monologue System** — trigger detection, prerequisite evaluation, line pool selection, pacing/cooldown, content authoring, display UI, chime audio +4. **Dialogue System** — pool loader, selection algorithm, content authoring, UI +5. **Interaction Model** — proximity detection, state machine, prompt UI +6. **THE FRIEND Arc** — phase transitions, contradiction detection, tell accumulation, content (Kael + Sera), relationship colors, integration test +7. **NPC Rendering + Routines** — schedule execution, deviation events, sprite/label rendering, movement animation +8. **Cross-Cutting** — PC-as-NPC, news ticker, smuggler lens parity, Naia Tamm rename + +**Dependency chain critical path (Tyre):** +``` +Content directory structure + -> Content loader (Phase 1-2) + -> NPC profile conversion -> NPC schedule execution + -> Content loader (Phase 3-4) + -> Dialogue pool loader -> Dialogue selection -> Dialogue UI + -> Monologue trigger detection + -> Prerequisite evaluation + -> Line pool selection + -> Monologue pacing -> Monologue display UI + +Knowledge graph (Sprint 2) + -> Contradiction detection -> FRIEND phase transitions + -> Monologue prerequisite evaluation + -> Tell system accumulation +``` + +--- + +## 11. Items Requiring Round 2 Resolution + +| # | Item | Required Participants | Priority | +|---|------|---------------------|----------| +| R2-01 | **Canonical NPC pattern/motivation mapping** (resolve 10 disagreements) | Gestalt, Paula | Critical | +| R2-02 | **Content format: YAML vs RON** | Tyre, Dudley | Critical | +| R2-03 | **Smuggler EntityKnowledge keys: 4 new vs 8 new** | Gestalt, Paula, Dudley | High | +| R2-04 | **Examine NPC vs Talk: separate or combined interaction?** | Gestalt, Stig, Dudley | High | +| R2-05 | **Knowledge panel pause behavior** | Gestalt, Stig | Medium | +| R2-06 | **PC voice register confirmation** (blocks Mellanie's authoring) | Gestalt or Paula | High | +| R2-07 | **Triangle fork cascade: self-contained or cross-triangle?** | Gestalt, Tyre | High | +| R2-08 | **Harek's structural role** (triangle member vs external pressure node) | Gestalt, Paula | Medium | +| R2-09 | **ObserverSnapshot v2 → v3 protocol change** | Tyre, Dudley, Stig | High | +| R2-10 | **SI ticket review** (pending SI response) | SI | High | + +--- + +## 12. Decisions Ready to Formalize + +If the lead approves, these can become decisions immediately (no further discussion needed): + +| Proposed ID | Decision | Source | +|-------------|----------|--------| +| D-042 | Drin promoted from Tier 3 to Tier 2 | Gestalt (unanimous), Paula (profile drafted) | +| D-043 | THE NOBODY mechanic deferred to v0.2; hidden pattern+motivation data ships in NPC content files for v0.1 | Gestalt, Dudley | +| D-044 | v0.1 interaction model: 7 interactions (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear) | Gestalt (designed), Stig (UI for each), Dudley (server events) | +| D-045 | v0.1 scope: add News ticker, PC-as-NPC, Time progression, Relationship state transitions to IN list | Gestalt (rationale per item) | +| D-046 | v0.1 scope: add Inventory, Stealth, Combat, Player-facing save/load, Lattice modification to explicit OUT list | Gestalt (rationale per item) | +| D-047 | v0.1 triangles: 3 active forks (T1, T2, T4), 2 passive tensions (T3, T5) | Gestalt | +| D-048 | Client receives all text from server via state updates; client does not load or evaluate content files | Stig, Dudley, Tyre (information boundary principle) | + +--- + +## 13. Ticket Analysis (SI) + +### Round 2 List Scorecard + +**26 of 29 tickets survive the 300-world reframe.** + +| Disposition | Count | Tickets | +|-------------|-------|---------| +| Survive unchanged | 11 | A1, A2, A7, A8, A10, A11, B2, B3, B4, B5, C1 | +| Survive reframed | 15 | A3 (merge into #319), A4, A6, A9, A12, B1, C2, C3, C4-C8, C9, C10, D2 | +| Deferred (v0.2+) | 2 | A5 (wiki index restructure), D1 (cultural_gate modifier) | +| Killed | 1 | D3 (secondary contraband variant FactIds — explicitly OUT) | + +### 7 New Tickets Proposed + +| ID | Title | Team | Priority | Key Dependencies | +|----|-------|------|----------|-----------------| +| NEW-1 | NPC pattern/motivation mapping for v0.1 | copy | high | None | +| NEW-2 | Drin tier promotion evaluation | copy | medium | NEW-1 | +| NEW-3 | Wiki → YAML content conversion (Sova NPCs) | copy | high | C1, C2, C3 | +| NEW-4 | Monologue content pool — minimum viable set | copy | high | #261, B4 | +| NEW-5 | v0.1 wow moment content checklist | copy | high | None | +| NEW-6 | PC-as-NPC content authoring (authored lines) | copy | high | B3, B5 | +| NEW-7 | Interaction model minimum spec | copy | medium | None (informed by workshop Topic 4) | + +### Existing Ticket Updates + +| ID | Title | Action | +|----|-------|--------| +| #368 | Knowledge vocabulary for v0.1 content | Close when wiki review accepted | +| #369 | Wiki Review Workshop Outputs (epic) | Repurpose as parent epic for v0.1 content scoping | +| #301 | Wiki taxonomy and structure | Assign to copy, downscope for v0.1 (Sova only) | +| #319 | Krenn System wiki entry | Merge with A3 (expanded: wiki page + seed.yaml reference) | +| **#261** | **Dual Lens Authoring Guide** | **CRITICAL BOTTLENECK — blocks 9 downstream tickets** | +| #310 | Character voice speech patterns | Merge with or block on B4 | +| #306 | News ticker / Meridian feed content | Update scope per D4 (40-50 headlines) | +| #326 | YAML content loader | Assign to server, blocked by C1+C2, Sprint 4 | + +### Sprint 3 Copy Team (14 tickets proposed) + +**P0 — Must start immediately:** + +| Ticket | Title | Blocked By | +|--------|-------|------------| +| A2 | Hael → Naia Tamm rename | — | +| A1 | Apply canonical full names | — | +| A7 | Smuggler entity attributes | — | +| C1 | Content directory structure design | — | +| **#261** | **Dual Lens Authoring Guide** | **— (Critical path root)** | + +**P1 — Start after P0s:** + +| Ticket | Title | Blocked By | +|--------|-------|------------| +| A10 | Nils Davan stub | — | +| A11 | Triangle 1 fix | A10 | +| B2 | MIRROR pattern spec | — | +| B4 | Smuggler voice + moral arc | A7 | +| NEW-1 | NPC pattern/motivation mapping | — | +| NEW-5 | Wow moment content checklist | — | + +**P2 — Fit in around P0/P1:** + +| Ticket | Title | Blocked By | +|--------|-------|------------| +| A8 | Shortcode fix | — | +| B3 | PC-as-NPC spec | A7 | +| NEW-7 | Interaction model minimum spec | — | + +### Sprint 3 Server Tickets (content-related) + +| Ticket | Title | Blocked By | +|--------|-------|------------| +| C2 | Create content/ directory skeleton | C1 | +| C3 | Content schema definitions | C1 | + +### Critical Path (SI's Analysis) + +Two parallel chains must begin in Sprint 3: + +**Chain 1 — Content authoring:** +``` +#261 (Dual Lens Guide) → B4 (Smuggler voice) → A6 (FactId text) → content packs → monologue pool +``` + +**Chain 2 — Content architecture:** +``` +C1 (Directory design) → C2/C3 (skeleton/schemas) → C4-C8/NEW-3 (YAML files) → #326 (loader) +``` + +**#261 is the single biggest blocker in the entire content pipeline.** It blocks 9 tickets directly and cascades into everything. SI recommends immediate assignment with Paula as owner. + +### v0.1 IN List → Ticket Coverage + +| IN List Item | Status | Gaps | +|-------------|--------|------| +| WASD movement + collision | Covered (Sprint 1-2 done) | — | +| Context-sensitive interaction | Partially covered | Needs NEW-7 spec | +| Monologue system | Architecture covered | Content gap (NEW-4) | +| Knowledge graph | Covered | — | +| 2 playable characters | Covered (architecture) | — | +| THE FRIEND arc | Covered but **blocked by #261** | — | +| 5 triangles with forks | Partially covered | Weak Triangle 1 (A11) | +| 6 wow moments | **Gap** | Needs NEW-5 tracking ticket | +| 3 social sites | Covered but blocked by #261 | — | +| NPC routines | Covered (server) | — | +| Dual-lens parity | **Major gap** | Smuggler lens incomplete (A7, B4, A6) | +| PC-as-NPC | **Gap** | No tickets exist (B3, B5, NEW-6) | +| Content directory | **Gap** | Structure undefined (C1, C2, C3) | +| Content validation | **Gap** | No validation exists (C9, C10) | + +--- + +*Qatux, Round 1 tracking. For the record: all 7 responses cataloged, 17 consensus items, 5 disagreements requiring resolution, 7 additional wiki gaps identified, 10 open questions, 7 decisions ready to formalize. SI confirms 26 surviving tickets + 7 new proposals. #261 (Dual Lens Authoring Guide) is the critical bottleneck — blocks 9 downstream tickets across the entire content pipeline.* diff --git a/docs/workshops/v01-content-scoping/round1-tyre.md b/docs/workshops/v01-content-scoping/round1-tyre.md new file mode 100644 index 000000000..ec001dba5 --- /dev/null +++ b/docs/workshops/v01-content-scoping/round1-tyre.md @@ -0,0 +1,672 @@ +# Round 1 — Tyre (Technical Architect) +## v0.1 Content Scoping Workshop + +*cracks knuckles* + +Three topics assigned to me. Let me be honest about what each means technically. + +--- + +## Topic 3: Content Directory Structure + +### Format Decision: YAML + +Not RON, not JSON, not TOML. YAML. Here's why: + +| Criterion | YAML | RON | JSON | +|---|---|---|---| +| Content author readability | Excellent | Poor (Rust syntax) | Decent | +| Multi-line text (dialogue) | Native (`\|`, `>`) | Awkward | Escaped strings | +| serde support in Rust | `serde_yaml` (mature) | `ron` crate (mature) | `serde_json` (mature) | +| Schema validation tooling | JSON Schema (rich) | None standard | JSON Schema (native) | +| Generator output compatibility | Any language can emit YAML | Rust-only ergonomic | Any language | +| Hot-reload parse speed | Fast enough (~2ms for 100KB) | Faster (~0.5ms) | Fast (~1ms) | + +RON would be natural if only Rust engineers touched content. But Mellanie and Paula author content, and asking them to write `NpcProfile(axes: Axes(want: "Protect the operation"))` instead of `want: "Protect the operation"` is a tax with no return. The 1.5ms parse speed difference is irrelevant — content loads once at startup and on hot-reload. + +**Validation pipeline:** YAML files validate against JSON Schema definitions (one schema per content type). The server's `content_loader` also validates by attempting `serde_yaml::from_reader::()` — if it deserializes into the Rust struct, it's valid. Both checks run: schema catches structural issues early (missing required fields, wrong types), serde catches semantic issues (enum variant doesn't exist, value out of range). + +### Proposed Directory Structure + +``` +content/ + content.yaml # Manifest: lists all districts, content version + schema/ # JSON Schema definitions for validation + npc.schema.json + location.schema.json + fact.schema.json + district.schema.json + dialogue.schema.json + monologue.schema.json + routine.schema.json + triangle.schema.json + global/ # Shared across ALL districts (generator-safe) + facts/ # FactId definitions — the vocabulary + contraband.yaml # contraband.ring_exists, contraband.lattice_components, ... + location.yaml # location.corridor_b7_restricted, ... + investigation.yaml # investigation.manifest_discrepancy, ... + world.yaml # world.commission_regulations, ... + relationship.yaml # relationship.ring_membership, ... + progress.yaml # progress.initial_suspicion, ... + factions/ + lattice-commission.yaml + syndics.yaml + the-ring.yaml # Ring is district-local but faction def is global + concord-assembly.yaml + guardians-of-autonomy.yaml + entity-schema/ # EntityKnowledge attribute definitions + attributes.yaml # The 14 canonical keys from entity-attributes.md + enums/ # Tag enum definitions (D-035) + situations.yaml # 13 situation enums + topics.yaml # 9 topic enums + moods.yaml # 8 mood enums + access-tiers.yaml # public, insider, authority, peer, hostile + trust-tiers.yaml # surface, real, secret + triggers.yaml # 9 monologue trigger types + districts/ + sova-transit/ # v0.1: hand-authored district + district.yaml # District metadata, social site refs, NPC roster + npcs/ # One file per NPC + kael-davan.yaml # Tier 1 FRIEND — full 10-axis + tells + contradiction + sera-venn.yaml # Tier 1 FRIEND — full 10-axis + tells + contradiction + voss.yaml # Tier 2 + lera-sessik.yaml # Tier 2 + torek-lintar.yaml # Tier 2 + devra.yaml # Tier 2 + maret-korr.yaml # Tier 2 + resha.yaml # Tier 2 + harek.yaml # Tier 2 + naia-tamm.yaml # Tier 1 MIRROR (renamed from Hael) + renn.yaml # Tier 2 + pell.yaml # Tier 2 + drin.yaml # Tier 2 or 3 (pending promotion decision) + sess.yaml # Tier 3 + olin.yaml # Tier 3 + sabel.yaml # Tier 3 + tav.yaml # Tier 3 + locations/ + the-terminal.yaml # Social site: logistics hub + the-last-shift.yaml # Social site: bar / "Lera's" + maintenance-corridors.yaml # Social site: smuggling spaces + triangles/ + hub-power.yaml # Triangle 1: Voss/Nils power struggle + ring-trust.yaml # Triangle 2: internal ring loyalty + bar-tension.yaml # Triangle 3: bar social dynamics + investigation-pressure.yaml # Triangle 4: detective pressure + leverage-web.yaml # Triangle 5: Harek/Drin/compromise + dialogue/ # Grouped by location, then by role + the-terminal/ + dock-worker.yaml # Role-based, not NPC-named + shift-supervisor.yaml + scheduler.yaml + new-hire.yaml + the-last-shift/ + bartender.yaml + bar-regular.yaml + bar-owner.yaml + maintenance-corridors/ + courier.yaml + ring-operative.yaml + monologue/ # Hard partition per character (D-032) + smuggler/ + the-terminal.yaml + the-last-shift.yaml + maintenance-corridors.yaml + general.yaml # time_idle, non-location triggers + detective/ + the-terminal.yaml + the-last-shift.yaml + maintenance-corridors.yaml + general.yaml + routines/ + schedules.yaml # All NPC schedules: time → location → activity +``` + +### Key Design Choices + +**1. `global/` vs `districts/` split.** +Everything in `global/` is district-independent. FactId vocabulary, faction definitions, attribute schemas, tag enums — these are the *language* the content speaks. Districts are *instances* of content written in that language. When generators produce District #247, they use the same `global/` vocabulary. + +**2. Dialogue by location + role, NOT by NPC.** +Per D-035: `role` is a template-defined role, NPC assignment is runtime. The file `dialogue/the-terminal/dock-worker.yaml` contains all dialogue lines for the dock-worker role at the Terminal. At runtime, Kael (or any other dock worker) draws from this pool based on access/trust/situation filtering. This is generator-compatible — a generated district creates its own role pools. + +**3. Monologue files are per-character per-location.** +D-032 mandates hard partition. The directory structure enforces it physically. No risk of accidentally sharing lines between characters. + +**4. Facts in `global/`, not per-district.** +The FactId vocabulary (`contraband.ring_exists`) is global — it's the *language of knowledge*. The specific confidence progression text in the fact catalog is also global (it describes what each confidence level means for that fact). What varies per district is which facts are *relevant* and which NPCs *know* them — that's in the NPC profiles and the knowledge graph at runtime, not in the fact definitions. + +Exception: if future districts introduce district-specific facts (e.g., `mining.union_dispute` on a mining world), those can live in `districts/{district}/facts/` as extensions. The loader merges global + local. + +**5. One NPC per file.** +Each NPC profile is self-contained. This means: +- Content authors can work on different NPCs in parallel without merge conflicts +- Generators output one file per generated NPC +- Validation runs per-file (fast feedback) +- Git blame is clean (who wrote what, when) + +### Content Addressing + +**`canonical_id`** is a required field inside every content YAML file. It uniquely identifies the entity across the entire game. Format: `{type}:{slug}`. + +```yaml +# content/districts/sova-transit/npcs/kael-davan.yaml +canonical_id: "npc:kael-davan" +``` + +```yaml +# content/global/facts/contraband.yaml +facts: + - fact_id: "contraband.ring_exists" # FactId string IS the canonical_id +``` + +```yaml +# content/districts/sova-transit/locations/the-terminal.yaml +canonical_id: "loc:sova-transit:the-terminal" +``` + +```yaml +# content/districts/sova-transit/triangles/hub-power.yaml +canonical_id: "tri:sova-transit:hub-power" +``` + +**Why `canonical_id` is in the file, not derived from the path:** +- Files can be reorganized without breaking references +- Generators can place files anywhere and assign IDs programmatically +- Cross-file references use the `canonical_id` string, not file paths +- Duplicate ID detection is a validation rule (build fails if two files claim the same canonical_id) + +**Runtime mapping:** At content load, the server builds a `ContentRegistry`: +```rust +struct ContentRegistry { + // canonical_id string → StableId (assigned deterministically via hash or sequential) + id_map: BTreeMap, + // Reverse lookup + reverse_map: BTreeMap, +} +``` + +The `StableId(u64)` assigned at load time is deterministic — same content files always produce same IDs (sorted canonical_ids, sequential assignment). This satisfies D-010 principle 4 (deterministic simulation). + +### Wiki → Content File Mapping + +The wiki is the **authoring reference** (narrative intent, character depth, prose descriptions). Content files are the **engine data** (structured values, tagged lines, schedule timings). The transformation is: + +| Wiki Source | Content Target | Transformation | +|---|---|---| +| `wiki/npcs/kael-davan.md` | `districts/sova-transit/npcs/kael-davan.yaml` | 10-axis prose → structured YAML fields. Routine prose → time/location pairs. Tells prose → tell tag list. | +| `wiki/locations/krenn-system/the-terminal.md` | `districts/sova-transit/locations/the-terminal.yaml` | Prose description → spatial properties (bounds, sightlines, Meridian coverage, access requirements). | +| `wiki/knowledge/fact-catalog.md` | `global/facts/*.yaml` | Per-FactId entries, split by category file. Confidence progression text included as authoring reference. | +| `wiki/knowledge/entity-attributes.md` | `global/entity-schema/attributes.yaml` | Attribute key definitions + valid values + usage notes. | +| `wiki/factions/*.md` | `global/factions/*.yaml` | Faction identity → mechanical properties (access tier modifiers, trust defaults). | +| `wiki/authoring/monologue-guide.md` | `global/enums/*.yaml` + schema definitions | Tag taxonomy → enum value lists + schema. | +| `wiki/npcs/index.md` (triangles) | `districts/sova-transit/triangles/*.yaml` | Triangle descriptions → structured NPC references + fork definitions. | + +**The wiki doesn't go away.** Wiki remains the human reference for "why is Kael this way?" The content file says `want: "Protect the operation and the people in it"` — the wiki explains what that means narratively, what the secondary want is, how it evolved. Writers read wiki, engine reads content files. + +### NPC Profile File Example + +```yaml +# content/districts/sova-transit/npcs/kael-davan.yaml +canonical_id: "npc:kael-davan" +display_name: "Kael Davan" +tier: 1 +pattern: "FRIEND" # System A (thematic) +motivation: "OPERATOR" # System B (functional) — pending Gestalt's mapping +district: "sova-transit" + +# D-024: 10-axis model +axes: + want: "Protect the operation and the people in it" + secret: + surface: "Ring member, handles physical cargo" + deep: "Trying to exit the ring via unauthorized contact" + relationships: + - target: "npc:nils-davan" + kind: "sibling" + trust: 0.85 + - target: "npc:naia-tamm" # Renamed from Hael + kind: "partner" + trust: 0.95 + - target: "npc:smuggler-pc" # PC-as-NPC reference + kind: "close_colleague" + trust: 0.90 + tolerance: + current_stress: 0.55 + threshold: 0.75 + routine: + description: "Morning shift 06:00-14:00, bar after shift, home evenings" + information: + known_facts: + - "contraband.ring_exists:KnowsDetails" + - "contraband.lattice_components:KnowsDetails" + - "contraband.supply_chain:KnowsOf" + - "location.corridor_b7_restricted:KnowsDetails" + - "location.smuggling_route:KnowsDetails" + - "world.shift_schedule:KnowsDetails" + contentment: 0.45 + +# D-024: 3 supporting axes +personality: + traits: ["loyal", "careful", "conflict-avoidant"] +tells: + - trigger: "lying" + behavior: "looks left" + - trigger: "stressed" + behavior: "lattice checking" + - trigger: "discussing_exit" + behavior: "forced casualness" +skills: + set: ["logistics", "cargo_handling", "dock_operations"] + combat_trained: false + +# Entity attribute defaults (what a NEW observer would learn) +initial_attributes: + role: "dock worker" + faction: "civilian" # True faction hidden until discovered + species: "human" + routine_pattern: "morning shift at logistics hub, bar after shift" + +# THE FRIEND arc data (Tier 1 only) +friend_arc: + character: "smuggler" # This NPC is FRIEND to the smuggler + phases: + - name: "warmth" + triggers: [] # Default state + - name: "trust" + triggers: + - fact: "relationship.trust_network" + min_confidence: "KnowsOf" + - name: "doubt" + triggers: + - observation: "kael_in_corridor_b7" # Spatial staging trigger + - name: "conflict" + triggers: + - attribute_set: "contradiction_flagged" + contradiction: + type: "spatial" # Seen in wrong place + location: "loc:sova-transit:maintenance-corridors" + expected_location: "loc:sova-transit:the-terminal" + time_window: "shift_transition" +``` + +### Dialogue File Example + +```yaml +# content/districts/sova-transit/dialogue/the-terminal/dock-worker.yaml +role: "dock_worker" +location: "loc:sova-transit:the-terminal" + +lines: + - id: "terminal_d_001" + text: "Manifest says 240 kilos but that container's sitting heavy. Could be packing material. Could be anything." + access: [insider, peer] + trust: surface + situation: [routine, shift_start] + topic: [cargo] + mood: [comfortable] + + - id: "terminal_d_002" + text: "Voss moved the schedule again. Third time this rotation. Says it's efficiency." + access: [public] + trust: surface + situation: [routine, shift_end] + topic: [routine, colleague] + mood: [comfortable] + + - id: "terminal_d_003" + text: "You want to know about the night shift? Nobody wants the night shift. That's your answer." + access: [authority] + trust: surface + situation: [investigation] + topic: [routine, investigation] + mood: [suspicious] + + - id: "terminal_d_015" + text: "Nils has been... look, I can't talk about family here. Not with the scanners running." + access: [insider, peer] + trust: real + situation: [social, alone] + topic: [trust, personal] + mood: [worried, conflicted] + tags: ["nils_reference", "ring_internal"] +``` + +### Monologue File Example + +```yaml +# content/districts/sova-transit/monologue/smuggler/the-terminal.yaml +character: smuggler +location: "loc:sova-transit:the-terminal" + +lines: + - id: "terminal_m_s_001" + text: "Same dock, same hum, same shift. Kael's already at his station. Reliable as the gate cycle." + trigger: enter_location + prerequisite: null + topic: [routine, colleague] + mood: [comfortable] + tags: ["opening", "kael_reference"] + + - id: "terminal_m_s_007" + text: "That container's been in temp storage fourteen hours. Standard turnaround is six. Someone's buying time." + trigger: observe_anomaly + prerequisite: + facts: + contraband.supply_chain: KnowsOf + topic: [cargo] + mood: [analytical] + tags: ["investigation_seed"] + + - id: "terminal_m_s_012" + text: "Kael? In Corridor B-7? During shift transition? He has no reason to be there. None that I know of." + trigger: observe_npc + prerequisite: + entity: + target: "npc:kael-davan" + attribute: "routine_pattern" + condition: "deviation" + facts: + location.corridor_b7_restricted: KnowsOf + topic: [colleague, danger] + mood: [suspicious, conflicted] + tags: ["friend_contradiction", "wow_moment_3"] + dual_lens: + detective: "The dock worker — Davan — in a restricted corridor during transition. That's not routine maintenance." + notes: "THE FRIEND contradiction moment. Urgent chime. This is wow moment #3." +``` + +### Content Load Sequence (Server-Side) + +``` +PHASE 1: VOCABULARY LOAD (global/) + ├── Load global/enums/*.yaml → build tag enum registries + ├── Load global/facts/*.yaml → build FactId registry + ├── Load global/factions/*.yaml → build faction definitions + ├── Load global/entity-schema/attributes.yaml → build attribute key registry + └── Validate: all enum values, fact IDs, attribute keys are unique + +PHASE 2: DISTRICT LOAD (districts/{id}/) + ├── Load district.yaml → district metadata, NPC roster, location list + ├── Load npcs/*.yaml → NPC profiles + │ ├── Validate canonical_ids unique + │ ├── Validate relationship targets exist + │ ├── Validate known_facts reference valid FactIds + │ └── Build canonical_id → StableId mapping (ContentRegistry) + ├── Load locations/*.yaml → location spatial definitions + ├── Load triangles/*.yaml → triangle NPC references + fork definitions + │ └── Validate all NPC refs exist in ContentRegistry + ├── Load dialogue/**/*.yaml → line pool registry + │ └── Validate all tag values against enum registries + ├── Load monologue/**/*.yaml → per-character line pool registry + │ └── Validate prerequisites reference valid FactIds + entity attributes + └── Load routines/schedules.yaml → NPC schedule data + +PHASE 3: ENTITY SPAWN + ├── For each NPC in roster: + │ ├── Spawn bevy_ecs Entity + │ ├── Insert Npc marker component + │ ├── Insert axis components (Want, Secret, Relationships, etc.) + │ ├── Insert KnowledgeGraph component (pre-populated from information.known_facts) + │ ├── Insert DailyRoutine component (from routine data) + │ ├── Register StableId ↔ Entity in EntityRegistry + │ └── If Tier 1 FRIEND: insert FriendArc component with phase data + ├── For each location: + │ ├── Spawn location entity with spatial properties + │ └── Register in ContentRegistry + └── Build dialogue/monologue indices for fast runtime lookup + +PHASE 4: READY + └── Content loaded, entities spawned, registries built → simulation can start +``` + +**Hot-reload path:** File watcher detects YAML change → re-parse affected file → validate → if NPC: update axis components in-place (no respawn needed for value changes). If dialogue/monologue: rebuild affected line pool index. If structural change (new NPC, removed NPC): log warning, require restart. Hot-reload is a development convenience, not a production feature. + +--- + +## Topic 5: Technical Risk in the IN List + +I'll tier these. Tier 1 = low risk. Tier 2 = medium, manageable. Tier 3 = hard, needs careful scoping. Tier 4 = this is where the schedule dies if we're not careful. + +### Tier 1 — Low Risk (will work, standard engineering) + +**WASD movement + collision.** Already have `movement.rs` with `TilePosition`. Collision is tile-based occupancy checking. 8-directional movement is in `PlayerAction` already. Z-level transitions are the only wrinkle — handle as tile properties (stairs, elevators). Estimate: done or nearly done. + +**3 social sites (Terminal, Last Shift, Maintenance Corridors).** These are map content, not systems work. Server needs location entities with spatial bounds and properties (Meridian coverage, access restrictions). Client needs tile rendering. The hard part is art — which is explicitly "functional boxes with labels" for v0.1 (D-014). Estimate: location data loading is part of content loader; rendering is standard tile mapping. + +**NPC routines (schedule-based movement).** Time system exists (D-031, `time.rs`). Day phases exist. Schedule format is defined. NPCs move to specified locations at phase boundaries. This is a state machine: `current_phase → lookup schedule → pathfind to target location → move`. Estimate: 2-3 dev-days for the schedule system. Content authoring for 17 NPC schedules is the longer pole. + +### Tier 2 — Medium Risk (technically straightforward but integration-heavy) + +**Knowledge graph.** D-041 is well-defined. Types exist in `types.rs`. Sprint 2 delivers core data structures + direct observation flow + basic decay. The risk isn't the knowledge graph itself — it's that **everything depends on it**. Monologue prerequisites query it. Dialogue filtering queries it. The FRIEND arc's contradiction detection queries it. Entity rendering uses `RelationshipState` from it. If knowledge graph delivery slips, everything downstream slips. + +*Mitigation:* Knowledge graph Sprint 2 scope is intentionally narrow (direct observation + decay only). Sprint 3 adds the complex stuff. But Sprint 3 is also when monologue, dialogue, and FRIEND arc need to work. The dependency chain is tight. + +**2 playable characters seeing same world differently.** Architecturally, this is already designed for (D-010 principle 3). The `ObserverSnapshot` is per-entity — two players get different snapshots. Knowledge graphs are per-entity — two PCs have different knowledge. The risk is **content volume and consistency**. Every piece of monologue content is written twice (one per character). Every NPC needs a smuggler-lens AND detective-lens. Every triangle fork needs to make sense from both perspectives. + +*Mitigation:* The dual-lens requirement is a content team problem more than a server/client problem. But it doubles the content validation surface area — a monologue line that references a fact the detective can't learn is a content bug, not a code bug. Content validation tooling (Topic 3's schema validation) is the mitigation. + +**Context-sensitive interaction (approach NPC → prompt → dialogue).** Server: proximity trigger → interaction state → dialogue pool query. Client: prompt rendering → dialogue display. The plumbing is standard. The risk is the **dialogue selection algorithm**. D-035 defines 6 structural tags + 3 selection tags. Filtering by access + trust + situation is a hard filter (combinatorial but finite). Selecting by topic + mood is a weighted selection (needs tuning). The algorithm itself is maybe 200 lines of Rust. The tuning to make it *feel good* is the unknown. + +*Mitigation:* Build the line previewer CLI (already on my priority list) early. Let Mellanie and Paula test dialogue selection before it's in-game. Iterate on weights outside the game loop. + +### Tier 3 — High Risk (technically complex, integration-dependent) + +**Monologue system (tagged triggers, FactId prerequisites).** This is the feature that makes or breaks the vertical slice. Nine trigger types, each requiring different detection logic: + +| Trigger | Detection Complexity | Server System Required | +|---|---|---| +| `enter_location` | Low | Location transition event | +| `observe_npc` | Medium | LOS + entity identification | +| `hear_sound` | Medium | Sound range model (D-018) | +| `observe_anomaly` | **High** | Routine deviation detection | +| `post_conversation` | Low | Dialogue end event | +| `discover_evidence` | Medium | Knowledge graph state change | +| `witness_interaction` | **High** | Two-entity observation in LOS | +| `time_idle` | Low | Timer on no-input | +| `return_visit` | Medium | Location visit history | + +`observe_anomaly` and `witness_interaction` are the dangerous ones. `observe_anomaly` means "NPC is doing something outside their routine" — the server needs to know what "normal" looks like to detect "abnormal." This requires the routine system to track expected vs. actual behavior, which is a step beyond simple schedule execution. + +`witness_interaction` means "I see NPC A talking to NPC B" — requires tracking NPC-to-NPC interactions AND checking whether those interactions are in the observer's LOS. This is a second-order perception query. + +**Prerequisite evaluation** is the other risk. A prerequisite like: +```yaml +prerequisite: + entity: + target: "npc:kael-davan" + attribute: "routine_pattern" + condition: "deviation" + facts: + location.corridor_b7_restricted: KnowsOf +``` +...is a small query language. The server needs to evaluate arbitrary combinations of entity attribute checks + fact confidence checks + potentially boolean logic (AND/OR). Keep this dead simple for v0.1 — AND-only, no nesting, explicit conditions. The temptation to build a general-purpose query engine is scope death. + +*Estimate:* 8-12 dev-days for the full monologue pipeline (trigger detection + prerequisite evaluation + pool selection + pacing). The "pacing" part (how often monologue fires, cooldown between lines, priority when multiple lines qualify) is pure playtesting — budget 2-3 days of tuning time. + +**THE FRIEND arc (Kael for smuggler, Sera for detective).** This is the integration test for EVERYTHING: +- Knowledge graph contradiction detection (Sprint 3) +- Monologue trigger system (all 9 types exercise) +- Tell system (behavioral observation accumulation over time) +- Multi-phase dialogue shifts (D-028 all 4 layers) +- Spatial staging (NPC in specific place at specific time) +- Relationship state transitions (Friendly → PersonOfInterest) + +The risk isn't any individual system — it's the intersection. THE FRIEND arc requires all systems to work together correctly. A bug in knowledge decay timing means the contradiction window passes unnoticed. A bug in spatial staging means Kael is never in Corridor B-7 when the player is nearby. A bug in tell accumulation means the player has no behavioral evidence before the contradiction. + +*Mitigation:* THE FRIEND arc needs its own integration test — a scripted scenario that walks through the full 5-phase arc and validates each system fires correctly. This is D-030's CauseChain paying off: every knowledge event, every monologue trigger, every relationship state change gets provenance tracking, and the integration test can verify the causal chain matches expectations. + +*Estimate:* Server systems: 5-8 dev-days (contradiction detection + spatial staging + tell accumulation + FRIEND phase transitions). Content: probably the largest single content deliverable in v0.1 (70-100 lines per FRIEND, times 2 FRIENDs, all hand-authored). Client: relationship color shifts (D-033), dialogue phase UI cues. + +### Tier 4 — Schedule Killers (needs aggressive scoping or it takes over) + +**5 triangles with at least 1 fork each.** Each fork is a branching decision point. Each branch has consequences that ripple through NPCs, knowledge, and potentially other triangles. + +The math: 5 triangles × 1 fork × 2 branches × N consequences per branch. If consequences cascade across triangles, N grows fast. If Triangle 1's fork outcome changes NPC attitudes in Triangle 3, then Triangle 3's fork depends on Triangle 1's resolution, and you have dependency chains. + +*Scope control:* For v0.1, forks should be **terminal decisions** — they affect the triangle's own NPCs and change the player's knowledge, but they don't cascade into other triangles. Cross-triangle contamination is a v0.2 feature. This keeps each fork to 2-3 consequence entities, not 10-15. + +*Estimate:* If forks are self-contained: 2-3 dev-days for the fork/consequence system + 3-5 dev-days for content authoring 5 fork scenarios. If forks cascade: 8-12 dev-days for cascade resolution + testing. **Strongly recommend self-contained forks for v0.1.** + +**6 wow moments.** These aren't independent features — they're integration milestones. Each one is a "everything up to here works" gate: + +| Wow Moment | Systems Required | Risk | +|---|---|---| +| #1 Arrival | Ambiance + routines + opening monologue | Low | +| #2 Character's Eye | Monologue trigger + routine deviation detection | **Medium-High** | +| #3 FRIEND Contradiction | Full FRIEND arc + spatial staging + contradiction detection | **High** | +| #4 Divergence Reveal | Dual-lens content + relationship colors + monologue partitioning | Medium | +| #5 News Ticker | Ticker system + dual monologue reactions | **Medium** (ticker is new UI element) | +| #6 Quiet Moment | time_idle trigger + reflective monologue | Low | + +The dependency chain: #1 is achievable early. #6 is achievable early. #2 requires monologue system. #5 requires ticker + monologue. #4 requires knowledge graph + rendering. #3 requires everything. + +**#3 is the critical path.** If THE FRIEND contradiction doesn't work, the demo's emotional peak is missing. Everything should be prioritized to unblock #3. + +### Summary Risk Matrix + +| Feature | Risk Level | Primary Risk Factor | Mitigation | +|---|---|---|---| +| WASD + collision | Low | None significant | Already built | +| 3 social sites | Low | Art (not scope concern at v0.1) | Functional boxes | +| NPC routines | Low-Medium | Content authoring time | Start schedules early | +| Knowledge graph | Medium | Downstream dependency chain | Sprint 2 narrow scope holds | +| 2 playable characters | Medium | Content volume doubling | Content validation tooling | +| Context-sensitive interaction | Medium | Dialogue selection tuning | Line previewer CLI | +| Monologue system | **High** | Trigger detection + prerequisite evaluation | Simple AND-only prerequisites, defer complex triggers | +| THE FRIEND arc | **High** | Integration of all systems | Dedicated integration test, prioritize for critical path | +| 5 triangle forks | **Medium-High** | Cascade complexity | Self-contained forks, no cross-triangle effects in v0.1 | +| 6 wow moments | Varies | #3 is the critical path | Prioritize everything that unblocks #3 | + +**What will take longer than expected:** +1. **Monologue prerequisite tuning.** The gap between "prerequisites work" and "prerequisites feel right" is large. Content authors will write prerequisites that are too strict (nothing fires) or too loose (everything fires). Budget iteration time. +2. **Dialogue selection weighting.** Same tuning problem. Getting NPCs to say contextually appropriate things from a tagged pool requires weight iteration. +3. **Spatial staging for THE FRIEND.** Getting Kael into Corridor B-7 *when the player is nearby* without feeling scripted is a storyteller-level challenge compressed into one specific moment. +4. **Content conversion.** Transforming 17 NPC wiki profiles + 24 fact entries + 3 location descriptions + 5 triangles from prose markdown into structured YAML is manual labor. Each NPC file needs ~30 minutes of careful conversion. Budget 2-3 full days for the initial wiki → content conversion pass. + +--- + +## Topic 6: Cross-Team Ticket Splits + +The content pipeline creates work that spans all three teams (server, client, copy). Here's my proposed split for the major ticket categories. Each "ticket" below is a logical unit that should be one or two actual tickets. + +### Content Infrastructure (Sprint 3) + +| Ticket | Server | Client | Copy | +|---|---|---|---| +| Content directory structure | Create `content/` tree, `content.yaml` manifest | — | Populate initial files | +| Content loader (Phase 1-2) | `ContentRegistry`, YAML deserialization, entity spawn from content | — | — | +| Content loader (Phase 3-4) | Line pool indexing, hot-reload watcher | — | — | +| Content validation schemas | serde validation on load | — | JSON Schema files for YAML | +| Line previewer CLI | Build CLI: YAML → filtered line output | — | Test with real content | + +### Wiki → Content Conversion (Sprint 3) + +| Ticket | Server | Client | Copy | +|---|---|---|---| +| NPC profile conversion (17 NPCs) | Define `NpcProfile` serde struct | — | Convert wiki MD → YAML (17 files) | +| Location conversion (3 sites) | Define `LocationDef` serde struct | — | Convert wiki MD → YAML (3 files) | +| Fact catalog conversion | Already defined (`FactId`, `FactKnowledge`) | — | Split fact-catalog.md → 6 YAML files | +| Triangle definitions | Define `TriangleDef` serde struct | — | Write 5 triangle YAML files | +| Routine/schedule conversion | Define `ScheduleEntry` serde struct | — | Write schedules.yaml for 17 NPCs | + +### Monologue System (Sprint 3) + +| Ticket | Server | Client | Copy | +|---|---|---|---| +| Monologue trigger detection | 9 trigger type implementations | — | — | +| Monologue prerequisite evaluation | Knowledge graph query engine (simple AND-only) | — | — | +| Monologue line pool selection | Tag filtering + weighted selection | — | — | +| Monologue pacing/cooldown | Rate limiter, priority queue, cooldown timers | — | — | +| Monologue content authoring | — | — | Write monologue lines (2 chars × 3 locs + general) | +| Monologue display UI | — | Text panel, chime trigger, fade/scroll | — | +| Monologue chime audio | — | Audio event handler for monologue chime SFX | — | + +### Dialogue System (Sprint 3) + +| Ticket | Server | Client | Copy | +|---|---|---|---| +| Dialogue pool loader | YAML → indexed line pool, tag filtering | — | — | +| Dialogue selection algorithm | Access/trust hard filter + topic/mood weighted select | — | — | +| Dialogue content authoring | — | — | Write role-based dialogue (10+ roles × location) | +| Dialogue UI | — | Dialogue box, NPC name display, line rendering | — | + +### Interaction Model (Sprint 3) + +| Ticket | Server | Client | Copy | +|---|---|---|---| +| Proximity detection | Distance threshold check per tick | — | — | +| Interaction state machine | Idle → Prompt → InDialogue → Exit | — | — | +| Interaction prompt UI | — | "Press E to talk" / context-sensitive label | — | + +### THE FRIEND Arc (Sprint 3-4, cross-team) + +| Ticket | Server | Client | Copy | +|---|---|---|---| +| FRIEND phase transition system | Phase state machine, trigger evaluation | — | — | +| Contradiction detection | `Contradicted` KnowledgeState, spatial observation vs. expected location | — | — | +| Tell system accumulation | Behavior flag aggregation, tell detection events | — | — | +| FRIEND content (Kael) | — | — | 70-100 lines: dialogue + monologue + tells + contradiction | +| FRIEND content (Sera) | — | — | 70-100 lines: dialogue + monologue + tells + contradiction | +| Relationship color rendering | — | Entity color shifts per D-033 RelationshipState | — | +| FRIEND integration test | Test scenario: full 5-phase arc validation | — | Test content fixtures | + +### NPC Rendering + Routines (Sprint 3) + +| Ticket | Server | Client | Copy | +|---|---|---|---| +| NPC schedule execution | DayPhase → location lookup → pathfind → move | — | — | +| NPC routine deviation events | Expected vs. actual location tracking | — | — | +| NPC sprite/label rendering | — | Entity kind → sprite, name display from snapshot | — | +| NPC movement animation | — | Interpolated movement between tiles | — | + +### Cross-Cutting + +| Ticket | Server | Client | Copy | +|---|---|---|---| +| PC-as-NPC (other character exists) | NPC entity with PC profile data | NPC rendering (same as any NPC) | ~20-30 authored items | +| News ticker system | Ticker event generation | Ticker UI widget | Ticker text + dual monologue reactions | +| Smuggler lens parity | — | — | Smuggler attribute vocabulary + lens sections for all 17 NPCs | +| Hael → Naia Tamm rename | Update any hardcoded refs | — | Execute rename across all wiki + content files | + +### Dependency Chain + +``` +Content directory structure + └── Content loader (Phase 1-2) + ├── NPC profile conversion ──→ NPC schedule execution + ├── Location conversion + ├── Fact catalog conversion + └── Content loader (Phase 3-4) + ├── Dialogue pool loader ──→ Dialogue selection ──→ Dialogue UI + ├── Monologue trigger detection + │ └── Monologue prerequisite evaluation + │ └── Monologue line pool selection + │ └── Monologue pacing ──→ Monologue display UI + └── Triangle definitions ──→ Triangle fork system + +Proximity detection ──→ Interaction state machine ──→ Interaction prompt UI ──→ Dialogue UI + +Knowledge graph (Sprint 2) ──→ Contradiction detection ──→ FRIEND phase transitions + ──→ Monologue prerequisite evaluation + ──→ Tell system accumulation + +FRIEND content (copy) ──→ FRIEND integration test +Monologue content (copy) ──→ Monologue pacing tuning +Dialogue content (copy) ──→ Dialogue selection tuning +``` + +**Critical path to wow moment #3 (THE FRIEND contradiction):** +Knowledge graph → Contradiction detection → FRIEND phase transitions → Spatial staging (routine deviation) → Monologue trigger (observe_npc with deviation condition) → Monologue display → FRIEND content authored and loaded. + +Every block on this chain is either server or copy team work. Client only needs monologue display and relationship color rendering to support #3. **Server and copy are the bottleneck for the emotional peak of the demo.** + +--- + +## Summary + +1. **Format: YAML.** Content authors write it, serde reads it, generators produce it later. +2. **Structure: `global/` + `districts/`.** Vocabulary is global, instances are per-district. Generator-compatible from day one. +3. **Addressing: `canonical_id` in every file.** Maps to `StableId` at runtime via `ContentRegistry`. Deterministic assignment. +4. **Critical path: THE FRIEND arc.** Every technical risk converges on wow moment #3. Server-side systems (monologue triggers, prerequisite evaluation, contradiction detection, spatial staging) and copy-side content (FRIEND profiles, dialogue, monologue) are the two parallel tracks that must converge. +5. **Biggest schedule risk: content conversion + monologue tuning.** The system can be built, but making it *feel right* requires authored content and iteration time. Start the wiki → YAML conversion early so server engineers have real data to test against. diff --git a/docs/workshops/v01-content-scoping/round2-dudley.md b/docs/workshops/v01-content-scoping/round2-dudley.md new file mode 100644 index 000000000..974f037bc --- /dev/null +++ b/docs/workshops/v01-content-scoping/round2-dudley.md @@ -0,0 +1,787 @@ +# Round 2 — Dudley (Server Developer) + +## 1. YAML Acceptance — Loader Adaptation + +Accepted. YAML is the content format for v0.1. The lead has spoken and Tyre's rationale is sound — content authors (Mellanie, Paula) need to write and read these files, and `serde_yaml` is mature enough for our needs. + +### What Changes in the Loader + +Almost nothing structurally. The `serde` derive macros work identically across formats — the Rust structs stay the same, only the deserializer call changes: + +```rust +// Round 1 (RON): +// let profile: NpcProfile = ron::from_str(&content)?; + +// Round 2 (YAML): +let profile: NpcProfile = serde_yaml::from_str(&content)?; +``` + +The 6-phase load sequence from Round 1 is format-agnostic. All phase ordering, validation rules, and resource creation remain identical. Specific adaptations: + +| Item | Round 1 (RON) | Round 2 (YAML) | Impact | +|------|---------------|----------------|--------| +| Manifest | `content/manifest.ron` | `content/content.yaml` | Filename only | +| NPC profiles | `.ron` files | `.yaml` files | Extension only | +| Dialogue/monologue | `.ron` files | `.yaml` files | Extension only | +| Multi-line text | Rust string escaping | YAML native `\|` / `>` blocks | Better for authors — no escaping | +| Validation | Serde-only | Serde + JSON Schema (Tyre's dual validation) | Strictly more validation | +| Dependency | `ron` crate | `serde_yaml` crate | Swap one dependency | + +The one genuine improvement: YAML's native multi-line text support (`|` for literal blocks) means dialogue and monologue text will be cleaner in the content files. No escaped newlines, no awkward string concatenation. Content authors benefit directly. + +### Cargo.toml Change + +```toml +# Add: +serde_yaml = "0.9" +# The ron crate stays for potential future use (RON converter per lead's decision) +``` + +### RON Converter + +Per the lead's decision, we build a RON converter. My recommendation: + +- **Location:** `tooling/content-converter/` — a small Rust binary, not part of the server +- **Direction:** YAML → RON only (content files are authored in YAML; if we ever want RON for hot-path loading, the converter produces it) +- **When it runs:** Build-time, optional. Not load-time — the server loads YAML directly. The converter is insurance for a hypothetical future where YAML parse speed matters (it won't for v0.1) +- **Priority:** Low. Build it when someone asks for it, not proactively + +--- + +## 2. Multi-Action Interaction Model + +### The Architecture: N Actions, 1 Client Selection + +The server computes ALL available actions for each nearby entity. The `InteractionOptions` struct from Round 1 already supports this. The v0.1 client selects the top-ranked action to display. The v0.2 client shows the full list. + +```rust +/// Available interactions for a nearby entity. +/// Server computes all; client displays based on version. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct EntityInteractions { + /// StableId of the target entity + pub entity_id: u64, + /// Display name (knowledge-filtered — "Dock Worker" or "Kael Davan") + pub display_name: String, + /// All available actions, ordered by priority (highest first). + /// v0.1 client shows actions[0] only. + /// v0.2+ client shows all (radial menu, list, etc.) + pub actions: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AvailableAction { + /// Action identifier used in PlayerAction::InteractWith + pub action_id: String, + /// What the action is + pub kind: ActionKind, + /// Display label for the client ("Talk", "Examine", "Ask about the schedule") + pub label: String, + /// Priority for v0.1 single-action selection (higher = shown first) + pub priority: u8, + /// Can this action be performed right now? + pub enabled: bool, + /// Why not? (shown as tooltip in v0.2+, ignored in v0.1) + pub disabled_reason: Option, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum ActionKind { + /// Study the entity without initiating contact. + /// Updates knowledge graph with behavioral observations. + Examine, + /// Initiate dialogue. Opens conversation state. + Talk, + /// Look at an environmental object. Returns description + knowledge grants. + ExamineObject, + /// Listen to a nearby NPC-NPC conversation. Passive — no social cost. + Overhear, +} +``` + +### Priority Ranking System + +The server determines action priority per context. This is where the "single context-sensitive action" behavior lives: + +```rust +/// Determine default action priority for a given entity and context. +/// Returns actions sorted by priority (highest first). +fn rank_actions( + target_kind: EntityKind, + observer_knowledge: &KnowledgeGraph, + target_stable_id: &StableId, + target_in_conversation: bool, + target_activity: &str, +) -> Vec { + let mut actions = Vec::new(); + + match target_kind { + EntityKind::Npc => { + // Examine is always available for NPCs in LOS + let examine_priority = if observer_knowledge + .entity_knowledge(target_stable_id) + .map(|ek| ek.known_attributes.contains_key("contradiction_flagged")) + .unwrap_or(false) + { + // Post-contradiction: Examine becomes high priority + // "Watch them more carefully" + 90 + } else { + // Default: Examine is secondary to Talk + 40 + }; + + actions.push(AvailableAction { + action_id: format!("examine_{}", target_stable_id.0), + kind: ActionKind::Examine, + label: "Observe".to_string(), + priority: examine_priority, + enabled: true, + disabled_reason: None, + }); + + // Talk: available if NPC is not sleeping, not in combat, not already + // in conversation with someone else + let talk_enabled = !target_in_conversation + && target_activity != "sleeping"; + + actions.push(AvailableAction { + action_id: format!("talk_{}", target_stable_id.0), + kind: ActionKind::Talk, + label: "Talk".to_string(), + priority: if talk_enabled { 50 } else { 10 }, + enabled: talk_enabled, + disabled_reason: if !talk_enabled { + Some("Busy".to_string()) + } else { + None + }, + }); + + // Overhear: available if NPC is in conversation with another NPC + if target_in_conversation { + actions.push(AvailableAction { + action_id: format!("overhear_{}", target_stable_id.0), + kind: ActionKind::Overhear, + label: "Listen".to_string(), + priority: 60, + enabled: true, + disabled_reason: None, + }); + } + } + EntityKind::Object => { + actions.push(AvailableAction { + action_id: format!("examine_obj_{}", target_stable_id.0), + kind: ActionKind::ExamineObject, + label: "Examine".to_string(), + priority: 50, + enabled: true, + disabled_reason: None, + }); + } + _ => {} + } + + // Sort by priority descending + actions.sort_by(|a, b| b.priority.cmp(&a.priority)); + actions +} +``` + +### How v0.1 and v0.2 Differ — Client Side Only + +| Behavior | v0.1 | v0.2+ | +|----------|------|-------| +| Actions computed | ALL (server computes full list) | ALL (same) | +| Actions sent to client | ALL (via `EntityInteractions.actions`) | ALL (same) | +| Actions displayed | `actions[0]` only — single prompt | All enabled actions — menu/radial | +| Player input | `Interact` → server applies `actions[0]` | `InteractWith(action_id)` → server applies specific action | +| Architecture change needed for v0.2 | **None on server.** Client reads more of the existing data. | Client UI change only | + +The key guarantee: **zero server-side changes for v0.2 multi-verb.** The server already sends everything. The client just reads more of what's already there. + +### PlayerAction Extension + +```rust +pub enum PlayerAction { + // ... existing movement variants ... + + /// v0.1: interact with nearest entity, server picks top action. + Interact, + + /// v0.2+: interact with specific entity using specific action. + /// Falls back to top action if action_id is None. + InteractWith { + target_id: u64, // StableId of target + action_id: Option, // specific action, or None for default + }, + + /// Select a dialogue topic during active conversation. + DialogueSelect { topic: String }, + + /// End the active conversation. + DialogueEnd, +} +``` + +For v0.1, the client sends `Interact`. The server resolves to the nearest entity and applies `actions[0]`. When v0.2 introduces multi-verb UI, the client sends `InteractWith { target_id, action_id }`. The server handles both — `Interact` is syntactic sugar for "find nearest, pick top action." + +### Stig's Question: IPC Message Format + +Stig asked what the state update looks like. The answer: **full text in the message, not IDs for client-side lookup.** This keeps the client thin and prevents information leakage. The `ObserverSnapshot` already carries everything the client needs. Interaction data rides the same channel: + +```rust +/// ObserverSnapshot v3 — adds interaction and dialogue data. +pub struct ObserverSnapshot { + pub version: u8, // 3 + pub tick: u64, + pub game_time: GameTime, + pub player_facing: FacingDirection, + pub entities: Vec, + pub visible_tiles: Vec, + + // v3 additions: + + /// Entities within interaction range with available actions. + /// Empty if no interactable entities are nearby. + pub nearby_interactions: Vec, + + /// Active dialogue state. None if not in conversation. + pub active_dialogue: Option, + + /// Monologue lines triggered this tick. Usually 0 or 1. + pub monologue: Vec, + + /// Overheard conversation fragments. Passive, proximity-based. + pub overheard: Vec, + + /// Current simulation speed (1.0 = normal, 0.5 = overlay, 0.0 = paused). + /// Client uses this to adjust animation/interpolation rates. + pub sim_speed: f32, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ActiveDialogue { + pub npc_entity_id: u64, + pub npc_name: String, + pub npc_relationship_color: RelationshipState, + /// Current NPC line. None before first line / between lines. + pub current_line: Option, + /// Available topics the player can raise. Empty if conversation is NPC-led. + pub available_topics: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DialogueLineDisplay { + pub line_id: String, + pub text: String, + pub mood: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TopicOption { + pub topic_id: String, + pub label: String, + pub enabled: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MonologueDisplay { + pub line_id: String, + pub text: String, + pub trigger: String, + /// true = use urgent chime (observe_anomaly, discover_evidence) + pub urgent: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct OverheardDisplay { + pub speaker_id: u64, + pub speaker_name: String, + pub fragment: String, +} +``` + +Everything the client needs to render is in the snapshot. The client never queries content files. The server is the single source of truth. + +--- + +## 3. Pause System — Tick Rate Modulation + +### The Model: SimulationSpeed Resource + +Currently `SimulationTime` has a boolean `paused` field. That's insufficient for 50% speed. I'll replace it with a speed multiplier model: + +```rust +/// Simulation speed states. +/// Determines how many ticks advance per real-time frame. +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +pub enum SimSpeed { + /// Normal speed: 1 tick per frame at target TPS (10 tps per D-031). + Normal, + /// Reduced speed: tick every other frame (50% speed). + /// Used when UI overlays are active (knowledge panel, dialogue). + Overlay, + /// Full pause: no ticks advance. + /// Spacebar toggle. Always available. + Paused, +} + +impl SimSpeed { + /// Returns the tick advance rate. + /// Normal = advance every frame. + /// Overlay = advance every 2nd frame. + /// Paused = never advance. + pub fn should_tick(&self, frame_counter: u64) -> bool { + match self { + SimSpeed::Normal => true, + SimSpeed::Overlay => frame_counter % 2 == 0, + SimSpeed::Paused => false, + } + } + + /// Serialized speed for client animation adjustment. + pub fn as_f32(&self) -> f32 { + match self { + SimSpeed::Normal => 1.0, + SimSpeed::Overlay => 0.5, + SimSpeed::Paused => 0.0, + } + } +} + +/// Resource tracking simulation speed and frame count. +#[derive(Resource, Debug, Clone)] +pub struct SimulationSpeed { + /// Current speed state. + pub speed: SimSpeed, + /// Frame counter for Overlay tick skipping. + pub frame_counter: u64, + /// Stack of speed modifiers. Highest priority wins. + /// When all modifiers are removed, returns to Normal. + speed_stack: Vec, +} + +#[derive(Debug, Clone)] +struct SpeedModifier { + source: SpeedSource, + speed: SimSpeed, + priority: u8, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum SpeedSource { + /// Spacebar toggle — highest priority, always wins. + PlayerPause, + /// Knowledge panel open. + KnowledgePanel, + /// Active dialogue with NPC. + Dialogue, +} +``` + +### State Machine + +``` + ┌──────────┐ + ┌──────→│ Normal │◄──────┐ + │ │ (1.0x) │ │ + │ └────┬─────┘ │ + │ │ │ + close overlay open overlay spacebar + │ │ │ + │ ┌────▼─────┐ │ + ├──────→│ Overlay │──────→│ + │ │ (0.5x) │ │ + │ └────┬─────┘ │ + │ │ │ + │ spacebar │ + │ │ │ + │ ┌────▼─────┐ │ + └───────│ Paused │───────┘ + │ (0.0x) │ + └──────────┘ +``` + +Rules: +1. **Spacebar always toggles full pause.** From Normal → Paused. From Overlay → Paused. From Paused → returns to whatever state was active before pause (Normal or Overlay). +2. **Opening knowledge panel or dialogue → Overlay (50%).** Multiple overlays don't stack — it's 50% whether you have one or three open. +3. **Closing all overlays → Normal.** But only if not explicitly paused by spacebar. +4. **Spacebar overrides everything.** It's the master switch. + +### Implementation: Modified advance_tick + +```rust +/// System: advance tick based on current simulation speed. +/// Replaces the current boolean-paused advance_tick. +pub fn advance_tick( + mut time: ResMut, + mut speed: ResMut, +) { + speed.frame_counter += 1; + + if speed.speed.should_tick(speed.frame_counter) { + time.tick += 1; + } +} + +/// System: process pause/speed PlayerActions. +pub fn process_speed_input( + mut speed: ResMut, + input_events: Res, + // ... other input handling +) { + // Spacebar pause toggle + // When paused by spacebar, restore previous speed on unpause + // Overlay open/close events modify the speed stack +} +``` + +### What the Client Needs to Know + +The `sim_speed: f32` field in ObserverSnapshot v3 tells the client: +- `1.0` → normal animation/interpolation +- `0.5` → halve animation rates, entities move at half speed visually +- `0.0` → freeze all animation, UI stays responsive + +The client doesn't manage pause state. It reads the speed from the snapshot and adjusts rendering accordingly. The server is authoritative. + +### Dialogue-Specific Pause Behavior + +When dialogue is active (player is talking to an NPC), simulation runs at Overlay speed (50%). This means: +- NPCs continue their routines at half speed — the world doesn't freeze when you talk +- Other NPCs can walk past during your conversation — you might miss something +- But it's slow enough that the player doesn't feel punished for engaging in dialogue + +If the player hits spacebar during dialogue, full pause. They can read at their own pace. Spacebar again resumes to Overlay (because dialogue is still active). + +--- + +## 4. FriendArc Phase Transitions — Triggers and Content Dependencies + +### Phase Transition State Machine + +``` + WARMTH ──────→ TRUST ──────→ DOUBT ──────→ CONFLICT + │ │ │ │ + │ auto (tick) │ knowledge │ observation │ knowledge + + │ │ threshold │ + monologue │ dialogue + │ │ │ │ + ▼ ▼ ▼ ▼ + "We're good" "I trust you" "Something's "I know what + wrong" you did" +``` + +### Phase-by-Phase: Triggers, Content, and What the Server Needs + +#### Phase 1: WARMTH → TRUST + +**Trigger:** Interaction count threshold + time elapsed. + +```rust +/// Transition from Warmth to Trust. +/// This is the "getting to know you" phase — automatic progression +/// as the player interacts with the FRIEND over time. +fn check_warmth_to_trust( + friend_arc: &FriendArc, + interaction_log: &InteractionLog, + time: &SimulationTime, +) -> bool { + let interactions_with_friend = interaction_log + .count_interactions(friend_arc.bonded_character, friend_arc.friend_entity); + let time_since_first = time.tick.saturating_sub( + interaction_log.first_interaction_tick( + friend_arc.bonded_character, friend_arc.friend_entity + ).unwrap_or(time.tick) + ); + + // Require both: enough interactions AND enough time. + // Prevents rushing through the arc by spam-talking. + interactions_with_friend >= 3 && time_since_first >= 600 // 1 game-hour +} +``` + +**Content required:** +- 5-8 dialogue lines for Warmth phase (casual, friendly, establishing rapport) +- 3-5 monologue lines for Warmth (positive: "Kael's reliable. Good to have someone you can count on.") +- Trust transition is silent — no dramatic moment. The player just notices the FRIEND is warmer + +**Server state change:** `FriendArc.phase = Trust`. No knowledge graph change. No visual change. The NPC's dialogue pool shifts to Trust-phase lines (gated by the `situation: [friend_trust]` tag). + +#### Phase 2: TRUST → DOUBT + +**Trigger:** Knowledge threshold — the player character learns specific facts that create tension. + +```rust +/// Transition from Trust to Doubt. +/// Requires the bonded character to accumulate suspicious knowledge. +/// NOT a single event — it's a gradual shift. +fn check_trust_to_doubt( + friend_arc: &FriendArc, + observer_kg: &KnowledgeGraph, +) -> bool { + // The character must know at least ONE of the doubt-triggering facts + // at KnowsOf or higher confidence. + let doubt_facts = &friend_arc.doubt_trigger_facts; + + doubt_facts.iter().any(|fact_id| { + observer_kg.fact_at_least(fact_id, KnowledgeConfidence::KnowsOf) + }) +} +``` + +**Content required for Kael (smuggler's FRIEND):** +- Doubt-triggering facts (defined in NPC profile): + - `"kael.schedule_inconsistency"` — Kael's routine doesn't fully match the posted schedule + - `"ring.internal_pressure"` — the smuggler learns the ring is under strain +- 5-8 dialogue lines for Trust phase (deeper, more personal, sharing more) +- 3-5 monologue lines for Doubt phase (questioning: "Kael left early again. Third time this rotation. Where does he go?") +- Tell acceleration: Kael's tells become more frequent in Doubt phase. The `tell_stage` counter advances, making tells more visible + +**Content required for Sera (detective's FRIEND):** +- Doubt-triggering facts: + - `"sera.avoidance_pattern"` — Sera consistently avoids Torek Lintar + - `"investigation.evidence_gap"` — evidence exists that should have been reported but wasn't +- Same line counts as Kael, detective-perspective + +**Server state change:** `FriendArc.phase = Doubt`. Tell stage advances (`tell_stage += 1`). Monologue pool shifts. No visual change yet — the entity color stays green (Friendly). The player should feel uneasy but not alarmed. + +#### Phase 3: DOUBT → CONFLICT + +**Trigger:** Direct observation of the contradiction. This is the critical moment — wow moment #3. + +```rust +/// Transition from Doubt to Conflict. +/// Requires DIRECT OBSERVATION of the contradiction. +/// This cannot be told to the player — they must SEE it. +fn check_doubt_to_conflict( + friend_arc: &FriendArc, + observer_kg: &KnowledgeGraph, +) -> bool { + // ALL contradiction facts must be known at KnowsDetails or higher. + // At least one must have source = DirectObservation. + let all_known = friend_arc.contradiction_facts.iter().all(|fact_id| { + observer_kg.fact_at_least(fact_id, KnowledgeConfidence::KnowsDetails) + }); + + // The discovery flag is set by the spatial staging system + // when the player observes the FRIEND in the wrong place. + all_known && friend_arc.contradiction_discovered +} +``` + +**How `contradiction_discovered` gets set — spatial staging:** + +This is the hardest part. The server must arrange for the FRIEND to be in a specific place at a specific time, and the player must be able to observe it. The simulation can't script this — it must create the opportunity and let the player find it. + +```rust +/// System: check if the bonded character observes the FRIEND +/// in a contradiction location during a contradiction window. +fn check_contradiction_observation( + friend_query: Query<(&FriendArc, &NpcRoutine, &TilePosition), With>, + observer_query: Query<(&KnowledgeGraph, &TilePosition), With>, + location_map: Res, + time: Res, + mut event_queue: ResMut, +) { + for (arc, routine, npc_pos) in friend_query.iter() { + if arc.phase != FriendPhase::Doubt { + continue; + } + + // Is the FRIEND currently at their contradiction location? + let at_contradiction = arc.contradiction_location.as_ref() + .map(|loc| location_map.contains_position(loc, npc_pos)) + .unwrap_or(false); + + // Is it the right time window? + let in_window = arc.contradiction_time_window.as_ref() + .map(|w| w.active_at(&time)) + .unwrap_or(true); // no time window = always active + + if !at_contradiction || !in_window { + continue; + } + + // Is the bonded character observing? + // (They must have LOS to the FRIEND's current position) + // The perception system handles LOS. We check if the bonded + // character has Direct confidence on the FRIEND. + for (obs_kg, _obs_pos) in observer_query.iter() { + if let Some(entry) = obs_kg.entity_knowledge(&arc.friend_stable_id) { + if entry.confidence == KnowledgeConfidence::Direct { + // The player character is looking at their FRIEND + // in the wrong place at the wrong time. + // This is wow moment #3. + + // Emit knowledge event for contradiction facts + // Emit monologue trigger (observe_npc with deviation) + // Set contradiction_discovered = true + } + } + } + } +} +``` + +**Content required for the contradiction moment:** +- **Kael:** Observed in Corridor B-7 (maintenance corridors) during shift transition, meeting unknown contact. The smuggler knows Kael has no reason to be there. + - Monologue line (urgent chime): "Kael? In Corridor B-7? During shift transition? He has no reason to be there. None that I know of." (`terminal_m_s_012` from Tyre's example) + - Knowledge grant: `"kael.secret_meetings": KnowsDetails` + - Knowledge grant: `"kael.restricted_corridor_visits": KnowsDetails` +- **Sera:** Observed avoiding Torek Lintar (turning away when he enters the bar). The detective recognizes the pattern. + - Monologue line (urgent chime): detective-equivalent — recognizing deliberate avoidance + - Knowledge grant: `"sera.avoidance_pattern": KnowsDetails` + +**Server state change:** `FriendArc.phase = Conflict`. `FriendArc.contradiction_discovered = true`. **RelationshipState shifts: Friendly → PersonOfInterest.** Entity color shifts green → amber (D-033, 0.5s fade). Tell stage maxes out. Dialogue pool shifts to Conflict-phase lines. + +This is the single most important moment in the vertical slice. State consistency requires: +1. Knowledge graph updated with contradiction facts +2. FriendArc phase advanced +3. RelationshipState changed +4. Monologue triggered (urgent) +5. Entity color change visible in next ObserverSnapshot + +All five must happen atomically within the same tick. I need to verify the tick order handles this correctly — knowledge event processing must complete before snapshot generation. + +#### Phase 4: CONFLICT (Terminal) + +**Trigger:** None — this is the final phase. The player is in Conflict with their FRIEND. + +**Content required:** +- 8-12 Conflict-phase dialogue lines (confrontation options, defensive NPC responses, the NPC's sympathetic motivation revealed) +- 5-8 Conflict-phase monologue lines (the character processing betrayal, re-evaluating past interactions) +- No clean resolution — D-034 mandates this. The conversation can happen, understanding can emerge, but the trust is broken + +**Server state:** `FriendArc.phase = Conflict`. RelationshipState stays PersonOfInterest (or shifts to Hostile if the confrontation goes badly). The arc is complete. + +### Revised FriendArc Component + +```rust +#[derive(Component, Debug, Clone, Serialize, Deserialize)] +pub struct FriendArc { + /// Which character this FRIEND is bonded to (StableId). + pub bonded_character: StableId, + /// StableId of this FRIEND NPC (for knowledge graph lookups). + pub friend_stable_id: StableId, + /// Current phase. + pub phase: FriendPhase, + + // --- Transition triggers --- + + /// Facts that trigger Doubt phase (any one sufficient). + pub doubt_trigger_facts: Vec, + /// Facts that constitute the full contradiction (all required for Conflict). + pub contradiction_facts: Vec, + /// Location where the contradiction occurs. + pub contradiction_location: Option, // canonical location ID + /// Time window for the contradiction (day phase + optional minute range). + pub contradiction_time_window: Option, + + // --- State tracking --- + + /// Tell visibility stage (0 = minimal, advances as phase progresses). + pub tell_stage: u8, + /// Has the bonded character directly observed the contradiction? + pub contradiction_discovered: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TimeWindow { + pub phase: DayPhase, + pub start_minute: Option, // within the phase + pub end_minute: Option, +} + +impl TimeWindow { + pub fn active_at(&self, time: &SimulationTime) -> bool { + if time.day_phase() != self.phase { + return false; + } + let tod = time.time_of_day_minutes(); + let phase_start = match self.phase { + DayPhase::Morning => 0, + DayPhase::Afternoon => 360, + DayPhase::Evening => 720, + DayPhase::Night => 1080, + }; + let start = phase_start + self.start_minute.unwrap_or(0); + let end = phase_start + self.end_minute.unwrap_or(360); + tod >= start && tod < end + } +} +``` + +### Content Summary — What I Need from Mellanie and Paula + +| FRIEND NPC | Phase | Lines Needed | Type | Blocker? | +|-----------|-------|-------------|------|----------| +| **Kael** | Warmth | 5-8 | dialogue (casual, friendly) | No — generic enough to synthesize | +| **Kael** | Warmth | 3-5 | monologue (positive, routine) | No | +| **Kael** | Trust | 5-8 | dialogue (personal, deeper) | Yes — needs character voice | +| **Kael** | Trust | 3-5 | monologue (warming, comfortable) | Yes | +| **Kael** | Doubt | 5-8 | dialogue (evasive, stressed) | Yes | +| **Kael** | Doubt | 3-5 | monologue (questioning, uneasy) | Yes | +| **Kael** | Conflict | 8-12 | dialogue (confrontation, revelation) | Yes — most critical | +| **Kael** | Conflict | 5-8 | monologue (processing, betrayal) | Yes | +| **Kael** | Contradiction | 1 | monologue (urgent, wow moment #3) | **CRITICAL** | +| **Sera** | (same counts) | ~35-46 | (same breakdown) | Same blockers | + +**Total per FRIEND NPC: ~35-46 authored lines minimum.** +**Total for both: ~70-92 lines.** + +This aligns with D-034's estimate of 70-100 per FRIEND. The breakdown by phase is what I need to test each transition independently. + +### Interaction Log Component + +I need a lightweight interaction tracking component to support the Warmth → Trust transition: + +```rust +/// Tracks interaction history between entities. +/// Used for FriendArc Warmth→Trust transition and future NOBODY promotion. +#[derive(Component, Debug, Clone, Serialize, Deserialize)] +pub struct InteractionLog { + /// (target_stable_id, tick) pairs. + /// BTreeMap for deterministic iteration. + pub interactions: BTreeMap>, +} + +impl InteractionLog { + pub fn new() -> Self { + Self { interactions: BTreeMap::new() } + } + + pub fn record(&mut self, target: StableId, tick: u64) { + self.interactions.entry(target).or_default().push(tick); + } + + pub fn count(&self, target: &StableId) -> usize { + self.interactions.get(target).map(|v| v.len()).unwrap_or(0) + } + + pub fn first_tick(&self, target: &StableId) -> Option { + self.interactions.get(target).and_then(|v| v.first().copied()) + } +} +``` + +This also becomes the foundation for NOBODY tier promotion in v0.2 — the same interaction counter that drives FriendArc Warmth→Trust will drive NOBODY→NOTICED. Building it now means zero rework later. + +--- + +## Summary of Round 2 Deliverables + +| Decision | Resolution | +|----------|-----------| +| **YAML format** | Accepted. `serde_yaml` replaces `ron` for content loading. RON converter in `tooling/` as low-priority insurance. | +| **Multi-action model** | Server computes ALL available actions per entity, ranked by priority. v0.1 client shows `actions[0]`. v0.2 client shows all. Zero server changes needed for v0.2. | +| **Pause system** | `SimSpeed` enum: Normal (1.0x), Overlay (0.5x), Paused (0.0x). Spacebar always toggles full pause. UI overlays trigger Overlay speed. Speed stack with priority resolution. | +| **FriendArc transitions** | 4-phase state machine with explicit triggers: Warmth (interaction count + time) → Trust (knowledge threshold) → Doubt (specific facts) → Conflict (direct observation of contradiction). Contradiction detection requires spatial staging system. | + +### Dependencies I'm Tracking + +1. **ObserverSnapshot v3** — Tyre needs to sign off on the protocol extension. I've proposed the full struct. Stig needs the `sim_speed` field and `nearby_interactions` / `active_dialogue` / `monologue` / `overheard` fields. +2. **FRIEND content packs** — Mellanie needs to produce phase-tagged dialogue and monologue lines per the breakdown above. These unblock integration testing of the FriendArc state machine. +3. **Contradiction spatial data** — Paula needs to specify the exact contradiction setup for Kael and Sera in the NPC profiles: which location, which time window, what the contradiction looks like when observed. +4. **FactId catalog** — Still the #1 blocker. I need the machine-readable fact vocabulary before I can build prerequisite evaluation. Gestalt and Paula produce this. diff --git a/docs/workshops/v01-content-scoping/round2-gestalt.md b/docs/workshops/v01-content-scoping/round2-gestalt.md new file mode 100644 index 000000000..05d4f2488 --- /dev/null +++ b/docs/workshops/v01-content-scoping/round2-gestalt.md @@ -0,0 +1,422 @@ +# Round 2 — Gestalt (Systems Design) + +*cracks knuckles* + +Four resolution tasks. Let me be honest about each. + +--- + +## Task 1: Canonical NPC Mapping (Definitive) + +The lead confirmed my mechanical mapping wins for v0.1. Paula's emotional/narrative reads become v0.2 annotations. But "winning" doesn't mean refusing to learn from the disagreements. I reviewed all 10 and changed my mind on 6 of them. + +### Changes from Round 1 (Where Paula Was Right) + +Let me be transparent about what I got wrong and why: + +| NPC | My R1 | Paula's R1 | Final R2 | Who Was Right | Why I Changed | +|-----|-------|-----------|----------|---------------|---------------| +| **Maret** (pattern) | SYSTEM | WITNESS | **WITNESS** | Paula | Maret's v0.1 function is defined by what she SAW, not her institutional role. The player (both characters) approaches Maret because she carries information. SYSTEM describes her job; WITNESS describes her story function. | +| **Maret** (motivation) | WITNESS | SKEPTIC | **SKEPTIC** | Paula | If pattern is WITNESS and motivation is WITNESS, there's no compositional tension. WITNESS+SKEPTIC = "she saw something AND she doubts" — the doubt makes her dangerous because she might ACT. Data-driven doubt IS skepticism. | +| **Resha** (motivation) | SKEPTIC | CIVILIAN | **CIVILIAN** | Paula | CATALYST+SKEPTIC implies deliberate questioning. CATALYST+CIVILIAN = "innocent disruption" — Resha doesn't INTEND to cause problems. The accidental quality makes the disruption more realistic and more dangerous (you can't negotiate with curiosity). | +| **Harek** (pattern) | GHOST | ANCHOR | **ANCHOR** | Paula | Harek is PHYSICALLY PRESENT. GHOST means absent power; Harek is at the bar playing cards. His leverage on Drin is indirect, but HE isn't absent. Paula's read: Harek embodies complacent contentment whose comfort accidentally creates a tool for others. The "unconscious lever" is more interesting than "invisible puppeteer." | +| **Drin** (pattern) | REMNANT | SYSTEM | **SYSTEM** | Paula | Paula nailed this: "The dock inspector IS the inspection system. His compromise means the system itself is corrupted." REMNANT requires historical depth a 40-year-old station doesn't have. Drin doesn't remember centuries of tradition — he remembers 5 years ago. That's not REMNANT-scale. SYSTEM+TURNCOAT = institutional rot. | +| **Sabel** (pattern) | THRESHOLD | GHOST | **GHOST** | Paula | Sabel is off-station with 1-2 brief visits. The player doesn't interact with Sabel enough for THRESHOLD mechanics (getting past a gatekeeper). The player learns about Sabel through others' references. That's GHOST — absent power shaping events through supply chain influence. | +| **Olin** (motivation) | SKEPTIC (dual) | CIVILIAN | **CIVILIAN** | Paula | Dropped dual designation. At Tier 3, Olin has 10-15 lines. Not enough content for SKEPTIC function. CIVILIAN is the safe tag — if Olin gets promoted to T2 in v0.2, the hidden motivation can be revealed. 1 pattern + 1 motivation per NPC, no exceptions. | + +### What I Kept (Where My Mechanical Read Holds) + +| NPC | Disagreement | My R1 | Final R2 | Why I'm Keeping It | +|-----|-------------|-------|----------|-------------------| +| **Voss** (motivation) | OPERATOR vs HANDLER | OPERATOR | **OPERATOR** | Voss RUNS the schedule. That's operating, not handling. HANDLER implies top-down pressure — Devra and Harek do that. Voss is middle management: competent, procedural, operating the machinery. The schedule IS his operation. | +| **Devra** (motivation) | HANDLER vs OPERATOR | HANDLER | **HANDLER** | Devra conveys Nils's strategy, manages external contacts, delivers escalation demands. That's pressure from above. She doesn't run day-to-day operations (Kael, Renn, Voss do). She manages the people who run things. | +| **Sess** (pattern) | ANCHOR vs NOBODY | ANCHOR | **ANCHOR** | NOBODY is deferred to v0.2. Tagging Sess as NOBODY means the tag does nothing in v0.1. ANCHOR at T3 = contentment as atmospheric texture. The bartender who sees everything and says nothing because his life is fine. v0.2 note: Sess could be retagged NOBODY if dynamic tier promotion activates. | + +### The Definitive v0.1 NPC Mapping + +| # | Name | Tier | Pattern | Motivation | Composition Read | +|---|------|------|---------|-----------|-----------------| +| 1 | **Kael Davan** | **T1** | **FRIEND** | **OPERATOR** | Trust anchor running ring cargo. Identity betrayal: "I was your friend AND your co-conspirator." | +| 2 | **Sera Venn** | **T1** | **FRIEND** | **WITNESS** | Trust anchor carrying unreported evidence. Concealment betrayal: "I was your friend AND I was hiding evidence." | +| 3 | **Naia Tamm** | **T1*** | **MIRROR** | **CIVILIAN** | Honest transparency, no secrets, uninvolved. "The one person not lying — surrounded by liars." | +| 4 | **Voss** | T2 | **SYSTEM** | **OPERATOR** | Institutional authority operating the schedule that enables smuggling. Corrupted machinery: "The system works — for the wrong people." | +| 5 | **Lera Sessik** | T2 | **ANCHOR** | **OPERATOR** | Contentment embodied, running a bar on willful ignorance. Profitable blindness: "Is this enough? Yes — if I don't look." | +| 6 | **Torek Lintar** | T2 | **CATALYST** | **CIVILIAN** | Spending disrupts equilibrium. Uninvolved, just living visibly. Accidental signal: "He doesn't know he's a liability." | +| 7 | **Devra** | T2 | **THRESHOLD** | **HANDLER** | Ring gatekeeper, manages operations from above. Obstacle with authority: "You go through her or you don't go." | +| 8 | **Maret Korr** | T2 | **WITNESS** | **SKEPTIC** | Accidentally observed discrepancies, doubts the numbers. Dangerous knowledge: "She saw something and she can't stop questioning it." | +| 9 | **Resha** | T2 | **CATALYST** | **CIVILIAN** | New hire forcing defensiveness with innocent questions. Accidental disruption: "She just asked. Everyone flinched." | +| 10 | **Drin** | **T2** | **SYSTEM** | **TURNCOAT** | Inspector whose compromise corrupts the institution. Loyalty shifting under coercion. Institutional rot: "The inspection system is broken because the inspector is broken." | +| 11 | **Renn** | T2 | **THRESHOLD** | **OPERATOR** | Courier controlling cargo flow. Physical gatekeeper: "Renn moves the product. Trace Renn, find the route." | +| 12 | **Pell** | T2 | **CATALYST** | **TURNCOAT** | Wavering member forcing potential crisis. Maximum instability: "When Pell breaks, everything moves." | +| 13 | **Harek** | T2 | **ANCHOR** | **HANDLER** | Complacent contentment whose comfort creates a tool. Unconscious lever: "Harek doesn't know his card games built a weapon." | +| 14 | **Sess** | T3 | **ANCHOR** | **CIVILIAN** | Quiet contentment behind the bar. Social wallpaper: "Sees everything, says nothing — because nothing's wrong with HIS life." | +| 15 | **Olin** | T3 | **CATALYST** | **CIVILIAN** | New arrival forcing evaluation. Ambiguous intent: "Friend or threat? The question IS the disruption." | +| 16 | **Sabel** | T3 | **GHOST** | **OPERATOR** | Off-station absent power running the supply chain. Distant machinery: "Sabel shapes events from elsewhere." | +| 17 | **Tav** | T3 | **SYSTEM** | **CIVILIAN** | Ring lookout following procedure. Lowest rung: "Tav watches the door. That's the whole job." | + +*Off-stage:* + +| NPC | Pattern | Motivation | Notes | +|-----|---------|-----------|-------| +| **Nils Davan** | **GHOST** | **HANDLER** | Absent authority applying pressure through intermediaries. | + +### Pattern Distribution (Final) + +| Pattern | Count | NPCs | Coverage | +|---------|-------|------|----------| +| FRIEND | 2 | Kael, Sera | Full (D-034 production level) | +| MIRROR | 1 | Naia Tamm | Full (T1 emotional depth) | +| ANCHOR | 3 | Lera, Harek, Sess | Full + sketch. Three versions of "is this enough?" | +| SYSTEM | 3 | Voss, Drin, Tav | Full + sketch. Institutional machinery (legit + criminal) | +| CATALYST | 3 | Torek, Resha, Pell | Full. Three disruption modes (accidental, innocent, deliberate) | +| THRESHOLD | 2 | Devra, Renn | Full. Access gatekeepers (organizational + physical) | +| WITNESS | 1 | Maret | Full. Data-driven information carrier | +| GHOST | 1+1 | Sabel (+Nils off-stage) | Light. Absent power through supply/authority | +| REMNANT | 0 | — | Correctly absent. 40-year station lacks historical depth. | +| NOBODY | 0 | — | Deferred to v0.2. Data ships (hidden fields in content). | + +8 of 9 patterns present. All 6 motivations present. + +### Motivation Distribution (Final) + +| Motivation | Count | NPCs | +|-----------|-------|------| +| OPERATOR | 5 | Kael, Voss, Lera, Renn, Sabel | +| CIVILIAN | 6 | Naia Tamm, Torek, Resha, Olin, Sess, Tav | +| HANDLER | 2+1 | Devra, Harek (+Nils off-stage) | +| WITNESS | 1 | Sera | +| TURNCOAT | 2 | Drin, Pell | +| SKEPTIC | 1 | Maret | + +CIVILIAN at 6/17 (35%) — matches D-029's noise floor requirement (~30% flat). OPERATOR at 5 reflects a logistics hub where everyone is RUNNING something. All 6 motivations represented. + +### Why This Mapping Creates Interesting Decisions + +**ANCHOR saturation (3):** Three different answers to "is this enough?" Lera: "Yes, if I don't look." Harek: "Yes, absolutely — pass me the cards." Sess: "Yes, and I'd rather you didn't disturb it." This isn't redundancy — it's the thematic floor the investigation disrupts. The player walks through contentment before contamination touches it. + +**SYSTEM × TURNCOAT (Drin):** The most mechanically productive composition in the set. The institution IS the character AND the character is betraying the institution. For the detective: crack the inspector, crack the system. For the smuggler: keep the inspector quiet, keep the system working for you. Same NPC, inverted interactions. That's the dual-lens proof. + +**CATALYST diversity (3 types):** Torek disrupts through SPENDING (accidental, financial signal). Resha disrupts through ASKING (innocent, social signal). Pell disrupts through WAVERING (deliberate, operational signal). Three types of disruption, three types of player assessment. The smuggler reads them as threats with different urgency levels. The detective reads them as leads with different reliability levels. + +--- + +## Task 2: Generic Key Architecture (The Bloat Question) + +The lead asks: *"If the original EntityKnowledge set was incomplete for the smuggler, are we doing this again for the administrator or the corporate tycoon?"* + +The answer is **no — if we design the keys correctly now.** + +### The Problem with Per-Archetype Keys + +My Round 1 proposal: 4 smuggler-specific keys (`exposure_risk`, `loyalty_assessment`, `cover_integrity`, `moral_weight`). If we repeat this for 8 archetypes: + +``` +8 archetypes × 4 unique keys = 32 archetype-specific keys ++ 14 shared keys += 46 total keys (unsustainable) +``` + +Administrator needs `bureaucratic_leverage`, `regulatory_compliance`... +Merchant needs `market_position`, `asset_vulnerability`... +Every archetype spawns its own vocabulary. That's schema bloat AND content bloat (every NPC profile must have 46 fields). + +### The Solution: 4 Generic Perspective Keys + +Look at what my 4 smuggler keys actually represent at the ABSTRACT level: + +| Smuggler Key | Abstract Question | +|-------------|-------------------| +| `exposure_risk` | "How does this NPC threaten MY operational position?" | +| `loyalty_assessment` | "How reliably will this NPC act in MY interest?" | +| `cover_integrity` | "How well is the relevant deception holding?" | +| `moral_weight` | "How morally culpable is this NPC in MY judgment?" | + +These questions are UNIVERSAL. Every archetype asks them — just with different words: + +| Abstract Question | Smuggler | Detective | Administrator | Merchant | +|------------------|----------|-----------|--------------|----------| +| "How does this NPC threaten my position?" | "Will they expose the ring?" | "Will they obstruct my investigation?" | "Will they expose my corruption?" | "Will they undercut my deal?" | +| "How reliably will this NPC serve my interests?" | "Can I count on them in operations?" | "Will they testify/cooperate?" | "Will they vote with me?" | "Will they honor the contract?" | +| "How well is the deception holding?" | "Is their cover solid?" | "Is my informant still believable?" | "Does the public still buy it?" | "Does the competitor still trust me?" | +| "How culpable is this NPC?" | "How deep in the ring?" | "How guilty?" | "How corrupt?" | "How honest?" | + +**Same 4 questions. Same 4 keys. 8 archetypes.** + +### Proposed Generic Keys + +| Key Name | Value Enum | What It Stores | +|----------|-----------|---------------| +| `threat_to_position` | `"none"`, `"low"`, `"moderate"`, `"high"`, `"critical"` | Observer's assessment of how this NPC threatens the observer's operational security, institutional standing, or strategic position. | +| `reliability` | `"solid"`, `"dependable"`, `"uncertain"`, `"wavering"`, `"hostile"` | Observer's assessment of how predictably this NPC will serve the observer's interests. | +| `facade_status` | `"solid"`, `"thin"`, `"cracking"`, `"blown"`, `"N/A"` | Status of any active deception involving this NPC (their cover, the observer's cover, a shared front). N/A if no deception in play. | +| `moral_standing` | `"innocent"`, `"peripheral"`, `"complicit"`, `"compromised"`, `"willing"` | Observer's subjective moral assessment of this NPC within the observer's ethical framework. | + +### How Interpretation Works + +The key stores GENERIC data. The monologue system provides CHARACTER-SPECIFIC interpretation through D-032's hard partition (separate pools per character). + +**Same NPC, same keys, different character pools:** + +```yaml +# Smuggler monologue about Maret +- id: hub_m_031 + text: "Maret's been checking manifests again. She's going to notice something she can't un-notice." + character: smuggler + trigger: observe_npc + prerequisite: + target.known_attributes.threat_to_position: "high" + target.known_attributes.name: "Maret Korr" + +# Detective monologue about Maret +- id: hub_m_032 + text: "Korr looks worried. She processes manifests — if the numbers are off, she'd know." + character: detective + trigger: observe_npc + prerequisite: + target.known_attributes.threat_to_position: "high" + target.known_attributes.name: "Maret Korr" +``` + +Same key (`threat_to_position: "high"`), same NPC — but the smuggler reads it as "she's a risk to the operation" while the detective reads it as "she's a potential witness at risk." The interpretation lives in the monologue text, not in the key schema. + +### Why This Scales to 8 Archetypes Without Bloat + +| Archetype | threat_to_position means... | reliability means... | facade_status means... | moral_standing means... | +|-----------|---------------------------|---------------------|----------------------|------------------------| +| Smuggler | Exposure risk to the ring | Operational loyalty | Cover integrity | Innocent vs. complicit | +| Detective | Obstruction to investigation | Cooperation likelihood | Informant/cover status | Guilt level | +| Administrator | Political liability | Voting alignment | Public image coherence | Corruption level | +| Merchant | Competitive threat | Contract reliability | Deal integrity | Business ethics | +| Newcomer | Social danger | Friendliness | Acceptance facade | Community trustworthiness | +| Operator | Operations disruption | Team dependability | Mission cover | Professional ethics | +| Exile | Personal danger | Alliance reliability | Identity concealment | Threat vs. ally | +| Fixer | Client risk | Job reliability | Operation facade | How dirty | + +**Total EntityKnowledge keys: 18.** 14 shared + 4 generic perspective. Works for all 8 archetypes. No additional keys needed at v1.0. + +### Value Enum Design + +The enums are deliberately archetype-neutral: + +- `"solid"` / `"dependable"` / `"uncertain"` / `"wavering"` / `"hostile"` — these words work in ANY context. A smuggler reads "wavering" as "might turn on us." A detective reads "wavering" as "might cooperate if pressured." Same word, different operational meaning. + +- `"innocent"` / `"peripheral"` / `"complicit"` / `"compromised"` / `"willing"` — these work for any moral framework. A smuggler uses them to track guilt distance from the ring. An administrator uses them to track corruption distance from a scandal. The progression is the same. + +### How Content Authors Use This + +NPC profiles get a SINGLE set of character-perspective attributes, not per-archetype sections: + +```yaml +# In kael-davan.yaml, perspective section +perspectives: + smuggler: + threat_to_position: "low" # Kael is reliable (pre-contradiction) + reliability: "solid" # Trusted colleague + facade_status: "solid" # Cover holds (pre-contradiction) + moral_standing: "willing" # Fully committed ring member + detective: + threat_to_position: "moderate" # Kael handles cargo on suspicious shifts + reliability: "uncertain" # Unknown cooperativeness + facade_status: "solid" # Appears to be a normal dock worker + moral_standing: "complicit" # Connected to discrepancies (if known) +``` + +Content authors populate perspective values per character in the NPC YAML. The server loads these as initial `known_attributes` values for each character's knowledge graph. Values update through gameplay (Kael's `facade_status` shifts from `"solid"` to `"cracking"` when tells accumulate). + +### Addressing Paula's 8-Key Proposal + +Paula proposed all 8 smuggler attributes as new keys. My generic architecture maps her proposal: + +| Paula's Key | Maps To | Notes | +|-------------|---------|-------| +| `trust_read` | `trust_level` (existing) | Same key, context-dependent interpretation. Already works. | +| `exposure_risk` | `threat_to_position` (generic) | Renamed for archetype-neutrality. | +| `loyalty_assessment` | `reliability` (generic) | Renamed. | +| `leverage_held` | `secret_held` (existing) | Leverage IS secret knowledge. Same storage. | +| `social_debt` | Deferred to v0.2 | 30-minute session doesn't develop favor economy. | +| `moral_weight` | `moral_standing` (generic) | Renamed. | +| `cover_integrity` | `facade_status` (generic) | Renamed. | +| `loyalty_conflict` | Deferred to v0.2 | Inferable from `behavior_flags` + `reliability`. | + +**Result:** 2 existing keys reused + 4 generic keys created + 2 deferred. Total schema: 18 keys. Works for 8 archetypes. + +--- + +## Task 3: Self-Contained Triangle Forks (Confirmed) + +**I agree with Tyre's recommendation: self-contained forks for v0.1, no cross-triangle cascade.** + +But "self-contained" needs a precise definition, because there's a trap: + +### The Shared-NPC Problem + +Voss appears in BOTH Triangle 1 (Hub Power) and Triangle 2 (Worried Knowledge). If the smuggler escalates in Triangle 1, Voss gets more anxious. That anxiety is part of Voss's ENTITY STATE — it's stored in `behavior_flags`, `routine_pattern`, etc. If Triangle 2's fork reads Voss's entity state, then Triangle 1's decision HAS cascaded into Triangle 2. + +Is that a cross-triangle cascade? Technically yes. Should we prevent it? **No — that would require NPCs to have separate states per triangle, which is absurd.** + +### What "Self-Contained" Actually Means + +**Self-contained forks = independent decision state machines, shared NPC state.** + +| Allowed (v0.1) | Not Allowed (v0.2+) | +|----------------|---------------------| +| Each triangle has its own fork with its own trigger, decision, and outcome | Triangle 1's OUTCOME directly gates Triangle 2's FORK (if T1 escalates, T2 fork changes) | +| NPCs carry behavioral state across triangles (Voss's anxiety is visible everywhere) | Triangle forks modify other triangles' state machines (T1 pushes T2 from state A to state B) | +| Players OBSERVE cross-triangle effects through NPC behavior | Fork resolution in one triangle REQUIRES resolution of another | +| Monologue can reference NPC state from any source | The storyteller sequences forks based on other forks' outcomes | + +**In implementation:** + +``` +Triangle 1 Fork: + trigger: Devra delivers Nils's escalation demand + decision: smuggler chooses escalate/stabilize/mediate + outcome: modifies Voss.behavior_flags, Kael.behavior_flags + DOES NOT: modify Triangle 2's fork state + +Triangle 2 Fork: + trigger: detective notices Maret's manifest re-checking pattern + decision: detective approaches Maret or pressures Drin + outcome: modifies Maret.trust_level, Drin.cover_integrity + DOES NOT: depend on Triangle 1's resolution + +Shared state visible to both: + Voss.behavior_flags may contain "nervous" from T1 AND "overworked" from T2 + The player sees ALL of Voss's behavioral state regardless of which triangle produced it + Cross-triangle OBSERVATION is emergent — it's systems interacting, not scripted cascade +``` + +**Why this is right for v0.1:** + +1. **Testing scope**: Self-contained forks can be tested independently. Each triangle fork is a unit test. Cross-triangle cascade requires integration tests across all 5 triangles. + +2. **Content scope**: Each fork needs its own decision content (dialogue, monologue, consequences). 3 active forks × 3 choices each = 9 content branches. Adding cascade dependencies multiplies this combinatorially. + +3. **The emergent observation IS the payoff**: The player noticing that Voss is anxious in BOTH the hub (Triangle 1) and during manifest processing (Triangle 2) is an emergent connection. They're doing investigation — connecting dots across contexts. That's MORE interesting than scripted cascade, and it comes for free from shared NPC state. + +4. **v0.2 cascade path**: If we want Triangle 1's escalation to gate Triangle 2's timing in v0.2, the architecture supports it. The fork state machines are independent now; adding dependencies later is an additive change, not a rewrite. + +### Triangle Fork Summary (Final) + +| Triangle | Fork Type | Decision | Self-Contained? | +|----------|-----------|----------|-----------------| +| T1: Hub Power | **Active** | Smuggler: escalate/stabilize/mediate | YES — modifies Voss+Kael state, no T2 gate | +| T2: Worried Knowledge | **Active** | Detective: approach Maret / pressure Drin / wait | YES — modifies Maret+Drin state, no T1 gate | +| T3: Bar Tensions | **Passive** | No fork — ambiguity is permanent | N/A | +| T4: Worried Partner | **Active** | Both PCs: FRIEND contradiction paths A/B/C | YES — modifies Kael/Sera state, no other triangle gate | +| T5: Informant Question | **Passive** | No fork — tension observable, resolution post-session | N/A | + +--- + +## Task 4: Knowledge Panel Pause — Sim Speed Architecture + +**Lead decision: 50% sim speed when panel is open. Spacebar always pauses from anywhere.** + +### Why 50% Is Correct (Not 10%, Not Full Pause) + +Stig proposed 10%. Lead overruled to 50%. Here's the mechanical reasoning: + +| Speed | Effect | Problem | +|-------|--------|---------| +| 100% (no slow) | World runs at full speed while you read the knowledge panel | NPCs walk away while you're cross-referencing. Punishes information gathering. | +| 50% (lead's choice) | World runs at half speed | You can SEE NPCs moving slowly while you think. Creates tension: "Do I keep reading or close and follow?" That's an INTERESTING DECISION. | +| 10% (Stig's proposal) | World barely moves | No tension. Functionally equivalent to pause. If you're going to pause, just pause. 10% is a nothing-state. | +| 0% (full pause) | World stops | No tension. The knowledge panel becomes a reference tool, not a strategic moment. Removes the feeling of time pressure that makes investigation feel real. | + +**50% creates a micro-decision every time you open the panel:** "Is the information worth the time?" That's asymmetric information AS MECHANIC — even the player's attention is a scarce resource. + +### Sim Speed State Machine + +Two independent toggles, multiplicative: + +``` +effective_speed = if pause_override { 0.0 } else { base_speed × ui_modifier } +``` + +| Toggle | Controls | Values | +|--------|----------|--------| +| `ui_modifier` | Whether a UI overlay is open | `1.0` (no overlay) or `0.5` (knowledge panel open) | +| `pause_override` | Spacebar | `false` (not paused) or `true` (paused) | + +**State combinations:** + +| State | ui_modifier | pause_override | Effective Speed | Player Experience | +|-------|------------|---------------|----------------|-------------------| +| Normal play | 1.0 | false | **100%** | Full speed. NPCs move, routines advance. | +| Panel open | 0.5 | false | **50%** | Slow motion. NPCs drift. Time passes. Tension. | +| Paused (from normal) | 1.0 | true | **0%** | Full stop. World frozen. Read, think, plan. | +| Paused (from panel) | 0.5 | true | **0%** | Full stop. Panel still visible. No time pressure. | + +**Key behaviors:** +- **Spacebar always pauses.** From any state. No exceptions. This is accessibility AND good design. +- **Spacebar resumes to previous state.** If you paused from panel-open (50%), unpausing returns to 50%, not 100%. If you paused from normal play, unpausing returns to 100%. +- **Tab toggles panel.** Opening panel sets `ui_modifier = 0.5`. Closing panel sets `ui_modifier = 1.0`. Independent of pause state. +- **Dialogue: also 50%.** When dialogue is active (Talk interaction), the same `ui_modifier = 0.5` applies. NPCs who aren't in the conversation continue moving at half speed. This means other events can happen WHILE you're talking — the world doesn't freeze for your conversation. That's immersive sim design. + +### v0.2 Extension + +The multiplicative model is composable. Future UI states can define their own modifiers: + +| UI State | Modifier | Combined | +|----------|----------|----------| +| Knowledge panel | 0.5 | 0.5 | +| Dialogue | 0.5 | 0.5 | +| Panel + Dialogue? | 0.5 × 0.5 = 0.25 | 25% (both open simultaneously) | +| Cutscene | 0.0 | Full freeze (storyteller controls) | + +For v0.1, only panel and dialogue use 0.5. The system supports future states without redesign. + +### Implementation Note for Dudley + +The server tick rate doesn't change. The CLIENT requests a sim speed modifier. The server processes ticks at variable intervals: + +- Normal: 1 tick per 50ms (20 ticks/sec) +- 50%: 1 tick per 100ms (10 ticks/sec) +- Paused: 0 ticks (server queues but doesn't process) + +The server's tick processing is deterministic regardless of interval. Changing the interval changes PACING, not LOGIC. All systems (NPC routines, monologue triggers, tell accumulation) operate on tick count, not wall-clock time. A 50% slowdown means the same events happen — they just take twice as long in wall-clock time. + +--- + +## Cross-Reference: Addressing Tracking Doc Items + +A few items from Qatux's tracking that directly involve my assignments: + +### A-17: Self-contained triangle forks +**Confirmed.** See Task 3. Independent decision state machines, shared NPC state. Tyre was right. + +### D-04: Examine vs Talk +**Lead decided: conceptually separate, v0.1 ships single action.** I accept this. My 7-interaction model stands as the DESIGN TARGET. v0.1 implements it as context-sensitive single action (server knows about multiple actions per entity, client surfaces the best one). v0.2 adds multi-verb UI. The architecture must support both — that's Tyre and Dudley's task. + +### D-05: Knowledge Panel Pause +**Resolved.** See Task 4. 50% sim speed, spacebar override to full pause. Multiplicative model. + +### A-10: Dialogue files by location + role +**I validate this.** It aligns with D-035 (role-based, not NPC-based line assignment) and the generator model (templates define roles, NPCs fill roles). The file organization should be: +``` +districts/sova-transit/dialogue/ + hub-dock-worker.yaml # Role: dock worker, Location: hub + hub-supervisor.yaml # Role: supervisor, Location: hub + bar-owner.yaml # Role: bar owner, Location: bar + bar-regular.yaml # Role: bar regular, Location: bar + ... +``` +NPCs are assigned to roles at content load time. A line tagged `role: dock_worker` + `access: insider` fires for Kael (if smuggler has insider access to Kael) regardless of which NPC fills the dock_worker role. This is generator-compatible. + +--- + +## Summary of Changes from Round 1 + +| Item | Round 1 | Round 2 | Change Reason | +|------|---------|---------|---------------| +| Maret pattern | SYSTEM | **WITNESS** | Story function > job description | +| Maret motivation | WITNESS | **SKEPTIC** | Compositional tension (WITNESS+SKEPTIC > WITNESS+WITNESS) | +| Resha motivation | SKEPTIC | **CIVILIAN** | Innocent disruption > deliberate questioning | +| Harek pattern | GHOST | **ANCHOR** | Present contentment > absent power | +| Drin pattern | REMNANT | **SYSTEM** | Institutional role > nostalgia (station too young for REMNANT) | +| Sabel pattern | THRESHOLD | **GHOST** | Absent influence > present gatekeeper | +| Olin motivation | SKEPTIC (dual) | **CIVILIAN** | Dropped dual designation. 1 per NPC. | +| Smuggler keys | 4 smuggler-specific | **4 generic perspective** | `threat_to_position`, `reliability`, `facade_status`, `moral_standing` — works for all 8 archetypes | +| EntityKnowledge total | 18 (14+4) | **18 (14+4)** | Same count, generic names | +| Triangle forks | Self-contained (tentative) | **Self-contained (confirmed)** | Independent state machines, shared NPC state | +| Panel pause | Not addressed | **50% sim speed, spacebar override** | Multiplicative toggle model | diff --git a/docs/workshops/v01-content-scoping/round2-mellanie.md b/docs/workshops/v01-content-scoping/round2-mellanie.md new file mode 100644 index 000000000..f1a16836f --- /dev/null +++ b/docs/workshops/v01-content-scoping/round2-mellanie.md @@ -0,0 +1,461 @@ +# Round 2 — Mellanie (Copywriter) + +## v0.1 Content Scoping Workshop + +--- + +## Task 1: Canonical PC Voice Registers + +These are authoring specs, not narrative documents. Every monologue line I write gets checked against these parameters. If a line doesn't match the register, it gets cut. + +--- + +### Smuggler — Internal Voice Register + +**One-line summary:** Watches people, not systems. Thinks in fragments. Worries about friends the way a dock worker worries — practically, physically, with the knot in the stomach, not the word for it. + +#### Voice Parameters + +| Parameter | Value | Example | +|---|---|---| +| **Sentence length** | Short. Fragments welcome. Rarely more than 2 sentences per monologue fire. | "Kael's here. Good." | +| **Vocabulary** | Concrete, physical, sensory. Uses trade jargon (containers, manifests, shifts, routes) without explaining it. No institutional language. | "Recycled air and cargo lubricant." Not: "Standard atmospheric recycling." | +| **Emotional register** | Feeling-first, analysis second. Names the gut before the brain catches up. | "Starting to worry" before "something's off." | +| **Relationship mode** | First-name basis with everyone. Thinks relationally — people are defined by connection, not role. | "Kael" not "Davan." "Voss is tense" not "the shift supervisor seems agitated." | +| **Observation priority** | People > environment > objects. Notices body language before noticing cargo. | "Kael keeps checking his lattice" before "Container 4471 is still in temp." | +| **Operational thinking** | Present when thinking about the job. Time-aware, route-aware, schedule-aware. But always filtered through "is this safe for my people?" | "Transition window opens in fifty minutes. After that, twenty minutes of reduced oversight." | +| **Self-reference** | Rare. The smuggler thinks about others, not herself. When self-reference occurs, it's through physical sensation. | "My stomach dropped" not "I feel betrayed." | +| **Humor** | Dry, situational, understated. Dark when stressed. Never witty — that's a different register. | "Home sweet home" about a cargo bay. | +| **What she doesn't do** | Doesn't analyze systems. Doesn't use institutional vocabulary. Doesn't explain things to herself that she already knows. Doesn't monologue in paragraphs. | + +#### Voice Anchors (Reference Lines) + +These 5 lines define the boundaries. Every smuggler monologue line should feel like it could sit next to these without register collision. + +1. **Baseline warm:** *"Kael's already at the dock. Good. The day's better when he's on shift."* + — Short. Personal. Physical presence matters. + +2. **Operational:** *"Shift transition in thirty minutes. If Voss kept the schedule thin, the route's clear."* + — Time-specific. Practical. Other people's actions determine safety. + +3. **Concerned:** *"Kael keeps checking his lattice. Waiting for a message? Not like him to be jumpy."* + — Observation leads to interpretation. Interpretation is relational ("not like him"), not clinical. + +4. **Hurt:** *"He looked left. He always looks left when he's making something up. Two years I've known that tell. Kael is lying to me."* + — Personal history weaponized. The "two years" is the knife. Ends with a flat declaration, not a question. + +5. **Atmospheric:** *"Morning shift. Recycled air and cargo lubricant. Home sweet home."* + — Three fragments. Sensory detail. Irony through understatement. + +#### Anti-Patterns (What the Smuggler Does NOT Sound Like) + +- "I should investigate this anomaly further." (Too clinical. She'd think: "That's not right.") +- "The scheduling irregularity suggests systemic manipulation." (Institutional vocabulary. She'd think: "Voss changed the rotation again.") +- "I need to consider the implications of Kael's behavior for our operational security." (Analytical distance. She'd think: "What the hell is Kael doing?") +- "According to the manifest, container 4471 should weigh 240 kilograms." (Explaining what she already knows. She'd think: "4471's heavy. Too heavy.") + +--- + +### Detective — Internal Voice Register + +**One-line summary:** Categorizes first, feels second. Thinks in complete sentences. The institutional training runs in the background like an operating system — it never turns off, but sometimes the human overrides it. + +#### Voice Parameters + +| Parameter | Value | Example | +|---|---|---| +| **Sentence length** | Complete sentences, but not long ones. More structured than the smuggler. Occasional fragments for emphasis or snap judgments. | "Standard prefab, heavy foot traffic. Let's see what the shift change tells me." | +| **Vocabulary** | Institutional layer over plain speech. Professional terms leak in: "case file," "filing it," "noted," "flagged." Not technical jargon — investigative habit. | "Dock worker. Davan, K. Unremarkable on paper." The surname-comma-initial is institutional reflex. | +| **Emotional register** | Analysis-first, personal second. When personal breaks through, it's notable — a crack in the professional surface that signals emotional weight. | "She's not lying. But she's not telling me everything. Sera, what do you know?" — The first-name appeal at the end IS the emotion. | +| **Relationship mode** | Surname-first for targets and unknowns. First-name for allies and people he trusts. The shift from surname to first-name (or back) IS a relationship marker. | "Davan, K." early → "Kael" never (smuggler's FRIEND, not detective's). "Sera" always (detective's FRIEND). | +| **Observation priority** | Patterns > people > environment. Notices deviations from expected behavior before noticing the person. | "That's twice now" before "Sera leaves." The count matters more than the actor. | +| **Analytical thinking** | Automatic. Counts things, tracks frequencies, flags inconsistencies. Self-directs: "filing it," "noted," "coincidence?" These are internal bookkeeping prompts. | "Three times. Three excuses. That's data." | +| **Self-reference** | More common than the smuggler, but always through the professional lens. The detective monitors his own state as evidence. | "I'm reading too much into this" — self-aware about analytical bias. | +| **Humor** | Wry, observational. Appreciates irony at a distance. Can laugh at himself. Never cruel. | "Only place in this district that doesn't smell like freight lubricant." | +| **What he doesn't do** | Doesn't think in fragments (that's the smuggler). Doesn't use trade jargon he hasn't learned. Doesn't name-drop relationships he doesn't have. Doesn't express vulnerability directly — it leaks, he doesn't pour. | + +#### Voice Anchors (Reference Lines) + +1. **Clinical baseline:** *"Logistics hub. Standard prefab, heavy foot traffic. Let's see what the shift change tells me."* + — Categorize. Evaluate. Self-direct. Three operations in three sentences. + +2. **Pattern recognition:** *"That's the third time. Sera leaves when Torek arrives. Three different excuses, same result. That's not coincidence."* + — Counting is automatic. Conclusion is flat and declarative. No hedging. + +3. **Personal leak:** *"Good to see Sera. She always was the reliable one. At least someone in this district speaks my language."* + — First-name. Past tense ("always was") implies shared history. "My language" is institutional belonging. + +4. **Conflicted:** *"Same booth. Same warm smile. Same offer to buy me a drink. ...Everything except whatever she's not saying."* + — Repetition builds the pattern. The ellipsis is the human catching up to the analyst. The final clause is the knife. + +5. **Atmospheric:** *"Grain spirit and low conversation. Only place in this district that doesn't smell like freight lubricant."* + — Sensory but evaluative. The detective doesn't just notice smells — he catalogs them as data points. + +#### Anti-Patterns (What the Detective Does NOT Sound Like) + +- "Kael's here. Good." (Too terse. That's the smuggler. The detective would think: "Davan's on shift. Standard.") +- "I feel uneasy about Sera's behavior." (Direct emotional vocabulary. He'd think: "Something's off with Sera. Can't place it yet.") +- "This container has been tampered with, indicating smuggling activity." (Explaining the obvious. He'd think: "Weight's wrong. Noted.") +- "My heart sank when I saw the evidence." (Physical emotion — that's the smuggler's register. The detective: "Didn't want to see that. But there it is.") + +--- + +### Voice Register Comparison — Same Observation, Two Characters + +**Trigger: Seeing a container in temp storage overnight.** + +- **Smuggler:** *"That container's been in temp since yesterday. Someone forgot to process it, or someone's stalling."* + — Concrete. Two explanations, both practical. No judgment yet. + +- **Detective:** *"Container in overnight temp. Unusual for a hub this size — turnaround is normally sub-eight hours. Flag it."* + — Categorical. Quantified deviation. Self-directed action. + +**Trigger: Entering the bar.** + +- **Smuggler:** *"Lera's. Grain spirit and noise. Could use both right now."* + — Informal name. Sensory. Personal need. + +- **Detective:** *"The Last Shift. Same crowd as yesterday. Let's see who's NOT here tonight."* + — Official name. Pattern comparison. Investigative frame. + +**Trigger: Noticing Naia Tamm is upset.** + +- **Smuggler:** *"Naia looks rough today. Should check on her later."* + — First-name. Immediate concern. Plans to act. + +- **Detective:** *"Tamm seems distressed. Not her baseline. Something at home, or something she's heard?"* + — Surname. Clinical assessment. Hypothesizes cause. + +**Trigger: Hearing raised voices behind a door.** + +- **Smuggler:** *"Raised voices from the back room. Devra's in there. That's not a brokering call."* + — Identifies the person. Interprets through operational knowledge. + +- **Detective:** *"Arguing behind that door. The bartender didn't flinch. Either she's used to it or she knows what it is."* + — Notes the non-reaction. Third-party behavior is data. + +--- + +### Display Constraints (per Stig's R1 proposal) + +Adopting Stig's parameters as authoring constraints: + +| Constraint | Value | Implication for Writing | +|---|---|---| +| Max length | ~160 characters | Hard ceiling. Most lines should be 80-120. | +| Max visual lines | 2 | No three-line monologue. If it wraps to 3, cut it. | +| Display time | 4-6 seconds (length-adjusted) | Player reads at ~250 WPM = ~20-25 words in 5 seconds. Target: 15-25 words per line. | +| Fade behavior | Fade in/out | No abrupt text pops. Lines must read cleanly mid-fade. | +| Character tint | Smuggler: amber-white `#f0e0c8`, Detective: blue-white `#c8d8f0` | Voice must be distinguishable WITHOUT color — color confirms, doesn't create. | + +**The 25-word rule:** If a monologue line exceeds 25 words, it better be the most important line in the pool. Most lines should be 10-18 words. The authoring guide examples average 14 words. That's the target. + +--- + +## Task 2: THE FRIEND Content Pack — Kael Davan (Structure) + +### What's In the Pack + +The Kael Davan content pack is a single deliverable containing everything the engine needs to run THE FRIEND arc for the smuggler's path. It's also the benchmark — if this pack validates against the tag taxonomy, loads correctly, triggers appropriately, and sounds right, every subsequent content pack follows the same structure. + +### Pack Contents + +``` +content/ + districts/ + sova-transit/ + terminal/ + dialogue.yaml # Kael's dialogue lines at The Terminal (shared pool) + monologue-smuggler.yaml # Smuggler monologue at Terminal (includes Kael observations) + monologue-detective.yaml # Detective monologue at Terminal (includes Kael observations) + bar/ + dialogue.yaml # Kael's dialogue lines at The Last Shift + monologue-smuggler.yaml + monologue-detective.yaml + corridor/ + dialogue.yaml # Kael's dialogue lines in Corridor B-7 + monologue-smuggler.yaml + monologue-detective.yaml +``` + +**Note:** Kael's content lives inside location files, not a per-NPC file. Per D-035 and Tyre's directory design, dialogue is organized by location. Kael's lines appear in `terminal/dialogue.yaml` alongside other NPCs who speak at the Terminal. The `role: dock_worker` tag identifies which lines belong to Kael's template role. + +The pack is authored as a single document, then split into location files during content conversion. For authoring purposes, I'll write it as one file with location headers and deliver the split files. + +### Line Budget (Kael Davan) + +| Content Type | Lines | Location Split | +|---|---|---| +| **Kael dialogue** | | | +| Greetings (5 access tiers) | 5 | Terminal: 3, Bar: 2 | +| Shift/work talk (insider, peer) | 8 | Terminal: 6, Bar: 2 | +| Bar casual (peer) | 4 | Bar: 4 | +| Ring coordination (insider) | 6 | Terminal: 3, Corridor: 3 | +| Deflection/evasion (post-contradiction) | 6 | Terminal: 3, Bar: 2, Corridor: 1 | +| Confrontation responses | 4 | Terminal: 1, Bar: 1, Corridor: 2 | +| Hael references (casual, unprompted) | 3 | Terminal: 1, Bar: 2 | +| **Dialogue subtotal** | **36** | | +| | | | +| **Smuggler monologue about Kael** | | | +| Phase 1 — Comfort (warmth, baseline) | 4 | Terminal: 2, Bar: 2 | +| Phase 2 — First Crack (concern, tells) | 4 | Terminal: 3, Bar: 1 | +| Phase 3 — Contradiction (alarm, shock) | 3 | Corridor: 2, Terminal: 1 | +| Phase 4 — Confrontation aftermath (hurt, conflict) | 3 | Terminal: 1, Bar: 1, Corridor: 1 | +| Phase 5 — Contaminated trust (doubt over warmth) | 4 | Terminal: 2, Bar: 1, Corridor: 1 | +| **Smuggler monologue subtotal** | **18** | | +| | | | +| **Detective monologue about Kael** | | | +| Identification / first observation | 2 | Terminal: 2 | +| Behavioral observation (tells noted) | 3 | Terminal: 2, Bar: 1 | +| Suspicion / analytical escalation | 3 | Terminal: 2, Corridor: 1 | +| Informant potential assessment | 2 | Terminal: 1, Bar: 1 | +| **Detective monologue subtotal** | **10** | | +| | | | +| **Tell observation lines** | | | +| Lattice checking (first + repeat) | 2 | Terminal: 2 | +| Shortened interactions / evasive | 2 | Terminal: 1, Bar: 1 | +| Looks-left tell (casual + confirmation) | 2 | Bar: 1, Corridor: 1 | +| Spatial deviation (Corridor B-7) | 2 | Corridor: 2 | +| **Tell subtotal** | **8** | | +| | | | +| **Trust-gated lines** (Kael's deeper dialogue) | | | +| Insider: ring operational talk | 6 | Terminal: 4, Corridor: 2 | +| Insider: close colleague warmth | 4 | Terminal: 2, Bar: 2 | +| Secret: hints about wanting out (pre-contradiction, rare) | 3 | Bar: 2, Corridor: 1 | +| **Trust-gated subtotal** | **13** | | +| | | | +| **Unprompted lines** (Kael volunteers) | | | +| Early: offers information, warmth | 3 | Terminal: 2, Bar: 1 | +| Late: warnings, deflections | 3 | Terminal: 1, Bar: 1, Corridor: 1 | +| **Unprompted subtotal** | **6** | | +| | | | +| **PACK TOTAL** | **91** | | + +91 lines. Within the 70-100 range from D-034. The slight overcount gives me room to cut — better to write 91 and kill 10 weak ones than write 70 and wish I had more coverage. + +### Arc Phase Mapping to Triggers + Prerequisites + +This is the structural skeleton. Every line in the pack maps to one of these slots. + +#### Phase 1: Comfort (0-10 min, RelationshipState: Friendly) + +| Trigger | Prerequisite | Content Type | Count | +|---|---|---|---| +| `observe_npc` | `relationship_state: Friendly, subject: kael_davan` | Smuggler monologue: warmth | 2 | +| `observe_npc` | `relationship_state: Friendly, subject: kael_davan` | Smuggler monologue: routine fondness | 2 | +| `post_conversation` | `relationship_state: Friendly, subject: kael_davan` | Smuggler monologue: social comfort | 1 | +| NPC dialogue | `access: [insider, peer], trust: surface` | Kael greetings, shift talk | 8 | +| NPC dialogue | `access: [insider], trust: real` | Kael ring talk, colleague warmth | 6 | +| NPC dialogue (unprompted) | `access: [insider]` | Kael volunteers info | 2 | + +**Phase 1 total: ~21 lines.** Heavy on dialogue (establish Kael's voice), lighter on monologue (smuggler's comfortable, not reflective). + +#### Phase 2: First Crack (10-15 min, still Friendly, flags accumulating) + +| Trigger | Prerequisite | Content Type | Count | +|---|---|---|---| +| `observe_anomaly` | `behavior_flags: lattice_checking` | Smuggler monologue: mild concern | 2 | +| `post_conversation` | `behavior_flags: evasive` | Smuggler monologue: worry | 2 | +| `observe_npc` (detective) | `relationship_state: Known, subject: kael_davan` | Detective monologue: behavioral note | 2 | +| NPC dialogue | `access: [insider, peer], trust: surface` | Kael: shorter, deflective | 4 | +| Tell observation | `behavior_flags` gates | Tells: lattice, shortened interactions | 3 | + +**Phase 2 total: ~13 lines.** Tell observations ramp up. Dialogue gets clipped. Smuggler monologue shifts from fond to concerned. + +#### Phase 3: The Contradiction (15-20 min, Friendly -> PersonOfInterest) + +| Trigger | Prerequisite | Content Type | Count | +|---|---|---|---| +| `witness_interaction` | `relationship_state: Friendly, subject: kael_davan` | Smuggler monologue: shock/alarm (THE moment) | 2 | +| `observe_anomaly` | `contradiction_flagged: meeting_unknown_contact` | Smuggler monologue: processing | 1 | +| `observe_npc` (detective) | behavioral flags accumulating | Detective monologue: suspicion spike | 2 | +| Tell observation | `contradiction_flagged` | Spatial deviation tell | 2 | + +**Phase 3 total: ~7 lines.** Fewest lines, highest stakes. Every word carries maximum weight. The contradiction monologue is the most important line in the pack. + +#### Phase 4: Confrontation (20-25 min, PersonOfInterest) + +| Trigger | Prerequisite | Content Type | Count | +|---|---|---|---| +| `post_conversation` | `tell_observed: looks_left_when_lying` | Smuggler monologue: the tell confirmation | 2 | +| `post_conversation` | `relationship_state: PersonOfInterest` | Smuggler monologue: hurt/conflict | 1 | +| NPC dialogue | `access: [insider], trust: surface` | Kael: deflection, evasion | 6 | +| NPC dialogue | `access: [insider]` | Kael: confrontation responses | 4 | +| NPC dialogue (unprompted) | `access: [insider]` | Kael: warnings | 2 | +| Tell observation | `tell_observed` gate | Looks-left confirmation | 1 | + +**Phase 4 total: ~16 lines.** Dialogue-heavy — the confrontation is a conversation. Kael's evasion lines are the hardest to write because they must be plausible without being convincing. + +#### Phase 5: Contaminated Trust (25-30 min, PersonOfInterest, new equilibrium) + +| Trigger | Prerequisite | Content Type | Count | +|---|---|---|---| +| `observe_npc` | `relationship_state: PersonOfInterest, subject: kael_davan` + `contradiction_flagged` | Smuggler monologue: doubt over warmth | 3 | +| `return_visit` | `relationship_state: PersonOfInterest` | Smuggler monologue: location contamination | 1 | +| `time_idle` | `relationship_state: PersonOfInterest, subject: kael_davan` | Smuggler monologue: rumination | 1 | +| `observe_npc` (detective) | `secret_confidence: confirmed/suspected` | Detective monologue: informant potential | 2 | +| NPC dialogue | `access: [public], trust: surface` | Kael: surface normal (warmth locked out) | 4 | +| NPC dialogue | `access: [insider], trust: real` (if smuggler chose understanding path) | Kael: confession hints | 3 | +| Trust-gated: secret | Path A only | Kael: deeper truth | 2 | + +**Phase 5 total: ~16 lines.** The contamination lines are the ones where voice discipline matters most — same warmth, new subtext. "Same old Kael" lines where the smuggler hears what used to be comfort and now hears a question. + +### Cross-Phase Lines (Not Phase-Specific) + +| Content Type | Count | Notes | +|---|---|---| +| Detective identification/first observation | 2 | Fires before detective has context on Kael | +| Kael Hael references (casual, any phase) | 3 | Establish relationship before it's load-bearing | +| Kael bar casual (not phase-gated) | 4 | Social texture | +| Detective pattern-forming observations | 3 | Cumulative, phase-independent | +| Kael insider ring coordination | 4 | Operational dialogue, pre-contradiction | + +**Cross-phase total: ~16 lines.** + +### Phase Total Reconciliation + +| Phase | Lines | % of Pack | +|---|---|---| +| Phase 1: Comfort | 21 | 23% | +| Phase 2: First Crack | 13 | 14% | +| Phase 3: Contradiction | 7 | 8% | +| Phase 4: Confrontation | 16 | 18% | +| Phase 5: Contaminated Trust | 16 | 18% | +| Cross-phase | 16 | 18% | +| **Total** | **89** | ~98% (rounding) | + +Close to the 91 estimate. The 2-line gap is margin for lines that emerge during writing — there's always one observation or reaction that only becomes obvious while you're in the character's head. + +### Format (Sample YAML) + +Each line in the pack looks like this. Showing one per phase to demonstrate prerequisite progression: + +```yaml +# Phase 1: Comfort — smuggler sees Kael, no concerns +- id: terminal_m_010 + character: smuggler + trigger: observe_npc + prerequisite: + relationship_state: Friendly + subject: kael_davan + text: "Kael's already at the dock. Good. The day's better when he's on shift." + mood: [fond] + topic: [colleague] + situation: [shift_start] + access: [insider, peer] + trust: surface + tags: [kael, baseline, pre_contradiction] + notes: "Phase 1 warmth. Establishes the bond." + +# Phase 2: First Crack — smuggler notices tell +- id: terminal_m_011 + character: smuggler + trigger: observe_anomaly + prerequisite: + all: + - relationship_state: Friendly + subject: kael_davan + - known_attributes: + subject: kael_davan + key: behavior_flags + value_contains: lattice_checking + text: "Kael keeps checking his lattice. Waiting for a message? Not like him to be jumpy." + mood: [concerned] + topic: [colleague] + situation: [routine] + access: [insider] + trust: real + tags: [kael, tell, first_crack] + +# Phase 3: Contradiction — the moment +- id: corridor_m_010 + character: smuggler + trigger: witness_interaction + prerequisite: + relationship_state: Friendly + subject: kael_davan + text: "Kael? Down here? And that's — I don't know them. Not crew, not ring. Who the hell is that?" + mood: [concerned] + topic: [colleague] + situation: [observation] + access: [insider] + trust: real + tags: [the_friend, contradiction, kael, critical_moment] + notes: "THE CONTRADICTION. Sets contradiction_flagged. Green -> amber." + +# Phase 4: Tell confirmation — the knife +- id: corridor_m_011 + character: smuggler + trigger: post_conversation + prerequisite: + all: + - relationship_state: PersonOfInterest + subject: kael_davan + - known_attributes: + subject: kael_davan + key: tell_observed + value: looks_left_when_lying + text: "He looked left. Always looks left when he's making something up. Two years, Kael. I know your tells." + mood: [conflicted] + topic: [trust] + situation: [confrontation] + access: [insider] + trust: real + tags: [the_friend, kael, tell_confirmation] + +# Phase 5: Contaminated trust — the new normal +- id: terminal_m_015 + character: smuggler + trigger: observe_npc + prerequisite: + all: + - relationship_state: PersonOfInterest + subject: kael_davan + - known_attributes: + subject: kael_davan + key: contradiction_flagged + value: meeting_unknown_contact + text: "Same old Kael. Same jokes, same routine. ...What are you not telling me?" + mood: [conflicted] + topic: [colleague] + situation: [routine] + access: [insider] + trust: real + tags: [kael, the_friend, contaminated_trust] +``` + +### Dependencies Before I Can Write the Full Pack + +| Dependency | Owner | Status | Impact if Missing | +|---|---|---|---| +| Content directory structure confirmed | Tyre | Round 2 (expected) | I write the pack as a single doc and split later — not blocking | +| FactId catalog (smuggler path entries) | Gestalt / Paula | Gap 5 from tracking | I use authoring-guide FactIds as placeholders, replace when catalog lands | +| EntityKnowledge key resolution (4 vs 8 keys) | Gestalt / Paula | D-03 disagreement | I write prerequisites using the Round 1 key names, adapt to winner | +| Monologue display constraints | Stig | R1 proposal: ~160 char, 2-line, 4-6 sec | Adopted. Writing to these constraints now. | +| NPC pattern/motivation mapping finalized | Gestalt | Round 2 (lead awarded to Gestalt) | Doesn't change Kael's content — he's FRIEND+OPERATOR regardless | + +**None of these are hard blockers.** The biggest risk is FactId placeholder drift — if the final catalog changes `contraband.ring_exists` to `smuggling.ring_confirmed`, I have to search-replace across the pack. Manageable, but annoying at scale. I'd rather the catalog stabilizes before I author all 695 items. + +### Authoring Timeline + +**Kael pack (91 lines):** I can draft the full pack once this workshop closes. Dialogue lines require the most iteration (Kael's voice under pressure is tricky — evasive without sounding scripted). Monologue lines are faster (I've been living in both character registers for two workshops now). Tell lines are mechanical — they map directly to the wiki's tell system table. + +Estimate: full draft in one session. Review pass in a second. Revision after Gestalt validates tags and Dudley confirms prerequisites fire correctly. + +**Sera pack follows immediately.** Different contradiction mechanics (cumulative pattern vs. single observation), different voice (Sera's precision vs. Kael's brevity), same structure. Lessons from Kael's pack inform Sera's. + +--- + +### Note on the 695 Number + +Round 1 tracking (A-06) flags my 695 total as "needs validation from others." Let me be clear about what it is and isn't: + +- **695 is the authored floor.** Below this, the 30-minute session has gaps — locations without environmental text, NPCs without enough dialogue variation, monologue pools that repeat. +- **695 is not the generation-expanded total.** D-028 specifies a 4x generation pass for dialogue ("write 10, generate 40"). If we apply that to the ~350 dialogue lines, the engine sees ~1,400 dialogue lines. But the 350 are what I hand-write. +- **695 doesn't include content the engine generates.** Routine greetings, time-of-day variations, personality-trait transformations — those are generation-pass output, not authored input. + +The number to track is **695 authored items.** That's the scope. That's what I deliver. + +--- + +*Mellanie, Round 2. Voice registers defined, pack structure mapped, dependencies identified. Ready to write the benchmark.* diff --git a/docs/workshops/v01-content-scoping/round2-paula.md b/docs/workshops/v01-content-scoping/round2-paula.md new file mode 100644 index 000000000..b596afb2b --- /dev/null +++ b/docs/workshops/v01-content-scoping/round2-paula.md @@ -0,0 +1,367 @@ +# Round 2 — Paula (Narrative & Political Depth) + +## Task 1: NPC Pattern/Motivation Mapping — v0.2 Emotional Layer + +Gestalt's mechanical mapping is canonical for v0.1. Accepted. + +But the versioned approach creates something valuable: **two analytical lenses on the same NPCs.** Gestalt maps from function ("What does this NPC do in the system?"). I map from meaning ("What does this NPC mean to the story?"). For v0.1, function drives implementation. For v0.2, meaning drives emotional depth expansion. + +Here's every disagreement annotated with what the v0.2 emotional layer adds: + +### Disagreement Resolution + v0.2 Notes + +| NPC | v0.1 (Gestalt) | v0.2 Layer (Paula) | What the v0.2 Layer Adds | +|-----|----------------|-------------------|--------------------------| +| **Voss** | SYSTEM + OPERATOR | SYSTEM + HANDLER | v0.1 Voss runs schedules (OPERATOR). v0.2 Voss manages people through scheduling authority — the resentment, the fear, the performative competence hiding real vulnerability. HANDLER unlocks Voss-specific monologue about being trapped between institutional role and criminal obligation. "I manage people. They just don't know who I'm managing them for." | +| **Devra** | THRESHOLD + HANDLER | THRESHOLD + OPERATOR | v0.1 Devra manages from above (HANDLER). v0.2 Devra runs the operation's machinery — she's the most competent person in the ring and knows it. OPERATOR unlocks content about Devra's ambition, her quiet belief she could run this better than Nils, her frustration at being the brain behind someone else's decisions. | +| **Maret** | SYSTEM + WITNESS | WITNESS + SKEPTIC | v0.1 Maret is the institutional scheduler who saw something (SYSTEM+WITNESS). v0.2 Maret doubts — not just "the numbers are off" but "the entire system I trusted is corrupt, and I'm complicit by filing clean reports." SKEPTIC unlocks Maret's crisis of institutional faith, the thing that makes her more than a data point for the detective. | +| **Resha** | CATALYST + SKEPTIC | CATALYST + CIVILIAN | v0.1 treats Resha's questions as genuine skepticism (SKEPTIC). v0.2 adds the tragedy: Resha is a CIVILIAN who accidentally became a CATALYST. She's not questioning the system — she's trying to learn it. The system is so broken that LEARNING it is disruptive. CIVILIAN unlocks content about Resha's bewilderment when people react to her innocent questions with fear. | +| **Harek** | GHOST + HANDLER | ANCHOR + HANDLER | v0.1 Harek shapes events through debt leverage (GHOST+HANDLER). v0.2 adds: Harek embodies contentment. He's the man who has enough, wants nothing more, and whose comfortable complacency created a tool for others without him meaning to. ANCHOR unlocks content about unconscious complicity — the "Is this enough?" question answered by someone who never thought to ask it, whose answer is "yes" while his comfort enables harm. | +| **Drin** | REMNANT + TURNCOAT | SYSTEM + TURNCOAT | v0.1 Drin remembers simpler times (REMNANT). v0.2 adds: Drin IS the inspection system. His compromise doesn't just corrupt a person — it corrupts the institutional process itself. SYSTEM unlocks content about institutional rot as metaphor: when the inspector is compromised, what does "inspection" even mean? | +| **Sess** | ANCHOR + CIVILIAN | NOBODY + CIVILIAN | v0.1 Sess embodies quiet contentment (ANCHOR). v0.2 adds: Sess is invisible — social wallpaper that the player walks past twenty times before realizing the bartender has seen everything. NOBODY unlocks dynamic tier promotion content for v0.2: the moment the player invests in Sess, the quiet contentment reveals itself as an observation post. | +| **Olin** | CATALYST + SKEPTIC | CATALYST + CIVILIAN | v0.1 gives Olin dual motivation (ambiguity). v0.2 resolves the ambiguity per playthrough: some seeds, Olin IS a skeptic (asking questions because they're probing). Other seeds, Olin is a civilian (asking questions because they genuinely need work). The randomized motivation resolution is a v0.2 generator feature. | +| **Sabel** | THRESHOLD + OPERATOR | GHOST + OPERATOR | v0.1 Sabel is the off-station gatekeeper (THRESHOLD). v0.2 adds: Sabel is absent power — the upstream force shaping local events. GHOST unlocks content about Sabel's indifference: Sabel doesn't care about Sova's people, only about the supply chain. If the operation burns, Sabel moves on. That coldness is narrative content for v0.2 (the player discovers the ring is disposable to its supplier). | +| **Tav** | SYSTEM + CIVILIAN | NOBODY + OPERATOR | v0.1 Tav follows ring lookout procedure (SYSTEM+CIVILIAN). v0.2 adds: Tav is peripheral, barely visible, the lowest rung. NOBODY unlocks tier promotion content — the player who notices Tav discovers a young person trapped in a role they barely understand, doing dangerous work because someone told them it mattered. | + +### What the v0.2 layer means for content planning + +The v0.2 layer adds **~30-50 authored lines per NPC** of emotional-depth content: expanded monologue pools, deeper dialogue gating, and pattern-specific interaction triggers (e.g., ANCHOR contentment dialogues, NOBODY promotion paths, GHOST influence chains). This is the "write 10, generate 40" Tier 2 expansion target. + +For now, Gestalt's v0.1 mapping governs implementation. My mapping governs the content roadmap. Both are correct — they describe different layers of the same characters. + +--- + +## Task 2: The Key Bloat Question — Generic Assessment Architecture + +The lead asks: "If the original EntityKnowledge set was incomplete for the smuggler, are we doing this again for the administrator or the corporate tycoon?" + +**The honest truth: No, but only if we name the keys correctly.** + +### The Problem With "Smuggler-Specific" Keys + +Gestalt proposed 4 new keys: `exposure_risk`, `loyalty_assessment`, `cover_integrity`, `moral_weight`. These are described as "smuggler-specific." But look at what they actually capture: + +| Key | What It Really Measures | Is This Smuggler-Specific? | +|-----|------------------------|---------------------------| +| `exposure_risk` | "How much does this NPC's behavior threaten my current interests?" | No. An administrator assesses exposure risk too — but it's political exposure, not operational. | +| `loyalty_assessment` | "Where does this NPC's loyalty lie relative to me?" | No. Every archetype navigates loyalty networks. | +| `cover_integrity` | "Is my position/identity intact around this person?" | No. An administrator's "cover" is their public reputation. A newcomer's "cover" is their attempt to blend in. | +| `moral_weight` | "How much moral cost do I carry in this relationship?" | No. Already generic. Every human feels guilt, complicity, or indifference. | + +These aren't smuggler keys. They're **role-perspective assessment keys** that every archetype uses with different semantics. + +### The Generic Architecture + +**Proposal: 6 role-perspective keys that work for all 8 archetypes.** Same keys, archetype-specific interpretation, zero per-archetype schema bloat. + +| Generic Key | Smuggler Interpretation | Detective Interpretation | Administrator | Newcomer | Merchant | +|------------|------------------------|------------------------|---------------|----------|----------| +| `risk_assessment` | Exposure of ring operations | Exposure of investigation | Exposure of political position | Vulnerability as an outsider | Exposure of trade relationships | +| `loyalty_assessment` | Loyal to the ring? | Cooperative with investigation? | Aligned with my faction? | Willing to help a newcomer? | Reliable trade partner? | +| `position_integrity` | Is my cover identity holding? | Is my authority respected? | Is my reputation intact? | Am I blending in? | Is my business relationship secure? | +| `moral_weight` | Guilt about complicity | Guilt about using people | Guilt about political compromises | Guilt about disrupting others | Guilt about exploiting information | +| `tell_observed` | Behavioral tell suggesting ring exposure | Behavioral tell suggesting concealment | Political tell (nervous in meetings) | Social tell (who's welcoming, who's not) | Commercial tell (price sensitivity, evasion) | +| `contradiction_flagged` | Behavior contradicts ring loyalty | Behavior contradicts claimed innocence | Behavior contradicts public stance | Behavior contradicts stated welcome | Behavior contradicts stated terms | + +**The values use the same enums.** `risk_assessment: "high"` means different things to different archetypes, but the schema is identical. The content authoring guide (the archetype brief, the voice register, the monologue prerequisite rules) provides the interpretation. The knowledge graph stores data; the content layer provides meaning. + +### Why This Works + +Let me complicate this by testing it against the hardest case. The **Insider** archetype (the community member, the person embedded in the social fabric). Does `risk_assessment` work? + +- Insider's `risk_assessment` of Kael: "How much does Kael's behavior threaten the community I'm part of?" Value: `"moderate"` — Kael's nervousness is unsettling but hasn't caused concrete harm yet. +- Insider's `loyalty_assessment` of Voss: "Where does Voss's loyalty lie — with the shift crew or with whoever's pressuring him?" Value: `"uncertain"` — Voss seems stressed but still functional. +- Insider's `position_integrity` assessment of themselves near the detective: "Does the detective's presence threaten my standing in the community?" Value: `"stressed"` — people are nervous, the community is pulling inward, and the insider's position as a trusted neighbor is complicated by anyone who cooperates with authorities. + +It works. Same keys. Different lens. Zero schema change. + +### What IS Archetype-Specific + +The archetype-specific content lives in three places, none of which are EntityKnowledge keys: + +1. **Monologue prerequisite interpretation.** The prerequisite `risk_assessment == "high"` triggers different monologue lines per archetype. The smuggler thinks: "Torek's spending is going to get us caught." The administrator thinks: "Torek's spending is drawing Commission attention to the district." Same trigger, different pool, same key. + +2. **Dual-lens section in NPC profiles.** Every NPC profile already has per-character lens sections. For 8 archetypes, this becomes an archetype-lens section per NPC — but that's content authoring, not schema work. And at 300-world scale, the generator produces these from archetype brief + NPC profile + composition rules. + +3. **Voice register.** The smuggler's internal voice is operational and terse. The detective's is analytical and institutional. An administrator's would be political and strategic. A newcomer's would be uncertain and observational. These registers shape how the same knowledge is expressed, not what knowledge exists. + +### The Practical Answer + +**For v0.1:** Rename Gestalt's 4 keys to the generic versions: + +| Current (Gestalt's v0.1) | Renamed (Generic) | Change Required | +|--------------------------|-------------------|-----------------| +| `exposure_risk` | `risk_assessment` | Rename in schema + content | +| `loyalty_assessment` | `loyalty_assessment` | No change — already generic | +| `cover_integrity` | `position_integrity` | Rename in schema + content | +| `moral_weight` | `moral_weight` | No change — already generic | + +2 renames. That's it. The v0.1 smuggler and detective content is authored against the generic keys. When v0.2 adds the Newcomer archetype, the Newcomer's knowledge graph uses the same 6 role-perspective keys with Newcomer-specific content. Zero schema changes. Zero key bloat. + +**For v0.2+:** `social_debt` and `loyalty_conflict` (Gestalt's deferred keys) should also be evaluated against this lens. `social_debt` generalizes cleanly (every archetype navigates obligations). `loyalty_conflict` may fold into `loyalty_assessment` + `behavior_flags` as Gestalt argued. That's a v0.2 decision. + +**Total key count per archetype: 20** (14 shared + 6 role-perspective). Same for smuggler, detective, administrator, merchant, newcomer, insider, fixer, exile. No per-archetype keys. No bloat. The schema scales to 8 archetypes without modification. + +### What SUSTAINS This Across 8 Archetypes + +The keys are the skeleton. The archetype brief is the muscle. Each archetype needs: + +1. A **voice register** (how their monologue sounds) +2. An **assessment framework** (what "risk" means to them, what "loyalty" means) +3. A **moral arc** (what their version of Comfort → Doubt → Reckoning → Compromise looks like) + +These are content documents, not schema changes. They live in the authoring guide, not the codebase. Mellanie writes them; Paula designs them; Gestalt validates that the mechanical triggers work. + +The smuggler moral arc (Comfort → Doubt → Reckoning → Compromise) is the prototype. Every archetype gets a 4-phase arc with the same structure and different content. The administrator's arc might be: Authority → Doubt → Reckoning → Adaptation. The newcomer's: Wonder → Doubt → Reckoning → Belonging-or-Departure. + +But the keys don't change. The keys are the infrastructure. The content is the building. + +--- + +## Task 3: Wiki Fix Execution Plan + +### Prioritized Execution Order + +The changes are ordered by dependency — later items reference earlier items' outputs. + +| Priority | Change | Files Affected | Content Status | Estimated Effort | +|----------|--------|---------------|----------------|-----------------| +| **P0-1** | Naia Tamm rename | 16 files | Cascade plan ready (Round 1). Content changes specified per-file. | ~2 hours (mechanical, but must be thorough) | +| **P0-2** | Nils Davan stub page | 1 new file + 3 cross-ref updates | Full draft ready (Round 1). | ~30 min | +| **P0-3** | Drin Tier 2 expansion | 1 file rewrite + index update | Full draft ready (Round 1). 7 new axes, voice sample, tell system. | ~1 hour | +| **P1-1** | Canonical name application | 10 NPC profile headers + index | Name table ready (Round 1). 3 names need Miri validation. | ~1 hour | +| **P1-2** | Triangle 1 escalation fork | index.md triangle section + Kael/Voss notes | 5-beat sequence designed (Round 1). Self-contained per D-INTERACT. | ~1 hour | +| **P2-1** | Smuggler-lens sections (all 17 NPCs) | 17 NPC profile files | Template designed (Round 1). Per-NPC content requires authoring. | ~8-10 hours | +| **P2-2** | PC-as-NPC profiles | 2 new files | Gap identified (Round 1). Content not yet drafted. | ~3-4 hours | +| **P2-3** | FactId catalog — smuggler entries | 1 file | Gap identified (Round 1). Entries not yet drafted. | ~2 hours | + +### P0-1: Naia Tamm Rename — Execution-Ready Content + +Below is the exact content change needed for each file. I'm specifying what to find and what to replace so this can be executed mechanically. + +#### File 1: `docs/wiki/npcs/hael.md` → rename to `docs/wiki/npcs/naia-tamm.md` + +Full rewrite of the file header and all internal references. Key structural changes: + +**Old header:** +```markdown +# Hael + +**Tier 2 NPC** | The Last Shift (Bar) | Mundane +``` + +**New header:** +```markdown +# Naia Tamm — THE MIRROR + +**Tier 1 (MIRROR) NPC** | The Last Shift (Bar) | Mundane +``` + +**Core Identity section changes:** +- `**Name**: Hael` → `**Name**: Naia Tamm` +- Add: `**Canonical ID**: krenn.naia-tamm` +- Add: `**Pattern**: MIRROR (no contradiction arc, no secret)` +- Add: `**Motivation**: CIVILIAN (v0.1 mechanical mapping)` + +**All internal "Hael" references** → "Naia Tamm" (formal) or "Naia" (casual/dialogue). The Krenn convention (D-036) is first-name-primary in social contexts, so dialogue and monologue use "Naia." Profile text and cross-references use "Naia Tamm." + +**Secret/Vulnerability section** — must be reframed for MIRROR pattern: +```markdown +### 2. Secret / Vulnerability + +**Surface secret**: None. Naia has no secrets. This is THE MIRROR's +defining trait. + +**Deep secret**: None. Naia Tamm is the one person in the district who +is exactly what she appears to be — a teacher worried about her partner. +The MIRROR's power is simplicity. When events drag Naia into the +conspiracy (through Kael's ring involvement, through Sera's concealment), +the damage is devastating precisely because Naia was genuine. + +**Vulnerability**: Emotional exposure. Naia's worry about Kael is visible, +exploitable, and honest. She has no defenses because she has no agenda. +The detective can cultivate Naia as a source without guilt — until the +consequences of that cultivation become apparent. +``` + +**Content requirements section** — update for MIRROR-specific depth: +```markdown +## Content Requirements (MIRROR — Tier 1 Emotional Depth) + +**~50-70 authored lines total** (no generation expansion): + +- **20-25 dialogue lines**: Bar greetings (3), Kael-related conversation + (8-10), Sera interaction (4-5), school/community (3-4), response to + bad news (3-5) +- **8-12 trust-gated lines**: Honest disclosures about Kael's behavior + changes, emotional confessions about the relationship, what Naia has + told Sera +- **5-8 unprompted lines**: Naia volunteers worry about Kael, asks + about Kael if the player has seen him, mentions school events +- **8-12 monologue lines per character**: + - Smuggler monologue about Naia: guilt (4-5 — "She doesn't know. + She can never know."), protectiveness (3-4), moral weight (2-3) + - Detective monologue about Naia: sympathy (3-4 — "The partner. + Worried. Doesn't know what I know."), source assessment (2-3), + moral cost of using her (3-4) +- **3-5 tell observation lines**: Visible stress, checking for Kael, + increased bar presence, confiding in Sera +- **NO contradiction discovery lines** — THE MIRROR has no contradiction. + The emotional payload comes from what happens TO Naia, not what Naia + hides. +``` + +**Cross-reference links at bottom:** +```markdown +**Cross-References:** [Kael Davan](kael-davan.md), [Sera Venn](sera-venn.md), +[Lera Sessik](lera-sessik.md) +``` + +#### File 2: `docs/wiki/npcs/index.md` + +**Roster table row 9:** +- Old: `| 9 | Hael | Teacher (Kael's Partner) | Bar | Tier 2 | Mundane | Worried Partner |` +- New: `| 9 | **Naia Tamm** | Teacher (Kael's Partner) | Bar | **Tier 1 (MIRROR)** | Mundane | Worried Partner |` + +**Triangle 4 diagram (3 label changes):** +``` + Naia Tamm (Teacher, Kael's Partner) + / \ + worried about confides in friend + Kael's late nights, | + evasive answers | + | | + Kael (Dock Worker) <--friendship--> Sera (Commission Field Tech) +``` + +**Triangle 4 description text** — every "Hael" → "Naia Tamm" (formal) or "Naia" (in-character). Approximately 8 replacements. + +**Social site listing — The Last Shift:** +- Old: `- Hael (Teacher) — Kael's partner, worried` +- New: `- Naia Tamm (Teacher) — Kael's partner, worried` + +**Content Deliverables section:** +- Move Naia Tamm from "Tier 2" list to a new "Tier 1 (MIRROR)" subsection, or note the tier change explicitly. + +#### File 3: `docs/wiki/index.md` + +**NPC listing:** +- Old: `- [Hael](npcs/hael.md) — Kael's partner (referenced)` +- New: `- [Naia Tamm](npcs/naia-tamm.md) — Kael's partner, THE MIRROR` + +Also move from "Tier 2" to a new bullet under Tier 1: +```markdown +- **Tier 1 (MIRROR):** + - [Naia Tamm](npcs/naia-tamm.md) — Kael's partner, teacher +``` + +#### File 4: `docs/wiki/npcs/kael-davan.md` (~20+ replacements) + +This is the heaviest file. Every "Hael" becomes "Naia" in dialogue/monologue contexts and "Naia Tamm" in descriptive/profile contexts. Key sections: + +- **Axis 1 (Want), Secondary**: "Protect Hael (partner)" → "Protect Naia (partner)" +- **Axis 2 (Secret)**: "Hael doesn't know about the smuggling" → "Naia doesn't know about the smuggling" +- **Relationship 2 header**: "Hael (partner, teacher, civilian)" → "Naia Tamm (partner, teacher, civilian)" +- **Relationship 2 body**: All "Hael" → "Naia" (casual reference in relationship description) +- **Axis 4 (Tolerance)**: "Hael's increasing worry" → "Naia's increasing worry" +- **Axis 5 (Routine)**: "Home with Hael" → "Home with Naia" +- **Axis 6 (Information)**: "Hael's worry" → "Naia's worry", "Hael talked to Sera" → "Naia talked to Sera" +- **Axis 7 (Contentment)**: "guilt about lying to Hael" → "guilt about lying to Naia" +- **Voice sample**: "I'm fine, Hael" → "I'm fine, Naia" (Mood: Protective line) +- **Dual-lens notes**: All Hael references +- **Triangle 4 role notes**: All Hael references +- **Secret section**: All Hael references +- **Contradiction arc**: Multiple references throughout all 5 phases +- **Authoring notes**: "Hael references" → "Naia references" + +File link in cross-references: +- Old: `[Hael](hael.md)` (if present) +- New: `[Naia Tamm](naia-tamm.md)` + +#### File 5: `docs/wiki/npcs/sera-venn.md` (~15 replacements) + +Same pattern as Kael. Key sections: +- **Axis 1 (Want), Secondary**: "Protect Hael" → "Protect Naia Tamm" +- **Relationship 2**: Full section rewrite — "Hael" → "Naia" / "Naia Tamm" +- **Axis 4, 5, 6, 7**: All Hael references +- **Tell system**: References to Hael observing Sera's avoidance +- **Voice sample**: "Hael was here earlier" → "Naia was here earlier" +- **Triangle 4 role notes**: All Hael references +- **Secret section**: All Hael references +- **Contradiction arc**: Hael references throughout +- **Authoring notes**: "Hael references" → "Naia references" + +#### Files 6-16: Lighter touch changes + +| File | Changes | +|------|---------| +| `docs/wiki/npcs/lera-sessik.md` | Axis 6 info inventory: "Hael's worry about Kael" → "Naia Tamm's worry about Kael" | +| `docs/wiki/npcs/maret-korr.md` | Axis 5 routine: "goes for Hael's company" → "goes for Naia's company" | +| `docs/wiki/authoring/monologue-guide.md` | Any monologue examples referencing Hael | +| `docs/wiki/locations/krenn-system/the-last-shift.md` | NPC presence list, social dynamics | +| `docs/wiki/world/sova-transit-district.md` | NPC references | +| `docs/wiki/factions/the-ring.md` | Kael vulnerability references | +| `docs/wiki/knowledge/relationship-states.md` | Example entries | +| `docs/wiki/knowledge/entity-attributes.md` | Example entries | +| `docs/wiki/knowledge/fact-catalog.md` | FactId entries: `npc.hael.*` → `npc.naia_tamm.*`, `relationship.kael.hael` → `relationship.kael.naia_tamm` | +| `docs/wiki/world/krenn-system.md` | Naming examples list: "Hael" → keep (it's a valid Krenn first name), but add "Naia" to the list if not present | +| `decisions/content.md` | D-034: "partner Hael" → "partner Naia Tamm". D-036: naming examples list update. | + +### P0-2: Nils Davan Stub — Execution-Ready Content + +The full stub page draft was provided in my Round 1 response. It's ready to write to `docs/wiki/npcs/nils-davan.md`. + +**Cross-reference updates needed after creation:** + +| File | Change | +|------|--------| +| `docs/wiki/npcs/index.md` | Add Nils to the Smuggling Ring social site listing. Add to roster table as off-stage NPC. | +| `docs/wiki/index.md` | Add `[Nils Davan](npcs/nils-davan.md) — Ring coordinator (off-stage)` to NPC listing. | +| `docs/wiki/npcs/kael-davan.md` | Add cross-reference link at bottom: `[Nils Davan](nils-davan.md)` | +| `docs/wiki/npcs/voss.md` | Add cross-reference link | +| `docs/wiki/npcs/devra.md` | Add cross-reference link | +| `docs/wiki/npcs/renn.md` | Add cross-reference link | + +### P0-3: Drin Tier 2 Expansion + +Full 7-axis draft provided in Round 1. Gestalt confirms promotion (A-01 consensus). Execution: + +1. Rewrite `docs/wiki/npcs/drin.md` from Tier 3 format to Tier 2 format using my Round 1 draft +2. Update `docs/wiki/npcs/index.md` roster table: Tier 3 → Tier 2, update entanglement +3. Update `docs/wiki/index.md`: Move Drin from Tier 3 listing to Tier 2 +4. Add Gestalt's v0.1 mapping to header: `**Pattern**: REMNANT | **Motivation**: TURNCOAT` + +### P1-1: Canonical Names + +Apply the name table from Round 1. **Three names need Miri validation** before applying: Drin Vassar, Sess Torin, Tav Lenn. Olin deliberately omits surname (narrative choice). Sabel deliberately omits surname (off-station character). + +### P1-2: Triangle 1 Escalation Fork + +**Important: Self-contained per Tyre's recommendation (confirmed by lead as D-INTERACT).** My Round 1 design included cross-triangle cascade (Path B feeding Triangle 2 via Maret). For v0.1, the fork must be self-contained. + +Revised Triangle 1 fork — self-contained version: + +The 5-beat structure stays the same, but Beat 5 consequences are resolved WITHIN Triangle 1: + +| Path | Self-Contained Consequence | What Does NOT Cascade | +|------|---------------------------|----------------------| +| **A (Back Voss)** | Nils is angry at Kael. Kael is frightened. Smuggler feels responsible. | Nils's anger does not trigger Pell's crisis (Triangle 5). | +| **B (Back Nils)** | Voss capitulates but is visibly rattled. Fourth manifest revision happens. | The manifest revision does NOT trigger Maret's discovery (Triangle 2). Maret discovers independently. | +| **C (Stay neutral)** | Nils acts unilaterally. Operation is sloppier. Smuggler's standing drops. | The sloppy operation does NOT make the detective's investigation easier. Detective's timeline is independent. | + +This keeps Triangle 1 testable in isolation while preserving the emotional weight of each choice. Cross-triangle cascade becomes a v0.2 feature when the storyteller can manage multi-triangle state. + +### Execution Dependencies + +``` +P0-1 (Naia Tamm rename) ─── no dependencies, start immediately +P0-2 (Nils stub) ─── no dependencies, start immediately +P0-3 (Drin expansion) ─── blocked by A-01 formalization (consensus confirmed) +P1-1 (Canonical names) ─── blocked by Miri validation (3 names) +P1-2 (Triangle 1 fork) ─── depends on P0-2 (Nils stub must exist first) +P2-1 (Smuggler-lens) ─── depends on key bloat resolution (Task 2 above) +P2-2 (PC-as-NPC) ─── depends on P2-1 (smuggler-lens template establishes format) +P2-3 (Smuggler FactIds) ─── depends on P2-1 +``` + +**P0-1 and P0-2 can start immediately and run in parallel.** I recommend these as the first Sprint 3 copy team commits. diff --git a/docs/workshops/v01-content-scoping/round2-si.md b/docs/workshops/v01-content-scoping/round2-si.md new file mode 100644 index 000000000..7c164bea7 --- /dev/null +++ b/docs/workshops/v01-content-scoping/round2-si.md @@ -0,0 +1,290 @@ +# Round 2 — SI (Project Manager) +## Finalized Ticket List for v0.1 Content Scoping + +Incorporates: all 7 Round 1 responses, Qatux tracking doc, lead decisions (D-NPC, D-FORMAT, D-INTERACT, D-PAUSE). + +--- + +## 1. Lead Decisions — Impact on Tickets + +| Decision | Ticket Impact | +|----------|---------------| +| **D-NPC:** Gestalt's mechanical mapping wins for v0.1 | NEW-1 simplified: "apply Gestalt's mapping" (not resolve disagreements). Paula's emotional layer becomes v0.2 annotation. | +| **D-FORMAT:** YAML for content, RON converter available | Confirms C-series as YAML. Adds NEW-8: RON converter tool. | +| **D-INTERACT:** Single action for v0.1, multi-verb architecture underneath | NEW-7 reframed. Adds NEW-9 (server: InteractionOptions) + NEW-10 (client: extensible prompt). | +| **D-PAUSE:** Spacebar always pauses, overlays = 50% sim speed | Adds NEW-11 (server: tick rate scaling) + NEW-12 (client: pause state machine). | + +--- + +## 2. Round 1 Consensus — Impact on Tickets + +| Consensus Item | Ticket Impact | +|----------------|---------------| +| **A-01:** Drin promoted to Tier 2 | NEW-2 changes from "evaluation" to "execute promotion" — expand profile. | +| **A-02:** NOBODY deferred to v0.2 | No v0.1 ticket. Hidden data ships in NPC YAML files (handled by C-series). | +| **A-05:** ~200 monologue lines | Sizes NEW-4 at ~200 lines (~100 per character). | +| **A-06:** ~695 total authored items | Overall content scope validation. No new ticket, but informs sprint capacity. | +| **A-07:** 3 active + 2 passive triangles | Confirms A11 scope (Triangle 1 only needs fixing). T3/T5 need less work. | +| **A-11:** THE FRIEND is critical path | Confirms #261 → #297/#298 chain is the highest-priority dependency. | +| **A-12:** Client receives text from server | No client-side content loading tickets needed. Simplifies client scope. | +| **A-14:** PC-as-NPC confirmed for v0.1 | Validates B3, B5, NEW-6. | +| **A-15:** News ticker confirmed for v0.1 | #306 confirmed. Scope: ~20 headlines. | +| **A-17:** Self-contained triangle forks | Reduces C8 complexity (no cross-triangle cascade logic). | +| **Tyre: Line previewer CLI** | Adds NEW-13. | +| **Paula: 7 additional wiki gaps** | Gaps 1-5 already covered by existing tickets. Gap 6 (location smuggler detail) → folded into content conversion. Gap 7 (Harek triangle membership) → folded into NEW-1 mapping. | + +--- + +## 3. Existing Ticket Updates (Revised) + +| ID | Title | Action | Sprint Target | +|----|-------|--------|---------------| +| #368 | Knowledge vocabulary for v0.1 content | **Close** — wiki at `docs/wiki/` is the delivered output | Sprint 2 (done) | +| #369 | Wiki Review Workshop Outputs (epic) | **Repurpose** as parent epic for all v0.1 content scoping tickets. Update description. | — | +| #301 | Wiki taxonomy and structure | **Assign to copy.** Downscope: Sova district structure only for v0.1. Full 500+ world taxonomy is generator-era. | Sprint 3 | +| #319 | Krenn System wiki entry | **Merge with A3.** Expanded: wiki page + seed.yaml reference implementation. Assign to copy. | Sprint 4 | +| #261 | Dual Lens Authoring Guide | **CRITICAL PATH ROOT.** Assign to copy. Owner: Paula. Blocks 9 downstream tickets. | Sprint 3 (P0) | +| #310 | Character voice speech patterns | **Subsume into B4** (smuggler voice card + moral arc). B4 is the larger ticket. Close #310 when B4 lands. | Sprint 3 (via B4) | +| #306 | News ticker / Meridian feed content | **Confirm scope:** ~20 dual-lens headlines. Assign to copy. | Sprint 4 | +| #326 | YAML content loader | **Assign to server.** Blocked by C1 + C2. | Sprint 4 | +| #86 | Core NPC components | **Already Sprint 3 server.** Dudley's ECS component list from Round 1 informs this. | Sprint 3 | +| #88 | Daily routine system | **Already Sprint 3 server.** Needs NPC routine YAML from content conversion. | Sprint 3 | + +--- + +## 4. Finalized New Ticket Proposals + +### Group A: Wiki Content Fixes (copy team) + +| ID | Title | Type | Priority | Sprint | Blocked By | Description | +|----|-------|------|----------|--------|------------|-------------| +| A1 | Apply canonical full names to all NPC wiki pages | task | medium | 3 | — | Apply Miri's 12 full names to NPC wiki pages. Update Core Identity blocks, environmental text references. | +| A2 | Rename Hael → Naia Tamm across all wiki files | task | medium | 3 | — | Find-and-replace across ~8 wiki files. Triangle 4 becomes Naia-Kael-Sera. | +| A6 | Add smuggler-perspective FactId progression text | task | high | 4 | B4 | Add smuggler-path text for all FactIds where smuggler starts at KnowsDetails or has different knowledge path. | +| A7 | Add smuggler-specific entity attributes to entity-attributes.md | task | high | 3 | — | Scope depends on Round 2 resolution of D-03 (Gestalt's 4 new + 2 repurposed vs Paula's 8 new). Add to wiki/knowledge/entity-attributes.md. | +| A8 | Standardize location shortcodes in monologue-guide.md | task | medium | 3 | — | Fix hub_m_ → terminal_m_ inconsistency. Add shortcode reference table. | +| A10 | Stub NPC profile for Nils Davan | task | medium | 3 | — | Off-stage profile: Core Identity, relationship to Kael, role in ring, known attributes. | +| A11 | Fix Triangle 1 (Hub Power) — Volume Escalation decision | story | high | 3 | A10 | Add smuggler decision fork: side with Nils (louder signal), side with Voss (tension), or split route (exposure). Self-contained — no cross-triangle cascade per A-17. | +| A12 | Create environmental text examples file | task | medium | 4 | A3/#319 | Bar menu, safety notice, news ticker cycle, corridor graffiti. Krenn-voiced. Needed for wow moment #1 (Arrival). | + +### Group B: Style Guides & Specs (copy team) + +| ID | Title | Type | Priority | Sprint | Blocked By | Description | +|----|-------|------|----------|--------|------------|-------------| +| B1 | NPC Authoring Style Guide | story | critical | 5 | A3, A4, A7, B2, B4 | Combined document: tier templates, authoring rules, regional culture, content pipeline. Reframed as generator specification — this IS the NPC generator input format. Most complex ticket; many blockers. | +| B2 | THE MIRROR pattern spec | story | high | 3 | — | Define honest-character NPC pattern. No contradiction arc, no secret. Tier 1 emotional depth. Naia Tamm is first instance. Output becomes generator template. | +| B3 | PC-as-NPC unified spec | story | high | 3 | A7 | Unified spec: starting knowledge graph, starting relationship map, reverse knowledge (bidirectional), orientation monologue, agency boundaries, authored relationship stubs, tell inversion. 9-step conversion checklist. | +| B4 | Smuggler voice card + moral arc spec | story | high | 3 | A7 | Two deliverables: (1) Smuggler voice card — paired examples with detective showing dual-lens register differences. (2) Smuggler moral arc — 4 phases (Comfort→Doubt→Reckoning→Compromise), smuggler-specific FactIds, monologue triggers. Subsumes #310 scope. | +| B5 | NPC-format briefs for both PCs — Concept A v0.1 | story | high | 4 | B3 | NPC-mode behavior scripts (5-7 routine entries each), reverse dual-lens notes, observation monologue (3-5 lines per character). ~20-30 authored items total. | + +### Group C: Content Directory & Schema (split teams) + +| ID | Title | Type | Priority | Sprint | Team | Blocked By | Description | +|----|-------|------|----------|--------|------|------------|-------------| +| C1 | Content directory structure design doc | story | high | 3 | copy | — | Document converged structure: `_meta/` + `_schema/` (infrastructure), `global/` + `districts/` (content). Canonical_id format. Mod overlay mechanics. District as atomic pack unit. Informs all content implementation. | +| C2 | Create content/ directory skeleton | task | high | 3 | server | C1 | Create directory tree with empty YAML stubs. `_meta/`, `_schema/`, `global/` (factions, technology, contraband, knowledge, enums, regions), `districts/sova-transit/` (district.yaml, npcs/, locations/, templates/, triangles/, lines/). | +| C3 | Content schema definitions (YAML Schema files) | story | high | 3 | server | C1 | Create `_schema/` with validation schemas: npc.schema.yaml (tier-conditional), location, faction, template, fact, dialogue, monologue, district, pool. | +| C4 | Create global/enums/ YAML files from D-035 | task | medium | 4 | server | C2 | Populate enums: situations (13), topics (9), moods (8), triggers (9), access-tiers (5), activities (new). | +| C5 | Create global/knowledge/entity-attributes.yaml | task | medium | 4 | server | C2 | Machine-readable entity attribute definitions. 14 detective + smuggler keys (count depends on D-03 resolution). | +| C6 | Create pools.yaml for v0.1 seed-time selection | task | medium | 4 | server | C2 | Sova single-candidate pools: friend_smuggler, friend_detective, bar_regulars, compromised_inspector, primary_contraband. Architecture supports N candidates. | +| C7 | Create template YAML files with role slot definitions | task | medium | 4 | server | C2 | 3 social sites: logistics-hub.yaml, bar.yaml, smuggling-ring.yaml. Role slots with count ranges, required flags, pool references, triangle constraints. | +| C8 | Create triangle YAML files for 5 v0.1 triangles | task | medium | 4 | server | C2 | 5 triangles. Self-contained forks (no cross-triangle cascade per A-17). Includes updated T1 with Volume Escalation. | +| C9 | Implement make validate-content CLI | story | high | 4 | server | C3 | Structural + tier-conditional validation. Reads _schema/, validates all YAML. v0.2: cross-reference validation. | +| C10 | Pre-commit FactId typo check | task | medium | 4 | ci | — | Grep-based pre-commit check validating FactId references against canonical facts.yaml. | + +### Group D: Design Specs + +| ID | Title | Type | Priority | Sprint | Team | Blocked By | Description | +|----|-------|------|----------|--------|------|------------|-------------| +| D2 | Seed configuration schema design | story | medium | 4 | server | — | Schema for what the randomizer produces at game-start: FRIEND selections, social site population, compromised NPC, contraband type. v0.1 has single-candidate pools but architecture must support N. | +| D4 | News ticker headline pool | task | medium | 4 | copy | — | ~20 dual-lens headlines for Meridian feed at Lera's. Freight data, politics, local infrastructure, sports, Commission advisories. Each works as dual-lens monologue trigger. | + +### Group NEW: Tickets from Round 1 + Round 2 + +| ID | Title | Type | Priority | Sprint | Team | Blocked By | Description | +|----|-------|------|----------|--------|------|------------|-------------| +| NEW-1 | Apply Gestalt's NPC pattern/motivation mapping | task | high | 3 | copy | — | Apply the canonical v0.1 mapping (Gestalt's Round 2 finalized table) to wiki and content files. 17 NPCs × (pattern + motivation). Includes Harek's structural role per Paula Gap 7. | +| NEW-2 | Drin Tier 2 profile expansion | task | medium | 3 | copy | NEW-1 | Drin confirmed Tier 2 (A-01). Expand wiki profile to full Tier 2 depth: all 10 profile axes, smuggler lens section, triangle membership formalized. | +| NEW-3 | Wiki → YAML content conversion (Sova NPCs) | story | high | 4 | copy | C1, C2, C3 | Convert 17 NPC wiki profiles to engine-readable YAML. Includes routine YAML layer (Paula Gap 3), triangle fork decision points (Gap 4), location smuggler detail (Gap 6). Tyre estimates 2-3 days. | +| NEW-4 | Monologue content pool — minimum viable (~200 lines) | story | high | 4 | copy | #261, B4 | ~100 lines per character. Categories: arrival observations, NPC routine commentary, environmental flavor, contradiction hints, idle reflections, tutorial/orientation. Follows Mellanie's authoring order (FRIEND packs first, then fill). | +| NEW-5 | v0.1 wow moment content checklist | task | high | 3 | copy | — | Map D-039's 6 wow moments to specific content deliverables + implementation tickets. Track completion. Acceptance: every moment has identified content + code backing it. | +| NEW-6 | PC-as-NPC content authoring | story | high | 5 | copy | B3, B5 | Author the actual lines: 5-7 routine entries per character, 3-5 observation monologue lines, reverse dual-lens notes. ~25 authored items (Mellanie's budget). | +| NEW-7 | v0.1 interaction verb spec | task | medium | 3 | copy | — | Document the 7 interaction types (A-04: Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear). Define triggers, UI needs, server events per type. v0.1 surfaces single context-sensitive action; architecture supports N verbs. | + +### Group NEW-R2: Tickets from Lead's Round 2 Decisions + +| ID | Title | Type | Priority | Sprint | Team | Blocked By | Description | +|----|-------|------|----------|--------|------|------------|-------------| +| NEW-8 | YAML → RON converter tool | task | medium | 4 | server | C1 | Build-time converter: reads content YAML, emits RON. Lives in `tooling/`. Runs as make target (`make content-ron`). Not on critical path — engine consumes YAML in v0.1; RON is future-proofing. | +| NEW-9 | Multi-verb interaction architecture — server InteractionOptions | story | high | 3 | server | — | Server models N available actions per entity via `InteractionOptions` component. v0.1 client picks first/best; v0.2 client shows menu. Must not be throwaway. Includes ObserverSnapshot v3 extension for interaction data. | +| NEW-10 | Multi-verb interaction architecture — client extensible prompt | story | high | 3 | client | NEW-9 | Client-side interaction prompt designed for extensibility. v0.1: single context-sensitive E prompt. Architecture supports v0.2 multi-verb menu. Prompt system reads InteractionOptions from server state. | +| NEW-11 | Pause system — server tick rate scaling | story | medium | 3 | server | — | Tick rate supports 3 states: full speed (normal play), 50% speed (UI overlay open), 0% (spacebar pause). Server receives pause/speed commands from client. | +| NEW-12 | Pause system — client state machine | story | medium | 3 | client | NEW-11 | Client pause state machine: Normal → Overlay (50% speed, triggered by knowledge panel / dialogue) → Paused (spacebar from any state). Spacebar always overrides to full pause. | +| NEW-13 | Line previewer CLI | task | medium | 4 | server | C3, C9 | CLI tool to preview monologue/dialogue line selection for a given game state. Tyre's recommendation for content tuning. Lives in `tooling/`. Helps content authors test prerequisite logic without running the full game. | + +--- + +## 5. Sprint Plan + +### Sprint 3: Know (Copy Team — Content Foundation) + +**Goal:** Deliver the content specs and wiki fixes that unblock server implementation and content authoring. + +| Priority | Ticket | Title | Owner Hint | Effort | +|----------|--------|-------|------------|--------| +| **P0** | **#261** | **Dual Lens Authoring Guide** | **Paula** | **Large** | +| **P0** | **C1** | **Content directory structure design** | **Tyre/Gestalt** | **Medium** | +| P0 | A1 | Apply canonical full names | Paula | Small | +| P0 | A2 | Hael → Naia Tamm rename | Paula | Small | +| P0 | A7 | Smuggler entity attributes | Paula | Small | +| P1 | B2 | MIRROR pattern spec | Gestalt/Gore | Medium | +| P1 | B4 | Smuggler voice + moral arc (subsumes #310) | Gore/Mellanie | Medium | +| P1 | NEW-1 | Apply Gestalt's NPC pattern mapping | Gestalt | Small | +| P1 | NEW-5 | Wow moment content checklist | SI | Small | +| P1 | A10 | Nils Davan stub | Paula | Small | +| P1 | A11 | Triangle 1 fix | Gestalt/Paula | Medium | +| P2 | B3 | PC-as-NPC spec | Gestalt/Paula | Medium | +| P2 | A8 | Shortcode fix | Mellanie | Small | +| P2 | NEW-2 | Drin Tier 2 profile expansion | Paula | Small | +| P2 | NEW-7 | Interaction verb spec | Gestalt | Small | + +**Sprint 3 copy total: 15 tickets (2 P0, 6 P1, 5 P2, 2 small enough to parallelize)** + +### Sprint 3: Know (Server Team — Content-Adjacent, Proposed Additions) + +| Priority | Ticket | Title | Effort | +|----------|--------|-------|--------| +| P1 | C2 | Create content/ directory skeleton | Small | +| P1 | C3 | Content schema definitions | Medium | +| P1 | NEW-9 | Multi-verb interaction architecture — InteractionOptions | Medium | +| P2 | NEW-11 | Pause system — tick rate scaling | Small | + +### Sprint 3: Know (Client Team — Proposed Additions) + +| Priority | Ticket | Title | Effort | +|----------|--------|-------|--------| +| P1 | NEW-10 | Multi-verb interaction — extensible prompt | Medium | +| P2 | NEW-12 | Pause system — client state machine | Small | + +### Sprint 4 (Content Conversion + Authoring Begins) + +| Ticket | Title | Team | Blocked By | +|--------|-------|------|------------| +| NEW-3 | Wiki → YAML conversion (17 NPCs) | copy | C1, C2, C3 | +| C4 | Enum YAMLs from D-035 | server | C2 | +| C5 | Entity-attributes YAML | server | C2 | +| C6 | Pools YAML | server | C2 | +| C7 | Social site template YAMLs | server | C2 | +| C8 | Triangle YAMLs | server | C2 | +| C9 | validate-content CLI | server | C3 | +| C10 | Pre-commit FactId check | ci | — | +| A6 | Smuggler FactId progression text | copy | B4 | +| A12 | Environmental text examples | copy | A3/#319 | +| B5 | PC NPC-format briefs | copy | B3 | +| D4 | News ticker headlines (~20) | copy | — | +| #306 | News ticker content (align with D4) | copy | — | +| D2 | Seed configuration schema | server | — | +| NEW-8 | YAML → RON converter | server | C1 | +| NEW-13 | Line previewer CLI | server | C3, C9 | +| #326 | YAML content loader | server | C1, C2 | +| A3/#319 | Krenn brief + seed.yaml reference | copy | — | + +### Sprint 5+ (Content at Scale) + +| Ticket | Title | Team | Blocked By | +|--------|-------|------|------------| +| NEW-4 | Monologue content pool (~200 lines) | copy | #261, B4 | +| NEW-6 | PC-as-NPC content authoring (~25 items) | copy | B3, B5 | +| B1 | NPC Authoring Style Guide (generator spec) | copy | A3, A4, A7, B2, B4 | +| A4 | Regional style guide / seed.yaml template | copy | — | +| A9 | Thematic Question field (Tier 1 profiles) | copy | B2 | +| #297 | THE FRIEND: Kael content pack | copy | #261 | +| #298 | THE FRIEND: Sera content pack | copy | #261 | +| #190 | Workplace content pack | copy | #261 | +| #191 | Bar content pack | copy | #261 | +| #192 | Smuggling ring content pack | copy | #261 | + +--- + +## 6. Revised Dependency Chain + +``` +SPRINT 3 — Two Parallel Critical Chains +======================================== + +Chain 1: Content Authoring Pipeline +------------------------------------ +#261 (Dual Lens Guide) [P0, CRITICAL PATH ROOT] + ├── blocks B4 (Smuggler voice + moral arc) [Sprint 3] + │ ├── blocks A6 (Smuggler FactId text) [Sprint 4] + │ └── blocks NEW-4 (Monologue pool) [Sprint 5] + ├── blocks #297 (FRIEND: Kael) [Sprint 5] + ├── blocks #298 (FRIEND: Sera) [Sprint 5] + ├── blocks #299 (Opening hook: smuggler) [Sprint 5] + ├── blocks #300 (Opening hook: detective) [Sprint 5] + └── blocks #190, #191, #192 (Content packs) [Sprint 5] + +A7 (Smuggler attributes) [P0, Sprint 3] + ├── blocks B4 (Smuggler voice) [Sprint 3] + └── blocks B3 (PC-as-NPC spec) [Sprint 3] + └── blocks B5 (PC briefs) [Sprint 4] + └── blocks NEW-6 (PC-as-NPC authoring) [Sprint 5] + +Chain 2: Content Architecture Pipeline +--------------------------------------- +C1 (Content dir design) [P0, Sprint 3] + ├── blocks C2 (skeleton) [Sprint 3, server] + │ ├── blocks C4 (enums) [Sprint 4] + │ ├── blocks C5 (entity attrs) [Sprint 4] + │ ├── blocks C6 (pools) [Sprint 4] + │ ├── blocks C7 (templates) [Sprint 4] + │ ├── blocks C8 (triangles) [Sprint 4] + │ ├── blocks NEW-3 (wiki→YAML) [Sprint 4] + │ └── blocks #326 (YAML loader) [Sprint 4] + ├── blocks C3 (schemas) [Sprint 3, server] + │ ├── blocks C9 (validator) [Sprint 4] + │ ├── blocks NEW-3 (wiki→YAML) [Sprint 4] + │ └── blocks NEW-13 (line previewer) [Sprint 4] + └── blocks NEW-8 (RON converter) [Sprint 4] + +Independent Chains (Sprint 3) +------------------------------ +B2 (MIRROR spec) → A9 (Thematic Question) [Sprint 4] +A10 (Nils stub) → A11 (Triangle 1 fix) [Sprint 3] +NEW-9 (InteractionOptions, server) → NEW-10 (Extensible prompt, client) [Sprint 3] +NEW-11 (Tick rate scaling, server) → NEW-12 (Pause state machine, client) [Sprint 3] +``` + +--- + +## 7. Ticket Count Summary + +| 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) | 6 | server (4), client (2) | +| **Total new tickets** | **38** | copy (21), server (13), client (2), ci (1), + 1 epic update | +| Existing ticket updates | 10 | — | + +**Delta from Round 1:** +6 tickets (NEW-8 through NEW-13 from lead decisions), +2 server Sprint 3 additions (NEW-9, NEW-11), +2 client Sprint 3 additions (NEW-10, NEW-12). Removed: D3 (killed), A5 (deferred), D1 (deferred). Merged: A3 into #319, #310 into B4. + +--- + +## 8. Risks & Recommendations + +**Risk 1: #261 is still the critical path root.** Every content authoring ticket flows through it. If it slips even one sprint, the entire content pipeline delays. Recommend: assign Paula immediately, time-box to 5 working days, accept "good enough" over "perfect." + +**Risk 2: Sprint 3 copy team has 15 tickets.** That's a lot. But 7 are small tasks (A1, A2, A7, A8, A10, NEW-1, NEW-2) that can be parallelized. The real load is #261, C1, B2, B4, and A11. Recommend: Paula owns #261 + wiki fixes (A1, A2, A7, A10, NEW-2). Gestalt owns C1, NEW-1, B2, A11, NEW-7. Mellanie owns A8, B4. SI owns NEW-5. + +**Risk 3: Server team Sprint 3 is already heavy** (10 existing tickets). Adding C2, C3, NEW-9, NEW-11 is +4. Recommend: C2 and C3 are blocked by C1 anyway — they can start mid-sprint when C1 lands. NEW-9 and NEW-11 are independent and can begin immediately. + +**Risk 4: Content conversion (NEW-3) is a Sprint 4 bottleneck.** Tyre estimates 2-3 full days for 17 NPC conversions. This blocks the server from testing with real data. Recommend: start with the 3 Tier 1 NPCs (Kael, Sera, Naia) as soon as C2 lands, don't wait for all 17. + +--- + +*Proposals only — no tickets created. Awaiting lead approval.* +*Compiled by SI. Source: Round 1 tracking doc (Qatux), all 7 Round 1 responses, lead Round 2 decisions.* diff --git a/docs/workshops/v01-content-scoping/round2-stig.md b/docs/workshops/v01-content-scoping/round2-stig.md new file mode 100644 index 000000000..a3a8b1a53 --- /dev/null +++ b/docs/workshops/v01-content-scoping/round2-stig.md @@ -0,0 +1,375 @@ +# Round 2 Response: Stig (UI Developer) +## v0.1 Content Scoping Workshop + +--- + +## Task 1: Single-Action Prompt Designed for Multi-Verb Extension + +The lead confirmed: v0.1 ships single-action. Multi-verb is v0.2. I need to design the prompt system so the upgrade path is clean — no throwaway architecture. + +### How it works in v0.1 + +The server sends an `InteractionOptions` payload per entity when the player enters interaction range. v0.1 format: + +``` +InteractionOptions { + entity_id: "kael_davan", + display_name: "Kael Davan", + primary: { verb: "Talk", keybind: "E" }, + secondary: null +} +``` + +The client renders: + +``` + [E] Talk + Kael Davan + [====] +``` + +One prompt. One key. The player approaches, reads, presses. Done. + +**For objects:** +``` +InteractionOptions { + entity_id: "manifest_terminal_03", + display_name: "Manifest Terminal", + primary: { verb: "Examine", keybind: "E" }, + secondary: null +} +``` + +Renders as: +``` + [E] Examine + Manifest Terminal + [====] +``` + +Same pattern. The verb changes. The keybind stays the same. The player learns one input: "E means interact." + +### How it extends to v0.2 (multi-verb) + +The server payload grows: + +``` +InteractionOptions { + entity_id: "kael_davan", + display_name: "Kael Davan", + primary: { verb: "Talk", keybind: "E" }, + secondary: { verb: "Observe", keybind: "F" }, + actions: [ + { verb: "Talk", keybind: "E" }, + { verb: "Observe", keybind: "F" } + ] +} +``` + +The client renders both: + +``` + [E] Talk [F] Observe + Kael Davan + [====] +``` + +**What changes in the client:** +- The prompt renderer reads `actions[]` instead of just `primary` +- Layout goes from single-label to horizontal label row +- Keybind display pluralizes + +**What does NOT change:** +- The prompt's position (world-space, entity-tracked) +- The fade behavior (proximity-triggered) +- The input routing (keybind → server action request) +- The overall visual language (bracket-key + verb) + +**The v0.1 client code:** + +```gdscript +# InteractionPrompt.gd + +func update_prompt(options: InteractionOptions) -> void: + if options == null: + hide() + return + + # v0.1: show primary action only + # v0.2: iterate options.actions[] for multi-label + _label.text = "[%s] %s" % [options.primary.keybind, options.primary.verb] + _name_label.text = options.display_name + + _target_entity = options.entity_id + show() +``` + +The `options.actions[]` field exists in the protocol from day one. The v0.1 client ignores it. The v0.2 client reads it. No protocol change needed. + +### Architectural notes for Dudley/Tyre + +The `InteractionOptions` should be part of the `ObserverSnapshot` update — not a separate message. When the player is near an entity, the snapshot includes the interaction payload. When they move away, it's `null`. The client never requests interaction options — they arrive passively as part of perception. + +This means the server's `InteractionResolver` system evaluates available actions every tick for entities in the player's interaction radius. In v0.1 that's a simple lookup (NPC → Talk, Object → Examine). In v0.2 it evaluates relationship state, knowledge, and context to determine the full action set. + +**For Gestalt's Examine-vs-Talk question:** The server models both verbs internally from v0.1 onward. It just surfaces only the primary one to the client. If the server determines that "Observe" is more relevant than "Talk" at a given moment (e.g., player has already talked to this NPC this shift, or NPC is currently in an anomalous state), the server can swap the primary. Single-action doesn't mean single-verb-forever — it means the server picks the best one. + +--- + +## Task 2: Pause System State Machine + +Three states. Clean transitions. No ambiguity. + +### States + +``` +RUNNING ← normal gameplay, full sim speed +OVERLAY_ACTIVE ← UI overlay open (knowledge panel, dialogue), 50% sim speed +PAUSED ← spacebar pause, 0% sim speed +``` + +### Transitions + +``` + [Tab] [Space] + RUNNING ──────────────> OVERLAY_ACTIVE ──────────────> PAUSED + ^ | | + | [Tab] | [Space] | + +────────────────────────+ | | + | | | + +─────────────────────────────────────+ | + | [Space] | + +─────────────────────────────────────────────────────+ +``` + +### Rules + +| Input | From RUNNING | From OVERLAY_ACTIVE | From PAUSED | +|-------|-------------|--------------------|-| +| **[Space]** | → PAUSED | → PAUSED | → previous state (RUNNING or OVERLAY_ACTIVE) | +| **[Tab]** (knowledge panel) | → OVERLAY_ACTIVE | → RUNNING (closes panel) | → PAUSED + OVERLAY_ACTIVE (panel opens, stays paused) | +| **[E]** (interaction/dialogue) | → OVERLAY_ACTIVE (if dialogue starts) | stays OVERLAY_ACTIVE | no effect | +| **[Esc]** | no effect | → RUNNING (closes overlay) | → previous state | + +**Key behaviors:** + +1. **Spacebar is king.** It always toggles to/from PAUSED. Period. No other input overrides spacebar. If the player is in dialogue and hits space, the game pauses with the dialogue still visible. + +2. **Overlay = 50% speed, not 0%.** When the knowledge panel is open, the world still breathes. NPCs still move (slowly). Time still passes (slowly). This prevents the knowledge panel from becoming a freeze-frame intelligence tool. The player can check their notes, but the world doesn't wait. + +3. **Spacebar from OVERLAY_ACTIVE goes to PAUSED, not RUNNING.** If I'm reading my knowledge panel and I want the world to stop completely, I hit space. I don't have to close the panel first. Conversely, hitting space from PAUSED with an overlay open returns to OVERLAY_ACTIVE (50% speed with panel still visible), not RUNNING. + +4. **Dialogue is an overlay.** When in conversation, sim runs at 50%. NPCs outside the conversation keep moving. This means: while you're talking to Kael, Sera might leave the bar. You could miss it. That's the game. If you want to freeze everything, pause. + +5. **Multiple overlays don't stack speed reductions.** If dialogue is active (50%) and the player opens the knowledge panel (also 50%), sim stays at 50%. Not 25%. + +### Implementation (client-side) + +```gdscript +# PauseManager.gd +enum SimState { RUNNING, OVERLAY_ACTIVE, PAUSED } + +var _state: SimState = SimState.RUNNING +var _pre_pause_state: SimState = SimState.RUNNING +var _active_overlays: int = 0 # count of open overlays + +func _input(event: InputEvent) -> void: + if event.is_action_pressed("pause"): # spacebar + _toggle_pause() + elif event.is_action_pressed("knowledge_panel"): # tab + _toggle_knowledge_panel() + +func _toggle_pause() -> void: + if _state == SimState.PAUSED: + _set_state(_pre_pause_state) + else: + _pre_pause_state = _state + _set_state(SimState.PAUSED) + +func _toggle_knowledge_panel() -> void: + if _knowledge_panel_open: + _close_knowledge_panel() + else: + _open_knowledge_panel() + +func _open_knowledge_panel() -> void: + _knowledge_panel_open = true + _active_overlays += 1 + if _state == SimState.RUNNING: + _set_state(SimState.OVERLAY_ACTIVE) + # if PAUSED, stay PAUSED — panel opens visually but sim doesn't resume + +func _close_knowledge_panel() -> void: + _knowledge_panel_open = false + _active_overlays -= 1 + if _active_overlays == 0 and _state == SimState.OVERLAY_ACTIVE: + _set_state(SimState.RUNNING) + +func _set_state(new_state: SimState) -> void: + _state = new_state + match new_state: + SimState.RUNNING: + Engine.time_scale = 1.0 + SimState.OVERLAY_ACTIVE: + Engine.time_scale = 0.5 + SimState.PAUSED: + Engine.time_scale = 0.0 +``` + +### Question for Dudley + +Does the server need to know about pause state? If the client sets `Engine.time_scale = 0.0`, does the server keep ticking and the client just stops rendering? Or does the client need to signal the server to pause its tick loop? + +For single-player (v0.1), I think the client controls this entirely. The server runs as a subprocess — if the client freezes its consumption of server ticks, the server's output buffer fills and it naturally stalls. But this depends on the IPC design. Dudley should confirm. + +For the 50% overlay speed: does the client request half-speed ticks from the server, or does it receive full-speed ticks and render every other one? I lean toward the client setting the tick request rate. Cleaner. + +--- + +## Task 3: Monologue Display Constraints (Confirmed) + +Mellanie needs hard numbers. Here they are. + +### Display constraints + +| Parameter | Value | Rationale | +|-----------|-------|-----------| +| **Max characters** | 160 | Two lines at ~80 chars/line at reference font size. Fits 40% viewport width. | +| **Max lines** | 2 | One breath. Monologue competes with gameplay — the player is moving, looking, deciding. Two lines is a glance. Three is a paragraph. | +| **Display duration (base)** | 4.0 seconds | Long enough to read 160 characters at comfortable pace (~40 chars/sec reading speed for on-screen text). | +| **Display duration (short, <80 chars)** | 3.0 seconds | Short lines don't need 4 seconds. Scale linearly. | +| **Display duration (urgent chime)** | 5.0 seconds | Anomaly observations deserve an extra beat. The player needs time to register that something changed. | +| **Fade in** | 0.3 seconds | Fast enough to not feel laggy. Slow enough to not pop. | +| **Fade out** | 0.5 seconds | Slightly slower than fade-in. The thought lingers. | +| **Interruption fade** | 0.15 seconds | When a new monologue replaces the current one, the old one exits fast. No collision. | +| **Cooldown between lines** | 2.0 seconds minimum | Two monologues back-to-back feel like a data dump. The gap is where the player absorbs. | +| **Max queue depth** | 1 | If two triggers fire simultaneously, the higher-priority one displays and the other is dropped. No stacking, no scroll-back. The character's mind moves on. | + +### Priority ordering (when two triggers fire at once) + +``` +1. observe_anomaly ← the game is telling you something important +2. witness_interaction ← the game is telling you something happened +3. discover_evidence ← you found something +4. post_conversation ← reaction to what just happened +5. hear_sound ← environmental awareness +6. observe_npc ← identification / emotional reaction +7. enter_location ← atmospheric +8. return_visit ← atmospheric +9. time_idle ← lowest — reflective, only when nothing else is happening +``` + +`observe_anomaly` always wins. If THE FRIEND's contradiction fires at the same time as an `enter_location` line, the contradiction shows. The atmospheric line is gone. The player will never know it existed. That's fine — the important thing happened. + +### What Mellanie should write to + +**Target:** 80-120 characters for most lines. 160 is the hard maximum — use it rarely. The best monologue lines are 40-80 characters. One punchy thought. + +Examples from the authoring guide, with character counts: + +- `"Morning shift. Recycled air and cargo lubricant. Home sweet home."` — 66 chars. Perfect. One line, one breath. +- `"Kael's here. Good — I was starting to worry."` — 47 chars. Even better. Fast, emotional. +- `"Dock worker Davan — lattice activity spiked. Three pings in two minutes. Expecting a message? Or checking for surveillance?"` — 124 chars. This pushes into line 2 but earns it — the detective's analytical voice needs the full thought. +- `"He looked left. He always looks left when he's making something up. Two years I've known that tell. Kael is lying to me."` — 121 chars. This is a climax moment. Two lines justified. + +**Rule of thumb:** If it fits on one line (~80 chars), it should be one line. Two lines are for moments that matter. + +### Font specification (for reference) + +Monologue text at reference resolution (1920x1080): +- **Font:** Clean sans-serif (Godot default or a custom face — Araminta's call) +- **Size:** 18-20px equivalent +- **Line height:** 1.4x +- **Max width:** 40% of viewport = ~768px at 1920 wide +- **At 18px, ~80 characters fit in 768px** with standard proportional font metrics + +This gives comfortable readability at typical viewing distance. Not tiny, not shouting. The text whispers. + +### Monologue during dialogue + +When a dialogue panel is active, monologue can still fire (e.g., `observe_anomaly` while in conversation). The monologue display shifts up to sit above the dialogue panel: + +``` +Normal state: ++------------------------------------------------------------------+ +| | +| GAME WORLD | +| | +| +--monologue----------------------------+ | +| | Kael's here. Good. | | +| +----------------------------------------+ | +| | ++------------------------------------------------------------------+ + +During dialogue: ++------------------------------------------------------------------+ +| | +| GAME WORLD | +| | +| +--monologue----------------------------+ | +| | That's not anyone from our rotation. | | +| +----------------------------------------+ | ++------------------------------------------------------------------+ +| KAEL DAVAN | +| "Just a friend. Don't worry about it." | +| [Continue] [End] | ++------------------------------------------------------------------+ +``` + +The monologue sits in the world layer. The dialogue sits in the HUD layer. They don't overlap. The player reads dialogue first (larger, centered, paneled), catches monologue peripherally (smaller, left, ghostly). Two voices — one external, one internal — simultaneously. + +This is critical for Wow Moment #3. The contradiction fires monologue WHILE the player might be in conversation. The internal "What the hell?" happens at the same moment as the external smooth deflection. The UI must support both without making the player choose which to read. + +--- + +## Responses to Round 1 Open Questions (Answered by Lead Decisions) + +### D-04 (Examine vs Talk) — Resolved + +Lead decision: conceptually separate, v0.1 ships single-action. Covered in Task 1 above. The server models both verbs; the client surfaces one. Extensible to multi-verb in v0.2 without protocol changes. + +### D-05 (Knowledge Panel Pause) — Resolved + +Lead decision: 50% sim speed for overlays, spacebar always pauses. Covered in Task 2 above. + +### Client text delivery — Resolved (A-12, proposed D-048) + +Server sends full text, client renders. Confirmed by lead and tracking doc. No local content loading on the client. + +--- + +## Updated UI Bill of Materials (incorporating Round 2 decisions) + +| System | Scenes | Scripts | Shaders | Priority | Notes | +|--------|--------|---------|---------|----------|-------| +| **Monologue renderer** | 1 | 1 | 0 | P0 | Fade, timing, priority queue, character tint | +| **Interaction prompt** | 1 | 1 | 0 | P0 | World-space tracking, single-action (extensible to multi) | +| **Dialogue panel** | 1 | 1 | 0 | P0 | Semi-transparent, text advance, exit handling | +| **Entity color system** | 0 | 1 | 1 | P0 | D-033 palette, 0.5s fade transitions | +| **Pause manager** | 0 | 1 | 0 | P0 | State machine: RUNNING / OVERLAY / PAUSED | +| **HUD bar** | 1 | 1 | 0 | P1 | Location + time phase. Placeholder text in v0.1 | +| **Minimap** | 1 | 1 | 1 | P1 | Insert-style, player dot + area bounds | +| **Knowledge panel** | 1 | 1 | 0 | P1 | Right-side overlay, People/Places/Observations | +| **News ticker** | 1 | 1 | 0 | P1 | World-space scrolling text on bar display entity | +| **Fog rendering** | 0 | 0 | 1 | P0 | Shared with server team (shadowcast → visual) | +| **TOTAL** | **7** | **9** | **3** | | | + +Reduced from 9 scenes to 7 (pause manager and entity colors don't need dedicated scenes). Added 1 shader (fog rendering confirmed as client-side). + +--- + +## Dependencies I'm Waiting On + +| From | What I Need | Blocks | +|------|-------------|--------| +| **Dudley** | IPC message format — specifically `ObserverSnapshot` structure for interaction options, monologue payloads, dialogue payloads. | Interaction prompt, dialogue panel, monologue renderer | +| **Dudley** | Pause architecture — does client control sim speed, or does it signal the server? | Pause manager | +| **Tyre** | `ObserverSnapshot` v3 protocol spec (Round 2 task for Tyre). | Everything that reads server state | +| **Araminta** | Font selection, diegetic styling direction for knowledge panel. | Knowledge panel visual treatment | +| **Mellanie** | First monologue content (even 5-10 lines) for integration testing. | Monologue renderer testing | + +I can build all UI scaffolding with mock data. But integration testing needs real payloads from the server and real text from Mellanie. The sooner those arrive, the sooner we know if the display constraints actually feel right at runtime. + +--- + +*Spacebar always pauses. Everything else fades in when needed and disappears when it's done.* diff --git a/docs/workshops/v01-content-scoping/round2-tracking.md b/docs/workshops/v01-content-scoping/round2-tracking.md new file mode 100644 index 000000000..5371daf17 --- /dev/null +++ b/docs/workshops/v01-content-scoping/round2-tracking.md @@ -0,0 +1,594 @@ +# 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` | `Vec` | Agreed (naming differs) | +| `active_dialogue` | `Option` | `Option` | Agreed | +| `monologue` | `Vec` | `Vec` | Agreed | +| `overheard` | `Vec` | `Vec` | Agreed (naming differs) | +| `knowledge_updates` | `Vec` | Not in Dudley's R2 snapshot | Tyre adds delta updates | +| `examine_result` | `Option` | Not in Dudley's R2 snapshot | Tyre adds | +| `ticker_headlines` | `Vec` | 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.* diff --git a/docs/workshops/v01-content-scoping/round2-tyre.md b/docs/workshops/v01-content-scoping/round2-tyre.md new file mode 100644 index 000000000..2a8165356 --- /dev/null +++ b/docs/workshops/v01-content-scoping/round2-tyre.md @@ -0,0 +1,1154 @@ +# Round 2 — Tyre (Technical Architect) +## v0.1 Content Scoping Workshop + +Four tasks from the lead. Let me work through them. + +--- + +## Task 1: Finalized Content Directory YAML Structure + Schema Snippets + +YAML confirmed. Here's the finalized structure with actual JSON Schema definitions for the core content types. These schemas are the contract between copy (authoring) and server (loading). + +### Final Directory Tree + +``` +content/ + content.yaml # Manifest: district list, content version, load order + schema/ # JSON Schema definitions for YAML validation + npc-profile.schema.json + location.schema.json + fact-catalog.schema.json + district.schema.json + dialogue-pool.schema.json + monologue-pool.schema.json + routine.schema.json + triangle.schema.json + global/ # District-independent vocabulary + facts/ + contraband.yaml + location.yaml + investigation.yaml + world.yaml + relationship.yaml + progress.yaml + factions/ + lattice-commission.yaml + syndics.yaml + the-ring.yaml + concord-assembly.yaml + guardians-of-autonomy.yaml + veil-institute.yaml + the-unbound.yaml + enums/ + situations.yaml # 13 situation values (D-035) + topics.yaml # 9 topic values + moods.yaml # 8 mood values + access-tiers.yaml # public, insider, authority, peer, hostile + trust-tiers.yaml # surface, real, secret + triggers.yaml # 9 monologue trigger types + patterns.yaml # 9 thematic patterns (System A) + motivations.yaml # 6 functional motivations (System B) + entity-schema/ + attributes.yaml # 14 canonical EntityKnowledge keys + districts/ + sova-transit/ + district.yaml + npcs/ + kael-davan.yaml + sera-venn.yaml + voss.yaml + lera-sessik.yaml + torek-lintar.yaml + devra.yaml + maret-korr.yaml + resha.yaml + naia-tamm.yaml + renn.yaml + pell.yaml + harek.yaml + drin.yaml + sess.yaml + olin.yaml + sabel.yaml + tav.yaml + locations/ + the-terminal.yaml + the-last-shift.yaml + maintenance-corridors.yaml + triangles/ + hub-power.yaml + worried-knowledge.yaml + bar-tensions.yaml + worried-partner.yaml + informant-question.yaml + dialogue/ + the-terminal/ + dock-worker.yaml + shift-supervisor.yaml + scheduler.yaml + new-hire.yaml + courier.yaml + the-last-shift/ + bar-owner.yaml + bartender.yaml + bar-regular.yaml + maintenance-corridors/ + ring-operative.yaml + monologue/ + smuggler/ + the-terminal.yaml + the-last-shift.yaml + maintenance-corridors.yaml + general.yaml + detective/ + the-terminal.yaml + the-last-shift.yaml + maintenance-corridors.yaml + general.yaml + routines/ + schedules.yaml +``` + +### Schema: Content Manifest + +```yaml +# content/content.yaml +version: "0.1.0" +districts: + - id: "sova-transit" + path: "districts/sova-transit" + enabled: true +``` + +### Schema: NPC Profile (`npc-profile.schema.json`) + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "NpcProfile", + "description": "NPC content profile for The Settled Reach. Maps to server NpcBundle.", + "type": "object", + "required": ["canonical_id", "display_name", "short_name", "tier", "pattern", "motivation", "district", "axes", "initial_attributes"], + "properties": { + "canonical_id": { + "type": "string", + "pattern": "^npc:[a-z0-9-]+$", + "description": "Stable content address. Format: npc:{slug}" + }, + "display_name": { "type": "string", "minLength": 1 }, + "short_name": { "type": "string", "minLength": 1 }, + "tier": { "enum": [1, 2, 3] }, + "pattern": { + "enum": ["FRIEND", "MIRROR", "ANCHOR", "GHOST", "CATALYST", "THRESHOLD", "REMNANT", "SYSTEM", "NOBODY"] + }, + "motivation": { + "enum": ["HANDLER", "WITNESS", "TURNCOAT", "CIVILIAN", "OPERATOR", "SKEPTIC"] + }, + "district": { "type": "string" }, + "axes": { + "type": "object", + "required": ["want", "secret", "relationships", "tolerance", "routine", "information", "contentment"], + "properties": { + "want": { "type": "string" }, + "secret": { + "type": "object", + "required": ["surface"], + "properties": { + "surface": { "type": "string" }, + "deep": { "type": "string" } + } + }, + "relationships": { + "type": "array", + "items": { + "type": "object", + "required": ["target", "kind", "trust"], + "properties": { + "target": { + "type": "string", + "pattern": "^npc:[a-z0-9-]+$", + "description": "canonical_id of relationship target" + }, + "kind": { "type": "string" }, + "trust": { "type": "number", "minimum": 0.0, "maximum": 1.0 } + } + } + }, + "tolerance": { + "type": "object", + "required": ["current_stress", "threshold"], + "properties": { + "current_stress": { "type": "number", "minimum": 0.0, "maximum": 1.0 }, + "threshold": { "type": "number", "minimum": 0.0, "maximum": 1.0 } + } + }, + "routine": { + "type": "object", + "required": ["description"], + "properties": { + "description": { "type": "string" } + } + }, + "information": { + "type": "object", + "required": ["known_facts"], + "properties": { + "known_facts": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[a-z_]+\\.[a-z_]+:(Suspects|KnowsOf|KnowsDetails)$", + "description": "Format: fact_id:ConfidenceLevel" + } + } + } + }, + "contentment": { "type": "number", "minimum": 0.0, "maximum": 1.0 } + } + }, + "personality": { + "type": "object", + "properties": { + "traits": { "type": "array", "items": { "type": "string" } } + } + }, + "tells": { + "type": "array", + "items": { + "type": "object", + "required": ["trigger", "behavior"], + "properties": { + "trigger": { "type": "string" }, + "behavior": { "type": "string" } + } + } + }, + "skills": { + "type": "object", + "properties": { + "set": { "type": "array", "items": { "type": "string" } }, + "combat_trained": { "type": "boolean", "default": false } + } + }, + "initial_attributes": { + "type": "object", + "required": ["role", "faction", "species"], + "properties": { + "role": { "type": "string" }, + "faction": { "type": "string" }, + "species": { "type": "string", "default": "human" }, + "routine_pattern": { "type": "string" } + }, + "description": "What a brand-new observer would learn about this NPC on first sight. Maps to EntityKnowledge.known_attributes." + }, + "access_tiers": { + "type": "object", + "properties": { + "default": { "enum": ["public", "insider", "authority", "peer", "hostile"] }, + "overrides": { + "type": "object", + "additionalProperties": { + "enum": ["public", "insider", "authority", "peer", "hostile"] + }, + "description": "canonical_id → access tier overrides" + } + } + }, + "trust_levels": { + "type": "object", + "additionalProperties": { + "enum": ["surface", "real", "secret"] + }, + "description": "canonical_id → trust tier" + }, + "friend_arc": { + "type": "object", + "properties": { + "character": { "enum": ["smuggler", "detective"] }, + "phases": { + "type": "array", + "items": { + "type": "object", + "required": ["name"], + "properties": { + "name": { "enum": ["warmth", "trust", "doubt", "conflict"] }, + "triggers": { "type": "array" } + } + } + }, + "contradiction": { + "type": "object", + "properties": { + "type": { "type": "string" }, + "location": { "type": "string" }, + "expected_location": { "type": "string" }, + "time_window": { "type": "string" } + } + } + }, + "description": "Only present for FRIEND pattern NPCs (Tier 1)" + }, + "triangle_membership": { + "type": "array", + "items": { + "type": "object", + "required": ["triangle_id", "role"], + "properties": { + "triangle_id": { "type": "string" }, + "role": { "type": "string" } + } + } + } + } +} +``` + +### Schema: Dialogue Pool (`dialogue-pool.schema.json`) + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "DialoguePool", + "description": "Tagged dialogue line pool per D-028, D-035.", + "type": "object", + "required": ["role", "location", "lines"], + "properties": { + "role": { "type": "string", "description": "Template-defined role (not NPC name)" }, + "location": { + "type": "string", + "pattern": "^loc:[a-z0-9-]+:[a-z0-9-]+$" + }, + "lines": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "text", "access", "trust", "situation"], + "properties": { + "id": { + "type": "string", + "pattern": "^[a-z_]+_d_[0-9]{3}$", + "description": "{location}_{d}_{###} per D-035" + }, + "text": { "type": "string", "maxLength": 300 }, + "access": { + "type": "array", + "items": { "enum": ["public", "insider", "authority", "peer", "hostile"] }, + "minItems": 1 + }, + "trust": { "enum": ["surface", "real", "secret"] }, + "situation": { + "type": "array", + "items": { + "enum": [ + "arrival", "shift_start", "shift_end", "shift_transition", + "bar_evening", "night_shift", "investigation", "confrontation", + "social", "alone", "emergency", "routine", "observation" + ] + }, + "minItems": 1 + }, + "topic": { + "type": "array", + "items": { + "enum": [ + "colleague", "routine", "cargo", "money", "trust", + "danger", "institution", "personal", "investigation" + ] + } + }, + "mood": { + "type": "array", + "items": { + "enum": [ + "fond", "comfortable", "worried", "suspicious", + "analytical", "conflicted", "concerned", "relieved" + ] + } + }, + "tags": { + "type": "array", + "items": { "type": "string" } + }, + "knowledge_grants": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { "enum": ["learn_fact", "learn_attribute", "update_relationship"] }, + "fact_id": { "type": "string" }, + "confidence": { "enum": ["Suspects", "KnowsOf", "KnowsDetails"] }, + "target": { "type": "string" }, + "key": { "type": "string" }, + "value": { "type": "string" } + } + }, + "description": "Knowledge updates that occur when this line is spoken to the player" + } + } + } + } + } +} +``` + +### Schema: Monologue Pool (`monologue-pool.schema.json`) + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "MonologuePool", + "description": "Tagged monologue line pool per D-032, D-035. Hard-partitioned by character.", + "type": "object", + "required": ["character", "location", "lines"], + "properties": { + "character": { "enum": ["smuggler", "detective"] }, + "location": { "type": "string" }, + "lines": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "text", "trigger"], + "properties": { + "id": { + "type": "string", + "pattern": "^[a-z_]+_m_[sd]_[0-9]{3}$", + "description": "{location}_m_{s|d}_{###}" + }, + "text": { + "type": "string", + "maxLength": 160, + "description": "~160 chars max, 2-line display per Stig's constraint" + }, + "trigger": { + "enum": [ + "enter_location", "observe_npc", "hear_sound", + "observe_anomaly", "post_conversation", "discover_evidence", + "witness_interaction", "time_idle", "return_visit" + ] + }, + "prerequisite": { + "type": ["object", "null"], + "properties": { + "facts": { + "type": "object", + "additionalProperties": { + "enum": ["Suspects", "KnowsOf", "KnowsDetails"] + }, + "description": "FactId → minimum confidence. ALL must be met (AND logic)." + }, + "entity": { + "type": "object", + "properties": { + "target": { "type": "string" }, + "attribute": { "type": "string" }, + "condition": { "type": "string" } + }, + "description": "Entity attribute check. AND with facts if both present." + }, + "relationship": { + "type": "object", + "properties": { + "target": { "type": "string" }, + "min_state": { + "enum": ["Unknown", "Known", "Friendly", "PersonOfInterest", "Hostile"] + } + } + } + }, + "description": "AND-only prerequisite. All specified conditions must be true. Null = always eligible." + }, + "topic": { + "type": "array", + "items": { "type": "string" } + }, + "mood": { + "type": "array", + "items": { "type": "string" } + }, + "tags": { + "type": "array", + "items": { "type": "string" } + }, + "priority": { + "type": "integer", + "minimum": 0, + "maximum": 10, + "default": 5, + "description": "Higher priority lines are preferred when multiple qualify. 0=lowest, 10=critical (wow moments)." + }, + "cooldown": { + "type": "integer", + "minimum": 0, + "description": "Minimum ticks before this line can fire again. 0 = no repeat." + }, + "dual_lens": { + "type": "object", + "description": "Authoring-only. Per-character notes for the content team." + }, + "notes": { + "type": "string", + "description": "Authoring-only. Author intent and context." + } + } + } + } + } +} +``` + +### Schema: Fact Catalog Entry + +```yaml +# content/global/facts/contraband.yaml +category: "contraband" +facts: + - fact_id: "contraband.ring_exists" + description: "A smuggling operation exists in the district" + discoverable_by: ["smuggler", "detective"] + progression: + Suspects: "Something's going on with the cargo schedules." + KnowsOf: "There's a smuggling operation running through the logistics hub." + KnowsDetails: "The ring moves unlicensed lattice components during shift transitions." + abstract: true # Never reaches Direct confidence + + - fact_id: "contraband.lattice_components" + description: "The specific contraband: unlicensed lattice components" + discoverable_by: ["smuggler", "detective"] + progression: + Suspects: "That container's marked as standard, but the mass is wrong." + KnowsOf: "Unlicensed lattice components. Aftermarket mods." + KnowsDetails: "Medical-grade neural lattice replacements plus enhanced capability mods." + Direct: "I'm looking at a crate of lattice components right now." + abstract: false # Can reach Direct if player sees contraband +``` + +### Schema: Schedule + +```yaml +# content/districts/sova-transit/routines/schedules.yaml +schedules: + - npc: "npc:kael-davan" + entries: + - phase: Morning + location: "loc:sova-transit:the-terminal" + tile: { x: 42, y: 18, z: 0 } + activity: "working" + - phase: Afternoon + location: "loc:sova-transit:the-terminal" + tile: { x: 45, y: 20, z: 0 } + activity: "working" + - phase: Evening + location: "loc:sova-transit:the-last-shift" + tile: { x: 80, y: 55, z: 0 } + activity: "drinking" + - phase: Night + location: "loc:sova-transit:residential" + tile: { x: 30, y: 70, z: 0 } + activity: "sleeping" + deviations: + - trigger: "friend_arc.doubt" + phase: Evening + override_location: "loc:sova-transit:maintenance-corridors" + override_tile: { x: 15, y: 8, z: -1 } + override_activity: "meeting_contact" + description: "Kael meets unauthorized contact during shift transition" +``` + +The `deviations` key is load-bearing for THE FRIEND arc. It tells the routine scheduler: "When the FRIEND arc reaches phase X, change Kael's evening location to Corridor B-7." This is how spatial staging works without scripting — the schedule system handles it as a conditional routine override. + +### Validation Pipeline (Finalized) + +``` +AUTHORING TIME (copy team) + └── Author writes YAML in content/ directory + └── IDE/editor with JSON Schema autocomplete (optional) + +BUILD TIME (make content-validate) + ├── JSON Schema validation: check YAML structure against schema files + ├── Cross-reference validation: + │ ├── All canonical_id references resolve to existing files + │ ├── All FactIds in prerequisites reference defined facts + │ ├── All relationship targets exist + │ ├── No duplicate canonical_ids across all files + │ └── Enum values match global/enums/ definitions + └── FAIL if any error — list all errors, don't stop at first + +LOAD TIME (server startup) + ├── serde_yaml deserialization: YAML → Rust structs + │ └── Type mismatch = load failure (serde catches schema drift) + ├── Semantic validation: + │ ├── StableId assignment (deterministic from sorted canonical_ids) + │ ├── Relationship wiring (canonical_id → StableId resolution) + │ └── FriendArc bonding (character reference → StableId) + └── FAIL FAST on any error — no partial loads +``` + +--- + +## Task 2: Multi-Verb Interaction Architecture + +The lead's decision: v0.1 ships single context-sensitive action, but the server models N available actions per entity from day one. Here's how. + +### Core Design: `AvailableActions` per Entity + +```rust +/// What a player can do with a nearby entity. +/// Server computes the full list every tick for entities in interaction range. +/// v0.1 client reads only the primary (priority 0). +/// v0.2 client renders all enabled actions as a verb menu. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AvailableActions { + /// StableId of the target entity + pub target_id: u64, + /// Display name (as known to this observer) + pub display_name: String, + /// All available actions, sorted by priority (0 = highest) + pub actions: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ActionOption { + /// What this action does + pub kind: ActionKind, + /// Prompt text shown to the player: "Talk", "Observe", "Examine" + pub label: String, + /// Sort priority. 0 = primary action (v0.1 default). Lower = higher priority. + pub priority: u8, + /// Is this action currently available? + pub enabled: bool, + /// Why it's disabled (shown as tooltip in v0.2+) + pub disabled_reason: Option, +} + +/// Action types the player can perform on entities. +/// Extensible enum — new variants added in future versions. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum ActionKind { + // v0.1 actions + Talk, + ExamineNpc, + ExamineObject, + // v0.2+ actions (defined now, not surfaced) + // Trade, + // Give, + // Accuse, + // Follow, + // UseOn, +} +``` + +### Priority Resolution (Server-Side) + +The server computes priorities based on entity type, observer state, and game context. This is the "context-sensitive" logic: + +```rust +/// Determine available actions for a target entity given the observer's state. +/// Returns actions sorted by priority (0 = most relevant). +fn compute_actions( + target: &TargetInfo, + observer: &ObserverInfo, + game_state: &GameState, +) -> Vec { + let mut actions = Vec::new(); + + match target.entity_type { + EntityType::Npc => { + // Talk is available if NPC is interactable + if target.is_interactable && !target.is_hostile { + actions.push(ActionOption { + kind: ActionKind::Talk, + label: compute_talk_label(observer, target), + priority: 0, // default primary for NPCs + enabled: true, + disabled_reason: None, + }); + } + + // Examine is available if NPC is in LOS + if target.in_los { + let examine_priority = if observer.has_investigation_context(target) { + 0 // Detective with suspicion → Examine becomes primary + } else { + 1 // Normal → Examine is secondary + }; + actions.push(ActionOption { + kind: ActionKind::ExamineNpc, + label: "Observe".to_string(), + priority: examine_priority, + enabled: true, + disabled_reason: None, + }); + } + + // If NPC is hostile, Talk is disabled but visible + if target.is_hostile { + actions.push(ActionOption { + kind: ActionKind::Talk, + label: "Talk".to_string(), + priority: 1, + enabled: false, + disabled_reason: Some("Hostile".to_string()), + }); + } + } + + EntityType::Object => { + actions.push(ActionOption { + kind: ActionKind::ExamineObject, + label: compute_examine_label(target), + priority: 0, + enabled: true, + disabled_reason: None, + }); + } + } + + // Sort by priority, stable ordering for determinism + actions.sort_by_key(|a| a.priority); + actions +} + +/// Context-sensitive talk label. +/// Changes based on relationship state and investigation progress. +fn compute_talk_label(observer: &ObserverInfo, target: &TargetInfo) -> String { + match observer.relationship_to(target) { + RelationshipState::PersonOfInterest => "Question".to_string(), + RelationshipState::Hostile => "Confront".to_string(), + _ => "Talk".to_string(), + } +} +``` + +### How the Detective's Loop Works + +Gestalt's design: detective examines first (accumulate tells), talks later (use evidence). The priority system supports this naturally: + +1. **Default state:** Talk = priority 0, Observe = priority 1. Player approaches NPC, sees "[E] Talk". +2. **After knowledge graph flags PersonOfInterest:** `has_investigation_context()` returns true. Observe = priority 0, Talk (now labeled "Question") = priority 1. Player approaches flagged NPC, sees "[E] Observe". +3. **v0.1:** Client shows only priority 0. The context switch happens automatically. +4. **v0.2:** Client shows both. Player chooses. + +The key insight: **the context-sensitive switch IS the v0.2 multi-verb system operating with a filter.** No throwaway code. v0.2 removes the filter; the rest works. + +### PlayerAction Extension + +```rust +/// Semantic player actions — v3 protocol. +/// InteractPrimary is the v0.1 action (do whatever priority 0 says). +/// InteractWith is the v0.2 action (do a specific thing to a specific target). +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum PlayerAction { + // Movement (unchanged) + MoveNorth, + MoveSouth, + MoveEast, + MoveWest, + MoveNortheast, + MoveNorthwest, + MoveSoutheast, + MoveSouthwest, + + // Interaction (v3) + /// Do the primary (priority 0) action on the nearest interactable target. + /// v0.1 default. Maps to [E] key. + InteractPrimary, + /// Do a specific action on a specific target (v0.2+). + /// Target is StableId. Action is the ActionKind. + InteractWith { target_id: u64, action: ActionKind }, + /// Select a dialogue topic while in active conversation. + DialogueSelect { topic: String }, + /// End the current dialogue. + DialogueEnd, + /// Acknowledge/advance examine result text. + ExamineAdvance, + + // System (unchanged) + UsePerceptionMode(String), + Pause, + Unpause, +} +``` + +**Removed: the old `Interact` variant.** `InteractPrimary` replaces it with the same behavior but clearer semantics. `InteractWith` is defined now but v0.1 client never emits it. + +### Server-Side Pipeline + +``` +Player presses [E] + → Client sends InteractPrimary + → Server: find nearest interactable entity within range + → Compute AvailableActions for that entity + → Execute priority-0 action: + → ActionKind::Talk → enter dialogue state, run D-035 selection pipeline + → ActionKind::ExamineNpc → emit tell observation event, queue examine result text + → ActionKind::ExamineObject → emit examine event, queue description text + → Pack results into ObserverSnapshot v3 + → Client renders result (dialogue panel, examine text, monologue) +``` + +--- + +## Task 3: RON Converter + +### Architecture Decision + +**Dual-format loader with optional build-time compilation.** + +The server content loader supports both YAML and RON via serde. The format is determined by file extension. Content authors write YAML (human-friendly). An optional build step compiles YAML → RON for faster load times. + +### Where It Lives + +``` +server/src/content/ + loader.rs # Content loader — reads YAML or RON based on extension + schema.rs # Rust serde structs (NpcProfile, DialogueLine, etc.) + registry.rs # ContentRegistry: canonical_id → StableId mapping + validate.rs # Semantic validation (cross-references, enum checks) + +tooling/content-tools/ + Cargo.toml # Small Rust binary + src/ + main.rs # CLI: content-tools validate|compile|stats + compile.rs # YAML → RON compiler + validate.rs # Schema validation against JSON Schema + stats.rs # Content statistics (line counts, coverage) +``` + +### When It Runs + +| Context | What Happens | Format Loaded | +|---|---|---| +| **Development (hot-reload)** | Server loads YAML directly. File watcher detects changes, reloads. | YAML | +| **CI / `make content-validate`** | `content-tools validate` runs JSON Schema + serde checks. No format conversion. | YAML (validation only) | +| **Build / `make content-compile`** | `content-tools compile` reads all YAML, writes RON to `content/.cache/`. | YAML → RON | +| **Production / release** | Server loads from `content/.cache/*.ron` if present, falls back to YAML. | RON (preferred) or YAML | + +### Implementation + +The loader is format-agnostic. Approximately 20 lines handle the dual format: + +```rust +use std::path::Path; + +/// Load a content file, auto-detecting format from extension. +pub fn load_content(path: &Path) -> Result { + let bytes = std::fs::read(path)?; + match path.extension().and_then(|e| e.to_str()) { + Some("yaml" | "yml") => { + serde_yaml::from_slice(&bytes).map_err(ContentError::Yaml) + } + Some("ron") => { + ron::de::from_bytes(&bytes).map_err(ContentError::Ron) + } + _ => Err(ContentError::UnsupportedFormat(path.to_path_buf())), + } +} + +/// Load content with RON cache fallback. +/// Checks content/.cache/ for compiled RON first, falls back to YAML. +pub fn load_with_cache( + yaml_path: &Path, + cache_dir: &Path, +) -> Result { + // Try RON cache first + let ron_path = cache_dir.join( + yaml_path.with_extension("ron").file_name().unwrap() + ); + if ron_path.exists() { + return load_content(&ron_path); + } + // Fall back to YAML + load_content(yaml_path) +} +``` + +### Makefile Integration + +```makefile +content-validate: ## Validate content files against schemas + cargo run --manifest-path tooling/content-tools/Cargo.toml -- validate content/ + +content-compile: ## Compile YAML content to RON cache + cargo run --manifest-path tooling/content-tools/Cargo.toml -- compile content/ content/.cache/ + +content-stats: ## Print content statistics + cargo run --manifest-path tooling/content-tools/Cargo.toml -- stats content/ +``` + +### Why Not Build-Time Only? + +Dudley builds with fixture data while copy authors real content. If compilation is required, Dudley can't test until copy delivers YAML AND it gets compiled. Direct YAML loading removes that gate. The RON cache is a performance optimization, not a correctness requirement. + +The `content/.cache/` directory is gitignored. It's local build output, not source content. + +--- + +## Task 4: ObserverSnapshot v2 → v3 Protocol Extension + +### Protocol Evolution Strategy + +The snapshot already has a `version: u8` field. The protocol evolves by: + +1. Incrementing the version number +2. Adding new fields as `Vec` (empty = not present) or `Option` +3. Never removing or reordering existing fields +4. Client checks version, handles unknown fields gracefully + +MessagePack (rmp-serde) handles this naturally — it serializes fields by name, so adding fields doesn't break existing clients. A v2 client reading a v3 snapshot ignores unknown fields. A v3 client reading a v2 snapshot gets empty defaults for new fields. + +### v3 Snapshot Definition + +```rust +/// ObserverSnapshot v3 — extends v2 with interaction, dialogue, monologue, and speed data. +/// The ONLY data structure crossing the client-server boundary (D-020). +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ObserverSnapshot { + /// Protocol version. v3 = 3. + pub version: u8, + /// Simulation tick when this snapshot was produced. + pub tick: u64, + /// Game time data for client HUD display (D-031). + pub game_time: GameTime, + /// Player character's facing direction for vision cone (D-015). + pub player_facing: FacingDirection, + + // --- v2 fields (unchanged) --- + /// All entities visible to the observer (filtered by LOS + vision cone). + pub entities: Vec, + /// Tiles visible to the observer for fog rendering. + pub visible_tiles: Vec, + + // --- v3 additions --- + + /// Current simulation speed multiplier. + /// 1.0 = normal, 0.5 = UI overlay slow-mo (D-PAUSE), 0.0 = paused. + #[serde(default = "default_sim_speed")] + pub sim_speed: f32, + + /// Entities within interaction range with available actions. + /// Empty if no interactable targets nearby. + #[serde(default)] + pub nearby_interactions: Vec, + + /// Active dialogue state. None if not in conversation. + #[serde(default)] + pub active_dialogue: Option, + + /// Monologue lines triggered this tick. + /// Usually 0-1 per tick. Multiple only if pacing allows it. + #[serde(default)] + pub monologue: Vec, + + /// Overheard conversation fragments (proximity-based, D-018). + #[serde(default)] + pub overheard: Vec, + + /// Knowledge panel updates (delta, not full state). + /// Only includes changes since last snapshot the client acknowledged. + #[serde(default)] + pub knowledge_updates: Vec, + + /// Examine result text (if player examined an entity/object this tick). + #[serde(default)] + pub examine_result: Option, + + /// News ticker headlines visible at current location. + /// Empty if not near a Meridian display. + #[serde(default)] + pub ticker_headlines: Vec, +} + +fn default_sim_speed() -> f32 { 1.0 } + +// --- v3 types --- + +/// Interactive entity within range. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct NearbyInteraction { + /// StableId of the interactable entity. + pub entity_id: u64, + /// Display name as known to the observer. + pub display_name: String, + /// Available actions, sorted by priority (0 = primary). + pub actions: Vec, +} + +/// Re-exported from interaction module for wire format. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ActionOption { + pub kind: ActionKind, + pub label: String, + pub priority: u8, + pub enabled: bool, + #[serde(skip_serializing_if = "Option::is_none")] + pub disabled_reason: Option, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum ActionKind { + Talk, + ExamineNpc, + ExamineObject, +} + +/// Active dialogue state sent to client each tick during conversation. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ActiveDialogue { + /// StableId of the NPC in conversation. + pub npc_id: u64, + /// NPC display name. + pub npc_name: String, + /// Relationship color for the speaker name (D-033). + pub relationship_state: RelationshipState, + /// Current NPC line to display. None if waiting for player input. + pub current_line: Option, + /// Available topics the player can raise. Empty if no choices. + pub available_topics: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DialogueLineDisplay { + pub line_id: String, + pub text: String, + pub mood: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TopicOption { + pub topic_id: String, + pub label: String, + pub enabled: bool, +} + +/// Monologue line for client display. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MonologueDisplay { + pub line_id: String, + pub text: String, + pub trigger: String, + /// true for anomaly/contradiction observations → urgent chime (D-038). + pub urgent: bool, +} + +/// Overheard conversation fragment. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct OverheardFragment { + /// StableId of the speaker (if known to observer). + pub speaker_id: Option, + /// Speaker name (if known). "Someone" if unknown. + pub speaker_name: String, + /// Fragment text — NOT the full line. What the listener could make out. + pub fragment: String, +} + +/// Knowledge panel delta update. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct KnowledgeUpdate { + pub update_type: KnowledgeUpdateType, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum KnowledgeUpdateType { + /// Learned a new fact or upgraded confidence. + FactLearned { + fact_id: String, + confidence: String, + /// Human-readable description for the knowledge panel. + display_text: String, + }, + /// Learned something new about an entity. + AttributeLearned { + entity_id: u64, + entity_name: String, + key: String, + value: String, + }, + /// Relationship state changed. + RelationshipChanged { + entity_id: u64, + entity_name: String, + old_state: RelationshipState, + new_state: RelationshipState, + }, +} + +/// Result of examining an entity or object. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ExamineResult { + pub target_id: u64, + pub target_name: String, + /// Examine description text — what the character notices. + pub text: String, + /// Knowledge grants from the examination. + pub knowledge_updates: Vec, +} + +/// News ticker headline for Meridian display. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TickerHeadline { + pub headline_id: String, + pub text: String, + /// Does this headline trigger a monologue? Server handles trigger separately. + pub triggers_monologue: bool, +} +``` + +### Wire Size Estimate + +| Field | Typical v3 Size | Notes | +|---|---|---| +| v2 fields (entities, tiles) | ~2-8 KB | Already measured | +| sim_speed | 4 bytes | Float | +| nearby_interactions | ~50-200 bytes | 0-3 entities × 1-2 actions each | +| active_dialogue | ~100-300 bytes | Only during conversation | +| monologue | ~0-200 bytes | Usually 0-1 per tick | +| overheard | ~0-150 bytes | Rare | +| knowledge_updates | ~0-200 bytes | Delta, usually empty | +| examine_result | ~0-300 bytes | Only when examining | +| ticker_headlines | ~0-400 bytes | Only near Meridian display | +| **v3 overhead** | **~50-1500 bytes** | **On top of v2's 2-8 KB** | + +Total v3 snapshot: ~2-10 KB per tick. At 10 tps, that's 20-100 KB/s over the IPC bridge. Well within budget — localhost MessagePack serialization handles this trivially. Even network (future multiplayer) is fine. + +### What Stig Needs to Know + +**New fields the client should handle in v3:** + +| Field | Client Action | Priority | +|---|---|---| +| `sim_speed` | Display pause indicator if 0.0; dim edges if 0.5 | P0 | +| `nearby_interactions` | Show interaction prompt for `actions[0]` (priority 0 only in v0.1) | P0 | +| `active_dialogue` | Show dialogue panel with NPC name, line text, topic options | P0 | +| `monologue` | Show monologue text, fire chime (urgent flag → urgent chime) | P0 | +| `overheard` | Show as faded text near speaker position (world-space) | P1 | +| `knowledge_updates` | Update knowledge panel if open; flash minimap dot for new entities | P1 | +| `examine_result` | Show examine text in monologue-style display (same panel, different color?) | P0 | +| `ticker_headlines` | Render on world-space Meridian display entity | P1 | + +**Client protocol handling:** +``` +if snapshot.version >= 3: + process nearby_interactions → update interaction prompt + process active_dialogue → update dialogue panel + process monologue → queue monologue display + process overheard → queue overheard display + process knowledge_updates → update knowledge panel + process examine_result → show examine text + process ticker_headlines → update ticker display +``` + +v2 snapshots still work — all new fields have serde defaults (empty vecs, None optionals). + +--- + +## Summary + +1. **Content schemas finalized.** JSON Schema for NPC profiles, dialogue pools, monologue pools. The schema IS the contract between copy and server. Serde validates on load. Copy team can start writing YAML against these schemas immediately. + +2. **Multi-verb architecture designed.** `AvailableActions` per entity with priority-sorted `ActionOption` list. v0.1 client picks priority 0 (context-sensitive single action). v0.2 removes the filter and shows all options. No throwaway code — the full pipeline exists, only the client-side rendering is simplified for v0.1. + +3. **RON converter = dual-format loader + optional build-time compilation.** Loader supports both YAML and RON via serde. `tooling/content-tools` CLI provides `validate`, `compile`, `stats`. Development loads YAML directly (fast iteration). Production ships compiled RON in `.cache/`. ~20 lines of loader code, small CLI tool. + +4. **ObserverSnapshot v3 defined.** Adds interaction options, dialogue state, monologue lines, overheard fragments, knowledge deltas, examine results, ticker headlines, simulation speed. Wire overhead: ~50-1500 bytes per tick on top of v2. Backward compatible via serde defaults. Protocol version bumped to 3. + +Everything here is additive and backward-compatible. The architecture supports v0.1's single-action simplicity while being ready for v0.2's multi-verb expansion. No throwaway. diff --git a/docs/workshops/v01-content-scoping/si-ticket-changes.md b/docs/workshops/v01-content-scoping/si-ticket-changes.md new file mode 100644 index 000000000..d2549d5b2 --- /dev/null +++ b/docs/workshops/v01-content-scoping/si-ticket-changes.md @@ -0,0 +1,295 @@ +# v0.1 Content Scoping — Ticket List (Final) + +**Author:** SI (Project Manager) +**Source:** v0.1 Content Scoping Workshop (Rounds 1-2), Wiki Review Workshop (Round 2 ticket list superseded) +**Status:** Proposals only — awaiting lead approval before database creation + +**Corrections applied (closing round):** +1. C9 → Sprint 3 (same crate as C3) +2. #326 split into Phase 1 (Sprint 3) + Phase 2 (Sprint 4) +3. NEW-9 expanded: proximity detection + `verbs[]` +4. NEW-12 killed (pause is server-only; client sends IPC command) +5. NEW-10 stays separate from #240 (one ticket per team, no shared tickets) +6. NEW-14 added: UI microcopy +7. `verbs[]` rename folded into NEW-7 +8. #237 → #88 dependency added +9. A2 file count: ~16 files (Paula's full cascade) +10. A7 description: specific 4 new keys + 2 renames, 16 total +11. B2 acceptance criteria added +12. NEW-1: Gestalt-Paula synthesis (not Gestalt-only) +13. C1: mod-compatible conventions (no overlay implementation) +14. #86 ECS component list updated to workshop output + +--- + +## Existing Ticket Updates + +| ID | Title | Action | Sprint | +|----|-------|--------|--------| +| #368 | Knowledge vocabulary for v0.1 content | **Close** — wiki at `docs/wiki/` is the delivered output. | Sprint 2 (done) | +| #369 | Wiki Review Workshop Outputs (epic) | **Repurpose** as parent epic for all v0.1 content scoping tickets. Update description to reflect this workshop's scope. | — | +| #301 | Wiki taxonomy and structure | **Assign to copy.** Downscope: Sova district structure only for v0.1. | Sprint 3 | +| #319 | Krenn System wiki entry | **Merge with A3.** Expanded: wiki page + seed.yaml reference implementation. Assign to copy. | Sprint 4 | +| #261 | Dual Lens Authoring Guide | **CRITICAL PATH ROOT.** Assign to copy, owner Paula. Blocks 9 downstream tickets. | Sprint 3 (P0) | +| #310 | Character voice speech patterns | **Subsume into B4.** Close #310 when B4 lands. | Sprint 3 (via B4) | +| #306 | News ticker / Meridian feed content | **Confirm scope:** ~20 dual-lens headlines. Assign to copy. | Sprint 4 | +| #326 | YAML content loader | **Split into two tickets.** Phase 1: loader skeleton + fixture data (Sprint 3, server, blocked by C1+C2+C3). Phase 2: real content loading (Sprint 4, server, blocked by C4-C8 + NEW-3). | Sprint 3 / 4 | +| #86 | Core NPC components | **Update ECS component list** to workshop output: ThematicPattern, FunctionalMotivation, FriendArc, ContentTier, AccessTierMap, TrustLevels, NpcRoutine, MoodState, TriangleMembership, InteractionLog. | Sprint 3 | +| #88 | Daily routine system | **Add dependency:** blocked by #237 (A* pathfinding). Needs NPC routine YAML from content conversion. | Sprint 3 | + +--- + +## New Tickets + +### A. Wiki Content Fixes (copy team) + +| ID | Title | Type | Pri | Sprint | Blocked By | Description | +|----|-------|------|-----|--------|------------|-------------| +| A1 | Apply canonical full names to all NPC wiki pages | task | med | 3 | — | Apply Miri's 12 full names to NPC wiki pages. Update Core Identity blocks, environmental text references (manifests, shift rosters, Commission kiosk). | +| A2 | Rename Hael → Naia Tamm across all wiki files | task | med | 3 | — | Phonetic collision fix (Kael/Hael). Find-and-replace across ~16 files (Paula's full cascade). Triangle 4 becomes Naia-Kael-Sera. Update all relationship references, triangle diagrams, cross-references. | +| A6 | Add smuggler-perspective FactId progression text | task | high | 4 | B4 | Add smuggler-path text for all FactIds where smuggler starts at KnowsDetails or has different knowledge path than detective. | +| A7 | Update entity-attributes.md — smuggler role-perspective keys | task | high | 3 | — | Add 4 new role-perspective keys: `risk_assessment`, `loyalty_assessment`, `position_integrity`, `moral_weight`. Rename `secret_held` → `leverage_held` (broader scope: secrets, debts, promises, obligations). Rename `secret_confidence` → `leverage_confidence`. Update `trust_level` description to absorb `trust_read` scope. All keys are observer→target. Total after update: 16 canonical keys. | +| A8 | Standardize location shortcodes in monologue-guide.md | task | med | 3 | — | Fix hub_m_ → terminal_m_ inconsistency. Canonical shortcodes: terminal, bar, corridor. Add shortcode reference table. Add situation overlap rules and mood exclusivity rules. | +| A10 | Stub NPC profile for Nils Davan (off-stage) | task | med | 3 | — | Minimal off-stage profile: Core Identity, relationship to Kael (siblings), role in ring (upstream pressure), known attributes by other NPCs. | +| A11 | Fix Triangle 1 (Hub Power) — Volume Escalation decision | story | high | 3 | A10 | Add smuggler decision fork: side with Nils (louder signal), side with Voss (internal tension), or split the route (new exposure surface). Each option cascades within T1 only — self-contained, no cross-triangle cascade (A-17). Includes Nils partial presence via lattice message (~5-8 lines). | +| A12 | Create environmental text examples file | task | med | 4 | A3/#319 | Create wiki/authoring/environmental-text-examples.md. 4 text types: bar menu, safety notice, news ticker cycle, corridor graffiti. Krenn-voiced with cultural notes + monologue pairings (smuggler + detective). Needed for wow moment #1 (Arrival). | + +### B. Style Guides & Specs (copy team) + +| ID | Title | Type | Pri | Sprint | Blocked By | Description | +|----|-------|------|-----|--------|------------|-------------| +| B1 | NPC Authoring Style Guide | story | crit | 5 | A3, A4, A7, B2, B4 | Combined document: tier templates (Paula), authoring rules (Mellanie conventions, Gestalt constraints, Ozzie anchor line), regional culture (Miri), content pipeline (Tyre). Reframed as generator specification — this IS the NPC generator input format. Most complex ticket; many blockers. | +| B2 | THE MIRROR pattern spec | story | high | 3 | — | Define honest-character NPC pattern. No contradiction arc, no secret, no tell. Tier 1 emotional depth. **v0.1 acceptance criteria:** Pattern definition with mechanical rules, content requirements (50-70 lines, 10-axis profile), tell system rules (MIRROR has none), Naia Tamm as reference implementation. Output becomes generator template. | +| B3 | PC-as-NPC unified spec | story | high | 3 | A7 | Unified spec: starting knowledge graph, starting relationship map, reverse knowledge (bidirectional — Gestalt's critical insight), orientation monologue (Ozzie's first 60 seconds), agency boundaries, authored relationship stubs (Gore's requirement), tell inversion. 9-step conversion checklist for content authors. v0.1 scope: 2 PC briefs (smuggler, detective). | +| B4 | Smuggler voice card + moral arc spec | story | high | 3 | A7 | Two deliverables: (1) Smuggler voice card — paired examples with detective showing dual-lens register differences. Thinks in people vs data, first names vs surnames, fragments vs complete sentences, Krenn substrate vocabulary. (2) Smuggler moral arc — 4 phases (Comfort→Doubt→Reckoning→Compromise), smuggler-specific FactIds, monologue triggers. Subsumes #310 (Character voice speech patterns). | +| B5 | NPC-format briefs for both PCs — Concept A v0.1 | story | high | 4 | B3 | When you play the smuggler, the detective exists as an NPC (and vice versa). NPC-mode behavior scripts (5-7 routine entries each), reverse dual-lens notes, observation monologue for PC seeing other-PC-as-NPC (3-5 lines per character). ~20-30 authored items total. | + +### C. Content Directory & Schema (split teams) + +| ID | Title | Type | Pri | Sprint | Team | Blocked By | Description | +|----|-------|------|-----|--------|------|------------|-------------| +| C1 | Content directory structure design doc | story | high | 3 | copy | — | Document converged structure: `_meta/` + `_schema/` (infrastructure, underscore prefix), `global/` + `districts/` (game content). Canonical_id format (`{system}.{station}.{district}.{type}.{slug}`). Mod-compatible directory conventions (no overlay implementation). District as atomic pack unit. Informs all content implementation. | +| C2 | Create content/ directory skeleton | task | high | 3 | server | C1 | Create directory tree with empty YAML stubs. `_meta/`, `_schema/`, `global/` (factions, technology, contraband, knowledge, enums, regions), `districts/sova-transit/` (district.yaml, npcs/, locations/, templates/, triangles/, lines/). | +| C3 | Content schema definitions (YAML Schema files) | story | high | 3 | server | C1 | Create `_schema/` with validation schemas: npc.schema.yaml (tier-conditional rules), location.schema.yaml, faction.schema.yaml, template.schema.yaml, fact.schema.yaml, dialogue.schema.yaml, monologue.schema.yaml, district.schema.yaml, pool.schema.yaml. | +| C4 | Create global/enums/ YAML files from D-035 | task | med | 4 | server | C2 | Populate enums: situations (13), topics (9), moods (8), triggers (9), access-tiers (5), activities (new — from Gestalt routine format + Miri cultural patterns). | +| C5 | Create global/knowledge/entity-attributes.yaml | task | med | 4 | server | C2 | Machine-readable entity attribute definitions. 16 canonical keys after A7 update (14 original, 4 new, 2 renamed). | +| C6 | Create pools.yaml for v0.1 seed-time selection | task | med | 4 | server | C2 | Sova single-candidate pools: friend_smuggler (kael-davan), friend_detective (sera-venn), bar_regulars, compromised_inspector, primary_contraband. Architecture supports N candidates; v0.1 has 1 each. | +| C7 | Create template YAML files with role slot definitions | task | med | 4 | server | C2 | 3 social sites: logistics-hub.yaml, bar.yaml, smuggling-ring.yaml. Each declares named role slots with count ranges, required flags, pool references, triangle constraints. | +| C8 | Create triangle YAML files for 5 v0.1 triangles | task | med | 4 | server | C2 | 5 triangles: hub-power (T1, active fork), worried-knowledge (T2, active fork), bar-tensions (T3, passive), worried-partner (T4, active fork), informant-question (T5, passive). Self-contained forks — no cross-triangle cascade (A-17). | +| C9 | Implement make validate-content CLI | story | high | 3 | server | C3 | Structural + tier-conditional content validation. Same crate as C3 schemas. Reads `_schema/` definitions, validates all YAML in `content/`. v0.1 scope: structural validation (required fields, type checks, enum matching) + tier-conditional rules. v0.2: cross-reference validation (FactId existence, NPC slug resolution). | +| C10 | Pre-commit FactId typo check | task | med | 4 | ci | — | Grep-based pre-commit check validating FactId references in YAML content files against canonical facts.yaml. Cheap v0.1 bridge until full cross-reference validation lands in C9 v0.2. | + +### D. Design Specs + +| ID | Title | Type | Pri | Sprint | Team | Blocked By | Description | +|----|-------|------|-----|--------|------|------------|-------------| +| D2 | Seed configuration schema design | story | med | 4 | server | — | Schema for what the randomizer produces at game-start: FRIEND selections, social site population, compromised NPC, contraband type, entanglement overrides. v0.1 has single-candidate pools but architecture must support N. Saved with game state. Location: runtime/ (not content/). Constrained by D-029 ratio (30/50/20). | +| D4 | News ticker headline pool | task | med | 4 | copy | — | ~20 dual-lens headlines for Meridian feed at Lera's. Mix: freight/commodity data, Assembly politics, local infrastructure, sports, Commission advisories. Each headline works as a dual-lens monologue trigger. | + +### NEW. Tickets from Workshop Rounds 1-2 + +| ID | Title | Type | Pri | Sprint | Team | Blocked By | Description | +|----|-------|------|-----|--------|------|------------|-------------| +| NEW-1 | Apply Round 2 NPC pattern/motivation mapping | task | high | 3 | copy | — | Apply the Round 2 finalized NPC pattern/motivation mapping (Gestalt-Paula synthesis) to wiki and content files. 17 NPCs × (pattern + motivation). Includes Harek's structural role formalization (Paula Gap 7). | +| NEW-2 | Drin Tier 2 profile expansion | task | med | 3 | copy | NEW-1 | Drin confirmed promoted to Tier 2 (A-01 consensus). Expand wiki profile to full Tier 2 depth: all 10 profile axes, smuggler lens section, triangle membership formalized for T2 and T5. | +| NEW-3 | Wiki → YAML content conversion (Sova NPCs) | story | high | 4 | copy | C1, C2, C3 | Convert 17 NPC wiki profiles to engine-readable YAML in content/districts/sova-transit/npcs/. Includes routine YAML layer (Paula Gap 3), triangle fork decision points (Gap 4), location smuggler detail (Gap 6). Must match schemas from C3. Tyre estimates 2-3 full days. | +| NEW-4 | Monologue content pool — minimum viable (~200 lines) | story | high | 4 | copy | #261, B4 | ~100 lines per character. Categories: arrival observations, NPC routine commentary, environmental flavor, contradiction hints, idle reflections, tutorial/orientation. Follows Mellanie's authoring order (FRIEND packs first, then fill to ~200). | +| NEW-5 | v0.1 wow moment content checklist | task | high | 3 | copy | — | Map D-039's 6 wow moments to specific content deliverables + implementation tickets. Track completion. Acceptance: every moment has identified content + code backing it. | +| NEW-6 | PC-as-NPC content authoring | story | high | 5 | copy | B3, B5, #297, #298 | Author the actual PC-as-NPC lines: 5-7 routine entries per character, 3-5 observation monologue lines, reverse dual-lens notes. ~25 authored items (Mellanie's budget). Blocked by FRIEND packs — must know who the characters ARE before writing how they appear as NPCs. | +| NEW-7 | v0.1 interaction verb spec + `verbs[]` terminology | task | med | 3 | copy | — | Document the 7 interaction types (A-04: Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear). Define triggers, UI needs, server events per type. v0.1 surfaces single context-sensitive action; architecture supports N verbs via `verbs[]`. Includes wiki + decisions rename: "interaction" → "`verbs[]`" terminology where appropriate. Soft dependency for NEW-9. | + +### NEW-R2. Tickets from Lead Round 2 Decisions + +| ID | Title | Type | Pri | Sprint | Team | Blocked By | Description | +|----|-------|------|-----|--------|------|------------|-------------| +| NEW-8 | YAML → RON converter tool | task | med | 4 | server | C1 | Build-time converter: reads content YAML, emits RON. Lives in `tooling/`. Runs as make target (`make content-ron`). Not on critical path — engine consumes YAML in v0.1; RON is future-proofing for engine performance if needed. | +| NEW-9 | Proximity detection + multi-verb InteractionOptions (`verbs[]`) | story | high | 3 | server | — | Proximity detection system + server-side `InteractionOptions` component modeling N available actions per entity via `verbs[]`. Without proximity, InteractionOptions has no trigger. v0.1 client picks first/best verb; v0.2 client shows menu. Must not be throwaway. Includes ObserverSnapshot v2 → v3 protocol extension for interaction data. Soft dependency on NEW-7 (verb definitions). | +| NEW-10 | Interaction prompt — client extensible prompt system | story | high | 3 | client | NEW-9 | Client-side interaction prompt designed for extensibility. v0.1: single context-sensitive E prompt. Architecture supports v0.2 multi-verb menu. Prompt system reads `InteractionOptions` from server state. Separate from #240 (Player interaction system and dispatcher) — different team, different definition of done. | +| NEW-11 | Pause system — server tick rate scaling | story | med | 3 | server | — | Tick rate supports 3 states: full speed (normal play), 50% speed (UI overlay open — knowledge panel, dialogue), 0% (spacebar pause). Server receives pause/speed commands from client via IPC. | +| NEW-13 | Line previewer CLI | task | med | 4 | server | C3, C9 | CLI tool to preview monologue/dialogue line selection for a given game state. Lives in `tooling/`. Helps content authors test prerequisite logic without running the full game. Tyre's recommendation for content tuning. | +| NEW-14 | UI microcopy | task | med | 5 | client | Stig UI spec | ~50 strings: interaction prompt labels, knowledge panel labels, relationship state descriptors, HUD labels, tutorial text. Blocked by Stig's UI element specs from Sprint 3. | + +--- + +## Sprint Plan + +### Sprint 3: Know — Copy Team (Content Foundation) + +**Goal:** Deliver content specs and wiki fixes that unblock server implementation and content authoring. + +| Pri | Ticket | Title | Owner Hint | Effort | +|-----|--------|-------|------------|--------| +| **P0** | **#261** | **Dual Lens Authoring Guide** | **Paula** | **Large** | +| **P0** | **C1** | **Content directory structure design** | **Tyre/Gestalt** | **Medium** | +| P0 | A1 | Apply canonical full names | Paula | Small | +| P0 | A2 | Hael → Naia Tamm rename (~16 files) | Paula | Small | +| P0 | A7 | Smuggler role-perspective keys (16 total) | Paula | Small | +| P1 | B2 | MIRROR pattern spec + Naia reference impl | Gestalt/Gore | Medium | +| P1 | B4 | Smuggler voice + moral arc (subsumes #310) | Gore/Mellanie | Medium | +| P1 | NEW-1 | NPC pattern/motivation mapping (Gestalt-Paula synthesis) | Gestalt | Small | +| P1 | NEW-5 | Wow moment content checklist | SI | Small | +| P1 | A10 | Nils Davan stub | Paula | Small | +| P1 | A11 | Triangle 1 fix (Volume Escalation) | Gestalt/Paula | Medium | +| P2 | B3 | PC-as-NPC spec | Gestalt/Paula | Medium | +| P2 | A8 | Shortcode fix | Mellanie | Small | +| P2 | NEW-2 | Drin Tier 2 profile expansion | Paula | Small | +| P2 | NEW-7 | Interaction verb spec + `verbs[]` terminology | Gestalt | Small | + +**Copy Sprint 3 total: 15 tickets (5 P0, 6 P1, 4 P2)** + +### Sprint 3: Know — Server Team (Content-Adjacent Additions) + +| Pri | Ticket | Title | Effort | +|-----|--------|-------|--------| +| P1 | C2 | Content/ directory skeleton | Small | +| P1 | C3 | Content schema definitions | Medium | +| P1 | C9 | validate-content CLI (same crate as C3) | Medium | +| P1 | NEW-9 | Proximity detection + InteractionOptions (`verbs[]`) | Medium | +| P1 | #326-P1 | Content loader Phase 1 — skeleton + fixtures | Medium | +| P2 | NEW-11 | Pause system — tick rate scaling | Small | + +**Server Sprint 3 additions: 6 tickets (in addition to existing 10)** + +### Sprint 3: Know — Client Team (Additions) + +| Pri | Ticket | Title | Effort | +|-----|--------|-------|--------| +| P1 | NEW-10 | Interaction prompt — extensible prompt system | Medium | + +**Client Sprint 3 addition: 1 ticket** + +### Sprint 4: Content Conversion + Authoring Begins + +| Ticket | Title | Team | Blocked By | +|--------|-------|------|------------| +| NEW-3 | Wiki → YAML conversion (17 NPCs) | copy | C1, C2, C3 | +| C4 | Enum YAMLs from D-035 | server | C2 | +| C5 | Entity-attributes YAML | server | C2 | +| C6 | Pools YAML | server | C2 | +| C7 | Social site template YAMLs | server | C2 | +| C8 | Triangle YAMLs | server | C2 | +| C10 | Pre-commit FactId check | ci | — | +| A6 | Smuggler FactId progression text | copy | B4 | +| A12 | Environmental text examples | copy | A3/#319 | +| B5 | PC NPC-format briefs | copy | B3 | +| D4 | News ticker headlines (~20) | copy | — | +| #306 | News ticker content (align with D4) | copy | — | +| D2 | Seed configuration schema | server | — | +| NEW-4 | Monologue content pool (~200 lines) | copy | #261, B4 | +| NEW-8 | YAML → RON converter | server | C1 | +| NEW-13 | Line previewer CLI | server | C3, C9 | +| #326-P2 | Content loader Phase 2 — real content | server | C4-C8, NEW-3 | +| A3/#319 | Krenn brief + seed.yaml reference | copy | — | + +### Sprint 5+ (Content at Scale) + +| Ticket | Title | Team | Blocked By | +|--------|-------|------|------------| +| NEW-6 | PC-as-NPC content authoring (~25 items) | copy | B3, B5, #297, #298 | +| NEW-14 | UI microcopy (~50 strings) | client | Stig UI spec | +| B1 | NPC Authoring Style Guide (generator spec) | copy | A3, A4, A7, B2, B4 | +| A4 | Regional style guide / seed.yaml template | copy | — | +| A9 | Thematic Question field (Tier 1 profiles) | copy | B2 | +| #297 | THE FRIEND: Kael content pack | copy | #261 | +| #298 | THE FRIEND: Sera content pack | copy | #261 | +| #190 | Workplace content pack | copy | #261 | +| #191 | Bar content pack | copy | #261 | +| #192 | Smuggling ring content pack | copy | #261 | + +--- + +## Dependency Graph + +``` +SPRINT 3 — Three Parallel Chains +================================== + +Chain 1: Content Authoring Pipeline (copy) +------------------------------------------- +#261 (Dual Lens Guide) [P0, CRITICAL PATH ROOT] + ├─► B4 (Smuggler voice + moral arc) [Sprint 3] + │ ├─► A6 (Smuggler FactId text) [Sprint 4] + │ └─► NEW-4 (Monologue pool) [Sprint 4] + ├─► #297 (FRIEND: Kael) [Sprint 5] + │ └─► NEW-6 (PC-as-NPC authoring) [Sprint 5] + ├─► #298 (FRIEND: Sera) [Sprint 5] + │ └─► NEW-6 (PC-as-NPC authoring) [Sprint 5] + ├─► #299 (Opening hook: smuggler) [Sprint 5] + ├─► #300 (Opening hook: detective) [Sprint 5] + └─► #190, #191, #192 (Content packs) [Sprint 5] + +A7 (Smuggler attributes) [P0, Sprint 3] + ├─► B4 (Smuggler voice) [Sprint 3] + └─► B3 (PC-as-NPC spec) [Sprint 3] + └─► B5 (PC briefs) [Sprint 4] + └─► NEW-6 (PC-as-NPC authoring) [Sprint 5] + +Chain 2: Content Architecture Pipeline (server) +------------------------------------------------- +C1 (Content dir design) [P0, Sprint 3, copy] + ├─► C2 (skeleton) [Sprint 3, server] + │ ├─► C4 (enums) [Sprint 4] + │ ├─► C5 (entity attrs) [Sprint 4] + │ ├─► C6 (pools) [Sprint 4] + │ ├─► C7 (templates) [Sprint 4] + │ ├─► C8 (triangles) [Sprint 4] + │ ├─► NEW-3 (wiki→YAML) [Sprint 4, copy] + │ └─► #326-P2 (loader Phase 2) [Sprint 4] + ├─► C3 (schemas) [Sprint 3, server] + │ ├─► C9 (validator) [Sprint 3, server] + │ ├─► NEW-3 (wiki→YAML) [Sprint 4, copy] + │ └─► NEW-13 (line previewer) [Sprint 4] + ├─► #326-P1 (loader Phase 1) [Sprint 3, server] + └─► NEW-8 (RON converter) [Sprint 4] + +Chain 3: Interaction Pipeline (server + client) +------------------------------------------------- +NEW-7 (Verb spec) [Sprint 3, copy] ···soft···> NEW-9 +NEW-9 (Proximity + InteractionOptions) [Sprint 3, server] + └─► NEW-10 (Extensible prompt) [Sprint 3, client] + +Independent (Sprint 3) +------------------------ +B2 (MIRROR spec) ─► A9 (Thematic Question) [Sprint 4] +A10 (Nils stub) ─► A11 (Triangle 1 fix) [Sprint 3] +NEW-11 (Tick rate scaling) [Sprint 3, server] — no downstream blockers + +Existing Server Dependencies +------------------------------ +#237 (A* pathfinding) ─► #88 (Daily routine system) [both Sprint 3] +``` + +--- + +## 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) | +| Workshop tickets (NEW 1-7) | 7 | copy | +| Lead decision tickets (NEW 8-14, excl. killed NEW-12) | 6 | server (4), client (2) | +| **Total new tickets** | **38** | **copy (21), server (13), client (2), ci (1)** | +| Existing ticket updates | 10 | — | +| **Killed from Round 2** | **1** | NEW-12 (client pause — not a ticket) | + +*Note: count is 38, not 37 — NEW-14 (UI microcopy) was added in closing corrections. 38 original − 1 killed (NEW-12) + 1 added (NEW-14) = 38.* + +--- + +## Risks + +1. **#261 is the critical path root.** Blocks 9 tickets directly. If it slips one sprint, the entire content authoring pipeline delays into Sprint 5+. Recommend: assign Paula immediately, time-box to 5 working days. + +2. **Sprint 3 server team is heavy.** 10 existing tickets + 6 new content-adjacent additions = 16. Mitigation: C2, C3, C9, #326-P1 are all blocked by C1 (copy team) — they start mid-sprint. NEW-9 and NEW-11 are independent and can begin immediately. + +3. **Content conversion (NEW-3) is a Sprint 4 bottleneck.** Tyre estimates 2-3 full days for 17 NPC conversions. Blocks server from testing with real data. Recommend: start with 3 Tier 1 NPCs (Kael, Sera, Naia) as soon as C2 lands; don't wait for all 17. + +4. **#237 → #88 server dependency.** Pathfinding must land before routines. Both are Sprint 3. If #237 slips, NPC routines slip, which delays routine deviation detection (#243), which delays wow moment #2 (The Character's Eye). + +--- + +*Proposals only — no tickets created in database. Awaiting lead approval.* +*Compiled by SI. Source: v0.1 Content Scoping Workshop Rounds 1-2, lead closing corrections, Qatux tracking doc.* diff --git a/docs/workshops/v01-content-scoping/v01-content-scoping-workshop-brief.md b/docs/workshops/v01-content-scoping/v01-content-scoping-workshop-brief.md new file mode 100644 index 000000000..810146e72 --- /dev/null +++ b/docs/workshops/v01-content-scoping/v01-content-scoping-workshop-brief.md @@ -0,0 +1,227 @@ +# Workshop Brief: v0.1 Content Scoping +## What Actually Ships in the Vertical Slice? + +**Project:** The Settled Reach (D-021) +**Date:** 2026-02-12 +**Called by:** Jeroen +**Prerequisite:** Wiki Review workshop established long-term content strategy (300-world generator model, cultural ingredients menu, three-system NPC architecture, Sacred/Profane/Middle Kingdom). This workshop applies that strategy to v0.1. +**Participants:** GESTALT, PAULA, TYRE, MELLANIE, STIG, DUDLEY + SI (tickets) + QATUX (documenter) + +--- + +## Context + +The Wiki Review workshop (4 rounds + lead interview) produced a comprehensive long-term content strategy documented in `docs/workshops/wiki-review/SUMMARY.md`. The key outcome: the full game targets 300 worlds populated by generators fed by style briefs. But **v0.1 is NOT a generator test. v0.1 is proof of the interaction model** — 1 district, hand-authored, proving that the player can touch the world and the world can touch back. + +The existing wiki (`docs/wiki/`, 45 files, ticket #368) contains the content for Sova Transit District: 17 NPCs across 3 tiers, 5 triangles, 3 social sites, knowledge vocabulary (FactIds, entity attributes, relationship states), and an authoring guide. This content has known gaps and issues identified in Rounds 1-2 of the Wiki Review. + +**This workshop scopes and prioritizes the content work needed to ship v0.1.** + +**Key constraint:** v0.1 must be architecturally compatible with the 300-world future. Hand-authored Sova content becomes the benchmark output that generators must match. Every structure we create now is a generator template later. Don't build anything that only works for 1 district. + +**Design constraints from existing decisions:** +- D-005: Single-character perspective +- D-020: Godot 4 client + Rust/bevy_ecs server +- D-027: Smuggler + detective vertical slice, two-character proof +- D-034: THE FRIEND production-level NPC pattern (Kael, Sera) +- D-035: Monologue system with tagged prerequisites +- D-036: Krenn System / Sova Transit District setting +- D-037: Contraband types +- D-039: 6 wow moments in a 30-minute session +- D-041: Knowledge graph architecture +- Wiki Review: WASD direct control, context-sensitive interaction + +--- + +## Required Reading + +Before responding, read: +1. `docs/workshops/wiki-review/SUMMARY.md` — the long-term content strategy (essential context) +2. `docs/workshops/wiki-review/lead-interview.md` — lead's decisions on cultural ingredients, NPC composition, archetypes, randomization, scale +3. `docs/wiki/index.md` — current wiki structure +4. `docs/wiki/npcs/index.md` — NPC roster and triangles +5. `decisions/content.md` — D-028, D-034, D-035, D-036, D-037 +6. `decisions/scope.md` — D-027, D-039 + +--- + +## Topic 1: Wiki Fixes — Known Issues from Rounds 1-2 + +**What needs fixing in the existing wiki before it can drive implementation?** + +The Wiki Review identified these specific issues: + +### 1a. Hael → Naia Tamm rename +Unanimous decision. Resolves Kael/Hael sonic collision (T-03). Hael becomes Naia Tamm, following Krenn naming conventions. This NPC is also the first instance of THE MIRROR pattern — honest, no contradiction arc, no secret. + +- **Paula:** Execute the rename across all wiki files. Update relationship references, triangle diagrams, cross-references. +- **Mellanie:** Review Naia Tamm's voice — does she need voice samples now that she's a MIRROR (Tier 1 emotional depth)? + +### 1b. Smuggler lens parity +The wiki is detective-shaped. The smuggler perspective needs equal depth: +- Smuggler-specific NPC attributes: `trust_read`, `exposure_risk`, `loyalty_assessment`, `leverage_held`, `social_debt`, `moral_weight`, `cover_integrity`, `loyalty_conflict` +- Moral arc phases for smuggler: Comfort → Doubt → Reckoning → Compromise +- Every NPC profile needs a smuggler-lens section with the same depth as the detective-lens section + +- **Paula:** Propose the smuggler attribute vocabulary and add smuggler-lens sections to all NPC profiles. +- **Gestalt:** How do smuggler attributes map to EntityKnowledge keys in the knowledge graph? + +### 1c. Triangle 1 (Hub Power) strengthening +Weakest triangle. Smuggler role is passive. Needs a concrete fork — the Nils-vs-Voss escalation decision. +- Nils needs a stub wiki page at minimum +- The player needs a decision point, not just observation + +- **Gestalt:** Design the Triangle 1 fork. What does the smuggler decide? What does the detective observe? +- **Paula:** Write the Nils stub page. Define Triangle 1's escalation sequence. + +### 1d. Drin tier promotion +Drin is doing Tier 2 work (Triangle 2, Triangle 5, compromised by Harek) in a Tier 3 profile. + +- **Gestalt:** Should Drin be promoted to Tier 2? What are the mechanical implications? +- **Paula:** If promoted, expand the profile to full Tier 2 depth. + +### 1e. Full canonical names +Miri generated 12 Krenn-style names in Round 1. Apply them to NPCs currently using single names. + +- **Paula:** Apply Miri's names where appropriate. Check naming consistency. + +**Questions:** +1. **Paula:** Are there other wiki gaps not listed above? What did you discover during Round 1-2 review that still needs fixing? +2. **Gestalt:** Do any triangles need restructuring beyond Triangle 1? +3. **Mellanie:** Are the voice samples in Tier 1 profiles (Kael, Sera) distinct enough for monologue authoring? + +--- + +## Topic 2: v0.1 NPC Architecture + +**Which subset of the three-system NPC model ships in v0.1?** + +The long-term strategy defines three NPC systems: +- **System A:** 9 thematic patterns (FRIEND, MIRROR, ANCHOR, GHOST, CATALYST, THRESHOLD, REMNANT, SYSTEM, NOBODY) +- **System B:** 6 functional motivations (HANDLER, WITNESS, TURNCOAT, CIVILIAN, OPERATOR, SKEPTIC) +- **System C:** Composition rules (pattern x motivation per NPC) + +v0.1 has 17 NPCs across 3 tiers. Not all patterns and motivations need to be present. + +**Questions:** +1. **Gestalt:** Which patterns and motivations are REQUIRED for v0.1? Which can be deferred? Map the existing 17 NPCs to pattern + motivation assignments. +2. **Paula:** Do the existing NPC profiles already implicitly match patterns/motivations? Make the mapping explicit. +3. **Gestalt:** Does THE NOBODY ship in v0.1, or is dynamic tier promotion a v0.2 feature? If v0.1, which NPCs are NOBODYs? +4. **Dudley:** What server-side entity data does each pattern/motivation require? What's the ECS component design? + +--- + +## Topic 3: v0.1 Content Directory Structure + +**How does wiki content become engine-readable data?** + +The wiki (`docs/wiki/`) is the authoring source. The engine needs content in a structured format the server can load. The directory structure must: +- Support the v0.1 content (1 district, hand-authored) +- Be architecturally compatible with the 300-world generator output (same schema, same addressing) +- Allow hot-reloading during development +- Support content validation + +**Questions:** +1. **Tyre:** Propose the `content/` directory structure for v0.1. What format — YAML? RON? How does it mirror the wiki structure? +2. **Tyre:** How does content addressing work? `canonical_id` per entity? How do wiki pages map to content files? +3. **Dudley:** What does the server content loader need? What's the load sequence? How does an NPC profile become a spawned entity? +4. **Gestalt:** What's per-district vs. global? Where does the FactId catalog live? Where do NPC profiles live? Where do triangle definitions live? +5. **Stig:** What does the client need from content files? NPC display names? Dialogue text? Location descriptions? What format makes client loading simple? + +--- + +## Topic 4: Interaction Model Basics for v0.1 + +**What's the minimum viable interaction for the vertical slice?** + +The Control & Interaction workshop will design the full system. But v0.1 needs SOMETHING — the player must be able to: +- Walk up to an NPC and initiate dialogue +- Receive monologue observations +- Examine objects/environment +- Overhear conversations (proximity-based) + +This topic scopes the v0.1 minimum, not the full design. + +**Questions:** +1. **Gestalt:** What's the minimum interaction set that proves the core loop? Walk + talk + observe + monologue? Or does v0.1 need more? +2. **Stig:** What UI elements does the minimum interaction model need? Interaction prompt? Dialogue box? Monologue display? Knowledge panel? +3. **Dudley:** What server events support the minimum interaction? Proximity triggers? Interaction requests? Dialogue state? +4. **Mellanie:** How much monologue content does v0.1 need? What's the minimum pool size before it feels repetitive? + +--- + +## Topic 5: v0.1 Scope Boundary + +**What's IN v0.1 and what's explicitly OUT?** + +v0.1 proves the interaction model. It does NOT prove generators, randomization, or cultural variety. Be ruthless about scope. + +**Candidates for IN:** +- WASD movement + collision +- Context-sensitive interaction (approach NPC → prompt → dialogue) +- Monologue system (tagged triggers, FactId prerequisites) +- Knowledge graph (player learns facts, relationships change) +- 2 playable characters (smuggler, detective) seeing same world differently +- THE FRIEND arc (Kael for smuggler, Sera for detective) +- 5 triangles with at least 1 fork each +- 6 wow moments (D-039) +- 3 social sites (Terminal, Last Shift, Maintenance Corridors) +- NPC routines (schedule-based movement) + +**Candidates for OUT (v0.2+):** +- THE NOBODY / dynamic tier promotion +- Archetype transitions +- Multiple FRIEND candidates per character +- Secondary contraband variation +- Gate network / multi-world +- Content generation / randomization +- Modding support + +**Questions:** +1. **Gestalt:** Is this IN/OUT split correct? Anything missing from IN that's essential for the 30-minute session? Anything in IN that's scope creep? +2. **Tyre:** What's the technical risk in the IN list? What might take longer than expected? +3. **Dudley:** What server features are blocked by content that doesn't exist yet? +4. **SI:** Map the IN list to tickets. What already has tickets? What needs new ones? + +--- + +## Topic 6: Ticket Generation + +**What implementation tickets come out of this workshop?** + +SI had a preliminary list of 28 tickets from Wiki Review Round 2, but the 300-world reframe makes some obsolete and creates new ones. + +**Expected ticket categories:** +- Wiki fixes (rename, smuggler lens, triangle strengthening, Drin promotion, canonical names) +- Content file creation (wiki → YAML/RON conversion for engine) +- Content directory structure setup +- Content loader implementation (server-side) +- Content validation schema +- Minimum interaction model (client UI elements) +- Monologue content pool (minimum viable) +- PC-as-NPC content (the other character exists as an NPC) + +**Questions:** +1. **SI:** Review the Round 2 ticket list (`docs/workshops/wiki-review/si-ticket-changes.md`). Which survive? Which are obsolete? What's new? +2. **SI:** Which tickets belong to Sprint 3 (Know) vs. later sprints? What's the dependency chain? +3. **Tyre:** What tickets should be split between server/client/copy teams? + +--- + +## Workshop Format + +**1-2 rounds.** + +**Round 1:** Topic responses. Each participant addresses their assigned questions with concrete proposals. Wiki fixes should include actual content (not just "we should fix this"). Directory structures should be actual file trees. Ticket proposals should have title, description, and team assignment. + +**Round 2:** Integration + ticket finalization. Resolve disagreements, finalize the IN/OUT boundary, produce the ticket list. SI creates tickets. Qatux documents decisions. + +## Expected Outputs + +- **Wiki fix list** with assignments and content ready to apply +- **NPC pattern/motivation mapping** for all 17 v0.1 NPCs +- **Content directory structure** with schema proposal +- **v0.1 interaction model minimum** — enough for Stig/Dudley to implement +- **Scope boundary document** — clear IN/OUT with rationale +- **Ticket list** — implementation tickets with team assignments and sprint targets +- **Decision amendments** — updates to existing decisions based on scoping From 8c95bda639a07b20d1976b73389d7ad9e93cbe24 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Thu, 12 Feb 2026 16:19:10 +0100 Subject: [PATCH 4/7] docs(workshops): add control & interaction brief, update workshop index Add workshop brief for Control & Interaction Scheme (next workshop). Update index with wiki-review (complete) and v0.1-content-scoping (complete, 38 tickets). Co-Authored-By: Claude Opus 4.6 --- docs/workshops/README.md | 3 + .../control-interaction-workshop-brief.md | 154 ++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 docs/workshops/control-interaction/control-interaction-workshop-brief.md diff --git a/docs/workshops/README.md b/docs/workshops/README.md index 78fa98f15..0a248dc75 100644 --- a/docs/workshops/README.md +++ b/docs/workshops/README.md @@ -25,3 +25,6 @@ docs/workshops/ | [NPC AI State Machines](npc-ai-state-machines/) | — | Brief ready | | [Save/Load Architecture](save-load-architecture/) | — | Brief ready | | [Map Authoring Pipeline](map-authoring-pipeline/) | — | Brief ready | +| [Wiki Review & Content Standards](wiki-review/) | — | Complete (4 rounds + lead interview) | +| [v0.1 Content Scoping](v01-content-scoping/) | — | Complete (2 rounds + closing, 38 tickets created) | +| [Control & Interaction Scheme](control-interaction/) | — | Brief ready | diff --git a/docs/workshops/control-interaction/control-interaction-workshop-brief.md b/docs/workshops/control-interaction/control-interaction-workshop-brief.md new file mode 100644 index 000000000..596d72fa6 --- /dev/null +++ b/docs/workshops/control-interaction/control-interaction-workshop-brief.md @@ -0,0 +1,154 @@ +# Workshop Brief: Control & Interaction Scheme +## How Does the Player Touch the World? + +**Project:** The Settled Reach (D-021) +**Date:** 2026-02-12 +**Called by:** Jeroen +**Prerequisite:** Wiki Review workshop established WASD direct control with context-sensitive interaction as unanimous direction. +**Participants:** TBD — likely GESTALT, OZZIE, TYRE, STIG, DUDLEY, PAULA, MELLANIE, ARAMINTA + +--- + +## Context + +The Wiki Review workshop (2026-02-12) produced unanimous consensus: the player controls their character directly via WASD movement with context-sensitive interaction prompts. The game is not Sims/Rimworld (drafted characters), not point-and-click. The player IS the character. Their body is their attention mechanism. + +This workshop designs the specifics. The interaction model determines everything downstream: camera, UI, dialogue triggers, NPC approach, environmental interaction, inventory, information access, and the perception modes that are core to the game's asymmetric information design. + +**Design constraints from existing decisions:** +- D-005: Single-character perspective +- D-013: Diegetic insert (neural implant map/minimap) +- D-016: Internal monologue as perception bridge +- D-017: Perception modes as character build +- D-018: Three-range sound model +- D-020: Godot 4 client + Rust/bevy_ecs server +- Wiki Review: WASD direct control, context-sensitive interaction, body-as-attention-mechanism + +--- + +## Layer 1: Movement & Camera + +**How does the character move through space?** + +- **Movement**: WASD (confirmed). But: 8-directional grid? Free movement? Physics-based? Sprint/walk toggle? Sneak mode? +- **Camera**: Top-down (confirmed by "top-down immersive sim"). But: fixed angle? Rotatable? Zoom level? How close before you can read a sign? How far before NPCs are silhouettes? +- **Collision**: Tile-based? Free-form? Can you squeeze between tables? Block doorways? +- **Speed**: Does speed affect perception? Walking slowly = more monologue triggers? Running = less observation? + +**Questions:** +1. **Gestalt**: Does movement speed affect information gathering? Should walking vs. running change what you notice? +2. **Tyre**: Godot 4 tile-based or free movement? What's the technical recommendation? +3. **Ozzie**: What camera distance feels right for "I am this person" vs. "I can see the room"? +4. **Araminta**: What visual information density works at the proposed camera distance? + +--- + +## Layer 2: Context-Sensitive Interaction + +**What happens when you approach something?** + +The Wiki Review poll referenced Disco Elysium interaction and Hotline Miami movement. The key design question: how do interaction prompts appear, and how does the player select from options? + +- **Proximity trigger**: How close before options appear? Line-of-sight required? +- **Prompt style**: Single action prompt (changes based on context)? Radial menu? List? Paula suggested single-action prompts that change based on proximity + relationship + knowledge. +- **NPC interaction**: Walk up to NPC → what appears? "Talk"? Multiple options (talk, observe, confront)? Does relationship state change the options? +- **Object interaction**: Examine, use, take? How do you read a manifest on a desk vs. pick up a crate? +- **Environmental interaction**: Doors, terminals, cargo containers, signs — each different? +- **Eavesdropping**: Can you hear NPCs talking without direct interaction? How does proximity affect this? + +**Questions:** +1. **Gestalt**: How many interaction options per NPC at once? Does complexity vary by relationship state? +2. **Paula**: How does dialogue initiation work? Player approaches NPC → what's the UX to the first line of dialogue? +3. **Stig**: What UI patterns support context-sensitive prompts without cluttering the screen? +4. **Dudley**: How does the server determine what interaction options are available based on entity state? + +--- + +## Layer 3: Information & Perception + +**How does the player ACCESS information vs. RECEIVE information?** + +The game has two information channels: +1. **Active**: Player chooses to look, examine, query the lattice, read something +2. **Passive**: Monologue fires based on observation triggers, overheard conversations, environmental tells + +- **Lattice queries**: How do you look up an NPC via the neural lattice? A UI panel? A diegetic device? Walk up and "scan"? +- **Monologue delivery**: Text overlay? Speech bubble? Dedicated UI area? How does it not compete with dialogue? +- **Tell observation**: Player walks past NPC with a behavioral tell — how is it surfaced? Monologue? Visual indicator? Both? +- **Knowledge journal**: How do you review what you know? Diegetic (the implant's records)? Pause menu? + +**Questions:** +1. **Gestalt**: Where's the line between "the game tells you" (monologue) and "you have to look" (active observation)? +2. **Ozzie**: When does information delivery feel immersive vs. intrusive? +3. **Tyre**: How does the knowledge graph surface in the UI without becoming a database viewer? +4. **Mellanie**: How much monologue can appear before the player stops reading? + +--- + +## Layer 4: Dialogue & Conversation + +**How do conversations work mechanically?** + +- **Initiation**: Player walks up, presses interact. Then what? Dialogue box? In-world text? Camera zoom? +- **Response selection**: Menu of options? Single-branch with trust-gated variations? How does the 4-layer dialogue system (access, history, trust, unprompted) translate to player-facing UX? +- **Conversation persistence**: Can you walk away mid-conversation? Resume later? Does the NPC react? +- **Dual-lens integration**: Same NPC, different options per character. How does the UI show what's available vs. locked? +- **Confrontation**: How does "I know you're involved" differ from casual conversation in the UX? + +**Questions:** +1. **Paula**: What does the confrontation UX look like vs. casual conversation? Should the player feel the tension mechanically? +2. **Mellanie**: How does monologue fire DURING dialogue? (Character reacts to what the NPC said) +3. **Stig**: Dialogue box design — full screen? Corner overlay? In-world? +4. **Gestalt**: How do trust-gated options appear (or not appear) without revealing the gating system? + +--- + +## Layer 5: Environmental Interaction & Inventory + +**What can you touch, carry, and use?** + +- **Inventory**: Does the character have inventory? Pockets? A bag? Or is everything contextual (use the terminal, read the manifest, you don't carry things)? +- **Evidence**: How does the detective collect evidence? Take a photo? Log it in the lattice? Pick it up? +- **Contraband**: How does the smuggler interact with cargo? Physical handling? Abstract management? +- **Keys/access**: Physical keys? Access codes? Lattice authorization levels? How does restricted access feel in the UX? + +**Questions:** +1. **Gestalt**: How physical is the interaction model? Carry objects? Or is everything knowledge-based (you SAW the manifest, you don't HAVE the manifest)? +2. **Tyre**: What's feasible for v0.1 inventory? Full system or knowledge-only? +3. **Nigel**: Does inventory variation matter for replayability, or is knowledge-based sufficient? + +--- + +## Layer 6: Time & Routine + +**How does time pass and how does the player relate to schedules?** + +- **Time control**: Real-time? Acceleratable? Pause-to-think? Day/night cycle? +- **Routine awareness**: Can you see NPC schedules? Predict where someone will be? Or do you learn through observation? +- **Waiting**: Can you wait/skip time? Stand outside someone's shift and wait for them? +- **Urgency**: Is there time pressure? Can you miss events? Or is the world patient? + +**Questions:** +1. **Gestalt**: Does time pressure create interesting decisions or just stress? +2. **Ozzie**: What pacing feels right for "quotidian with undertow"? +3. **Dudley**: How does the tick-based simulation map to player-perceived time? + +--- + +## Workshop Format + +**2-3 rounds.** + +**Round 1**: Layer-by-layer proposals. Each participant addresses their domain questions with concrete UX descriptions. + +**Round 2**: Integration — how do the layers interact? Movement affects perception, perception affects dialogue options, dialogue affects knowledge, knowledge affects interaction prompts. + +**Round 3 (if needed)**: V0.1 minimum viable interaction model — what ships first? + +## Expected Outputs + +- **Interaction model spec**: Complete description of how the player touches the world +- **UI wireframe direction**: Enough for Stig/Araminta to begin prototyping +- **Perception UX spec**: How information flows to the player through the interaction model +- **V0.1 scope**: Minimum viable interaction for the vertical slice +- **Tickets**: New implementation tickets for the interaction model From 5925a0c79baa872f8235f3799ef8fe39c70229f7 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Thu, 12 Feb 2026 16:19:16 +0100 Subject: [PATCH 5/7] chore(meta): add large content push team pattern to CLAUDE.md Document the librarian + parallel writers + reviewer pattern for producing many files efficiently with agent teams. Co-Authored-By: Claude Opus 4.6 --- CLAUDE.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index fd7751574..c62f44508 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -132,6 +132,14 @@ tea pr create \ --head branch-name ``` +### Large content pushes (team pattern) +When producing many files (wiki pages, content batches, bulk docs): +1. **Lore librarian** agent (read-only): ingests all source material, answers focused context queries from writers, tracks cross-file consistency +2. **Multiple writer** agents (parallel, by domain): each gets a task slice, writes directly to disk using the Write tool — one file at a time, write often, no text accumulation +3. **Reviewer** agents (blocked until writing done): check voice consistency, attribute uniformity, style + +Key: writers use Write tool directly (no transcription bottleneck), librarian catches contradictions early, split work by domain not volume. + ### Local services - Gitea: `http://git.schweitz.internal` (login: `schweitz`) - Qdrant: `http://tower-of-joy:6333/` From b08a0389909276e7def45883a6dcd43a8ce63f2c Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Thu, 12 Feb 2026 16:19:23 +0100 Subject: [PATCH 6/7] chore(db): create 39 tickets from v0.1 content scoping workshop 38 new tickets (#371-409) + 10 existing ticket updates + 42 dependency links. Sprint 3: copy 15, server 6, client 1. Sprint 4: 18 tickets. Sprint 5+: 3 tickets. #261 is critical path root. Co-Authored-By: Claude Opus 4.6 --- db/commonwealth.db | Bin 274432 -> 274432 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/db/commonwealth.db b/db/commonwealth.db index e35435baeb6321fedda7c6492fa77d0e990f8839..5bad45276963185458992984589408494bedcdff 100644 GIT binary patch delta 130 zcmZp8AkgqYV8efX#==boFPfOx!Z!yBlrnFQ-`2^)#J&f}Il{7e-Ek{!CXPoy&Ti(( zcb}?kK6y=^hl!0BDDau7`R>#9yH6Rn-+js?tHZ>68z?BuxSd~^xwnsrJqyUY#=5;^ fIrEwfCjMpHl>}Ih2{Ezn1qz>J*}hqw#g_vBm`gHG delta 109 zcmZp8AkgqYV8efX#)3@-FPb(73Y0T%j^EbF17saz*}U$!6*rKzmwEEtrz)FIUXurj ze`RXE`?US;Q^xIgpEAkn07XO@xAO}#_x1sqH(0lqEN5PmG0{ Date: Thu, 12 Feb 2026 16:19:40 +0100 Subject: [PATCH 7/7] chore(meta): update changelog Co-Authored-By: Claude Opus 4.6 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 828bd0e0c..a7ab310bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ Format based on [Keep a Changelog](https://keepachangelog.com/). ## [Unreleased] ### Added +- Game world wiki — 45-file glossary covering Sova Transit District: 17 NPCs, 5 triangles, 3 social sites, 7 factions, knowledge vocabulary +- Wiki Review workshop (4 rounds + lead interview) — 300-world generator model, cultural ingredients menu, three-system NPC architecture, Sacred/Profane/Middle Kingdom framework +- v0.1 Content Scoping workshop (2 rounds + closing) — 16 EntityKnowledge keys, mechanical NPC mapping, YAML content format, 7-verb interaction model, server-authoritative pause, 20 decisions (D-042–D-061) +- 39 implementation tickets (#371–#409) from content scoping workshop — copy 21, server 13, client 2, ci 1 +- Control & Interaction workshop brief (queued) +- Large content push team pattern in CLAUDE.md - Inigo sound designer agent — soundscape design, ambient layers, diegetic cues, D-018 audio propagation - Team-agent mapping in sprint planning — each team has defined default agents for briefing assignment - Sprint skills recognize all team branches (server, client, copy, audio, visual, ci)