Merge remote-tracking branch 'origin/copy'

# Conflicts:
#	decisions/content.md
This commit is contained in:
2026-02-12 19:15:07 +01:00
39 changed files with 5103 additions and 226 deletions
+17
View File
@@ -11,6 +11,17 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
- Review-pr reviewer profiles extracted to `references/reviewer-profiles.md` for progressive disclosure
### Added
- Dual Lens Authoring Guide — 7-chapter reference for writing content that works for both smuggler and detective perspectives (D-027, D-028, D-032, D-034, D-035)
- THE MIRROR pattern spec — transparency-as-contrast NPC design with Naia Tamm reference implementation and generator template
- Smuggler voice card — register parameters, 5 voice anchors, 4 anti-patterns, paired comparison examples, display constraints, authoring checklist
- Smuggler moral arc spec — 4-phase trajectory (Comfort, Doubt, Reckoning, Compromise), FactId gates, monologue trigger rules, Kael intersection mapping
- PC-as-NPC unified spec — starting knowledge/relationship graphs, tell inversion, orientation monologue, 9-step conversion checklist, v0.1 smuggler + detective briefs
- Triangle 1 Hub Power Volume Escalation fork — 3-path smuggler decision (escalate/stabilize/mediate), ~41 authored dialogue lines, NPC state change tables
- Content directory structure design doc — runtime content/ layout, canonical ID format, 8 JSON Schema specs, 3-tier validation pipeline, migration path from wiki
- Interaction verb spec — 7 v0.1 verbs (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear), priority resolution, server pipeline architecture
- v0.1 wow moments checklist — maps all 6 D-039 moments to content deliverables, tickets, dependencies, completion status
- Nils Davan off-stage NPC stub — ring coordinator, GHOST + HANDLER pattern, lattice message design, relationship map
- NPC pattern/motivation mapping applied to all 18 NPC wiki pages with composition reads
- Structured NPC data model (#86) — replaced stub string/f32 fields with typed enums and integer types for D-010 determinism (WantKind, SecretSeverity, Skill, PersonalityTrait, CombatStyle, RelationshipKind)
- Global RelationshipGraph resource (#87) — BTreeMap with tuple key for efficient prefix queries and reverse lookups
- A* pathfinding system (#237) — PathRequest/ComputedPath/PathBlocked components with cardinal-neighbor A* and manhattan heuristic
@@ -28,6 +39,12 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
- Clippy warnings from Rust 1.93 — derive Default, is_multiple_of, collapsible if
### Changed
- Hael renamed to Naia Tamm across all wiki files (16 files updated)
- Canonical full names applied to 11 single-name NPCs (Voss→Arvo Voss, Devra→Devra Talsen, etc.)
- Location shortcodes standardized in monologue guide (hub_m_ → terminal_m_ per D-036)
- Entity attributes updated to 16 canonical keys — 4 new role-perspective keys (risk_assessment, loyalty_assessment, position_integrity, moral_weight), secret_held→leverage_held rename
- Drin Rosta expanded from Tier 3 to Tier 2 — full 10-axis profile, 6 voice lines, Triangle 2 + Triangle 5 roles
- NPC index roster table expanded with Pattern and Motivation columns
- Sprint 3 "Know" team briefings regenerated from database — all four files (server, client, joint, copy) now match actual sprint 3 ticket assignments
- Ticketing database moved to shared worktree location (`../settledreach.db`) — eliminates binary merge conflicts across branches
- All Python connectors use script-relative path resolution instead of `$REPO_ROOT` env var or git rev-parse
+1 -1
View File
@@ -87,7 +87,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
- **Date:** 2026-02-11
- **Decision:** The v0.1 vertical slice is set in Sova Transit District, a freight logistics hub on Station Sova in the Krenn System. This is the first concrete, named star system in The Settled Reach. The Krenn System is a mid-Reach G3V system, ~180 years settled, population ~2.4 million, working-class pragmatic culture. Station Sova is a logistics hub (~12,000 population). Sova Transit District is a 40-year-old prefab-modular-retrofitted freight district with three social sites: The Terminal (logistics hub), The Last Shift (bar), and maintenance corridors/smuggling spaces.
- **Setting details (canonical):**
- NPC naming: Krenn System conventions — compact, consonant-heavy, first-name-primary in social contexts (Kael, Voss, Lera, Torek, Drin, Maret, Sera, Nils, Kosse, Naia, Pael, Tev, Ren)
- NPC naming: Krenn System conventions — compact, consonant-heavy, first-name-primary in social contexts (Kael, Voss, Lera, Torek, Drin, Maret, Naia, Sera, Nils, Kosse, Pael, Tev, Ren)
- Bar naming: "The Last Shift" (official), "Lera's" (informal, used by regulars)
- Atmosphere: "quotidian-with-undertow" — comfortable enough to be complacent, tight enough that extra income is tempting
- Sensory: span gate hum, industrial lubricant, recycled air, cargo machinery
+605
View File
@@ -0,0 +1,605 @@
# Content Directory Structure — The Settled Reach v0.1
**Ticket:** #384 (blocks #385: directory skeleton, #386: schema definitions)
**Status:** Design specification
**Authority:** This document is the source of truth for the `content/` directory layout. The server team implements the directory skeleton (#385) and schema files (#386) against this spec.
**Decisions referenced:** D-024 (10-axis NPC model), D-027 (vertical slice), D-028 (dialogue architecture), D-032 (monologue partition), D-034 (THE FRIEND), D-035 (tag taxonomy), D-036 (Sova Transit setting), D-049 (YAML format), D-057 (content directory structure)
---
## 1. Overview
The `content/` directory holds all game content in a structured, validated, mod-compatible layout. It is the canonical runtime format consumed by the Rust/bevy_ecs simulation server. All content files are YAML, validated against JSON Schema definitions at build time and deserialized via serde at load time.
This document defines:
- The complete directory tree
- Canonical ID format and naming conventions
- Schema file inventory and purpose
- Validation pipeline (3-tier)
- Migration path from the current wiki (`docs/wiki/`)
The directory structure is designed so that a district is the atomic content pack unit. Districts can be added, removed, or replaced independently. The structure supports future mod overlay without v0.1 implementation.
---
## 2. Top-Level Layout
```
content/
content.yaml # Manifest: district list, content version, load order
_meta/ # Infrastructure metadata (underscore prefix = not game content)
README.md # Explains _meta and _schema conventions
_schema/ # JSON Schema validation files
npc-profile.schema.json
dialogue-pool.schema.json
monologue-pool.schema.json
district.schema.json
triangle.schema.json
routine.schema.json
location.schema.json
fact-catalog.schema.json
global/ # Cross-district content (not district-scoped)
factions/ # Faction profiles
technology/ # Technology definitions
contraband/ # Contraband item profiles
knowledge/ # Shared FactId definitions, entity attribute enums
enums/ # Shared enum values (situations, moods, topics, access tiers)
regions/ # Star system / station metadata
districts/ # Per-district content packs
sova-transit/ # v0.1 district (D-036)
```
### Conventions
- **Underscore prefix** (`_meta/`, `_schema/`): Infrastructure directories. Not game content. The server content loader skips directories starting with `_` when scanning for content files.
- **`content.yaml`**: The manifest file. Lists enabled districts, content version, and load order. The server reads this first.
- **`global/`**: Content that applies across all districts. Faction definitions, shared enums, fact catalogs, and region metadata live here.
- **`districts/`**: One subdirectory per district. Each district is a self-contained content pack.
### Manifest Format
```yaml
# content/content.yaml
version: "0.1.0"
districts:
- id: "sova-transit"
path: "districts/sova-transit"
enabled: true
```
The `version` field tracks content schema version. The `districts` list defines load order. Disabled districts are skipped entirely at load time.
---
## 3. District Structure
Each district directory is the atomic pack unit. It contains everything the server needs to instantiate that district: NPC profiles, locations, dialogue, monologue, routines, and triangle definitions.
```
districts/sova-transit/
district.yaml # District metadata
npcs/ # NPC profile files (one YAML file per NPC)
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/ # Location definition files (one per location)
the-terminal.yaml
the-last-shift.yaml
maintenance-corridors.yaml
templates/ # Social site template definitions
triangles/ # Triangle relationship definitions
hub-power.yaml
worried-knowledge.yaml
bar-tensions.yaml
worried-partner.yaml
informant-question.yaml
dialogue/ # Tagged dialogue line pools
the-terminal/ # Subdirectory per location
dock-worker.yaml # One file per template role
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/ # Tagged monologue line pools (per character)
smuggler/ # Hard partition per D-032
the-terminal.yaml
the-last-shift.yaml
maintenance-corridors.yaml
general.yaml # Location-independent lines
detective/
the-terminal.yaml
the-last-shift.yaml
maintenance-corridors.yaml
general.yaml
routines/ # NPC daily routine schedules
schedules.yaml # All NPC schedules for this district
```
### District Metadata
```yaml
# districts/sova-transit/district.yaml
canonical_id: "krenn.sova.transit"
display_name: "Sova Transit District"
system: "krenn"
station: "sova"
district: "transit"
description: >
A 40-year-old prefab-modular-retrofitted freight logistics hub on Station Sova.
Three social sites: The Terminal (logistics hub), The Last Shift (bar),
and maintenance corridors.
locations:
- "the-terminal"
- "the-last-shift"
- "maintenance-corridors"
npc_count: 17
```
### Subdirectory Rationale
| Directory | Scoped by | Rationale |
|-----------|-----------|-----------|
| `npcs/` | One file per NPC | NPC profiles are the most frequently edited content. One file per NPC enables parallel authoring and clean diffs. |
| `locations/` | One file per location | Location metadata (name, tiles, sightlines, ambient) is independent of NPC content. |
| `templates/` | One file per social site template | Template definitions (roles, triangle slots, NPC capacity) are structural and rarely change after initial authoring. |
| `triangles/` | One file per triangle | Triangle definitions reference NPCs by canonical ID. Separate files enable independent authoring and review. |
| `dialogue/` | Location > role | Dialogue lines are authored per template role at a specific location. The location subdirectory groups all roles present at that location. This matches the authoring workflow: write all dialogue for The Terminal, then all dialogue for The Last Shift. |
| `monologue/` | Character > location | Hard partition by playable character (D-032). Within each character, one file per location plus a `general.yaml` for location-independent lines. |
| `routines/` | Single file per district | All NPC schedules in one file enables cross-NPC scheduling validation (no two NPCs assigned to the same tile at the same time). |
---
## 4. Canonical ID Format
```
{system}.{station}.{district}.{type}.{slug}
```
### Examples
| Canonical ID | Resolves to |
|---|---|
| `krenn.sova.transit.npc.kael-davan` | `districts/sova-transit/npcs/kael-davan.yaml` |
| `krenn.sova.transit.npc.sera-venn` | `districts/sova-transit/npcs/sera-venn.yaml` |
| `krenn.sova.transit.location.the-terminal` | `districts/sova-transit/locations/the-terminal.yaml` |
| `krenn.sova.transit.location.the-last-shift` | `districts/sova-transit/locations/the-last-shift.yaml` |
| `krenn.sova.transit.triangle.hub-power` | `districts/sova-transit/triangles/hub-power.yaml` |
| `krenn.sova.transit.triangle.worried-knowledge` | `districts/sova-transit/triangles/worried-knowledge.yaml` |
### Type Segment Values
| Type | Description |
|------|-------------|
| `npc` | NPC profile |
| `location` | Location definition |
| `template` | Social site template |
| `triangle` | Triangle relationship definition |
### Rules
1. **Canonical IDs are stable references.** Renaming a file does not change its canonical ID. The `canonical_id` field inside each YAML file is the source of truth. File names are a convenience for human navigation; the loader resolves by `canonical_id`, not by file path.
2. **Canonical IDs are globally unique.** No two content files across any district may share a canonical ID. The build-time validator enforces this.
3. **Slugs use kebab-case.** Lowercase, hyphen-separated: `kael-davan`, `the-terminal`, `hub-power`.
4. **Short-form IDs.** Within content files, NPC references use the short form `npc:{slug}` (e.g., `npc:kael-davan`). Location references use `loc:{district}:{slug}` (e.g., `loc:sova-transit:the-terminal`). These short forms are unambiguous within a single district. The full canonical ID is used for cross-district references (future feature).
---
## 5. Schema Specifications
All schema files live in `content/_schema/`. They use JSON Schema draft 2020-12. Each schema file validates one content type.
### Schema Inventory
| Schema File | Validates | Key Constraints | Decision Reference |
|---|---|---|---|
| `npc-profile.schema.json` | `districts/*/npcs/*.yaml` | 10-axis model (want, secret, relationships, tolerance, routine, information, contentment + personality, tells, skills). Tier-conditional fields: `friend_arc` only on FRIEND pattern T1 NPCs. Pattern enum (9 values). Motivation enum (6 values). Access tiers. Trust levels. Triangle membership. | D-024, D-034 |
| `dialogue-pool.schema.json` | `districts/*/dialogue/**/*.yaml` | Role + location scoped. 6 structural tags (id, text, role, access, trust, situation) + 3 selection tags (topic, mood, tags). Knowledge grants per line. Access is a list (multi-tier eligibility). Situation enum: 13 values. Topic enum: 9 values. Mood enum: 8 values. | D-028, D-035 |
| `monologue-pool.schema.json` | `districts/*/monologue/**/*.yaml` | Hard partition by `character` (smuggler/detective, D-032). Trigger enum: 9 types. Prerequisite object (AND-only logic: facts, entity attributes, relationship state). Priority (0-10). Cooldown (ticks). 160 char max per line (display constraint, D-059). | D-032, D-035 |
| `district.schema.json` | `districts/*/district.yaml` | District metadata: canonical_id, display_name, system, station, district slug, description, location list, NPC count. | D-036 |
| `triangle.schema.json` | `districts/*/triangles/*.yaml` | Triangle definition: 3 NPC members (by canonical_id short form), roles within the triangle, fork conditions, resolution states. Self-contained forks (no cross-triangle cascade in v0.1). | D-024, D-047 |
| `routine.schema.json` | `districts/*/routines/*.yaml` | Schedule entries per NPC: phase (Morning/Afternoon/Evening/Night), location, tile coordinates, activity. Deviation entries: trigger condition, override location/tile/activity. Deviations are load-bearing for FRIEND arc spatial staging. | D-034 |
| `location.schema.json` | `districts/*/locations/*.yaml` | Location metadata: canonical_id, display_name, tile bounds, sightline properties, ambient sound reference, social site membership. | D-025, D-036 |
| `fact-catalog.schema.json` | `global/knowledge/*.yaml` | Fact definitions: fact_id, description, discoverable_by (character list), progression (confidence levels with description text), abstract flag (whether fact can reach Direct confidence). | D-035 |
### Schema Design Principles
1. **Required fields are minimal.** Only fields the server needs to instantiate an entity are required. Authoring-only fields (`dual_lens`, `notes`) are optional and ignored at load time.
2. **Enum values are defined in schema, mirrored in `global/enums/`.** The JSON Schema files contain the authoritative enum definitions. The `global/enums/*.yaml` files are the human-readable reference and the source for IDE autocomplete. Both must agree; the build-time validator checks this.
3. **Pattern validation on IDs.** Canonical IDs, line IDs, and reference IDs use regex patterns in the schema to catch malformed references at validation time, before the server ever sees them.
4. **Conditional fields.** The `friend_arc` object in `npc-profile.schema.json` is only present on FRIEND-pattern NPCs. The schema uses JSON Schema `if`/`then` for tier-conditional validation where feasible; otherwise, cross-reference validation at build time catches mismatches.
### Line ID Formats
| Content Type | ID Pattern | Example |
|---|---|---|
| Dialogue | `{location_slug}_{d}_{###}` | `the-terminal_d_001` |
| Monologue (smuggler) | `{location_slug}_m_s_{###}` | `the-terminal_m_s_001` |
| Monologue (detective) | `{location_slug}_m_d_{###}` | `the-terminal_m_d_001` |
| Examine | `{location_slug}_{e}_{###}` | `the-terminal_e_001` |
Line IDs are stable. They are never reused, even if a line is deleted. Numbering gaps are expected and acceptable.
---
## 6. Global Content Structure
```
global/
factions/ # Faction profiles (cross-district)
lattice-commission.yaml
syndics.yaml
the-ring.yaml
concord-assembly.yaml
guardians-of-autonomy.yaml
veil-institute.yaml
the-unbound.yaml
technology/ # Technology definitions
contraband/ # Contraband item profiles
knowledge/ # Shared FactId definitions
contraband.yaml # Contraband-related facts
location.yaml # Location-related facts
investigation.yaml # Investigation-related facts
world.yaml # World/setting facts
relationship.yaml # Relationship-related facts
progress.yaml # Progression-related facts
enums/ # Shared enum values
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)
regions/ # Star system / station metadata
krenn.yaml # Krenn System profile (D-036)
```
### Global Content Rationale
| Directory | Contents | Why Global |
|---|---|---|
| `factions/` | One file per faction. Faction name, description, political stance, NPC membership references. | Factions span districts. An NPC in Sova Transit may belong to a faction headquartered elsewhere. |
| `technology/` | Technology definitions relevant to gameplay (lattice types, span gate specs). | Technology is universal across the setting. |
| `contraband/` | Contraband item profiles (unlicensed lattice components, medical-grade replacements, counter-surveillance tech per D-037). | Contraband types are not district-specific; the same items may appear in multiple districts. |
| `knowledge/` | FactId catalog. Each fact has an ID, description, discoverability, and confidence progression text. | Facts are referenced by NPC profiles, dialogue lines, and monologue prerequisites across all districts. The fact catalog is the single source of truth for what can be known. |
| `enums/` | Enum value definitions. One file per enum type. | Enums are shared vocabulary. Dialogue in any district uses the same 13 situations, 9 topics, and 8 moods. |
| `regions/` | Star system and station metadata. | Region data provides setting context for districts. Multiple districts may exist on a single station. |
### Entity Schema (Attribute Keys)
The 16 EntityKnowledge keys (D-055) are defined in:
```
global/
knowledge/
entity-attributes.yaml # 16 canonical EntityKnowledge keys with value enums
```
This file defines the attribute key names, their categories (Identity, Spatial, Behavioral, Relational, Role-perspective), allowed value types, and the 4 new role-perspective keys (`risk_assessment`, `loyalty_assessment`, `position_integrity`, `moral_weight`).
---
## 7. File Naming Conventions
### General Rules
| Rule | Convention | Example |
|---|---|---|
| Extension | Always `.yaml` (never `.yml`) | `kael-davan.yaml` |
| Case | kebab-case for all filenames | `the-terminal.yaml`, `hub-power.yaml` |
| NPC files | Named by NPC slug | `kael-davan.yaml`, `sera-venn.yaml` |
| Location files | Named by location slug | `the-terminal.yaml`, `the-last-shift.yaml` |
| Triangle files | Named by triangle slug | `hub-power.yaml`, `worried-knowledge.yaml` |
| Dialogue files | Named by template role | `dock-worker.yaml`, `bar-owner.yaml` |
| Monologue files | Named by location (inside character subdirectory) | `smuggler/the-terminal.yaml` |
| General monologue | `general.yaml` for location-independent lines | `smuggler/general.yaml` |
| Enum files | Named by enum type (plural) | `situations.yaml`, `moods.yaml` |
| Faction files | Named by faction slug | `lattice-commission.yaml`, `the-ring.yaml` |
| Fact files | Named by fact category | `contraband.yaml`, `investigation.yaml` |
### Directory Naming
- District directories use the district slug: `sova-transit/`
- Dialogue subdirectories use the location slug: `the-terminal/`
- Monologue subdirectories use the character name: `smuggler/`, `detective/`
### What NOT to Do
- Do not use CamelCase or PascalCase in filenames.
- Do not use underscores in filenames (underscores are reserved for line ID segments).
- Do not abbreviate names: `maintenance-corridors.yaml`, not `maint-corr.yaml`.
- Do not nest deeper than 3 levels within a district directory.
---
## 8. Mod-Compatible Conventions
The directory structure is designed to support future mod overlay, where a mod mirrors the same tree and the loader merges mod content with base content. v0.1 does not implement overlay loading, but the structure is ready for it.
### Design Principles
1. **District as atomic pack unit.** A mod can add an entirely new district by placing a new directory under `districts/`. No existing files need modification.
2. **Mirrored tree.** A mod that modifies existing content mirrors the exact same directory structure. For example, a mod adding an NPC to Sova Transit would place a file at `mod-name/districts/sova-transit/npcs/new-npc.yaml`.
3. **Canonical IDs prevent collisions.** Because canonical IDs include the system/station/district prefix, mods in different districts cannot accidentally collide. Mods in the same district use a mod-specific prefix convention (future spec).
4. **Global content extension.** A mod can add new factions, facts, or enum values by placing files in `mod-name/global/`. The overlay loader (future) merges these with base global content.
### v0.1 Scope
- The directory structure is mod-compatible by design.
- No overlay loader is implemented in v0.1.
- No mod tooling, mod manifest format, or mod loading order is defined in v0.1.
- These are future tickets. The only v0.1 requirement is that the base content structure does not preclude mod overlay.
---
## 9. Validation Pipeline
Content validation operates at three tiers. Each tier catches different classes of errors. All three must pass for content to be considered valid.
### Tier 1: Authoring-Time (IDE)
**Tool:** YAML Language Server + JSON Schema association
**What it catches:** Syntax errors, missing required fields, wrong field types, invalid enum values.
Configuration: each YAML content file includes a `$schema` comment or the IDE is configured to associate `_schema/*.schema.json` files with the corresponding content directories.
```yaml
# Example: NPC profile with schema association
# yaml-language-server: $schema=../../_schema/npc-profile.schema.json
canonical_id: "npc:kael-davan"
display_name: "Kael Davan"
# ...
```
This tier is optional (not all authors use IDE schema validation) but strongly recommended. It provides instant feedback during authoring.
### Tier 2: Build-Time (`make validate-content`)
**Tool:** `tooling/content-tools validate content/` (Rust CLI)
**What it catches:** Everything Tier 1 catches, plus cross-reference errors.
Build-time validation runs two passes:
**Pass 1 — JSON Schema validation:**
- Every YAML file in `content/` is validated against its corresponding `_schema/*.schema.json` file.
- File-to-schema mapping is determined by directory location (all files in `districts/*/npcs/` validate against `npc-profile.schema.json`).
- All errors are collected and reported at once (no fail-on-first).
**Pass 2 — Cross-reference validation:**
- All `canonical_id` references resolve to existing files.
- All FactId references in prerequisites resolve to defined facts in `global/knowledge/`.
- All NPC relationship targets (`npc:{slug}`) resolve to existing NPC profiles.
- All location references (`loc:{district}:{slug}`) resolve to existing location files.
- All triangle member references resolve to existing NPC profiles.
- No duplicate `canonical_id` values across all files.
- Enum values in content files match definitions in `global/enums/`.
- Monologue character partitions are correct (no smuggler lines in detective files, no detective lines in smuggler files).
- Routine schedule locations resolve to existing location files.
**Exit code:** 0 if all checks pass, non-zero if any errors. CI gate: content changes must pass `make validate-content`.
### Tier 3: Load-Time (Server Startup)
**Tool:** Rust `serde_yaml` deserialization + semantic validation in `server/src/content/`
**What it catches:** Type mismatches between YAML and Rust structs (schema drift), semantic errors that require runtime context.
Load-time validation runs in sequence:
1. **Deserialization:** `serde_yaml::from_str()` deserializes each YAML file into the corresponding Rust struct. Any type mismatch, missing required field, or unrecognized enum value causes an immediate load failure. This catches schema drift between the JSON Schema definitions and the Rust struct definitions.
2. **StableId assignment:** Deterministic integer IDs are assigned from sorted canonical IDs. This produces repeatable entity IDs across loads.
3. **Relationship wiring:** Canonical ID references (`npc:{slug}`) are resolved to StableIds. Unresolvable references cause load failure.
4. **FriendArc bonding:** FRIEND-pattern NPC profiles are linked to their bonded playable character via StableId.
5. **Schedule validation:** Routine entries are checked for location/tile validity.
**Failure mode:** The server fails fast on any load-time error. No partial loads. All content must be valid or the server does not start. This is intentional: partial content loads produce subtle, hard-to-debug runtime errors.
---
## 10. Migration Path
### Current State
Game content currently lives in `docs/wiki/`, organized as human-readable Markdown files:
```
docs/wiki/
npcs/ # NPC profile pages (Markdown)
factions/ # Faction descriptions
knowledge/ # FactId catalog, entity attributes
locations/ # Location descriptions
contraband/ # Contraband profiles
technology/ # Technology descriptions
world/ # World-building (Krenn System, Sova Station)
authoring/ # Authoring guides and style references
index.md # Wiki index
```
### Migration Strategy
The wiki (`docs/wiki/`) remains the authoring source during v0.1. Authors write and edit in the wiki. The `content/` directory is the runtime format — what the server loads.
The conversion from wiki Markdown to runtime YAML is a **manual process** during v0.1, tracked as ticket #398 (future). The process:
1. Author writes/edits NPC profile in `docs/wiki/npcs/kael-davan.md`.
2. Author (or tooling) converts the profile to `content/districts/sova-transit/npcs/kael-davan.yaml`, conforming to `_schema/npc-profile.schema.json`.
3. `make validate-content` confirms the YAML is valid.
4. Server loads from `content/`.
### Mapping Table
| Wiki Source | Content Target | Notes |
|---|---|---|
| `docs/wiki/npcs/*.md` | `content/districts/sova-transit/npcs/*.yaml` | One-to-one mapping. Wiki profile is the human-readable source; YAML is the machine-readable runtime format. |
| `docs/wiki/factions/*.md` | `content/global/factions/*.yaml` | Faction profiles converted to structured YAML. |
| `docs/wiki/knowledge/fact-catalog.md` | `content/global/knowledge/*.yaml` | Single Markdown catalog splits into per-category YAML files. |
| `docs/wiki/knowledge/entity-attributes.md` | `content/global/knowledge/entity-attributes.yaml` | EntityKnowledge key definitions. |
| `docs/wiki/contraband/*.md` | `content/global/contraband/*.yaml` | Contraband item profiles. |
| `docs/wiki/locations/*.md` | `content/districts/sova-transit/locations/*.yaml` | Location metadata extracted from descriptions. |
| `docs/wiki/world/*.md` | `content/global/regions/*.yaml` | System/station metadata. |
| (new content) | `content/districts/sova-transit/dialogue/**/*.yaml` | Dialogue pools are new content authored directly in YAML. No wiki source. |
| (new content) | `content/districts/sova-transit/monologue/**/*.yaml` | Monologue pools are new content authored directly in YAML. No wiki source. |
| (new content) | `content/districts/sova-transit/routines/*.yaml` | Routine schedules are new content authored directly in YAML. No wiki source. |
| (new content) | `content/districts/sova-transit/triangles/*.yaml` | Triangle definitions are new content authored directly in YAML. No wiki source. |
### What the Wiki Is NOT
The wiki is not deprecated. It remains the primary authoring and review surface for narrative content. Authors should not be expected to write raw YAML for narrative text. The conversion to YAML is a production step, not an authoring step.
Dialogue, monologue, routines, and triangles are exceptions: these content types are authored directly in YAML because their structure is inherently machine-readable (tagged line pools, schedule entries, relationship definitions). The schemas provide IDE autocomplete for these files.
---
## Appendix A: Complete Directory Tree (v0.1)
```
content/
content.yaml
_meta/
README.md
_schema/
npc-profile.schema.json
dialogue-pool.schema.json
monologue-pool.schema.json
district.schema.json
triangle.schema.json
routine.schema.json
location.schema.json
fact-catalog.schema.json
global/
factions/
lattice-commission.yaml
syndics.yaml
the-ring.yaml
concord-assembly.yaml
guardians-of-autonomy.yaml
veil-institute.yaml
the-unbound.yaml
technology/
contraband/
knowledge/
contraband.yaml
location.yaml
investigation.yaml
world.yaml
relationship.yaml
progress.yaml
entity-attributes.yaml
enums/
situations.yaml
topics.yaml
moods.yaml
access-tiers.yaml
trust-tiers.yaml
triggers.yaml
patterns.yaml
motivations.yaml
regions/
krenn.yaml
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
templates/
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
```
## Appendix B: Enum Value Reference (v0.1)
For quick reference during authoring. Authoritative source: `content/global/enums/*.yaml`.
**Situations (13):** `arrival`, `shift_start`, `shift_end`, `shift_transition`, `bar_evening`, `night_shift`, `investigation`, `confrontation`, `social`, `alone`, `emergency`, `routine`, `observation`
**Topics (9):** `colleague`, `routine`, `cargo`, `money`, `trust`, `danger`, `institution`, `personal`, `investigation`
**Moods (8):** `fond`, `comfortable`, `worried`, `suspicious`, `analytical`, `conflicted`, `concerned`, `relieved`
**Access Tiers (5):** `public`, `insider`, `authority`, `peer`, `hostile`
**Trust Tiers (3):** `surface`, `real`, `secret`
**Monologue Triggers (9):** `enter_location`, `observe_npc`, `hear_sound`, `observe_anomaly`, `post_conversation`, `discover_evidence`, `witness_interaction`, `time_idle`, `return_visit`
**NPC Patterns (9):** `FRIEND`, `MIRROR`, `ANCHOR`, `GHOST`, `CATALYST`, `THRESHOLD`, `REMNANT`, `SYSTEM`, `NOBODY`
**NPC Motivations (6):** `HANDLER`, `WITNESS`, `TURNCOAT`, `CIVILIAN`, `OPERATOR`, `SKEPTIC`
**NPC Tiers (3):** `1` (production-level), `2` (full template), `3` (background)
---
*Ticket #384 — Content directory structure design. Blocks #385 (directory skeleton) and #386 (schema definitions).*
+750
View File
@@ -0,0 +1,750 @@
# Dual Lens Authoring Guide
**v0.1 Content Design Document** | Blocks: 11 downstream tickets | Status: Draft
**Author:** Mellanie (Copywriter) + Paula (Narrative & Political Depth)
**Date:** 2026-02-12
---
## Document Purpose
This guide defines how content authors write for two playable characters experiencing the same world through different perspectives. Every dialogue line, monologue line, and NPC profile must work for BOTH the smuggler AND the detective. Same world. Two lenses. Zero shared monologue lines. Maximum narrative divergence from minimal content duplication.
**Critical Dependencies:**
- D-027: Vertical slice — smuggler + detective two-character proof
- D-028: Dialogue architecture — tagged line pools with four relational layers
- D-032: Separate monologue pools per character (hard partition, non-negotiable)
- D-034: THE FRIEND — production-level NPC pattern
- D-035: Converged tag taxonomy for dialogue and monologue line pools
---
## Chapter 1: Core Identity + Emotional Starting State
### Who Is The Smuggler?
**Occupation:** Logistics worker, Sova Transit District Freight Terminal ("The Terminal")
**Ring Position:** Mid-level operator. Handles physical cargo routing, knows the schedule windows, manages dock-side coordination.
**Time in Ring:** ~2 years. Comfortable with the work. Good at it.
**Lattice Tier:** Baseline (standard civilian-grade, no augmentation)
**What They Know At Session Start:**
- The ring exists. Who's in it: Nils (coordinator), Kael (closest colleague, ring member), Voss (shift supervisor, takes a cut), Renn (courier), and 2-3 others.
- The routes: freight bay → service corridor → temp storage → bar back room.
- The cargo: unlicensed lattice components, medical-grade neural replacements diverted from Syndic supply chains. They don't look too closely at the sealed containers.
- The schedule: shift transitions create 20-minute oversight gaps. The operation runs during these windows.
- The stakes: if caught, it's a Commission offense. Years in detention. But the money helps, the team is solid, and it's felt manageable for two years.
**What They Don't Know:**
- The detective is investigating (unless playing detective path and the smuggler has been flagged).
- Kael is trying to exit the ring. Meeting unknown contacts. Lying to the smuggler.
- Sera (Commission field tech) has flagged manifest discrepancies and is sitting on unreported evidence.
- The full upstream supply chain (knows cargo comes from off-station contact Sabel, doesn't know Syndic connections).
- How much Naia (Kael's partner) suspects. How much danger the ring is actually in.
**Emotional Baseline:**
- **Comfortable-tense.** Not happy, not miserable. The smuggler is managing a life with two faces: legitimate dock worker (public) and ring operator (hidden). The cognitive load is constant but bearable. The money eases the financial pressure that makes station life tight for most workers. The team feels like family — shared risk creates trust.
- **Loyal to people, not institutions.** First-name basis with everyone. Thinks relationally: Kael is "my shift partner," not "dock worker Davan." Voss is "tense today," not "the shift supervisor is agitated." Institutions (Commission, Concord, Syndic) are distant, abstract, often adversarial.
- **Operational thinking mode.** Time-aware, route-aware, schedule-aware. Worries about exposure: "Is Torek's spending too visible?" "Did Maret notice that manifest discrepancy?" "Is the detective going to connect Kael to the irregularities?"
- **Protectiveness over the team.** Would cover for Kael even at personal cost. Would warn Voss if something looked wrong. The ring isn't just work — it's the people the smuggler eats lunch with, drinks with, trusts.
---
### Who Is The Detective?
**Occupation:** Commission investigator, assigned to Sova Transit District for manifest irregularity investigation
**Assignment Duration:** New arrival. Session start is early in the investigation (first week).
**Lattice Tier:** Standard professional (Commission-grade diagnostic tools, analytical overlays, not investigative-tier augmentation)
**What They Know At Session Start:**
- There are manifest discrepancies tied to Sova Transit District freight operations. Containers logged but not reconciled with incoming manifests. Pattern suggests smuggling.
- Names from case files: Voss (shift supervisor), Maret (freight scheduler), Drin (dock inspector). Persons of interest, not confirmed suspects.
- Sova Transit District social geography: The Terminal (logistics hub), The Last Shift (bar, social nexus), maintenance corridors (off-books access routes).
- Institutional context: The previous Commission liaison rotated out 3 months ago. Current Commission presence is minimal (Sera Venn, field tech, not an investigator).
- Sera Venn is a pre-existing contact. Same institutional background, transferred to Sova a year ago. Reliable. The detective's one friendly face in the district.
**What They Don't Know:**
- Who the ring members are (Nils, Kael, Renn, etc. — names without context).
- The smuggler's identity. If the smuggler is in the ring, the detective doesn't know yet.
- Kael is trying to exit the ring. Sera is sitting on unreported evidence. Naia is worried about Kael and has confided in Sera.
- The social web connecting everyone. Who's loyal to whom. Who's protecting whom. Who's compromised and how.
- How embedded the ring is in the district's economic immune system. The detective reads it as criminal enterprise. Doesn't yet understand it as community survival mechanism.
**Emotional Baseline:**
- **Professional-cautious.** The detective is trained to observe, analyze, withhold judgment until evidence accumulates. But they're also human — isolation in an unfamiliar community, reliance on Sera for social grounding, awareness that non-cooperation is the district default.
- **Analytical habit.** Counts things. Tracks frequencies. Flags inconsistencies. Self-directs: "filing it," "noted," "coincidence?" Internal bookkeeping runs in background. The institutional training doesn't turn off.
- **Institutional frame.** Thinks in terms of evidence, patterns, leverage. Surnames before first names for targets. "Davan, K." not "Kael." The shift from surname to first-name IS a relationship marker.
- **Moral position.** The detective believes in the work. Smuggling isn't victimless — unlicensed lattice components can cause neural degradation, medical-grade replacements diverted from Syndic supply chains mean someone else doesn't get the replacement they need. The ring is breaking the law. The investigation is justified. But the detective is also starting to see the grey: Kael isn't a cartel boss, he's a dock worker who said yes once and kept saying yes. Complexity accumulates.
---
### Starting State Comparison
| Dimension | Smuggler | Detective |
|-----------|----------|-----------|
| **Knowledge of the ring** | Insider. Knows who, what, when, where. Operational detail. | Suspects. Has data anomalies, no confirmed names. Investigative frame. |
| **Relationship to NPCs** | Personal. First-name basis. History, trust, loyalty. | Clinical. Surname-first. Categorizes by role and behavior. |
| **Emotional orientation** | Protective. Worries about people. "Is Kael okay?" | Analytical. Worries about patterns. "Why is Kael nervous?" |
| **Lattice capability** | Baseline. No enhanced perception, no analytical overlays. | Professional. Diagnostic access, pattern recognition tools. |
| **Social position** | Insider. Belongs. Everyone knows the smuggler. | Outsider. Institutional authority resented by the community. |
| **Moral framing** | Pragmatic complicity. "We're careful. We take care of our own." | Institutional clarity. "This is a crime. There are victims." |
| **What threatens them** | Exposure (being caught, losing the team). | Failure (case goes cold, ring stays hidden). |
---
## Chapter 2: The Dual-Lens Rule
### The Core Test
Every content piece — dialogue line, monologue line, NPC profile axis — must work for BOTH characters. Ask:
1. **Does this line make sense if the smuggler experiences it?**
2. **Does this line make sense if the detective experiences it?**
3. **Does this line reveal something different to each character?**
4. **Is the access tier correct for both characters?**
5. **Does this line advance at least one character's emotional arc?**
If the answer to 1 or 2 is "no," the line is broken. If the answer to 3 is "no," the line isn't dual-lens — it's just generic.
---
### Three Types of Dual-Lens Difference
**Type 1: Access Difference**
The smuggler hears a line the detective doesn't (or vice versa) because of `access` tier filtering.
*Example:*
```yaml
- id: terminal_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]
dual_lens:
smuggler: "Operational context — part of the ring pipeline. 'Backed up' is cover language."
detective: "Anomaly — overnight exceeds standard procedure. Flag for investigation."
```
Both characters can hear this line (`public` + `peer` both accessible). But the smuggler ALSO hears ring-specific operational dialogue that the detective never accesses:
```yaml
- id: terminal_d_045
role: dock_worker
text: "4471's routed for transfer at 14:30. Voss kept the window clear."
access: [insider]
trust: real
situation: [shift_transition]
dual_lens:
smuggler: "Confirmation — the route is active, Voss is cooperating."
detective: "Never hears this line. Doesn't have insider access."
```
**Type 2: Interpretation Difference**
Both characters hear the same NPC dialogue, but their monologue reactions interpret it differently.
*Shared dialogue line:*
```yaml
- id: bar_d_033
role: bartender
text: "Sera left early. Headache, she said."
access: [public]
trust: surface
```
*Smuggler monologue reaction:*
```yaml
- id: bar_m_051
character: smuggler
trigger: post_conversation
text: "Sera's gone. Good — one less Commission presence in the room."
mood: [relieved]
```
*Detective monologue reaction:*
```yaml
- id: bar_m_052
character: detective
trigger: post_conversation
prerequisite:
known_attributes:
subject: sera_venn
key: behavior_flags
value_contains: avoidance_pattern
text: "Second time Sera's left when Torek arrived. Coincidence?"
mood: [suspicious]
```
Same dialogue. Smuggler reads it as relief (less oversight). Detective reads it as a behavioral tell (avoidance pattern forming).
**Type 3: Emotional Weight Difference**
The relationship history creates different emotional stakes for the same observation.
*Observation trigger:* Kael checking his lattice for the third time in ten minutes.
*Smuggler monologue:*
```yaml
- id: terminal_m_011
character: smuggler
trigger: observe_anomaly
prerequisite:
relationship_state: Friendly
subject: kael_davan
text: "Kael keeps checking his lattice. Waiting for a message? Not like him to be jumpy."
mood: [concerned]
topic: [colleague]
```
*Detective monologue:*
```yaml
- id: terminal_m_042
character: detective
trigger: observe_anomaly
prerequisite:
relationship_state: Known
subject: kael_davan
text: "Dock worker Davan — lattice activity spiked. Expecting a message? Or checking for surveillance?"
mood: [analytical]
topic: [investigation]
```
Same behavior. Smuggler worries about a friend ("Not like him"). Detective analyzes a subject ("Dock worker Davan"). Emotional weight is asymmetric.
---
### Tag Implications
The dual-lens rule is enforced through the tag taxonomy (D-035). Here's how tags create different content surfaces from the same pool:
**`access` Tag — Hard Filter (D-028 Layer 1)**
| Access Tier | Who Gets It | Smuggler Example | Detective Example |
|-------------|-------------|------------------|-------------------|
| `public` | Everyone | Bar greeting, shift small talk | Commission procedural questions |
| `peer` | Known or Friendly relationship | Coworker gossip, shift complaints | Institutional background sharing (Sera to detective) |
| `insider` | Friendly relationship only | Ring operational talk, close confidences | Never unlocked for ring NPCs (detective is outsider) |
| `authority` | Detective only, works at Unknown/Known/PersonOfInterest | Institutional leverage questions | Smuggler never has authority access |
| `hostile` | Hostile relationship only | Threats, final warnings | Post-cover-blown confrontation |
**Critical rule:** When Kael transitions from Friendly to PersonOfInterest (THE FRIEND contradiction), `insider` and `peer` lines LOCK OUT. The smuggler still sees Kael, still interacts with Kael, but the warm operational dialogue disappears. That absence IS the emotional payload.
**`trust` Tag — Hard Filter (D-028 Layer 3)**
Within each access tier, `trust` further filters content:
| Trust Level | 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 |
A line tagged `access: [insider], trust: secret` is the deepest content — only available to the smuggler, only when Kael is Friendly, only when trust has been earned through repeated interaction.
**`character` Tag — Hard Partition (D-032)**
Monologue pools are completely separate. The smuggler's monologue pool lives in `monologue-smuggler.yaml`. The detective's pool lives in `monologue-detective.yaml`. **No shared lines.** This is non-negotiable.
Same trigger, different pool. That's how mirror moments work without either pool knowing about the other.
---
### Authoring Workflow
When writing a line:
1. **Write the line.** Concrete, in the speaker's voice.
2. **Check both readings.** Document the dual-lens split in the `dual_lens` field:
```yaml
dual_lens:
smuggler: "How the smuggler interprets this."
detective: "How the detective interprets this."
```
3. **Verify neither reading breaks.** If the line only works for one character, use a different `access` tier or rely on character-specific monologue to recontextualize.
4. **Tag correctly.** The `access`, `trust`, `situation`, `mood`, and `topic` tags must express the dual-lens difference mechanically.
---
## Chapter 3: Access Tier Mapping
### Per-NPC Access Mapping
How each character relates to key NPCs at session start:
| NPC | Smuggler Access | Detective Access | Shift Path (Smuggler) | Shift Path (Detective) |
|-----|----------------|------------------|---------------------|----------------------|
| **Kael Davan (THE FRIEND)** | `insider`, `peer` | `public` → `authority` (if flagged) | `insider` → locked out (post-contradiction, PersonOfInterest) | `public` → `authority` (investigation progresses) |
| **Sera Venn (THE FRIEND)** | `public` (Commission, wary) | `peer` → `authority` (post-contradiction) | No shift (smuggler doesn't develop relationship) | `peer` → `authority` (trust breaks, PersonOfInterest) |
| **Voss (shift supervisor)** | `insider` (colleague, knows smuggler is ring) | `authority` | `insider` → `hostile` (if cover blown) | `authority` → `peer` (if detective earns trust) |
| **Lera Sessik (bar owner)** | `insider` (bar regular, ring-aware) | `public` → `peer` (repeat visits) | No major shift | `public` → `peer` (regular status, 3-4 visits) |
| **Naia Tamm (Kael's partner)** | `peer` (through Kael) | `public` → `peer` (through Sera) | `peer` → `hostile` (if Naia learns truth about ring) | `public` → `peer` (Sera introduction) |
| **Torek Lintar (bar regular)** | `insider` or `peer` (depends on whether smuggler knows Torek's ring connection) | `public` | No shift | `public` → `authority` (if financial tells flagged) |
| **Maret Korr (freight scheduler)** | `insider` (hub colleague) | `authority` | No major shift | `authority` → `peer` (if Maret cooperates) |
| **Drin Rosta (dock inspector)** | `insider` (hub colleague, smuggler knows Drin is compromised) | `authority` | `insider` → `hostile` (if Drin turns informant) | `authority` (detective can pressure via gambling debt) |
---
### Access Tier Shift Paths (Per Social Site)
**The Terminal (Logistics Hub)**
| Character | Starting Tier | Likely Shift | Trigger | Content Requirement |
|-----------|--------------|--------------|---------|---------------------|
| Smuggler | `insider` + `peer` | `insider` → `hostile` | Cover blown — seen with detective, ring member reports suspicion | Dialogue lines for "former colleague now enemy" tone. Monologue lines for paranoia, betrayal. |
| Detective | `authority` | `authority` → `peer` | Earns trust by keeping a minor infraction quiet, helping with a non-smuggling problem | Dialogue lines for "institutional authority softening to personal rapport." Monologue shift from clinical to sympathetic. |
**The Last Shift (Bar)**
| Character | Starting Tier | Likely Shift | Trigger | Content Requirement |
|-----------|--------------|--------------|---------|---------------------|
| Smuggler | `insider` (regular) | `insider` → `hostile` | Social contamination from hub (ring turns on smuggler) | Bar dialogue shifts from warm to cold. Lera stops saving the smuggler's seat. Torek stops buying rounds. |
| Detective | `public` | `public` → `peer` | Repeated visits (3-4), becomes a regular, earns Lera's respect | Greeting dialogue warms. Sera introduces detective to regulars. Access to bar gossip unlocks. |
**The Ring (Smuggling Operations)**
| Character | Starting Tier | Likely Shift | Trigger | Content Requirement |
|-----------|--------------|--------------|---------|---------------------|
| Smuggler | `insider` + `peer` | `peer` → `hostile` | Suspected of cooperation with detective, unauthorized contact (like Kael) | Ring dialogue becomes interrogative. Nils questions loyalty. Operational info stops flowing. |
| Detective | `public` (doesn't know ring exists) | `public` → `hostile` | Stumbles into ring awareness — NPCs react defensively | Immediate evasion. Doors close. No access to insider content, but NPCs' defensive behavior is itself evidence. |
---
### What Access Tier Shifts Mean for Content Packs
Every content pack must support:
1. **Starting state dialogue** — the baseline access tier per character
2. **Shifted state dialogue** — the most likely tier transition per character
3. **Monologue that tracks the shift** — the character's internal reaction to changed access
Example from Kael content pack:
*Starting state (Friendly, insider access):*
```yaml
- id: terminal_d_120
role: dock_worker
text: "Container 4471 is flagged. I'll reroute it during shift transition."
access: [insider]
trust: real
situation: [shift_transition]
notes: "Ring operational talk. Only smuggler hears this."
```
*Shifted state (PersonOfInterest, insider locked out):*
```yaml
- id: terminal_d_121
role: dock_worker
text: "Shift's running smooth today. No issues."
access: [public]
trust: surface
situation: [shift_start]
notes: "Post-contradiction. Kael is surface-normal. The warmth is gone. The insider content is locked."
```
*Smuggler monologue tracking the shift:*
```yaml
- id: terminal_m_122
character: smuggler
trigger: post_conversation
prerequisite:
relationship_state: PersonOfInterest
subject: kael_davan
text: "Same old Kael. Same jokes, same routine. ...What are you not telling me?"
mood: [conflicted]
topic: [colleague]
notes: "Phase 5: Contaminated trust. Every normal interaction is now suspicious."
```
---
## Chapter 4: Divergence Escalation Curve
The vertical slice is 30 minutes. Divergence between the smuggler and detective experiences escalates over time. Here's the minute-by-minute curve:
### Minutes 0-10: Minimal Divergence
**Shared Experience:**
- Both characters enter the same locations (The Terminal, The Last Shift).
- Both see the same NPCs moving through their routines.
- Both hear similar `public`-tier dialogue (greetings, small talk, shift schedules).
- Both experience the same sensory atmosphere (station hum, cargo machinery, recycled air).
**Minimal Differences:**
- Monologue voice is different (smuggler: casual, relational; detective: analytical, institutional).
- NPC greetings vary by recognition (smuggler gets "There you are" from Kael; detective gets "Can I help you?" from Voss).
- The smuggler's monologue references operational context ("shift transition in thirty minutes"). The detective's monologue references investigative context ("manifest discrepancies tied to this hub").
**Player Experience:**
The two characters feel similar. The world is shared. The voice is different, but the content overlap is high. This is intentional — it establishes the baseline before divergence accelerates.
---
### Minutes 10-20: Growing Divergence
**Access Tiers Start to Differ:**
- The smuggler hears `insider` dialogue from Kael, Voss, Lera. Ring operational talk. Close colleague warmth.
- The detective hears `authority` dialogue from Maret, Drin, Voss. Institutional leverage questions. Evasive answers.
- The smuggler's `peer` access to bar regulars unlocks gossip, complaints, social texture. The detective is still `public` at the bar — polite but distant.
**Monologue Pools Diverge:**
- The smuggler's monologue starts tracking operational risk: "Torek's spending is too visible." "Maret's been quiet lately — did she notice something?"
- The detective's monologue starts tracking behavioral tells: "Dock worker Davan — lattice activity spiked." "Voss deflected when I asked about overnight containers."
**NPCs Respond Differently:**
- Kael is warm to the smuggler (Friendly relationship), clinical to the detective (Unknown or Known).
- Sera is warm to the detective (Friendly, pre-existing contact), wary to the smuggler (Commission presence).
- Lera is protective of regulars around the detective (defensive), casual with the smuggler (insider).
**Player Experience:**
The same room. Different colors. Different names. Different monologue. The player who's played both paths starts to notice: "Wait, I didn't hear that line as the detective." The asymmetry is becoming visible.
---
### Minutes 20-30: Maximum Divergence
**Completely Different Internal Experiences:**
**Smuggler (navigating ring crisis):**
- Kael's contradiction discovered. The FRIEND arc is in Phase 3-4 (shock, confrontation).
- Monologue is emotionally loaded: hurt, betrayal, protectiveness, fear of exposure.
- Access to `insider` content at The Terminal and bar. Operational dialogue about shift windows, container routing, risk management.
- Relationship stakes are personal: "Kael is lying to me. What do I do? Confront? Protect? Report to Nils?"
**Detective (uncovering evidence):**
- Sera's contradiction discovered. The FRIEND arc is in Phase 3-4 (pattern confirmed, question asked).
- Monologue is analytically loaded: suspicion, professional conflict, moral cost of using Sera's concealment.
- Access to `authority` content at The Terminal. Institutional leverage. Maret might cooperate. Drin might turn.
- Relationship stakes are institutional: "Sera knows something. Do I press? Report her? Protect her?"
**Zero Overlap in Emotional Journey:**
- The smuggler is inside a community facing internal betrayal.
- The detective is outside a community trying to crack it open.
- The same events (Kael's nervousness, Sera's avoidance, Torek's spending) mean completely different things to each character.
**Player Experience:**
"I was only seeing HALF of this." The replay reveals a completely different game. Not just "I knew different things" — "I cared about different things." The divergence is total.
---
### Content Authoring Implications
| Minutes | Dialogue Overlap | Monologue Overlap | NPC Behavior Overlap | Content Requirement |
|---------|-----------------|-------------------|---------------------|---------------------|
| 0-10 | ~80% | 0% (separate pools) | ~90% (same routines) | Heavy `public` dialogue, light `insider`/`authority` |
| 10-20 | ~50% | 0% | ~70% (NPCs start reacting differently) | Balanced `public`/`insider`/`authority`, access tier shifts begin |
| 20-30 | ~30% | 0% | ~50% (relationships diverged) | Heavy `insider` (smuggler) and `authority` (detective), THE FRIEND arcs at peak |
---
## Chapter 5: Authoring Checklist
Before submitting a line, ask:
### Question 1: Does this line make sense if the smuggler hears it?
**Test:** Read the line aloud. Imagine the smuggler — a dock worker who's been on Sova for years, knows the ring from inside, thinks in operational terms, worries about people. Does this line sound like something an NPC would say TO a smuggler? Or does it assume the listener is an outsider / authority figure?
**Common failures:**
- NPC explains basic station layout to the smuggler (the smuggler already knows).
- NPC uses institutional vocabulary the smuggler wouldn't recognize ("manifest reconciliation protocol" instead of "the paperwork doesn't match").
- NPC is defensive or evasive without cause (why would Kael be evasive with his closest colleague unless something's wrong?).
**Fix:** Rewrite the line for insider context. Or tag it `access: [authority, public]` so the smuggler never hears it.
---
### Question 2: Does this line make sense if the detective hears it?
**Test:** Read the line aloud. Imagine the detective — a Commission investigator, new to the district, analytical training, institutional frame, no prior relationships except Sera. Does this line sound like something an NPC would say TO a detective? Or does it assume the listener already belongs to the community?
**Common failures:**
- NPC uses in-group slang or references without explanation (the detective doesn't have the context yet).
- NPC is too warm / too trusting (why would Voss share operational details with an investigator?).
- NPC volunteers sensitive information unprompted (people don't do that to authorities they don't trust).
**Fix:** Rewrite the line for outsider context. Or tag it `access: [insider, peer]` so the detective never hears it.
---
### Question 3: Does this line reveal something different to each character?
**Test:** If both characters hear this line, do they interpret it differently? Does the smuggler's monologue reaction differ from the detective's? If both characters hear "Container 4471 sat in temp storage overnight," does one read it as operational routine and the other as procedural anomaly?
**Common failures:**
- The line is purely informational with no interpretive space ("The bar opens at 15:00" — both characters just learn the hours).
- The line is so specific to one character's context that the other character's hearing it feels wrong.
- The dual-lens difference isn't meaningful — both characters react the same way.
**Fix:** Add subtext. Create interpretive ambiguity. Or split the line into two versions (one `insider`, one `public`) that say similar things with different connotations.
---
### Question 4: Is the access tier correct for both characters?
**Test:** Check the `access` tag. If it includes `insider`, can the detective reach that tier with this NPC? (Usually no — the detective is an outsider to the ring.) If it includes `authority`, does the smuggler have authority leverage over this NPC? (Usually no — the smuggler is peer-level.)
**Common failures:**
- Line tagged `access: [public, insider]` — both characters hear it, but the insider-specific content makes no sense to the detective.
- Line tagged `access: [authority]` — detective gets institutional leverage questions, but the NPC's answer assumes peer relationship.
- No `access` tag (defaults to `public`) — line contains sensitive information that should be tier-gated.
**Fix:** Be explicit. If the line only works for one character, tag it `access: [insider]` or `access: [authority]` exclusively. If it works for both, tag `access: [public, peer]` and test both readings.
---
### Question 5: Does this line advance at least one character's emotional arc?
**Test:** Does this line move a relationship forward? Deepen trust, reveal a contradiction, escalate tension, provide comfort, create doubt? Or is it purely functional (greeting, filler, repetition)?
**Common failures:**
- Line is generic social lubricant ("Nice weather today" — there's no weather on a station).
- Line repeats information the character already has ("Kael works at the dock" — the smuggler knows this).
- Line doesn't connect to any NPC axis (Want, Secret, Relationship, Tolerance) or triangle tension.
**Fix:** Every line should serve character, relationship, or narrative. If it doesn't, cut it or replace it with a line that does. Content budget is finite. No filler.
---
## Chapter 6: THE FRIEND Specification
### The Pattern
Each playable character has one "FRIEND" NPC — a production-level complex character that exercises every content and systems pipeline at full depth. THE FRIEND is the emotional centerpiece of v0.1 and carries D-027 success criterion #3 ("player names an NPC they felt conflicted about").
**THE FRIEND follows a reusable pattern:**
| Element | Requirement |
|---------|-------------|
| **Relationship phases** | 3+ phases with distinct monologue registers (comfort → doubt → conflict) |
| **Observable contradiction** | Discoverable through observation, not told through dialogue |
| **Sympathetic motivation** | THE FRIEND isn't evil — their concealment comes from care or fear |
| **No clean resolution** | Every choice (confront, ignore, exploit, protect) has consequences |
| **Dual-lens resonance** | The other character's playthrough recontextualizes THE FRIEND's behavior |
| **Triangle integration** | THE FRIEND's contradiction connects to at least one triangle |
| **Tell progression** | 3+ observable behavioral changes the monologue system flags |
| **Dialogue shift** | Pre-discovery and post-discovery dialogue pools feel different |
---
### Smuggler's FRIEND: Kael Davan
**Who:** Dock worker, Sova Transit District Logistics Hub. The smuggler's closest colleague. Ring member. Handles physical cargo routing.
**Surface Presentation (Minutes 0-10):**
Warm, reliable, slightly sardonic. Greets the smuggler with genuine affection. Talks about shift schedules, complains about Voss, asks about the smuggler's weekend. Feels like the best coworker you've ever had.
**What the Smuggler Knows:**
Kael is a ring member. This isn't a secret from the smuggler — it's shared context. They work together on both the legitimate side and the ring side. The smuggler trusts Kael because they've shared risk for two years.
**The Contradiction:**
The smuggler sees Kael in the restricted maintenance corridor (Corridor B-7) talking to someone the smuggler doesn't recognize. Late. Off-shift. The person leaves before the smuggler gets close.
Smuggler monologue: *"That's Kael. But who's he talking to? I don't know that face."*
This is NOT the detective. This is someone from outside the ring's known network. Kael has a side arrangement the smuggler doesn't know about.
**The Shift Arc (Triangle 4: The Worried Partner)**
Kael is at the center of Triangle 4 (Naia-Kael-Sera). His partner Naia is worried about his late nights. Naia has confided in Sera (Commission field tech, the detective's FRIEND). Kael is oblivious to the anxiety he's causing. The unknown contact is someone offering to help Kael exit the ring — to protect Naia. Kael is trying to get out. But from the smuggler's perspective, any unauthorized contact is a security breach.
| Phase | Timing | Smuggler Observes | Monologue Register | Tell |
|-------|--------|------------------|-------------------|------|
| **Phase 1: Comfort** | 0-10 min | Kael is warm, reliable, present. Business as usual. | Fond, casual: *"Kael's already at the dock. Good. The day's better when he's on shift."* | None — baseline comfortable |
| **Phase 2: First Crack** | 10-15 min | Kael checks lattice more often. Excuses himself from lunch early. | Mild concern: *"Kael's distracted today. Probably nothing."* | Behavioral: increased lattice checking, shortened interactions |
| **Phase 3: The Contradiction** | 15-20 min | Corridor B-7. Unknown contact. Spatial deviation. | Alarm + confusion: *"That wasn't anyone from our rotation. And Kael didn't tell me about a meeting."* | Spatial: Kael in unexpected location at unexpected time |
| **Phase 4: Confrontation** | 20-25 min | Smuggler asks. Kael deflects: "Just a thing. Don't worry about it." He's lying. | Betrayal crystallizing: *"He looked left before answering. He always looks left when he's making something up."* | Dialogue: evasion, subject change, the tell confirmed |
| **Phase 5: Contaminated Trust** | 25-30 min | Everything looks normal again. But the smuggler is watching. | Conflicted: *"Same old Kael. Laughing at the same jokes. ...What are you not telling me?"* | Emotional: every warm interaction is now suspicious |
**RelationshipState Transition:**
`Friendly` (green) → `PersonOfInterest` (amber) at Phase 3 contradiction discovery.
**Access Tier Shift:**
`insider` + `peer` dialogue locks out at Phase 3. Kael still talks to the smuggler, but the warmth is gone. Only `public` + `surface` lines remain. That absence IS the narrative.
**Content Requirements:**
~70-100 authored lines (no generation expansion):
- 25-35 dialogue lines (greetings, shift talk, bar casual, ring coordination, deflection, confrontation responses)
- 15-20 trust-gated lines (insider ring talk, close colleague warmth, secret-tier hints about wanting out)
- 5-8 unprompted lines (Kael volunteers info early, warnings/deflections late)
- 10-15 monologue lines (smuggler about Kael: warmth, concern, contradiction discovery, post-confrontation, contaminated trust)
- 10-15 monologue lines (detective about Kael: identification, behavioral observation, suspicion, informant potential)
- 5-8 tell observation lines (lattice checking, distraction, looks-left tell, spatial deviation)
- 3-5 contradiction discovery lines (Corridor B-7 moment from multiple angles)
---
### Detective's FRIEND: Sera Venn
**Who:** Commission field technician, off-duty bar regular. The detective's pre-existing contact in the district. Same institutional background. Transferred to Sova a year ago. The detective's social anchor.
**Surface Presentation (Minutes 0-10):**
Competent, slightly wry, comfortable in the district. When the detective visits the bar, Sera waves them over. Easy rapport. Fills in background — who the regulars are, what the district's like. The detective's guide to an unfamiliar place.
**What the Detective Knows:**
Sera is reliable. She transferred for routine work after a stressful posting elsewhere. She doesn't have skin in the smuggling game. She's the detective's safe harbor.
**The Contradiction:**
Sera always leaves when Torek Lintar arrives at the bar. Always. Three times in a row. Different excuses each time. "Early shift tomorrow." "Headache." "Need to check something at the kiosk."
Detective monologue: *"That's the third time Sera's left when Torek walked in. That's not coincidence."*
**The Shift Arc (Triangle 4: The Worried Partner)**
Sera is at the other node of Triangle 4. Naia (Kael's partner) confides in Sera about Kael's late nights. Sera — being a Commission tech with system access — ran an unofficial compliance check on Kael's work patterns. She found manifest discrepancies. She knows something is wrong. She hasn't reported it because Naia is her friend, and reporting would mean Kael gets investigated, possibly arrested, and Naia's life falls apart. Sera is sitting on unreported evidence. She avoids Torek because Torek is ring-adjacent, and she doesn't want to be seen near him while concealing what she knows.
| Phase | Timing | Detective Observes | Monologue Register | Tell |
|-------|--------|-------------------|-------------------|------|
| **Phase 1: Trust** | 0-10 min | Sera is warm, informative, helpful. Shares district intel freely. | Professional + personal warmth: *"Good to see Sera. She always was the reliable one."* | None — baseline comfortable |
| **Phase 2: Background Data** | 10-15 min | Sera mentions Naia (Kael's partner) as "a friend." Naia joins them once. Genuine rapport. | Noting: *"Sera's connected here. Good. She knows the locals."* | Social: Sera has relationships outside institutional channels |
| **Phase 3: The Pattern** | 15-20 min | Third departure when Torek arrives. Three different excuses. Same result. | Suspicion activating: *"That's the third time. Three excuses, one result. That's data."* | Behavioral: avoidance pattern, excuse variety, timing correlation |
| **Phase 4: The Question** | 20-25 min | Detective asks about Torek. Sera tenses. Deflects: "He's just loud. I don't like loud drunks." | Professional analysis + personal conflict: *"She's not lying. But she's not telling me everything."* | Dialogue: controlled deflection, topic change, re-establishing warmth quickly |
| **Phase 5: Contaminated Trust** | 25-30 min | Sera continues being helpful. Maybe MORE helpful — compensating. | Analytical doubt: *"Still the same Sera. Still reliable. ...But reliable about what?"* | Emotional: detective's observation lines shift from trusting to evaluating |
**RelationshipState Transition:**
`Friendly` (green) → `PersonOfInterest` (amber) at Phase 3 pattern confirmation.
**Access Tier Shift:**
`peer` dialogue available at Phase 1-2. At Phase 3, `authority` dialogue unlocks (detective can press institutional leverage questions). `peer` warmth remains but is contaminated.
**Content Requirements:**
~70-100 authored lines (no generation expansion):
- 25-35 dialogue lines (bar greetings, district orientation, Naia conversation, institutional discussion, deflection about Torek, confrontation responses)
- 15-20 trust-gated lines (peer-tier institutional background, secret-tier hints about what she found)
- 5-8 unprompted lines (Sera volunteers district background early, steers away from sensitive areas late)
- 10-15 monologue lines (detective about Sera: trust/relief, pattern observation, contradiction discovery, post-confrontation)
- 10-15 monologue lines (smuggler about Sera: institutional categorization, avoidance notation, cautious assessment)
- 5-8 tell observation lines (avoidance pattern x3, topic deflection, overcompensation helpfulness, extended kiosk time)
- 3-5 contradiction discovery lines (third departure from multiple angles)
---
### Why THE FRIEND Works Narratively
**Kael's contradiction isn't "Kael is secretly evil."**
The contradiction is "Kael is secretly desperate, and his desperation is making him do exactly the kind of thing that could get everyone caught." The smuggler's anger is justified (protocol breach). Kael's motivation is sympathetic (protecting family). No clean answer. That's the conflict.
**Sera's contradiction isn't "Sera is corrupt."**
The contradiction is "Sera is a good person making a terrible choice: loyalty to a friend vs. duty to her institution." The detective's discovery doesn't reveal a villain — it reveals a moral compromise the detective might understand. The question becomes: do I report Sera? Use what she knows? Confront and risk losing my only ally?
**Dual-Lens Resonance:**
The smuggler who's played the detective path knows the investigation is closing in — Kael's exit attempt reads differently (not betrayal, desperation). The detective who's played the smuggler path knows why Sera is protecting Naia — Sera's silence reads differently (not corruption, loyalty).
---
## Chapter 7: Voice Signature
### 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. | *"Kael's here. Good."* |
| **Vocabulary** | Concrete, physical, sensory. Trade jargon (containers, manifests, shifts, routes) without explaining. 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. People 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 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. Filtered through "is this safe for my people?" | *"Transition window opens in fifty minutes."* |
| **Self-reference** | Rare. Thinks about others, not herself. When it occurs, through physical sensation. | *"My stomach dropped"* not *"I feel betrayed."* |
| **Humor** | Dry, situational, understated. Dark when stressed. Never witty. | *"Home sweet home"* about a cargo bay. |
**What the smuggler 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 should feel like it could sit next to these:
1. **Baseline warm:** *"Kael's already at the dock. Good. The day's better when he's on shift."*
2. **Operational:** *"Shift transition in thirty minutes. If Voss kept the schedule thin, the route's clear."*
3. **Concerned:** *"Kael keeps checking his lattice. Waiting for a message? Not like him to be jumpy."*
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."*
5. **Atmospheric:** *"Morning shift. Recycled air and cargo lubricant. Home sweet home."*
#### 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. More structured than the smuggler. Occasional fragments for emphasis. | *"Standard prefab, heavy foot traffic. Let's see what the shift change tells me."* |
| **Vocabulary** | Institutional layer over plain speech. Professional terms: "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. | *"She's not lying. But she's not telling me everything. Sera, what do you know?"* The first-name appeal IS the emotion. |
| **Relationship mode** | Surname-first for targets and unknowns. First-name for allies and trusted. The shift 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 before noticing the person. | *"That's twice now"* before *"Sera leaves."* The count matters more than the actor. |
| **Analytical thinking** | Automatic. Counts, tracks, flags. Self-directs: "filing it," "noted," "coincidence?" Internal bookkeeping. | *"Three times. Three excuses. That's data."* |
| **Self-reference** | More common than the smuggler, but always through professional lens. Monitors 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 the detective 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."*
2. **Pattern recognition:** *"That's the third time. Sera leaves when Torek arrives. Three different excuses, same result. That's not coincidence."*
3. **Personal leak:** *"Good to see Sera. She always was the reliable one. At least someone in this district speaks my language."*
4. **Conflicted:** *"Same booth. Same warm smile. Same offer to buy me a drink. ...Everything except whatever she's not saying."*
5. **Atmospheric:** *"Grain spirit and low conversation. Only place in this district that doesn't smell like freight lubricant."*
#### Anti-Patterns (What the Detective Does NOT Sound Like)
- *"Kael's here. Good."* (Too terse. That's the smuggler. The detective: *"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 — smuggler's register. 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."*
- **Detective:** *"Container in overnight temp. Unusual for a hub this size — turnaround is normally sub-eight hours. Flag it."*
**Trigger:** Entering the bar.
- **Smuggler:** *"Lera's. Grain spirit and noise. Could use both right now."*
- **Detective:** *"The Last Shift. Same crowd as yesterday. Let's see who's NOT here tonight."*
**Trigger:** Noticing Naia Tamm is upset.
- **Smuggler:** *"Naia looks rough today. Should check on her later."*
- **Detective:** *"Tamm seems distressed. Not her baseline. Something at home, or something she's heard?"*
**Trigger:** Hearing raised voices behind a door.
- **Smuggler:** *"Raised voices from the back room. Devra's in there. That's not a brokering call."*
- **Detective:** *"Arguing behind that door. The bartender didn't flinch. Either she's used to it or she knows what it is."*
---
## Conclusion
The dual-lens rule is simple: **one world, two perspectives, zero shared monologue lines.** Every content piece must work for both characters. The smuggler sees home and sees betrayal. The detective sees a crime scene and sees moral complexity. Same NPCs. Same locations. Completely different games.
Write for the voice. Tag for the system. Test for both lenses. Cut ruthlessly.
That's the job.
---
**End Dual Lens Authoring Guide v0.1**
+415
View File
@@ -0,0 +1,415 @@
# Interaction Verb Specification v0.1
**Ticket:** #402
**Status:** v0.1 design spec
**Source:** Workshop output A-04 (D-044), D-INTERACT lead decision (D-051), D-060 (`verbs[]` rename)
**Soft dependency:** NEW-9 (server `InteractionOptions` component)
---
## 1. Overview
The interaction verb system is how the player interfaces with the simulation. Every interaction between the player character and the world is expressed as a **verb** -- a discrete, typed action that triggers server-side processing and produces client-side feedback.
v0.1 uses a **single context-sensitive action button**. When the player presses `[E]` near an interactable entity, the system selects the highest-priority available verb and executes it. The player does not choose between verbs in v0.1 -- the system picks.
Underneath, the architecture supports **N verbs per entity** via the `verbs[]` array. The server computes all available verbs for every entity in the player's perception range on every tick. The v0.1 client reads only `verbs[0]` (the highest-priority option). The v0.2 client will present the full list as a verb wheel or horizontal label row. No server changes are required for this transition.
There are **7 interaction verbs** in v0.1:
| # | Verb | Type | Player Input |
|---|------|------|-------------|
| 1 | Move | Active | WASD keys |
| 2 | Look | Passive | Automatic (perception system) |
| 3 | Monologue | Reactive | Automatic (server-triggered) |
| 4 | Examine Object | Active | Context key on environment |
| 5 | Examine NPC | Active | Context key on NPC |
| 6 | Talk | Active | Context key on NPC |
| 7 | Overhear | Passive | Automatic (proximity-based) |
**Cross-references:**
- Game concept and vertical slice: [D-005](../../decisions/scope.md#d-005), [D-027](../../decisions/scope.md#d-027)
- Perception and fog: [D-011](../../decisions/perception.md#d-011), [D-015](../../decisions/perception.md#d-015)
- Dialogue architecture: [D-028](../../decisions/content.md#d-028)
- Monologue pools: [D-032](../../decisions/content.md#d-032)
- Tag taxonomy: [D-035](../../decisions/content.md#d-035)
- Knowledge graph: [D-041](../../decisions/architecture.md#d-041)
- ObserverSnapshot v3: D-054
---
## 2. Terminology
### `verbs[]` -- the canonical term
A **verb** is a player-initiated or system-triggered interaction with the world. Each entity in the player's perception has a `verbs[]` array listing available interactions, computed by the server every tick.
The term `verbs[]` replaces all prior references to `actions[]`, `AvailableActions`, `EntityInteractions`, and `ActionOption`. This rename was confirmed in the closing round of the v0.1 Content Scoping Workshop (D-060) and applies across:
- Server code (Rust structs and enums)
- Client code (GDScript)
- YAML content files
- Wiki documentation
- Decision files
### Key definitions
| Term | Definition |
|------|-----------|
| **Verb** | A typed interaction between the player character and an entity or the environment. |
| **`verbs[]`** | Per-entity array of available verbs, sorted by priority (index 0 = highest priority). Embedded in `ObserverSnapshot.nearby_interactions`. |
| **Active verb** | Requires player input to execute (Move, Examine Object, Examine NPC, Talk). |
| **Passive verb** | Fires automatically when conditions are met (Look, Overhear). |
| **Reactive verb** | Triggered by the server in response to game events, not by direct player action (Monologue). |
| **Context key** | The single action button (`[E]` in v0.1) that executes the highest-priority available verb on the targeted entity. |
| **Verb priority** | Numeric rank determining which verb the context key executes when multiple are available. Lower number = higher priority. See Section 4. |
---
## 3. Per-Verb Specifications
### 3.1 Move
**The player moves to a tile or location.**
Move is the foundational verb. Physical presence in the world determines what the player can perceive, who they can interact with, and what information they have access to. Movement is not just locomotion -- it is a commitment of time and attention that creates observable behavior for NPCs.
| Aspect | Specification |
|--------|--------------|
| **Trigger** | WASD key input (continuous while held). |
| **UI need** | Character sprite moves on tilemap. Camera follows (locked to character per D-015). Footstep audio triggers (D-038: `sfx_footstep_metal.ogg` / `sfx_footstep_metal_run.ogg`). |
| **Server event** | `PlayerAction::Move(direction)`. Server validates against collision map, updates player entity position, recalculates LOS (symmetric shadowcasting per D-035/perception), updates `ObserverSnapshot` with new visible entities and fog state. |
| **Content requirement** | Collision map per social site. Tile walkability data. No authored text content. |
| **Knowledge impact** | Indirect. Moving into LOS range of an entity may trigger `DirectObservation` knowledge source updates. Moving into proximity range of NPC conversations enables Overhear. Moving to a new location may trigger `enter_location` monologue. |
| **v0.1 scope** | Full implementation. WASD movement, collision, LOS recalculation. Walk speed only (no run toggle in v0.1). |
---
### 3.2 Look
**The player observes the environment through their character's perception.**
Look is the passive observation verb. It fires continuously as long as the player has line-of-sight to entities. The player does not press a button to Look -- the perception system handles it. Look is how the player gains spatial awareness: who is where, what they are doing, and how entities relate to each other in space.
| Aspect | Specification |
|--------|--------------|
| **Trigger** | Automatic. Fires every tick for all entities within the player's LOS (shadowcasting per D-011). No player input required. |
| **UI need** | Entities rendered on tilemap within LOS. Entity color reflects relationship state (D-033: teal for unknown, green for friendly, amber for person of interest, red for hostile). Fog of perception obscures entities outside LOS. Vision cone renders forward/peripheral/blind zones (D-015). |
| **Server event** | Not a discrete event. The perception system continuously evaluates which entities fall within the player's LOS and populates `ObserverSnapshot.visible_entities`. Entity visibility triggers `KnowledgeEvent` updates for position and `last_observed_tick`. |
| **Content requirement** | None directly. Entities must have visual representations (sprite/placeholder). Entity color palette defined in D-033. |
| **Knowledge impact** | Updates `location` key for observed entities (Direct confidence). Updates `last_observed_tick`. If an NPC is observed performing a routine deviation (tell), may set `behavior_flags` and trigger Monologue via `observe_npc` or `observe_anomaly`. |
| **v0.1 scope** | Full implementation. Natural vision cone + fog of perception. No additional perception modes (thermal, camera feeds, etc. are deferred per D-017). |
---
### 3.3 Monologue
**The player character's internal voice reacts to observations and events.**
Monologue is the player character's inner narrator. It is reactive -- triggered by the server based on game events, not by player input. Monologue bridges the gap between the top-down camera and the character's subjective experience (D-016). It is the primary vehicle for character voice, anomaly flagging, atmospheric commentary, and diegetic hints.
Monologue is character-specific. The smuggler and detective have completely separate monologue pools (D-032). Same trigger, different pool, different voice.
| Aspect | Specification |
|--------|--------------|
| **Trigger** | Server-initiated. The monologue system evaluates triggers every tick against the player character's current state. 9 trigger types defined in D-035: `enter_location`, `observe_npc`, `hear_sound`, `observe_anomaly`, `post_conversation`, `discover_evidence`, `witness_interaction`, `time_idle`, `return_visit`. Each monologue line has a `prerequisite` map (AND-only) that gates on knowledge state. |
| **UI need** | Monologue text rendered in world-space layer (not HUD). Character-tinted text (smuggler: amber-white `#f0e0c8`, detective: blue-white `#c8d8f0`). Max 160 characters, max 2 visual lines. Display time 3-6 seconds (length-adjusted). Fade in 0.3s, fade out 0.5s. Monologue chime audio (D-038: `sfx_monologue_chime.ogg`, or `sfx_monologue_chime_urgent.ogg` for anomaly/contradiction triggers). Queue depth 1 (drop lower priority). Cooldown 2s between lines. Priority ordering per D-059. |
| **Server event** | Monologue system selects the highest-priority eligible line from the active character's monologue pool. Sends `MonologueDisplay { id, text, priority, trigger_type }` in `ObserverSnapshot.monologue`. Client renders. |
| **Content requirement** | Separate monologue pool files per character per location (e.g., `monologue-smuggler.yaml`, `monologue-detective.yaml`). Each line tagged per D-035: `character`, `trigger`, `prerequisite`, `priority`, `cooldown`. Estimated volume: ~200 authored monologue lines across both characters for v0.1 (per workshop budget). |
| **Knowledge impact** | Monologue does not directly update the knowledge graph -- it reflects it. However, the *trigger* that caused the monologue (e.g., `observe_anomaly`) may have already updated knowledge. Some monologue lines serve as player-facing confirmation that a knowledge update occurred (e.g., "He checked his lattice again. Third time." confirms `behavior_flags` update). |
| **v0.1 scope** | Full implementation. All 9 trigger types. Prerequisite evaluation against knowledge graph. Priority-based queue. Fires during dialogue (for wow moment #3 -- FRIEND contradiction triggers monologue while the player is in conversation). |
**Priority ordering** (highest to lowest):
| Rank | Trigger Type | Rationale |
|------|-------------|-----------|
| 1 | `observe_anomaly` | Anomalies are rare and time-critical. |
| 2 | `witness_interaction` | NPC-to-NPC events the player should notice. |
| 3 | `discover_evidence` | Direct investigation payoff. |
| 4 | `post_conversation` | Reflection on just-completed dialogue. |
| 5 | `hear_sound` | Sensory input from outside LOS. |
| 6 | `observe_npc` | Commentary on observed NPC behavior. |
| 7 | `enter_location` | Arrival at a new area. |
| 8 | `return_visit` | Revisiting a known area. |
| 9 | `time_idle` | Unprompted reflective thought (wow moment #6). |
---
### 3.4 Examine Object
**The player examines a specific object in the environment.**
Examine Object is how the player investigates environmental elements: terminals, manifests, cargo containers, notices, equipment. It produces descriptive text and may update the knowledge graph with FactId entries.
| Aspect | Specification |
|--------|--------------|
| **Trigger** | Player presses context key (`[E]`) while targeting an examinable object within interaction range. Object must be in LOS and within close range. |
| **UI need** | Context prompt appears when player is in range: `[E] Examine`. On execution, description text displayed in HUD panel (or inline). Text sourced from server (client does not load content files per D-048). |
| **Server event** | `PlayerAction::InteractPrimary(target_stable_id)`. Server resolves verb as `VerbKind::ExamineObject`. Retrieves examine description for the target object. May evaluate knowledge prerequisites (some objects reveal different information based on what the player already knows). Returns `ExamineResult { target_id, description, knowledge_grants }` in `ObserverSnapshot.examine_result`. |
| **Content requirement** | Examine descriptions per examinable object. Detective and smuggler may receive different descriptions for the same object (filtered by access tier per D-028). Environmental objects in the 3 social sites: cargo terminals, manifests, shift schedules, bar fixtures, maintenance panels, door locks. Estimated: ~30-50 examine descriptions across all locations. |
| **Knowledge impact** | May grant new FactId entries (e.g., examining a manifest reveals `fact:shift_schedule_discrepancy`). May update existing EntityKnowledge if the object references an NPC (e.g., examining a terminal shows Kael's access log, updating `routine_pattern` for Kael). Knowledge grants are specified per examine description in the content YAML via `knowledge_grants` field. |
| **v0.1 scope** | Full implementation. Static examine descriptions with access-tier filtering. No multi-step examination (examine once, get the full description). No item pickup (evidence is knowledge, not inventory per D-046). |
---
### 3.5 Examine NPC
**The player observes a specific NPC without initiating contact.**
Examine NPC is passive intelligence gathering. The player studies an NPC from a distance -- watching their behavior, reading body language, noting patterns. This is the detective's primary loop entry point and the smuggler's surveillance mode. Critically, Examine NPC does not alert the target NPC. The player gathers information without social cost.
The separation between Examine NPC and Talk is load-bearing for the investigation loop:
- The detective's loop: **Examine first** (accumulate tells across multiple observations) then **Talk later** (use evidence in confrontation).
- The smuggler's loop: **Talk first** (social, operational, casual) then **Examine when suspicious** ("something's off, let me watch them").
Collapsing Examine and Talk into a single "Interact" verb would break both loops.
| Aspect | Specification |
|--------|--------------|
| **Trigger** | Player presses context key (`[E]`) while targeting an NPC within mid-to-close range and in LOS. Only available when Talk is not the higher-priority verb (see Section 4 for priority resolution). |
| **UI need** | Context prompt: `[E] Observe`. On execution, observation text displayed (behavioral description, tell observations, appearance notes). Text sourced from server. No dialogue UI opens. |
| **Server event** | `PlayerAction::InteractPrimary(target_stable_id)`. Server resolves verb as `VerbKind::ExamineNpc`. Server evaluates target NPC's current behavioral state, active tells, and the observing character's knowledge level. Returns observation description. May trigger `observe_npc` monologue. Updates `InteractionLog` (tracks observation count per target). |
| **Content requirement** | Observation descriptions per NPC, tiered by knowledge state. At `Suspects` confidence: surface-level observations ("Dock worker. Focused on the manifest."). At `KnowsOf`+: behavioral observations ("He's checked his lattice three times this shift. That's not routine."). Tell observation lines per NPC (D-034 specifies 5-8 per FRIEND NPC). Estimated: ~5-10 observation lines per T1/T2 NPC, ~2-3 per T3 NPC. |
| **Knowledge impact** | May update `behavior_flags` (tell observations: "nervous", "schedule_changes", "evasive"). May update `routine_pattern` if the NPC is observed deviating from their known routine. May increment tell observation counter (tracked in `behavior_flags` per D-055). Confidence level may advance from `Suspects` to `KnowsOf` through repeated observation (gated by `InteractionLog` count). |
| **v0.1 scope** | Full implementation. Knowledge-tiered observation descriptions. Tell detection system (NPC behavioral flags mapped to observable tells). No "analyze" sub-verb (lattice-assisted analysis deferred to v0.2). |
---
### 3.6 Talk
**The player initiates conversation with an NPC.**
Talk is active information exchange. The player approaches an NPC and begins a dialogue. This is the primary verb for social gameplay: building trust, gathering information, confronting contradictions, and maintaining cover. Talk has a social cost -- the NPC knows you engaged, and other NPCs may observe the interaction.
Dialogue uses tagged line pools with systemic selection (D-028), not branching trees. Lines are filtered by access tier, trust level, situation, and topic. The server selects and serves dialogue lines; the client displays them.
| Aspect | Specification |
|--------|--------------|
| **Trigger** | Player presses context key (`[E]`) while targeting an NPC within close range and in LOS. Talk takes priority over Examine NPC for most NPCs (see Section 4). |
| **UI need** | Context prompt: `[E] Talk`. On execution, dialogue panel opens (HUD layer). Displays NPC dialogue lines with player response options (selected from eligible pool). Sim speed drops to 50% during dialogue (D-052). Dialogue panel is one of the P0 UI scenes (1 scene, 1 script). Monologue can fire simultaneously in the world layer during dialogue (separate visual layer). |
| **Server event** | `PlayerAction::InteractPrimary(target_stable_id)`. Server resolves verb as `VerbKind::Talk`. Server opens a dialogue session: evaluates access tiers (D-028 Layer 1: insider/outsider/authority/peer/hostile), filters by trust level (D-028 Layer 3: surface/real/secret), applies situation context (D-028 Layer 2), selects eligible lines. Returns `ActiveDialogue { partner_id, lines, response_options }` in `ObserverSnapshot.active_dialogue`. Player selects a response; server processes `PlayerAction::DialogueResponse(choice)`. |
| **Content requirement** | Dialogue pools per template role and location (D-028). ~165-210 authored lines per Tier 2 template, generation-expanded 4x. Four relational layers all present from v0.1: access tiers, relationship history, trust-gated gossip, unprompted disclosure. FRIEND NPCs require ~25-35 dialogue lines + 15-20 trust-gated + 5-8 unprompted (D-034). |
| **Knowledge impact** | Dialogue can grant knowledge through `knowledge_grants` tags on lines. Trust level may advance or degrade based on dialogue choices (relationship history, D-028 Layer 2). `RelationshipState` may transition (Unknown to Known on first conversation, Known to Friendly through repeated positive interaction). Gossip lines may reveal information about third parties (updating EntityKnowledge for NPCs not present in the conversation). |
| **v0.1 scope** | Full implementation of all four dialogue layers. Tagged line pool selection. Access-tier filtering. Trust-gated disclosure. NPC-initiated unprompted disclosure (weighted by trust and mood). Post-contradiction confrontation dialogue (FRIEND arc Phase 4). |
---
### 3.7 Overhear
**The player overhears NPC-to-NPC conversation based on proximity.**
Overhear is environmental intelligence. When the player is within earshot of two or more NPCs having a conversation, fragments of that conversation are presented to the player. Overhear is passive -- the player does not press a button. The player merely needs to be close enough, and the server delivers fragments.
Overhear is the primary mechanism for the player to learn about NPC relationships, concerns, and secrets without direct engagement. It rewards spatial awareness and patience. The quality and completeness of overheard information depends on proximity (D-018: close range = high accuracy, medium range = imprecise).
| Aspect | Specification |
|--------|--------------|
| **Trigger** | Automatic. The server detects when the player character is within hearing range of an active NPC-to-NPC conversation. No player input required. Proximity thresholds follow D-018 three-range sound model: close range (full content, high trust), medium range (fragments, directional, imprecise). |
| **UI need** | Overheard text rendered as fragments -- partial lines, attributed to speakers if in LOS, unattributed if only audible. Visual indicators at fog edge for medium-range overhearing (D-018). Overheard text styled distinctly from monologue and dialogue (italicized or bracketed, lower opacity). No dialogue panel opens. |
| **Server event** | NPC conversation system runs independently of player action. When the player entity is within hearing range, the server includes relevant fragments in `ObserverSnapshot.overheard` as `Vec<OverheardFragment>`. Each fragment contains: `speaker_id` (if visible), `text`, `audibility` (clear/muffled/indistinct), `topic_hint`. |
| **Content requirement** | NPC-to-NPC conversation scripts. These are short, repeating exchanges that NPCs perform as part of their routines. Bar chatter, workplace complaints, shift handover talk, gossip. Key scripted conversations: Kael and colleague discussing schedules (innocuous surface, routine deviation subtext), bar regulars discussing Torek's spending, maintenance workers referencing Drin's absences. Estimated: ~40-60 overheard lines across all social sites. |
| **Knowledge impact** | Overheard content may update `known_associates` (hearing two NPCs talk confirms they interact). May update `behavior_flags` (hearing an NPC complain about schedule changes). May trigger `hear_sound` or `witness_interaction` monologue. Critical for wow moment #3 setup: overhearing references to NPC behavior that the player later observes directly. Knowledge source tagged as `Heard` (D-041), which carries lower confidence than `DirectObservation`. |
| **v0.1 scope** | Full implementation. Proximity-based fragment delivery. Close-range = clear text with speaker attribution. Medium-range = muffled fragments with directional indicator. NPC-to-NPC conversations run on schedule (not dynamically generated). Long-range insert alerts deferred (D-018 stretch goal). |
---
## 4. v0.1 Priority Resolution
v0.1 uses a single context-sensitive action button (`[E]`). When multiple verbs are available on a target, the system selects the highest-priority verb. The player does not choose.
### Priority order
| Priority | Verb | Condition |
|----------|------|-----------|
| 1 (highest) | **Talk** | Target is NPC, in close range, NPC has available dialogue, NPC is not flagged as `PersonOfInterest` with unresolved contradiction |
| 2 | **Examine NPC** | Target is NPC, in mid-to-close range, NPC IS flagged as `PersonOfInterest` with unresolved contradiction (post-contradiction, observation becomes primary) |
| 3 | **Examine NPC** | Target is NPC, in mid range only (too far for Talk) |
| 4 | **Examine Object** | Target is examinable environment object, in close range |
| 5 | **Talk** | Target is NPC, in close range, but NPC has limited/exhausted dialogue pool for current situation |
### Context-sensitive priority shifts
The priority order is not static. It shifts based on game state:
**Default state (pre-contradiction):**
- NPC in close range: `[E] Talk` (Talk > Examine NPC)
- NPC in mid range: `[E] Observe` (Examine NPC, Talk unavailable at this distance)
- Object in close range: `[E] Examine`
**Post-contradiction state (NPC flagged as PersonOfInterest):**
- NPC in close range: `[E] Observe` (Examine NPC > Talk)
- This represents the detective shifting from social mode to surveillance mode, or the smuggler shifting from trust to suspicion
- Talk remains available in v0.2 as a secondary verb (`[F] Talk`)
**Post-confrontation state (after confrontation dialogue):**
- NPC in close range: `[E] Talk` returns to primary (conversation continues, relationship has shifted)
### Resolution rules
1. **Only one verb executes per input.** The context key triggers exactly one verb.
2. **Server computes all available verbs.** The full `verbs[]` array is populated every tick per entity.
3. **Client reads `verbs[0]`.** The v0.1 client displays and executes only the first (highest-priority) verb.
4. **Passive/reactive verbs are not in `verbs[]`.** Look, Monologue, and Overhear are not player-activated and do not appear in the verb array. They fire independently.
5. **`verbs[]` contains only active verbs.** Move, Examine Object, Examine NPC, and Talk are the verbs that can populate `verbs[]`. Move is handled by WASD (not context key), so in practice `verbs[]` contains Examine Object, Examine NPC, and Talk.
---
## 5. Architecture Notes
### How `verbs[]` works at the server level
The server populates `verbs[]` per entity every tick. The computation follows this pipeline:
```
Per-entity verb evaluation (runs in perception phase):
1. Entity type check
- NPC -> eligible for: Examine NPC, Talk
- Object -> eligible for: Examine Object
- Environment -> eligible for: Examine Object (if tagged examinable)
2. Distance check
- Close range -> all eligible verbs available
- Mid range -> Talk removed (requires close range)
- Far range / out of LOS -> no verbs (entity not interactable)
3. Sightline check
- Entity must be in player's LOS (shadowcasting result)
- No interaction through walls or fog
4. Relationship state check
- PersonOfInterest + unresolved contradiction -> Examine NPC priority rises above Talk
- Hostile -> Talk may be removed (NPC refuses engagement)
5. Conversation state check
- NPC in active conversation with another NPC -> Talk unavailable (NPC is busy), Overhear activates passively
- NPC in active dialogue with player -> only DialogueResponse verbs available
6. Dialogue availability check
- NPC with exhausted dialogue for current situation -> Talk priority drops
- NPC with high-priority disclosure queued -> Talk priority rises
7. Priority sort
- Available verbs sorted by priority (see Section 4)
- Result written to verbs[] array on the entity's nearby_interaction entry
```
### Data structures
The `verbs[]` array is embedded in the `ObserverSnapshot` within `nearby_interactions`:
```
ObserverSnapshot {
...
nearby_interactions: Vec<NearbyInteraction>,
...
}
NearbyInteraction {
entity_id: StableId,
entity_type: EntityType,
distance: f32,
verbs: Vec<VerbOption>, // <-- the verbs[] array
}
VerbOption {
kind: VerbKind, // ExamineObject, ExamineNpc, Talk
label: String, // "Examine", "Observe", "Talk"
priority: u8, // lower = higher priority
available: bool, // false if conditions not met (greyed out in v0.2)
}
enum VerbKind {
ExamineObject,
ExamineNpc,
Talk,
}
```
The `VerbKind` enum does not include Move (handled by WASD input), Look (passive perception), Monologue (server-triggered), or Overhear (passive proximity). These verbs operate outside the `verbs[]` system.
### Client reads, server decides
The client is a dumb renderer (D-048, D-052). It does not evaluate content files, compute verb availability, or resolve priorities. The client:
1. Reads `nearby_interactions` from `ObserverSnapshot`
2. For the entity nearest to the cursor/facing direction, reads `verbs[0]`
3. Displays the label as the context prompt: `[E] {verbs[0].label}`
4. On `[E]` press, sends `PlayerAction::InteractPrimary(entity_id)` to the server
5. The server resolves which verb was meant (it already knows -- it computed the array)
### Future extension (v0.2+)
The v0.2 client reads the full `verbs[]` array and presents multiple options:
```
v0.1: [E] Talk
v0.2: [E] Talk [F] Observe
```
No server changes required. The protocol already carries the full verb list. The client simply renders more of it.
Further future: a verb wheel or radial menu for entities with 3+ available verbs (e.g., an NPC near an examinable object -- Talk, Observe, Examine nearby object).
---
## 6. Content Authoring Implications
The verb system defines what content must exist for each interaction type. Content authors need to produce material for each verb that fires on their NPCs, objects, and locations.
### Per-verb content requirements
| Verb | Content Type | Author Responsibility | Estimated Volume (v0.1) |
|------|-------------|----------------------|------------------------|
| **Move** | Collision maps, walkability | Level design (not prose authoring) | 3 social site maps |
| **Look** | Entity sprites/placeholders, color palette | Visual design | 17 NPC representations + objects |
| **Monologue** | Monologue pool YAML files | Mellanie (prose), Gestalt (triggers/prerequisites) | ~200 authored lines, partitioned by character (D-032) |
| **Examine Object** | Examine descriptions per object | Content authors | ~30-50 descriptions across all locations |
| **Examine NPC** | Observation descriptions per NPC, tiered by knowledge | Content authors | ~5-10 lines per T1/T2 NPC, ~2-3 per T3 NPC |
| **Talk** | Dialogue pool YAML files per role and location | Mellanie (prose), content team (tagging) | ~165-210 authored lines per template, 4x generation-expanded (D-028) |
| **Overhear** | NPC-to-NPC conversation scripts | Content authors | ~40-60 overheard lines across all social sites |
### Content file structure
Per the content directory design (D-057):
```
content/districts/sova-transit/
dialogue/
hub-dock-worker.yaml # Talk content: dock worker role at Terminal
hub-supervisor.yaml # Talk content: supervisor role at Terminal
bar-owner.yaml # Talk content: bar owner role at Last Shift
bar-regular.yaml # Talk content: regular role at Last Shift
...
monologue/
monologue-smuggler.yaml # Monologue: all smuggler lines for this district
monologue-detective.yaml # Monologue: all detective lines for this district
examines/
hub-objects.yaml # Examine Object: Terminal equipment, manifests
bar-objects.yaml # Examine Object: bar fixtures, notices
corridor-objects.yaml # Examine Object: maintenance panels, doors
observations/
npc-observations.yaml # Examine NPC: observation descriptions by NPC + knowledge tier
overheard/
hub-conversations.yaml # Overhear: Terminal NPC-to-NPC exchanges
bar-conversations.yaml # Overhear: Last Shift NPC-to-NPC exchanges
corridor-conversations.yaml # Overhear: corridor NPC-to-NPC exchanges
```
### Key authoring rules
1. **Talk requires dialogue pools.** Every NPC the player can Talk to needs dialogue lines tagged with access tier, trust level, and situation. FRIEND NPCs need the full 4-layer treatment (D-028). T3 NPCs need at minimum a greeting pool.
2. **Examine NPC requires observation descriptions.** Every NPC observable at mid range needs at least a surface-level observation description. T1/T2 NPCs need knowledge-tiered descriptions that reveal more as the player's confidence level increases.
3. **Overhear requires NPC-to-NPC conversation scripts.** These are independent of player dialogue pools. They fire when NPCs are near each other on their routines. Content must be written as fragmentary, overheardable exchanges -- not full conversations.
4. **Monologue is triggered by server events, not player choice.** Authors write monologue lines against specific triggers and prerequisites. The server decides when to fire them. Authors cannot assume the player will see monologue in any particular order -- prerequisite gates ensure logical sequencing.
5. **Examine Object descriptions should be character-aware.** The same terminal may show different information to the smuggler (cargo routing details) and the detective (access logs, anomaly flags). Use access tier tags to differentiate.
6. **All text comes from the server.** The client never loads or evaluates content files (D-048). Authors write content that the server selects and serves. The client renders what it receives.
---
*v0.1 specification. 7 verbs, single context-sensitive action, `verbs[]` architecture ready for N-verb expansion. Last updated: 2026-02-12.*
+632
View File
@@ -0,0 +1,632 @@
# THE MIRROR — NPC Pattern Specification
**Pattern Type:** Production-level Tier 1 (emotional depth, full 10-axis model)
**Design Principle:** Transparency as contrast mechanism
**Ticket:** #380
**Reference Implementation:** Naia Tamm (Sova Transit District v0.1)
---
## 1. Pattern Definition
THE MIRROR is the honest-character NPC pattern. No contradiction arc, no deep secret, no hidden agenda. MIRROR NPCs are transparent — what you see is what you get.
**Core mechanic:** Their role in the system is to make surrounding dishonesty visible by contrast. When everyone else is hiding something, the one person who isn't becomes the emotional anchor.
**Design payload:** In a game built around asymmetric information and deception detection, THE MIRROR is the NPC whose absence of deception becomes its own kind of content. The player learns to read tells on every other NPC — facial tics, evasive answers, spatial deviations. Encountering someone without tells is disorienting and emotionally significant.
**Thematic integration:** THE MIRROR connects directly to Gore's contentment axis and the game's central question: "Is this enough?" The MIRROR NPC typically answers: "It was enough — until everything around me started falling apart." Their contentment is genuine, their worry is genuine, their emotional reactions are genuine. That honesty makes everyone else's lies painful by proximity.
---
## 2. Mechanical Rules
### What MIRROR NPCs Do NOT Have
| Absent System | Why Missing | Content Signal |
|--------------|-------------|----------------|
| **No tells** | Tells imply deception or concealment. MIRROR has nothing to conceal from the player (though they may be uninformed about events around them). The absence of tells IS the tell — when the player has learned to read behavioral flags on every other NPC, encountering someone without them is the anomaly. | The player's monologue might note: "No hesitation. No evasion. Either she's telling the truth or she's the best liar I've ever met." The absence becomes noticeable. |
| **No dishonesty ≠ no misinformation** | MIRROR NPCs can be *wrong* without being *deceptive*. A MIRROR who has been lied to will repeat that lie in good faith -- they are transparent about what they believe, not omniscient about what is true. Naia reporting "Kael said he's picking up extra shifts" is honest transmission of a lie she was told. | The player recognizes the MIRROR is being used as an unwitting conduit. This makes the liar's deception feel worse, not the MIRROR's honesty feel cheaper. |
| **No secrets** (or only mundane surface-level ones) | The `secret_held` field is empty or contains only ordinary privacy (e.g., "worried about partner's late nights" — visible to anyone observant). No trust gates that reveal hidden criminal knowledge or conspiracies. | If a MIRROR has a "secret," it's one they'd share with a sympathetic stranger at a bar. There's no revelation moment where the player discovers the MIRROR was hiding something all along. |
| **No contradiction arc** | No phases, no discovery moment, no color shift from green to amber. The relationship with MIRROR is stable across the session. | The trust level may deepen (public → insider → peer), but there's no betrayal moment. The MIRROR you meet at minute 5 is the same MIRROR at minute 25. |
| **No trust-gated dialogue that changes the picture of who they are** | Trust progression reveals more FEELING, not more SECRETS. Deeper access tiers show emotional vulnerability, not concealed information. | At `public` tier: "I'm worried about Kael." At `peer` tier: "I don't know what to do. I love him, but I can't keep living like this." Same truth, deeper emotion. |
### What MIRROR NPCs DO Have
| Present System | Function | Why Essential |
|---------------|----------|---------------|
| **Full 10-axis profile** | Want, Secret/Vulnerability, Relationships 1-3, Tolerance, Routine, Information, Contentment, Personality, Tell (absent), Skills | MIRROR is not a shallow NPC. They're Tier 1 depth — full emotional complexity, just without deception. |
| **Tier 1 emotional depth despite pattern simplicity** | Rich personality, genuine reactions, emotional stakes in the world around them | The player trusts the MIRROR because the MIRROR is WORTH trusting. They're not a cardboard cutout labeled "honest person." They're a complete character whose honesty is part of their identity. |
| **Genuine emotional reactions to the world** | MIRROR NPCs respond to events around them with authentic worry, joy, confusion, anger — whatever fits their personality and situation | When the ring's actions threaten someone the MIRROR loves, the MIRROR's distress is real. The player FEELS it because they've learned this person doesn't perform emotions — they experience them. |
| **Emotional vulnerability as content** | The MIRROR's lack of deception makes them emotionally EXPOSED. They wear their worry visibly. They confide in friends. They react honestly to stress. | This vulnerability is load-bearing. The player becomes protective of the MIRROR. Threats to the MIRROR create player urgency. |
---
## 3. Content Requirements
**Total authored line budget:** 50-70 lines (Tier 1 MIRROR is slightly lower than FRIEND pattern's 70-100, because no contradiction arc content)
| Content Type | Line Count | Function |
|-------------|-----------|----------|
| **Dialogue** | 25-35 | Greetings (5), emotional state conversation (8-10), relationship discussion (5-7), situation responses (5-8), peer-tier vulnerability (3-5) |
| **Trust-gated dialogue** | 10-15 | Deeper emotional exposure at insider/peer tiers. Not secret revelations — emotional revelations. "I'm scared" vs "I'm worried." |
| **Unprompted lines** | 3-5 | MIRROR volunteers emotional state or asks for help. "Have you seen Kael today? I'm worried." |
| **Monologue triggers** | 10-15 per character | Player's internal reaction to MIRROR's honesty. Smuggler: guilt (if protecting someone the MIRROR loves). Detective: relief (finally someone not lying) + strategic value (MIRROR as witness to behavioral change). |
| **Voice sample** | 3-5 lines | Covering: baseline warm, worried, brittle (close to tolerance break) |
**No contradiction discovery content.** No tell observation content (because no tells). No phase-shift dialogue. This is where MIRROR saves budget relative to FRIEND.
### Dual-Lens Distribution
**Smuggler perspective (if MIRROR is connected to a ring member):** Emotional collateral. The MIRROR's worry creates guilt. The smuggler knows WHY the person the MIRROR loves is behaving strangely and can't say. Seeing the MIRROR's distress is a cost of operations.
**Detective perspective:** Potential witness + emotional anchor. A partner who suspects their loved one is hiding something is a classic entry point for investigation. The MIRROR knows behavioral patterns, routines, recent changes. The detective can cultivate trust by being sympathetic.
---
## 4. Tell System Rules
**Core principle:** MIRROR has no tells because tells imply deception or concealment.
### The Absence-as-Content Design
| What the Player Experiences | System State | Mechanical Expression |
|-----------------------------|--------------|---------------------|
| Early game: MIRROR seems ordinary | No behavioral flags set. No `contradiction_flagged`. No tell observations in monologue. | The player's training (from interacting with NPCs who DO have tells) hasn't fired. This feels normal. |
| Mid game: Player has learned to read other NPCs | The player has observed: Kael looks left when lying, Sera leaves when Torek arrives, Voss fidgets when questioned about manifests. | The player's mental model now expects tells. They're watching for them. |
| MIRROR interaction: No tells present | Player talks to MIRROR. MIRROR makes eye contact, answers directly, emotional state matches words. No spatial deviation, no topic deflection, no nervous tics. | The ABSENCE is striking. The player's monologue notes it: "No hesitation. She's either telling the truth or she's the best actor I've ever seen." |
| Resolution: Trust through transparency | If the player cross-references MIRROR's information with other sources, it checks out. MIRROR was telling the truth. | The player LEARNS that honesty exists in this world. That one person isn't performing. That becomes the emotional fulcrum for everything else. |
### How This Interacts with the Contradiction System
FRIEND NPCs have contradiction arcs: warmth → trust → doubt → conflict. Color shifts green to amber. The emotional payload is betrayal.
MIRROR NPCs have NO contradiction arc. Color remains green (or progresses public → insider → peer within green). The emotional payload is RELIEF and PROTECTION.
**Mechanical distinction:**
- FRIEND: `EntityKnowledge.state` transitions to `KnowledgeState::Contradicted` when tells accumulate.
- MIRROR: `EntityKnowledge.state` remains `KnowledgeState::Confirmed` or `KnowledgeState::Direct`. No contradiction flags ever set.
**Content signal:** The player's monologue about MIRROR evolves from neutral observation to active trust: "She's worried. Can't blame her — her partner is acting strange." → "I believe her. She doesn't know what's happening, but she's telling me everything she does know."
---
## 5. Dialogue Architecture
MIRROR dialogue follows the standard four-layer system (D-028) but with simplified secret-tier structure.
### Access Tiers (Layer 1)
| Tier | What MIRROR Shares | Example |
|------|-------------------|---------|
| **Public** | Observable emotional state, general information about their life/relationships | "I teach at the community school. The kids are doing well this term." |
| **Insider** | Specific worry, named relationships, genuine vulnerability | "Kael's been coming home late. Says it's work, but the schedule doesn't match. I don't know what to think." |
| **Peer** | Deep emotional exposure, requests for help or advice | "I'm scared, honestly. Not of Kael — of what Kael might be involved in. I don't know who else to talk to." |
| **Authority** (if detective) | Cooperation with investigation, willingness to provide information about loved one despite emotional cost | "If you think Kael is in trouble, I want to know. I'll help if I can. Just — please don't hurt him." |
**No secret tier that reveals hidden criminal knowledge.** The MIRROR doesn't have hidden criminal knowledge. The "secret" tier for MIRROR is the deepest emotional vulnerability, not a plot revelation.
### Trust Progression
```
Public (stranger) → Insider (acquaintance) → Peer (trusted friend) → Authority (if applicable)
What changes: Depth of emotional sharing, not type of information.
What doesn't change: The facts. MIRROR tells the same truth at all tiers. The emotion around it deepens.
```
**Example progression (Naia about Kael):**
- **Public:** "Kael works at the freight hub. Dock worker. We've been together six years."
- **Insider:** "Kael's been stressed lately. Late nights, evasive when I ask about it. I'm worried."
- **Peer:** "I love him. But I can't keep doing this — the not-knowing is killing me. I think something's wrong. I just don't know what."
- **Authority (detective):** "If you're investigating something at the hub, and if Kael is involved — I need to know. I'll help. I just need the truth."
Same story. Deeper emotion. No revelation that changes the player's understanding of who Naia is.
### Monologue Trigger Design
MIRROR NPCs trigger monologue focused on the PC's EMOTIONAL REACTION to the MIRROR's honesty, not on information extraction.
**Smuggler monologue about MIRROR (if MIRROR is connected to ring member):**
| Trigger | Monologue Content | Emotional Layer |
|---------|------------------|-----------------|
| Observe MIRROR waiting at bar | "Naia's at the bar again. Alone. Keeps looking at the door. I know where Kael is. I can't say." | Guilt. The smuggler's operational knowledge creates distance from the MIRROR's suffering. |
| MIRROR asks about loved one | "She asked if I'd seen Kael today. What do I say? 'Yeah, he's fine, just moving contraband?' Can't tell her. Can't lie to her face either." | Moral tension. The MIRROR's directness makes evasion feel worse. |
| MIRROR shares deep worry | "She's really scared. Not just worried — scared. And she has no idea what's actually happening. If she knew..." | Protective instinct + guilt. The smuggler wants to shield the MIRROR from both the truth and the consequences. |
**Detective monologue about MIRROR:**
| Trigger | Monologue Content | Emotional Layer |
|---------|------------------|-----------------|
| First conversation with MIRROR | "She's not hiding anything. I've interviewed enough people to know when someone's performing. She's genuinely worried." | Relief. In a district where everyone seems evasive, the MIRROR is a breath of fresh air. |
| MIRROR shares information about loved one | "She knows his routine better than anyone. The late nights, the evasions — she's been tracking them without realizing it. She's building my case for me." | Strategic recognition. The MIRROR is a witness to behavioral change — the best kind. |
| MIRROR asks for help | "She wants me to figure out what's wrong. Not to arrest anyone — just to know. That's... trust. Real trust." | Emotional weight. The detective realizes the investigation has personal stakes for the MIRROR. Success means breaking someone's heart. |
---
## 6. Naia Tamm — Reference Implementation
Naia Tamm is the v0.1 MIRROR NPC in Sova Transit District. Let me walk through how her 10-axis profile demonstrates each MIRROR rule.
### Core Identity
- **Name:** Naia Tamm
- **Age:** 33
- **Role:** Teacher, Station Sova community school
- **Social Site:** The Last Shift (Bar)
- **Triangle:** Triangle 4 — The Worried Partner (Naia - Kael - Sera)
### 10-Axis MIRROR Implementation
#### 1. Want (Tier 1 depth, no deception)
**Primary:** Understand what's happening with Kael.
Naia and Kael have been together 6 years. Kael started coming home late, evasive answers, money that doesn't match hours. Naia doesn't know about the ring. Naia knows the person they share a life with is hiding something. The not-knowing is worse than almost any truth.
**Secondary:** Protect the life they've built.
Naia wants it resolved without destroying everything — the home, the relationship, the stability. This is why Naia confides in Sera instead of confronting Kael directly: wants advice, not a fight.
**MIRROR rule demonstrated:** Want is ABOUT someone else's secret, not concealing Naia's own. Naia's motivation is transparent to the player from the first conversation.
#### 2. Secret / Vulnerability (surface-level only)
**Surface secret:** Worried about Kael. Visible to anyone who sees Naia's stress.
**Deep secret:** Naia confided in Sera about Kael's behavior. This is the action that set Sera's compliance check in motion, though Naia doesn't know that. Naia shared a personal worry with a trusted friend.
**Vulnerability:** Emotional exposure. Naia's worry is genuine, visible, exploitable.
**MIRROR rule demonstrated:** Naia's "secret" is that she confided in a friend. That's not a conspiracy — it's ordinary human behavior under stress. The vulnerability is EMOTIONAL, not criminal.
#### 3. Relationships (genuine, no hidden agendas)
**Kael Davan (partner, 6 years):** Deep love, growing anxiety. Doesn't question Kael's character — just Kael's honesty.
**Sera Venn (close friend, 10 months):** Genuine friendship. Trusts Sera as someone who can give perspective without gossip.
**Lera Sessik (bar acquaintance):** Social connection. Lera is warm to Naia — protective attention to someone visibly struggling.
**MIRROR rule demonstrated:** All relationships are exactly what they appear to be. No hidden resentments, no secret alliances, no ulterior motives. Naia likes who she likes for straightforward reasons.
#### 4. Tolerance Threshold (moderate, genuine limits)
**Moderate.** Patient — teaching station kids requires it. But patience is fraying. Every evasive answer from Kael chips at tolerance. If pushed to breaking point, Naia confronts Kael directly — which could trigger Kael's crisis, force Sera's hand, or give the detective an opening.
**MIRROR rule demonstrated:** Tolerance threshold is real and observable. No hidden resilience, no secret breaking point. What Naia says she can tolerate is what she can tolerate.
#### 5. Daily Routine (predictable, no spatial deviations)
- 07:00 - 15:00: Teaching (community school, Residential Radial A)
- 15:00 - 15:30: Commute back to Transit District
- 15:30 - 17:30: Bar (The Last Shift) — meets Sera, social time
- 17:30 - 22:00: Home. Waits for Kael.
- Late evenings: Alone in apartment, wondering where Kael is.
**MIRROR rule demonstrated:** Routine is stable, observable, doesn't hide anything. Naia is where she says she'll be. No unauthorized corridor meetings, no suspicious timing patterns. The routine itself is transparent.
#### 6. Information Inventory (knows what she knows, doesn't know what she doesn't)
**Knows:** Kael's normal routine (6 years of partnership), Kael's recent deviations (late nights, evasive answers), Sera's Commission role (knows Sera is a tech, not investigator), bar social dynamics, school community.
**Doesn't know:** Ring, smuggling, Kael's membership, manifest discrepancies, Sera's compliance check, the detective's investigation.
**MIRROR rule demonstrated:** Naia's knowledge state is exactly what it appears to be. She's not concealing anything she knows. She genuinely doesn't know the conspiracy exists. This makes her the perfect witness to BEHAVIORAL change without knowledge of CAUSE.
#### 7. Contentment (low and declining — thematically essential)
**Was content:** Stable job, loving partner, community. Now relationship anxiety is coloring everything. Teaching is harder when distracted. Bar visits tinged with worry. Home is where the absence lives.
**MIRROR rule demonstrated:** Contentment trajectory is VISIBLE and GENUINE. Naia isn't pretending to be happy or hiding dissatisfaction. Her emotional state is observable in her voice, her behavior, her routine changes (increased bar presence = avoiding empty apartment).
#### 8. Personality Traits (no performance, no mask)
- **Primary: Caring** — genuinely invested in other people's wellbeing
- **Secondary: Patient** — tolerates uncertainty longer than most, but not indefinitely
- **Tertiary: Perceptive** — reads emotional states well. Knows when Kael is lying even if can't prove it.
**MIRROR rule demonstrated:** These traits are REAL, not performed. Naia's caring isn't a manipulation tactic. Her perceptiveness makes her WORRIED (she knows something's wrong) but doesn't make her SUSPICIOUS (she trusts Kael's character even while doubting his honesty about the situation).
#### 9. Tell System (ABSENT — the design payload)
Naia's entry in the wiki lists three "tells":
| Tell | Trigger | Observable To |
|------|---------|---------------|
| Visible stress | Tired eyes, distracted conversation, checking lattice | Sera, Lera, Detective, bar regulars |
| Mentions Kael unprompted | Worry overflowing into conversation | Sera, Detective (if sitting nearby) |
| Increased bar presence | Coming more often, staying longer — avoiding empty apartment | Lera (notices pattern), Sera (recognizes coping mechanism) |
**CRITICAL MIRROR DISTINCTION:** These are NOT tells in the deception-detection sense. They're not "behavioral flags that signal concealment." They're GENUINE STRESS MARKERS. Naia is visibly worried because Naia IS worried. There's no contradiction between internal state and external behavior.
**The system perspective:** A TELL is a deviation that signals deception (Kael looks left when lying, Sera leaves when Torek arrives). Naia's behaviors are COPING MECHANISMS and EMOTIONAL EXPRESSIONS, not tells. The player's monologue doesn't say "She's hiding something." It says "She's really struggling."
**MIRROR rule demonstrated:** The absence of deception-tells IS the content. The player who has learned to read evasion on other NPCs will notice that Naia makes direct eye contact, answers questions fully, doesn't deflect topics, doesn't have spatial anomalies beyond her normal routine. That ABSENCE becomes the signal: "This person is being honest with me."
#### 10. Skill Set (civilian, no hidden capabilities)
**Occupational:** Teaching, community engagement, youth education, curriculum management.
**Combat tag:** NO. Entirely civilian.
**Lattice capability:** Baseline.
**MIRROR rule demonstrated:** No hidden skills, no secret training, no combat capability concealed behind a civilian facade. Naia is exactly what she presents: a teacher who's worried about her partner.
### Naia's Triangle Role (Emotional Center)
**Triangle 4: The Worried Partner (Naia - Kael - Sera)**
Naia is the emotional center. Naia's worry about Kael triggered Sera's investigation. Naia's trust in Sera makes Sera's concealment more painful. Naia connects the detective's investigation to Kael's personal life through Sera, through Naia's own observations, through the fact that a worried partner is the best witness to behavioral change.
**Why MIRROR works here:** Naia is UNINVOLVED in the conspiracy but CENTRAL to its emotional impact. She's the person both the smuggler and detective want to protect — and the person whose honest worry makes the smuggling operation's human cost visible. If Naia were lying, the triangle would be about competing deceptions. Because Naia is honest, the triangle is about the COST of everyone else's deceptions.
### Dual-Lens Implementation
**Smuggler perspective (if smuggler is Kael's friend):**
Naia is emotional collateral. The smuggler knows why Kael is busy and can't say. Seeing Naia's worry creates guilt. If Naia asks the smuggler about Kael, there's no good answer.
Sample monologue: *"Naia's at the bar again. Alone. Looking at the door every time it opens. I know where Kael is. I can't say."*
**Detective perspective:**
Naia is a potential source. A partner who suspects their loved one is hiding something is a classic entry point. The detective can cultivate Naia's trust by being sympathetic — listen, validate, gently probe. Naia might not know specifics, but knows Kael's routine, habits, recent changes better than anyone.
Sample monologue: *"The partner — Naia Tamm. Teacher. Visibly stressed. Keeps looking at the door. If Davan is involved, this partner knows something changed, even if they don't know what."*
**MIRROR payload in dual-lens:** SAME transparency, DIFFERENT player reaction. Smuggler feels guilt. Detective sees opportunity. Both recognize honesty. The MIRROR's transparency makes the two characters' different relationships to truth more visible by contrast.
---
## 7. Generator Template
For creating future MIRROR NPCs. This is the content pack structure for a MIRROR.
### Profile Fields (What to Fill)
```yaml
npc_id: "{name-lowercase}"
name: "{Full Name}"
age: {25-50 typical}
role: "{Occupation — typically civilian}"
social_site: "{Primary location}"
tier: 1 # MIRROR is Tier 1 depth
pattern: "MIRROR"
entanglement: "mundane" # MIRROR is never directly entangled
# 10-Axis Profile
want:
primary: "{Want that's ABOUT someone else or visible situation — no hidden agenda}"
secondary: "{Want that's protective or stabilizing — preserve what they have}"
secret:
surface: "{Visible emotional state — worry, stress, joy}"
deep: "{Ordinary privacy or emotional vulnerability — NOT conspiracy knowledge}"
vulnerability: "{Emotional exposure, not operational risk}"
relationships:
relationship_1:
target: "{Name}"
type: "{Genuine bond — no hidden resentment}"
history: "{How they met, why they care}"
tension: "{Current stress in relationship — external, not deceptive}"
relationship_2: ...
relationship_3: ...
tolerance: "{moderate/high — describe genuine limits, what would make them break}"
routine:
"{Time range}": "{Activity — predictable, no hidden meetings}"
# No spatial deviations, no unauthorized locations
information:
knows:
- "{Visible facts about their life}"
- "{Behavioral observations about loved ones}"
- "{Community knowledge}"
doesnt_know:
- "{Conspiracy details}"
- "{Hidden agendas of others}"
- "{Secret motivations}"
contentment: "{low/moderate — declining if connected to stressed loved one}"
personality:
primary: "{Caring, Honest, Warm — prosocial trait}"
secondary: "{Patient, Loyal, Perceptive — supportive trait}"
tertiary: "{Genuine emotional responsiveness}"
tell_system:
tells: [] # Empty array — MIRROR has no deception tells
behavioral_markers:
- "{Genuine stress marker — visible worry, not concealment}"
- "{Coping mechanism — increased social presence, routine changes}"
# These are NOT tells. They're genuine emotional expressions.
skills:
occupational: ["{Teaching}", "{Community work}", "{Civilian profession}"]
combat: false # MIRROR is never combat-capable
lattice: "baseline"
```
### Dialogue Content Pack Structure
```yaml
# File: districts/{location}/dialogue/{role}-mirror.yaml
- id: "{location}_d_001"
text: "Greeting — warm, open, no guardedness"
role: "{role}"
access: ["public"]
trust: "surface"
situation: ["greeting"]
mood: ["warm"]
- id: "{location}_d_002"
text: "Sharing worry — direct, no evasion"
role: "{role}"
access: ["public", "insider"]
trust: "surface"
situation: ["worried_inquiry"]
mood: ["anxious"]
- id: "{location}_d_010"
text: "Deep emotional vulnerability — peer tier"
role: "{role}"
access: ["peer"]
trust: "real" # Not 'secret' — MIRROR has no secrets tier content
situation: ["emotional_crisis"]
mood: ["desperate"]
# Monologue content (separate per character, per D-032)
# File: districts/{location}/monologue-smuggler.yaml
- id: "{location}_m_s_001"
text: "Smuggler feels guilt observing MIRROR's distress"
character: "smuggler"
trigger: "observe_npc"
prerequisite:
target.known_attributes.name: "{Name}"
target.known_attributes.emotional_state: "worried"
# File: districts/{location}/monologue-detective.yaml
- id: "{location}_m_d_001"
text: "Detective recognizes MIRROR as honest witness"
character: "detective"
trigger: "post_conversation"
prerequisite:
target.known_attributes.name: "{Name}"
target.known_attributes.honesty_assessment: "transparent"
```
### What Fields to Leave Empty
| Field | State | Why |
|-------|-------|-----|
| `tell_system.tells` | Empty array `[]` | MIRROR has no deception tells |
| `secret.criminal_knowledge` | Omit entirely | MIRROR doesn't have criminal secrets |
| `contradiction_arc` | Omit entirely | MIRROR has no contradiction phases |
| `access: ["authority"]` content | Minimal | Only if MIRROR cooperates with investigation — still no secret reveals |
| `trust: "secret"` tier content | Omit or minimal | MIRROR's deepest tier is emotional vulnerability, not plot revelation |
### What Makes a Good MIRROR Candidate
**Ideal MIRROR characteristics:**
1. **Emotionally connected to an entangled NPC** — Partner, sibling, close friend of someone in the conspiracy. Their honesty makes the conspiracy's human cost visible.
2. **Civilian role** — Teacher, bartender, service worker. Not institutional (Commission, Security). Not criminal. Represents ordinary life.
3. **Observable worry or stress** — MIRROR's emotional state is VISIBLE because they don't hide it. Their distress is the content.
4. **Genuine perceptiveness** — MIRROR notices behavioral changes in loved ones but doesn't KNOW the cause. "Something's wrong" without "I know what's wrong." Perfect witness to change without knowledge of crime.
5. **Prosocial personality** — Caring, loyal, honest. The player trusts them BECAUSE they're trustworthy. The game needs at least one person whose goodness is real.
**Poor MIRROR candidates:**
- NPCs with institutional power (they'd have investigative tools)
- NPCs with hidden skills or backgrounds (contradicts transparency)
- NPCs who are themselves criminals (MIRROR must be genuinely uninvolved)
- NPCs without emotional stakes in the district (MIRROR's honesty is load-bearing only if they CARE)
---
## 8. Design Notes: Why MIRROR Isn't Boring
**The risk:** A character with no secrets, no tells, no contradiction arc sounds mechanically thin. "Just an honest person" doesn't feel like a gameplay system.
**Why it works:**
### The Contrast Mechanic
MIRROR is mechanically interesting BECAUSE of the surrounding systems. In a game where:
- Every FRIEND has a contradiction arc (warmth → doubt → conflict)
- Every CATALYST disrupts equilibrium through action
- Every SYSTEM embodies corrupted institutions
- Every WITNESS carries dangerous knowledge
- Every GHOST applies pressure from off-screen
...the ONE character with no deception becomes the ANCHOR. The player learns to expect complexity, hidden agendas, behavioral tells. MIRROR subverts that learned expectation by being EXACTLY what they appear to be.
**Mechanical payload:** The observation pipeline (Ozzie + Gestalt + Paula's unified system) trains the player to notice tells. The MIRROR's ABSENCE of tells is itself an observation event. The player's monologue fires: "No evasion. No deflection. Either honest or the best liar I've encountered." The uncertainty itself creates tension until the player verifies the honesty.
### The Emotional Fulcrum
When the ring's actions threaten the MIRROR (Naia worrying about Kael, potentially losing her relationship and stability), the player FEELS it because they've learned to believe this person.
**Smuggler:** The guilt of watching an innocent person suffer because of your operations. You can't tell her. You can't protect her. You're part of the cause of her pain.
**Detective:** The weight of knowing your investigation will break this person's life. Success means revealing that her partner is a criminal. The MIRROR trusted you to find answers — and the answers will destroy her.
**That's the design payoff.** MIRROR's transparency isn't boring — it's the emotional investment that makes the conspiracy's consequences real. The player cares about protecting the MIRROR because the MIRROR is the one person in the district who isn't performing, isn't hiding, isn't playing angles. That honesty makes them precious.
### The Trust Anchor
In a district where everyone has an agenda, the MIRROR is the person the player can RELY on. When the smuggler needs to know what's happening with Kael, Naia will tell the truth as she understands it. When the detective needs a witness, Naia will cooperate fully. The MIRROR's reliability is itself a strategic asset — but one that comes with emotional cost (using an innocent person's trust).
**System interaction:** The trust-gated gossip system (D-028 Layer 3, #171) means NPCs share information at different access tiers. With most NPCs, the player wonders: "Is this real or are they steering me?" With MIRROR, that question is answered: "This is real. She's telling me everything she knows." That certainty is VALUABLE in a game built on asymmetric information.
### The Replay Dimension
On second playthrough, playing the other character, the MIRROR's honesty becomes even more visible. The player KNOWS Naia isn't involved. They see her worry from a different angle:
- **Playthrough 1 (smuggler):** "I know why Kael is busy. Naia's worry is collateral damage."
- **Playthrough 2 (detective):** "Naia's worry is my opening. She's the way in."
Same honesty. Different use. The player's knowledge that Naia is a MIRROR (from first playthrough) makes the second playthrough's interaction with her more complex: "I know she's honest. How do I use that? Should I?"
**Replay payload:** MIRROR transparency survives across playthroughs. FRIEND contradictions change (different seed might assign FRIEND to different NPC). MIRROR remains honest regardless of seed. That constancy is mechanically useful for teaching the player to recognize honesty — and ethically complex when the player knows they'll exploit it.
---
## 9. Implementation Checklist
For developers implementing a MIRROR NPC:
### ECS Component Setup
```rust
// MIRROR NPCs use standard NPC components but with specific flags
NPCProfile {
pattern: NPCPattern::Mirror,
tier: ContentTier::One, // MIRROR is always Tier 1
entanglement: EntanglementLevel::Mundane, // Never directly criminal
}
TellSystem {
tells: vec![], // Empty — no deception tells
behavioral_markers: vec![
BehavioralMarker::VisibleStress,
BehavioralMarker::EmotionalExpression,
// These are NOT tells — they're genuine coping mechanisms
],
}
ContradictionState {
has_contradiction_arc: false, // MIRROR never contradicts
relationship_phase: RelationshipPhase::Stable, // No phase transitions
}
SecretInventory {
criminal_secrets: vec![], // Empty
personal_vulnerabilities: vec![
Vulnerability::EmotionalExposure,
Vulnerability::UninformedWitness,
],
}
```
### Dialogue System Configuration
```rust
// MIRROR dialogue has simpler trust structure
DialogueProfile {
access_tiers: vec![
AccessTier::Public, // General conversation
AccessTier::Insider, // Named relationships, specific worries
AccessTier::Peer, // Deep emotional vulnerability
AccessTier::Authority, // (Optional) Cooperation with investigation
],
trust_gates: vec![
TrustGate { tier: TrustTier::Surface, access: [Public, Insider] },
TrustGate { tier: TrustTier::Real, access: [Peer, Authority] },
// NO TrustTier::Secret — MIRROR doesn't have secret-tier content
],
}
```
### Knowledge System Integration
```rust
// Observer's knowledge state about MIRROR
EntityKnowledge {
state: KnowledgeState::Confirmed, // Or Direct. Never Contradicted.
known_attributes: {
"honesty_assessment": "transparent",
"reliability": "solid",
"facade_status": "N/A", // MIRROR has no facade
"emotional_state": "worried", // Visible, genuine
"threat_to_position": "none", // MIRROR is not operationally dangerous
"moral_standing": "innocent", // Never shifts to complicit
},
contradiction_flagged: None, // MIRROR never flags contradictions
}
```
### Monologue Event Triggers
```rust
// When player observes MIRROR, monologue focuses on emotional reaction
if npc.pattern == NPCPattern::Mirror {
if observer.has_learned_to_read_tells() {
// Trigger "absence of tells" observation
monologue_event = MonologueEvent {
trigger: MonologueTrigger::ObserveNPC,
target: npc.entity_id,
filter_tags: ["honesty_recognition", "emotional_anchor"],
};
}
if npc.emotional_state == EmotionalState::Distressed
&& observer.knows_cause_of_distress()
&& !observer.can_share_knowledge() {
// Trigger guilt/conflict monologue (if smuggler)
monologue_event = MonologueEvent {
trigger: MonologueTrigger::ObserveNPC,
target: npc.entity_id,
filter_tags: ["guilt", "emotional_collateral"],
};
}
}
```
### Testing Validation
**MIRROR correctness tests:**
1. **No contradiction flags should ever set** for MIRROR entity.
2. **EntityKnowledge.state should never transition to Contradicted** for MIRROR.
3. **TellSystem.tells should remain empty array** throughout session.
4. **Monologue events about MIRROR should NOT include tags:** `"deception"`, `"evasion"`, `"suspicious"`.
5. **Monologue events about MIRROR SHOULD include tags:** `"honesty"`, `"transparency"`, `"genuine"`, `"emotional_anchor"`.
6. **Trust progression should not unlock "secret" tier content** — only surface/real tiers should have content.
---
## Summary
**THE MIRROR pattern is the emotional foundation of the game's moral complexity.**
In a world where everyone is hiding something, the one person who isn't becomes the player's anchor — and their vulnerability. The MIRROR's transparency is mechanically expressed through the ABSENCE of systems (no tells, no contradiction arc, no secrets) that are present on every other NPC. That absence becomes visible through contrast.
**The design works because:**
- The observation pipeline trains the player to expect deception
- The MIRROR subverts that expectation through consistent honesty
- The player's verification of honesty (cross-referencing MIRROR's info against other sources) creates trust
- That trust makes the MIRROR's emotional stakes real
- Threats to the MIRROR create urgency and moral weight
**Naia Tamm demonstrates every rule:** She has full Tier 1 depth, genuine emotional complexity, visible stress, transparent relationships, predictable routine, and zero deception. Her honesty makes Kael's secrets painful, Sera's concealment costly, and the investigation's human consequences visible.
**For content authors:** MIRROR is mechanically simple (no contradiction content) but emotionally complex (full 10-axis depth). The 50-70 line budget focuses on genuine emotional expression, trust progression through vulnerability, and dual-lens player reaction. The MIRROR is the person both characters want to protect — and the person who makes the cost of deception real.
---
**End Pattern Specification.**
**Files referenced:**
- `/var/home/jeroenschweitzer/Projects/settled-reach/copy/docs/wiki/npcs/naia-tamm.md` — Reference implementation
- `/var/home/jeroenschweitzer/Projects/settled-reach/copy/decisions/content.md` — D-024 (10-axis model), D-028 (dialogue architecture), D-029 (entanglement ratio), D-032 (separate monologue pools), D-034 (THE FRIEND pattern), D-035 (tag taxonomy)
- `/var/home/jeroenschweitzer/Projects/settled-reach/copy/docs/workshops/v01-content-scoping/round2-gestalt.md` — Pattern definitions and NPC mapping
- `/var/home/jeroenschweitzer/Projects/settled-reach/copy/docs/workshops/v01-gap-analysis/round2-gestalt.md` — Unified observation system, character identity integration
+600
View File
@@ -0,0 +1,600 @@
# PC-as-NPC Unified Specification
**Ticket:** #381 | **Priority:** High | **Sprint:** 3
**Status:** v0.1 Draft
**Blocks:** #383 (NPC-format briefs for both PCs), #401 (PC-as-NPC content authoring)
**Blocked by:** #374 (Entity attributes -- smuggler role-perspective keys) [done]
**Decisions referenced:** D-027 (vertical slice), D-029 (population entanglement), D-032 (separate monologue pools), D-034 (THE FRIEND), D-035 (tag taxonomy), D-039 (wow moments), D-045 (PC-as-NPC in v0.1 scope)
---
## 1. Overview
### What Is PC-as-NPC?
When the player plays the smuggler, the detective exists as an NPC in the world. When the player plays the detective, the smuggler exists as an NPC. The other playable character is present, visible, on a routine, and known to NPCs -- but not player-controlled.
### Why It Exists
**Divergence Reveal (Wow Moment #4):** On second playthrough, the player enters the same room and sees their previous character walking around as an NPC. "I was only seeing HALF of this." The other character was there all along -- working, eating, moving through the district -- but the first-time player never knew who they were.
This is the payoff for the dual-lens design (D-027). Same district, same NPCs, same 30 minutes. Two completely different games. The PC-as-NPC is the physical proof that both perspectives coexisted.
### v0.1 Scope
- **2 PC-as-NPC conversions:** The Smuggler (as NPC, seen by the detective) and The Detective (as NPC, seen by the smuggler).
- **~20-30 authored items per character** (D-029 Concept A): routine entries, dialogue lines, monologue triggers, relationship stubs, tell descriptions.
- **Total PC-as-NPC content budget:** ~50-60 authored items across both characters.
### Core Constraint
The PC-as-NPC follows a **neutral behavioral path**. They do not make dramatic choices. Dramatic choices are player decisions -- those happen on the other playthrough. The PC-as-NPC's routine must be plausible, consistent with what the player does during their own playthrough, and unremarkable enough that a first-time player reads them as "just another NPC."
---
## 2. Starting Knowledge Graph
The starting knowledge graph defines what the PC-as-NPC knows about other NPCs at session start. This determines which NPCs the PC-as-NPC interacts with, how they greet people, and what access tiers they occupy in dialogue pools.
### Template
For each PC-as-NPC, define:
| Field | Description |
|-------|-------------|
| **Known NPCs** | Which NPCs the PC-as-NPC recognizes by name at session start |
| **Known relationships** | Pre-existing bonds (colleague, friend, institutional contact) |
| **Known facts** | Operational or institutional knowledge carried into the session |
| **Unknown facts** | Critical gaps that prevent the PC-as-NPC from making informed decisions |
### Smuggler-as-NPC Starting Knowledge
The smuggler-as-NPC enters the session as a dock worker who has lived in Sova Transit District for years. They know the district, the people, and the ring.
| Category | Known | Unknown |
|----------|-------|---------|
| **Ring members** | Nils (coordinator), Kael (closest colleague), Voss (shift supervisor, takes a cut), Renn (courier), Devra (off-stage handler) | Detective's identity as investigator |
| **Ring operations** | Routes (freight bay to service corridor to temp storage to bar back room), schedule windows (shift transitions create 20-minute gaps), cargo types (unlicensed lattice components, medical-grade neural replacements) | Full upstream supply chain beyond Sabel |
| **Social network** | Kael (close colleague), Voss (tense superior), Lera (bar regular status), Naia (Kael's partner, known through Kael), Torek (ring-adjacent, known through bar) | Kael's exit attempt, Sera's unreported evidence, Naia's confidence in Sera |
| **Institutional landscape** | Commission presence is minimal, Sera is a field tech (not investigator), district runs on informal trust | Detective's investigation mandate, manifest discrepancy flagging |
### Detective-as-NPC Starting Knowledge
The detective-as-NPC enters the session as a newly posted Commission Liaison Officer. Posted 3 days ago for routine compliance review (actual mandate: investigate freight irregularities).
| Category | Known | Unknown |
|----------|-------|---------|
| **Investigation targets** | Manifest discrepancies tied to Sova freight operations, names from case files: Voss (shift supervisor), Maret (freight scheduler), Drin (dock inspector) | Ring structure, ring membership, who is involved |
| **Institutional contacts** | Sera Venn (Commission field tech, pre-existing friend from prior posting), Commission protocols and procedures | Local social dynamics, who trusts whom, community power structures |
| **District geography** | The Terminal (logistics hub), The Last Shift (bar, social nexus), maintenance corridors (off-books access routes) | Smuggling routes, operational timing, which corridors are used for what |
| **Social context** | Previous Commission liaison rotated out 3 months ago, district is wary of institutional authority | Smuggler's identity, Kael's role, Naia's connection to the ring through Kael |
---
## 3. Starting Relationship Map
Pre-existing relationships define how NPCs interact with the PC-as-NPC at session start. Each entry uses the 16-key EntityKnowledge format.
### Smuggler-as-NPC: Relationships with NPCs
| NPC | Relationship | RelationshipState | Access Tier | Trust Level | Notes |
|-----|-------------|-------------------|-------------|-------------|-------|
| **Kael Davan** | Close colleague, ring member | Friendly | insider, peer | trusted | 2 years of shared risk. Greet by first name. Comfortable physical proximity. |
| **Voss** | Shift supervisor, ring-aware | Known | insider | reliable | Professional respect, low warmth. Smuggler knows Voss takes a cut. |
| **Nils Davan** | Ring coordinator (off-stage) | Known | insider | reliable | Smuggler receives instructions from Nils via Devra. Knows Nils is Kael's brother. |
| **Lera Sessik** | Bar owner, ring-aware | Friendly | insider | trusted | Regular at The Last Shift. Lera saves the smuggler's seat. |
| **Renn** | Courier, ring member | Known | insider | reliable | Operational relationship. Smuggler knows Renn's routes. |
| **Naia Tamm** | Kael's partner | Known | peer | reliable | Known through Kael. Occasional bar interaction. |
| **Torek Lintar** | Bar regular, ring-adjacent | Known | peer | uncertain | Smuggler knows Torek's spending is conspicuous. |
| **Maret Korr** | Freight scheduler | Known | insider | reliable | Hub colleague. Smuggler knows Maret handles scheduling. |
| **Drin** | Dock inspector | Known | insider | reliable | Smuggler knows Drin is compromised (looks the other way). |
| **Sera Venn** | Commission field tech | Known | public | uncertain | Smuggler recognizes Sera as Commission. Keeps distance. |
### Detective-as-NPC: Relationships with NPCs
| NPC | Relationship | RelationshipState | Access Tier | Trust Level | Notes |
|-----|-------------|-------------------|-------------|-------------|-------|
| **Sera Venn** | Pre-existing friend, institutional contact | Friendly | peer | trusted | Same background, transferred to Sova a year ago. Detective's social anchor. |
| **Voss** | Person of interest (case file) | Known | authority | uncertain | Name from manifest discrepancy analysis. Shift supervisor with scheduling authority. |
| **Maret Korr** | Person of interest (case file) | Known | authority | uncertain | Freight scheduler. Access to manifest data. |
| **Drin** | Person of interest (case file) | Known | authority | uncertain | Dock inspector. Responsible for container verification. |
| **Lera Sessik** | Bar owner (met through Sera) | Unknown/Known | public | uncertain | Sera mentioned the bar. Detective has visited once or twice. |
| **Kael Davan** | Unknown dock worker | Unknown | public | N/A | Name might appear on a shift roster. No personal knowledge. |
| **Naia Tamm** | Unknown | Unknown | public | N/A | No connection at session start. |
| **Torek Lintar** | Known (Commission colleague) | Known | public | uncertain | Torek works Commission compliance. Detective knows the name. |
---
## 4. Reverse Knowledge (Bidirectional)
This is the critical insight (identified by Gestalt in the v0.1 Content Scoping Workshop): knowledge is bidirectional. The PC-as-NPC knows things about NPCs, AND NPCs know things about the PC-as-NPC. Both directions must be authored.
### Why Bidirectional Matters
If Kael knows the smuggler is reliable but the smuggler-as-NPC has no knowledge entry about Kael, the relationship is one-sided and feels artificial. If the detective-as-NPC walks through the district and no NPC reacts to the Commission presence, the world is dead. Reverse knowledge makes the PC-as-NPC feel embedded -- people have opinions about them, reference them in conversation, adjust behavior around them.
### NPCs' Knowledge of the Smuggler-as-NPC
| NPC | What They Know | EntityKnowledge Key Values | Behavioral Consequence |
|-----|---------------|---------------------------|----------------------|
| **Kael Davan** | Smuggler is a close colleague, ring member, reliable. Works the same shift. | `name: "[Smuggler Name]"`, `role: "dock worker"`, `faction: "ring member"`, `relationship_type: "close colleague"`, `trust_level: "trusted"`, `loyalty_assessment: "solid"` | Greets warmly. Shares operational updates. Relaxed body language around the smuggler. |
| **Voss** | Smuggler handles cargo routing for the ring. Competent, reliable, doesn't cause problems. | `name: "[Smuggler Name]"`, `role: "dock worker"`, `faction: "ring member"`, `trust_level: "reliable"`, `loyalty_assessment: "dependable"`, `position_integrity: "solid"` | Professional interaction. Trusts smuggler with schedule information. |
| **Lera Sessik** | Smuggler is a regular. Good customer, doesn't cause trouble. Knows the smuggler is ring-connected. | `name: "[Smuggler Name]"`, `role: "dock worker"`, `relationship_type: "regular"`, `trust_level: "trusted"` | Saves the smuggler's usual seat. Casual greeting. |
| **Sera Venn** | Knows a dock worker by that name exists. No deeper knowledge. | `name: "[Smuggler Name]"`, `role: "dock worker"`, `trust_level: "uncertain"` | No particular reaction. Treats as one of many district workers. |
| **Naia Tamm** | Kael's colleague. Seen at the bar with Kael. Friendly enough. | `name: "[Smuggler Name]"`, `role: "dock worker"`, `relationship_type: "partner's colleague"`, `trust_level: "reliable"` | Nods in greeting. Might ask if they've seen Kael. |
### NPCs' Knowledge of the Detective-as-NPC
| NPC | What They Know | EntityKnowledge Key Values | Behavioral Consequence |
|-----|---------------|---------------------------|----------------------|
| **Sera Venn** | Pre-existing friend. Same institutional background. Glad to have a familiar face on station. | `name: "[Detective Name]"`, `role: "Commission investigator"`, `faction: "Commission"`, `relationship_type: "friend"`, `trust_level: "trusted"` | Waves detective over at the bar. Shares district background. Introduces to regulars. |
| **Voss** | New Commission presence. "That investigator." Makes Voss nervous but Voss keeps composure. | `name: "[Detective Name]"`, `role: "Commission liaison"`, `faction: "Commission"`, `trust_level: "suspicious"`, `risk_assessment: "moderate"` | Stiffens when detective enters the hub. Answers questions tersely. |
| **Lera Sessik** | Commission person who comes to the bar with Sera. Outsider. Lera is polite but guarded. | `role: "Commission"`, `trust_level: "uncertain"`, `risk_assessment: "low"` | Serves drinks. Doesn't volunteer information. Watches how the detective interacts with regulars. |
| **Kael Davan** | Knows there's a new Commission officer. Doesn't know the detective personally. Nervous about Commission presence generally. | `role: "Commission"`, `faction: "Commission"`, `trust_level: "suspicious"`, `risk_assessment: "moderate"` | Avoids eye contact. Doesn't initiate. If approached, gives polite minimum responses. |
| **Maret Korr** | Commission liaison requesting manifest data. Institutional interaction only. | `name: "[Detective Name]"`, `role: "Commission liaison"`, `faction: "Commission"`, `trust_level: "uncertain"` | Cooperates professionally. Provides requested data. Slightly nervous. |
| **Torek Lintar** | Commission colleague (compliance role). Recognizes the detective from institutional channels. | `name: "[Detective Name]"`, `role: "Commission investigator"`, `faction: "Commission"`, `trust_level: "reliable"` | Professional greeting. May comment on the district. |
---
## 5. Orientation Monologue
The first 60 seconds of gameplay establish who the player is, where they are, and what they care about. This is the emotional starting state -- the foundation that everything else builds on. These lines fire as the player gains control, before they take any action.
The orientation monologue is specific to the PLAYER character, not the PC-as-NPC. But it is included here because the orientation monologue must account for the PC-as-NPC's presence in the world. When the smuggler's monologue fires, the detective-as-NPC is already somewhere in the district. When the detective's monologue fires, the smuggler-as-NPC is already at the dock.
### Smuggler Orientation Monologue
The smuggler arrives at The Terminal for a morning shift. Operational awareness, protective instinct, comfort zone. The voice is terse, relational, sensory.
```
Line 1: "Morning shift. Recycled air and cargo lubricant. Home sweet home."
Line 2: "Kael's already at the dock. Good. The day's better when he's on shift."
Line 3: "Transition window opens in fifty minutes. Standard run — nothing complicated."
Line 4: "Just keep it clean. Keep it quiet. Another day."
```
**Emotional payload:** Comfort, routine, protectiveness. The smuggler is at home. The world is manageable. The operational awareness runs in the background like breathing -- not anxious, just present. The player should feel settled before the first crack appears.
**What the monologue does NOT mention:** The detective. The smuggler has no reason to think about Commission investigators at minute zero. If the detective-as-NPC walks through the hub, the smuggler might notice ("Commission. Don't stare.") but that's a reactive observation, not an opening state.
### Detective Orientation Monologue
The detective enters the Sova Transit District for the first time (or nearly -- posted 3 days ago, still orienting). Institutional mandate, observational mode, isolation in unfamiliar territory. The voice is complete sentences, analytical, measured.
```
Line 1: "Sova Transit District. Third day on station. The briefing said routine compliance review."
Line 2: "The briefing is always wrong about something."
Line 3: "Manifest discrepancies clustered around the freight hub. Start there. Watch the shift change."
Line 4: "Good to know Sera's here. At least someone in this district speaks my language."
```
**Emotional payload:** Isolation, professional caution, guarded optimism about Sera. The detective is an outsider. The district doesn't want them here. The player should feel the gap between institutional authority and social belonging.
**What the monologue does NOT mention:** The smuggler. The detective doesn't know the smuggler exists as a person of interest. The smuggler-as-NPC is one of many dock workers. If the detective-as-NPC sees the smuggler, there's no reason to flag them -- yet.
---
## 6. Agency Boundaries
### The Rule
The PC-as-NPC is NOT player-controlled. They follow a scripted routine. Their behavior must satisfy two constraints simultaneously:
1. **First playthrough plausibility:** A first-time player encountering the PC-as-NPC should read them as a normal NPC -- unremarkable, doing their job, part of the background social fabric.
2. **Second playthrough recognition:** A player who has already played as that character should recognize the PC-as-NPC's behavior as consistent with what they did on their own playthrough. "That's me. That's what I was doing."
### What the PC-as-NPC Does
| Behavior | Permitted | Example |
|----------|-----------|---------|
| **Follow routine** | Yes | Arrives at work, processes cargo, takes break, goes to bar after shift |
| **Interact with known NPCs** | Yes | Greets Kael, checks in with Voss, orders a drink from Lera |
| **Respond to player interaction** | Yes (limited) | If the player talks to the PC-as-NPC, they respond with public-tier dialogue |
| **Exhibit baseline personality** | Yes | Smuggler-NPC is casual, uses first names. Detective-NPC is formal, observational. |
| **Exhibit observable tells** | Yes | Smuggler-NPC checks corridors. Detective-NPC takes notes. (See section 8: Tell Inversion.) |
### What the PC-as-NPC Does NOT Do
| Behavior | Prohibited | Reason |
|----------|-----------|--------|
| **Make dramatic decisions** | No | Whether to escalate the ring, confront Kael, flip Drin -- these are player choices on the other playthrough |
| **Initiate confrontations** | No | THE FRIEND arc is player-driven. The PC-as-NPC doesn't confront Kael or press Sera. |
| **Change relationship states** | No | The PC-as-NPC's relationships with NPCs remain at their starting state throughout the session |
| **Discover contradictions** | No | Contradiction discovery is a player experience. The PC-as-NPC doesn't observe Kael's corridor meeting or Sera's avoidance pattern. |
| **React to triangle forks** | No | Triangle decisions are player-driven. The PC-as-NPC follows the neutral path regardless of fork state. |
| **Break routine without cause** | No | Routine deviations are tells. The PC-as-NPC's routine should be stable and predictable. |
### The Neutral Path
The PC-as-NPC follows the **default behavioral path** -- the path of least drama. This is the version of the character who doesn't make bold choices. They show up to work, do their job, go to the bar, go home. They maintain relationships at their starting state. They don't escalate, confront, or investigate.
This is intentional. The dramatic version of the character is the PLAYER's version. The NPC version is the baseline -- the character before the player's choices reshape them.
**Design implication for second playthrough:** When the player recognizes the PC-as-NPC, they see the neutral version of themselves. "That's what I would have done if I hadn't gotten involved." The gap between the neutral path and the player's actual choices IS the narrative distance the player has traveled.
---
## 7. Authored Relationship Stubs
Pre-authored text for how NPCs talk about or react to the PC-as-NPC. These are short lines used in NPC dialogue pools, tagged for situations where the PC-as-NPC is referenced.
### About the Smuggler-as-NPC (What NPCs Say When the Detective Plays)
| NPC | Context | Line | Tag Notes |
|-----|---------|------|-----------|
| **Kael Davan** | When asked about dock workers | "The crew's solid. Good people. We look out for each other." | `access: [public]`, `trust: surface` -- Kael doesn't name the smuggler to an outsider |
| **Kael Davan** | When pressed about specific colleague | "Just a dock worker. Does their shift, goes home. Not much to tell." | `access: [authority]`, `trust: surface` -- deflection under institutional pressure |
| **Voss** | When detective asks about the shift crew | "Everyone's got their routine. No complaints from that crew." | `access: [authority]`, `trust: surface` -- institutional wall |
| **Lera Sessik** | When detective mentions dock workers at the bar | "We get all sorts in here after shift. Working people. Tired, mostly." | `access: [public]`, `trust: surface` -- protective generality |
| **Naia Tamm** | When talking about Kael's friends | "Kael's got good colleagues. They eat lunch together most days." | `access: [public, peer]`, `trust: surface` -- genuine, unguarded |
| **Maret Korr** | When detective reviews crew records | "That name's on the morning shift roster. Standard cargo handling cert." | `access: [authority]`, `trust: surface` -- institutional data |
| **Torek Lintar** | Overheard bar conversation | "Dock crew's always here after shift. The usual crowd." | `access: [public]`, `trust: surface` -- background noise |
### About the Detective-as-NPC (What NPCs Say When the Smuggler Plays)
| NPC | Context | Line | Tag Notes |
|-----|---------|------|-----------|
| **Kael Davan** | Noticing Commission presence | "There's someone new at the hub. Commission badge. Keep your head down." | `access: [insider]`, `trust: real` -- ring awareness, protective warning |
| **Voss** | To smuggler during shift | "Commission liaison showed up this morning. Routine check, apparently. Just do your job normally." | `access: [insider]`, `trust: real` -- operational caution |
| **Lera Sessik** | When smuggler arrives at bar | "Your Commission friend is here again. Came in with Sera." | `access: [insider]`, `trust: surface` -- coded language, "your" is ironic |
| **Sera Venn** | Overheard at bar | "The new liaison? Standard posting. Nothing to worry about." | `access: [public]`, `trust: surface` -- Sera's deflection benefits the ring indirectly |
| **Naia Tamm** | When smuggler sits near her | "Have you noticed the new person at the hub? Commission, someone said. Kael didn't seem happy about it." | `access: [peer]`, `trust: surface` -- innocent observation |
| **Renn** | To smuggler during operations | "That investigator's been poking around manifests. Maret's sweating." | `access: [insider]`, `trust: real` -- ring operational intelligence |
| **Maret Korr** | To smuggler in corridor | "The Commission officer requested last quarter's schedules. I gave them the clean set." | `access: [insider]`, `trust: real` -- complicity confirmation |
---
## 8. Tell Inversion
### The Principle
When the player IS the smuggler, they observe NPC tells (Kael checking his lattice, Sera leaving when Torek arrives). When the smuggler IS the NPC, the detective player should observe the smuggler-NPC's tells. Same tell system, inverted perspective.
The PC-as-NPC's tells are observable behavioral markers that the other player can read. These tells should feel natural on first playthrough ("just an NPC doing NPC things") and recognizable on second playthrough ("that's MY operational awareness").
### Smuggler-as-NPC Observable Tells (Seen by Detective)
These are what the detective player can observe about the smuggler-NPC. The detective's monologue system flags them according to the detective's analytical frame.
| Tell | Observable Behavior | When It Occurs | Detective Monologue (If Flagged) |
|------|-------------------|----------------|--------------------------------|
| **Corridor awareness** | Smuggler-NPC glances down corridors before entering. Brief pause at intersections. | Every transition between areas | "That dock worker checks the corridor before turning. Habitual. Military? Or just careful." |
| **Shift-transition alertness** | Smuggler-NPC's movement pattern changes during shift transitions. More purposeful. Straighter route. | During 20-minute shift transition windows | "Movement pattern changed at shift change. More direct. Less idle. Interesting." |
| **Security-proximity tension** | Smuggler-NPC's pace increases slightly when passing security checkpoints or Commission-tagged NPCs. | When near detective-NPC or other authority figures | "Slight acceleration past the checkpoint. Most people do it. But this one does it every time." |
| **Ring member proximity** | Smuggler-NPC gravitates toward Kael, Renn, and other ring members during breaks. Tight social cluster. | Break periods, bar evenings | "Same three people at the same table. Every shift. Consistent social group." |
| **Cargo attention** | Smuggler-NPC's gaze lingers on specific containers. Brief interaction with freight systems. | During work routine near flagged cargo | "That worker checked container 4471 twice. The same container that's in my manifest discrepancy file." |
### Detective-as-NPC Observable Tells (Seen by Smuggler)
These are what the smuggler player can observe about the detective-NPC. The smuggler's monologue system flags them according to the smuggler's operational awareness.
| Tell | Observable Behavior | When It Occurs | Smuggler Monologue (If Flagged) |
|------|-------------------|----------------|-------------------------------|
| **Note-taking habit** | Detective-NPC pauses after conversations. Brief lattice interaction (recording notes). | After talking to any NPC | "Commission officer just stood there after talking to Voss. Making notes. Not good." |
| **Systematic movement** | Detective-NPC moves through the hub methodically. Covers areas in sequence, not randomly. | During hub exploration | "That investigator is working the hub section by section. Not browsing. Searching." |
| **Manifest interest** | Detective-NPC spends time near freight terminals, scheduling boards, manifest access points. | During investigation routine | "Commission's parked at the manifest terminal again. Third time today." |
| **NPC-watching** | Detective-NPC observes NPCs from a distance before approaching. Stands at sightline-advantaged positions. | Throughout the session | "They're watching. From the corner, where they can see the whole dock floor. Professional." |
| **Sera connection** | Detective-NPC is frequently seen with Sera. Eats together at the bar. Comfortable proximity that other NPCs don't get. | Bar evenings | "The investigator and Sera again. Old friends? Or is Sera reporting to them?" |
---
## 9. Nine-Step Conversion Checklist
A practical tool for content authors converting a playable character into an NPC entity. Follow these steps in order.
### Checklist
**Step 1: Define the neutral path routine.**
Write 5-7 routine entries covering a full day cycle (Morning, Afternoon, Evening, Night). The routine must be plausible as both "normal NPC behavior" (first playthrough) and "what I was doing" (second playthrough). No dramatic decisions. No confrontations. Just the default day.
- [ ] Morning routine entry (arrival, work start)
- [ ] Work period entries (2-3 task-oriented activities)
- [ ] Break/social entry (bar visit, meal, downtime)
- [ ] Evening routine entry (wind-down, departure)
- [ ] Verify routine is plausible for both playthrough perspectives
**Step 2: Build the starting knowledge graph.**
List everything the PC-as-NPC knows at session start. Use the four categories: known NPCs, known relationships, known facts, unknown facts. The unknown facts are critical -- they define what the PC-as-NPC cannot react to.
- [ ] Known NPCs (by name)
- [ ] Known relationships (type, trust level, access tier)
- [ ] Known facts (operational, institutional, social)
- [ ] Unknown facts (ensures no impossible knowledge)
**Step 3: Build the starting relationship map.**
For each NPC the PC-as-NPC knows, write a full EntityKnowledge entry using the 16 canonical keys. This defines the bidirectional relationship state at session start.
- [ ] EntityKnowledge entry per known NPC (16 keys)
- [ ] RelationshipState assignment (Unknown/Known/Friendly)
- [ ] Access tier assignment (public/insider/authority/peer)
**Step 4: Author reverse knowledge entries.**
For each NPC who knows the PC-as-NPC, write their EntityKnowledge entry ABOUT the PC-as-NPC. What do they know? What is their trust level? How does the PC-as-NPC's presence change their behavior?
- [ ] NPC-to-PC-as-NPC knowledge entries (per relevant NPC)
- [ ] Behavioral consequences documented (how does knowing the PC-as-NPC change the NPC's behavior?)
**Step 5: Write the orientation monologue.**
3-5 authored monologue lines for the PLAYER character's first 60 seconds. These establish emotional starting state. The orientation monologue must work in a world where the PC-as-NPC is already present but unremarked.
- [ ] 3-5 orientation monologue lines
- [ ] Emotional baseline established (comfort/isolation/purpose)
- [ ] PC-as-NPC's presence NOT mentioned (no reason to notice them yet)
**Step 6: Define agency boundaries.**
Explicitly list what the PC-as-NPC does and does not do. Reference the neutral path. Confirm that no dramatic decisions, confrontations, or relationship state changes occur.
- [ ] Permitted behaviors listed
- [ ] Prohibited behaviors listed
- [ ] Neutral path confirmed (no dramatic choices)
**Step 7: Write authored relationship stubs.**
2-3 dialogue lines per relevant NPC about the PC-as-NPC. These are how NPCs reference the PC-as-NPC in conversation with the player. Tag with appropriate access tier and trust level.
- [ ] 2-3 lines per relevant NPC
- [ ] Access tiers assigned
- [ ] Trust levels assigned
- [ ] Lines tested for both first-playthrough plausibility and second-playthrough recognition
**Step 8: Design tell inversion.**
3-5 observable behavioral tells for the PC-as-NPC. These are visible to the other player's character. Each tell should read as "normal NPC behavior" on first playthrough and "that's MY habit" on second playthrough. Write the observing character's monologue trigger for each tell.
- [ ] 3-5 observable tells defined
- [ ] Monologue trigger text for each tell (from observing character's perspective)
- [ ] Tells verified as plausible-but-notable
**Step 9: Count and validate authored items.**
Total all authored items. Target: ~20-30 per PC-as-NPC. Verify nothing contradicts the neutral path. Verify no authored content gives the PC-as-NPC dramatic agency.
- [ ] Item count: routine entries (target: 5-7)
- [ ] Item count: relationship stubs (target: 7-10 lines)
- [ ] Item count: tell descriptions + monologue triggers (target: 5-10 lines)
- [ ] Item count: public-tier dialogue lines for player interaction (target: 3-5)
- [ ] Total within ~20-30 budget
- [ ] Neutral path integrity verified
- [ ] No dramatic agency violations
---
## 10. v0.1 PC Brief: The Smuggler (as NPC Seen by Detective)
### Identity
- **Display name:** [Smuggler Name] (dock worker)
- **Color (detective's view):** Cool teal `#4a9ebb` (Unknown/Neutral) at session start. May shift to Warm amber `#e8c547` (Person of Interest) if detective flags cargo attention or ring-member proximity tells.
- **Pattern:** N/A (PC-as-NPC has no NPC pattern -- they are a special entity type)
- **Tier:** Equivalent to Tier 2 depth for content purposes
### Starting EntityKnowledge (Detective's Knowledge of Smuggler-NPC)
```rust
EntityKnowledge {
last_known_position: None, // not yet observed
last_observed_tick: 0,
last_updated_tick: 0,
confidence: KnowledgeConfidence::Unknown,
source: KnowledgeSource::None,
state: KnowledgeState::Inactive,
relationship: RelationshipState::Unknown,
known_attributes: BTreeMap::new(), // empty at session start
}
```
The detective starts with zero knowledge of the smuggler-NPC. The smuggler is one of many dock workers. Knowledge accumulates through observation only.
**After first observation (passing in the hub):**
```rust
EntityKnowledge {
confidence: KnowledgeConfidence::KnowsOf,
relationship: RelationshipState::Unknown,
known_attributes: BTreeMap::from([
("role".to_string(), "dock worker".to_string()),
("faction".to_string(), "civilian".to_string()),
("species".to_string(), "human".to_string()),
("routine_pattern".to_string(), "morning shift at logistics hub".to_string()),
]),
}
```
**After accumulated observation (multiple sightings, tell accumulation):**
```rust
EntityKnowledge {
confidence: KnowledgeConfidence::KnowsDetails,
relationship: RelationshipState::Known, // or PersonOfInterest if tells flagged
known_attributes: BTreeMap::from([
("name".to_string(), "[Smuggler Name]".to_string()),
("role".to_string(), "dock worker".to_string()),
("faction".to_string(), "civilian".to_string()),
("species".to_string(), "human".to_string()),
("routine_pattern".to_string(), "morning shift 06:00-14:00, bar after shift".to_string()),
("behavior_flags".to_string(), "corridor_checking,shift_transition_alertness".to_string()),
("risk_assessment".to_string(), "low".to_string()), // or "moderate" if tells flagged
("moral_weight".to_string(), "innocent".to_string()), // detective hasn't connected them yet
]),
}
```
### Routine (Neutral Path)
| Phase | Time | Location | Activity | Observable By |
|-------|------|----------|----------|---------------|
| Morning | 05:45 | The Terminal (entrance) | Arrives. Checks schedule board. | Anyone at hub entrance |
| Morning | 06:00-10:00 | The Terminal (dock floor) | Works cargo processing. Interacts with Kael, other dock workers. Standard freight handling. | Anyone on dock floor |
| Break | 10:00-10:30 | The Terminal (break area) | Eats with Kael and Renn. Conversation. | Anyone in break area |
| Afternoon | 10:30-14:00 | The Terminal (dock floor) | Afternoon work. Container routing. Schedule coordination with Voss. | Anyone on dock floor |
| Transition | 14:00-14:20 | The Terminal (transition) | Shift ends. Cleans station. Briefly checks service corridor. | Anyone watching shift change |
| Evening | 15:00-17:00 | The Last Shift (bar) | Drinks with Kael. Sits at regular table. Casual conversation with Lera. | Anyone in bar |
| Night | 17:30 | Exits district | Goes home. Off-screen. | No one (departed) |
### Tells (Observable by Detective)
1. **Corridor check** -- Pauses at intersections, glances down corridors before entering. Frequency: every transition. Detective monologue: *"That dock worker checks the corridor before turning. Habitual. Military? Or just careful."*
2. **Shift-transition behavior change** -- Movement becomes more purposeful during the 14:00 transition window. Straighter route, fewer idle pauses. Detective monologue: *"Movement pattern changed at shift change. More direct. Less idle. Interesting."*
3. **Security proximity tension** -- Pace increases slightly when passing Commission-tagged NPCs or checkpoints. Detective monologue: *"Slight acceleration past the checkpoint. Most people do it. But this one does it every time."*
4. **Social clustering** -- Same group at breaks and at the bar. Kael, Renn, and the smuggler-NPC form a tight cluster. Detective monologue: *"Same three people at the same table. Every shift. Consistent social group."*
5. **Cargo attention** -- Gaze lingers on specific containers. Brief second interaction with freight system during routing. Detective monologue: *"That worker checked container 4471 twice. The same container that's in my manifest discrepancy file."*
### Dialogue (If Detective Talks to Smuggler-NPC)
The detective can approach and talk to the smuggler-NPC. The smuggler-NPC responds with public-tier dialogue only -- polite, guarded, unremarkable.
| Situation | Smuggler-NPC Line | Tag Notes |
|-----------|-------------------|-----------|
| Greeting (hub) | "Morning. Can I help you with something?" | `access: [public]`, `trust: surface`, `situation: [greeting]` |
| Asked about work | "Cargo routing. Containers come in, I process them out. Standard stuff." | `access: [public, authority]`, `trust: surface`, `situation: [investigation]` |
| Asked about the hub | "It's a freight hub. Busy during shifts, quiet after. Same as any logistics operation." | `access: [public]`, `trust: surface`, `situation: [social]` |
| Asked about colleagues | "Good crew. We do our shifts, go home. Nothing exciting." | `access: [public, authority]`, `trust: surface`, `situation: [investigation]` |
| Pressed on specifics | "Look, I just move containers. You'd want to talk to Voss about scheduling." | `access: [authority]`, `trust: surface`, `situation: [confrontation]` -- deflection |
### Authored Item Count
| Category | Count | Items |
|----------|-------|-------|
| Routine entries | 7 | Morning arrival, morning work, break, afternoon work, transition, bar evening, departure |
| Relationship stubs (NPCs about smuggler) | 7 | Kael (2), Voss (1), Lera (1), Naia (1), Maret (1), Torek (1) |
| Tell descriptions + monologue triggers | 10 | 5 tells x 2 (description + detective monologue line) |
| Dialogue lines (smuggler-NPC speaks) | 5 | Greeting, work question, hub question, colleagues question, deflection |
| **Total** | **29** | Within ~20-30 budget |
---
## 11. v0.1 PC Brief: The Detective (as NPC Seen by Smuggler)
### Identity
- **Display name:** [Detective Name] (Commission liaison)
- **Color (smuggler's view):** Warm amber `#e8c547` (Person of Interest) from first sighting. The smuggler's operational awareness flags Commission presence immediately. Alternatively, cool teal `#4a9ebb` (Unknown) if the smuggler hasn't been warned yet, shifting to amber once Kael or Voss mentions the Commission presence.
- **Pattern:** N/A (PC-as-NPC)
- **Tier:** Equivalent to Tier 2 depth for content purposes
### Starting EntityKnowledge (Smuggler's Knowledge of Detective-NPC)
The smuggler may or may not know about the detective at session start. Two starting states, depending on when the ring's warning reaches the smuggler:
**Option A: Smuggler has been warned (default for v0.1)**
```rust
EntityKnowledge {
confidence: KnowledgeConfidence::KnowsOf,
source: KnowledgeSource::Secondhand {
via: EntityRef("voss"),
},
state: KnowledgeState::Active,
relationship: RelationshipState::Known, // or PersonOfInterest
known_attributes: BTreeMap::from([
("role".to_string(), "Commission liaison".to_string()),
("faction".to_string(), "Commission".to_string()),
("species".to_string(), "human".to_string()),
("risk_assessment".to_string(), "moderate".to_string()),
("loyalty_assessment".to_string(), "hostile".to_string()), // institution vs ring
("position_integrity".to_string(), "N/A".to_string()),
("moral_weight".to_string(), "peripheral".to_string()),
]),
}
```
**Option B: Smuggler not yet warned (first sighting triggers knowledge)**
```rust
EntityKnowledge {
// Empty until first observation or Kael/Voss warns the smuggler
}
```
### Routine (Neutral Path)
| Phase | Time | Location | Activity | Observable By |
|-------|------|----------|----------|---------------|
| Morning | 08:00 | The Terminal (entrance) | Arrives. Shows credentials to Voss. Reviews scheduling board. | Anyone at hub entrance |
| Morning | 08:30-10:00 | The Terminal (offices) | Requests manifest data from Maret. Reviews freight records at terminal. | Maret, anyone near office area |
| Late Morning | 10:00-11:30 | The Terminal (dock floor) | Walks the dock floor. Observes operations. Takes notes (lattice interaction). | Anyone on dock floor |
| Midday | 11:30-12:30 | The Terminal (break area) / exit | Brief break. May leave hub to check district geography. | Anyone in break area |
| Afternoon | 13:00-14:30 | The Terminal (offices) | Follow-up with Drin on inspection records. Cross-references manifests. | Drin, Maret, anyone near offices |
| Evening | 16:00-18:00 | The Last Shift (bar) | Meets Sera. Sits together. Casual conversation. Observes room. | Anyone in bar |
| Night | 18:30 | Exits district | Returns to temporary quarters. Off-screen. | No one (departed) |
### Tells (Observable by Smuggler)
1. **Note-taking pauses** -- After every conversation, the detective-NPC pauses and interacts with their lattice (recording notes). Brief but consistent. Smuggler monologue: *"Commission officer just stood there after talking to Voss. Making notes. Not good."*
2. **Systematic coverage** -- Moves through the hub in a methodical pattern. Section by section, not wandering. Smuggler monologue: *"That investigator is working the hub section by section. Not browsing. Searching."*
3. **Manifest station fixation** -- Returns to the manifest terminal repeatedly. Spends significant time reviewing data. Smuggler monologue: *"Commission's parked at the manifest terminal again. Third time today."*
4. **Observation positioning** -- Stands at corners and elevated positions with good sightlines over the dock floor. Watches before approaching. Smuggler monologue: *"They're watching. From the corner, where they can see the whole dock floor. Professional."*
5. **Sera proximity** -- Consistently gravitates toward Sera at the bar. Comfortable body language. Old-friends energy. Smuggler monologue: *"The investigator and Sera again. Old friends? Or is Sera reporting to them?"*
### Dialogue (If Smuggler Talks to Detective-NPC)
The smuggler can approach and talk to the detective-NPC. The detective-NPC responds with public-tier dialogue -- professional, measured, slightly formal.
| Situation | Detective-NPC Line | Tag Notes |
|-----------|-------------------|-----------|
| Greeting (hub) | "Good morning. Commission Liaison Office -- I'm conducting a routine compliance review." | `access: [public]`, `trust: surface`, `situation: [greeting]` |
| Asked about purpose | "Standard review. Manifest reconciliation, scheduling compliance. Nothing unusual." | `access: [public]`, `trust: surface`, `situation: [social]` |
| Asked about the district | "Only been here a few days. Seems like a well-run operation." | `access: [public]`, `trust: surface`, `situation: [social]` -- deliberate blandness |
| Asked about Sera | "Ms. Venn? Colleague. We've worked in the same division." | `access: [public]`, `trust: surface`, `situation: [social]` -- professional deflection |
| Pressed on investigation | "I appreciate the interest, but I'm sure you have cargo to route. I won't keep you." | `access: [public, authority]`, `trust: surface`, `situation: [confrontation]` -- polite dismissal |
### Authored Item Count
| Category | Count | Items |
|----------|-------|-------|
| Routine entries | 7 | Morning arrival, manifest review, dock observation, midday break, afternoon follow-up, bar evening, departure |
| Relationship stubs (NPCs about detective) | 7 | Kael (1), Voss (1), Lera (1), Sera (1), Naia (1), Renn (1), Maret (1) |
| Tell descriptions + monologue triggers | 10 | 5 tells x 2 (description + smuggler monologue line) |
| Dialogue lines (detective-NPC speaks) | 5 | Greeting, purpose question, district question, Sera question, deflection |
| **Total** | **29** | Within ~20-30 budget |
> **Post-v0.1 note:** 5 public-tier lines may feel thin on replay when the player already knows the detective's real purpose. Consider adding 2-3 rotation variants per situation in a future content pass -- same tag structure, different phrasing -- so the detective-NPC doesn't repeat identical lines across playthroughs.
---
## Appendix A: Cross-Reference to Downstream Tickets
| Ticket | Title | How This Spec Feeds It |
|--------|-------|----------------------|
| #383 | NPC-format briefs for both PCs | Takes sections 10-11 as input. Expands routine entries into YAML format. Adds EntityKnowledge YAML entries. |
| #401 | PC-as-NPC content authoring | Takes sections 7-8 as input. Authors the actual dialogue lines, monologue triggers, and relationship stubs in YAML format per content directory structure. |
| #299 | Opening hook: smuggler first 5 minutes | Orientation monologue (section 5) provides the first 4 lines. |
| #300 | Opening hook: detective first 5 minutes | Orientation monologue (section 5) provides the first 4 lines. |
## Appendix B: EntityKnowledge Key Reference
The 16 canonical keys used throughout this document (from `docs/wiki/knowledge/entity-attributes.md`):
| Category | Keys |
|----------|------|
| Identity | `name`, `role`, `faction`, `species` |
| Social | `relationship_type`, `trust_level` |
| Behavioral | `routine_pattern`, `behavior_flags` |
| Leverage | `leverage_held`, `leverage_confidence` |
| Investigation | `tell_observed`, `contradiction_flagged` |
| Role-Perspective | `risk_assessment`, `loyalty_assessment`, `position_integrity`, `moral_weight` |
## Appendix C: Design Rationale
### Why ~20-30 items per PC-as-NPC?
Per D-029 Concept A, the other PC-as-NPC needs enough content to feel real but not so much that it competes with hand-authored NPCs like Kael or Sera (who get 70-100 lines each). The PC-as-NPC is a background presence -- important for the Divergence Reveal but not a major interaction target during normal play. 20-30 items gives enough for: a plausible routine, observable tells, minimal dialogue if the player approaches, and NPC chatter about the PC-as-NPC's presence.
### Why the neutral path?
The dramatic choices belong to the player. If the smuggler-NPC makes a dramatic decision (confront Kael, escalate the ring, cover for Drin), that contradicts the player's experience when they play the smuggler and make a different choice. The neutral path is the only version that is compatible with ALL possible player choices.
### Why tell inversion matters
Tell inversion is the mechanic that makes the Divergence Reveal (Wow Moment #4) work emotionally. On second playthrough, the player sees their own character's tells from the outside. "That's MY corridor check. That's MY note-taking habit." The recognition transforms an NPC observation into self-recognition -- a mirror moment that makes the dual-lens design visceral.
---
*Ticket #381 -- PC-as-NPC unified specification. v0.1 scope: 2 PC briefs (smuggler, detective). Blocks #383, #401.*
+371
View File
@@ -0,0 +1,371 @@
# Smuggler Moral Arc Spec
**v0.1 Content Design Document** | Ticket: #382 | Subsumes: #310 (Character voice speech patterns)
---
## 1. Purpose
This document specifies the smuggler's 4-phase moral trajectory through the v0.1 vertical slice. The arc is tracked via the `moral_weight` role-perspective key in `EntityKnowledge.known_attributes` and is driven by authored content triggers, not emergent calculation.
The moral arc answers the smuggler's central question: **"Am I responsible for what happens to the people around me?"** The detective's arc (unspecified here) would answer a different question -- "Am I justified in what I'm doing to solve this case?" Only the smuggler's arc is defined in this document.
**Relationship to the dual-lens system:** The smuggler's moral arc creates the emotional engine that drives monologue voice shifts, NPC interaction tone changes, and player decision framing. It is the content-side complement to the tag-based dialogue system defined in the [Dual Lens Authoring Guide](dual-lens-authoring-guide.md). Where the authoring guide defines *how* content is selected and displayed, this document defines *what emotional trajectory* that content traces.
**Key design principles:**
- `moral_weight` is a **content key, not a schema key** -- it lives in `EntityKnowledge`, updated by authored content triggers, not calculated by the server
- The arc is **authored, not emergent** -- specific FactIds gate specific transitions
- Phase transitions are **irreversible** within a playthrough
- The smuggler's moral arc is **personal** (complicity, loyalty, consequences) while the detective's would be **institutional** (duty, jurisdiction, compromise)
---
## 2. The 4 Phases
### Phase 1: Comfort
**Emotional state:** Pragmatic rationalization. The operation is manageable. The money helps. The people are fine. "This is a service. Nobody's getting hurt."
**`moral_weight` value range:** `innocent` to `peripheral`
At session start, the smuggler's `moral_weight` assessments of NPCs cluster in the comfortable end: Naia is `innocent`, Kael is `willing` (fully aware participant, no guilt needed), Voss is `complicit` (chose this, not the smuggler's problem), Drin is `peripheral` (barely on the radar). The smuggler is not interrogating these assessments. They are background assumptions.
**Observable behavioral shifts:**
- Monologue is matter-of-fact, operationally confident
- NPC observations are fond or neutral -- no anxiety coloring
- Operational thinking dominates: schedules, windows, routes
- Self-reference is minimal -- the smuggler is not thinking about herself
**Transition trigger:** The smuggler encounters evidence that the operation has a human cost she had not been weighing. Specific gates:
- `smuggler.sees.naia_worry` -- Naia Tamm's visible stress about Kael's late nights
- `smuggler.notices.maret_anxiety` -- Maret's nervous glances at the manifest screen
- `smuggler.hears.pell_fear` -- Pell's voice shaking during a routine ring check-in
Any one of these FactIds, once confirmed, opens the gate to Doubt. The first one observed is sufficient.
**Example monologue lines:**
> *"Transition's in twenty. Voss kept the window clean. Another smooth run."*
> *"Kael's got it handled. He always does. Good partner to have on the dock."*
**Key NPC interactions:**
- **Kael:** Warm, reliable, no subtext. Phase 1 is the baseline the player will miss when it's gone.
- **Voss:** Functional annoyance. The smuggler sees Voss as a tool, not a person with stakes.
- **Naia Tamm:** Background warmth. The smuggler knows Naia through Kael but is not yet thinking about what the operation means for her.
---
### Phase 2: Doubt
**Emotional state:** Questions the rationalization. "Nobody's getting hurt -- except everyone adjacent to this." The smuggler begins noticing the human cost she previously filtered out.
**`moral_weight` value range:** `peripheral` to `complicit`
The smuggler's assessments start shifting. Naia's `moral_weight` stays `innocent`, but the smuggler now *feels* that innocence as an accusation. Maret might shift from `peripheral` to `complicit` in the smuggler's eyes -- not because Maret has done anything wrong, but because the smuggler is now aware that Maret is being forced to file clean reports on dirty manifests. The smuggler's own complicity becomes visible through the lens of other people's discomfort.
**Observable behavioral shifts:**
- Monologue gains reflective undertones -- pauses, qualifications, second thoughts
- Observations of NPCs pick up emotional subtext that was invisible in Phase 1
- Operational confidence wavers -- the smuggler starts noticing risk she used to dismiss
- Self-reference increases slightly: physical sensation of unease ("tight feeling in my chest," "couldn't eat this morning")
**Transition trigger:** A specific harm becomes undeniable. The smuggler sees a direct consequence of the operation on someone she cares about. Specific gates:
- `smuggler.witnesses.kael_stress` -- Kael's behavioral tells escalate beyond "distracted" to visibly frightened
- `smuggler.learns.naia_confided_sera` -- The smuggler discovers (through observation or dialogue) that Naia has been confiding in Sera about Kael
- `smuggler.sees.drin_breaking` -- Drin's inspection compromises become visible as human suffering, not just operational risk
Any one of these FactIds, once confirmed, opens the gate to Reckoning.
**Example monologue lines:**
> *"Naia was at the bar again tonight. Waiting for Kael. She looked... tired. Does she know? No. But she feels it."*
> *"Maret double-checked the manifest before she filed it. She used to just sign. Now she reads every line. That's on us."*
**Key NPC interactions:**
- **Kael:** The smuggler starts reading Kael's stress not as operational friction but as personal cost. "Kael's distracted" becomes "Kael's scared."
- **Naia Tamm:** The smuggler begins avoiding Naia. Not out of guilt exactly -- out of the pre-guilt awareness that guilt is coming.
- **Pell:** If the smuggler has observed Pell's fear, Pell becomes a mirror: "That could be me. That could be any of us."
---
### Phase 3: Reckoning
**Emotional state:** Cannot rationalize. The smuggler must choose: continue, reform, or exit. A specific harm has materialized -- someone the smuggler cares about has been damaged by the operation, and the smuggler's actions contributed.
**`moral_weight` value range:** `complicit` to `compromised`
The smuggler's assessments are now sharp-edged. Kael is no longer `willing` (comfortable participant) but `compromised` (trapped). Naia's `innocent` status now reads as indictment. The smuggler's own position is `complicit` at minimum -- the question is whether it crosses to `compromised`.
**Observable behavioral shifts:**
- Monologue is conflicted and sharp -- fragments hit harder, pauses are loaded
- The smuggler's voice loses its operational ease; confidence is replaced by urgency
- NPC observations are filtered through moral cost: "Is this my fault?"
- Operational thinking shifts from "is this safe?" to "is this right?"
- Self-reference spikes: the smuggler can no longer avoid herself
**Transition trigger:** The smuggler makes a definitive choice about the situation. This is a player decision, not an automatic transition. Specific gates:
- `smuggler.decides.triangle1_path` -- The player commits to a path in the Triangle 1 escalation fork (back Voss, back Nils, or stay neutral)
- `smuggler.confronts.kael` -- The smuggler directly addresses Kael about the unauthorized contact
- `smuggler.decides.pell_fate` -- If Pell's wavering comes to a head, the smuggler chooses to support, report, or abandon Pell
The transition to Compromise is gated by one of these decisions being made. The smuggler must act, not just observe.
**Example monologue lines:**
> *"I told Kael to push back on Nils. Now Nils is angry, and Kael's the one standing in front of it. I did that."*
> *"Two years I told myself it was just containers. It was never just containers. It was Kael, and Naia, and Maret, and Drin, and everyone who has to live in the wake of what we move."*
**Key NPC interactions:**
- **Kael:** THE FRIEND contradiction is at peak intensity. The smuggler's moral reckoning and Kael's trust erosion are the same events seen from different angles (see Section 5 below).
- **Naia Tamm:** If the smuggler encounters Naia during Reckoning, the monologue fires guilt-loaded lines. Naia's presence is an accusation without words.
- **Voss:** The smuggler may see Voss not as a tool anymore but as another person trapped. Or may see Voss as the reason the trap exists. Depends on the player's path.
---
### Phase 4: Compromise
**Emotional state:** Whatever the player decided, the cost is visible. The question becomes: "Can I live with it?" Some damage is done. Some relationships are changed. The smuggler settles into a new moral equilibrium that is heavier than the old one.
**`moral_weight` value range:** `compromised` to `willing`
This is the final assessment. The smuggler knows what she is now. The `moral_weight` of specific NPCs may shift based on the player's choices -- Kael might move from `compromised` back to `willing` if the smuggler helped him, or to `innocent` (victim) if the smuggler reported him. The smuggler's own moral position is whatever she chose, and the monologue reflects the weight of it.
**Observable behavioral shifts:**
- Monologue is quiet and weighted -- fewer fragments, more silence between thoughts
- The operational ease of Phase 1 is gone permanently; the smuggler works with awareness now
- NPC observations carry the full history: every warm interaction is filtered through knowledge of cost
- Self-reference is present but controlled: the smuggler has made peace or is learning to
**Transition trigger:** None. This is the final phase of v0.1. The arc does not resolve -- it settles. The 30-minute session ends with the smuggler carrying whatever she chose.
**Example monologue lines:**
> *"Kael's at the dock. Same jokes. Same routine. I know what it costs now. Both of us do."*
> *"The freight bay hums the way it always has. Recycled air, cargo lubricant. It used to smell like home. Now it smells like what I chose."*
**Key NPC interactions:**
- **Kael:** Post-confrontation equilibrium. If the smuggler chose understanding (Path A), Kael is cautious but present. If betrayal (Path B), Kael is hostile or absent. If observation (Path C), the tension simmers.
- **Naia Tamm:** The smuggler's guilt about Naia crystallizes. Naia is still innocent. The smuggler is not.
- **The operation:** Every container, every manifest, every shift transition now carries the weight of awareness. The smuggler can still do the job. But the job is different now.
---
## 3. FactId Integration
These are the smuggler-specific FactIds that track moral arc progression. They are the information states that gate phase transitions. FactIds are populated by the knowledge graph when the smuggler observes, learns, or decides specific things.
### Phase 1 -> Phase 2 Gates (Comfort -> Doubt)
| FactId | Source | What It Tracks |
|--------|--------|----------------|
| `smuggler.sees.naia_worry` | Direct observation: Naia Tamm at bar, visibly distressed | The smuggler notices that the operation's stress is reaching Kael's partner |
| `smuggler.notices.maret_anxiety` | Direct observation: Maret double-checking manifests | The smuggler sees institutional pressure on a colleague who did not choose this |
| `smuggler.hears.pell_fear` | Overheard or dialogue: Pell's voice during ring check-in | The smuggler recognizes fear in a ring member who is close to breaking |
**Gate logic:** ANY one of these FactIds confirmed = Doubt phase begins. The first observation of human cost cracks the rationalization.
### Phase 2 -> Phase 3 Gates (Doubt -> Reckoning)
| FactId | Source | What It Tracks |
|--------|--------|----------------|
| `smuggler.witnesses.kael_stress` | Direct observation: Kael's tells escalate (lattice checking, shortened interactions, spatial deviation) | Kael's behavioral deterioration is now unmissable |
| `smuggler.learns.naia_confided_sera` | Dialogue or observation: Naia has spoken to Sera about Kael | The smuggler discovers that the worry has reached the Commission's orbit |
| `smuggler.sees.drin_breaking` | Direct observation: Drin's inspection compromises visible as human suffering | The operational asset is a person in pain |
| `smuggler.knows.ring_volume_escalation` | Dialogue: Devra relays Nils's doubled-volume order | The operation is escalating beyond the smuggler's comfort |
**Gate logic:** ANY one of these FactIds confirmed = Reckoning phase begins. One undeniable harm materializes.
### Phase 3 -> Phase 4 Gates (Reckoning -> Compromise)
| FactId | Source | What It Tracks |
|--------|--------|----------------|
| `smuggler.decides.triangle1_path` | Player choice: Triangle 1 escalation fork (Path A/B/C) | The smuggler commits to backing Voss, backing Nils, or staying neutral |
| `smuggler.confronts.kael` | Player choice: Initiates confrontation dialogue with Kael about the unauthorized contact | The smuggler addresses the FRIEND contradiction directly |
| `smuggler.decides.pell_fate` | Player choice: Responds to Pell's wavering (support, report, or abandon) | The smuggler makes a decision about a vulnerable ring member |
**Gate logic:** ANY one of these FactIds confirmed = Compromise phase begins. The smuggler must act to enter the final phase.
### Supporting FactIds (Not Phase-Gating, But Monologue-Relevant)
| FactId | What It Tracks |
|--------|----------------|
| `smuggler.knows.kael_exit_attempt` | The smuggler has discovered Kael's unauthorized contact and infers exit attempt |
| `smuggler.knows.sera_commission` | The smuggler is aware Sera is Commission (always true at start, but awareness sharpens during Doubt) |
| `smuggler.sees.torek_spending` | The smuggler notices Torek's visible consumption |
| `smuggler.feels.location_contamination` | The smuggler returns to a location (bar, dock) after a moral phase transition and the monologue notes the changed feeling |
| `smuggler.assesses.voss_stability` | The smuggler evaluates Voss's cover integrity |
---
## 4. Monologue Trigger Rules
Moral-arc-relevant monologue fires under the following conditions. These are not exhaustive -- other monologue triggers exist for operational, atmospheric, and NPC-observation content. These rules govern specifically the lines that track the moral arc.
### Phase Transition Moments
When a phase-gating FactId is confirmed, the monologue system fires a phase-transition line. These are the highest-priority monologue events in the pool.
**Trigger type:** `phase_transition`
**Priority:** Maximum (overrides queued environmental or routine monologue)
**Example (Comfort -> Doubt):**
> *"Naia was at the bar again. Looking at the door every time it opened. Waiting for Kael. ...She doesn't know why he's late. I do."*
**Example (Doubt -> Reckoning):**
> *"Kael's hands were shaking. Not the lattice checking -- his hands. That's not nerves. That's fear."*
**Example (Reckoning -> Compromise):**
> *"I chose. For better or worse, I chose. Now I get to live with it."*
### Post-Decision Reflection
After the player makes a decision that gates a phase transition (Triangle 1 fork, Kael confrontation, Pell decision), a reflective monologue fires within 30-60 seconds. This is the "consequences landing" moment.
**Trigger type:** `post_decision`
**Priority:** High (fires after decision dialogue concludes, during next idle moment)
**Delay:** 30-60 seconds post-decision (let the player process the dialogue first)
**Example (post-Triangle 1, Path A):**
> *"Told Kael to push back. He didn't want to. Did it anyway, because I asked. If Nils comes down on him... that's on me."*
### Observing Consequences of Own Choices
After a decision has been made, the smuggler's monologue fires when she observes the downstream effects. These are delayed consequence lines -- they fire minutes after the decision, when the player encounters the result.
**Trigger type:** `observe_consequence`
**Prerequisite:** Phase-gating FactId + specific consequence state
**Example (Path B consequence -- Voss rattled):**
> *"Voss is sitting alone in the break room. Staring at his lattice. He did what I asked him to do. Look at him."*
### Kael Contradiction Discovery Intersection
When the smuggler discovers Kael's unauthorized contact (the FRIEND contradiction), the moral-arc monologue and the FRIEND-arc monologue fire in sequence. The FRIEND line fires first (shock, confusion). The moral-arc line fires second (guilt, responsibility).
**Trigger type:** `friend_contradiction` + `moral_reflection`
**Sequence:**
1. FRIEND line: *"Kael? In the corridor? Who the hell is that with him?"* (immediate)
2. Moral-arc line: *"He's trying to get out. And I'm the reason he needs to."* (15-30 second delay)
**Tuning target:** The 15-30 second delay is a content-side estimate. If both lines fire too close together, they feel like one event rather than a realization arriving after the shock. If too far apart, the emotional connection breaks. Playtesting should calibrate the exact delay -- flag for QA during integration.
The second line only fires if the smuggler is in Phase 2 (Doubt) or later. If still in Phase 1 (Comfort), only the FRIEND line fires -- the smuggler has not yet developed the moral lens to process the observation as self-implication.
---
## 5. Kael Intersection
The smuggler's moral arc and Kael's 5-phase contradiction arc (defined in [kael-davan.md](../wiki/npcs/kael-davan.md)) are two perspectives on the same events. The following table maps the intersection:
| Kael Phase | Kael State | Smuggler Moral Phase | Smuggler State | Shared Event |
|------------|------------|---------------------|----------------|-------------|
| **1: Comfort** | Warm, reliable, present | **1: Comfort** | Operationally confident, fond | Baseline: both characters comfortable. No tension. |
| **2: First Crack** | Lattice checking, shortened interactions | **1: Comfort** or **2: Doubt** | Noticing concern but not yet connecting to moral cost | Kael's behavioral tells begin. Smuggler may still be in Comfort if she has not yet seen Naia's worry or other Phase 1->2 gates. |
| **3: The Observation** | Corridor B-7, unknown contact, spatial deviation | **2: Doubt** or **3: Reckoning** | Shock at Kael's contradiction; if in Doubt, the moral implications land immediately | THE FRIEND contradiction moment. This is the hinge. The smuggler's moral phase determines whether she reads this as betrayal (Phase 1-2: "Kael broke protocol") or as consequence (Phase 2-3: "Kael is trying to get out because of what we're all doing"). |
| **4: Confrontation** | Evasion, the tell confirmed, forced casualness | **3: Reckoning** | The smuggler's confrontation with Kael IS the moral reckoning -- personal loyalty vs. operational security vs. the cost of the operation | The confrontation dialogue. Kael's evasion forces the smuggler to decide: press harder, show mercy, or walk away. Each choice is a moral position. |
| **5: Contaminated Trust** | Surface normal, warmth locked out or cautiously restored | **4: Compromise** | Living with whatever she chose. Every interaction with Kael carries the weight of the decision. | The new equilibrium. Kael's Phase 5 and the smuggler's Phase 4 are the same state: something is permanently different, and both characters know it. |
### Why This Intersection Matters
The smuggler's moral reckoning and Kael's trust erosion are **the same events seen from different angles**. The smuggler does not have a moral arc separate from her relationships -- the relationships ARE the moral arc. Kael's contradiction is not just a plot event; it is the moment the smuggler's rationalization meets reality.
This means content authors must write the intersection, not just the individual arcs:
- Every Kael-related smuggler monologue line must be aware of the smuggler's current moral phase
- Every confrontation dialogue option must reflect both the FRIEND arc state and the moral arc state
- The "contaminated trust" of Kael Phase 5 and the "compromise" of Smuggler Phase 4 must feel like the same emotional register approached from two directions
---
## 6. Divergence from Detective
At each phase, the smuggler's moral arc creates maximum distance from the detective's analytical trajectory. The following table cross-references the divergence escalation curve from the [Dual Lens Authoring Guide](dual-lens-authoring-guide.md), Chapter 4.
| Phase | Smuggler Moral Position | Detective Analytical Position | Divergence Type | Minutes |
|-------|------------------------|------------------------------|----------------|---------|
| **1: Comfort** | "Nobody's getting hurt." | "Manifest discrepancies require investigation." | Minimal: both characters are in their comfort zones. Difference is tonal, not emotional. | 0-10 |
| **2: Doubt** | "Maybe people ARE getting hurt." | "Behavioral patterns suggest a network. Building the case." | Growing: the smuggler is beginning to question; the detective is beginning to confirm. One moves toward uncertainty, the other toward certainty. | 10-20 |
| **3: Reckoning** | "I am responsible for this harm." | "The evidence supports formal action. But the subjects are people, not entries." | Maximum: the smuggler is inside the moral crisis. The detective may be starting to feel the human cost of the investigation, but from the outside. Same events, opposite emotional positions. | 20-25 |
| **4: Compromise** | "I chose. I live with it." | "The investigation produced results. But at what cost?" | Settled: both characters carry weight, but different weight. The smuggler's compromise is personal (complicity). The detective's doubt is institutional (was this right?). | 25-30 |
### What This Means for Content
The maximum divergence point (Phase 3, minutes 20-25) is where the dual-lens experience creates its strongest emotional contrast. A player who has played the smuggler path and then plays the detective path will experience the same 5-minute window as two completely different emotional events:
- **As smuggler:** "I am watching my world break apart because of choices I made."
- **As detective:** "I am closing in on a case. The suspects are nervous. The evidence is mounting."
The smuggler's moral arc is the engine that makes this divergence feel earned, not arbitrary. The divergence is not "different information" -- it is "different moral position relative to the same information."
---
## 7. Content Requirements
### Lines Per Phase
| Phase | Monologue Lines | Type Breakdown |
|-------|----------------|----------------|
| **Comfort** | 6-8 | 3-4 operational confidence, 2-3 NPC fondness, 1 atmospheric |
| **Doubt** | 8-10 | 3-4 reflective concern, 2-3 NPC moral observation, 2 self-questioning, 1 phase-transition |
| **Reckoning** | 6-8 | 2-3 confrontation reaction, 2-3 post-decision reflection, 1-2 consequence observation, 1 phase-transition |
| **Compromise** | 4-6 | 2-3 settled weight, 1-2 contaminated observation, 1 atmospheric (changed), 1 phase-transition |
| **Total** | **24-32** | Moral-arc-specific monologue lines |
These counts are for **moral-arc-specific** monologue only. The smuggler's total monologue pool is larger (operational observations, environmental atmosphere, general NPC reactions). The moral arc lines are the subset that tracks the emotional trajectory.
### What Authors Need to Produce Per Phase
**Phase 1 (Comfort):**
- Operational monologue lines that demonstrate ease and confidence
- NPC observation lines with no moral coloring
- 0 moral-weight-shift lines (the smuggler is not thinking about it)
**Phase 2 (Doubt):**
- Reflective monologue lines that introduce moral questioning
- NPC observation lines with new emotional subtext (re-seeing familiar faces through a cost lens)
- 1 phase-transition line (the moment Doubt begins)
- Self-questioning lines that use physical sensation, not abstract ethics
**Phase 3 (Reckoning):**
- Confrontation-adjacent lines (pre-decision tension, post-decision landing)
- Consequence observation lines (seeing the results of choices)
- 1 phase-transition line (the moment Reckoning begins)
- Lines must work across all Triangle 1 fork paths (A/B/C) with path-specific variants
**Phase 4 (Compromise):**
- Quiet, weighted lines that carry full history
- Contaminated-observation lines (same locations/NPCs, new subtext)
- 1 phase-transition line (the moment Compromise settles)
- Atmospheric lines that echo Phase 1 with changed meaning
---
## 8. Subsumption Note
This spec subsumes ticket #310 (Character voice speech patterns). The voice card ([smuggler-voice-card.md](smuggler-voice-card.md)) handles speech patterns -- register parameters, voice anchors, anti-patterns, display constraints, and the authoring checklist. This document handles the moral trajectory -- the 4-phase arc that determines *what the smuggler thinks about*, not *how she thinks*.
Together, the two documents define the complete smuggler authoring framework:
- **Voice card** = HOW (fragments, feeling-first, first names, Krenn substrate vocabulary)
- **Moral arc** = WHAT (the progression from comfort through doubt and reckoning to compromise)
Content authors use both documents together. A smuggler monologue line must pass the voice card's checklist AND reflect the correct moral arc phase. A line that sounds right but belongs to the wrong phase is as broken as a line that sounds wrong.
---
**Cross-References:**
- [Smuggler Voice Card](smuggler-voice-card.md) -- Voice register parameters and authoring checklist
- [Dual Lens Authoring Guide](dual-lens-authoring-guide.md) -- Full dual-lens framework, divergence curve (Chapter 4), voice signatures (Chapter 7)
- [Kael Davan](../wiki/npcs/kael-davan.md) -- Kael's 5-phase contradiction arc, smuggler FRIEND intersection
- [Entity Attributes](../wiki/knowledge/entity-attributes.md) -- `moral_weight` key definition and role-perspective interpretation
- [Round 1 Gestalt](../workshops/v01-content-scoping/round1-gestalt.md) -- Original `moral_weight` key proposal and smuggler attribute mapping
- [Round 1 Paula](../workshops/v01-content-scoping/round1-paula.md) -- Smuggler moral arc phases, smuggler-lens sections
- [Round 2 Paula](../workshops/v01-content-scoping/round2-paula.md) -- Role-perspective keys as content not schema, generic assessment architecture
---
**End Smuggler Moral Arc Spec**
+295
View File
@@ -0,0 +1,295 @@
# Smuggler Voice Card
**Authoring Reference** | Ticket: #382 | Subsumes: #310 (Character voice speech patterns)
---
## 1. Purpose
This document is the single authoring reference for the smuggler's internal monologue voice. Every monologue line written for the smuggler character must pass the parameters, anchors, and anti-patterns defined here. The voice card is used by:
- **Content authors** writing monologue pools, dialogue reactions, and environmental observations
- **Reviewers** checking voice consistency across content packs
- **The generation pipeline** (v0.2+) as the style target for expanded monologue variants
The detective voice card is the structural mirror. Where this card defines fragments, feeling-first, and first names, the detective card defines complete sentences, analysis-first, and surnames. Both cards reference the same triggers and situations so that paired comparison is always visible. For the full dual-lens framework, see [Dual Lens Authoring Guide](dual-lens-authoring-guide.md), Chapter 7.
---
## 2. Smuggler 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. 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. People 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. 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 the Smuggler Does NOT Do
- Does not analyze systems.
- Does not use institutional vocabulary.
- Does not explain things to herself that she already knows.
- Does not monologue in paragraphs.
### Krenn Substrate Vocabulary
The smuggler is Krenn System, born on Station Sova. Her vocabulary carries Krenn cultural markers:
- **First-name-primary**: Krenn convention is compact names, first-name basis in all social contexts. Surnames exist for records, not for conversation.
- **Trade jargon as native language**: containers, manifests, shifts, routes, transition windows, temp storage, freight bay -- these are her mother tongue, not terminology she learned. She does not translate or annotate.
- **Mind-your-business ethos**: The smuggler does not comment on things that are not her concern. Observations are filtered through relevance to her people and her operation.
- **Pragmatic, physical framing**: Abstract concepts get physical handles. Trust is "having your back." Danger is "getting caught." Betrayal is "a knife in the back" or "looking left when you answer."
---
## 3. Voice Anchors
These 5 lines define the boundaries of the smuggler's voice. Every smuggler monologue line should feel like it could sit next to these without register collision.
### Anchor 1: Baseline Warm
> *"Kael's already at the dock. Good. The day's better when he's on shift."*
Short. Personal. Physical presence matters. The smuggler's comfort is measured in who's around, not what's happening.
**Authored example:**
> *"Lera's got the usual table open. Feels like the shift's already behind me."*
### Anchor 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. The smuggler thinks in windows, not abstractions.
**Authored example:**
> *"Renn's already headed down the corridor. That means the handoff's on schedule."*
### Anchor 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. The smuggler reads people through history with them.
**Authored example:**
> *"Voss snapped at the new hire again. Third time today. Something's eating him."*
### Anchor 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. When the smuggler is hurt, the fragments stop and the sentence lands whole.
**Authored example:**
> *"I covered for him last cycle. Covered for him the one before that. And this is what I get -- a closed door and a stranger's face."*
### Anchor 5: Atmospheric
> *"Morning shift. Recycled air and cargo lubricant. Home sweet home."*
Three fragments. Sensory detail. Irony through understatement. The smuggler's environment is felt, not cataloged.
**Authored example:**
> *"Night cycle hum. Half the overheads are out again. The freight bay looks better in the dark."*
---
## 4. Anti-Patterns
These are the 4 things the smuggler voice is NOT. Each anti-pattern includes the bad line, why it fails, and a corrected version.
### Anti-Pattern 1: Too Clinical
**Bad:** *"I should investigate this anomaly further."*
**Why it fails:** The word "anomaly" belongs to an institutional register. "Investigate" is what a detective does. The smuggler would never frame a problem this way.
**Corrected:** *"That's not right. I need to see what's going on."*
### Anti-Pattern 2: Institutional Vocabulary
**Bad:** *"The scheduling irregularity suggests systemic manipulation."*
**Why it fails:** "Scheduling irregularity," "systemic," "manipulation" -- every word comes from an analyst's toolkit. The smuggler sees people changing things, not systems being manipulated.
**Corrected:** *"Voss changed the rotation again. Who told him to do that?"*
### Anti-Pattern 3: Analytical Distance
**Bad:** *"I need to consider the implications of Kael's behavior for our operational security."*
**Why it fails:** This is a detective sentence in a smuggler's mouth. The smuggler does not "consider implications." She reacts, then thinks.
**Corrected:** *"What the hell is Kael doing?"*
### Anti-Pattern 4: Explaining the Already-Known
**Bad:** *"According to the manifest, container 4471 should weigh 240 kilograms."*
**Why it fails:** The smuggler has been reading manifests for years. She does not cite them to herself. She knows the weight. If it is wrong, she notices the wrongness, not the specification.
**Corrected:** *"4471's heavy. Too heavy."*
---
## 5. Paired Comparison Examples
Each trigger shows the same observation through both character lenses. The smuggler response is feeling-first, people-first, fragment-based. The detective response is analysis-first, pattern-first, complete sentences. These examples demonstrate the maximum contrast between the two registers.
### Trigger 1: Entering a Location
**Context:** The player enters The Last Shift (bar).
**Smuggler:**
> *"The usual crowd, the usual noise. Could use a drink after that shift."*
Fragment structure. Sensory. Personal need. The bar is a place the smuggler belongs, measured by comfort.
**Detective:**
> *"The Last Shift. Twelve patrons tonight, down from yesterday's sixteen. Someone's missing -- or avoiding."*
Complete sentence. Counted. Comparative. The bar is a dataset the detective reads for deviation.
---
### Trigger 2: Noticing an NPC
**Context:** The player notices Naia Tamm looking distressed at a corner table.
**Smuggler:**
> *"Naia's had a rough day. Should find her later, see if she needs anything."*
First name. Immediate empathy. Plans an action rooted in care. The smuggler sees a person who matters.
**Detective:**
> *"Tamm looks distressed. Baseline for her is composed. Something at home, or something she's learned?"*
Surname. Clinical assessment against baseline. Hypothesizes cause categories. The detective sees a data point that deviates.
---
### Trigger 3: Reacting to a Tell
**Context:** The player observes Kael checking his lattice repeatedly during a conversation.
**Smuggler:**
> *"Third time in five minutes. Kael, who are you waiting to hear from?"*
Direct address (even internally). Counts through instinct, not habit. The question is about a person, not a pattern.
**Detective:**
> *"Lattice activity: three checks in five minutes. Elevated from his established baseline of once per conversation. Noted."*
Quantified deviation from documented norm. Self-directed filing action. The observation is about a metric, not a friend.
---
### Trigger 4: Processing New Information
**Context:** The player learns that a container sat in temp storage overnight -- unusual for a hub with sub-eight-hour turnaround.
**Smuggler:**
> *"That one's been sitting since yesterday. Someone stalled it, or someone forgot. Either way, it's a problem."*
Two practical explanations offered without judgment. "It's a problem" is operational, not analytical. The smuggler thinks in consequences for the team.
**Detective:**
> *"Container held overnight. Turnaround standard for this hub is sub-eight hours. Deviation logged. Cross-reference with shift records."*
Quantified standard. Logged deviation. Self-directed investigative action. The detective thinks in evidence chains.
---
## 6. Display Constraints
All monologue lines must conform to these hard constraints (per Stig's Round 1 display proposal, adopted as authoring standard).
| Constraint | Value | Implication for Writing |
|------------|-------|------------------------|
| **Max length** | ~160 characters | Hard ceiling. Most lines should be 80-120 characters. |
| **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` | Voice must be distinguishable WITHOUT color -- color confirms, does not create. |
| **No mid-sentence triggers** | Lines must be self-contained | A monologue line must make sense even if the previous one was not displayed (cooldown, priority override). |
### The 25-Word Rule
If a monologue line exceeds 25 words, it must be the most important line in the pool. Most lines should be 10-18 words. The authoring guide examples average 14 words. That is the target.
### Fragment-Friendly Formatting
The smuggler's fragment style naturally fits the 2-line display constraint. Fragments are short. Dashes and ellipses compress meaning. A smuggler line that feels too long is almost always trying to do too much -- split it into two triggers or cut the weakest clause.
**Good (14 words, 1 visual line):**
> *"Kael's already at the dock. Good. The day's better when he's on shift."*
**Too long (29 words, wraps to 3 lines):**
> *"Kael's already at the dock and it looks like Voss kept the schedule thin, which means the transition window should be clear for the route."*
**Fix:** Split into two separate monologue fires:
> *"Kael's at the dock. Good."*
> *"Voss kept the schedule thin. Route should be clear."*
---
## 7. Authoring Checklist
Before finalizing any smuggler monologue line, ask these 5 questions:
### 1. Does it sound like a person, not a system?
The smuggler thinks in people. If the line references a process, institution, or abstract concept without grounding it in a specific person's action, rewrite it.
- **Fail:** *"The operation is at risk."*
- **Pass:** *"Voss is going to get us caught."*
### 2. Is the feeling before the analysis?
The smuggler's gut fires first. If the line opens with a conclusion or a logical structure ("therefore," "which means," "this suggests"), rewrite it so the emotional reaction leads.
- **Fail:** *"Kael's behavior suggests he's hiding something."*
- **Pass:** *"Something's wrong with Kael. I can feel it."*
### 3. Would she say this to herself?
The smuggler does not explain things she already knows. If the line contains exposition about the world, the ring, or the station that the smuggler has known for years, cut it. Interior monologue is reaction, not recitation.
- **Fail:** *"The ring operates during shift transitions when oversight is reduced."*
- **Pass:** *"Transition window's coming up. Time to move."*
### 4. Is it under 25 words?
Count them. If it is over 25, it had better be the knife-twist line of the phase. Otherwise, cut. The smuggler does not ramble. Fragments. Dashes. Ellipses. Economy.
### 5. Does it use first names?
The smuggler calls everyone by their first name. If a surname appears without the first name, or if a role descriptor ("the shift supervisor," "the bartender") is used for someone the smuggler knows personally, rewrite it. The exception: institutions ("the Commission," "the Concord") are named abstractly because the smuggler does not think of institutions as people.
- **Fail:** *"Davan seems nervous."*
- **Pass:** *"Kael seems nervous."*
---
**Cross-References:**
- [Dual Lens Authoring Guide](dual-lens-authoring-guide.md) -- Chapter 7 (Voice Signatures), Chapter 4 (Divergence Escalation Curve)
- [Smuggler Moral Arc](smuggler-moral-arc.md) -- How voice register shifts across moral phases
- [Kael Davan](../wiki/npcs/kael-davan.md) -- Primary NPC voice interaction target (THE FRIEND)
- [Entity Attributes](../wiki/knowledge/entity-attributes.md) -- Role-perspective keys that gate monologue
---
**End Smuggler Voice Card**
+275
View File
@@ -0,0 +1,275 @@
# v0.1 Wow Moment Content Checklist
**Source:** D-039 (6 wow moments for 30-minute session)
**Ticket:** #400 (v0.1 wow moment content checklist)
**Last updated:** 2026-02-12
---
## Overall Completion Status
| # | Moment | Content | Implementation | Status |
|---|--------|---------|----------------|--------|
| 1 | Arrival | 1 of 5 deliverables ready | 3 of 8 tickets done | Not started |
| 2 | The Character's Eye | 0 of 4 deliverables ready | 1 of 6 tickets done | Not started |
| 3 | THE FRIEND's Contradiction | 0 of 5 deliverables ready | 1 of 7 tickets done | Not started |
| 4 | The Divergence Reveal | 0 of 4 deliverables ready | 0 of 5 tickets done | Not started |
| 5 | The News Ticker Gut-Punch | 0 of 3 deliverables ready | 0 of 4 tickets done | Not started |
| 6 | The Quiet Moment | 0 of 2 deliverables ready | 0 of 3 tickets done | Not started |
**Summary:** 1 of 23 content deliverables ready. 5 of 33 implementation tickets done. All 6 moments currently blocked by upstream authoring and architecture work, with #261 (Dual Lens Authoring Guide) as the critical path root.
---
### Moment 1: Arrival
**Description**: Station hum playing, NPCs already moving on routines, first monologue chime fires. The player's first impression: "Where am I? This feels real." The world is already alive before the player does anything.
**Timing**: Minute 0-1 of session
**Content deliverables:**
- [ ] Opening monologue lines -- smuggler arrival (10-15 tightly sequenced lines, per #299)
- [ ] Opening monologue lines -- detective arrival (10-15 tightly sequenced lines, per #300)
- [ ] Diegetic tutorial monologue lines -- per character (8-10 lines each teaching movement, fog, sound, NPC interaction, insert; per #330)
- [x] Audio asset specification defined (D-038: `amb_station_base.ogg`, `sfx_monologue_chime.ogg`)
- [ ] Audio asset files -- station ambient + monologue chime (2 of the 8 minimum viable files; per #327)
**Implementation tickets:**
- [x] #229 -- Define ObserverSnapshot structure (done)
- [x] #280 -- Define core types: ObserverSnapshot, PlayerInput, SimBridge (done)
- [x] #294 -- Create UI shell stubs: HUD, minimap, monologue display (done)
- [ ] #88 -- Daily routine system: DailyRoutine component, time-based transitions (backlog)
- [ ] #101 -- Routine execution system: schedule-driven NPC movement (backlog)
- [ ] #119 -- Monologue event generation - server: trigger on perception events (backlog)
- [ ] #122 -- Monologue display - client: text display, timed queue management (backlog)
- [ ] #327 -- Audio asset set: 8 minimum viable files via Stable Audio Open (backlog)
**Content tickets:**
- [ ] #259 -- First 5 minutes experience design (backlog)
- [ ] #299 -- Opening hook content: smuggler first 5 minutes (backlog, blocked by #261, #310, #309, #315)
- [ ] #300 -- Opening hook content: detective first 5 minutes (backlog, blocked by #261, #310, #309, #315)
- [ ] #330 -- Diegetic tutorial monologue lines: per character (backlog, blocked by #299, #300)
- [ ] #255 -- Client audio manager (backlog)
- [ ] #125 -- Close-range stereo audio - client (backlog, blocked by #255)
**Dependencies:**
- #261 (Dual Lens Authoring Guide) must be complete before opening hook content can be authored
- #310 (Character voice speech patterns) must exist for consistent voice in opening lines
- Monologue server system (#119, #120) must be implemented to deliver lines
- Monologue client display (#122) must be implemented to render lines
- NPC routine system (#88, #101) must be running so NPCs are already moving at session start
- Audio manager (#255) and audio assets (#327) must exist for station hum and monologue chime
**Status**: Not started -- all content deliverables blocked by #261 (Dual Lens Authoring Guide). UI shell stubs exist; core architecture defined. Audio assets not yet produced.
---
### Moment 2: The Character's Eye
**Description**: While the player explores, their character's monologue flags something the player did not notice -- an NPC routine deviation, a behavioral anomaly, a spatial detail. The urgent monologue chime fires. The player realizes: "My character is smarter than me." This is the moment the monologue system proves its worth as a perception mechanic, not just flavor text.
**Timing**: Minute 5-15 of session
**Content deliverables:**
- [ ] Observation monologue lines -- per character (within #399 monologue pool: ~100 lines per character, categories include NPC routine commentary, contradiction hints, environmental observations)
- [ ] NPC routine deviation content -- at least 1 NPC must deviate from established routine in a way the monologue system can flag
- [ ] Tell observation lines for Kael Davan (8 lines across 4 tell categories; part of #297 content pack)
- [ ] Tell observation lines for Sera Venn (part of #298 content pack)
**Implementation tickets:**
- [x] #112 -- Observer visibility query (done: given observer entity, return visible entities and tiles)
- [ ] #239 -- Observation event generator: compare snapshot against knowledge, emit ObservationEvents (backlog)
- [ ] #243 -- Routine deviation detection: compare NPC position vs known routine pattern (backlog, blocked by #88)
- [ ] #119 -- Monologue event generation - server: trigger on perception events (backlog, blocked by #239)
- [ ] #120 -- Monologue line pool system: tag-based line selection (backlog)
- [ ] #90 -- Personality and tell system: TellSystem with 5 categories, v0.1 rendered as monologue text (backlog)
**Content tickets:**
- [ ] #399 -- Monologue content pool: minimum viable ~200 lines (backlog, blocked by #261, #382)
- [ ] #297 -- THE FRIEND: Kael Davan full profile + content pack, includes tell observation lines (backlog, blocked by #261, #310)
- [ ] #298 -- THE FRIEND: Sera Venn full profile + content pack, includes tell observation lines (backlog, blocked by #261, #310)
**Dependencies:**
- Observation event pipeline (#239) must compare snapshot against knowledge graph to detect anomalies
- Routine deviation detection (#243) must be running so NPCs can break patterns
- Monologue pool system (#120) must support tag-based selection with `observe_anomaly` and `observe_npc` triggers
- Urgent monologue chime audio asset (`sfx_monologue_chime_urgent.ogg`) from #327
- D-059 monologue display constraints: `observe_anomaly` is priority 1 (highest), ensuring it interrupts lower-priority monologue
**Status**: Not started -- observation pipeline (#239) and routine deviation detection (#243) are the key server blockers. Content blocked by #261 and #382.
---
### Moment 3: THE FRIEND's Contradiction
**Description**: THE FRIEND NPC -- Kael Davan (smuggler path) or Sera Venn (detective path) -- is observed in the wrong place at the wrong time. The urgent monologue chime fires. The character's internal voice registers the contradiction. If the player asks the FRIEND about it, they deflect. The player feels: "I trusted you. What are you doing?" This is D-027 success criterion #3: the player names an NPC they felt conflicted about.
**Timing**: Minute 20-25 of session
**Content deliverables:**
- [ ] Kael Davan full content pack: ~91 authored lines across 5 arc phases (comfort, first crack, contradiction, confrontation, contaminated trust) per D-058 template and #297
- [ ] Sera Venn full content pack: ~70-100 authored lines with equivalent phase structure, per #298
- [ ] Contradiction discovery monologue: 1 critical monologue line per character per FRIEND (the wow moment #3 trigger; highest-stakes single line in the project)
- [ ] Confrontation dialogue: 8-12 lines per FRIEND for post-contradiction conversation with deflection
- [ ] Spatial staging data: Kael in Corridor B-7 during shift transition; Sera avoiding Torek Lintar in specific location with time window
**Implementation tickets:**
- [x] #366 -- Observer snapshot knowledge integration (done)
- [ ] #239 -- Observation event generator: detect spatial anomaly (FRIEND at contradiction location) (backlog)
- [ ] #243 -- Routine deviation detection: flag FRIEND breaking established pattern (backlog, blocked by #88)
- [ ] #304 -- Entity color system spec: relationship-to-player mapping including green-to-amber shift on PersonOfInterest transition (backlog, blocked by #303)
- [ ] #119 -- Monologue event generation - server: trigger urgent monologue on contradiction observation (backlog)
- [ ] #120 -- Monologue line pool system: prerequisite-gated line selection for friend_arc phase (backlog)
- [ ] #168 -- Tagged line pool structure: dialogue pool with trust-gated access (backlog)
**Content tickets:**
- [ ] #297 -- THE FRIEND: Kael Davan full profile + content pack (backlog, blocked by #261, #310)
- [ ] #298 -- THE FRIEND: Sera Venn full profile + content pack (backlog, blocked by #261, #310)
- [ ] #332 -- Contradiction arc design document: reusable FRIEND pattern (backlog, blocked by #297, #298)
- [ ] #318 -- THE FRIEND visual treatment spec: earned visual detail, green-to-amber phase shift (backlog, blocked by #303, #297, #298)
**Dependencies:**
- FriendArc state machine must be implemented (Warmth -> Trust -> Doubt -> Conflict per workshop Section 6)
- Knowledge graph contradiction detection: `ToldBy` entry conflicting with `DirectObservation` entry must trigger `Contradicted` state (D-041 notes this ships Sprint 3+)
- 5 atomic state changes in one tick: knowledge graph update, FriendArc phase advance, RelationshipState change (Friendly -> PersonOfInterest), monologue trigger (urgent), entity color shift (green -> amber)
- `InteractionLog` component must exist to track interaction count for Warmth->Trust threshold (>=3 interactions + >=600 ticks)
- All content from Warmth and Trust phases must exist so the player has built attachment before the contradiction fires
- NOTE: No dedicated FriendArc implementation ticket exists yet -- **ticket needed** for the FriendArc state machine and contradiction observation system
**Status**: Not started -- this is the most complex moment. Requires the full FRIEND content pipeline plus FriendArc state machine implementation. Content blocked by #261. Server-side contradiction detection deferred to Sprint 3+ per D-041.
---
### Moment 4: The Divergence Reveal
**Description**: On second playthrough with the other character, the player enters the same room and sees different entity colors, different NPC names in monologue (first-name vs surname), different internal observations. The world is structurally identical but perceptually inverted. The player realizes: "I was only seeing HALF of this." This moment does not require new content -- it requires that all existing content is properly dual-lens authored.
**Timing**: Second playthrough, minute 5-10 of session
**Content deliverables:**
- [ ] Dual Lens Authoring Guide: the root document defining how the same world plays differently through smuggler vs detective perspective (#261)
- [ ] All dual-lens content for first location (Terminal): smuggler sees colleagues, detective sees subjects of investigation -- same NPCs, different access tiers, different monologue pools (within #399, #297, #298)
- [ ] Mirror moment design document: 10-15 paired observations, same event triggering different monologue per character (#329)
- [ ] PC-as-NPC content: the other character exists as an NPC with routine entries and observation monologue lines (#401)
**Implementation tickets:**
- [ ] #182 -- Divergent starting knowledge: smuggler knows criminals/workplace gossip, detective knows institutional info/case files (backlog)
- [ ] #183 -- Divergent relationships: same NPCs, different trust levels per character (backlog)
- [ ] #304 -- Entity color system spec: same NPC shows different color per character's relationship state (backlog, blocked by #303)
- [ ] #120 -- Monologue line pool system: `character` tag as hard partition per D-032 ensures completely separate pools (backlog)
- [ ] #90 -- Personality and tell system: same tells visible to both characters but interpreted differently via monologue (backlog)
**Content tickets:**
- [ ] #261 -- Dual Lens Authoring Guide: critical path root, blocks all dual-lens content (backlog, Sprint 3 P0)
- [ ] #329 -- Mirror moment design document: 10-15 paired observations (backlog, blocked by #297, #298)
- [ ] #399 -- Monologue content pool: must contain separate pools per character (backlog, blocked by #261, #382)
- [ ] #401 -- PC-as-NPC content authoring: 5-7 routine entries + 3-5 observation lines per character (backlog, Sprint 5, blocked by #381, #383, #297, #298)
- [ ] #381 -- PC-as-NPC unified spec (backlog)
**Dependencies:**
- #261 (Dual Lens Authoring Guide) is the root dependency -- every piece of dual-lens content flows through it
- Character voice registers (D-056 / #310) must be defined so smuggler and detective monologue feel distinct
- D-032 (separate monologue pools per character) must be enforced in the monologue line pool system
- Entity color system (#304) must support per-character relationship state mapping
- Divergent starting knowledge (#182) and divergent relationships (#183) must be seeded at game start
- This moment only works after the player has completed one full playthrough -- no implementation needed for "second playthrough" detection; the content itself creates the revelation
**Status**: Not started -- #261 is the critical path root (blocks 9+ downstream tickets). Divergent knowledge/relationship tickets in backlog. Mirror moment document not yet started.
---
### Moment 5: The News Ticker Gut-Punch
**Description**: A news ticker headline scrolls at the bar (The Last Shift). Both characters see the same headline. Their internal monologue reacts in opposite ways -- the smuggler reads threat, the detective reads opportunity (or vice versa). Three words of ticker text plus two monologue reactions create the most efficient demonstration of asymmetric information in the game. D-306 calls this "cheapest wow-per-word in the project."
**Timing**: Variable (player must visit The Last Shift bar). Most likely minute 10-20.
**Content deliverables:**
- [ ] News ticker headline pool: ~20 dual-lens headlines for Meridian feed (freight data, Assembly politics, local infrastructure, Commission advisories; per #395 and #306)
- [ ] Dual monologue reactions per headline: each headline needs a smuggler reaction and a detective reaction (within #399 monologue pool, tagged with `trigger: observe_object` or similar)
- [ ] Ticker display format and visual spec (part of #316 text display hierarchy spec, bar-world-space rendering per Stig's UI BOM)
**Implementation tickets:**
- [ ] #306 -- News ticker / Meridian feed content: 20-30 lines (backlog, blocked by #302)
- [ ] #395 -- News ticker headline pool: ~20 dual-lens headlines (backlog, Sprint 4)
- [ ] #316 -- Text display hierarchy spec: 4 content pipelines including ticker (backlog)
- [ ] Ticker renderer (client): world-space text display at bar location -- covered in Stig's UI BOM (1 scene + 1 script, P1). NOTE: No dedicated implementation ticket exists yet for the ticker client renderer -- **ticket needed**
**Content tickets:**
- [ ] #306 -- News ticker / Meridian feed content (backlog, blocked by #302 Sova Texture Appendix)
- [ ] #395 -- News ticker headline pool with dual-lens reactions (backlog, Sprint 4)
- [ ] #399 -- Monologue content pool: must include ticker-reaction monologue lines (backlog)
**Dependencies:**
- ObserverSnapshot v3 includes `ticker_headlines` field (D-054) -- protocol support designed
- Bar spatial layout (#312) must place the ticker in a visible location within The Last Shift
- Sova Texture Appendix (#302) must exist for setting-consistent ticker language
- Monologue system must fire `observe_object` trigger when player reads a ticker headline
- D-032 separate pools ensure smuggler and detective get different reactions to the same headline
- NOTE: The `ticker_headlines` field exists in the ObserverSnapshot v3 design but no server-side ticket exists for populating it -- **ticket needed** for server-side ticker headline system
**Status**: Not started -- content blocked by #302 (Sova Texture Appendix). No client renderer ticket exists. Server-side ticker system needs a ticket.
---
### Moment 6: The Quiet Moment
**Description**: The player idles in a corridor. No interaction, no event. After a pause, an unprompted reflective monologue fires -- the character thinking about their life, their friend, what they are doing here. The player feels: "I care about this person." This moment proves that the monologue system works as atmosphere, not just as a game mechanic. It makes the character feel like a person, not a cursor.
**Timing**: Variable (fires on `time_idle` trigger after player has been stationary for a threshold duration). Most likely in corridors between locations.
**Content deliverables:**
- [ ] Idle/reflective monologue lines: minimum 2 lines per character (per D-039), ideally 4-6 per character within the ~200 line monologue pool (#399). Must use `trigger: time_idle`. Content should reference THE FRIEND, the setting, or the character's personal situation.
- [ ] Corridor ambient context: monologue lines should reference corridor sensory details (span gate hum, ventilation whistle, recycled air) from #302 Sova Texture Appendix
**Implementation tickets:**
- [ ] #119 -- Monologue event generation - server: must support `time_idle` trigger type (backlog, blocked by #239)
- [ ] #120 -- Monologue line pool system: must select lines tagged with `time_idle` trigger after idle threshold (backlog)
- [ ] #122 -- Monologue display - client: must render reflective lines with standard (non-urgent) chime (backlog)
**Content tickets:**
- [ ] #399 -- Monologue content pool: must include `time_idle` triggered lines per character (backlog, blocked by #261, #382)
- [ ] #302 -- Sova Texture Appendix: sensory details needed for corridor reflective monologue (backlog)
**Dependencies:**
- Monologue trigger system must implement `time_idle` as one of the 9 trigger types (D-035)
- Idle detection: server must track how long the player character has been stationary and emit a `time_idle` trigger event after threshold
- `time_idle` is priority 9 (lowest in D-059 priority ordering) -- it should only fire when nothing else is happening, which is exactly the design intent
- Monologue chime audio (`sfx_monologue_chime.ogg`) from #327 -- the standard chime, not the urgent variant
- Prerequisite system should gate some idle monologue behind having met THE FRIEND (so the reflective moment references someone the player knows)
**Status**: Not started -- idle trigger implementation needed in server monologue system. Content blocked by #261 and #382.
---
## Cross-Cutting Dependencies
These items block multiple wow moments and represent the highest-leverage work:
| Dependency | Blocks Moments | Ticket | Status |
|------------|---------------|--------|--------|
| Dual Lens Authoring Guide | 1, 2, 3, 4, 5, 6 | #261 | Backlog (Sprint 3 P0, critical path root) |
| Character voice speech patterns | 1, 2, 3, 4 | #310 | Backlog |
| Monologue event generation - server | 1, 2, 3, 6 | #119 | Backlog |
| Monologue line pool system | 2, 3, 4, 6 | #120 | Backlog |
| Monologue display - client | 1, 2, 3, 6 | #122 | Backlog |
| Monologue content pool (~200 lines) | 2, 4, 5, 6 | #399 | Backlog (Sprint 4) |
| Observation event generator | 2, 3 | #239 | Backlog |
| Routine deviation detection | 2, 3 | #243 | Backlog |
| NPC daily routine system | 1, 2, 3 | #88 | Backlog |
| Audio asset set (8 files) | 1, 2, 6 | #327 | Backlog |
| Entity color system spec | 3, 4 | #304 | Backlog |
| Sova Texture Appendix | 5, 6 | #302 | Backlog |
## Missing Tickets Identified
The following gaps were found during this analysis -- tickets need to be created:
1. **FriendArc state machine implementation** (server): 4-phase state machine (Warmth -> Trust -> Doubt -> Conflict) with explicit transition triggers, atomic 5-state-change on contradiction observation, `InteractionLog` component. Blocks Moment 3. Workshop Section 6 (round2-tracking.md) has the full spec.
2. **Server-side ticker headline system**: Populate `ticker_headlines` field in ObserverSnapshot v3. Select headlines from content pool, deliver through bridge. Blocks Moment 5.
3. **Ticker client renderer**: World-space text display at The Last Shift bar location. 1 scene + 1 script per Stig's UI BOM (P1). Blocks Moment 5.
4. **Idle detection system** (server): Track player character stationary duration, emit `time_idle` trigger after configurable threshold. May be folded into #119 (Monologue event generation) but should be explicitly scoped. Blocks Moment 6.
---
*Compiled for ticket #400. Cross-references: D-039 (wow moments), D-027 (vertical slice criteria), D-034 (THE FRIEND), D-032 (separate monologue pools), D-035 (tag taxonomy), D-038 (audio scope), D-041 (knowledge graph), D-054 (ObserverSnapshot v3), D-056 (PC voice registers), D-058 (FRIEND content pack template), D-059 (monologue display constraints).*
+65 -11
View File
@@ -11,6 +11,60 @@ How to write tagged monologue and dialogue content for The Settled Reach. Read t
---
## Location Shortcodes
Canonical shortcodes for v0.1 Sova Transit District. Used in line IDs (`{shortcode}_{type}_{###}`) and file naming.
| Shortcode | Location | Full Name | D-036 Reference |
|-----------|----------|-----------|-----------------|
| `terminal` | Logistics Hub | The Terminal | Primary workplace social site |
| `bar` | The Last Shift | Lera's (informal) | Social venue |
| `corridor` | Maintenance corridors | Corridor B-7 (primary) | Smuggling/service spaces |
**File naming convention:** `{shortcode}-{character}.yaml` (e.g., `terminal-smuggler.yaml`, `bar-detective.yaml`)
**Line ID format:** `{shortcode}_{d|m|e}_{###}` where `d`=dialogue, `m`=monologue, `e`=environmental
---
## Situation Overlap Rules
A line can have multiple situations in its `situation` list. These rules define valid combinations.
**Mutually exclusive** (never co-occur):
- `arrival` and `shift_end` — you can't be both arriving and leaving
- `alone` and `social` — by definition
- `emergency` and `routine` — emergency overrides routine
- `confrontation` and `social` — confrontation replaces social context
**Common valid overlaps:**
- `shift_start` + `routine` — beginning-of-shift routine observations
- `bar_evening` + `social` — social interaction at the bar
- `observation` + any non-exclusive situation — observation layers on top of context
- `investigation` + `observation` — investigating by watching
**Default if empty:** `routine` (engine assumes routine context)
---
## Mood Exclusivity Rules
A line can have multiple moods, but some combinations are contradictory.
**Mutually exclusive** (never co-occur):
- `fond` and `suspicious` — these are opposing orientations toward someone
- `comfortable` and `worried` — opposing emotional states
- `relieved` and `concerned` — resolved vs. unresolved tension
**Common valid overlaps:**
- `analytical` + any mood — analytical is a cognitive mode that coexists with emotion
- `conflicted` + `fond` or `concerned` — conflicted implies mixed feelings
- `worried` + `suspicious` — worry about someone's behavior shading into suspicion
**Default if empty:** `comfortable` (engine assumes neutral emotional baseline)
---
## 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.
@@ -81,7 +135,7 @@ The `trigger` tag determines WHEN a monologue line fires. Each type maps to a ga
Fires when the player enters a named area.
```yaml
- id: hub_m_010
- id: terminal_m_010
text: "Morning shift. Recycled air and cargo lubricant. Home sweet home."
character: smuggler
trigger: enter_location
@@ -91,7 +145,7 @@ Fires when the player enters a named area.
```
```yaml
- id: hub_m_011
- id: terminal_m_011
text: "Logistics hub. Standard prefab, heavy foot traffic. Let's see what the shift change tells me."
character: detective
trigger: enter_location
@@ -111,7 +165,7 @@ Use for first impressions, atmosphere, returning-to-familiar-ground observations
Fires when a known entity enters the player's line of sight.
```yaml
- id: hub_m_020
- id: terminal_m_020
text: "Kael's here. Good — I was starting to worry."
character: smuggler
trigger: observe_npc
@@ -122,7 +176,7 @@ Fires when a known entity enters the player's line of sight.
```
```yaml
- id: hub_m_021
- id: terminal_m_021
text: "Dock worker from the case file. Davan, K. Unremarkable on paper."
character: detective
trigger: observe_npc
@@ -169,7 +223,7 @@ Audio triggers fire less frequently than visual ones. Make them count.
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
- id: terminal_m_040
text: "Kael's checking his lattice again. Third time in ten minutes. That's not normal."
character: smuggler
trigger: observe_anomaly
@@ -180,7 +234,7 @@ Fires when the player observes something that contradicts expected state — a c
```
```yaml
- id: hub_m_041
- id: terminal_m_041
text: "Dock worker Davan — lattice activity spiked. Expecting a message? Or checking for surveillance?"
character: detective
trigger: observe_anomaly
@@ -231,7 +285,7 @@ This is where character voice shines — the detective analyzes, the smuggler wo
Fires when the player finds physical evidence — a document, object, or data point.
```yaml
- id: hub_m_060
- id: terminal_m_060
text: "Container 4471. Manifest says 240 kilos. That crate is closer to 310."
character: detective
trigger: discover_evidence
@@ -242,7 +296,7 @@ Fires when the player finds physical evidence — a document, object, or data po
```
```yaml
- id: hub_m_061
- id: terminal_m_061
text: "4471's still in temp. Kael routed it there during transition. Standard. Nothing to worry about."
character: smuggler
trigger: discover_evidence
@@ -506,7 +560,7 @@ How each character relates to key NPCs:
| 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) |
| Naia | `peer` (through Kael) | `public``peer` (through Sera) |
| Torek | `insider` or `peer` | `public` |
| Maret | `insider` (hub colleague) | `authority` |
| Drin | `insider` (hub colleague) | `authority` |
@@ -526,7 +580,7 @@ A tell observation monologue line should:
3. **Map to an attribute** — note in `notes` which `known_attributes` key updates
```yaml
- id: hub_m_100
- id: terminal_m_100
text: "Kael keeps checking his lattice. Waiting for something."
character: smuggler
trigger: observe_anomaly
@@ -539,7 +593,7 @@ A tell observation monologue line should:
```
```yaml
- id: hub_m_101
- id: terminal_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
+1 -1
View File
@@ -108,7 +108,7 @@ The ring has been operating long enough that cracks are forming:
### 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.
**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 Naia. 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.
+1 -1
View File
@@ -54,7 +54,7 @@ This wiki serves three audiences:
- [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)
- [Naia Tamm](npcs/naia-tamm.md) — Kael's partner (referenced)
- [Renn](npcs/renn.md) — Courier (ring + hub bridge)
- [Pell](npcs/pell.md) — Wavering ring member
- **Tier 3 (Flat NPCs):**
+135 -30
View File
@@ -12,7 +12,8 @@ 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
- Whether leverage or contradictions are discovered
- How role-perspective assessments shape the observer's internal narrative
---
@@ -83,7 +84,7 @@ The knowledge graph uses these attributes to determine:
- `"friend"` — Sera to detective
- `"authority figure"` — Voss to subordinates
- `"suspect"` — Kael to detective (post-discovery)
- `"partner"`Hael to Kael
- `"partner"`Naia to Kael
- `"stranger"` — new NPCs
**Usage**: Drives `RelationshipState` calculation (Unknown/Known/Friendly/PersonOfInterest/Hostile). Determines emotional tone of monologue.
@@ -92,16 +93,18 @@ The knowledge graph uses these attributes to determine:
### `trust_level`
**Value format**: Trust assessment (subjective, observer's judgment).
**Value format**: Trust assessment (subjective, observer's judgment). This key encompasses both the read action (what the observer can observe about trust dynamics) and the state (what level of trust currently exists between observer and target). There is no separate `trust_read` key — the observation and the conclusion are stored together as a single assessment.
**Values**: `trusted`, `reliable`, `uncertain`, `suspicious`, `compromised`.
**Examples**:
- `"trusted"` — high trust, shares sensitive information
- `"reliable"` — professional trust
- `"uncertain"` — cautiously neutral
- `"suspicious"` — flagged for observation
- `"reliable"` — professional trust, predictable behavior
- `"uncertain"` — cautiously neutral, still reading the relationship
- `"suspicious"` — flagged for observation, inconsistencies detected
- `"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.
**Usage**: Gates trust-tier dialogue (surface/real/secret). Detective tracking trust levels determines which NPCs can be turned. Smuggler uses trust levels to gauge operational reliability. The trust read (what the observer notices) and the trust state (what the observer concludes) are one assessment — the observer watches, interprets, and assigns a level in the same cognitive step.
---
@@ -134,40 +137,42 @@ The knowledge graph uses these attributes to determine:
---
## Secret Attributes
## Leverage Attributes
### `secret_held`
### `leverage_held`
**Value format**: What the observer believes this entity is hiding.
**Value format**: What the observer believes gives them (or could give them) power over this entity. This covers secrets, debts, promises, obligations, and compromising positions — not just secrets. Any information or relationship that creates asymmetric power over the target qualifies as leverage.
**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
- `"ring membership"` — detective's suspicion about Kael (secret)
- `"unreported evidence"` — smuggler's read on Sera (concealed information)
- `"gambling debt"` — if Drin's vulnerability is discovered (financial obligation)
- `"exit attempt"` — if Kael's unauthorized contact is discovered (betrayal)
- `"owes favor to Voss"` — social obligation
- `"witnessed the handoff"` — compromising position
**Usage**: Drives PersonOfInterest state. Gates confrontation dialogue. Smuggler and detective track different secrets about the same NPCs.
**Usage**: Drives PersonOfInterest state. Gates confrontation dialogue. Smuggler and detective track different leverage about the same NPCs. The broader scope (beyond secrets) allows content authors to capture debts, promises, and obligations that create power dynamics without requiring additional keys.
---
### `secret_confidence`
### `leverage_confidence`
**Value format**: How certain the observer is about the secret.
**Value format**: How certain the observer is about the leverage.
**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.
**Usage**: Dialogue tone. "Suspected" leverage allows fishing questions. "Confirmed" leverage enables direct confrontation or exploitation.
---
## Investigation Attributes (Detective-Specific)
## Investigation Attributes
### `tell_observed`
**Value format**: Specific tell noted by the detective.
**Value format**: Specific tell noted by the observer.
**Examples**:
- `"looks left when lying"` — Kael's tell
@@ -177,6 +182,8 @@ The knowledge graph uses these attributes to determine:
**Usage**: Behavioral profiling. Accumulated tells build case strength. Monologue references specific tells when they recur.
> **Implementation note**: The server may track tells via `behavior_flags` internally, since tells are a subset of behavioral observations. `tell_observed` is retained as a documented content-authoring key because it serves a distinct narrative purpose: `behavior_flags` accumulates raw observations ("nervous,lattice_checking"), while `tell_observed` captures the observer's interpretive conclusion ("looks left when lying"). Content authors reference `tell_observed` for monologue prerequisites that require the observer to have formed a specific read on the target. The server implementation may store both, or derive `tell_observed` from `behavior_flags` pattern matching.
---
### `contradiction_flagged`
@@ -190,6 +197,89 @@ The knowledge graph uses these attributes to determine:
**Usage**: THE FRIEND arc trigger. When this attribute is set, monologue tone shifts. Dialogue options change. RelationshipState moves toward PersonOfInterest.
> **Implementation note**: Like `tell_observed`, the server may track contradictions via `behavior_flags` (e.g., a flag with a `contradiction:` prefix). `contradiction_flagged` is retained as a documented key because it serves as a distinct narrative trigger — content authors check for its presence to gate arc transitions and monologue shifts. The separation keeps the content authoring interface clean even if the server implementation unifies storage.
---
## Role-Perspective Attributes
These four keys capture the observer's subjective assessment of the target through the lens of their own role, goals, and ethical framework. The same key with the same value reads differently depending on the observer's archetype — interpretation lives in the content layer (monologue pools, voice registers, archetype briefs), not in the schema. See [Archetype Interpretation Note](#archetype-interpretation-note) below.
### `risk_assessment`
**Value format**: Observer's assessment of how much danger this entity poses or attracts.
**Values**: `none`, `low`, `moderate`, `high`, `critical`.
**Examples**:
- Smuggler's assessment of Pell (wavering member) = `"high"` (unpredictable, could expose the ring)
- Detective's assessment of Voss = `"moderate"` (obstructive but not directly dangerous)
- Smuggler's assessment of Naia = `"low"` (uninvolved, unlikely to cause exposure)
**Usage**: Gates operational monologue. High-risk targets trigger cautionary internal dialogue. Critical-risk targets may trigger evasion or preemptive action. The nature of "risk" depends on the archetype (see interpretation note).
---
### `loyalty_assessment`
**Value format**: Observer's assessment of this entity's reliability and loyalty.
**Values**: `solid`, `dependable`, `uncertain`, `wavering`, `hostile`.
**Examples**:
- Smuggler's assessment of Renn (courier) = `"dependable"` (reliable, follows instructions)
- Smuggler's assessment of Kael (mid-game) = `"wavering"` (showing signs of doubt)
- Detective's assessment of Sera = `"solid"` (committed to the investigation)
**Usage**: Determines how much the observer relies on or confides in the target. Wavering loyalty triggers monitoring behavior. Hostile loyalty triggers defensive or adversarial posture.
---
### `position_integrity`
**Value format**: Observer's assessment of this entity's cover, position stability, or facade status.
**Values**: `solid`, `thin`, `cracking`, `blown`, `N/A`.
**Examples**:
- Ring member's assessment of Kael = `"thin"` (behavior changes are visible to anyone watching)
- Smuggler's self-assessment near the detective = `"cracking"` (too many close calls)
- Detective's assessment of a civilian witness = `"N/A"` (no cover to assess)
**Usage**: Tracks active deception status. When position_integrity degrades, the observer's monologue reflects increasing anxiety or strategic recalculation. `N/A` is used when the concept of cover/facade does not apply to the target.
---
### `moral_weight`
**Value format**: Observer's assessment of this entity's moral involvement in the situation.
**Values**: `innocent`, `peripheral`, `complicit`, `compromised`, `willing`.
**Examples**:
- Detective's assessment of Naia = `"innocent"` (uninvolved partner caught in the fallout)
- Smuggler's assessment of Drin = `"compromised"` (dragged in by debt, not by choice)
- Smuggler's assessment of Torek = `"willing"` (fully aware, actively participating)
**Usage**: Shapes the observer's moral arc and internal conflict. Monologue tone shifts when the observer assigns moral weight — guilt, justification, and rationalization are driven by this key. The Comfort-Doubt-Reckoning-Compromise arc references `moral_weight` to determine which phase the observer occupies relative to specific NPCs.
**Archetype note**: Both smuggler and detective use `moral_weight` with the same enum values but different criteria. The smuggler assesses complicity in the ring's operations ("how dirty are their hands?") — see [Smuggler Moral Arc](../../design/smuggler-moral-arc.md). The detective assesses culpability in the crime ("how responsible are they for the harm?"). Same scale, different lens. A smuggler might mark Drin as `"compromised"` (dragged in, not choosing) while the detective marks Drin as `"complicit"` (he knew and did nothing). The detective's moral arc spec is unwritten in v0.1 but follows the same key.
---
### Archetype Interpretation Note
Role-perspective keys use the same value enums across all archetypes, but their meaning is archetype-dependent. The schema stores data; the content layer provides interpretation.
| Key | Smuggler reads as... | Detective reads as... |
|-----|---------------------|----------------------|
| `risk_assessment` | Operational risk to the ring (exposure, interdiction, betrayal) | Threat to public safety or obstruction of the investigation |
| `loyalty_assessment` | Loyalty to the smuggling operation | Cooperation with the investigation or institutional loyalty |
| `position_integrity` | Cover identity stability (can I still pass as legitimate?) | Authority and credibility (does my badge still open doors here?) |
| `moral_weight` | Complicity in the ring's operations (how dirty are their hands?) | Culpability in the crime (how responsible are they?) |
This pattern scales to all 8 planned archetypes without schema modification. An administrator reads `risk_assessment` as political liability; a newcomer reads it as personal vulnerability; a merchant reads it as commercial exposure. Same keys, same enums, different meaning — the archetype brief and voice register provide the lens.
---
## Examples: Full EntityKnowledge Entries
@@ -214,6 +304,10 @@ EntityKnowledge {
("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()),
("risk_assessment".to_string(), "low".to_string()), // Kael is reliable, no exposure concern
("loyalty_assessment".to_string(), "solid".to_string()), // loyal to the ring
("position_integrity".to_string(), "solid".to_string()), // cover is intact
("moral_weight".to_string(), "willing".to_string()), // fully aware, active participant
]),
}
```
@@ -244,9 +338,13 @@ EntityKnowledge {
("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()),
("leverage_held".to_string(), "unauthorized meetings".to_string()),
("leverage_confidence".to_string(), "confirmed".to_string()),
("contradiction_flagged".to_string(), "meeting_unknown_contact".to_string()),
("risk_assessment".to_string(), "high".to_string()), // obstructing investigation, potential flight risk
("loyalty_assessment".to_string(), "hostile".to_string()), // uncooperative, evasive
("position_integrity".to_string(), "cracking".to_string()), // his story is falling apart
("moral_weight".to_string(), "complicit".to_string()), // involved, degree of responsibility unclear
]),
}
```
@@ -271,8 +369,12 @@ EntityKnowledge {
("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()),
("leverage_held".to_string(), "knows something about Torek or Naia".to_string()),
("leverage_confidence".to_string(), "suspected".to_string()),
("risk_assessment".to_string(), "moderate".to_string()), // Commission presence is inherently risky
("loyalty_assessment".to_string(), "uncertain".to_string()), // unknown allegiance
("position_integrity".to_string(), "N/A".to_string()), // Sera isn't maintaining a cover
("moral_weight".to_string(), "peripheral".to_string()), // not involved in ring, but near it
]),
}
```
@@ -282,20 +384,23 @@ EntityKnowledge {
## 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.
2. **First observation** (Direct confidence): `name` (if visible via lattice query or introduction), `role` (inferred from context), `species`, `routine_pattern` starts accumulating. Initial `risk_assessment` and `moral_weight` may be set to defaults (`none` and `innocent` respectively) or left absent until the observer forms an opinion.
3. **Repeated interaction** (KnowsOf): `relationship_type` evolves, `trust_level` set, `behavior_flags` accumulate. `loyalty_assessment` and `position_integrity` become meaningful as the observer builds a model of the target's reliability and stability.
4. **Investigation depth** (KnowsDetails): `leverage_held`, `tell_observed`, `contradiction_flagged` added by detective. Smuggler gains `faction` clarity. Role-perspective keys (`risk_assessment`, `loyalty_assessment`, `position_integrity`, `moral_weight`) shift as the observer's understanding deepens — a target initially assessed as `risk_assessment: "low"` may escalate to `"high"` after contradictions surface.
5. **Knowledge decay**: Attributes persist even as confidence decays. A KnowsOf entry retains all attributes; only positional certainty degrades. Role-perspective assessments are particularly sticky — once the observer has formed a judgment, it takes strong counter-evidence to revise it.
---
## Content Authoring Guidance
- **Monologue prerequisites** can reference specific attributes: `known_attributes["secret_held"] == "ring membership"`.
- **Monologue prerequisites** can reference specific attributes: `known_attributes["leverage_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`.
- **Role-perspective prerequisites** can gate monologue lines by assessment: `known_attributes["risk_assessment"] == "high"` triggers different monologue pools depending on the observer's archetype (smuggler hears operational caution; detective hears investigative urgency).
- **Leverage-based confrontation** uses `leverage_held` + `leverage_confidence` together: a "suspected" leverage allows indirect probing dialogue, while "confirmed" leverage enables direct confrontation or exploitation moves.
- **Moral arc tracking** uses `moral_weight` to determine which phase of the observer's arc (Comfort/Doubt/Reckoning/Compromise) is active relative to each NPC.
---
**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.
**Total canonical keys**: 16 (4 identity, 2 social, 2 behavioral, 2 leverage, 2 investigation, 4 role-perspective). The 12 shared keys cover entity facts and relational dynamics; the 4 role-perspective keys capture the observer's subjective assessment. This schema scales to all 8 planned archetypes without modification — interpretation lives in content (monologue pools, voice registers, archetype briefs), not in the key definitions.
+7 -7
View File
@@ -218,14 +218,14 @@ Canonical FactIds for the v0.1 vertical slice. All facts follow the `category.to
---
### `relationship.kael_hael_connection`
### `relationship.kael_naia_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."
**Suspects**: "Kael mentions a partner. Someone named Naia."
**KnowsOf**: "Kael's partner is Naia, a teacher. They're worried about Kael's late nights."
**KnowsDetails**: "Naia 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.
**Mechanical Purpose**: Emotional leverage. Detective can use Naia as pressure point. Smuggler (if Kael's friend) must protect Naia from knowledge.
---
@@ -233,7 +233,7 @@ Canonical FactIds for the v0.1 vertical slice. All facts follow the `category.to
**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)."
**KnowsDetails**: "Trust map: Kael <-> Nils (blood), Kael <-> Naia (partnership), Naia <-> 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.
@@ -244,7 +244,7 @@ Canonical FactIds for the v0.1 vertical slice. All facts follow the `category.to
**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."
**KnowsDetails**: "Faction tensions: Commission (Sera, Torek, Detective) vs. ring (Kael, Nils, Kosse, Voss, Lera) vs. civilians (Naia, 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.
+6 -6
View File
@@ -155,7 +155,7 @@ Friendly → PersonOfInterest → [resolution: Friendly-but-contaminated OR Host
- 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 A (understanding)**: Smuggler confronts Kael gently. Kael confesses: trying to exit the ring to protect Naia. `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.
@@ -189,7 +189,7 @@ Friendly → PersonOfInterest → [resolution: Friendly-but-contaminated OR 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 A (loyalty test)**: Detective confronts Sera about concealment. Sera confesses: sitting on evidence to protect Naia (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.
@@ -204,14 +204,14 @@ Both THE FRIEND NPCs follow the same structural arc, but the **nature of the con
|-----------|--------------------------|---------------------------|
| **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 |
| **What they're hiding** | Attempt to exit the ring (protect Naia) | Unreported evidence (protect Naia) |
| **Sympathetic motivation** | Family protection (Naia is Kael's partner) | Friendship loyalty (Naia is Sera's friend) |
| **Naia 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.
**Common structure**: Both contradictions involve **Naia** as the emotional anchor. Naia is worried about Kael. Sera knows why (unreported evidence). Kael is trying to protect Naia (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.
---
@@ -84,7 +84,7 @@ The bar is the district's social heart. Information flows through here faster th
|-----|------|---------------|----------|
| [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 |
| [Naia Tamm](../../npcs/naia-tamm.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 |
@@ -96,7 +96,7 @@ The bar is the district's social heart. Information flows through here faster th
| [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 |
| [Kael Davan](../../npcs/kael-davan.md) | [The Terminal](the-terminal.md) | After-shift regular | Ring member unwinding, partner Naia sometimes present |
**Total NPC presence:** Up to 10 at peak (5 regulars + 5 bridge), minimum 2-3 (Lera, Sess, and a straggler)
@@ -117,7 +117,7 @@ The bar is the district's social heart. Information flows through here faster th
**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.
- 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 Naia, 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)**
@@ -163,7 +163,7 @@ The bar is the district's social heart. Information flows through here faster th
- Smuggler: Concern (exposure risk — Torek's spending is visible)
- Detective: Financial anomaly flag (income doesn't match lifestyle)
**On overhearing Hael confide in Sera:**
**On overhearing Naia confide in Sera:**
- Smuggler: Guilt (knows why Kael is absent, can't say)
- Detective: Potential lead (partner's worry suggests concealment behavior)
+11 -2
View File
@@ -1,4 +1,4 @@
# Devra
# Devra Talsen
**Tier 2 NPC** | Smuggling Ring + The Last Shift (Bar) | Entangled
@@ -6,7 +6,7 @@
## Core Identity
**Name**: Devra
**Name**: Devra Talsen
**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
@@ -116,4 +116,13 @@ The supply brokering business isn't just cover — it's real income and real soc
---
## Pattern / Motivation
**Pattern (System A):** THRESHOLD — Devra is the ring's gatekeeper. Access to the operation's logistics, to Sabel's supply chain, to Nils's strategic direction — all of it runs through Devra. She is the person you go through or you do not go. For the detective, reaching the ring's operational layer means getting past Devra's cover. For the smuggler, coordination with the upstream supply means working through Devra's scheduling.
**Motivation (System B):** HANDLER — Devra manages operations from above. She conveys Nils's strategy, coordinates with Sabel, manages internal ring logistics, and delivers escalation demands to Voss and Kael. She applies pressure downward on behalf of the off-stage authority. She does not run day-to-day dock operations — she manages the people who do.
**Composition read:** THRESHOLD + HANDLER creates the obstacle with authority: "You go through her or you don't go." Devra gates access to the ring (THRESHOLD) while applying top-down operational pressure (HANDLER). This dual function makes her the most structurally important ring member on-station — she is both the wall and the hand pushing people against it. Her competence makes her formidable; her ambition (she could run this better than Nils) makes her interesting. The player who tries to reach the ring's inner workings must reckon with Devra twice: once as a barrier, once as a manager.
---
**Cross-References:** [Renn](renn.md), [Pell](pell.md), [Lera Sessik](lera-sessik.md), [Sabel](sabel.md)
+113 -21
View File
@@ -1,48 +1,140 @@
# Drin
# Drin Rosta
**Tier 3 NPC** | Logistics Hub (The Terminal) | Flat
**Tier 2 NPC** | Logistics Hub (The Terminal) | Mundane
---
## Essential Axes
## Core Identity
### Want
**Name**: Drin Rosta
**Age**: 40
**Role**: Maintenance tech + dock inspector, Sova Transit District Logistics Hub
**System Origin**: Krenn System, Station Sova
**Lattice Tier**: Baseline
**Employer**: Sova Logistics Consortium
Stay out of trouble. Pay off the debt. Get through the shift.
---
## 10-Axis Profile
### 1. Want
**Primary**: Clear the debt. Stop looking over his shoulder.
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
**Secondary**: Return to when the job was just a job.
**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
Drin remembers the period before the debt. Maintenance rounds, dock inspections, clocking out, going home. The work was repetitive and that was fine. Drin liked the repetition. Now every inspection cycle carries a second calculation running underneath — which containers to skip, which bays to clear without looking, how to file a report that says nothing happened when something might have. He wants the old version of the job back. He doesn't know how to get there.
### Personality
### 2. Secret / Vulnerability
**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.
**Surface secret**: Gambling debt to Harek. Known to bar regulars, card game circle. Nobody thinks much of it — debts are common on Sova.
**Deep secret**: Drin's inspection negligence is being exploited by the ring. Drin understands that someone benefits from his looking the other way — containers move through his shifts without scrutiny and nobody complains. But he doesn't know the ring's structure, doesn't know Kael's role, doesn't know the scope of the operation his silence enables. He thinks it's smaller than it is.
**Vulnerability**: Compromised by omission. Drin never actively smuggled anything. He failed to inspect. The distinction feels meaningful to him and would not feel meaningful to an investigator. If confronted with the scale of what his negligence enabled, Drin's self-narrative collapses.
### 3. Relationships
**Harek Valde**: Debt holder, inadvertent coercer. Fear-based, asymmetric. Harek doesn't press aggressively — he keeps the debt active, invites Drin to card games, covers a round. The relationship is social on the surface and transactional underneath. Drin likes Harek personally, which makes the dynamic worse. It's hard to resent someone who buys you drinks and never explicitly threatens you. The ring noticed the power dynamic and exploits it without Harek fully understanding what he built.
**Arvo Voss**: Shift supervisor. Professional, strained. Voss needs Drin functional and quiet. Drin senses that Voss knows something about why the inspection negligence is useful but doesn't want to test that suspicion. They interact procedurally — shift handoffs, maintenance reports, inspection schedules. The professional distance is mutual and deliberate.
**Maret Korr**: Freight scheduler, colleague. Guilt-adjacent. Maret processes manifests. Drin knows his inspection reports feed into Maret's reconciliation workflow. He also senses — without proof — that Maret has noticed the reports are too clean. The discomfort is unspoken. Drin avoids extended interaction with Maret because her attention feels like scrutiny, even when it isn't.
### 4. Tolerance Threshold
**Low — already past breaking.** The compromise IS Drin's post-threshold state. He crossed the line the first time he filed an inspection report he knew was incomplete, and he's been living past the threshold ever since.
**What he tolerates**: The routine guilt. The mechanical compliance. Harek's passive leverage. Inspecting containers he knows he shouldn't clear and clearing them anyway. The daily rhythm of knowing and not acting.
**What breaks him**: Direct confrontation — the detective asking pointed questions about specific inspections. Escalating demands — if the ring asks Drin to do MORE than look away (actively falsify, handle cargo, participate). Harek pressing the debt publicly — rupturing the social fiction that the debt is just a card game thing between friends. Any of these collapses the distinction between omission and commission that Drin needs to function.
### 5. Daily Routine
**05:50**: Arrives at hub. Checks maintenance board for overnight issues.
**06:00 - 10:00**: Maintenance rounds — environmental systems, loading equipment, pipe and wiring repairs. Drin moves through the facility with tools and purpose. This is the part of the job he still enjoys.
**10:00 - 10:30**: Break room. Eats alone or with other maintenance crew. Avoids Harek if Harek is on-site. Avoids prolonged conversation with Maret.
**10:30 - 14:00**: Dock inspections — scheduled bay checks, container verification, freight condition reports. This is where the compromise lives. Certain shifts, certain bays, certain containers get shorter inspections. Drin's timing on compromised inspections is measurably faster than his legitimate ones.
**14:00 - 14:30**: Post-shift — files reports, updates maintenance log. The inspection reports are filed here. Clean. Complete. Unremarkable.
**14:30 - 16:00**: Home, or bar on card game nights (2x per week).
**Night**: Home. Worrying about the debt. Not sleeping well.
### 6. Information Inventory
**Knows**: Inspection schedule gaps — which bays, which shifts, which timing windows he's been "slow" on. Harek's debt amount and the social dynamics around it. That SOMEONE benefits from his negligence — containers move through his shifts without scrutiny and nobody complains about the results. Hub maintenance infrastructure in detail — access corridors, environmental systems, loading equipment condition.
**Doesn't know**: Kael's role in the ring. Ring organizational structure. The contraband itself (Drin doesn't open the containers, so he doesn't know what's inside). The detective's investigation. Pell's wavering. That Pell might approach him as an institutional contact — someone with inspection authority who could receive a report. Maret's private discrepancy log.
### 7. Contentment
**Very low.** Trapped. Drin remembers when the job was just maintenance — fixing things, inspecting things, filing reports that reflected what he actually saw. The gambling was supposed to be social. Card nights at The Last Shift, a few drinks, something to do after work that involved other people. Now every inspection is a moral compromise he can't talk about. The contentment axis reads as a man going through the motions of a life that stopped working months ago. He hasn't adjusted; he's just enduring.
### 8. Personality Traits
**Primary: Quiet / Avoidant** — Drin doesn't volunteer information, doesn't seek attention, doesn't engage in conversations he can't control. His silence is both personality and survival strategy. Before the debt, the silence was just who he was. Now it serves a function.
**Secondary: Methodical** — Drin fixes things. Pipes, wiring, environmental systems, loading equipment. He follows procedures, uses checklists, documents his work. The irony: his methodical nature makes the compromised inspections more visible by contrast. When Drin is thorough, he's very thorough. When he's not, the gap is measurable.
**Tertiary: Anxious (suppressed)** — The anxiety doesn't manifest as nervousness or fidgeting. It manifests as silence. Shorter responses. Fewer interactions. A man shrinking his social footprint so there are fewer opportunities to say the wrong thing. The anxiety is structural, not behavioral — it shapes what Drin avoids rather than what he does.
### 9. Tell System
| Tell | Trigger | Observable To |
|------|---------|---------------|
| **Route changes when Harek is present** | Harek on-site at the hub or arriving at the bar — Drin adjusts his path to avoid casual contact | Bar regulars, Detective (if tracking social dynamics), Smuggler (if observant) |
| **Shorter inspection times on specific shifts** | Compromised inspections — Drin clears certain bays faster than his baseline rate | Maret (correlates with manifest discrepancies), Detective (if tracking inspection timing data) |
| **Increased break frequency** | Stress response — Drin takes more breaks during shifts that include compromised inspections | Voss (tracks shift productivity), Resha (notices the pattern as a new hire learning routines) |
| **Eye contact avoidance during compromised inspections** | Filing reports he knows are incomplete — Drin doesn't look at the person receiving the paperwork | Voss (if attentive), Detective (if observing the filing process) |
### 10. Skill Set
**Occupational**: Maintenance tech — environmental systems, pipe and wiring repair, loading equipment servicing, mechanical diagnostics. Dock inspection — container verification, freight condition assessment, safety compliance.
**Combat tag**: **No**. Drin is not physical. If confronted, he retreats into silence and compliance.
**Lattice capability**: Baseline.
---
## Voice Hint
## Voice Sample
*"I just do maintenance. Inspections are part of the schedule. I run them by the book."* [Flat delivery, eye contact avoided]
**Mood: Professional (baseline)**
- *"Coupling on the Bay 4 loader is wearing. I'll flag it for replacement on the next maintenance cycle. Should hold until then."*
- *"I just do maintenance. Inspections are part of the schedule. I run them by the book."*
---
**Mood: Under pressure (Harek nearby, or debt-adjacent conversation)**
- *"I'm fine. Busy shift. A lot of bays to get through before the afternoon handoff."*
- *"Cards? I don't know. Maybe. I'll see how the week goes."*
## 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.
**Mood: Cornered (detective asking about inspections)**
- *"My reports are filed. They're complete. If there's a question about a specific bay, I can pull the documentation. But I don't know what you're looking for that isn't already there."*
- *"I inspect what's on the schedule. I file what I find. That's the job."*
---
## Dual-Lens Notes
**Smuggler**: Drin is a tool — compromised and reliable because of it. *"Drin's on inspection today. We're good."*
**Smuggler**: Drin is a tool — compromised and reliable because of it. The ring doesn't interact with Drin directly; they don't need to. Harek's debt does the work. As long as Drin stays quiet and slow on the right shifts, the dock-side processing runs clean. The smuggler reads Drin as a solved problem — a cog that turns the right way without needing to be told. *"Drin's on inspection today. We're good. He doesn't ask questions and he doesn't open the wrong containers. Best kind of help — the kind that doesn't know it's helping."*
**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."*
**Detective**: Drin is a data point — his inspection reports are too clean for the volume of freight he processes. A maintenance tech pulling double duty as dock inspector should have equipment failures, missed checks, variance in his reports. Drin's are spotless. That level of consistency in a high-throughput environment is itself an anomaly. The detective reads Drin not as corrupt but as a process that isn't performing correctly. *"The inspector — Drin. Maintenance tech pulling double duty. Reports are spotless. Nobody's reports are that spotless. Either he's the best inspector on the station or he's not inspecting."*
---
**Cross-References:** [Harek](harek.md), [Maret Korr](maret-korr.md), [Voss](voss.md), [Pell](pell.md)
## Triangle Roles
**Triangle 2: Worried Knowledge (Maret - Drin - Voss)** — The compromised inspector. Drin is the institutional process that is supposed to catch irregularities, and his compromise means the process is hollow. Maret sees the output — inspection reports that are too clean — and files it as another data point in her growing suspicion. Voss needs Drin functional and quiet because Drin's cooperation (willing or not) is what makes the schedule manipulation possible. Drin sits between two people who need different things from him: Maret needs the truth (which Drin can't give without exposing himself), and Voss needs the silence (which Drin provides because the alternative is worse). Harek, outside the triangle, holds the leverage that keeps Drin compliant.
**Triangle 5: The Informant Question (Pell - Renn - Drin) [Cross-Template]** — The institutional contact who is already compromised. Pell is considering cooperation with authorities and might approach Drin as someone with inspection authority — a legitimate institutional figure who could receive information about irregularities. The irony is structural: the one person Pell might turn to for institutional protection is already under the ring's indirect control. If Pell approaches Drin, several things could happen. Drin might freeze (avoidant personality meets impossible situation). Drin might inadvertently warn the ring by behaving differently after the approach. Or Drin, confronted with the scope of what his negligence enables, might finally crack — and Pell's approach becomes the catalyst that breaks both of them free. The triangle's danger is that all three unraveling paths (Pell turns, Drin breaks, Renn's suspicion creates internal conflict) converge on the same question: what happens when the compromised system meets the desperate informant?
---
## Pattern / Motivation
**Pattern (System A):** SYSTEM — Drin is the dock inspector. He IS the inspection system — his reports, his sign-offs, his presence at the freight bays constitute the institutional process that is supposed to catch irregularities. When Drin is compromised, the system itself is corrupted. This is not a person failing at a job; it is an institution rotting from within.
**Motivation (System B):** TURNCOAT — Drin's loyalty has shifted under coercion. The gambling debt to Harek created a vulnerability that the ring exploits through omission: Drin does not actively smuggle, he simply fails to inspect. His turncoat status is passive — he was turned not by ideology or ambition but by debt and avoidance.
**Composition read:** SYSTEM + TURNCOAT creates institutional rot: "The inspection system is broken because the inspector is broken." Drin embodies the institution (SYSTEM) and has betrayed it (TURNCOAT), meaning the legitimate oversight mechanism and the criminal exploitation of it exist in the same person. For the detective, cracking Drin means cracking the system — his compromise is the proof that the hub's operations are not what they appear. For the smuggler, keeping Drin quiet means keeping the system working in the ring's favor. The composition is the most mechanically productive in the set because the same NPC serves inverted functions for the two player characters.
---
**Cross-References:** [Harek](harek.md), [Maret Korr](maret-korr.md), [Voss](voss.md), [Pell](pell.md), [Renn](renn.md)
+11 -2
View File
@@ -1,4 +1,4 @@
# Harek
# Harek Valde
**Tier 2 NPC** | The Last Shift (Bar) + Logistics Hub | Mundane
@@ -6,7 +6,7 @@
## Core Identity
**Name**: Harek
**Name**: Harek Valde
**Age**: 44
**Role**: Station Security officer (off-duty at bar, on-duty at hub perimeter)
**System Origin**: Krenn System, Station Sova
@@ -110,4 +110,13 @@ Drin owes Harek money from card games — a significant sum that Drin can't easi
---
## Pattern / Motivation
**Pattern (System A):** ANCHOR — Harek is physically present and complacent. He is at the bar playing cards, drinking, enjoying a stable life he has no desire to change. His contentment is genuine and unexamined — Harek has enough, wants nothing more, and has never thought to ask whether "enough" is the right question. The ANCHOR pattern means Harek represents the social floor that the investigation disturbs.
**Motivation (System B):** HANDLER — Harek uses leverage as a structural mechanism. The gambling debt Drin owes him creates a power dynamic that the ring exploits, even though Harek did not design it as a tool. A security officer with a dock inspector who owes him favors is useful — and that usefulness has been noticed by people with operational intent. Harek holds the lever without fully understanding the machine it operates.
**Composition read:** ANCHOR + HANDLER creates the unconscious lever: "Harek doesn't know his card games built a weapon." Harek's complacent contentment (ANCHOR) generated a tool of coercion (HANDLER) without deliberate intent. He did not set out to compromise Drin — he won card games, extended credit, and maintained a social dynamic that happened to produce leverage. The ring noticed and exploited the result. This structural role is what makes Harek uniquely important: he bridges the bar (social presence, card games, community standing) and the hub (security authority, patrol knowledge, access awareness). His HANDLER motivation means the debt functions as a mechanism, not a personal project — Harek does not use it for personal gain beyond the social capital of being owed. But the structural consequence is that Drin's inspection negligence, which enables the entire smuggling operation's dock-side processing, traces back to Harek's card table. For the detective, connecting Harek's debt to Drin's compromised inspections is the path from social observation to operational evidence. For the smuggler, Harek's complacency is an asset — as long as Harek stays comfortable and unquestioning, the leverage on Drin remains stable and invisible.
---
**Cross-References:** [Drin](drin.md), [Lera Sessik](lera-sessik.md), [Torek Lintar](torek-lintar.md), [Voss](voss.md)
+39 -35
View File
@@ -1,35 +1,37 @@
# 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.
18 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, Off-Stage = present through mediated references only.
## 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 |
| # | Name | Role | Social Site | Tier | Pattern | Motivation | Entanglement | Triangles |
|---|------|------|-------------|------|---------|------------|--------------|-----------|
| 1 | **Kael Davan** | Dock Worker | Hub + Ring | **Tier 1 (FRIEND)** | FRIEND | OPERATOR | Entangled | Hub Power, Worried Partner |
| 2 | **Sera Venn** | Commission Field Tech | Bar | **Tier 1 (FRIEND)** | FRIEND | WITNESS | Mundane | Worried Partner |
| 3 | Arvo Voss | Shift Supervisor | Hub | Tier 2 | SYSTEM | OPERATOR | Mundane | Hub Power, Worried Knowledge |
| 4 | Lera Sessik | Bar Owner | Bar | Tier 2 | ANCHOR | OPERATOR | Mundane | Bar Tensions |
| 5 | Torek Lintar | Dock Worker / Bar Regular | Bar + Hub | Tier 2 | CATALYST | CIVILIAN | Mundane | Bar Tensions |
| 6 | Devra Talsen | Ring Coordinator | Ring + Bar | Tier 2 | THRESHOLD | HANDLER | Entangled | (Referenced, not triangle member in v0.1) |
| 7 | Maret Korr | Freight Scheduler | Hub | Tier 2 | WITNESS | SKEPTIC | Mundane | Worried Knowledge |
| 8 | Resha Neven | New Hire Dock Worker | Hub | Tier 2 | CATALYST | CIVILIAN | Mundane | (Background tension, not formal triangle) |
| 9 | Naia Tamm | Teacher (Kael's Partner) | Bar | Tier 2 | MIRROR | CIVILIAN | Mundane | Worried Partner |
| 10 | Drin Rosta | Maintenance Tech | Hub | Tier 2 | SYSTEM | TURNCOAT | Mundane | Worried Knowledge, Informant Question |
| 11 | Sess Kolvur | Bartender | Bar | Tier 3 | ANCHOR | CIVILIAN | Flat | None |
| 12 | Olin Tavren | Drifter / New Arrival | Bar | Tier 3 | CATALYST | CIVILIAN | Flat | Bar Tensions |
| 13 | Renn Harsk | Courier | Ring + Hub | Tier 2 | THRESHOLD | OPERATOR | Entangled | Informant Question |
| 14 | Pell Torssen | Wavering Ring Member | Ring | Tier 2 | CATALYST | TURNCOAT | Entangled | Informant Question |
| 15 | Harek Valde | Off-Duty Security | Bar + Hub | Tier 2 | ANCHOR | HANDLER | Mundane | None (external pressure on Triangle 2) |
| 16 | Sabel Hersk | Off-Station Fence | Ring (off-station) | Tier 3 | GHOST | OPERATOR | Flat | None (off-station) |
| 17 | Tav Merik | Lookout | Ring + Hub | Tier 3 | SYSTEM | CIVILIAN | Flat | None |
| 18 | Nils Davan | Ring Coordinator (Off-Stage) | Ring (off-station) | Off-Stage | GHOST | HANDLER | Entangled | Hub Power |
**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
- **Tier 2**: 11 NPCs — 3 entangled (Devra, Renn, Pell), 8 mundane
- **Tier 3**: 4 NPCs (Sess, Olin, Sabel, Tav) — all flat
- **Off-Stage**: 1 NPC (Nils) — entangled
**Total**: 4 entangled (24%), 8 mundane (47%), 5 flat (29%). Closer to D-029 entanglement target (20%) with Tier 3 additions.
**Total**: 5 entangled (28%), 9 mundane (50%), 4 flat (22%). Off-stage NPC (Nils) adds entanglement without on-screen presence.
---
@@ -53,6 +55,8 @@
**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.
**Volume Escalation Fork**: See [Triangle 1: Hub Power — Volume Escalation Fork](../triangles/triangle-1-hub-power.md) for the full smuggler decision fork (3 paths: escalate, stabilize, mediate), NPC state changes, detective observation consequences, and authored dialogue.
**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.
@@ -107,26 +111,26 @@
---
### Triangle 4: The Worried Partner (Hael - Kael - Sera)
### Triangle 4: The Worried Partner (Naia - Kael - Sera)
```
Hael (Teacher, Kael's Partner)
Naia (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,
oblivious to anxiety hears Naia'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.
**Tension**: Naia's loyalty to Kael vs. growing suspicion. Sera's friendship with Naia vs. institutional duty (Sera is Commission, sitting on unreported evidence). Kael is oblivious to the anxiety he's causing. If Naia asks the smuggler (if smuggler is Kael's friend) about Kael's behavior, there's no good answer. If the detective asks Sera about Naia, 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.
- **Smuggler**: Most emotionally loaded triangle. Kael is THE FRIEND. Naia is Kael's partner. The smuggler knows why Kael is busy and can't say. Protecting Kael means lying to Naia.
- **Detective**: Sera is THE FRIEND. Naia is a potential source (partner who suspects something). If the detective asks Sera about Naia, 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.
@@ -170,7 +174,7 @@ information if Pell turns loyal to ring
- 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
- Drin (Maintenance Tech / Dock Inspector) — compromised, inspection negligence, 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
@@ -183,7 +187,7 @@ information if Pell turns loyal to ring
- Lera Sessik (Bar Owner) — knows everyone, willful ignorance
- Sera Venn (Commission Field Tech, THE FRIEND) — detective's anchor
- Hael (Teacher) — Kael's partner, worried
- Naia (Teacher) — Kael's partner, worried
- Torek Lintar (Regular) — spending beyond means
- Harek (Off-duty Security) — card games, debt holder
- Sess (Bartender) — flat, observant, discreet
@@ -196,14 +200,14 @@ information if Pell turns loyal to ring
### 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
- [Nils Davan](nils-davan.md) (Kael's older sibling, off-stage in v0.1) — gives orders via lattice messages and intermediaries, never physically present
- 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)
**Total**: 7 NPCs (1 primary ring-only, 1 off-stage, 3 bridge, 2 peripheral)
---
@@ -240,7 +244,7 @@ information if Pell turns loyal to ring
---
### Tier 2 (Working Profile — Voss, Lera, Torek, Devra, Maret, Resha, Hael, Renn, Pell, Harek)
### Tier 2 (Working Profile — Voss, Lera, Torek, Devra, Maret, Resha, Naia Tamm, Drin, Renn, Pell, Harek)
**Per NPC**:
- 10-axis data (all axes populated)
@@ -253,7 +257,7 @@ information if Pell turns loyal to ring
---
### Tier 3 (Sketch — Drin, Sess, Olin, Sabel, Tav)
### Tier 3 (Sketch — Sess, Olin, Sabel, Tav)
**Per NPC**:
- Essential axes only (Want, Routine, Personality)
+42 -33
View File
@@ -24,9 +24,9 @@
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.
**Secondary**: Protect Naia (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.
Naia doesn't know about the smuggling. Kael's late nights and evasive answers are creating anxiety at home. Kael Wants to shield Naia from danger, but the shielding itself is the danger.
---
@@ -34,7 +34,7 @@ Hael doesn't know about the smuggling. Kael's late nights and evasive answers ar
**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).
**Deep secret** (nobody knows except the unknown contact): Kael is trying to **exit the ring**. Naia'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).
@@ -48,11 +48,11 @@ Hael doesn't know about the smuggling. Kael's late nights and evasive answers ar
- **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)
**Relationship 2: Naia** (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.
- **History**: Met at a community event. Naia teaches station kids, represents ordinary life, stability, the future Kael wants but smuggling threatens.
- **Current tension**: Naia knows something's wrong. The late nights, the evasive answers, the money that doesn't quite track. Naia has confided in Sera (friend, Commission field tech). Kael is oblivious to how much anxiety he's causing.
- **Mechanical relevance**: Naia is Kael's emotional anchor and his vulnerability. Threaten Naia, Kael breaks.
**Relationship 3: The Smuggler** (if smuggler is playing ring-member path)
- **Type**: Close colleague, trusted friend, shared risk
@@ -69,15 +69,15 @@ Hael doesn't know about the smuggling. Kael's late nights and evasive answers ar
**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)
- Lying to Naia (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)
- Naia'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)
- Direct threat to Naia (if the ring or the detective uses Naia as leverage, Kael flips immediately)
- Nils discovering the exit attempt (Kael either runs or fights, no middle ground)
---
@@ -90,13 +90,13 @@ Hael doesn't know about the smuggling. Kael's late nights and evasive answers ar
**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)
**16:00 - 22:00**: Home with Naia, 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)
- Late arrivals home (Naia notices, worries)
- Unauthorized presence in Corridor B-7 (the contradiction discovery moment for smuggler)
---
@@ -109,11 +109,11 @@ Hael doesn't know about the smuggling. Kael's late nights and evasive answers ar
- 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)
- Naia's worry (knows Naia suspects something, doesn't know Naia 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)
- Sera is sitting on unreported evidence about Kael's manifest discrepancies (protects Naia 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)
@@ -123,17 +123,17 @@ Hael doesn't know about the smuggling. Kael's late nights and evasive answers ar
**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.
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 Naia 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.
**Contentment trajectory**: Declining. Two years ago, Kael was moderate (the operation was stable, Naia 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.
**Primary: Loyal** — to people, not institutions. Kael's loyalty is personal (Nils, Naia, 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.
**Secondary: Protective** — defaults to shielding others from consequences. Lies to Naia to protect. Tries to exit the ring to protect Naia 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."
@@ -146,7 +146,7 @@ Kael is *comfortable enough to function* but not happy. The smuggling pays well,
| 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` |
| **Shortened social interactions** | Distracted, avoiding prolonged conversation where lies might surface | Smuggler, Naia, 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` |
@@ -172,7 +172,7 @@ Kael is *comfortable enough to function* but not happy. The smuggling pays well,
## 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.
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, Naia 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.
---
@@ -181,8 +181,8 @@ Born on Station Sova. Grew up in the freight district — child of logistics wor
**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: Protective (deflecting Naia's worry)**
- *"I'm fine, Naia. 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]
@@ -207,7 +207,7 @@ Born on Station Sova. Grew up in the freight district — child of logistics wor
**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.
**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 Naia. 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.
@@ -223,7 +223,7 @@ Born on Station Sova. Grew up in the freight district — child of logistics wor
**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.
**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). Naia's worry (if detective talks to Naia 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).
@@ -241,13 +241,13 @@ Born on Station Sova. Grew up in the freight district — child of logistics wor
---
### Triangle 4: The Worried Partner (Hael - Kael - Sera)
### Triangle 4: The Worried Partner (Naia - 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.
**Kael's function**: The oblivious cause. Kael's smuggling (late nights, evasive answers) is making Naia worried. Naia confides in Sera. Sera knows enough to connect Kael to the investigation but hasn't reported (loyalty to Naia). Kael doesn't know Naia 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.
**Pressure**: Naia's worry is escalating. If Naia confronts Kael directly, Kael has to lie or confess. If Sera reports, Naia'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.
**Player relevance**: Smuggler (if Kael's friend) knows why Kael is busy, can't tell Naia. Detective (if Sera's friend) might hear about Naia's worry from Sera, creating a path to Kael.
---
@@ -261,13 +261,13 @@ Born on Station Sova. Grew up in the freight district — child of logistics wor
**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.
**From whom**: Everyone. Nils, the smuggler, Naia (Naia 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.
- **Detective finds out**: Kael becomes the perfect informant. Desperate, already trying to leave, motivated by protecting Naia. Detective can offer protection in exchange for cooperation.
- **Naia finds out**: Emotional devastation. Naia 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 Naia understands the motive.
---
@@ -358,7 +358,7 @@ Born on Station Sova. Grew up in the freight district — child of logistics wor
**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 A (understanding)**: Smuggler confronts gently: *"Kael, if you're in trouble, I can help."* Kael might confess (exit attempt, protecting Naia). `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.
@@ -387,11 +387,20 @@ Born on Station Sova. Grew up in the freight district — child of logistics wor
- **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.
- **Naia references**: Kael mentions Naia in casual conversation ("Naia'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.
---
## Pattern / Motivation
**Pattern (System A):** FRIEND — Kael is a trust anchor whose relationship with the player character is the emotional core of the smuggler's experience. The FRIEND pattern means Kael's betrayal (or the smuggler's betrayal of Kael) carries maximum emotional weight.
**Motivation (System B):** OPERATOR — Kael runs ring cargo at the dock level. He routes containers, manages handoffs, coordinates timing. His day-to-day function is operational execution, not strategic direction or pressure application.
**Composition read:** FRIEND + OPERATOR creates the identity betrayal: "I was your friend AND your co-conspirator." The player trusted Kael as a person (FRIEND) while relying on Kael as a functional colleague (OPERATOR). When the contradiction surfaces — Kael meeting an unauthorized contact, attempting to exit — the betrayal cuts both relationships simultaneously. The warmth was real. The operational reliability was real. The secret exit attempt violates both, and the player cannot separate the personal loss from the professional one.
---
**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.
+11 -2
View File
@@ -57,7 +57,7 @@ Lera has been behind this bar for 18 years. She's watched people come and go, re
### 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.
**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. Naia'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.
@@ -114,4 +114,13 @@ Lera has been behind this bar for 18 years. She's watched people come and go, re
---
**Cross-References:** [Torek Lintar](torek-lintar.md), [Harek](harek.md), [Sera Venn](sera-venn.md), [Hael](hael.md), [Olin](olin.md)
## Pattern / Motivation
**Pattern (System A):** ANCHOR — Lera embodies contentment through her bar. Eighteen years behind the same counter, the same regulars, the same rhythms. She represents the stable social infrastructure that the investigation threatens to disrupt. Her version of "Is this enough?" is answered by the bar itself — yes, if nobody asks hard questions.
**Motivation (System B):** OPERATOR — Lera runs The Last Shift. She manages inventory, serves customers, facilitates the social space, and maintains the delicate balance between profit and discretion. Her function is operational: keeping the bar viable, which means keeping the grey-market spending flowing without attracting institutional attention.
**Composition read:** ANCHOR + OPERATOR creates profitable blindness: "Is this enough? Yes — if I don't look." Lera's contentment (ANCHOR) is sustained by her operational competence (OPERATOR) — she runs the bar well enough that the moral compromises stay manageable. The willful ignorance is not laziness; it is active maintenance of a life she built. When the investigation arrives, it threatens both the emotional equilibrium and the business model simultaneously. Lera must choose between the comfort she's anchored to and the truth she's been operating around.
---
**Cross-References:** [Torek Lintar](torek-lintar.md), [Harek](harek.md), [Sera Venn](sera-venn.md), [Naia Tamm](naia-tamm.md), [Olin](olin.md)
+11 -2
View File
@@ -52,7 +52,7 @@ Maret didn't ask to see the discrepancies. She sees them because that's her job.
**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)
**15:00 - 17:00**: Home or occasional bar visit (not a regular — Maret goes for Naia's company sometimes)
**After hours**: Reviews her private discrepancy log. Adds entries. Worries.
### 6. Information Inventory
@@ -114,4 +114,13 @@ Maret didn't ask to see the discrepancies. She sees them because that's her job.
---
**Cross-References:** [Voss](voss.md), [Drin](drin.md), [Resha](resha.md), [Hael](hael.md)
## Pattern / Motivation
**Pattern (System A):** WITNESS — Maret's v0.1 function is defined by what she has seen, not her institutional role. The player approaches Maret because she carries information — manifest discrepancies, bay allocation anomalies, the correlation between Voss's schedule adjustments and cargo irregularities. WITNESS describes her story function: she observed something she was not meant to observe.
**Motivation (System B):** SKEPTIC — Maret doubts the numbers. Not passively — she is actively re-checking manifests, cross-referencing gate logs, building a private discrepancy log. Her skepticism is data-driven and escalating. She has not yet acted on her doubt, but the doubt itself makes her dangerous because it means she might.
**Composition read:** WITNESS + SKEPTIC creates dangerous knowledge: "She saw something and she can't stop questioning it." Maret did not choose to witness the discrepancies (WITNESS) — her job put the data in front of her. But her response is not passive acceptance; it is systematic doubt (SKEPTIC). The combination means Maret is a time bomb with her own fuse: she is gathering evidence not because anyone asked her to, but because her meticulous nature will not let her stop. For the detective, Maret is the cooperative witness who has already done half the work. For the smuggler, Maret is the threat you cannot neutralize without revealing why the numbers matter.
---
**Cross-References:** [Voss](voss.md), [Drin](drin.md), [Resha](resha.md), [Naia Tamm](naia-tamm.md)
@@ -1,4 +1,4 @@
# Hael
# Naia Tamm
**Tier 2 NPC** | The Last Shift (Bar) | Mundane
@@ -6,7 +6,7 @@
## Core Identity
**Name**: Hael
**Name**: Naia Tamm
**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
@@ -21,31 +21,31 @@
**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.
Naia 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. Naia doesn't know about the ring. Naia 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.
Naia teaches station kids. Has a community, a reputation, a daily rhythm. Whatever Kael is hiding, Naia wants it resolved without destroying everything — the home, the relationship, the stability that took years to build. This is why Naia confides in Sera instead of confronting Kael directly: Naia 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.
**Surface secret**: Worried about Kael. Visible to anyone who sees Naia'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.
**Deep secret**: Naia confided in Sera about Kael's behavior. This is the action that set Sera's compliance check in motion, though Naia doesn't know that. Naia 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.
**Vulnerability**: Emotional exposure. Naia's worry is genuine, visible, and exploitable. The detective can cultivate Naia as a source by being sympathetic. The smuggler (if Kael's friend) feels guilt seeing Naia's distress. Naia 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.
**Kael Davan**: Partner, 6 years. Deep love, growing anxiety. Naia doesn't question Kael's character — just Kael's honesty. The relationship is the strongest bond in Naia'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.
**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. Naia 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.
**Lera Sessik**: Bar acquaintance. Naia isn't a heavy drinker but comes to The Last Shift for the social environment. Lera is warm to Naia — 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.
**Moderate**. Naia 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 Naia's tolerance. If pushed to a breaking point, Naia confronts Kael directly — which could trigger Kael's crisis, force Sera's hand, or give the detective an opening.
### 5. Daily Routine
@@ -59,17 +59,17 @@ Hael teaches station kids. Has a community, a reputation, a daily rhythm. Whatev
**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.
**Doesn't know**: Ring, smuggling, Kael's membership, manifest discrepancies, Sera's compliance check, the detective's investigation. Naia 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.
**Low** — and declining. Naia 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. Naia'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.
**Tertiary: Perceptive** — reads emotional states well. Knows when Kael is lying even if Naia can't prove it.
### 9. Tell System
@@ -82,7 +82,7 @@ Hael teaches station kids. Has a community, a reputation, a daily rhythm. Whatev
### 10. Skill Set
**Occupational**: Teaching, community engagement, youth education, curriculum management.
**Combat tag**: **No**. Hael is entirely civilian.
**Combat tag**: **No**. Naia is entirely civilian.
**Lattice capability**: Baseline.
---
@@ -102,15 +102,24 @@ Hael teaches station kids. Has a community, a reputation, a daily rhythm. Whatev
## 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."*
**Smuggler**: Naia is emotional collateral. The smuggler knows why Kael is busy and can't say. Seeing Naia's worry creates guilt — especially if the smuggler is Kael's friend. If Naia asks the smuggler about Kael, there's no good answer. *"Naia'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."*
**Detective**: Naia 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 Naia's trust by being sympathetic — listen, validate, gently probe. Naia might not know specifics, but Naia knows Kael's routine, habits, and recent changes better than anyone. *"The partner — Naia Tamm. 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.
**Triangle 4: Worried Partner (Naia - Kael - Sera)** — The emotional center. Naia's worry about Kael triggered Sera's investigation. Naia's trust in Sera makes Sera's concealment more painful. Naia connects the detective's investigation to Kael's personal life — through Sera, through Naia's own observations, through the simple fact that a worried partner is the best witness to behavioral change.
---
## Pattern / Motivation
**Pattern (System A):** MIRROR — Naia has no contradiction arc, no secret, no hidden agenda. She is exactly what she appears to be: a teacher worried about her partner. The MIRROR pattern means Naia reflects the truth of the district back at the player without distortion. In a world where everyone is hiding something, Naia's honesty is both a relief and a weapon — her transparency makes the concealment around her more painful.
**Motivation (System B):** CIVILIAN — Naia is uninvolved in any conspiracy or operation. She teaches station kids, worries about Kael, confides in Sera, and goes to the bar. Her civilian status is not a simplification — it is the source of her narrative power. The damage done to Naia is devastating precisely because she did nothing to invite it.
**Composition read:** MIRROR + CIVILIAN creates honest transparency surrounded by liars: "The one person not lying — surrounded by liars." Naia's reflective honesty (MIRROR) combined with her complete uninvolvement (CIVILIAN) means she is the emotional baseline against which all deception is measured. When events drag Naia into the conspiracy through Kael's ring involvement and Sera's concealment, the damage is devastating because Naia was genuine. For the smuggler, Naia is the face of guilt — the person whose life is being destroyed by what the smuggler helps maintain. For the detective, Naia is a source whose value comes from her innocence, and cultivating that innocence as an investigative asset carries its own moral cost.
---
+108
View File
@@ -0,0 +1,108 @@
# Nils Davan
**Off-Stage NPC** | Smuggling Ring | Entangled
---
## Core Identity
**Name**: Nils Davan
**Age**: ~38
**Role**: Ring Coordinator (upstream authority) — strategic direction, personnel decisions, volume targets
**System Origin**: Krenn System (same as Kael — siblings)
**Current Location**: Off-station (exact location unknown to most ring members)
**Lattice Tier**: Unknown (operates through lattice messages; communication protocols managed by Devra)
**Employer**: The Arrangement (ring leadership, operational)
---
## Essential Function
Nils is the **off-stage authority figure** in the smuggling ring. He does not appear physically in any v0.1 scene. His presence is felt entirely through:
- **Lattice messages to Kael** (~5-8 authored lines): operational instructions, volume pressure, occasional personal/familial notes
- **References in NPC dialogue**: ring members mention Nils by name or by implication ("the coordinator", "your brother", "someone above Devra")
- **Reputation and operational pressure**: the escalation that drives Triangle 1 originates with Nils
Nils is the **escalation pressure source**. He pushes for higher volume, tighter schedules, more throughput. This pressure cascades down through Devra (who executes), Kael (who handles dock-side operations), and Voss (who adjusts shift schedules to create coverage windows). Every character in the ring feels Nils's influence without seeing him.
---
## Relationships
### Kael Davan (younger sibling, ring member)
- **Type**: Blood loyalty, complicated by power dynamic
- **History**: Nils recruited Kael into the ring. "It's just moving containers. You're good at logistics. We take care of our own."
- **Current dynamic**: Genuine familial bond, but Nils puts the operation first. Pushes Kael for higher volume. Doesn't know Kael is trying to exit the ring.
- **Mechanical relevance**: If Kael's exit attempt is discovered, Nils is the primary threat. Nils's reaction — family loyalty vs. operational security — is undefined in v0.1 but implied to be dangerous.
### Devra Talsen (on-station coordinator)
- **Type**: Professional respect, operational partnership
- **Dynamic**: Nils gives strategic direction; Devra handles execution. They respect each other's competence but disagree on risk tolerance — Devra favors steady volume, Nils pushes for escalation.
- **Communication**: Lattice messages, operational protocols. Devra is Nils's primary on-station voice.
### Arvo Voss (shift supervisor)
- **Type**: Resource exploitation, no personal relationship
- **Dynamic**: Nils exploits Voss's schedule authority to create coverage windows for ring operations. Voss resents the invisible hand above him — has positional authority on the floor, but the ring's needs override his scheduling decisions. Voss complies because the money is good and because refusing Nils has consequences he doesn't want to test.
- **Nils's view**: Voss is a resource, not a person. Functional, replaceable.
### The Smuggler (PC, if ring-member path)
- **Type**: Unseen boss
- **Dynamic**: If the smuggler is a ring member, Nils is the authority known by reputation and felt through operational pressure. The smuggler has never met Nils but follows orders relayed through Devra and Kael.
---
## Known Attributes by Other NPCs
| NPC | What They Know About Nils |
|-----|---------------------------|
| **Kael** | Sibling, ring leader, pushing for higher volume, cares about family but puts operation first. Recruited Kael personally. |
| **Devra** | Full operational picture. Communication protocols. Nils's identity, strategic priorities, risk tolerance. Primary on-station contact. |
| **Voss** | "Someone above Devra" giving orders. Never met Nils. Resents the pressure. Knows consequences of refusal exist. |
| **Renn** | Ring coordinator exists. Follows orders relayed through Devra. Minimal direct knowledge. |
| **Pell** | Knows the ring has leadership above local operations. No personal details. |
| **Smuggler (if ring)** | Nils exists, gives orders, is Kael's older sibling. Known by reputation. |
| **Nobody in Sova** | Nils's exact location, the full supply chain above Nils, Nils's broader network. |
---
## Pattern / Motivation
**Pattern (System A):** GHOST — Nils is physically absent from Sova Transit District. His power is felt exclusively through intermediaries — lattice messages to Kael, relayed orders through Devra, operational pressure that cascades through the entire ring. No one outside the inner circle (Kael, Devra) has met Nils in person. The GHOST pattern means Nils shapes events without being present to confront, cultivate, or observe.
**Motivation (System B):** HANDLER — Nils manages ring operations from above. He sets volume targets, applies escalation pressure, makes personnel decisions, and drives the strategic direction that everyone on-station must execute. The ring's growth imperative comes from Nils; the consequences of that imperative fall on others.
**Composition read:** GHOST + HANDLER creates absent authority applying pressure through intermediaries. Nils's physical absence (GHOST) combined with his top-down management style (HANDLER) means the ring's most dangerous decisions are made by someone who never sees their consequences. He pushes for higher volume without experiencing the anxiety it creates in Voss, the risk it imposes on Kael, or the instability it breeds in Pell. For the smuggler, Nils is the unseen boss whose demands shape every operational day. For the detective, Nils is the name that surfaces late in the investigation — the coordinator behind the coordinator, the authority that explains why everyone on-station is afraid.
---
## v0.1 Presence
Nils is **never physically present** in any v0.1 game scene. His entire existence in the vertical slice is mediated:
### Lattice Messages (~5-8 authored lines)
Operational instructions to Kael. Pressure to increase volume. Occasional personal/familial note that humanizes the authority figure. These messages are a plot device — the player (as smuggler) may see or hear about them through Kael.
### Dialogue References
NPCs mention Nils by name or by implication:
- Kael: references "my brother" or "Nils" in ring contexts
- Voss: "another adjustment" from above, resentment toward unseen authority
- Devra: operational coordination, professional references
- Generic ring dialogue: "Nils says to push through more this cycle"
### Triangle 1 Volume Escalation Fork (Ticket #377)
Nils's transmitted message serves as a **plot device** — the escalation order that forces Triangle 1 (Voss - Kael - Nils) into active tension. The fork is triggered by Nils's demand for higher volume, which Kael must relay to Voss, who must adjust schedules, creating observable disruption.
---
## Cross-References
- [Kael Davan](kael-davan.md) — younger sibling, ring member, dock-side operator
- [Devra Talsen](devra.md) — on-station coordinator, executes Nils's strategic direction
- [Arvo Voss](voss.md) — shift supervisor, resents Nils's influence over his scheduling authority
+10 -1
View File
@@ -1,4 +1,4 @@
# Olin
# Olin Tavren
**Tier 3 NPC** | The Last Shift (Bar) | Flat
@@ -44,4 +44,13 @@ In Triangle 3 (Bar Tensions), Olin's questions and Torek's spending create a com
---
## Pattern / Motivation
**Pattern (System A):** CATALYST — Olin's arrival forces the district to evaluate a new variable. His questions about work schedules, shift structures, and hub operations create productive uncertainty. Every established character must assess Olin — friend or threat, innocent or planted — and that assessment itself disrupts the stable social equilibrium.
**Motivation (System B):** CIVILIAN — Olin is tagged CIVILIAN for v0.1, meaning no confirmed hidden agenda. At Tier 3 with 10-15 lines of content, there is not enough depth to resolve Olin's ambiguity. The CIVILIAN tag is the safe designation — if Olin is promoted to Tier 2 in v0.2, the hidden motivation can be revealed through dynamic tier promotion.
**Composition read:** CATALYST + CIVILIAN creates ambiguous disruption: "Friend or threat? The question IS the disruption." Olin forces evaluation (CATALYST) without providing resolution (CIVILIAN). The game deliberately does not confirm whether Olin is a scout, an informant, a rival operator, or genuinely just looking for work. This unresolvable ambiguity is the point — both player characters must spend attention and resources assessing a variable that may never pay off. The disruption is in the assessment itself, not in any action Olin takes.
---
**Cross-References:** [Lera Sessik](lera-sessik.md), [Torek Lintar](torek-lintar.md)
+11 -2
View File
@@ -1,4 +1,4 @@
# Pell
# Pell Torssen
**Tier 2 NPC** | Smuggling Ring | Entangled
@@ -6,7 +6,7 @@
## Core Identity
**Name**: Pell
**Name**: Pell Torssen
**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)
@@ -115,4 +115,13 @@ Pell is an informant looking for a handler. The detective is the obvious candida
---
## Pattern / Motivation
**Pattern (System A):** CATALYST — Pell's wavering forces the entire ring into crisis response. His anxiety, missed meetings, and irregular schedule compel other ring members to react — Renn reports suspicion, Devra increases surveillance, Nils considers action. Pell is a disruption vector whose instability threatens the operation's equilibrium.
**Motivation (System B):** TURNCOAT — Pell is actively considering cooperation with authorities. His loyalty is shifting under pressure — the escalating volume, the tightening risk, the paranoia that the ring's growth has invited institutional attention. Unlike Drin's passive turncoat status (omission), Pell's is deliberate: he is looking for a handler.
**Composition read:** CATALYST + TURNCOAT creates maximum instability: "When Pell breaks, everything moves." Pell's disruption (CATALYST) is driven by a deliberate shift in loyalty (TURNCOAT), making him the ring's existential threat. The other catalysts (Torek, Resha, Olin) disrupt accidentally; Pell's disruption is the consequence of a conscious decision to betray. For the smuggler, Pell is the biggest internal threat — the decision to support, report, or manage Pell defines the operation's future. For the detective, finding Pell before the ring acts on Renn's suspicion means gaining the case's keystone witness. The timing is everything, and Pell's anxiety is the countdown.
---
**Cross-References:** [Renn](renn.md), [Drin](drin.md), [Devra](devra.md), [Harek](harek.md)
+11 -2
View File
@@ -1,4 +1,4 @@
# Renn
# Renn Harsk
**Tier 2 NPC** | Smuggling Ring + Logistics Hub | Entangled
@@ -6,7 +6,7 @@
## Core Identity
**Name**: Renn
**Name**: Renn Harsk
**Age**: 26
**Role**: Courier, Sova Transit District (moves contraband between freight bay, storage, and handoff points)
**System Origin**: Krenn System, Station Sova
@@ -112,4 +112,13 @@ Renn came into the ring through Nils — a friend-of-a-friend introduction. He's
---
## Pattern / Motivation
**Pattern (System A):** THRESHOLD — Renn controls the physical movement of contraband through the district's corridors. He is the gatekeeper of cargo flow — the person who moves product between freight bay, storage, and handoff points. Tracing Renn means tracing the route. Blocking Renn means blocking the operation's physical pipeline.
**Motivation (System B):** OPERATOR — Renn runs courier routes. He times runs through maintenance corridors, coordinates with Devra's schedule, and executes the physical logistics of moving contraband. His function is execution — hands-on, spatial, operational.
**Composition read:** THRESHOLD + OPERATOR creates the physical gatekeeper: "Renn moves the product. Trace Renn, find the route." Renn controls access to the smuggling route (THRESHOLD) and personally executes the movement (OPERATOR). Unlike Devra's organizational gatekeeping, Renn's threshold is physical — he is the body in the corridor with the contraband. For the detective, catching Renn in a dead spot with cargo is the most direct path to blowing the operation. For the smuggler, Renn's reliability on courier runs is what keeps the pipeline flowing. His vulnerability is his visibility: a person moving cargo through restricted corridors during off-hours is the most catchable link in the chain.
---
**Cross-References:** [Pell](pell.md), [Devra](devra.md), [Kael Davan](kael-davan.md), [Drin](drin.md)
+11 -2
View File
@@ -1,4 +1,4 @@
# Resha
# Resha Neven
**Tier 2 NPC** | Logistics Hub (The Terminal) | Mundane
@@ -6,7 +6,7 @@
## Core Identity
**Name**: Resha
**Name**: Resha Neven
**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)
@@ -110,4 +110,13 @@ Resha asks questions because she's learning. Some of those questions — about l
---
## Pattern / Motivation
**Pattern (System A):** CATALYST — Resha's innocent questions about locked bays, irregular schedules, and unmanifested containers force the ring's infrastructure into defensive reactions. Every question she asks creates pressure on Voss and Kael. She is a disruption vector — not by intent, but by the simple act of trying to learn her job.
**Motivation (System B):** CIVILIAN — Resha is not investigating, not scheming, not cooperating with anyone. She is a new hire trying to understand procedures. Her questions are genuine, not strategic. The CIVILIAN motivation means the disruption is accidental — born of earnestness, not suspicion.
**Composition read:** CATALYST + CIVILIAN creates innocent disruption: "She just asked. Everyone flinched." Resha disrupts (CATALYST) through pure curiosity (CIVILIAN), which makes her impossible to manage through normal channels. You cannot tell a new hire to stop asking procedural questions without explaining why — and the explanation is the thing that must stay hidden. The system is so compromised that learning it honestly is itself a threat. For the smuggler, Resha is a variable that requires constant steering. For the detective, Resha is a fresh pair of eyes whose observations carry no political filtering — whatever Resha noticed, she noticed because it was genuinely anomalous.
---
**Cross-References:** [Voss](voss.md), [Kael Davan](kael-davan.md), [Maret Korr](maret-korr.md)
+10 -1
View File
@@ -1,4 +1,4 @@
# Sabel
# Sabel Hersk
**Tier 3 NPC** | Smuggling Ring (Off-Station) | Flat
@@ -42,4 +42,13 @@ Sabel is the **upstream connection** — the thread that leads from the local sm
---
## Pattern / Motivation
**Pattern (System A):** GHOST — Sabel is off-station, physically absent from the play area. The player does not interact with Sabel directly in any meaningful way. Sabel's power is felt through supply chain influence — origin codes on manifests, timing confirmations via lattice, references in ring members' dialogue. The GHOST pattern means Sabel shapes events from elsewhere without being present to confront or cultivate.
**Motivation (System B):** OPERATOR — Sabel runs the supply chain. Transit confirmations, shipment scheduling, cargo preparation — all operational execution from a remote position. Sabel's function is logistics, not strategy or pressure. The supply keeps coming regardless of what happens on Sova.
**Composition read:** GHOST + OPERATOR creates distant machinery: "Sabel shapes events from elsewhere." Sabel's absent power (GHOST) is exercised through operational execution (OPERATOR) — a supply chain that functions without requiring Sabel's physical presence on-station. For the detective, Sabel is a data phantom: origin codes, transit records, freight patterns that point to an upstream source the detective cannot reach within the vertical slice. For the smuggler, Sabel is the reliable engine that keeps the product flowing — professional, impersonal, and indifferent to the human consequences on the ground. Sabel's coldness is narrative content: the ring is disposable to its supplier.
---
**Cross-References:** [Devra](devra.md), [Renn](renn.md)
+45 -36
View File
@@ -24,9 +24,9 @@
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.
**Secondary**: Protect Naia 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.
Naia is Sera's closest friend on the station. When Naia 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 Naia's life falls apart. Not reporting it means Sera is sitting on evidence. The quiet life she wanted is gone.
---
@@ -34,9 +34,9 @@ Hael is Sera's closest friend on the station. When Hael started confiding worry
**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.
**Deep secret** (nobody knows except Sera): Sera ran an unauthorized compliance check on Kael Davan's freight handling records after Naia 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 Naia 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.
**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 Naia discovers Sera investigated Kael behind their back, the friendship is damaged regardless of Sera's motivation.
---
@@ -48,11 +48,11 @@ Hael is Sera's closest friend on the station. When Hael started confiding worry
- **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)
**Relationship 2: Naia** (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.
- **History**: Naia teaches station kids, represents the community Sera embedded herself in. They drink together after Naia's school day and Sera's shift, swap complaints about work, talk about Naia's relationship with Kael. Naia is the reason Sova feels like home instead of just another posting.
- **Current tension**: Naia 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 Naia does — and can't share it without destroying everything.
- **Mechanical relevance**: Naia 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.
@@ -73,12 +73,12 @@ Hael is Sera's closest friend on the station. When Hael started confiding worry
**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)
- Naia's worry escalating into direct action (if Naia 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)
- Naia being hurt by the consequences Sera was trying to prevent (if Kael is arrested and Naia blames Sera for not warning them)
- Institutional pressure from Commission (if a superior notices the compliance check was run but never filed)
---
@@ -90,7 +90,7 @@ Hael is Sera's closest friend on the station. When Hael started confiding worry
**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.
**15:30 - 18:00**: Bar (The Last Shift). Sera is an early-evening regular. Meets Naia 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):
@@ -106,7 +106,7 @@ Hael is Sera's closest friend on the station. When Hael started confiding worry
**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)
- Naia is worried about Kael's behavior (direct confidence from Naia, 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)
@@ -125,9 +125,9 @@ Hael is Sera's closest friend on the station. When Hael started confiding worry
**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.
Sera was content. Sova was the calm posting she needed after the stressful border station. She had a routine, a friend (Naia), 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.
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 Naia 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.
@@ -137,7 +137,7 @@ Now it's eroding. The compliance check changed everything. Sera can't un-know wh
**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.
**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 Naia 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.
@@ -149,14 +149,14 @@ Now it's eroding. The compliance check changed everything. Sera can't un-know wh
| 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` |
| **Avoidance of Torek Lintar** | Torek enters the bar. Sera makes an excuse and leaves within 2-3 minutes. | Detective (pattern recognition across 3 occurrences), Naia (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` |
| **Topic deflection on manifests** | Anyone mentions freight, manifests, compliance, or cargo irregularities. Sera changes the subject smoothly. | Detective (if tracking topic avoidances), Naia (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.
2. **Visit 2-3** (background data): Sera mentions Naia as "a friend from the district." Naia joins them once. Sera and Naia 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."
@@ -177,14 +177,14 @@ Now it's eroding. The compliance check changed everything. Sera can't un-know wh
## 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.
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 Naia 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."*
- *"There you are. Grab a seat — Naia 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."*
@@ -195,7 +195,7 @@ Born on Krenn Prime surface. Grew up in a mid-sized settlement where the Commiss
**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)**
**Mood: Warm (to Naia, 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]
---
@@ -236,21 +236,21 @@ Born on Krenn Prime surface. Grew up in a mid-sized settlement where the Commiss
## Triangle Roles
### Triangle 4: The Worried Partner (Hael - Kael - Sera)
### Triangle 4: The Worried Partner (Naia - 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.
**Sera's function**: The confidante who knows too much. Sera is the person Naia 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.
**Pressure**: Naia's worry is escalating. Every bar conversation where Naia mentions Kael's late nights or evasion tightens the vice on Sera. Sera can't tell Naia what she found (that would reveal the unofficial check and potentially endanger Naia further). She can't report it (that destroys Naia's life). She can't un-know it (competence doesn't have an undo function). Every interaction with Naia 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.
- **Detective** (if Sera's friend): Hears about Naia through Sera. May eventually meet Naia directly. The detective who follows the Naia thread back to Kael's behavior follows it directly through Sera's concealment.
- **Smuggler** (if Kael's friend): Knows why Kael is busy, knows Naia is worried, may see Sera and Naia 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.
**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 — Naia'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.
@@ -258,13 +258,13 @@ Born on Krenn Prime surface. Grew up in a mid-sized settlement where the Commiss
## 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.
**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 Naia.
**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).
**From whom**: Everyone. The detective (the person with the most right to know), Naia (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.
- **Naia finds out**: Complicated devastation. Sera investigated Kael without asking Naia. Even though Sera's motive was protective, the unauthorized check feels like betrayal — Sera went behind Naia's back, used institutional access against Naia's partner, and then hid it. Naia learns (1) Kael is involved in something illegal, (2) Sera knew and didn't say, (3) Sera used Commission systems to investigate Naia's partner. The friendship survives only if Naia 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.
@@ -276,7 +276,7 @@ Born on Krenn Prime surface. Grew up in a mid-sized settlement where the Commiss
**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.
**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 Naia 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."*
@@ -292,7 +292,7 @@ Born on Krenn Prime surface. Grew up in a mid-sized settlement where the Commiss
**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."
**Observable behavior**: Sera mentions Naia. "A friend from the district — you'd like them. They teach the station kids." Naia joins them at the bar once. Sera and Naia 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."*
@@ -358,13 +358,13 @@ Born on Krenn Prime surface. Grew up in a mid-sized settlement where the Commiss
**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 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, Naia, 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.
**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 Naia 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.
---
@@ -372,7 +372,7 @@ Born on Krenn Prime surface. Grew up in a mid-sized settlement where the Commiss
**~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)
- **25-35 dialogue lines**: Bar greetings (5), district orientation/background sharing (8-10), Naia-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**:
@@ -387,11 +387,20 @@ Born on Krenn Prime surface. Grew up in a mid-sized settlement where the Commiss
- **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.
- **Naia references**: Sera mentions Naia naturally, warmly, frequently. "Naia says the kids are doing better with the new curriculum." "Naia'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."
---
## Pattern / Motivation
**Pattern (System A):** FRIEND — Sera is a trust anchor whose relationship with the detective is the emotional core of the detective's experience. The FRIEND pattern means Sera's concealment carries maximum emotional weight because the detective relied on her as both a personal ally and an institutional peer.
**Motivation (System B):** WITNESS — Sera carries unreported evidence. She ran an unauthorized compliance check and found manifest discrepancies tied to Kael's shifts. Her motivation in the system is defined by what she has seen and is concealing, not by any operational role in the ring.
**Composition read:** FRIEND + WITNESS creates the concealment betrayal: "I was your friend AND I was hiding evidence." The detective trusted Sera as a safe harbor in an unfamiliar district (FRIEND) while Sera was sitting on the exact data the detective needed (WITNESS). The contamination is retrospective — every helpful tip Sera shared is recontextualized once the concealment surfaces. Was her helpfulness genuine, or was it compensation? The answer is both, and that ambiguity is the emotional payload.
---
**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.
+10 -1
View File
@@ -1,4 +1,4 @@
# Sess
# Sess Kolvur
**Tier 3 NPC** | The Last Shift (Bar) | Flat
@@ -44,4 +44,13 @@ Sess is the **ambient observer** — the social wallpaper who notices everything
---
## Pattern / Motivation
**Pattern (System A):** ANCHOR — Sess embodies quiet contentment behind the bar. His version of "Is this enough?" is answered by routine: pour drinks, observe, go home. Sess represents the stable social atmosphere that the district's conflicts play out against. His contentment is not ignorance — it is a deliberate choice to keep his life simple.
**Motivation (System B):** CIVILIAN — Sess is uninvolved. He has no agenda, no conspiracy, no operational role. He bartends. He sees things. He does not act on what he sees. The CIVILIAN motivation means Sess is social wallpaper with observational depth — present everywhere, invested in nothing.
**Composition read:** ANCHOR + CIVILIAN creates atmospheric texture: "Sees everything, says nothing — because nothing's wrong with HIS life." Sess's contentment (ANCHOR) is sustained by his disengagement (CIVILIAN). He observes the district's tensions from behind the bar without being pulled into them. This makes him a unique resource for patient players: Sess has seen patterns that no one else has assembled, but unlocking that information requires repeated investment in a character who has no reason to share. The v0.2 potential is significant — NOBODY tier promotion could reveal that Sess's quiet contentment conceals an observation post no one suspected.
---
**Cross-References:** [Lera Sessik](lera-sessik.md)
+10 -1
View File
@@ -1,4 +1,4 @@
# Tav
# Tav Merik
**Tier 3 NPC** | Smuggling Ring + Logistics Hub | Flat
@@ -46,4 +46,13 @@ Tav is the **peripheral ring member** — the person at the lowest level of the
---
## Pattern / Motivation
**Pattern (System A):** SYSTEM — Tav follows ring procedure. He is the lookout — positioned at corridor intersections during operations, watching for patrols, signaling the courier. His function is institutional: he is a cog in the ring's operational machinery, executing a defined role within a defined process. SYSTEM describes his mechanical participation, not his personal investment.
**Motivation (System B):** CIVILIAN — Tav is the lowest rung. He watches the door. That is the whole job. He does not understand the operation above him, does not participate in planning, and has minimal connection to the ring's strategy. The CIVILIAN motivation reflects his peripheral engagement — he was told it mattered, and he believed it.
**Composition read:** SYSTEM + CIVILIAN creates the lowest operational rung: "Tav watches the door. That's the whole job." Tav participates in the system (SYSTEM) without understanding it (CIVILIAN). He is the ring member most likely to be caught and least likely to have useful information — he knows routes and timing, not names or structure. For the detective, catching Tav reveals a thread but not the tapestry. For the smuggler, Tav is a reliable set of eyes whose nervous energy makes him effective on watch but vulnerable to pressure. The v0.2 potential is in what Tav represents: a young person trapped in a role he barely understands, doing dangerous work because someone told him it was important.
---
**Cross-References:** [Renn](renn.md), [Devra](devra.md)
+9
View File
@@ -110,4 +110,13 @@ Torek buys rounds. Tips well. Has a new jacket. Latest lattice accessories. He's
---
## Pattern / Motivation
**Pattern (System A):** CATALYST — Torek's visible spending disrupts the district's equilibrium. His generosity at the bar, his new accessories, his round-buying — all of it forces other characters to react, evaluate, and adapt. Torek doesn't intend to cause disruption; his lifestyle IS the disruption.
**Motivation (System B):** CIVILIAN — Torek is uninvolved in any conspiracy. Whether his money comes from the ring, a side hustle, or an inheritance, Torek himself is simply living. He is not scheming, not investigating, not operating. He is spending money and enjoying himself. The CIVILIAN motivation means the disruption is accidental — a signal without intent.
**Composition read:** CATALYST + CIVILIAN creates the accidental signal: "He doesn't know he's a liability." Torek's disruption (CATALYST) comes from innocence (CIVILIAN), not from deliberate action. This makes him harder to manage — you cannot negotiate with someone who does not know they are a problem. For the smuggler, Torek is a financial tell that cannot be silenced without revealing why it matters. For the detective, Torek is a spending pattern that could mean anything. The ambiguity is load-bearing precisely because Torek himself does not have the answer.
---
**Cross-References:** [Lera Sessik](lera-sessik.md), [Olin](olin.md), [Harek](harek.md), [Sera Venn](sera-venn.md)
+11 -2
View File
@@ -1,4 +1,4 @@
# Voss
# Arvo Voss
**Tier 2 NPC** | Logistics Hub (The Terminal) | Mundane
@@ -6,7 +6,7 @@
## Core Identity
**Name**: Voss
**Name**: Arvo Voss
**Age**: 46
**Role**: Shift supervisor, Sova Transit District Logistics Hub
**System Origin**: Krenn System, Station Sova (born and raised)
@@ -117,4 +117,13 @@ Voss is the shift supervisor. Nils Davan (Kael's older sibling, ring coordinator
---
## Pattern / Motivation
**Pattern (System A):** SYSTEM — Voss is the institutional authority at the logistics hub. His shift schedule is the operational machinery that enables the smuggling operation. He represents the legitimate system that has been co-opted: the schedule runs, the manifests process, the handoffs happen — all through the shift supervisor's authority.
**Motivation (System B):** OPERATOR — Voss runs the schedule. He processes manifests, manages personnel, creates coverage windows. His function is operational execution of the machinery he controls, not top-down pressure or strategic direction. He is middle management: competent, procedural, operating the system.
**Composition read:** SYSTEM + OPERATOR creates corrupted machinery: "The system works — for the wrong people." Voss IS the institutional process (SYSTEM) and he actively runs it (OPERATOR), meaning the legitimate logistics infrastructure and the criminal operation share the same human engine. For the detective, following the manifest trail leads to the shift supervisor's schedule — the system itself is the evidence. For the smuggler, Voss is the mechanism that keeps the operation running, and his resentment toward Nils is the gear most likely to grind.
---
**Cross-References:** [Kael Davan](kael-davan.md), [Maret Korr](maret-korr.md), [Drin](drin.md), [Resha](resha.md)
+410
View File
@@ -0,0 +1,410 @@
# Triangle 1: Hub Power — Volume Escalation Fork
**Triangle**: Voss - Kael - Nils
**Fork Type**: Smuggler decision (3 paths, self-contained)
**Trigger**: Nils's escalation demand via lattice message, delivered by Devra
**Ticket**: #377
**Decision Reference**: D-053 / A-17 (self-contained forks)
---
## 1. Triangle Overview
Triangle 1 is the hub's power structure under pressure. Arvo Voss (shift supervisor, 46) has positional authority on the floor but takes operational orders from Nils Davan (ring coordinator, off-stage) through intermediaries. Kael Davan (dock worker, 34, THE FRIEND) is caught between his boss and his older sibling. The triangle's resting tension: Nils pushes for higher volume, Voss wants stability, Kael wants everyone to calm down.
The Volume Escalation Fork activates this tension. Nils demands a double-volume shipment. The smuggler — positioned between all three — must decide how to handle it. The choice reshapes the triangle's internal dynamics and changes what the detective can observe, without altering what the detective ultimately discovers. All three paths lead to the ring. The fork changes **when** and **how**.
**NPCs involved**:
- **Nils Davan** (Off-Stage, GHOST+HANDLER): Ring coordinator, Kael's older sibling. Present only through lattice messages.
- **Arvo Voss** (Tier 2, SYSTEM+OPERATOR): Shift supervisor. Takes a cut from the ring. Terrified of escalation.
- **Kael Davan** (Tier 1, FRIEND+OPERATOR): Dock worker. Caught between Nils and Voss. Secretly trying to exit the ring.
- **Devra Talsen** (Tier 2, THRESHOLD+HANDLER): On-station coordinator. Delivers Nils's message to the smuggler.
---
## 2. Trigger: Nils's Escalation Demand
### Context
Minutes 5-10 of the vertical slice. Devra approaches the smuggler during a routine shift at the logistics hub. She has a lattice message from Nils. The next shipment is double volume. Nils needs more hands and wider timing windows. Voss has to adjust the shift schedule to create a bigger coverage gap. The smuggler is asked to help convince Voss — or handle the extra volume personally.
### The Lattice Message (Nils to Kael, relayed through Devra)
Nils's voice: direct, authoritative, strategic. Underneath the business tone, an occasional note of familial warmth toward Kael — not sentimentality, efficiency that happens to include affection.
> Kael. Next cycle, we're doubling the load. Two containers instead of one, same transit window. I've already confirmed with Sabel — the supply side is handled.
>
> I need Voss to widen the shift gap by forty minutes. Night transition, not day. Tell him it's temporary. Tell him whatever he needs to hear.
>
> Get your friend involved. The one who's good with routing. I trust your judgment on people, little brother — always have. But this shipment doesn't wait.
>
> The money's there. Enough for everyone to feel it. Voss gets his usual plus fifteen percent. You and your crew split the operational bonus.
>
> Don't let Voss talk himself out of this. He worries too much about things that haven't happened yet. We've run bigger loads through worse windows. This is manageable.
>
> I'll check in after transit. Stay sharp.
**Authoring notes**: "Little brother" is the familial note — warm, but embedded in operational language. Nils doesn't separate business from family; for him they're the same register. "I trust your judgment on people" is genuine and instrumentalizing simultaneously. The message is 6 lines of authored content (excluding the sign-off).
### Devra's Delivery
Devra approaches the smuggler at the hub, low voice, professional demeanor shifted to operational mode.
> *"Message from upstream. Nils wants to double the next run. He needs Voss to stretch the window — forty minutes, night shift transition. And he wants you on routing. Here."*
She passes the lattice message (or relays its contents verbally, depending on operational security context).
> *"Read it. Then we need to talk about Voss."*
---
## 3. The Decision Fork
The smuggler has three options. Each is self-contained within Triangle 1 — no cross-triangle cascade per D-053 / A-17.
---
### Path A: Side with Nils (Escalate)
**Decision trigger**: The smuggler agrees to help push the double shipment through. Convinces Voss to widen the window, takes on the extra routing work, follows Nils's plan.
#### NPC Responses
**Voss reaction** — resentful compliance, anxiety spiking:
> *"Forty minutes. You're asking me to leave a forty-minute hole in the night rotation. Do you know what that looks like to anyone paying attention?"*
> *"Fine. Fine. I'll move Drin to the south bay and pull Resha off overnight. But if this blows up, I was never part of this conversation."*
> *"Another 'adjustment.' Every cycle it's another adjustment. One day there won't be anything left to adjust."*
**Kael reaction** — relief mixed with unease:
> *"Nils got his way. Alright. At least the pressure's off for now — he won't be pinging me every hour."*
> *"You sure about this? Double volume through one window... that's a lot of containers to explain if someone's watching."*
**Nils follow-up message** (post-shipment, lattice):
> *"Clean run. Good work. Tell Voss he did fine — and tell him there's a bonus. People work better when they're not afraid."*
#### Detective Consequences
The investigation **accelerates**. Voss's anxiety produces observable disruption:
- Manifest discrepancies spike (Voss reworks schedules visibly, Maret notices).
- Voss's behavior becomes erratic — clipped responses, avoidance of break room during ring operations, nervous schedule adjustments.
- The detective reads organizational stress:
> *"Voss changed the night shift schedule. Third time this week. That's not workload management — that's someone covering ground."*
> *"Manifest revisions are up forty percent since last cycle. The shift supervisor is reprocessing more than the freight volume justifies."*
#### Mechanical Outcomes
| Attribute | Change |
|-----------|--------|
| `exposure_risk` | Increases globally for the ring |
| `cover_integrity` (ring) | Drops to `"thin"` |
| Voss `behavior_flags` | `"nervous,schedule_changes,evasive"` |
| Voss `position_integrity` | `"thin"` |
| Kael `behavior_flags` | Unchanged (pressure relieved) |
| Wow moment #2 (Character's Eye) | Triggers **EARLIER** in timeline |
#### Smuggler Monologue
> *"Nils's money. Voss's schedule. My routing. Everybody's got their piece. ...Voss looked like he wanted to throw up when I told him."*
> *"More volume means more exposure. But Nils doesn't think about exposure — he thinks about throughput. And now I'm thinking like him."*
> *"Kael's breathing easier. That's something. One less thing eating at him."*
---
### Path B: Side with Voss (Stabilize)
**Decision trigger**: The smuggler backs Voss's position. Rejects or delays the double shipment. Tells Devra (or Nils through Devra) that the window can't support double volume without unacceptable risk.
#### NPC Responses
**Voss reaction** — surprised relief, cautious gratitude:
> *"You told him no? ...I didn't think anyone told Nils no."*
> *"Good. The schedule stays clean. Nobody has to explain anything to anyone. That's how it should work."*
> *"Just — don't expect him to forget this. Nils doesn't forget when people push back."*
**Kael reaction** — increased anxiety, family pressure redirected:
> *"Nils isn't going to like this. He'll go around us — straight to me. And I can't... it's harder when it's him asking directly."*
> *"You did the right thing. I think. But Nils is going to make this my problem now."*
**Nils follow-up message** (lattice, to Kael directly — the smuggler hears about it through Kael):
> *"Kael. Your friend made a decision. I respect that. But the shipment still needs to move. You and I need to talk about alternatives. Call me tonight."*
#### Detective Consequences
The investigation **slows**. The hub runs quiet. But Kael's internal pressure builds and produces different tells:
- Fewer manifest discrepancies (Voss's schedule stays clean).
- Kael's distraction increases — more lattice checking, shortened conversations, visible tension from direct Nils pressure.
- The detective reads personal stress, not organizational disruption:
> *"The hub's been quiet. But Kael — he's checked his lattice eleven times this shift. Expecting something. Or dreading it."*
> *"No schedule anomalies this cycle. The shift supervisor's relaxed. But the dock worker — Davan — something's pulling at him."*
#### Mechanical Outcomes
| Attribute | Change |
|-----------|--------|
| `exposure_risk` | Stays low (ring remains quiet) |
| `cover_integrity` (ring) | Unchanged — `"solid"` |
| Voss `behavior_flags` | `"reliable,punctual"` (baseline restored) |
| Kael `behavior_flags` | Escalates faster: `"lattice_checking,distracted,evasive"` |
| Kael `trust_level` (from Nils) | Drops — Nils applies pressure directly |
| THE FRIEND contradiction | Hits **HARDER** (Kael under more personal strain, tells amplify) |
#### Smuggler Monologue
> *"Voss can breathe. The schedule's clean. ...So why do I feel like I just made this worse?"*
> *"Kael's been on his lattice all shift. Nils called him directly. I took the pressure off Voss and dropped it straight onto Kael."*
> *"I said no to protect the operation. But Kael's the one paying for it."*
---
### Path C: Mediate (Compromise)
**Decision trigger**: The smuggler proposes a middle ground — half the volume increase, phased across two shipments instead of one. Neither side gets what they want. The smuggler positions it as operational prudence.
#### NPC Responses
**Voss reaction** — temporarily calmed, skeptical:
> *"Half volume. Phased. ...That's something I can work with. Twenty minutes instead of forty. Tighter, but doable."*
> *"Don't tell me this is the new normal. One compromise turns into two, and then Nils is running double loads through my schedule anyway."*
**Kael reaction** — confused, uncertain:
> *"Half? Nils asked for double and you're offering half? He's going to think you don't trust him."*
> *"I don't know. Maybe it works. But Nils doesn't do 'maybe.' He does yes or no."*
**Nils follow-up message** (lattice, to Kael — cooler tone):
> *"Kael. Half volume, phased. Your friend's being careful. I can respect careful — up to a point. But careful doesn't move product, and product is what keeps everyone paid. We'll try it this way. Once. Then we revisit."*
#### Detective Consequences
The investigation reads **organizational confusion**. Mixed signals — some disruption, then quiet, then disruption again. The detective reads this accurately as internal disagreement:
> *"Something's off. Last night extra cargo, tonight normal. There's no pattern, and that's the pattern."*
> *"Inconsistent operational tempo. Either someone's experimenting with timing, or there's disagreement inside the operation."*
#### Mechanical Outcomes
| Attribute | Change |
|-----------|--------|
| `exposure_risk` | Moderate (some exposure, not full) |
| `cover_integrity` (ring) | Slightly degraded: `"solid"` to `"thin"` (marginal) |
| Smuggler `operational_trust` (from Nils) | **Drops** — Nils loses confidence in the smuggler |
| Voss `behavior_flags` | `"cautious"` (mild stress, manageable) |
| Kael `behavior_flags` | `"uncertain,distracted"` |
| Second decision point | **Creates a follow-up fork** later in timeline (see implementation note below) |
> **Implementation note:** Path C's deferred second decision point (when Nils revisits after the one-cycle trial) requires a follow-up fork that is **not specified in this document**. Options: (1) scope the follow-up fork as a separate ticket for v0.1, (2) let the trial period expire unresolved within the v0.1 timeline, treating the unresolved tension as authored ambiguity. The self-containment rule (Section 6) applies -- this deferred fork must not gate other triangles.
#### Smuggler Monologue
> *"Split the difference. Half now, half later. Nobody's happy, but nobody's exposed. ...Nils is going to remember this."*
> *"Kael looked at me like I'd spoken a different language. Half. He doesn't understand half — his whole family runs on all-or-nothing."*
> *"Bought time. That's all this is. The second shipment's still coming, and Nils will be less patient when it does."*
---
## 4. NPC State Changes per Path
### Arvo Voss
| Attribute | Path A (Escalate) | Path B (Stabilize) | Path C (Mediate) |
|-----------|-------------------|---------------------|-------------------|
| `behavior_flags` | `"nervous,schedule_changes,evasive"` | `"reliable,punctual"` | `"cautious"` |
| `position_integrity` | `"thin"` | `"solid"` | `"solid"` |
| `trust_level` (from smuggler) | `"reliable"` | `"reliable"` | `"reliable"` |
| `risk_assessment` (detective) | `"high"` | `"low"` | `"moderate"` |
| `tell_observed` (detective) | `"nervous_schedule_adjustments,break_room_avoidance"` | (none new) | `"cautious_scheduling"` |
| `moral_weight` (smuggler) | `"compromised"` | `"compromised"` | `"compromised"` |
### Kael Davan
| Attribute | Path A (Escalate) | Path B (Stabilize) | Path C (Mediate) |
|-----------|-------------------|---------------------|-------------------|
| `behavior_flags` | `"reliable,punctual"` (baseline) | `"lattice_checking,distracted,evasive"` (accelerated) | `"uncertain,distracted"` |
| `trust_level` (from Nils) | `"trusted"` | `"uncertain"` (Nils pressures directly) | `"uncertain"` |
| `risk_assessment` (smuggler) | `"low"` | `"moderate"` (visible strain) | `"moderate"` |
| `loyalty_assessment` (smuggler) | `"solid"` | `"solid"` (but strained) | `"uncertain"` |
| THE FRIEND arc timing | Normal pace | **Accelerated** (tells arrive sooner) | Normal pace |
### Nils Davan (off-stage, tracked through references)
| Attribute | Path A (Escalate) | Path B (Stabilize) | Path C (Mediate) |
|-----------|-------------------|---------------------|-------------------|
| `trust_level` (toward smuggler) | `"trusted"` (delivered results) | `"suspicious"` (defied directive) | `"uncertain"` (half-measure) |
| Pressure vector | Through Voss (operational) | Through Kael (familial) | Through Kael (revisit demand) |
| Follow-up action | Bonus payment, continued partnership | Direct contact with Kael, bypasses smuggler | One-cycle trial, second decision point |
### Smuggler (PC state)
| Attribute | Path A (Escalate) | Path B (Stabilize) | Path C (Mediate) |
|-----------|-------------------|---------------------|-------------------|
| `operational_trust` (from Nils) | High — reliable operator | Low — defiant | Moderate — cautious, untested |
| `operational_trust` (from Voss) | Moderate — Voss complies but resents | High — smuggler protected Voss | Moderate — temporary reprieve |
| Exposure position | Higher personal risk | Lower personal risk | Moderate, with deferred risk |
| Follow-up fork | None (resolved) | None (resolved, but Kael strain) | **Yes** — second decision when Nils revisits |
---
## 5. Detective Observation per Path
The detective does not know the smuggler's choice. The detective observes consequences.
### Post-Escalation (Path A)
**Observable signals**: Manifest discrepancies spike. Voss's schedule revisions increase. Night shift personnel reassignments without clear operational justification. Voss avoids the break room during transition windows.
**Detective monologue**:
> *"Voss changed the night shift schedule. Third time this week. Two workers reassigned without explanation. The freight scheduler — Korr — she's noticed too. Her manifest revision rate is tracking his."*
> *"The shift supervisor is managing something that isn't on the schedule. Whatever it is, it's getting bigger."*
**Monologue implications**: The detective's investigation accelerates toward Voss as the institutional weak point. Voss becomes the thread to pull. The ring's operational footprint expands, making pattern detection easier.
### Post-Stabilize (Path B)
**Observable signals**: Hub runs quiet. No schedule anomalies. But Kael's personal behavior shifts — lattice checking increases, social interactions shorten, visible tension without an organizational cause.
**Detective monologue**:
> *"The hub's been quiet. But Kael — he's checked his lattice eleven times this shift. That's not work communication. That's someone waiting for something they don't want to arrive."*
> *"No schedule disruptions. No manifest flags. Everything's clean on paper. But the dock worker — Davan — he's carrying something. Personal? Professional? Filing it."*
**Monologue implications**: The detective's investigation slows on the institutional side but builds a behavioral case against Kael specifically. Kael's tells become the primary signal. When THE FRIEND contradiction arrives, it hits harder because the detective has already been watching Kael.
### Post-Mediate (Path C)
**Observable signals**: Inconsistent operational tempo. One night shows excess cargo movement; the next is normal. The detective reads this as internal disagreement or experimental timing.
**Detective monologue**:
> *"Something's off. Last night extra cargo, tonight normal. There's no pattern, and that's the pattern."*
> *"Inconsistent tempo. If someone's running an operation through this hub, they're either changing methods or arguing about them. Either way — disorganization is observable."*
**Monologue implications**: The detective reads organizational confusion. This provides a different kind of evidence — not volume (Path A) or personal behavior (Path B), but structural inconsistency. The detective infers internal disagreement within the operation, which is accurate.
---
## 6. Self-Containment Declaration
**This fork is self-contained within Triangle 1 (Hub Power: Voss - Kael - Nils).**
Per D-053 / A-17: Self-contained forks are independent decision state machines with shared NPC state. Triangle 1's outcome modifies Voss and Kael's behavioral attributes and does NOT gate Triangle 2 (Worried Knowledge), Triangle 3 (Bar Tensions), Triangle 4 (Worried Partner), or Triangle 5 (Informant Question).
**What crosses triangle boundaries**: NPC state changes are **observable** by other triangles' logic, but this is emergent, not scripted cascade. If Voss's `behavior_flags` change to `"nervous,schedule_changes,evasive"` (Path A), Triangle 2's Maret can observe this through normal NPC observation mechanics. But Triangle 2's fork (if one exists) is not gated on Triangle 1's outcome.
**What does NOT cross**:
- Triangle 1's decision does not unlock or lock content in T2, T3, T4, or T5.
- Triangle 1's decision does not modify NPCs outside the triangle (Maret, Lera, Sera, etc.) except through standard observation.
- Triangle 1's decision does not alter the detective's investigation path — it alters the timing and observability of evidence, not its existence.
**Design principle**: The fork changes WHAT the detective sees first, not WHAT the detective discovers. All three paths lead to the ring. The smuggler's choice determines whether the detective arrives via institutional signals (Path A), personal behavioral tells (Path B), or organizational inconsistency (Path C).
---
## 7. Content Requirements
### Authored Lines Summary
| Content Type | Path A | Path B | Path C | Shared |
|-------------|--------|--------|--------|--------|
| Nils lattice message | -- | -- | -- | 6 lines (trigger message) |
| Nils follow-up message | 1 line | 1 line | 2 lines | -- |
| Devra delivery | -- | -- | -- | 2 lines (shared) |
| Voss reaction dialogue | 3 lines | 3 lines | 2 lines | -- |
| Kael reaction dialogue | 2 lines | 2 lines | 2 lines | -- |
| Smuggler monologue | 3 lines | 3 lines | 3 lines | -- |
| Detective monologue | 2 lines | 2 lines | 2 lines | -- |
| **Subtotal** | 11 | 11 | 11 | 8 |
**Total authored lines**: ~41 lines across all paths and shared content.
### Nils Lattice Message (Shared — Trigger)
Written above in Section 2. Six lines of authored content in Nils's voice: direct, authoritative, strategic, with "little brother" as the familial note.
### Devra Delivery Dialogue (Shared)
Written above in Section 2. Two lines: the relay and the redirect to the Voss question.
### Voss Reaction Dialogue (Per Path)
**Path A** (3 lines): Anxiety about the forty-minute gap, resentful compliance, fatalistic observation about "adjustments."
**Path B** (3 lines): Surprised relief, cautious gratitude, warning about Nils's memory.
**Path C** (2 lines): Pragmatic acceptance of half-volume, skepticism about whether it stays at half.
### Kael Reaction Dialogue (Per Path)
**Path A** (2 lines): Relief that Nils's pressure is off, unease about double volume risk.
**Path B** (2 lines): Anxiety about Nils going directly to him, acknowledgment that it was the right call but at personal cost.
**Path C** (2 lines): Confusion about the half-measure, warning that Nils doesn't do compromise.
### Nils Follow-Up Messages (Per Path)
**Path A** (1 line): Praise, bonus confirmation, instruction to reassure Voss.
**Path B** (1 line): Cool acknowledgment, redirected pressure onto Kael, "we'll talk about alternatives."
**Path C** (2 lines): Measured response, "I can respect careful up to a point," one-cycle trial with implied revisit.
### Smuggler Monologue (Per Path)
**Path A** (3 lines): Operational satisfaction shadowed by Voss's visible fear; alignment with Nils's logic; noting Kael's relief.
**Path B** (3 lines): Voss protected but Kael exposed; recognition of transferred pressure; guilt about the cost to Kael.
**Path C** (3 lines): Bought time, not resolution; Kael's confusion; awareness that Nils will return with less patience.
### Detective Monologue (Per Path)
**Path A** (2 lines): Voss's schedule changes as institutional signal; manifest revision rate as data.
**Path B** (2 lines): Hub quiet but Kael's lattice activity as personal behavioral signal; clean paper vs. dirty behavior.
**Path C** (2 lines): Inconsistent tempo as organizational signal; disorganization as evidence.
---
## Cross-References
- [NPC Roster](../npcs/index.md) — Triangle 1 diagram and tension summary
- [Kael Davan](../npcs/kael-davan.md) — THE FRIEND, full Tier 1 profile
- [Arvo Voss](../npcs/voss.md) — Tier 2 profile, tell system, dual-lens notes
- [Nils Davan](../npcs/nils-davan.md) — Off-stage profile, lattice message design
- [Devra Talsen](../npcs/devra.md) — Tier 2 profile, message delivery role
- [Entity Attributes](../knowledge/entity-attributes.md) — Canonical `known_attributes` keys referenced in state tables
- [Monologue Guide](../authoring/monologue-guide.md) — Tag taxonomy, prerequisite format, voice discipline
+1 -1
View File
@@ -54,7 +54,7 @@ The Commission's presence in Krenn is intermittent by design: established enough
**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.
**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, Naia, Sera, Nils, Kosse, Naia.
**Social Texture:**
- First names signal peer relationships; surname usage signals hierarchy
+1 -1
View File
@@ -173,7 +173,7 @@ This is why the community tolerates the ring: everyone benefits indirectly. The
**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)
- **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), [Naia Tamm](../npcs/naia-tamm.md) (referenced)
**The Five Triangles:** See [NPC Index](../npcs/index.md) for full triangle diagram.