Merge remote-tracking branch 'origin/copy'

# Conflicts:
#	CHANGELOG.md
#	client/data/ui-strings.yaml
This commit is contained in:
2026-02-13 17:57:10 +01:00
20 changed files with 3713 additions and 100 deletions
+16 -1
View File
@@ -7,8 +7,23 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
## [Unreleased]
### Added
- UIStrings autoload with YAML-based UI string loading (#409) — 38 strings across 5 categories (interaction, hud, knowledge, relationship, tutorial), minimal YAML parser, `get_text()` lookup with fallback-to-key
- UIStrings autoload with YAML-based UI string loading (#409) — minimal YAML parser, `get_text()` lookup with fallback-to-key
- HUD and interaction prompt labels now loaded from `client/data/ui-strings.yaml` instead of hardcoded strings
- Character voice speech patterns (#310) — sentence-level execution spec for smuggler and detective covering contractions, punctuation, stress markers, vocabulary, verbal tics, and authoring checklist
- NPC authoring style guide (#379) — 954-line handbook: tier budgets, 9 NPC patterns, dialogue/monologue rules, tag taxonomy, dual-lens coordination, Krenn/Sova culture, FRIEND phase mapping, validation checklist
- UI microcopy (#409) — 72 YAML strings for client integration: interaction verbs, relationship states, HUD labels, perception modes, notifications, knowledge panel, tutorial prompts
- Kael Davan FRIEND pack (#297) — 86 hand-authored lines across 3 locations, 5-phase relationship arc with contradiction scene, dual-lens notes
- Sera Venn FRIEND pack (#298) — 75 hand-authored lines at The Last Shift, trust-gated gossip, avoidance contradiction, contaminated trust arc
- PC-as-NPC content (#401) — 70 authored items enabling second-playthrough recognition (D-039 wow moment #4)
### Changed
- Moved ui-strings.yaml from content/campaigns/_meta/ to client/data/ for direct Godot client loading
### Fixed
- Fact ID format collision across FRIEND content — normalized 73 flat IDs to dotted category.topic format, fixing broken detective evidence chain from Sera to Kael observations
- Entity ref format inconsistency — normalized underscore format to npc:hyphenated across ~15 monologue references
- Phase tag inconsistency between FRIEND packs — standardized to phase-N format, added missing phase-2 tags to Kael ring ops lines
- Detective monologue gap for Kael — added 7 observation lines (7 → 15 total), added mood tags and bar_evening situation to Kael bar content
- Hoshe QA briefing updated with integration test coverage priorities — test harnesses, dedicated client-server test map, edge case focus
- Sprint 5 "Live" team briefings — copy (6 tickets), client (2), CI (1), joint coordination for content-at-scale sprint targeting FRIEND packs, voice patterns, NPC style guide, PC-as-NPC authoring, UI microcopy, FactId validation
- Live server mode (`make game`) — single command builds server, launches client with TCP connection, auto-kills server on exit; `make stop` helper for manual cleanup
+168 -40
View File
@@ -1,51 +1,179 @@
# UI strings for The Settled Reach client
# Authored by copy team. Loaded by UIStrings autoload.
# Format: one-level-nested key-value pairs (section.key -> value)
# UI Microcopy — The Settled Reach v0.1
#
# Ticket: #409 | Sprint: 5
# Author: Mellanie (Copywriter)
# Date: 2026-02-13
#
# All player-facing UI text. Organized by category.
# Voice: Sova Transit District (D-036) — working-class pragmatic, quotidian-with-undertow.
# Diegetic frame: most UI elements are neural insert overlays, not game chrome.
#
# Integration: Stig imports these into client/scripts/constants/ or reads at runtime.
# Keys are stable identifiers. Values are display strings.
interaction:
prompt_prefix: "E"
# ============================================================
# INTERACTION PROMPTS
# Displayed as "E - {label}" when player is near an interactable.
# Server sends verb kind + label. These are the canonical labels.
# Keep short: max 12 characters. Must read instantly during gameplay.
# ============================================================
interaction_verbs:
talk: "Talk"
examine: "Examine"
observe: "Observe"
examine_npc: "Look"
examine_object: "Examine"
read: "Read"
pick_up: "Pick up"
use: "Use"
inspect: "Inspect"
open: "Open"
close: "Close"
interact: "Interact"
listen: "Listen"
# ============================================================
# RELATIONSHIP STATE DESCRIPTORS
# Shown in knowledge panel when player inspects an entity.
# Maps to RelationshipState enum (server/src/knowledge/types.rs).
# These should feel like insert-generated assessments, not game labels.
# ============================================================
relationship_states:
unknown:
label: "Unknown"
description: "No prior contact."
known:
label: "Recognized"
description: "Seen before. No relationship established."
friendly:
label: "Trusted"
description: "Known contact. Cooperative."
person_of_interest:
label: "Flagged"
description: "Behavioral anomaly noted."
hostile:
label: "Hostile"
description: "Known threat."
# ============================================================
# HUD LABELS
# Top-level HUD elements. Diegetic: these are the insert's status readouts.
# Format mirrors a low-key neural overlay — terse, functional.
# ============================================================
hud:
mode_label: "Mode"
time_label: "Time"
health_label: "Health"
pause_indicator: "PAUSED"
location_prefix: "Location"
health: "Condition"
health_values:
full: "Normal"
wounded: "Injured"
critical: "Critical"
time_prefix: "" # No prefix — time displays as raw value (e.g., "14:30")
perception_mode_prefix: "" # No prefix — mode name displays directly
knowledge:
header_known_contacts: "Known Contacts"
header_persons_of_interest: "Persons of Interest"
header_case_notes: "Case Notes"
header_evidence: "Evidence"
header_known_locations: "Known Locations"
header_recent_observations: "Recent Observations"
empty_panel: "Nothing recorded yet."
# ============================================================
# PERCEPTION MODE LABELS
# The insert's active sensing mode. Per D-017.
# Smuggler has Baseline. Detective has Standard Professional.
# Labels should feel like the insert's own status readout.
# ============================================================
perception_modes:
standard: "Standard"
analytical: "Analytical"
social: "Social"
surveillance: "Surveillance"
relationship:
unknown: "Unknown"
acquaintance: "Acquaintance"
colleague: "Colleague"
trusted_colleague: "Trusted colleague"
informant: "Informant"
suspect: "Suspect"
hostile: "Hostile"
friendly: "Friendly"
flagged_by_case: "Flagged by case file"
person_of_interest: "Person of interest"
# ============================================================
# NOTIFICATION TEXT
# Brief messages that appear when game state changes.
# Max 40 characters. Must read in under 2 seconds.
# Diegetic: these are insert alerts, not achievement popups.
# ============================================================
notifications:
# Location discovery
location_discovered: "New location logged."
location_revisit: "Returning to {location}."
tutorial:
welcome: "Welcome to Sova Transit District."
movement: "Use WASD to move."
# NPC knowledge
contact_new: "New contact: {name}."
contact_updated: "Contact updated: {name}."
contact_flagged: "{name} flagged."
# Relationship shifts
relationship_improved: "{name} — trust increased."
relationship_degraded: "{name} — trust decreased."
relationship_hostile: "{name} — hostile."
# Evidence / observation
evidence_found: "Evidence logged."
anomaly_detected: "Anomaly noted."
pattern_recognized: "Pattern flagged."
# System
save_complete: "Progress saved."
connection_lost: "Signal interrupted."
connection_restored: "Signal restored."
# ============================================================
# KNOWLEDGE PANEL LABELS
# When the player opens the knowledge view to review what they know.
# Insert-flavored: reads like a personal filing system, not a game menu.
# ============================================================
knowledge_panel:
tab_contacts: "Contacts"
tab_locations: "Locations"
tab_evidence: "Notes"
section_known_attributes: "Known"
section_last_seen: "Last seen"
section_relationship: "Status"
section_observations: "Observations"
empty_state: "Nothing logged yet."
confidence_high: "Confirmed"
confidence_medium: "Likely"
confidence_low: "Unconfirmed"
confidence_rumor: "Hearsay"
# ============================================================
# TUTORIAL TEXT (DIEGETIC)
# Delivered via internal monologue (D-016), not UI overlay.
# These are NOT traditional tutorial prompts. They're the character
# thinking about what they can do, filtered through their voice.
# Smuggler and detective variants are in the monologue pools.
# These are the GENERIC fallback strings if monologue doesn't fire.
# ============================================================
tutorial_prompts:
move_hint: "Use the directional keys to move."
interact_hint: "Press E near someone to interact."
perception_hint: "Press TAB to toggle perception mode."
pause_hint: "Press SPACE to pause."
look_around: "Look around. Get your bearings."
examine_hint: "Press E to take a closer look."
listen_hint: "Move closer to overhear conversations."
monologue_hint: "Your thoughts appear as text on screen."
perception_hint: "Switch perception modes to see differently."
minimap_hint: "The overlay shows the area around you."
knowledge_hint: "Open your notes to review what you know."
# ============================================================
# MENU AND SYSTEM TEXT
# Non-diegetic. Standard game UI. Clean, no flavor text.
# ============================================================
menu:
pause_title: "Paused"
resume: "Resume"
settings: "Settings"
save_game: "Save"
load_game: "Load"
quit_to_menu: "Quit to Menu"
quit_game: "Quit"
confirm_quit: "Unsaved progress will be lost."
confirm_yes: "Yes"
confirm_no: "No"
settings:
audio_volume: "Volume"
text_size: "Text Size"
text_speed: "Text Speed"
fullscreen: "Fullscreen"
language: "Language"
# ============================================================
# CHARACTER SELECTION (if applicable in v0.1)
# ============================================================
character_select:
title: "Choose your perspective."
smuggler_name: "Logistics Operator"
smuggler_tagline: "You know these people. You know the work. You know what's at stake."
detective_name: "Commission Investigator"
detective_tagline: "The manifests don't add up. Someone in this district knows why."
confirm: "Begin"
+954
View File
@@ -0,0 +1,954 @@
# NPC Authoring Style Guide
**The Settled Reach** | v0.1 Content Authoring Handbook
**Ticket:** #379 | **Sprint:** 5
**Authors:** Gestalt (mechanical constraints), Mellanie (voice rules), Paula (tier templates, relationship design), Ozzie (anchor lines)
**Cross-references:** D-024, D-025, D-028, D-029, D-032, D-034, D-035, D-036, D-039, D-050, D-056, D-059
**Schemas:** `content/_schema/npc-profile.schema.json`, `dialogue-pool.schema.json`, `monologue-pool.schema.json`
---
## 1. Purpose
This document is the single reference for all NPC content authoring in The Settled Reach. Every dialogue line, monologue line, NPC profile, and content pack must conform to the rules here. The guide is used by:
- **Content authors** writing dialogue pools, monologue pools, NPC profiles, and content packs
- **Reviewers** checking tag compliance, voice consistency, and mechanical correctness
- **The generation pipeline** (v0.2+) as the style constraint set for expanded content
- **Future content authors** (including AI-assisted generation) as the specification they must satisfy
**If it's not in this guide, it's not a rule. If it contradicts a decision document, the decision document wins.**
---
## 2. Content Tiers
Every NPC has a tier (D-023, D-024). The tier determines content depth and authoring budget.
### Tier 1: Conspiracy-Entangled (Full Depth)
| Attribute | Value |
|-----------|-------|
| **Pattern** | FRIEND, MIRROR, or CATALYST |
| **Motivation** | Any |
| **Line budget** | 70-100 lines (FRIEND), 50-70 lines (MIRROR/CATALYST) |
| **Profile depth** | Full 10-axis, all fields populated |
| **Relationship arcs** | Multi-phase (3-5 phases for FRIEND), stable-deep for MIRROR |
| **Dual-lens notes** | Required on profile and every 5th dialogue line minimum |
| **FRIEND content** | Hand-authored only. No generation expansion. |
| **Triangle membership** | 1-3 triangles |
| **Trust-gated dialogue** | All three tiers (surface, real, secret) populated |
**v0.1 Tier 1 NPCs:** Kael Davan (FRIEND/OPERATOR), Sera Venn (FRIEND/WITNESS), Naia Tamm (MIRROR/CIVILIAN)
### Tier 2: Template-Situated (Social Context)
| Attribute | Value |
|-----------|-------|
| **Pattern** | ANCHOR, THRESHOLD, SYSTEM, GHOST, or REMNANT |
| **Motivation** | Any |
| **Line budget** | 20-40 lines |
| **Profile depth** | Full 10-axis, supporting fields optional |
| **Relationship arcs** | Single phase, stable. Access tier shifts possible but not required. |
| **Dual-lens notes** | Required on profile; optional on individual lines |
| **Triangle membership** | 1-2 triangles |
| **Trust-gated dialogue** | Surface required. Real recommended. Secret optional. |
**v0.1 Tier 2 NPCs (D-050 canonical):** Voss (SYSTEM/OPERATOR), Lera Sessik (ANCHOR/OPERATOR), Torek Lintar (CATALYST/CIVILIAN), Devra (THRESHOLD/HANDLER), Maret Korr (WITNESS/SKEPTIC), Resha (CATALYST/CIVILIAN), Drin (SYSTEM/TURNCOAT), Renn (THRESHOLD/OPERATOR), Pell (CATALYST/TURNCOAT), Harek (ANCHOR/HANDLER)
### Tier 3: Filler (Atmosphere)
| Attribute | Value |
|-----------|-------|
| **Pattern** | NOBODY |
| **Motivation** | CIVILIAN |
| **Line budget** | 5-10 lines |
| **Profile depth** | Minimal: canonical_id, display_name, tier, pattern, motivation, want, routine |
| **Relationship arcs** | None |
| **Dual-lens notes** | Not required |
| **Triangle membership** | None |
| **Trust-gated dialogue** | Surface only |
**v0.1 Tier 3 NPCs (D-050 canonical):** Sess (ANCHOR/CIVILIAN), Olin (CATALYST/CIVILIAN), Sabel (GHOST/OPERATOR), Tav (SYSTEM/CIVILIAN)
**Off-stage:** Nils Davan (GHOST/HANDLER) — referenced in dialogue, effects visible through other NPCs, rarely or never directly encountered.
**Design note:** The 30% flat population (D-029) is the noise floor. These NPCs make investigation signal meaningful. One memorable trait per Tier 3 NPC. Write the trait, write 5 greeting/routine lines, stop. But write them as real people — Tav worries about his first real responsibility. Sess remembers how the district used to be. Their genuineness is what makes the noise floor believable.
---
## 3. NPC Patterns (System A)
Patterns define an NPC's narrative archetype. Each pattern has specific authoring rules.
### FRIEND
The emotional centerpiece. Full contradiction arc, multi-phase relationship, maximum content depth. D-034 is the specification.
| Rule | Detail |
|------|--------|
| **Phases** | 3-5 phases: warmth -> trust -> doubt -> conflict -> new equilibrium |
| **Contradiction** | Must be observable through player observation, NOT told through dialogue |
| **Sympathetic motivation** | THE FRIEND isn't evil. Concealment comes from care or fear. |
| **No clean resolution** | Every player choice (confront, ignore, exploit, protect) has consequences |
| **Tell progression** | 3+ tells that escalate across phases |
| **Dialogue shift** | Pre-discovery and post-discovery pools must feel different |
| **Dual-lens resonance** | The other character's playthrough recontextualizes FRIEND behavior |
| **No generation expansion** | All FRIEND content is hand-authored |
**Content budget:** 70-100 lines per FRIEND NPC:
- 25-35 dialogue (greetings, shift talk, casual, deflection, confrontation)
- 15-20 trust-gated (insider ring talk, close warmth, secret-tier hints)
- 5-8 unprompted (NPC volunteers info early, warnings/deflections late)
- 10-15 monologue per character (bonded character + opposite character)
- 5-8 tell observation lines
- 3-5 contradiction discovery lines
### MIRROR
The honest character. No contradiction arc, no deception tells, no secrets. Full emotional depth despite mechanical simplicity.
| Rule | Detail |
|------|--------|
| **No tells** | Empty tells array. Behavioral markers (visible stress, coping) are NOT deception tells. |
| **No contradiction arc** | No phases, no color shift, no betrayal moment |
| **No secret-tier revelation** | Trust progression reveals deeper FEELING, not deeper SECRETS |
| **Absence as content** | The player's observation pipeline flags the LACK of tells as notable |
| **Emotional vulnerability** | MIRROR wears their worry visibly. Transparency is load-bearing. |
**Content budget:** 50-70 lines per MIRROR NPC. No contradiction discovery content. No tell observation content.
### ANCHOR
Stabilizing community presence. Protects the status quo.
| Rule | Detail |
|------|--------|
| **Social gatekeeper** | Controls information flow through social position, not power |
| **Protective reflex** | Shields regulars and community members from outsiders |
| **Tells signal vigilance** | Not deception — watchfulness, redirection, protective silence |
### THRESHOLD
Controls access between social worlds.
| Rule | Detail |
|------|--------|
| **Gatekeeper mechanic** | Cooperation or opposition shapes player options |
| **Access tier is the tool** | THRESHOLD decides who gets insider access |
| **Pressurable** | The player can earn or force cooperation |
### GHOST
Absent figure whose influence is felt through others.
| Rule | Detail |
|------|--------|
| **Minimal direct content** | Referenced in dialogue, rarely seen |
| **Off-screen pressure** | Effects visible through other NPCs' behavior changes |
| **Content is in OTHER NPCs' lines** | Ghost's impact authored through relationship stubs |
### SYSTEM, CATALYST, REMNANT, NOBODY
See `content/global/enums/patterns.yaml` for definitions. Each follows the general tier rules above.
---
## 4. Functional Motivations (System B)
Motivations define the NPC's role relative to the conspiracy. Combined with pattern to produce the full NPC identity.
| Motivation | Relationship to Ring | Content Implication |
|------------|---------------------|---------------------|
| **HANDLER** | Manages ring operations | Authority dialogue, operational language, power dynamics |
| **WITNESS** | Knows something, possibly unwittingly | Information gates, trust-progression reveals |
| **TURNCOAT** | Wavering loyalty | Pressurable, flip conditions, dual-access content |
| **CIVILIAN** | Genuinely uninvolved | Mundane substrate, noise floor, honest responses |
| **OPERATOR** | Active ring participant | Operational jargon, insider access content, complicity |
| **SKEPTIC** | Questions status quo | Uncomfortable questions, institutional criticism |
**Composition examples:**
- FRIEND + OPERATOR (Kael): "I was your friend AND your co-conspirator"
- FRIEND + WITNESS (Sera): "I was your friend AND I was hiding evidence"
- MIRROR + CIVILIAN (Naia): "The one person not lying, surrounded by liars"
- ANCHOR + OPERATOR (Lera): "Profitable blindness — is this enough? Yes, if I don't look"
- SYSTEM + OPERATOR (Voss): "The system works — for the wrong people"
- WITNESS + SKEPTIC (Maret): "I see the discrepancies. I can't pretend I don't"
- SYSTEM + TURNCOAT (Drin): "The institution made me vulnerable, and the ring exploited it"
**Authoring guidance:** When writing any NPC, start from the pattern+motivation tension. Every line should be legible as coming from that specific combination. An ANCHOR+OPERATOR speaks differently from an ANCHOR+CIVILIAN — the first maintains normalcy as active concealment, the second maintains normalcy because that's genuinely all they have.
---
## 4b. The 5 Key Axis Interactions
The 10 axes (D-024) don't exist in isolation. These 5 axis interactions generate the contradictions that drive gameplay. When authoring an NPC, identify which interactions are active — they determine what content to write.
| Interaction | What It Creates | Example |
|-------------|----------------|---------|
| **Want x Secret** | The contradiction between what they pursue and what they hide | Kael wants safety but his exit attempt is the biggest security risk. Sera wants connection but her concealment isolates her. |
| **Routine x Secret** | Observable deviations from normal behavior | Sera leaves the bar every time Torek arrives — the avoidance IS the tell. Kael lingers in restricted corridors during off-hours. |
| **Tolerance x Relationships** | When pressure on one relationship breaks another | Voss's compliance with Nils corrodes his authority over Kael. Naia's worry about Kael triggers Sera's unauthorized compliance check. |
| **Want x Relationships** | When personal desires conflict with social bonds | Kael's desire to protect Naia requires lying to the smuggler — the friend he sees every day. |
| **Personality x Tolerance** | How stress changes observable behavior | Kael goes quiet and checks exits. Sera redirects and overcompensates with helpfulness. Voss gets procedural and avoids the break room. |
**For each Tier 1 NPC, all 5 interactions must be active and authored.** For Tier 2, at least 2 interactions should be authored. Tier 3 NPCs need at minimum the Want x Routine interaction (what they want shapes their observable daily life).
---
## 4c. Triangle Content Requirements
Triangles (3 NPCs with conflicting interests) are the atomic unit of social intrigue (D-024, D-025). Every Tier 1 and Tier 2 NPC belongs to at least one triangle.
### v0.1 Triangles
| # | Name | Members | Type | Core Tension |
|---|------|---------|------|-------------|
| T1 | **Hub Power** | Voss - Kael - Nils (off-stage) | Active fork | Voss has the title, Nils has the power, Kael is caught between |
| T2 | **Worried Knowledge** | Maret - Drin - Voss | Active fork | Maret sees discrepancies, Drin is compromised, Voss needs silence |
| T3 | **Bar Tensions** | Lera - Torek - Harek | Passive tension | Torek's spending draws attention, Lera protective, Harek watching |
| T4 | **Worried Partner** | Naia - Kael - Sera | Active fork | Naia worries about Kael, confides in Sera, Sera discovers evidence |
| T5 | **Informant Question** | Naia - Devra - Drin | Passive tension | Cross-template — potential unraveling vectors |
### What Authors Must Provide per Triangle
1. **Observable signals:** What the player can see that indicates triangle pressure (behavioral changes, spatial avoidance, tonal shifts in dialogue)
2. **Smuggler relevance:** How the smuggler reads this triangle — what they know, what they worry about
3. **Detective relevance:** How the detective reads this triangle — what they observe, what it suggests
4. **Pressure points:** What player actions could escalate or de-escalate the tension
5. **Dialogue shift lines:** At least 2-3 lines per triangle member that change when the triangle is under pressure vs. at rest
### Triangle Rules
- **Self-contained in v0.1 (D-053).** No cross-triangle cascade. Pressure in T1 does not automatically affect T3. Cross-triangle cascade is a v0.2 storyteller feature.
- **Observable, not narrated.** Triangle tension must be visible through NPC behavior (tells, routine deviations, tonal shifts), not explained through dialogue exposition.
- **Dual-lens mandatory.** Every triangle must read differently through smuggler and detective perspectives.
---
## 4d. Access Tier Shift Paths
Access tiers change during gameplay based on player actions and story progression. Content authors must provide dialogue for both the starting state and the shifted state.
| Social Site | Character | Starting Tier | Likely Shift | Trigger |
|-------------|-----------|---------------|-------------|---------|
| Logistics Hub | Smuggler | insider + peer | insider > hostile | Cover blown — seen with detective, or ring member reports suspicion |
| Logistics Hub | Detective | authority | authority > peer | Earns trust by keeping a minor infraction quiet |
| Bar | Smuggler | insider (regular) | insider > hostile | Social contamination from hub events |
| Bar | Detective | public | public > insider | Repeated visits (3-4), earns regular status |
| Ring spaces | Smuggler | insider + peer | peer > hostile | Suspected of cooperation with detective |
| Ring spaces | Detective | public (doesn't know ring exists) | public > hostile | Stumbles into ring awareness — NPCs react defensively |
**Authoring implication:** For every access tier in the table above, content packs must include dialogue that works at that tier. When a shift happens (e.g., smuggler goes from insider to hostile at the hub), the *absence* of insider-tier lines IS the emotional payload — the player notices that Kael no longer shares operational details, that the warmth is gone. This means `public` and `hostile` tier lines must be authored with enough depth to carry the post-shift experience.
---
## 5. Dialogue Authoring Rules
### The Tag Taxonomy (D-035)
Every dialogue line requires 6 structural tags + up to 3 selection tags.
#### Structural Tags (Required)
| Tag | Type | Format | Description |
|-----|------|--------|-------------|
| `id` | string | `{location}_{d}_{###}` | Stable line ID. Machine-parseable. Never reused. |
| `text` | string | The line | The authored dialogue text |
| `role` | enum | lowercase-slug | Template role, not NPC name. NPCs fill roles at runtime. |
| `access` | list | `[public, insider, ...]` | D-028 Layer 1 hard filter. Who can hear this. |
| `trust` | enum | `surface\|real\|secret` | D-028 Layer 3 hard filter. What trust level unlocks this. |
| `situation` | list | `[arrival, routine, ...]` | D-028 Layer 2 context filter. When this line can fire. |
#### Selection Tags (Recommended)
| Tag | Type | Format | Description |
|-----|------|--------|-------------|
| `topic` | list | `[colleague, cargo, ...]` | D-028 Layer 4 weighted selection. Defaults to `[routine]`. |
| `mood` | list | `[comfortable, worried, ...]` | D-028 Layer 4 weighted selection. Defaults to `[comfortable]`. |
| `tags` | list | freeform strings | Escape hatch for author intent. |
#### Authoring-Only Tags (Not Consumed by Engine)
| Tag | Type | Description |
|-----|------|-------------|
| `dual_lens` | map | Per-character interpretation notes |
| `notes` | string | Design notes for reviewers |
| `knowledge_grant` | object | What the player learns from hearing this line |
### The Four-Layer Pipeline
Content authors must understand how the engine selects lines. A line must pass ALL layers to fire.
```
Layer 1: ACCESS (hard filter)
Does the player's current access tier match the line's access list?
If no -> line is invisible. The player never knows it exists.
Layer 2: SITUATION (context filter)
Is the current situation in the line's situation list?
If no -> line is ineligible for this encounter.
Layer 3: TRUST (hard filter)
Has the player reached the required trust level with this NPC?
If no -> line is invisible.
Layer 4: MOOD + TOPIC (weighted selection)
From the eligible pool, weight by mood and topic match.
Higher match = more likely to be selected.
```
**Authoring implication:** A line tagged `access: [insider], trust: secret, situation: [confrontation]` will ONLY fire when:
1. The player has insider access (smuggler at the hub, not detective)
2. The player has earned secret-level trust (deep relationship)
3. The situation is a confrontation (triangle pressure escalated)
If any layer fails, the line is invisible. Tag conservatively.
### Access Tier Rules
| Tier | Who Gets It | Authoring Guidance |
|------|-------------|-------------------|
| `public` | Everyone | Safe topics. Greetings. Shift small talk. What you'd say to a stranger. |
| `insider` | Group members | Ring operational talk. Close colleague warmth. What you'd say to someone who belongs. |
| `authority` | Institutional figures | Formal responses to power. Careful language. What you'd say to a cop. |
| `peer` | Earned personal trust | Real conversation. Honest opinions. What you'd say to someone you actually like. |
| `hostile` | Broken relationship | Accusations. Threats. Defensive walls. What you'd say to someone you no longer trust. |
**Critical rules:**
- `access` is a **list**. A line can be eligible for multiple tiers: `[public, peer]`.
- The smuggler starts with `insider` + `peer` at the hub. The detective starts with `authority`.
- When Kael transitions from Friendly to PersonOfInterest, `insider` and `peer` lines **lock out**. That absence IS the emotional payload.
- Never tag a line `access: [insider, authority]` unless you mean "ring members AND institutional figures hear the same line." That's almost never correct.
### Trust Tier Rules
| Tier | What It Gates | Authoring Guidance |
|------|--------------|-------------------|
| `surface` | Default | Safe, non-committal. The public face. Most dialogue is here. |
| `real` | Earned through repeated positive interaction | Genuine opinions, workplace complaints, personal concerns. The real person. |
| `secret` | Highest tier | Information they'd normally hide. Ring involvement, fears, leverage. For MIRROR NPCs: deepest emotional vulnerability, NOT plot secrets. |
### Situation Assignment
Tag lines with situations they're appropriate for. The engine decides which situations are currently active.
**Common mistakes:**
- Tagging everything `[routine]`. If the line is specific to a time or context, tag it specifically.
- Omitting `observation` from lines that make sense when the player is watching from a distance.
- Using `confrontation` for any tense moment. `confrontation` means triangle pressure has escalated past threshold. Most tension is `investigation` or `social`.
---
## 6. Monologue Authoring Rules
### Hard Partition (D-032)
Internal monologue is **completely separate** per playable character. The `character` tag is a hard partition, not a filter. The smuggler and detective have independent monologue pools. **No shared lines.**
Same trigger, different pool. That's how mirror moments work.
### Monologue-Specific Tags
| Tag | Type | Description |
|-----|------|-------------|
| `id` | string | `{location}_m_{s\|d}_{###}``s` for smuggler, `d` for detective |
| `text` | string | The monologue line (160 char max) |
| `character` | enum | `smuggler` or `detective` |
| `trigger` | enum | What causes this line to fire (see trigger types below) |
| `prerequisites` | object | AND-only knowledge gates (facts, entity attributes, relationship state) |
| `priority` | int 0-10 | Selection weight. Default 5. Higher = more likely to fire. |
| `cooldown` | int | Minimum ticks before line can fire again |
| `tags` | list | Freeform tags |
### Trigger Types
| Trigger | When It Fires | Authoring Guidance |
|---------|--------------|-------------------|
| `enter_location` | Player enters new area | First impressions, atmosphere, spatial awareness |
| `observe_npc` | Player sees an NPC doing something notable | Body language, activity, posture, tell |
| `hear_sound` | Sound event from fog edge | Interpretation of what the player can't see |
| `observe_anomaly` | NPC deviates from known routine | Requires prerequisite knowledge of normal pattern |
| `post_conversation` | After dialogue ends | Reflection on what was said, what wasn't, what felt off |
| `discover_evidence` | Player examines informational object | Interpretation of found evidence |
| `witness_interaction` | Player sees two NPCs interacting | Social observation, body language reading |
| `time_idle` | Player hasn't acted for a while | Ambient thoughts, rumination, noticing background |
| `return_visit` | Player returns to visited area | Changed perspective, comparison to last time |
### Display Constraints (Hard Ceiling)
| Constraint | Value | Implication |
|------------|-------|-------------|
| **Max length** | 160 characters | Hard ceiling. Most lines 80-120 characters. |
| **Max visual lines** | 2 | If it wraps to 3, cut it. |
| **Display time** | 4-6 seconds (length-adjusted) | Target: 15-25 words per line. |
| **Self-contained** | Each line stands alone | A line must make sense even if the previous one didn't display. |
| **25-word rule** | If over 25 words, it must be the most important line in the pool | Most lines: 10-18 words. Average target: 14 words. |
### Prerequisite Authoring
Monologue lines can gate on knowledge state. Use sparingly — most lines should fire on trigger alone.
```yaml
prerequisites:
facts:
- fact_id: "contraband.ring_exists"
min_confidence: "knows_of"
entity_attributes:
- entity: "npc:kael-davan"
key: "behavior_flags"
value: "nervous"
relationship:
target: "npc:kael-davan"
state: "friendly"
```
**Confidence hierarchy (D-041):**
- `suspects` — heard a rumor, gut feeling
- `knows_of` — has evidence something exists
- `knows_details` — understands specifics
- `direct` — personally witnessed
**Rule:** Gate on the MINIMUM confidence needed. If a monologue line works at `suspects`, don't gate it at `knows_details`. More gates = fewer fires = less content the player experiences.
---
## 7. Regional Culture: Krenn System / Sova Transit District (D-036)
All NPC dialogue and monologue must carry the Sova cultural substrate. This is not decoration — it's the baseline voice.
### Krenn Naming Conventions
- **First-name-primary.** Compact, consonant-heavy. First names in all social contexts.
- **Surnames exist for records, not conversation.** Using a surname signals formality or institutional distance.
- **Exception:** The detective uses surnames for targets and unknowns. The shift to first-name IS a relationship marker.
**Canonical Krenn names (v0.1):** Kael, Voss, Lera, Torek, Drin, Maret, Naia, Sera, Nils, Renn, Harek, Pell, Tav, Olin, Resha, Sess, Sabel, Devra
### Sova Atmosphere
The voice of Sova Transit District is **"quotidian-with-undertow"** — comfortable enough to be complacent, tight enough that extra income is tempting.
| Element | Application |
|---------|------------|
| **Sensory palette** | Span gate hum, industrial lubricant, recycled air, cargo machinery, metal grating underfoot |
| **Economic tone** | Working-class pragmatic. Money is tight. Grey-market spending is a lifeline, not a crime spree. |
| **Social fabric** | Regulars, shift crews, bar habits, "the usual." Community defined by routine co-presence. |
| **Institutional relationship** | The Commission is distant, resented, tolerated. Station admin is bureaucracy. Nobody trusts institutions to help. |
| **Trade jargon** | Containers, manifests, shifts, routes, transition windows, temp storage, freight bay. Native vocabulary for dock workers — never explain or annotate. |
### What Sova Voice Is NOT
- Not grimdark. People laugh, drink, complain about their shifts, look forward to the bar.
- Not polished sci-fi. No one says "atmospheric recycling unit." They say "recycled air."
- Not exposition. Characters know where they live. They don't describe it to themselves.
- Not uniform. Lera's bartender warmth differs from Voss's terse authority. Culture is substrate, not script.
---
## 8. Dual-Lens Coordination
### The Core Test (Every Line, Every Time)
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 1 or 2 fails, the line is broken. If 3 fails, the line isn't dual-lens — it's generic.
### Three Types of Dual-Lens Difference
**Type 1: Access Difference.** The smuggler hears a line the detective doesn't (or vice versa). Enforced by `access` tag.
**Type 2: Interpretation Difference.** Both characters hear the same dialogue, but their monologue reactions interpret it differently. Enforced by separate monologue pools.
**Type 3: Emotional Weight Difference.** Relationship history creates different emotional stakes for the same observation.
### The `dual_lens` Field
On dialogue lines and NPC profiles, use the authoring-only `dual_lens` field to document the split:
```yaml
dual_lens:
smuggler: "Operational context -- part of ring pipeline. 'Backed up' is cover."
detective: "Anomaly -- overnight exceeds procedure. Flag for investigation."
```
This field is never consumed by the engine. It exists for reviewers and future authors.
---
## 9. Voice Register Quick Reference
Full voice specifications live in:
- **Voice patterns (complete):** `docs/design/voice-patterns.md` (#310) — sentence-level execution rules, contraction patterns, punctuation, stress markers, verbal tics
- **Smuggler voice card:** `docs/design/smuggler-voice-card.md` — full smuggler voice reference + moral arc
This section provides the quick-reference contrast. For authoring-level detail (contraction rules, sentence starters, stress markers), consult the voice patterns document directly.
### Smuggler Voice
| Parameter | Value |
|-----------|-------|
| **Sentence length** | Short. Fragments. Rarely more than 2 sentences. |
| **Vocabulary** | Concrete, physical, sensory. Trade jargon without explaining. No institutional language. |
| **Emotional register** | Feeling-first, analysis second. Gut before brain. |
| **Relationship mode** | First-name basis. People by connection, not role. |
| **Observation priority** | People > environment > objects |
| **Self-reference** | Rare. Through physical sensation, not emotional labels. |
**Smuggler anchor lines:**
1. *"Kael's already at the dock. Good. The day's better when he's on shift."* (warm)
2. *"Shift transition in thirty minutes. If Voss kept the schedule thin, the route's clear."* (operational)
3. *"Kael keeps checking his lattice. Waiting for a message? Not like him to be jumpy."* (concerned)
4. *"He looked left. He always looks left when he's making something up. Two years I've known that tell."* (hurt)
5. *"Morning shift. Recycled air and cargo lubricant. Home sweet home."* (atmospheric)
### Detective Voice
| Parameter | Value |
|-----------|-------|
| **Sentence length** | Complete sentences. Structured. Occasional fragments for emphasis. |
| **Vocabulary** | Institutional layer over plain speech. "Noted," "flagged," "filing it." |
| **Emotional register** | Analysis-first, personal second. When personal breaks through, it's notable. |
| **Relationship mode** | Surname-first for targets. First-name for allies. The shift IS a marker. |
| **Observation priority** | Patterns > people > environment |
| **Self-reference** | More common than smuggler. Through professional lens. |
**Detective anchor lines:**
1. *"Logistics hub. Standard prefab, heavy foot traffic. Let's see what the shift change tells me."* (clinical)
2. *"That's the third time. Sera leaves when Torek arrives. Three different excuses, same result."* (pattern)
3. *"Good to see Sera. She always was the reliable one. At least someone speaks my language."* (personal leak)
4. *"Same booth. Same warm smile. Same offer to buy me a drink. ...Everything except whatever she's not saying."* (conflicted)
5. *"Grain spirit and low conversation. Only place that doesn't smell like freight lubricant."* (atmospheric)
---
## 10. FRIEND Relationship Phase Mapping
THE FRIEND arc is the emotional centerpiece of v0.1. Both FRIEND NPCs follow a multi-phase relationship progression with distinct mechanical expressions at each phase.
### Kael Davan (Smuggler's FRIEND)
**Arc:** comfort -> crack -> observation -> confrontation -> contaminated trust
| Phase | Timing | RelationshipState | Access Available | Monologue Register | Tell State | Content Types |
|-------|--------|------------------|-----------------|-------------------|------------|---------------|
| **1: Comfort** | 0-10 min | Friendly (green) | insider, peer | Fond, casual | None (baseline) | Greeting, shift talk, bar casual, ring coordination |
| **2: First Crack** | 10-15 min | Friendly (green) | insider, peer | Mild concern | Lattice checking, shortened interactions | Distracted dialogue, early worry monologue |
| **3: The Observation** | 15-20 min | PersonOfInterest (amber) | **insider/peer lock out** | Alarm + confusion | Spatial: wrong place, wrong time | Contradiction discovery monologue (3-5 lines) |
| **4: Confrontation** | 20-25 min | PersonOfInterest (amber) | public, hostile | Betrayal crystallizing | Looks-left tell confirmed | Deflection dialogue, evasion, the tell |
| **5: Contaminated Trust** | 25-30 min | PersonOfInterest (amber) | public | Conflicted | Every warm interaction suspicious | Surface-normal dialogue, doubt monologue |
**Mechanical triggers for phase transitions:**
- Phase 1->2: Time-based. Behavioral flags begin accumulating after ~10 minutes.
- Phase 2->3: Spatial trigger. Smuggler enters Corridor B-7, directly observes unauthorized meeting.
- Phase 3->4: Player-initiated. Smuggler chooses to ask Kael about the observation.
- Phase 4->5: Automatic. Post-confrontation, trust is structurally damaged regardless of dialogue choice.
**Key authoring constraint:** At Phase 3, `insider` and `peer` dialogue **locks out**. Kael still talks to the smuggler, but only `public` + `surface` lines remain. That absence IS the emotional payload. Authors must provide enough `public/surface` lines for Phases 3-5 to feel populated but noticeably colder than Phases 1-2.
### Sera Venn (Detective's FRIEND)
**Arc:** trust -> background data -> pattern recognition -> the question -> contaminated trust
| Phase | Timing | RelationshipState | Access Available | Monologue Register | Tell State | Content Types |
|-------|--------|------------------|-----------------|-------------------|------------|---------------|
| **1: Trust** | 0-10 min | Friendly (green) | peer | Professional + warmth | None (baseline) | Bar greeting, district orientation, institutional background |
| **2: Background Data** | 10-15 min | Friendly (green) | peer | Noting connections | Social: relationships outside institutional channels | Naia introduction, community context |
| **3: The Pattern** | 15-20 min | PersonOfInterest (amber) | peer, **authority unlocks** | Suspicion activating | Avoidance: leaves when Torek arrives (3x) | Pattern recognition monologue, avoidance observation |
| **4: The Question** | 20-25 min | PersonOfInterest (amber) | peer, authority | Professional + personal conflict | Controlled deflection, quick warmth recovery | Confrontation dialogue, evasion |
| **5: Contaminated Trust** | 25-30 min | PersonOfInterest (amber) | peer, authority | Analytical doubt | Overcompensation helpfulness | Surface-helpful dialogue, evaluating monologue |
**Mechanical triggers for phase transitions:**
- Phase 1->2: Time-based + social triggers. Sera introduces detective to bar regulars.
- Phase 2->3: Observation accumulation. Third departure when Torek arrives triggers pattern recognition.
- Phase 3->4: Player-initiated. Detective chooses to ask about Torek.
- Phase 4->5: Automatic. Post-question, trust is contaminated regardless of Sera's response.
**Key authoring contrast with Kael:** Sera's `peer` access does NOT lock out at Phase 3. Instead, `authority` access **opens**. The detective gains institutional leverage while personal warmth remains but is contaminated. The content shift is additive (more dialogue available) rather than subtractive (Kael's loss of insider content).
---
## 11. Tag Taxonomy Complete Reference
### Access Tiers (5 values)
`public`, `insider`, `authority`, `peer`, `hostile`
See `content/global/enums/access-tiers.yaml` for full descriptions.
### Trust Tiers (3 values)
`surface`, `real`, `secret`
See `content/global/enums/trust-tiers.yaml`.
### Situations (13 values)
`arrival`, `shift_start`, `shift_end`, `shift_transition`, `bar_evening`, `night_shift`, `investigation`, `confrontation`, `social`, `alone`, `emergency`, `routine`, `observation`
See `content/global/enums/situations.yaml`.
### Topics (9 values)
`colleague`, `routine`, `cargo`, `money`, `trust`, `danger`, `institution`, `personal`, `investigation`
See `content/global/enums/topics.yaml`. Note: `crime` is deliberately excluded. NPCs think of smuggling as `cargo` or `money`, not crime.
### Moods (8 values)
`fond`, `comfortable`, `worried`, `suspicious`, `analytical`, `conflicted`, `concerned`, `relieved`
See `content/global/enums/moods.yaml`.
### Monologue Triggers (9 values)
`enter_location`, `observe_npc`, `hear_sound`, `observe_anomaly`, `post_conversation`, `discover_evidence`, `witness_interaction`, `time_idle`, `return_visit`
See `content/global/enums/triggers.yaml`.
### NPC Patterns (9 values)
`FRIEND`, `MIRROR`, `ANCHOR`, `GHOST`, `CATALYST`, `THRESHOLD`, `REMNANT`, `SYSTEM`, `NOBODY`
See `content/global/enums/patterns.yaml`.
### Functional Motivations (6 values)
`HANDLER`, `WITNESS`, `TURNCOAT`, `CIVILIAN`, `OPERATOR`, `SKEPTIC`
See `content/global/enums/motivations.yaml`.
---
## 12. Mechanical Validation Checklist
Before submitting any content, run through these checks. Items marked **HARD** will be enforced by schema validation. Items marked **SOFT** require reviewer judgment.
### Dialogue Lines
- [ ] **HARD:** `id` matches pattern `{location}_d_{###}` (lowercase, underscore-separated)
- [ ] **HARD:** `role` is a valid lowercase slug matching a template role
- [ ] **HARD:** `access` is a non-empty list of valid access tier enums
- [ ] **HARD:** `trust` is one of `surface`, `real`, `secret`
- [ ] **HARD:** `situation` is a non-empty list of valid situation enums
- [ ] **SOFT:** `topic` and `mood` are populated (defaults apply if empty, but explicit is better)
- [ ] **SOFT:** Line passes dual-lens test (both characters, or correctly tier-gated)
- [ ] **SOFT:** `access` list makes sense (no `[insider, authority]` unless intentional)
- [ ] **SOFT:** `trust` tier matches content sensitivity (don't put ring talk at `surface`)
- [ ] **SOFT:** Line advances character, relationship, or narrative (no filler)
### Monologue Lines
- [ ] **HARD:** `id` matches pattern `{location}_m_{s|d}_{###}`
- [ ] **HARD:** `text` is 160 characters or fewer
- [ ] **HARD:** `trigger` is a valid trigger enum
- [ ] **HARD:** Character partition: smuggler lines in smuggler files, detective in detective files
- [ ] **SOFT:** Under 25 words (or the most important line in the pool if over)
- [ ] **SOFT:** Self-contained (makes sense without context from previous line)
- [ ] **SOFT:** Voice register matches character (smuggler fragments, detective sentences)
- [ ] **SOFT:** Prerequisites gate on MINIMUM confidence needed (don't over-gate)
- [ ] **SOFT:** Trigger matches content (don't use `enter_location` for NPC observations)
### NPC Profiles
- [ ] **HARD:** `canonical_id` matches `npc:{slug}` pattern
- [ ] **HARD:** `tier` is 1, 2, or 3
- [ ] **HARD:** `pattern` is a valid pattern enum
- [ ] **HARD:** `motivation` is a valid motivation enum
- [ ] **HARD:** FRIEND pattern requires `friend_arc` field
- [ ] **SOFT:** All 10 axes populated for Tier 1 and 2 (optional fields for Tier 3)
- [ ] **SOFT:** `tells` array empty for MIRROR pattern
- [ ] **SOFT:** `dual_lens` notes present for Tier 1 and 2
- [ ] **SOFT:** `trust_levels` descriptions provided for all populated tiers
- [ ] **SOFT:** `information.knows` uses valid `category.topic` fact IDs
### Content Packs (Per NPC)
- [ ] **SOFT:** Line count within tier budget
- [ ] **SOFT:** Access tier distribution covers the NPC's expected encounters
- [ ] **SOFT:** Trust progression has content at each populated tier
- [ ] **SOFT:** Situation coverage: not everything tagged `routine`
- [ ] **SOFT:** Dual-lens notes on profile and every 5th line minimum (Tier 1)
- [ ] **SOFT:** FRIEND content covers all phases with distinct voice/mood shifts
- [ ] **SOFT:** Monologue for BOTH characters exists (Tier 1 minimum)
---
## 13. File Structure and Schema Reference
### Directory Hierarchy
Dialogue is organized by **location + role**, not by NPC. This is deliberate — roles belong to templates, NPCs fill roles at runtime (D-025, D-028). Monologue is organized by **character + location** per the hard partition rule (D-032).
```
content/campaigns/main/systems/krenn/stations/sova/districts/transit/
district.yaml # District metadata
pools.yaml # Seed-time pool definitions
npcs/
kael-davan.yaml # NPC profile (npc-profile.schema.json)
sera-venn.yaml
voss.yaml
...
locations/
the-terminal.yaml # Location definition (location.schema.json)
the-last-shift.yaml
maintenance-corridors.yaml
dialogue/
the-terminal/ # Dialogue pools by location + role
dock-worker.yaml # (dialogue-pool.schema.json)
shift-supervisor.yaml
scheduler.yaml
new-hire.yaml
courier.yaml
the-last-shift/
bar-owner.yaml
bar-regular.yaml
bartender.yaml
maintenance-corridors/
ring-operative.yaml
monologue/
smuggler/ # Hard character partition (D-032)
general.yaml # Location-independent lines
the-terminal.yaml # Location-specific lines
the-last-shift.yaml
maintenance-corridors.yaml
detective/
general.yaml
the-terminal.yaml
the-last-shift.yaml
maintenance-corridors.yaml
triangles/
hub-power.yaml # Triangle definition (triangle.schema.json)
worried-knowledge.yaml
bar-tensions.yaml
worried-partner.yaml
informant-question.yaml
routines/
schedules.yaml # NPC daily schedules (routine.schema.json)
templates/
logistics-hub.yaml # Social site template (D-025)
bar.yaml
smuggling-ring.yaml
ticker/
the-last-shift.yaml # News ticker content
```
**Key convention:** Dialogue pools belong to `dialogue/{location}/{role}.yaml`, never `dialogue/{npc-name}.yaml`. The NPC assigned to a role is determined at runtime. FRIEND NPCs (Kael, Sera) are the exception — their content is NPC-specific because the FRIEND pattern is inherently character-bound, but the files still follow the location+role structure to maintain consistency.
### Schema Validation
All YAML content files must validate against their JSON Schema:
| Content Type | Schema File |
|-------------|-------------|
| NPC profiles | `content/_schema/npc-profile.schema.json` |
| Dialogue pools | `content/_schema/dialogue-pool.schema.json` |
| Monologue pools | `content/_schema/monologue-pool.schema.json` |
| Triangles | `content/_schema/triangle.schema.json` |
| Routines | `content/_schema/routine.schema.json` |
### Line ID Convention
| Content Type | Pattern | Example |
|-------------|---------|---------|
| Dialogue | `{location}_d_{###}` | `transit_d_044` |
| Monologue (smuggler) | `{location}_m_s_{###}` | `transit_m_s_011` |
| Monologue (detective) | `{location}_m_d_{###}` | `transit_m_d_042` |
IDs are stable identifiers. Once assigned, never reused or reassigned. Number gaps are acceptable.
### Naming Conventions
- File names: `lowercase-hyphenated.yaml`
- Role slugs: `lowercase-hyphenated` (e.g., `dock-worker`, `bar-owner`)
- NPC slugs: `lowercase-hyphenated` (e.g., `kael-davan`, `sera-venn`)
- Location slugs: `lowercase-hyphenated` (e.g., `sova-transit`)
- Fact IDs: `category.topic` (e.g., `contraband.ring_exists`, `relationship.kael_naia_connection`)
---
## 14. Anti-Patterns
### Dialogue Anti-Patterns
**Expository NPC.** The NPC explains the world to the player.
- Bad: *"The Commission regulates all trade through Sova Transit. Manifests must be filed within 8 hours."*
- Fix: *"Manifests are late again. Maret's going to catch heat."* (Character knows the rules. Show the consequence, not the rule.)
**Universal access.** A line tagged `[public]` contains insider information.
- Bad: `access: [public]`, text: *"Container 4471 is flagged for rerouting during transition."*
- Fix: Tag `access: [insider]` or rewrite for public consumption.
**Trust mismatch.** A `surface`-trust line reveals deep personal information.
- Bad: `trust: surface`, text: *"I'm trying to get out of the ring. Don't tell Nils."*
- Fix: That's `trust: secret` content. Gate it correctly.
**Crime vocabulary.** NPCs use the word "crime" or "smuggling" in casual conversation.
- Bad: *"The smuggling operation runs during shift transitions."*
- Fix: *"The cargo moves during transitions. When oversight's thin."* NPCs think in their own terms.
### Monologue Anti-Patterns
**Wrong voice register.** Smuggler uses detective vocabulary or vice versa.
- Bad (smuggler): *"I should investigate this anomaly further."*
- Fix: *"That's not right. I need to see what's going on."*
- Bad (detective): *"Kael's here. Good."*
- Fix: *"Davan's on shift. Standard."*
**Explaining the already-known.** Character tells themselves something they already know.
- Bad (smuggler): *"According to the manifest, container 4471 should weigh 240 kilograms."*
- Fix: *"4471's heavy. Too heavy."*
**Over-gating.** Prerequisite blocks a line that would work without the gate.
- Bad: prerequisite requires `knows_details` when the line only needs `suspects`
- Fix: Gate on minimum confidence. More fires = more content = better experience.
**Breaking the partition.** A smuggler monologue line that sounds like the detective, or shared content between pools.
- Rule: If you can swap `character: smuggler` to `character: detective` and the line still works, it's not character-specific enough. Rewrite.
### Profile Anti-Patterns
**MIRROR with tells.** A MIRROR NPC profile lists deception tells.
- Rule: MIRROR tells array must be empty. Behavioral markers (visible stress, coping mechanisms) are NOT tells.
**FRIEND without phases.** A FRIEND NPC profile omits the `friend_arc.phases` field.
- Rule: FRIEND pattern requires 3-5 phases with distinct triggers and routine deviations.
**Tier 3 overwriting.** A Tier 3 filler NPC with 40 dialogue lines.
- Rule: Tier 3 budget is 5-10 lines. One memorable trait. Write it, stop. Content budget is finite.
---
## 15. Generation Expansion Rules
Tier 2 and Tier 3 dialogue is expanded 4x from authored base lines (D-028: "write 10, generate 40"). The authored lines are the style anchors — generation must reproduce, not reinvent.
### What Generation Can Do
- **Vary phrasing** of the same semantic content ("Shift's running smooth" -> "Smooth shift so far" -> "Nothing out of the ordinary today")
- **Vary topic/mood tags** within the same access and trust tier
- **Combine** elements from two base lines into a single generated line
- **Add** environmental color within the Sova sensory palette (span gate hum, recycled air, cargo sounds)
### What Generation Cannot Do
- **Introduce new information.** Generated lines never reveal facts, names, or relationships not present in the base lines.
- **Change access or trust tier.** A generated line inherits the access and trust constraints of its base line(s).
- **Break voice register.** Generated lines must match the NPC's personality voice exactly — sentence length, contraction patterns, vocabulary level.
- **Cross the character partition.** Generated monologue lines stay in the correct character pool.
- **Add knowledge grants.** Only hand-authored lines can grant knowledge to the player.
- **Create FRIEND content.** All FRIEND NPC content is hand-authored. No generation expansion.
### Generation Validation
Every generated line must pass:
1. **Voice test:** Read aloud. Does it sound like the same NPC who said the base lines?
2. **Dual-lens test:** Does it read differently through each character's perspective? (If the base line passes this test, the generated line must also.)
3. **Tag inheritance:** Are access, trust, situation, topic, and mood tags consistent with the base line?
4. **No new information:** Does the line reveal anything the base lines don't already establish?
5. **Display constraint:** Under 160 characters for monologue. Self-contained.
---
## 16. Worked Example: Writing a Dialogue Line
**Context:** Writing a line for Kael Davan at the Logistics Hub during a routine morning shift.
### Step 1: Write the Line
*"Morning. Voss kept the rotation thin -- we've got a clear window after 14:00."*
### Step 2: Assign Tags
```yaml
- id: transit_d_071
text: "Morning. Voss kept the rotation thin -- we've got a clear window after 14:00."
role: dock-worker
access: [insider]
trust: real
situation: [shift_start]
topic: [cargo, routine]
mood: [comfortable]
tags: [ring-operational]
```
### Step 3: Validate
- `id`: `transit_d_071` -- valid pattern.
- `role`: `dock-worker` -- valid slug.
- `access: [insider]` -- only ring members hear this. Detective never sees it. Correct.
- `trust: real` -- requires earned trust. Not surface-level small talk. Correct for operational ring dialogue.
- `situation: [shift_start]` -- morning shift context. Correct.
- `topic: [cargo, routine]` -- covers both operational and schedule content. Correct.
- `mood: [comfortable]` -- Phase 1, baseline warm. Correct.
### Step 4: Dual-Lens Check
```yaml
dual_lens:
smuggler: "Operational confirmation. The window is clear. Routine ring coordination."
detective: "Never hears this line. Insider access only."
```
### Step 5: Voice Check
- Uses first name (Voss). Correct for smuggler context.
- Short, operational. Fragment + sentence. Matches smuggler's colleague register.
- Trade jargon without explanation ("rotation thin," "clear window"). Correct for Krenn substrate.
- No institutional vocabulary. No analysis. Correct.
Line passes all checks.
---
## Appendix A: Decision Cross-Reference
| Decision | Title | Relevance to This Guide |
|----------|-------|------------------------|
| D-023 | Three-tier content model | Tier structure, content budgets |
| D-024 | 10-axis NPC model | Profile structure, tell system, triangle model |
| D-025 | Social site as template unit | NPC-to-location relationship, functional clusters |
| D-027 | Vertical slice criteria | Success criteria that FRIEND content must satisfy |
| D-028 | Dialogue architecture | Four-layer pipeline, tagged line pools, generation expansion |
| D-029 | Population entanglement 30/50/20 | Tier distribution, noise floor |
| D-032 | Separate monologue pools | Hard character partition |
| D-034 | THE FRIEND pattern | Production-level NPC specification |
| D-035 | Converged tag taxonomy | All tag definitions, pipeline layers |
| D-036 | Sova Transit District setting | Regional culture, naming, atmosphere |
| D-037 | Contraband specification | What NPCs are smuggling and why |
| D-039 | v0.1 wow moments | Content that must exist for wow moments to fire |
| D-041 | Knowledge graph data model | Prerequisite confidence hierarchy |
| D-047 | v0.1 triangles | 3 active forks, 2 passive tensions |
| D-050 | NPC pattern/motivation mapping | Canonical v0.1 NPC assignments (System A + B) |
| D-053 | Self-contained triangle forks | No cross-triangle cascade in v0.1 |
| D-056 | PC voice registers | Smuggler feeling-first, detective analysis-first |
| D-059 | Monologue display constraints | 160 char max, 2-line max, priority ordering |
## Appendix B: Content Budget Summary (v0.1)
**Validated scope (v0.1 Content Scoping Workshop):** ~695 authored content items.
| Content Type | Authored | Generation-Expanded | Total |
|-------------|---------|-------------------|-------|
| Tier 1 FRIEND dialogue (x2) | 150-200 | 0 | 150-200 |
| Tier 1 MIRROR dialogue (x1) | 50-70 | 0 | 50-70 |
| Tier 2 NPC dialogue (x10) | 200-350 | 800-1400 | 1000-1750 |
| Tier 3 NPC dialogue (x4) | 20-40 | 80-160 | 100-200 |
| Monologue (smuggler pool) | ~100 | 0 | ~100 |
| Monologue (detective pool) | ~100 | 0 | ~100 |
| Environmental text | ~50 | 0 | ~50 |
| News ticker | ~20 | 0 | ~20 |
| UI microcopy | ~50 | 0 | ~50 |
| PC-as-NPC content (x2) | ~25 | 0 | ~25 |
| **Total authored** | **~695-1005** | | |
| **Total with generation** | | | **~1545-2565** |
FRIEND content (hand-authored, no expansion) represents ~20-30% of all authored lines. This is where voice consistency matters most. Monologue is hand-authored only — the character voice is too precise for generation expansion in v0.1.
---
**End NPC Authoring Style Guide v0.1**
@@ -0,0 +1,128 @@
# Kael Davan — THE FRIEND (Smuggler)
# Dialogue at Maintenance Corridors (Restricted Access)
# Ticket: #297 | Sprint: 5 | Tier 1 FRIEND NPC
# Voice: direct, practical, short sentences, first names, warm to trusted people
# Context: restricted maintenance corridors. High-stakes, operational, no warmth.
# This is where the contradiction surfaces (Phase 3-4 of the FRIEND arc).
location: maintenance-corridors
role: dock-worker
lines:
# ========================================
# RING OPERATIONS — corridor handoffs
# ========================================
- id: maintenance-corridors_d_001
text: "Package is in the junction locker. Renn picks it up in ten."
role: dock-worker
access: [insider]
trust: real
situation: [shift_transition]
mood: [focused]
topic: [cargo]
tags: [kael, ring-ops, renn, operational]
- id: maintenance-corridors_d_002
text: "B-7 is clear. Camera cycles in forty seconds — move fast."
role: dock-worker
access: [insider]
trust: real
situation: [shift_transition]
topic: [cargo, danger]
tags: [kael, ring-ops, operational]
knowledge_grant:
fact_id: investigation.surveillance_gaps
confidence: knows_details
- id: maintenance-corridors_d_003
text: "Chalk marks are fresh. Renn came through already. We're on schedule."
role: dock-worker
access: [insider]
trust: real
situation: [routine]
mood: [comfortable]
topic: [cargo]
tags: [kael, ring-ops, renn, operational]
- id: maintenance-corridors_d_004
text: "Don't use the C-section hatch tonight. Maintenance crew's working late."
role: dock-worker
access: [insider]
trust: real
situation: [routine]
mood: [concerned]
topic: [danger, cargo]
tags: [kael, ring-ops, operational, caution]
# ========================================
# CAUGHT — contradiction scene (Phase 3-4)
# When the smuggler finds Kael with the unknown contact
# ========================================
- id: maintenance-corridors_d_005
text: "What are you — wait. How long have you been standing there?"
role: dock-worker
access: [insider]
trust: surface
situation: [confrontation]
mood: [concerned]
topic: [danger]
tags: [kael, contradiction, phase-3]
- id: maintenance-corridors_d_006
text: "That was nobody. Maintenance contact. It's handled."
role: dock-worker
access: [insider]
trust: surface
situation: [confrontation]
mood: [concerned]
topic: [routine]
tags: [kael, deflection, lying, phase-4]
- id: maintenance-corridors_d_007
text: "I don't have to explain every conversation I have. Drop it."
role: dock-worker
access: [insider]
trust: surface
situation: [confrontation]
mood: [concerned]
topic: [trust]
tags: [kael, deflection, hostile-path, phase-4]
# ========================================
# SECRET — corridor confessions
# ========================================
- id: maintenance-corridors_d_008
text: "I'm trying to get out. That's all. I just want out."
role: dock-worker
access: [insider]
trust: secret
situation: [confrontation, alone]
mood: [conflicted]
topic: [personal, trust]
tags: [kael, confession, phase-5]
- id: maintenance-corridors_d_009
text: "Nils will kill me if he finds out. You know that. You know him."
role: dock-worker
access: [insider]
trust: secret
situation: [confrontation, alone]
mood: [worried]
topic: [danger, trust]
tags: [kael, confession, nils, phase-5]
- id: maintenance-corridors_d_010
text: "I found someone who can get me new papers. Off-station. Clean break."
role: dock-worker
access: [insider]
trust: secret
situation: [alone]
mood: [conflicted]
topic: [personal]
tags: [kael, confession, phase-5]
knowledge_grant:
fact_id: knowledge.kael_exit_plan
confidence: knows_details
@@ -0,0 +1,181 @@
# Kael Davan — THE FRIEND (Smuggler)
# Dialogue at The Last Shift (District Bar)
# Ticket: #297 | Sprint: 5 | Tier 1 FRIEND NPC
# Voice: direct, practical, short sentences, first names, warm to trusted people
# Context: off-shift social space. Kael is looser here — still guarded, but warmer.
location: the-last-shift
role: dock-worker
lines:
# ========================================
# SOCIAL — off-shift casual
# ========================================
- id: the-last-shift_d_001
text: "Saved you a seat. Lera's got the spiced rice tonight."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [bar_evening, social, arrival]
mood: [fond]
topic: [personal, colleague]
tags: [kael, greeting, phase-1]
- id: the-last-shift_d_002
text: "First round's mine. Don't argue — you covered me last week."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [bar_evening, social]
mood: [fond]
topic: [personal]
tags: [kael, social, phase-1]
- id: the-last-shift_d_003
text: "Voss tried to dock my overtime again. Lera told him off. Wish I'd seen it."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [bar_evening, social]
mood: [comfortable]
topic: [colleague, routine]
tags: [kael, humor, voss, lera]
- id: the-last-shift_d_004
text: "Torek's holding court at the bar again. How does he afford to drink like that?"
role: dock-worker
access: [insider, peer]
trust: surface
situation: [bar_evening, social]
mood: [comfortable]
topic: [colleague]
tags: [kael, observational, torek]
knowledge_grant:
fact_id: investigation.torek_spending_pattern
confidence: suspects
- id: the-last-shift_d_005
text: "Quiet night. I like these ones. No drama, just people winding down."
role: dock-worker
access: [peer]
trust: surface
situation: [bar_evening, social]
mood: [comfortable]
topic: [personal]
tags: [kael, atmospheric]
- id: the-last-shift_d_006
text: "Lera asked about my overtime schedule. Told her I'm trying to cut back."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [bar_evening, social]
mood: [comfortable]
topic: [personal, routine]
tags: [kael, casual, lera]
# ========================================
# NAIA REFERENCES — personal, unprompted
# ========================================
- id: the-last-shift_d_007
text: "Naia's meeting me here after her shift. Try not to embarrass me."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [bar_evening, social]
mood: [fond]
topic: [personal]
tags: [kael, unprompted, naia-reference]
- id: the-last-shift_d_008
text: "Naia wants to plan a trip. Off-station. Somewhere with actual sky. Sounds expensive."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [bar_evening, social]
mood: [fond]
topic: [personal]
tags: [kael, unprompted, naia-reference]
- id: the-last-shift_d_009
text: "She worries. I tell her it's just dock work. She doesn't buy it anymore."
role: dock-worker
access: [insider]
trust: real
situation: [bar_evening, social, alone]
mood: [conflicted]
topic: [personal, trust]
tags: [kael, naia-reference, vulnerability]
# ========================================
# RING OPS — bar context, trust-gated
# ========================================
- id: the-last-shift_d_010
text: "Nils wants to talk. Tomorrow, bay side. Said it's about volume."
role: dock-worker
access: [insider]
trust: real
situation: [bar_evening, social]
mood: [concerned]
topic: [danger]
tags: [kael, ring-ops, nils]
- id: the-last-shift_d_011
text: "Keep it light tonight. Torek's listening and he doesn't know when to stop."
role: dock-worker
access: [insider]
trust: real
situation: [bar_evening, social]
mood: [concerned]
topic: [danger, colleague]
tags: [kael, ring-ops, torek, caution]
- id: the-last-shift_d_012
text: "Lera knows more than she lets on. She won't say anything — but don't test it."
role: dock-worker
access: [insider]
trust: real
situation: [bar_evening, social, alone]
mood: [concerned]
topic: [colleague, danger]
tags: [kael, ring-ops, lera, caution]
knowledge_grant:
fact_id: knowledge.bar_ring_awareness
confidence: suspects
# ========================================
# POST-CONTRADICTION — at the bar, damaged trust
# ========================================
- id: the-last-shift_d_013
text: "I saved your seat. ...Force of habit."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [bar_evening, social]
mood: [conflicted]
topic: [personal]
tags: [kael, contaminated-trust, phase-5]
- id: the-last-shift_d_014
text: "Naia keeps asking why I'm quiet. I told her work stress. Not wrong."
role: dock-worker
access: [insider]
trust: real
situation: [bar_evening, social]
mood: [conflicted]
topic: [personal]
tags: [kael, contaminated-trust, naia-reference, phase-5]
- id: the-last-shift_d_015
text: "We're good, right? You and me. We're still good."
role: dock-worker
access: [insider]
trust: surface
situation: [bar_evening, social]
mood: [worried]
topic: [trust, personal]
tags: [kael, vulnerability, phase-5]
@@ -0,0 +1,38 @@
# PC-as-NPC: The Detective (NPC mode, seen by smuggler player)
# Dialogue at The Last Shift (District Bar)
# Ticket: #401 | Sprint: 5 | PC-as-NPC content
# Voice: professional, measured, slightly less formal in social setting
# Context: public-tier only. The detective-NPC is off-duty, sitting with Sera.
# Slightly more human than at the hub, but still institutional.
location: the-last-shift
role: commission-liaison
lines:
- id: the-last-shift_d_204
text: "Good evening. Off the clock, more or less. Enjoying the local hospitality."
role: commission-liaison
access: [public]
trust: surface
situation: [bar_evening, greeting]
mood: [comfortable]
topic: [personal]
tags: [pc-detective, greeting, public-tier]
- id: the-last-shift_d_205
text: "Ms. Venn recommended the ale. She was right. This district has its charms."
role: commission-liaison
access: [public]
trust: surface
situation: [bar_evening, social]
topic: [routine, colleague]
tags: [pc-detective, social, public-tier, sera]
- id: the-last-shift_d_206
text: "Just unwinding. The review can wait until morning. Have a good evening."
role: commission-liaison
access: [public]
trust: surface
situation: [bar_evening, confrontation]
topic: [routine]
tags: [pc-detective, deflection, public-tier]
@@ -0,0 +1,39 @@
# PC-as-NPC: The Smuggler (NPC mode, seen by detective player)
# Dialogue at The Last Shift (District Bar)
# Ticket: #401 | Sprint: 5 | PC-as-NPC content
# Voice: casual, guarded, short sentences, contractions always
# Context: public-tier only. The smuggler-NPC is off-shift, drinking with Kael.
# More relaxed than at the hub, but still guarded around Commission.
location: the-last-shift
role: dock-worker
lines:
- id: the-last-shift_d_201
text: "Evening. Just having a drink with friends. Can I help you?"
role: dock-worker
access: [public]
trust: surface
situation: [bar_evening, greeting]
mood: [comfortable]
topic: [personal]
tags: [pc-smuggler, greeting, public-tier]
- id: the-last-shift_d_202
text: "Lera's ale is the one good thing about a ten-hour shift. Don't let anyone tell you different."
role: dock-worker
access: [public]
trust: surface
situation: [bar_evening, social]
mood: [comfortable]
topic: [routine]
tags: [pc-smuggler, social, public-tier]
- id: the-last-shift_d_203
text: "Off the clock, thanks. Whatever it is, it can wait until morning."
role: dock-worker
access: [authority]
trust: surface
situation: [bar_evening, confrontation]
topic: [routine]
tags: [pc-smuggler, deflection, public-tier]
@@ -0,0 +1,642 @@
# FRIEND Content Pack: Sera Venn — Detective's FRIEND
# Ticket: #298 | Sprint: 5
# Author: Paula (profile + relationship arc), Mellanie (voice validation)
# Pattern: FRIEND + WITNESS | Bonded: detective
# Location: The Last Shift (bar)
# Arc: trust > background data > pattern > question > contaminated trust
#
# Content breakdown (dialogue — this file):
# Greeting pool: 8 lines
# Routine/social dialogue: 10 lines
# Trust-gated dialogue: 18 lines (6 surface, 7 real, 5 secret)
# Unprompted disclosure: 6 lines
# Contradiction/deflection: 8 lines
# Post-discovery dialogue: 5 lines
# Subtotal: 55 dialogue lines
#
# Monologue (in monologue/detective/the-last-shift.yaml, _m_d_031-042):
# Detective tell observations: 4 lines
# Detective post-conversation reflections: 3 lines
# Detective arc phase transitions: 3 lines
# Detective contaminated trust reactions: 2 lines
# Subtotal: 12 detective monologue lines
#
# Monologue (in monologue/smuggler/the-last-shift.yaml, _m_s_031-038):
# Smuggler dual-lens observations: 8 lines
# Subtotal: 8 smuggler monologue lines
#
# FRIEND pack total: 75 authored lines
location: the-last-shift
role: bar-regular
lines:
# ============================================================
# GREETING POOL (8 lines)
# Phase 1-2: warm, welcoming, peer-level
# Phase 3-5: same warmth, but the detective is now watching
# ============================================================
- id: the-last-shift_d_101
text: "There you are. Grab a seat -- Lera's doing that thing with the grain spirit again. Don't ask, just trust me and order the ale."
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening, social]
topic: [personal]
mood: [fond, comfortable]
tags: [greeting, phase-1, establishes-warmth]
- id: the-last-shift_d_102
text: "Corner booth's free. I saved it -- force of habit."
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening, arrival]
topic: [personal]
mood: [fond]
tags: [greeting, phase-1, spatial-anchor]
- id: the-last-shift_d_103
text: "You look like you've been reading manifests all day. Sit. I'll get you something that isn't recycled air."
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening, social]
topic: [personal, routine]
mood: [fond, comfortable]
tags: [greeting, phase-1-2]
- id: the-last-shift_d_104
text: "Evening. Same booth, same drink?"
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening, arrival]
topic: [routine]
mood: [comfortable]
tags: [greeting, phase-2-5, repeatable]
- id: the-last-shift_d_105
text: "Good timing. Naia was here earlier -- you just missed her."
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening, social]
topic: [colleague, personal]
mood: [comfortable]
tags: [greeting, phase-2, naia-reference]
- id: the-last-shift_d_106
text: "Grab a seat. Quiet night so far -- Lera's in a good mood, which means the ale's fresh."
role: bar-regular
access: [peer, public]
trust: surface
situation: [bar_evening, social]
topic: [routine]
mood: [comfortable]
tags: [greeting, phase-1-3]
- id: the-last-shift_d_107
text: "Hey. Long day?"
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening, arrival]
topic: [personal]
mood: [concerned]
tags: [greeting, phase-3-5, post-pattern, shorter]
- id: the-last-shift_d_108
text: "Same time, same place. You're becoming a regular."
role: bar-regular
access: [peer, public]
trust: surface
situation: [bar_evening, arrival]
topic: [routine, personal]
mood: [comfortable]
tags: [greeting, phase-2-3]
# ============================================================
# ROUTINE / SOCIAL DIALOGUE (10 lines)
# What Sera says during normal bar evenings
# ============================================================
- id: the-last-shift_d_110
text: "The Last Shift. Official name. Everyone calls it Lera's, though. Eighteen years behind that counter."
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening, social]
topic: [routine, colleague]
mood: [comfortable]
tags: [orientation, district-background]
- id: the-last-shift_d_111
text: "See the card game in the corner? That's Harek's table. Security officer, off-duty. Harmless -- just loud."
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening, social]
topic: [colleague]
mood: [comfortable]
tags: [orientation, npc-introduction]
- id: the-last-shift_d_112
text: "Most of the after-shift crowd comes from the Terminal. Dock workers, scheduler types. They drink hard and leave early."
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening, social]
topic: [routine, colleague]
mood: [comfortable]
tags: [orientation, district-background]
- id: the-last-shift_d_113
text: "Sova's not bad, once you know the rhythms. Shift change is when things move. Between shifts is when you can breathe."
role: bar-regular
access: [peer]
trust: surface
situation: [social]
topic: [routine]
mood: [comfortable]
tags: [setting-atmosphere]
- id: the-last-shift_d_114
text: "I do lattice calibration, mostly. Commission-standard equipment checks. Relay nodes, terminal diagnostics. Exciting stuff."
role: bar-regular
access: [peer]
trust: surface
situation: [social]
topic: [routine, institution]
mood: [comfortable]
tags: [self-introduction, institutional-background]
- id: the-last-shift_d_115
text: "I transferred here fourteen months ago. Border-system relay posting before this. Sova was supposed to be the quiet one."
role: bar-regular
access: [peer]
trust: surface
situation: [social]
topic: [personal, institution]
mood: [comfortable]
tags: [backstory, phase-1]
- id: the-last-shift_d_116
text: "Lera remembers every regular's order. Eighteen years of that. Don't ask how she does it -- she'll just pour you one and prove it."
role: bar-regular
access: [peer, public]
trust: surface
situation: [bar_evening, social]
topic: [colleague]
mood: [fond]
tags: [community-texture]
- id: the-last-shift_d_117
text: "The shift crowd clears out by 19:00. After that it's just us -- regulars, a few stragglers. The good hours."
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening]
topic: [routine]
mood: [comfortable]
tags: [setting-atmosphere, routine]
- id: the-last-shift_d_118
text: "You adapting to station gravity yet? Point-nine-three standard takes a week to stop noticing."
role: bar-regular
access: [peer]
trust: surface
situation: [social]
topic: [personal]
mood: [comfortable]
tags: [setting-detail, phase-1]
- id: the-last-shift_d_119
text: "I like this booth. Corner. You can see the door and the bar. Force of institutional habit, I suppose."
role: bar-regular
access: [peer]
trust: surface
situation: [social, bar_evening]
topic: [personal]
mood: [comfortable]
tags: [spatial-anchor, character-detail]
# ============================================================
# TRUST-GATED DIALOGUE (18 lines)
# Surface (6): what Sera tells acquaintances
# Real (7): what Sera shares with trusted friends
# Secret (5): the concealment, the evidence, the desperation
# ============================================================
# --- Surface trust ---
- id: the-last-shift_d_120
text: "The Commission runs maintenance checks quarterly. I handle the field side -- equipment calibration, relay diagnostics. Standard."
role: bar-regular
access: [peer, authority]
trust: surface
situation: [social]
topic: [institution, routine]
mood: [comfortable]
tags: [institutional-background]
- id: the-last-shift_d_121
text: "Naia teaches the station kids. Primary education, mostly. She's good at it -- patient. The kids adore her."
role: bar-regular
access: [peer]
trust: surface
situation: [social, bar_evening]
topic: [colleague, personal]
mood: [fond]
tags: [naia-reference, phase-2]
- id: the-last-shift_d_122
text: "The district runs on freight. Terminal handles most of it -- container processing, manifest filing. Bread and butter."
role: bar-regular
access: [peer, public]
trust: surface
situation: [social]
topic: [routine]
mood: [comfortable]
tags: [district-context]
- id: the-last-shift_d_123
text: "I don't know the dock workers well. I'm Commission, they're logistics. Different worlds, same station."
role: bar-regular
access: [peer, authority]
trust: surface
situation: [social, investigation]
topic: [colleague, institution]
mood: [comfortable]
tags: [deflection-surface, distance-from-hub]
- id: the-last-shift_d_124
text: "Most people here are decent. Working shifts, paying bills, coming to Lera's. It's a community."
role: bar-regular
access: [peer, public]
trust: surface
situation: [social]
topic: [colleague, personal]
mood: [comfortable]
tags: [community-framing]
- id: the-last-shift_d_125
text: "I can look things up if you need. Commission terminals access compliance records, shift logs, equipment histories. Part of the job."
role: bar-regular
access: [peer, authority]
trust: surface
situation: [social]
topic: [institution]
mood: [comfortable]
tags: [information-offer, phase-2, overcompensation-seed]
# --- Real trust ---
- id: the-last-shift_d_130
text: "Naia's been worried lately. About Kael -- her partner. He's a dock worker at the Terminal. Late nights, evasive answers. She confided in me."
role: bar-regular
access: [peer]
trust: real
situation: [social, bar_evening]
topic: [colleague, personal, trust]
mood: [concerned]
tags: [naia-kael-link, phase-2, critical-information]
knowledge_grant:
fact_id: "relationship.kael_naia_connection"
confidence: "knows_of"
- id: the-last-shift_d_131
text: "The Commission kiosk on Level 3 logs every compliance check. If someone ran an unauthorized scan, it would show up there. Hypothetically."
role: bar-regular
access: [peer, authority]
trust: real
situation: [social]
topic: [institution, investigation]
mood: [analytical]
tags: [institutional-access, phase-2-3, self-incriminating-hint]
- id: the-last-shift_d_132
text: "I worry about Naia. She doesn't deserve whatever's happening. She just wants Kael to come home at a reasonable hour."
role: bar-regular
access: [peer]
trust: real
situation: [social, bar_evening]
topic: [personal, trust]
mood: [concerned, conflicted]
tags: [motivation-reveal, phase-2-3]
- id: the-last-shift_d_133
text: "Compliance data goes back eighteen months on the Commission systems. Anyone with field-tech access could cross-reference shift records with manifest filings."
role: bar-regular
access: [peer, authority]
trust: real
situation: [social]
topic: [institution, investigation]
mood: [analytical]
tags: [institutional-capability, overcompensation, phase-3-4]
knowledge_grant:
fact_id: "investigation.manifest_discrepancy"
confidence: "suspects"
- id: the-last-shift_d_134
text: "I'm not an investigator. I calibrate equipment and file reports. But I notice things. Patterns in the data, mostly."
role: bar-regular
access: [peer]
trust: real
situation: [social]
topic: [institution, personal]
mood: [analytical]
tags: [self-awareness, capability-reveal]
- id: the-last-shift_d_135
text: "You know me. I wouldn't sit on something if I thought it mattered. But not everything that looks irregular IS irregular."
role: bar-regular
access: [peer]
trust: real
situation: [social, investigation]
topic: [trust]
mood: [conflicted]
tags: [deflection-real-tier, phase-4, the-lie]
- id: the-last-shift_d_136
text: "Some of the regulars here have hard lives. Grey economy, tight margins. I'm not judging. I'm just a field tech who likes the ale."
role: bar-regular
access: [peer]
trust: real
situation: [bar_evening, social]
topic: [money, personal]
mood: [conflicted]
tags: [moral-position, community-loyalty]
# --- Secret trust ---
- id: the-last-shift_d_140
text: "I ran a compliance check. Unauthorized. Six weeks ago. Naia was so worried about Kael -- I thought I could help. I found manifest discrepancies tied to his shifts."
role: bar-regular
access: [peer]
trust: secret
situation: [alone, social]
topic: [investigation, trust, personal]
mood: [conflicted]
tags: [confession, phase-5, critical-reveal]
knowledge_grant:
fact_id: "investigation.manifest_discrepancy"
confidence: "knows_details"
- id: the-last-shift_d_141
text: "If I report it, Naia's life falls apart. Kael gets investigated. Maybe arrested. She didn't ask me to find this. I did it on my own."
role: bar-regular
access: [peer]
trust: secret
situation: [alone, social]
topic: [personal, trust, institution]
mood: [conflicted]
tags: [motivation-confession, phase-5]
- id: the-last-shift_d_142
text: "The irregularities correlate with Torek Lintar's inspection shifts. That's why I can't -- I can't be near him. He doesn't know I know."
role: bar-regular
access: [peer]
trust: secret
situation: [alone]
topic: [investigation, danger]
mood: [worried, conflicted]
tags: [torek-link, avoidance-explanation, phase-5]
knowledge_grant:
fact_id: "investigation.shift_mismatch"
confidence: "knows_details"
- id: the-last-shift_d_143
text: "I don't know what you're looking for. I told you everything I know. If you're asking whether I'm hiding something -- I'm a field tech, not an analyst."
role: bar-regular
access: [peer, authority]
trust: secret
situation: [investigation, confrontation]
topic: [trust, investigation]
mood: [suspicious, conflicted]
tags: [denial-under-pressure, phase-4-5, the-wall]
- id: the-last-shift_d_144
text: "Every tip I gave you was real. The district background, the shift patterns, the regulars. I didn't steer you wrong. I just... didn't give you everything."
role: bar-regular
access: [peer]
trust: secret
situation: [alone, social]
topic: [trust, personal]
mood: [conflicted]
tags: [retrospective-confession, phase-5, emotional-payload]
# ============================================================
# UNPROMPTED DISCLOSURE (6 lines)
# Trust + mood weighted — Sera volunteers information
# Phase 1-2: genuinely helpful. Phase 3-5: overcompensation.
# ============================================================
- id: the-last-shift_d_150
text: "Oh -- before I forget. The dock scheduler, Maret? She's sharp. If you need freight records context, she's the one to ask."
role: bar-regular
access: [peer]
trust: surface
situation: [social, bar_evening]
topic: [colleague, investigation]
mood: [comfortable]
tags: [unprompted, genuine-help, phase-1-2]
knowledge_grant:
fact_id: "relationship.trust_network"
confidence: "suspects"
- id: the-last-shift_d_151
text: "I checked the relay calibration logs for the Terminal this morning. Nothing flagged. But the data throughput was higher than standard -- more manifests processed than usual."
role: bar-regular
access: [peer, authority]
trust: real
situation: [social]
topic: [institution, cargo]
mood: [analytical]
tags: [unprompted, overcompensation, phase-3-4]
- id: the-last-shift_d_152
text: "I asked around -- quietly -- about the shift rotation schedule. Voss has been adjusting it more than usual this cycle. Might mean nothing."
role: bar-regular
access: [peer]
trust: real
situation: [social, bar_evening]
topic: [routine, investigation]
mood: [analytical, concerned]
tags: [unprompted, overcompensation, phase-3-4]
- id: the-last-shift_d_153
text: "The maintenance corridor access logs are Commission-maintained. I can pull them if you need. Just say the word."
role: bar-regular
access: [peer, authority]
trust: real
situation: [social]
topic: [institution, investigation]
mood: [comfortable]
tags: [unprompted, information-offer, overcompensation, phase-3-5]
- id: the-last-shift_d_154
text: "Naia mentioned Kael came home late again last night. Third time this week. She's trying not to make it a thing."
role: bar-regular
access: [peer]
trust: real
situation: [social, bar_evening]
topic: [personal, colleague]
mood: [concerned]
tags: [unprompted, naia-worry, phase-2-3]
knowledge_grant:
fact_id: "relationship.kael_naia_connection"
confidence: "knows_details"
- id: the-last-shift_d_155
text: "You should know -- Lera watches out for her regulars. If people have been asking about you, she'd know. She just won't volunteer it."
role: bar-regular
access: [peer]
trust: real
situation: [social, bar_evening]
topic: [colleague, trust, danger]
mood: [concerned]
tags: [unprompted, genuine-help, phase-2-3]
# ============================================================
# CONTRADICTION / DEFLECTION DIALOGUE (8 lines)
# Phase 3-4: avoidance excuses, topic deflection, controlled evasion
# ============================================================
- id: the-last-shift_d_160
text: "Actually, I should head out. Early shift tomorrow -- calibration rounds start at 07:30."
role: bar-regular
access: [peer, public]
trust: surface
situation: [bar_evening]
topic: [routine]
mood: [comfortable]
tags: [avoidance-excuse-1, torek-trigger, phase-3]
- id: the-last-shift_d_161
text: "Sorry -- headache coming on. Station air does that sometimes. I'll catch you tomorrow."
role: bar-regular
access: [peer, public]
trust: surface
situation: [bar_evening]
topic: [personal]
mood: [comfortable]
tags: [avoidance-excuse-2, torek-trigger, phase-3]
- id: the-last-shift_d_162
text: "I need to check something at the Commission kiosk. Forgot to file a diagnostic report. I'll be quick -- or not. You know how the system is."
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening]
topic: [institution, routine]
mood: [comfortable]
tags: [avoidance-excuse-3, torek-trigger, phase-3]
- id: the-last-shift_d_163
text: "Torek? He's just loud. I don't love loud drunks. Nothing personal -- I just like a quieter evening."
role: bar-regular
access: [peer]
trust: surface
situation: [social, investigation]
topic: [colleague]
mood: [comfortable]
tags: [torek-deflection, phase-4, the-deflection]
- id: the-last-shift_d_164
text: "Manifests? I wouldn't know -- I'm on the equipment side, not the freight side. Different department entirely."
role: bar-regular
access: [peer, authority]
trust: surface
situation: [investigation, social]
topic: [cargo, institution]
mood: [comfortable]
tags: [topic-deflection, cargo-avoidance, phase-3-5]
- id: the-last-shift_d_165
text: "Anyway -- did you try the ale? Lera got a new supply run in. Much better than last week's batch."
role: bar-regular
access: [peer]
trust: surface
situation: [social, bar_evening]
topic: [routine]
mood: [comfortable]
tags: [redirect, warmth-recovery, phase-4]
- id: the-last-shift_d_166
text: "I'm just a field tech. I maintain equipment. I don't track people or shipments -- that's your department."
role: bar-regular
access: [peer, authority]
trust: surface
situation: [investigation]
topic: [institution]
mood: [suspicious]
tags: [deflection-firm, phase-4-5, the-wall]
- id: the-last-shift_d_167
text: "Let's talk about something else. How's the investigation going -- generally? Making progress?"
role: bar-regular
access: [peer]
trust: real
situation: [social, investigation]
topic: [investigation, trust]
mood: [conflicted]
tags: [redirect-to-detective, controlled-recovery, phase-4]
# ============================================================
# POST-DISCOVERY DIALOGUE (5 lines)
# Phase 5: after the detective knows something is off
# Same surface warmth, but calibrated. Trust is contaminated.
# ============================================================
- id: the-last-shift_d_170
text: "Same booth. Drink's on me tonight."
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening, arrival]
topic: [personal]
mood: [fond]
tags: [post-discovery, surface-warmth, phase-5]
- id: the-last-shift_d_171
text: "I pulled the relay diagnostic data you asked about. Clean. No anomalies in the terminal equipment this quarter."
role: bar-regular
access: [peer, authority]
trust: real
situation: [social]
topic: [institution]
mood: [comfortable]
tags: [post-discovery, overcompensation, phase-5]
- id: the-last-shift_d_172
text: "You've been quiet tonight. Everything all right with the case?"
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening, social]
topic: [personal, investigation]
mood: [concerned]
tags: [post-discovery, awareness, phase-5]
- id: the-last-shift_d_173
text: "I know you're good at what you do. That's why I'm glad you're here. This district needed someone thorough."
role: bar-regular
access: [peer]
trust: real
situation: [social]
topic: [trust, personal]
mood: [fond, conflicted]
tags: [post-discovery, genuine-but-contaminated, phase-5]
- id: the-last-shift_d_174
text: "If there's anything I can help with -- anything at all -- you just ask. You know that."
role: bar-regular
access: [peer]
trust: real
situation: [social, bar_evening]
topic: [trust, personal]
mood: [fond, concerned]
tags: [post-discovery, overcompensation, phase-5, closing-line]
@@ -0,0 +1,424 @@
# Kael Davan — THE FRIEND (Smuggler)
# Dialogue at The Terminal (Logistics Hub)
# Ticket: #297 | Sprint: 5 | Tier 1 FRIEND NPC
# Voice: direct, practical, short sentences, first names, warm to trusted people
# Tell: looks left before answering when lying
location: the-terminal
role: dock-worker
lines:
# ========================================
# GREETINGS — Phase 1: Comfort (0-10 min)
# ========================================
- id: the-terminal_d_001
text: "There you are. Good — I was starting to wonder."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [arrival, shift_start]
mood: [fond]
topic: [colleague]
tags: [kael, greeting, phase-1]
- id: the-terminal_d_002
text: "Morning. Freight's stacked clean today. Should be a smooth one."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [shift_start]
mood: [comfortable]
topic: [routine]
tags: [kael, greeting, phase-1]
- id: the-terminal_d_003
text: "Voss has the schedule posted already. Keen today. That's suspicious."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [shift_start]
mood: [comfortable]
topic: [colleague, routine]
tags: [kael, greeting, humor]
- id: the-terminal_d_004
text: "Hey. Grab a coffee before Voss finds something to complain about."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [shift_start, social]
mood: [fond]
topic: [colleague]
tags: [kael, greeting, phase-1]
- id: the-terminal_d_005
text: "You look like you slept about as well as I did."
role: dock-worker
access: [peer]
trust: surface
situation: [arrival, social]
mood: [comfortable]
topic: [personal]
tags: [kael, greeting, casual]
# Public greeting for detective / outsiders
- id: the-terminal_d_006
text: "Can I help you? If you're looking for the supervisor, Voss is by the schedule board."
role: dock-worker
access: [public, authority]
trust: surface
situation: [arrival]
mood: [comfortable]
topic: [routine]
tags: [kael, greeting, outsider]
# ========================================
# SHIFT TALK — routine dialogue
# ========================================
- id: the-terminal_d_007
text: "Bay three's running behind. If we don't clear it by shift end, Voss is going to lose it."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [routine, shift_start]
mood: [comfortable]
topic: [routine, cargo]
tags: [kael, operational]
- id: the-terminal_d_008
text: "Manifest says this one's forty kilos over. Logging error, probably."
role: dock-worker
access: [public, peer]
trust: surface
situation: [routine]
mood: [comfortable]
topic: [cargo, routine]
tags: [kael, operational]
knowledge_grant:
fact_id: investigation.manifest_discrepancy
confidence: suspects
- id: the-terminal_d_009
text: "Night shift left the dock in decent shape for once. Miracles happen."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [shift_start]
mood: [comfortable]
topic: [routine]
tags: [kael, humor]
- id: the-terminal_d_010
text: "Loading arm three's been grinding all week. Someone should file a maintenance ticket."
role: dock-worker
access: [public, peer]
trust: surface
situation: [routine]
mood: [comfortable]
topic: [routine]
tags: [kael, environmental]
- id: the-terminal_d_011
text: "Maret rerouted the bay four queue. Tight schedule today."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [routine]
mood: [comfortable]
topic: [cargo, colleague]
tags: [kael, operational, maret]
- id: the-terminal_d_012
text: "Shift transition in twenty. After that it's Drin's problem."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [shift_end, shift_transition]
mood: [comfortable]
topic: [routine]
tags: [kael, operational]
- id: the-terminal_d_013
text: "Naia's got a school event tonight. I'm heading home straight after shift."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [social, routine]
mood: [fond]
topic: [personal]
tags: [kael, naia-reference, casual]
- id: the-terminal_d_014
text: "New hire started on bay seven. Keen. Reminds me of my first week."
role: dock-worker
access: [public, peer]
trust: surface
situation: [routine, social]
topic: [colleague]
tags: [kael, observational]
# ========================================
# RING COORDINATION — insider, real trust
# ========================================
- id: the-terminal_d_015
text: "Container 4471 is flagged. I'll reroute it during shift transition."
role: dock-worker
access: [insider]
trust: real
situation: [shift_transition]
mood: [focused]
topic: [cargo]
tags: [kael, ring-ops, operational, phase-2]
- id: the-terminal_d_016
text: "Voss kept the window clear. Twenty minutes, maybe twenty-five."
role: dock-worker
access: [insider]
trust: real
situation: [shift_transition]
mood: [focused]
topic: [cargo, routine]
tags: [kael, ring-ops, operational, phase-2]
- id: the-terminal_d_017
text: "Renn's on the corridor side. Package moves when I give the signal."
role: dock-worker
access: [insider]
trust: real
situation: [shift_transition]
mood: [focused]
topic: [cargo]
tags: [kael, ring-ops, renn, phase-2]
- id: the-terminal_d_018
text: "Manifest's clean on my end. Maret processed it without questions."
role: dock-worker
access: [insider]
trust: real
situation: [routine]
mood: [comfortable]
topic: [cargo]
tags: [kael, ring-ops, maret, phase-2]
- id: the-terminal_d_019
text: "Nils wants higher volume next cycle. I told him we're already tight."
role: dock-worker
access: [insider]
trust: real
situation: [social]
mood: [concerned]
topic: [danger, trust]
tags: [kael, ring-ops, nils, tension, phase-2]
- id: the-terminal_d_020
text: "Drin waved through bay four without checking. At least he's reliable."
role: dock-worker
access: [insider]
trust: real
situation: [routine]
topic: [colleague]
tags: [kael, ring-ops, drin, phase-2]
knowledge_grant:
fact_id: investigation.drin_inspection_pattern
confidence: knows_details
- id: the-terminal_d_021
text: "Keep an eye on Maret. She's been looking at the manifests longer than usual."
role: dock-worker
access: [insider]
trust: real
situation: [routine, social]
mood: [worried]
topic: [colleague, danger]
tags: [kael, ring-ops, maret, caution, phase-2]
- id: the-terminal_d_022
text: "There's a sealed one in the batch tonight. Nils says components. Don't open it."
role: dock-worker
access: [insider]
trust: real
situation: [shift_transition]
mood: [concerned]
topic: [cargo, danger]
tags: [kael, ring-ops, contraband, phase-2]
# ========================================
# TRUST-GATED — deep trust, secret tier
# ========================================
- id: the-terminal_d_023
text: "Some days I wonder how long we can keep this up."
role: dock-worker
access: [insider]
trust: secret
situation: [social, alone]
mood: [conflicted]
topic: [trust, personal]
tags: [kael, vulnerability, friend-arc]
- id: the-terminal_d_024
text: "Naia asked me again last night. Where I go. Why I'm late. I hate lying to her."
role: dock-worker
access: [insider]
trust: secret
situation: [social, alone]
mood: [conflicted]
topic: [personal, trust]
tags: [kael, naia-reference, vulnerability]
- id: the-terminal_d_025
text: "If something happens to me — look out for Naia. Promise me that."
role: dock-worker
access: [insider]
trust: secret
situation: [alone]
mood: [worried]
topic: [personal, trust]
tags: [kael, naia-reference, vulnerability, friend-arc]
# ========================================
# UNPROMPTED — Kael volunteers or warns
# ========================================
- id: the-terminal_d_026
text: "Heads up — Voss is in a mood. Keep your head down this shift."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [shift_start]
mood: [concerned]
topic: [colleague, danger]
tags: [kael, unprompted, warning]
- id: the-terminal_d_027
text: "I'm buying at Lera's after shift. You're coming. No arguments."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [shift_end, social]
mood: [fond]
topic: [personal, colleague]
tags: [kael, unprompted, social]
- id: the-terminal_d_028
text: "Torek's been running his mouth at the bar. You might want to have a word."
role: dock-worker
access: [insider]
trust: real
situation: [social]
mood: [worried]
topic: [danger, colleague]
tags: [kael, unprompted, torek, caution]
# ========================================
# DEFLECTION — Phase 2-4: Post-contradiction
# ========================================
- id: the-terminal_d_029
text: "It's nothing. Just work stuff."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [confrontation, social]
mood: [concerned]
topic: [personal]
tags: [kael, deflection, phase-4]
- id: the-terminal_d_030
text: "Don't worry about it. I've got it handled."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [confrontation]
mood: [concerned]
topic: [personal, trust]
tags: [kael, deflection, phase-4]
- id: the-terminal_d_031
text: "I was checking on a maintenance issue. That's all."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [confrontation]
mood: [concerned]
topic: [routine]
tags: [kael, deflection, lying, phase-4]
- id: the-terminal_d_032
text: "You're reading too much into it. Come on — shift's starting."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [confrontation, shift_start]
mood: [concerned]
topic: [routine, trust]
tags: [kael, deflection, subject-change, phase-4]
- id: the-terminal_d_033
text: "Can we not do this here? Voss is watching."
role: dock-worker
access: [insider]
trust: surface
situation: [confrontation]
mood: [concerned]
topic: [danger]
tags: [kael, deflection, phase-4]
# ========================================
# CONFRONTATION RESPONSES — Phase 4-5
# ========================================
# Path A: Gentle confrontation
- id: the-terminal_d_034
text: "I... yeah. I need to tell you something. But not here."
role: dock-worker
access: [insider]
trust: real
situation: [confrontation, alone]
mood: [conflicted]
topic: [trust, personal]
tags: [kael, confession-path, phase-5]
# Path B: Harsh pressure
- id: the-terminal_d_035
text: "You want to report me? Go ahead. See what Nils does to both of us."
role: dock-worker
access: [insider]
trust: surface
situation: [confrontation]
mood: [concerned]
topic: [danger, trust]
tags: [kael, hostile-path, phase-5]
# If smuggler pushes further (gentle)
- id: the-terminal_d_036
text: "Naia can't keep living like this. Neither can I. I'm looking for a way out."
role: dock-worker
access: [insider]
trust: secret
situation: [confrontation, alone]
mood: [conflicted]
topic: [personal, trust]
tags: [kael, confession, naia-reference, phase-5]
# If detective confronts (authority path)
- id: the-terminal_d_037
text: "I don't know what you're talking about. I load containers. That's my job."
role: dock-worker
access: [public, authority]
trust: surface
situation: [confrontation, investigation]
topic: [routine]
tags: [kael, deflection, detective-path]
- id: the-terminal_d_038
text: "You want to ask questions, talk to Voss. He runs the schedule."
role: dock-worker
access: [public, authority]
trust: surface
situation: [confrontation, investigation]
topic: [colleague, routine]
tags: [kael, deflection, detective-path, voss]
@@ -0,0 +1,64 @@
# PC-as-NPC: The Detective (NPC mode, seen by smuggler player)
# Dialogue at The Terminal (Logistics Hub)
# Ticket: #401 | Sprint: 5 | PC-as-NPC content
# Voice: professional, measured, complete sentences, formal. Surnames for strangers.
# Context: public-tier only. The detective-NPC responds to the smuggler with
# institutional blandness — standard compliance officer, nothing to see here.
# Agency: NEUTRAL PATH. No confrontations, no evidence reveals.
location: the-terminal
role: commission-liaison
lines:
# ========================================
# PUBLIC-TIER — smuggler approaches detective-NPC
# These are the only lines the smuggler can trigger.
# First playthrough: institutional threat.
# Second playthrough: "That's me."
# ========================================
- id: the-terminal_d_044
text: "Good morning. Commission Liaison Office. I'm conducting a routine compliance review."
role: commission-liaison
access: [public]
trust: surface
situation: [arrival, greeting]
mood: [comfortable]
topic: [routine]
tags: [pc-detective, greeting, public-tier]
- id: the-terminal_d_045
text: "Standard review. Manifest reconciliation, scheduling compliance. Nothing unusual."
role: commission-liaison
access: [public]
trust: surface
situation: [social]
topic: [routine]
tags: [pc-detective, purpose-question, public-tier]
- id: the-terminal_d_046
text: "Only been here a few days. Seems like a well-run operation."
role: commission-liaison
access: [public]
trust: surface
situation: [social]
topic: [routine]
tags: [pc-detective, district-question, public-tier]
- id: the-terminal_d_047
text: "Ms. Venn? Colleague. We've worked in the same division."
role: commission-liaison
access: [public]
trust: surface
situation: [social]
topic: [colleague]
tags: [pc-detective, sera-question, public-tier]
- id: the-terminal_d_048
text: "I appreciate the interest, but I'm sure you have cargo to route. I won't keep you."
role: commission-liaison
access: [public, authority]
trust: surface
situation: [confrontation]
topic: [routine]
tags: [pc-detective, deflection, public-tier]
@@ -0,0 +1,64 @@
# PC-as-NPC: The Smuggler (NPC mode, seen by detective player)
# Dialogue at The Terminal (Logistics Hub)
# Ticket: #401 | Sprint: 5 | PC-as-NPC content
# Voice: casual, guarded, short sentences, contractions always
# Context: public-tier only. The smuggler-NPC responds to the detective with
# polite minimum — standard dock worker who doesn't want Commission attention.
# Agency: NEUTRAL PATH. No dramatic choices, no revelations.
location: the-terminal
role: dock-worker
lines:
# ========================================
# PUBLIC-TIER — detective approaches smuggler-NPC
# These are the only lines the detective can trigger.
# First playthrough: unremarkable dock worker.
# Second playthrough: "That's me."
# ========================================
- id: the-terminal_d_039
text: "Morning. Can I help you with something?"
role: dock-worker
access: [public]
trust: surface
situation: [arrival, greeting]
mood: [comfortable]
topic: [routine]
tags: [pc-smuggler, greeting, public-tier]
- id: the-terminal_d_040
text: "Cargo routing. Containers come in, I process them out. Standard stuff."
role: dock-worker
access: [public, authority]
trust: surface
situation: [investigation, social]
topic: [routine, cargo]
tags: [pc-smuggler, work-question, public-tier]
- id: the-terminal_d_041
text: "It's a freight hub. Busy during shifts, quiet after. Same as anywhere."
role: dock-worker
access: [public]
trust: surface
situation: [social]
topic: [routine]
tags: [pc-smuggler, hub-question, public-tier]
- id: the-terminal_d_042
text: "Good crew. We do our shifts, go home. Nothing exciting."
role: dock-worker
access: [public, authority]
trust: surface
situation: [investigation, social]
topic: [colleague, routine]
tags: [pc-smuggler, colleagues-question, public-tier]
- id: the-terminal_d_043
text: "Look, I just move containers. You'd want to talk to Voss about scheduling."
role: dock-worker
access: [authority]
trust: surface
situation: [confrontation, investigation]
topic: [routine, colleague]
tags: [pc-smuggler, deflection, public-tier, voss]
@@ -92,7 +92,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: smuggling_route
- fact_id: investigation.smuggling_route
min_confidence: suspects
priority: 8
tags: [investigation, evidence, breakthrough]
@@ -102,7 +102,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: renn_courier_role
- fact_id: investigation.renn_courier_role
min_confidence: knows_of
priority: 7
tags: [npc, renn, investigation, evidence]
@@ -112,7 +112,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: surveillance_gaps
- fact_id: investigation.surveillance_gaps
min_confidence: suspects
tags: [investigation, operational]
@@ -121,7 +121,7 @@ lines:
trigger: time_idle
prerequisites:
facts:
- fact_id: smuggling_route
- fact_id: investigation.smuggling_route
min_confidence: knows_details
priority: 9
tags: [investigation, breakthrough]
@@ -131,7 +131,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: corridor_regular_use
- fact_id: investigation.corridor_regular_use
min_confidence: knows_of
tags: [investigation, evidence]
@@ -140,7 +140,7 @@ lines:
trigger: time_idle
prerequisites:
facts:
- fact_id: kael_corridor_sighting
- fact_id: investigation.kael_corridor_sighting
min_confidence: suspects
priority: 7
tags: [npc, kael, investigation]
@@ -150,7 +150,7 @@ lines:
trigger: time_idle
prerequisites:
facts:
- fact_id: oversight_gap_pattern
- fact_id: investigation.oversight_gap_pattern
min_confidence: knows_details
tags: [investigation, analytical]
@@ -159,7 +159,7 @@ lines:
trigger: time_idle
prerequisites:
facts:
- fact_id: drin_gambling_debt
- fact_id: investigation.drin_gambling_debt
min_confidence: knows_details
priority: 6
tags: [npc, drin, investigation, moral]
@@ -169,6 +169,6 @@ lines:
trigger: time_idle
prerequisites:
facts:
- fact_id: ring_existence
- fact_id: investigation.ring_existence
min_confidence: suspects
tags: [investigation, reflection]
@@ -0,0 +1,101 @@
# Detective monologue: observing the Smuggler-as-NPC
# PC-as-NPC tell-inversion content (D-039 Wow Moment #4)
# Ticket: #401 | Sprint: 5
# Voice: analytical, complete sentences, observation → deduction
# Context: the detective watches the smuggler-NPC's behavioral tells.
# First playthrough: "This dock worker is interesting."
# Second playthrough: "That's MY corridor check. That's MY habit."
character: detective
location: general
lines:
# --- Tell Observations (5 core tells from pc-as-npc-spec.md section 8) ---
- id: general_m_d_011
text: "That dock worker checks the corridor before turning. Habitual. Military? Or just careful."
trigger: observe_npc
prerequisites:
relationship:
target: npc:pc-smuggler
state: known
tags: [npc, pc-smuggler, tell, corridor-check]
- id: general_m_d_012
text: "Movement pattern changed at shift change. More direct. Less idle. Interesting."
trigger: observe_anomaly
prerequisites:
relationship:
target: npc:pc-smuggler
state: known
tags: [npc, pc-smuggler, tell, shift-transition]
- id: general_m_d_013
text: "Slight acceleration past the checkpoint. Most people do it. But this one does it every time."
trigger: observe_anomaly
prerequisites:
relationship:
target: npc:pc-smuggler
state: known
tags: [npc, pc-smuggler, tell, security-proximity]
- id: general_m_d_014
text: "Same three people at the same table. Every shift. Consistent social group."
trigger: observe_npc
prerequisites:
relationship:
target: npc:pc-smuggler
state: known
tags: [npc, pc-smuggler, tell, social-clustering]
- id: general_m_d_015
text: "That worker checked container 4471 twice. The same container that's in my manifest discrepancy file."
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: investigation.manifest_discrepancy
min_confidence: knows_of
relationship:
target: npc:pc-smuggler
state: known
priority: 8
tags: [npc, pc-smuggler, tell, cargo-attention, investigation]
# --- Accumulated Observation (gates on multiple tell sightings) ---
- id: general_m_d_016
text: "Three behavioral flags on one dock worker. Corridor awareness, shift-transition alertness, cargo fixation. That's a pattern."
trigger: time_idle
prerequisites:
entity_attributes:
- entity: npc:pc-smuggler
key: behavior_flags
value: multiple_tells_observed
priority: 7
tags: [npc, pc-smuggler, investigation, analytical, pattern-recognition]
- id: general_m_d_017
text: "Cross-referencing the dock worker's shift schedule with manifest anomalies. Correlation: moderate."
trigger: time_idle
prerequisites:
facts:
- fact_id: investigation.manifest_discrepancy
min_confidence: knows_of
relationship:
target: npc:pc-smuggler
state: person_of_interest
priority: 8
tags: [npc, pc-smuggler, investigation, evidence]
- id: general_m_d_018
text: "The dock worker and Davan eat together every shift. Same courier joins them. Tight operational cluster."
trigger: observe_npc
prerequisites:
relationship:
target: npc:pc-smuggler
state: known
entity_attributes:
- entity: npc:kael-davan
key: behavior_flags
value: social_clustering
tags: [npc, pc-smuggler, kael, renn, social-clustering, investigation]
@@ -112,7 +112,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: sera_avoidance_pattern
- fact_id: behavioral.sera_avoidance_pattern
min_confidence: suspects
priority: 7
tags: [npc, sera, torek, tell, friend-arc]
@@ -122,7 +122,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: sera_avoidance_pattern
- fact_id: behavioral.sera_avoidance_pattern
min_confidence: knows_of
priority: 9
tags: [npc, sera, torek, tell, friend-arc, contradiction]
@@ -132,7 +132,7 @@ lines:
trigger: observe_npc
prerequisites:
facts:
- fact_id: torek_spending_pattern
- fact_id: investigation.torek_spending_pattern
min_confidence: knows_of
tags: [npc, torek, investigation]
@@ -141,7 +141,7 @@ lines:
trigger: observe_npc
prerequisites:
facts:
- fact_id: bar_back_room_significance
- fact_id: knowledge.bar_back_room_significance
min_confidence: suspects
tags: [npc, lera, investigation]
@@ -150,7 +150,7 @@ lines:
trigger: post_conversation
prerequisites:
relationship:
target: sera_venn
target: npc:sera-venn
state: person_of_interest
priority: 7
tags: [npc, sera, friend-arc, behavioral]
@@ -160,7 +160,7 @@ lines:
trigger: observe_npc
prerequisites:
relationship:
target: sera_venn
target: npc:sera-venn
state: person_of_interest
priority: 8
tags: [npc, sera, contaminated-trust, friend-arc]
@@ -170,7 +170,7 @@ lines:
trigger: observe_npc
prerequisites:
relationship:
target: naia_tamm
target: npc:naia-tamm
state: known
tags: [npc, naia, behavioral]
@@ -179,7 +179,7 @@ lines:
trigger: witness_interaction
prerequisites:
facts:
- fact_id: bar_ring_awareness
- fact_id: knowledge.bar_ring_awareness
min_confidence: suspects
tags: [npc, lera, investigation]
@@ -188,7 +188,7 @@ lines:
trigger: witness_interaction
prerequisites:
relationship:
target: kael_davan
target: npc:kael-davan
state: known
tags: [npc, kael, naia, behavioral]
@@ -197,6 +197,153 @@ lines:
trigger: return_visit
prerequisites:
facts:
- fact_id: bar_regular_status
- fact_id: social.bar_regular_status
min_confidence: knows_of
tags: [social, progress]
# --- Kael Davan — Additional Bar Observations ---
# Ticket: #297 review fix | Filling detective monologue gap
- id: the-last-shift_m_d_043
text: "Davan is different here. Looser. The dock worker persona drops and something warmer replaces it."
trigger: observe_npc
prerequisites:
relationship:
target: npc:kael-davan
state: known
tags: [npc, kael, behavioral, dual-context]
- id: the-last-shift_m_d_044
text: "Davan checks the door every time it opens. Even here. Even off-shift. That is not relaxation."
trigger: observe_npc
prerequisites:
relationship:
target: npc:kael-davan
state: person_of_interest
priority: 7
tags: [npc, kael, tell, behavioral, friend-arc]
# --- Sera Venn FRIEND Arc — Tell Observations + Phase Transitions ---
# Ticket: #298 | Author: Paula
# These track the detective's evolving perception of Sera across the
# 5-phase FRIEND arc: trust > background data > pattern > question >
# contaminated trust. Contraction shifts mark objectivity loss.
- id: the-last-shift_m_d_031
text: "Sera changed the subject when I mentioned manifests. Smooth. Practised, maybe."
trigger: post_conversation
prerequisites:
facts:
- fact_id: behavioral.sera_topic_deflection
min_confidence: suspects
priority: 6
tags: [npc, sera, tell, behavioral, friend-arc]
- id: the-last-shift_m_d_032
text: "She volunteers names, routines, context. Gives everything I ask for -- except what I did not."
trigger: post_conversation
prerequisites:
relationship:
target: npc:sera-venn
state: friendly
priority: 6
tags: [npc, sera, tell, overcompensation, friend-arc]
- id: the-last-shift_m_d_033
text: "Sera at the Commission kiosk. Third pass this shift. That is not standard recalibration."
trigger: observe_npc
prerequisites:
facts:
- fact_id: behavioral.sera_kiosk_pattern
min_confidence: suspects
priority: 7
tags: [npc, sera, tell, peripheral, friend-arc]
- id: the-last-shift_m_d_034
text: "Everything Sera told me checks out. Layout, schedules, regulars. Accurate. Thorough. Selective?"
trigger: post_conversation
prerequisites:
relationship:
target: npc:sera-venn
state: friendly
priority: 5
tags: [npc, sera, analytical, phase-2-3, friend-arc]
- id: the-last-shift_m_d_035
text: "She mentioned Naia's worry about Kael early -- before I had context. Priming, or concern?"
trigger: post_conversation
prerequisites:
facts:
- fact_id: relationship.kael_naia_connection
min_confidence: knows_of
priority: 7
tags: [npc, sera, naia, retrospective, friend-arc]
- id: the-last-shift_m_d_036
text: "Sera's institutional access goes further than field calibration. She could pull records I cannot."
trigger: time_idle
prerequisites:
relationship:
target: npc:sera-venn
state: friendly
tags: [npc, sera, analytical, capability, friend-arc]
- id: the-last-shift_m_d_037
text: "Assessment: Venn, S. Cooperative. Embedded. Competent. Green -- with reservations now."
trigger: time_idle
prerequisites:
facts:
- fact_id: behavioral.sera_avoidance_pattern
min_confidence: suspects
priority: 7
tags: [npc, sera, phase-transition, analytical, friend-arc]
- id: the-last-shift_m_d_038
text: "Correction: amber. The avoidance pattern is behavioural, not preferential. Data, not taste."
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: behavioral.sera_avoidance_pattern
min_confidence: knows_of
priority: 9
tags: [npc, sera, phase-transition, tell, contradiction, friend-arc]
- id: the-last-shift_m_d_039
text: "She's the first person who made this place feel less foreign. I need that to not matter right now."
trigger: time_idle
prerequisites:
relationship:
target: npc:sera-venn
state: person_of_interest
priority: 8
tags: [npc, sera, emotional, phase-4-5, friend-arc]
- id: the-last-shift_m_d_040
text: "Those early tips. The district layout, the introductions. Were those help -- or steering?"
trigger: time_idle
prerequisites:
relationship:
target: npc:sera-venn
state: person_of_interest
priority: 7
tags: [npc, sera, contaminated-trust, retrospective, friend-arc]
- id: the-last-shift_m_d_041
text: "She's not a suspect. She's a friend with access to everything I need. That is the problem."
trigger: time_idle
prerequisites:
facts:
- fact_id: behavioral.sera_avoidance_pattern
min_confidence: knows_of
priority: 8
tags: [npc, sera, contaminated-trust, phase-4-5, friend-arc]
- id: the-last-shift_m_d_042
text: "Trust: compromised. The question is not what she told me. It is what she did not."
trigger: post_conversation
prerequisites:
relationship:
target: npc:sera-venn
state: person_of_interest
priority: 9
tags: [npc, sera, contaminated-trust, phase-5, friend-arc, closing]
@@ -132,7 +132,7 @@ lines:
trigger: observe_anomaly
prerequisites:
relationship:
target: kael_davan
target: npc:kael-davan
state: known
tags: [npc, kael, behavioral, tell]
@@ -141,7 +141,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: manifest_discrepancy
- fact_id: investigation.manifest_discrepancy
min_confidence: knows_of
priority: 7
tags: [investigation, evidence]
@@ -151,7 +151,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: manifest_discrepancy
- fact_id: investigation.manifest_discrepancy
min_confidence: suspects
tags: [investigation, evidence]
@@ -160,7 +160,7 @@ lines:
trigger: time_idle
prerequisites:
facts:
- fact_id: drin_gambling_debt
- fact_id: investigation.drin_gambling_debt
min_confidence: knows_details
tags: [npc, drin, investigation, moral]
@@ -169,7 +169,7 @@ lines:
trigger: time_idle
prerequisites:
facts:
- fact_id: manifest_discrepancy
- fact_id: investigation.manifest_discrepancy
min_confidence: knows_of
priority: 7
tags: [investigation, analytical]
@@ -179,7 +179,7 @@ lines:
trigger: time_idle
prerequisites:
facts:
- fact_id: oversight_gap_pattern
- fact_id: investigation.oversight_gap_pattern
min_confidence: knows_details
priority: 7
tags: [investigation, operational]
@@ -189,7 +189,7 @@ lines:
trigger: observe_anomaly
prerequisites:
entity_attributes:
- entity: maret_korr
- entity: npc:maret-korr
key: behavior_flags
value: schedule_modification
tags: [npc, maret, investigation]
@@ -199,7 +199,7 @@ lines:
trigger: observe_npc
prerequisites:
facts:
- fact_id: drin_inspection_pattern
- fact_id: investigation.drin_inspection_pattern
min_confidence: knows_of
priority: 8
tags: [npc, drin, investigation, behavioral]
@@ -209,7 +209,7 @@ lines:
trigger: observe_anomaly
prerequisites:
relationship:
target: kael_davan
target: npc:kael-davan
state: known
tags: [npc, kael, investigation]
@@ -218,7 +218,7 @@ lines:
trigger: observe_npc
prerequisites:
facts:
- fact_id: voss_awareness
- fact_id: behavioral.voss_awareness
min_confidence: suspects
priority: 6
tags: [npc, voss, investigation]
@@ -228,7 +228,61 @@ lines:
trigger: discover_evidence
prerequisites:
facts:
- fact_id: manifest_discrepancy
- fact_id: investigation.manifest_discrepancy
min_confidence: knows_details
priority: 9
tags: [investigation, evidence, breakthrough]
# --- Kael Davan FRIEND Arc — Additional Detective Observations ---
# Ticket: #297 review fix | Filling detective monologue gap (7 → 12 Kael lines)
- id: the-terminal_m_d_036
text: "Davan's shift pattern is clean. Too clean. Same bays, same hours, same rotation. Nothing out of place."
trigger: observe_npc
prerequisites:
relationship:
target: npc:kael-davan
state: known
tags: [npc, kael, analytical, behavioral]
- id: the-terminal_m_d_037
text: "Davan eats with the same group every shift. Social anchor, or keeping tabs?"
trigger: observe_npc
prerequisites:
relationship:
target: npc:kael-davan
state: known
tags: [npc, kael, social, behavioral]
- id: the-terminal_m_d_038
text: "Davan handled that container routing without checking the manifest board. He knows the schedule by heart."
trigger: observe_npc
prerequisites:
relationship:
target: npc:kael-davan
state: known
priority: 6
tags: [npc, kael, behavioral, tell, competence]
- id: the-terminal_m_d_039
text: "Davan's posture changed when I approached bay four. Subtle. Filing it."
trigger: observe_anomaly
prerequisites:
relationship:
target: npc:kael-davan
state: person_of_interest
priority: 7
tags: [npc, kael, tell, behavioral, friend-arc]
- id: the-terminal_m_d_040
text: "Three manifests with weight discrepancies. All during Davan's shifts. Correlation is not causation. But noted."
trigger: time_idle
prerequisites:
facts:
- fact_id: investigation.manifest_discrepancy
min_confidence: knows_of
relationship:
target: npc:kael-davan
state: person_of_interest
priority: 8
tags: [npc, kael, investigation, evidence, analytical]
@@ -92,7 +92,7 @@ lines:
trigger: enter_location
prerequisites:
facts:
- fact_id: kael_corridor_meeting
- fact_id: investigation.kael_corridor_meeting
min_confidence: suspects
priority: 8
tags: [npc, kael, contradiction, friend-arc]
@@ -102,7 +102,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: kael_corridor_meeting
- fact_id: investigation.kael_corridor_meeting
min_confidence: suspects
tags: [evidence, kael, friend-arc]
@@ -111,7 +111,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: ring_route_compromise
- fact_id: awareness.ring_route_compromise
min_confidence: suspects
priority: 7
tags: [operational, caution]
@@ -121,7 +121,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: container_delay
- fact_id: investigation.container_delay
min_confidence: knows_of
tags: [operational, contraband]
@@ -130,7 +130,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: surveillance_change
- fact_id: awareness.surveillance_change
min_confidence: suspects
priority: 7
tags: [investigation, caution]
@@ -140,7 +140,7 @@ lines:
trigger: time_idle
prerequisites:
facts:
- fact_id: kael_unknown_contact
- fact_id: investigation.kael_unknown_contact
min_confidence: knows_of
priority: 8
tags: [npc, kael, operational, friend-arc]
@@ -150,7 +150,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: ring_routing_knowledge
- fact_id: knowledge.ring_routing_knowledge
min_confidence: knows_details
tags: [operational, contraband]
@@ -159,7 +159,7 @@ lines:
trigger: time_idle
prerequisites:
relationship:
target: kael_davan
target: npc:kael-davan
state: person_of_interest
priority: 7
tags: [npc, kael, concern, friend-arc]
@@ -0,0 +1,92 @@
# Smuggler monologue: observing the Detective-as-NPC
# PC-as-NPC tell-inversion content (D-039 Wow Moment #4)
# Ticket: #401 | Sprint: 5
# Voice: terse, operational, worried, short sentences, contractions always
# Context: the smuggler watches the detective-NPC's behavioral tells.
# First playthrough: "Commission threat. Stay clear."
# Second playthrough: "That's MY note-taking. That's MY method."
character: smuggler
location: general
lines:
# --- Tell Observations (5 core tells from pc-as-npc-spec.md section 8) ---
- id: general_m_s_011
text: "Commission officer just stood there after talking to Voss. Making notes. Not good."
trigger: observe_npc
prerequisites:
relationship:
target: npc:pc-detective
state: known
tags: [npc, pc-detective, tell, note-taking, caution]
- id: general_m_s_012
text: "That investigator is working the hub section by section. Not browsing. Searching."
trigger: observe_anomaly
prerequisites:
relationship:
target: npc:pc-detective
state: known
tags: [npc, pc-detective, tell, systematic-movement, caution]
- id: general_m_s_013
text: "Commission's parked at the manifest terminal again. Third time today."
trigger: observe_anomaly
prerequisites:
relationship:
target: npc:pc-detective
state: known
tags: [npc, pc-detective, tell, manifest-fixation, caution]
- id: general_m_s_014
text: "They're watching. From the corner, where they can see the whole dock floor. Professional."
trigger: observe_npc
prerequisites:
relationship:
target: npc:pc-detective
state: known
tags: [npc, pc-detective, tell, observation-positioning, caution]
- id: general_m_s_015
text: "The investigator and Sera again. Old friends? Or is Sera reporting to them?"
trigger: observe_npc
prerequisites:
relationship:
target: npc:pc-detective
state: known
relationship:
target: npc:sera-venn
state: known
tags: [npc, pc-detective, sera, tell, sera-proximity, suspicion]
# --- Operational Awareness (smuggler's threat assessment) ---
- id: general_m_s_016
text: "New Commission face at the hub. Keep your head down. Don't give them anything."
trigger: observe_npc
prerequisites:
relationship:
target: npc:pc-detective
state: known
priority: 8
tags: [npc, pc-detective, operational, caution, first-sighting]
- id: general_m_s_017
text: "That investigator's been here all morning. Nobody stays that long for a routine check."
trigger: time_idle
prerequisites:
relationship:
target: npc:pc-detective
state: known
priority: 6
tags: [npc, pc-detective, suspicion, operational]
- id: general_m_s_018
text: "Commission's at the bar. Sitting with Sera. Watching the room like they own it."
trigger: observe_npc
prerequisites:
relationship:
target: npc:pc-detective
state: known
tags: [npc, pc-detective, sera, bar, caution]
@@ -112,7 +112,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: sera_avoidance_pattern
- fact_id: behavioral.sera_avoidance_pattern
min_confidence: suspects
tags: [npc, sera, torek, pattern]
@@ -121,7 +121,7 @@ lines:
trigger: observe_npc
prerequisites:
facts:
- fact_id: torek_spending_pattern
- fact_id: investigation.torek_spending_pattern
min_confidence: knows_of
tags: [npc, torek, operational]
@@ -130,7 +130,7 @@ lines:
trigger: post_conversation
prerequisites:
facts:
- fact_id: ring_bar_operations
- fact_id: knowledge.ring_bar_operations
min_confidence: knows_details
tags: [npc, lera, operational]
@@ -139,7 +139,7 @@ lines:
trigger: observe_npc
prerequisites:
relationship:
target: naia_tamm
target: npc:naia-tamm
state: known
tags: [npc, naia, kael, concern]
@@ -148,7 +148,7 @@ lines:
trigger: observe_npc
prerequisites:
facts:
- fact_id: detective_presence
- fact_id: awareness.detective_presence
min_confidence: knows_of
priority: 8
tags: [investigation, caution]
@@ -158,7 +158,7 @@ lines:
trigger: witness_interaction
prerequisites:
facts:
- fact_id: detective_presence
- fact_id: awareness.detective_presence
min_confidence: knows_of
tags: [npc, sera, investigation]
@@ -167,7 +167,7 @@ lines:
trigger: observe_anomaly
prerequisites:
relationship:
target: kael_davan
target: npc:kael-davan
state: person_of_interest
priority: 8
tags: [npc, kael, contaminated-trust, friend-arc]
@@ -177,7 +177,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: ring_bar_operations
- fact_id: knowledge.ring_bar_operations
min_confidence: knows_details
tags: [operational, nils]
@@ -186,7 +186,7 @@ lines:
trigger: witness_interaction
prerequisites:
facts:
- fact_id: kael_behavioral_change
- fact_id: behavioral.kael_behavioral_change
min_confidence: suspects
tags: [npc, kael, naia, tell, friend-arc]
@@ -195,7 +195,81 @@ lines:
trigger: enter_location
prerequisites:
facts:
- fact_id: ring_tension_escalation
- fact_id: awareness.ring_tension_escalation
min_confidence: suspects
priority: 7
tags: [atmospheric, caution, operational]
# --- Sera Venn Dual-Lens — Smuggler Observations ---
# Ticket: #298 | Author: Paula
# The smuggler sees Sera as Commission — wary, practical, outsider
# perspective. On replay, these lines gain new meaning when the player
# understands Sera's concealment arc from the detective playthrough.
- id: the-last-shift_m_s_031
text: "Sera's at the Commission kiosk. Third time this shift. Nobody recalibrates that much."
trigger: observe_npc
prerequisites:
facts:
- fact_id: behavioral.sera_kiosk_pattern
min_confidence: suspects
priority: 6
tags: [npc, sera, commission, pattern, dual-lens]
- id: the-last-shift_m_s_032
text: "Naia trusts Sera. More than most people here. That says something."
trigger: witness_interaction
tags: [npc, sera, naia, social, dual-lens]
- id: the-last-shift_m_s_033
text: "Sera was studying the freight display. For a calibration tech, that's a lot of manifest reading."
trigger: observe_npc
prerequisites:
facts:
- fact_id: behavioral.sera_topic_deflection
min_confidence: suspects
priority: 6
tags: [npc, sera, tell, cargo, dual-lens]
- id: the-last-shift_m_s_034
text: "That's three times Sera's bailed when Torek showed up. Maybe she owes him money."
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: behavioral.sera_avoidance_pattern
min_confidence: knows_of
priority: 7
tags: [npc, sera, torek, pattern, dual-lens, replay-payload]
- id: the-last-shift_m_s_035
text: "Sera offered the detective compliance records. Helpful -- or professional courtesy?"
trigger: witness_interaction
prerequisites:
facts:
- fact_id: awareness.detective_presence
min_confidence: knows_of
tags: [npc, sera, investigation, caution, dual-lens]
- id: the-last-shift_m_s_036
text: "Something about Sera tonight. Same smile, different eyes."
trigger: observe_npc
prerequisites:
relationship:
target: npc:sera-venn
state: known
tags: [npc, sera, behavioral, dual-lens]
- id: the-last-shift_m_s_037
text: "Commission tech who drinks at a dock bar. Either lonely or embedded. Either way -- careful."
trigger: observe_npc
tags: [npc, sera, commission, assessment, dual-lens]
- id: the-last-shift_m_s_038
text: "Sera knows the shift rotations better than Voss. That's not calibration. That's attention."
trigger: observe_npc
prerequisites:
facts:
- fact_id: behavioral.sera_knowledge_detail
min_confidence: suspects
priority: 6
tags: [npc, sera, tell, competence, dual-lens]
@@ -132,7 +132,7 @@ lines:
trigger: observe_anomaly
prerequisites:
relationship:
target: kael_davan
target: npc:kael-davan
state: friendly
priority: 7
tags: [npc, kael, tell, friend-arc]
@@ -142,7 +142,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: ring_routing_knowledge
- fact_id: knowledge.ring_routing_knowledge
min_confidence: knows_details
tags: [operational, contraband]
@@ -151,7 +151,7 @@ lines:
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: voss_ring_involvement
- fact_id: investigation.voss_ring_involvement
min_confidence: knows_of
tags: [npc, voss, operational]
@@ -160,7 +160,7 @@ lines:
trigger: observe_npc
prerequisites:
facts:
- fact_id: detective_presence
- fact_id: awareness.detective_presence
min_confidence: knows_of
priority: 8
tags: [investigation, caution]
@@ -170,7 +170,7 @@ lines:
trigger: observe_npc
prerequisites:
entity_attributes:
- entity: maret_korr
- entity: npc:maret-korr
key: behavior_flags
value: avoidance
priority: 6
@@ -181,7 +181,7 @@ lines:
trigger: time_idle
prerequisites:
facts:
- fact_id: ring_routing_knowledge
- fact_id: knowledge.ring_routing_knowledge
min_confidence: knows_details
tags: [operational, contraband]
@@ -190,7 +190,7 @@ lines:
trigger: time_idle
prerequisites:
facts:
- fact_id: kael_corridor_meeting
- fact_id: investigation.kael_corridor_meeting
min_confidence: suspects
priority: 8
tags: [npc, kael, contradiction, friend-arc]
@@ -200,7 +200,7 @@ lines:
trigger: time_idle
prerequisites:
facts:
- fact_id: kael_unknown_contact
- fact_id: investigation.kael_unknown_contact
min_confidence: suspects
priority: 9
tags: [npc, kael, contradiction, friend-arc]
@@ -210,7 +210,7 @@ lines:
trigger: post_conversation
prerequisites:
facts:
- fact_id: kael_evasion
- fact_id: behavioral.kael_evasion
min_confidence: direct
priority: 9
tags: [npc, kael, tell, friend-arc]
@@ -220,7 +220,7 @@ lines:
trigger: observe_npc
prerequisites:
facts:
- fact_id: torek_spending_pattern
- fact_id: investigation.torek_spending_pattern
min_confidence: knows_of
tags: [npc, torek, operational, caution]
@@ -229,7 +229,7 @@ lines:
trigger: post_conversation
prerequisites:
relationship:
target: kael_davan
target: npc:kael-davan
state: person_of_interest
priority: 9
tags: [npc, kael, contaminated-trust, friend-arc]
+468
View File
@@ -0,0 +1,468 @@
# Character Voice Speech Patterns
**Authoring Specification** | Ticket: #310 | Sprint: 5
**Author:** Mellanie (Copywriter)
**Date:** 2026-02-13
---
## Purpose
This document defines the **sentence-level execution rules** for both playable characters. Not personality. Not emotional arc. Not what they notice. Those are in the [Dual Lens Authoring Guide](dual-lens-authoring-guide.md) and [Smuggler Voice Card](smuggler-voice-card.md).
This is the micro-level: contractions, punctuation, sentence starters, stress markers, word choices, verbal tics. The decisions that make 500 lines sound like one person wrote them in one sitting.
Use this document alongside the voice anchors. The anchors show you what each character sounds like. This document tells you **why** they sound that way, mechanically, so you can reproduce it.
**Cross-references:**
- [Dual Lens Authoring Guide](dual-lens-authoring-guide.md) — Chapter 7 (Voice Signatures)
- [Smuggler Voice Card](smuggler-voice-card.md) — Full smuggler voice reference
- [Smuggler Moral Arc](smuggler-moral-arc.md) — How voice shifts across moral phases
---
## Part 1: The Smuggler
### 1.1 Contraction Rules
**Default: Always contract.** The smuggler speaks informally. Uncontracted forms signal emphasis or emotional weight.
| Form | Smuggler Uses | When Uncontracted |
|------|--------------|-------------------|
| she's / he's / it's | Always | Never |
| don't / won't / can't | Always | Emphasis: *"I will not cover for him again."* |
| that's / there's / what's | Always | Never |
| I'm / I've / I'd | Always | Never |
| shouldn't / couldn't / wouldn't | Always | Moral weight: *"I should not have let him go alone."* |
| isn't / aren't / wasn't | Always | Never |
**The rule:** When the smuggler stops contracting, something matters. Uncontracted = deliberate. Use no more than once per 30 lines.
---
### 1.2 Punctuation Patterns
| Mark | Usage | Frequency |
|------|-------|-----------|
| **Period** | Primary. Ends fragments and sentences alike. | Every line. |
| **Dash (em)** | Interruption. Self-correction. Trail into implication. | 1 in 4 lines. *"Kael's late -- not like him."* |
| **Ellipsis** | Trailing thought. Unfinished worry. Suspicion she won't name. | 1 in 6 lines. *"Same old Kael. Same jokes. ...What are you not telling me?"* |
| **Question mark** | Internal questions. Always rhetorical or worried, never analytical. | 1 in 5 lines. *"Who was that?"* |
| **Exclamation** | Almost never. Only in genuine shock or fear. | Max 1 per 50 lines. |
| **Colon/semicolon** | Never. Too formal. | 0. |
| **Parentheses** | Never. | 0. |
**Dash vs. ellipsis:** Dash is sharp -- a thought cut off or redirected. Ellipsis is soft... a thought that fades because she doesn't want to finish it. Dash = interrupted. Ellipsis = avoided.
---
### 1.3 Sentence Starters
The smuggler's monologue opens with specific patterns. These create rhythmic consistency across hundreds of lines.
**High-frequency starters (use freely):**
- Name + observation: *"Kael's distracted."* / *"Voss is tense."*
- Demonstrative + noun: *"That container."* / *"That face."*
- Short declarative: *"Good."* / *"Not good."* / *"There."*
- Sensory: *"Recycled air."* / *"Footsteps behind me."*
**Medium-frequency starters (1 in 5 lines):**
- Conditional: *"If Voss kept the schedule thin..."*
- Temporal: *"Morning shift."* / *"Fifty minutes."*
- Hedged: *"Probably nothing."* / *"Could be worse."*
**Low-frequency starters (1 in 10 lines, emotional beats only):**
- Self-referential: *"My hands are shaking."* / *"Can't think straight."*
- Imperative self-talk: *"Keep moving."* / *"Don't look back."*
**Never starts with:**
- "I think..." (too reflective)
- "It appears..." / "It seems..." (too formal)
- "One could..." / "Perhaps..." (wrong register entirely)
- "Interestingly..." / "Notably..." (detective vocabulary)
---
### 1.4 Sentence Length Patterns
**Target distribution across 100 smuggler monologue lines:**
| Length | Word Count | Percentage | Example |
|--------|-----------|------------|---------|
| Fragment | 1-4 words | 25% | *"Kael's here. Good."* |
| Short | 5-10 words | 45% | *"The freight bay looks better in the dark."* |
| Medium | 11-18 words | 25% | *"Shift transition in thirty minutes. If Voss kept the schedule thin, the route's clear."* |
| Long | 19-25 words | 5% | Reserved for knife-twist moments only. |
**Average:** 10 words per monologue fire. Two sentences max per fire.
**Rhythm rule:** A medium sentence should be followed or preceded by a fragment. Two medium sentences in a row sounds like the detective. Break them up.
---
### 1.5 Stress and Anxiety Markers
When the smuggler is nervous or stressed, her voice changes in specific ways:
| Marker | Baseline | Under Stress |
|--------|----------|-------------|
| **Sentence length** | Fragments + short | Fragments get shorter. 1-3 words. Staccato. |
| **Questions** | Occasional, rhetorical | Increase. Rapid. *"Who was that? When did they get here? Does Nils know?"* |
| **Dashes** | 1 in 4 | 1 in 2. Thoughts interrupt each other. |
| **People references** | First names, warm | First names, clipped. *"Kael."* not *"Kael's here."* |
| **Physical sensation** | Rare | Emerges. *"Hands are cold."* / *"Stomach won't settle."* |
| **Humor** | Dry, occasional | Disappears. Zero humor under real stress. |
| **Self-talk** | Rare | Appears. *"Keep it together."* / *"Breathe."* |
| **Operational details** | Present, measured | Sharpens. Hyper-specific times, routes, names. Control response. |
**The pattern:** Stress makes the smuggler go SMALLER and FASTER. Fragments shrink. Dashes multiply. Questions pile up. Physical sensation surfaces. She retreats into operational specifics as a coping mechanism — counting minutes, naming routes, tracking people. Control what you can.
---
### 1.6 Frustration Register
Frustration is different from stress. Stress is external threat. Frustration is blocked action.
| Marker | Stressed | Frustrated |
|--------|----------|-----------|
| **Sentence type** | Staccato fragments | Flat declarations |
| **Tone** | Rapid, questioning | Blunt, clipped |
| **Characteristic form** | *"Who? When? Why?"* | *"Great."* / *"Perfect."* / *"Of course."* |
| **Humor** | Gone | Returns as sarcasm. Dark. Bitter. |
| **Swearing** | No (too panicked) | Yes, but mild. *"Damn."* / *"Hell."* Never obscene. |
| **Target** | Self-directed worry | Outward-directed. Blames people by name. |
**Examples:**
Stressed: *"Kael wasn't at the dock. He's never late. Something happened."*
Frustrated: *"Voss changed the rotation. Again. Of course he did."*
**The key difference:** Stress speeds up. Frustration slows down and goes flat.
---
### 1.7 Verbal Tics and Recurring Patterns
These are micro-patterns that recur across the smuggler's lines. Not every line, but often enough to create subliminal consistency.
| Pattern | Example | Frequency |
|---------|---------|-----------|
| **"Good." as standalone approval** | *"Kael's here. Good."* / *"Route's clear. Good."* | 1 in 15 lines |
| **"Not like [name]" for behavioral deviation** | *"Not like him to be jumpy."* / *"Not like Kael."* | 1 in 20 lines |
| **"Something's [adjective]" for unnamed unease** | *"Something's off."* / *"Something's wrong."* | 1 in 20 lines |
| **"Home sweet home" / ironic domesticity** | *"Home sweet home"* about the cargo bay | 1 in 50 lines (rare, impactful) |
| **Time-as-countdown** | *"Fifty minutes."* / *"Twenty minutes of reduced oversight."* | 1 in 10 lines (operational mode) |
| **"Should" for guilty obligation** | *"Should check on Naia."* / *"Should've said something."* | 1 in 15 lines |
**What the smuggler never says:**
- "Interesting" (detective word)
- "Noted" (detective word)
- "Perhaps" (too equivocal -- she decides or she worries)
- "Evidently" / "Apparently" (institutional register)
- "Investigate" (she doesn't investigate, she looks into things)
- "Anomaly" / "Irregularity" / "Discrepancy" (institutional vocabulary)
- "Subject" referring to a person (that's the detective)
---
### 1.8 Confidence Register
When things are going well -- routine shift, team functioning, no threats:
| Marker | Value |
|--------|-------|
| **Length** | Short-to-medium. Comfortable rhythm. |
| **Tone** | Dry warmth. Affection through understatement. |
| **Humor** | Present. Situational. |
| **People** | First names with positive color. *"Kael's already at it."* |
| **Environment** | Sensory appreciation, even ironic. *"Home sweet home."* |
| **Fragments** | Paired -- setup + reaction. *"Morning shift. Could be worse."* |
**Confident smuggler = fewest words.** When nothing's wrong, she barely thinks aloud. Comfort is silence. The monologue system should fire LESS when the smuggler is at baseline. When it does fire, lines are short, warm, laconic.
---
## Part 2: The Detective
### 2.1 Contraction Rules
**Default: Contracts in personal mode, doesn't contract in analytical mode.** The detective's contraction usage is a relationship and emotional marker.
| Context | Contraction | Example |
|---------|-------------|---------|
| **Analytical observations** | No | *"That is the third time."* / *"He does not meet my eyes."* |
| **Self-directed notes** | No | *"Deviation from established baseline. Noted."* |
| **Personal reactions** | Yes | *"She's not lying. But she's not telling me everything."* |
| **Talking to/about Sera** | Yes | *"Sera's connected here."* / *"She's always been reliable."* |
| **Talking about targets** | No | *"Davan does not deviate from routine."* |
| **Stressed/emotional** | Yes (control slips) | *"Can't place it. Something's wrong."* |
**The rule:** Uncontracted = professional distance. Contracted = personal engagement. When contractions appear in an analytical line, the detective is losing objectivity. That's information for the reader.
**Ratio across 100 lines:** ~60% contracted, ~40% uncontracted. The mix itself is the voice.
---
### 2.2 Punctuation Patterns
| Mark | Usage | Frequency |
|------|-------|-----------|
| **Period** | Primary. Clean sentence endings. | Every line. |
| **Dash (em)** | Self-correction. Reframing. *"Coincidence -- or pattern?"* | 1 in 6 lines. |
| **Ellipsis** | Rare. Only for personal doubt. *"...But reliable about what?"* | 1 in 12 lines. |
| **Question mark** | Frequent. Analytical questions, hypotheses. | 1 in 3 lines. *"Coincidence?"* / *"Worth noting?"* |
| **Exclamation** | Never. The detective does not exclaim. | 0. |
| **Colon** | Occasional. Labeling. *"Dock worker: Davan, K."* | 1 in 15 lines. |
| **Semicolon** | Never. | 0. |
| **Parentheses** | Never in monologue. | 0. |
**Key difference from smuggler:** The detective uses question marks analytically, not anxiously. Smuggler's questions are worried (*"Who was that?"*). Detective's questions are filed (*"Coincidence?"*). Same punctuation, different function.
---
### 2.3 Sentence Starters
**High-frequency starters:**
- Category label: *"Dock worker."* / *"Manifest discrepancy."* / *"Commission terminal."*
- Quantified observation: *"Three times."* / *"Twelve patrons tonight."* / *"Second shift change."*
- Short assessment: *"Standard."* / *"Noted."* / *"Unusual."*
**Medium-frequency starters (1 in 5 lines):**
- Comparative: *"Down from yesterday's sixteen."* / *"Elevated from his baseline."*
- Conditional: *"If the rotation holds..."* / *"Assuming standard turnaround..."*
- Personal: *"Good to see Sera."* / *"At least someone speaks my language."*
**Low-frequency starters (emotional beats only):**
- Concessive: *"Didn't want to see that. But there it is."*
- Self-aware: *"I'm reading too much into this."*
**Never starts with:**
- A first name for someone who isn't Sera or already a trusted ally (first-name = relationship, and the detective doesn't have many)
- *"My gut says..."* (smuggler register)
- A sensory fragment (*"Recycled air."* is smuggler territory)
- *"Damn."* / *"Hell."* (smuggler swears, detective doesn't)
---
### 2.4 Sentence Length Patterns
**Target distribution across 100 detective monologue lines:**
| Length | Word Count | Percentage | Example |
|--------|-----------|------------|---------|
| Fragment | 1-4 words | 10% | *"Noted."* / *"Coincidence?"* |
| Short | 5-10 words | 35% | *"Davan's on shift. Standard routine."* |
| Medium | 11-18 words | 40% | *"Three different excuses, same result. That's not coincidence -- that's data."* |
| Long | 19-25 words | 15% | Full analytical chain. Still under display limit. |
**Average:** 13 words per monologue fire. Often two sentences per fire.
**Rhythm rule:** The detective's lines are more even-length than the smuggler's. Less variation. Steady rhythm. When a fragment appears (*"Noted."*), it punctuates -- it's a bookend, not the norm.
---
### 2.5 Stress and Anxiety Markers
When the detective is stressed, the professional veneer cracks in specific ways:
| Marker | Baseline | Under Stress |
|--------|----------|-------------|
| **Sentence length** | Medium, structured | Shortens. Still complete sentences, but tighter. |
| **Contractions** | Mixed | Increase. Professional distance collapses. *"Can't think. Can't see it."* |
| **Questions** | Analytical, filed | Still questions, but less controlled. *"What am I missing?"* |
| **Labeling** | Category + surname | Drops. Names get shorter. *"Venn"* instead of *"Venn, S."* |
| **Self-awareness** | Occasional | Increases. *"I'm too close to this."* / *"Focus."* |
| **Institutional frame** | Always present | Starts to slip. Personal vocabulary leaks in. |
| **Physical sensation** | Never | Barely surfaces. *"Need air."* / *"Hands steady. Good."* |
**The pattern:** Stress makes the detective go SHORTER and MORE PERSONAL. The institutional shell thins. Contractions multiply. Physical sensation -- something the detective normally suppresses -- starts to appear. The analytical questions become self-directed. This is the detective becoming human under pressure.
**Critical difference from smuggler:** The smuggler gets smaller and faster (staccato). The detective gets shorter and more human (vulnerable). Same direction, different texture.
---
### 2.6 Frustration Register
| Marker | Stressed | Frustrated |
|--------|----------|-----------|
| **Sentence type** | Shorter, personal | Clipped, dismissive |
| **Tone** | Vulnerable | Controlled anger |
| **Characteristic form** | *"What am I missing?"* | *"Standard."* (but meaning the opposite) |
| **Humor** | Gone | Wry. Self-deprecating. *"Some detective."* |
| **Swearing** | No | No. The detective does not swear. Frustration surfaces as understatement. |
| **Target** | Self-directed doubt | Process-directed. *"This case."* / *"This district."* |
**Examples:**
Stressed: *"Can't place it. Something's off with Sera and I can't see what."*
Frustrated: *"Another dead end. Standard. Let's see what the next shift change tells me."*
**The key difference:** Stress makes the detective vulnerable. Frustration makes the detective sardonic. The detective's frustration is COLDER than the smuggler's -- not hot anger, but controlled disappointment.
---
### 2.7 Verbal Tics and Recurring Patterns
| Pattern | Example | Frequency |
|---------|---------|-----------|
| **"Noted." as filing action** | *"Lattice activity elevated. Noted."* | 1 in 12 lines |
| **"Coincidence?" as analytical doubt** | *"Third time. Coincidence?"* | 1 in 20 lines |
| **Surname-comma-initial** | *"Davan, K."* / *"Venn, S."* / *"Lintar, T."* | 1 in 10 lines (observation mode) |
| **"That's data" for pattern confirmation** | *"Three excuses, same result. That's data."* | 1 in 25 lines |
| **"Let's see what..." for next-step framing** | *"Let's see what the shift change tells me."* | 1 in 15 lines |
| **"Flag it" / "File it"** | *"Overnight container. Flag it."* | 1 in 15 lines |
| **"Worth [verb]ing" for soft priority** | *"Worth noting."* / *"Worth a second look."* | 1 in 20 lines |
**What the detective never says:**
- "Home sweet home" or any domestic comfort language (smuggler territory)
- "Damn" / "Hell" (the detective does not swear)
- "My gut says" / "I have a feeling" (the detective trusts data, not instinct)
- "Buddy" / "pal" / casual address to non-allies
- "Should've" in guilt context (smuggler pattern -- the detective doesn't do guilt, he does duty)
- A first name for someone he doesn't personally trust (Sera is first-name; Kael is always "Davan" or "Davan, K.")
---
### 2.8 Confidence Register
When things are going well -- evidence accumulating, pattern emerging, case progressing:
| Marker | Value |
|--------|-------|
| **Length** | Medium. Structured. Comfortable analytical rhythm. |
| **Tone** | Controlled satisfaction. Professional. |
| **Humor** | Wry, appreciative. *"Only place that doesn't smell like freight lubricant."* |
| **Labeling** | Full and precise. Enjoys the categorization. |
| **Questions** | Decrease. Answers are forming. |
| **Self-reference** | Minimal. The case is the subject, not the detective. |
**Confident detective = most structured.** Clean sentences. Full labels. The institutional frame fits comfortably. When the detective is in flow, the lines are elegant and precise. Confidence sounds like competence.
---
## Part 3: Comparative Quick Reference
### 3.1 Side-by-Side Parameters
| Parameter | Smuggler | Detective |
|-----------|----------|-----------|
| **Avg. words per line** | 10 | 13 |
| **Fragment frequency** | 25% | 10% |
| **Contractions** | Always (exception = emphasis) | Mixed (personal = yes, analytical = no) |
| **Questions** | Worried, rhetorical | Analytical, filed |
| **Dashes** | 1 in 4 (interruption) | 1 in 6 (reframing) |
| **Ellipses** | 1 in 6 (avoidance) | 1 in 12 (doubt) |
| **Exclamations** | 1 in 50 (shock only) | Never |
| **Colons** | Never | 1 in 15 (labeling) |
| **Stress response** | Smaller + faster | Shorter + more personal |
| **Frustration response** | Flat + sarcastic | Clipped + sardonic |
| **Swearing** | Mild, under frustration | Never |
| **Names** | Always first name | Surname-first for targets, first-name for allies |
| **"Noted"** | Never | 1 in 12 lines |
| **"Good."** | 1 in 15 lines | Never (too casual) |
| **Physical sensation** | Under stress | Almost never |
| **Self-talk** | Under stress (*"Keep it together."*) | Under stress (*"Focus."*) |
---
### 3.2 The Contraction Test
A quick diagnostic for voice consistency:
1. Read the line aloud.
2. Count contractions.
3. If a smuggler line has zero contractions, something's wrong (unless it's a deliberate emphasis beat).
4. If a detective line has ALL contractions, something's wrong (unless it's a personal/emotional beat about Sera).
5. If you can't tell which character the line belongs to, rewrite it.
---
### 3.3 The Name Test
1. Does the line reference a person?
2. Smuggler: Is it a first name? If not, fix it.
3. Detective: Is it surname-first for non-allies, first-name for allies only? If not, fix it.
4. Does the detective use "Davan, K." format? Good -- that's institutional reflex.
5. Does the smuggler use "Davan" anywhere? Bad -- she'd say "Kael."
---
### 3.4 Emotional Escalation Comparison
Same emotional trajectory, different voice at each stage:
**Baseline (content):**
- Smuggler: *"Morning shift. Recycled air and cargo lubricant. Home sweet home."*
- Detective: *"Logistics hub. Standard prefab, heavy foot traffic. Let's see what the shift change tells me."*
**Mild concern:**
- Smuggler: *"Kael's distracted today. Probably nothing."*
- Detective: *"Davan's behavior is off-baseline. Worth monitoring."*
**Alarm:**
- Smuggler: *"That wasn't anyone from our rotation. And Kael didn't tell me about a meeting."*
- Detective: *"Davan in Corridor B-7. Off-schedule. Unregistered contact. That is not routine."*
**Hurt / Conflict:**
- Smuggler: *"He looked left. He always looks left when he's making something up. Kael is lying to me."*
- Detective: *"She's not lying. But she's not telling me everything. Sera, what do you know?"*
**Contaminated trust:**
- Smuggler: *"Same old Kael. Laughing at the same jokes. ...What are you not telling me?"*
- Detective: *"Same booth. Same warm smile. Same offer to buy me a drink. ...Everything except whatever she's not saying."*
Note: Both characters use ellipsis at the contaminated trust stage. It's the one punctuation pattern they share -- the trailing thought of someone who doesn't want to finish the sentence. But the smuggler's ellipsis is avoidance (she doesn't want to think it). The detective's ellipsis is analytical regret (he sees it and wishes he didn't).
---
## Part 4: Display Integration
### 4.1 Hard Constraints (from Smuggler Voice Card, Section 6)
These apply to BOTH characters:
| Constraint | Value |
|------------|-------|
| Max characters | ~160 |
| Max visual lines | 2 |
| Display time | 4-6 seconds (length-adjusted) |
| Target word count | 10-25 words (smuggler avg 10, detective avg 13) |
| Fade behavior | Fade in/out |
| Self-contained | Each line must read independently |
### 4.2 Character Tints
| Character | Tint | Hex |
|-----------|------|-----|
| Smuggler | Amber-white | `#f0e0c8` |
| Detective | Cool-white | TBD (Araminta) |
Voice must be distinguishable WITHOUT color. Color confirms, does not create.
---
## Part 5: Authoring Validation Checklist
Before submitting ANY monologue line, run these 8 checks:
### For smuggler lines:
1. **Contractions present?** If zero contractions and it's not a deliberate emphasis beat, rewrite.
2. **First names used?** If a surname appears for someone she knows, rewrite.
3. **Under 18 words?** If over 18 and it's not a knife-twist, cut.
4. **Fragments present?** At least one fragment per 3 lines. If a stretch of 4+ lines has no fragments, rewrite.
5. **No institutional vocabulary?** Search for: anomaly, irregularity, discrepancy, investigation, subject, evidence, deviation, baseline. If found, replace with concrete/physical equivalent.
### For detective lines:
1. **Contraction pattern correct?** Analytical = uncontracted. Personal = contracted. Mixed in a single line = deliberate emotional leak.
2. **Surnames for targets?** If the detective calls Kael "Kael" (not "Davan"), that's a voice break unless the detective has formed a personal bond.
3. **Complete sentences dominant?** If more than 15% fragments in a stretch of 10 lines, too smuggler-like.
4. **No swearing?** The detective never swears. Not even mild. Frustration surfaces as understatement and irony.
5. **No physical sensation language?** Unless under genuine stress. The detective monitors himself through professional assessment, not body awareness.
---
**End Voice Patterns Specification**