Merge remote-tracking branch 'origin/copy'

# Conflicts:
#	CHANGELOG.md
This commit is contained in:
2026-03-13 12:23:37 +01:00
126 changed files with 1672 additions and 32891 deletions
+19
View File
@@ -14,10 +14,29 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
- Stronger few-shot examples for Friendly and RoutineDeviation tells (#651)
- AI-Enhanced Dialogue toggle — settings panel toggle with layered hardware detection (RAM/TPT/degradation), battery auto-suspend with player override, warning label (#646, D-138)
- PlatformInfo autoload — client-side OS abstraction centralizing all platform queries: power state, memory, CPU, GPU, display, locale, file paths, diagnostics helper (#659, D-141)
- Vael and Osse culture profiles with voice personas, behavior modifiers, and explicit NEVER blocks (#653)
- Behavior modifiers for all three cultures — 7-category contract: work_pace, physical_manner, social_signal, task_completion, environmental_scan, offduty_posture, authority_response (#634)
- Zone-type template architecture — behavior primitives moved from per-location files to reusable zone-type templates (content/global/zone-types/). 31 zone types planned for v1.0 (#661, D-142)
- POI three-tier system — large POIs as zone types, abandoned flag for decay variants, poi_overlay for small landmarks (D-142)
- Authoring guides for base text elevation, culture creation, and content directory structure
- D-140: dialogue re-voicing quality constraints — Paula's six rules
- D-142: zone-type template architecture for scalable NPC behavior across 300+ systems
### Removed
- v0.1 content loading system — server/src/content/ module (8200 lines), tooling/content-converter/, tooling/validate-content, content-ron/, content/_meta/ (#655, D-122)
- AiDialogueDetector — duplicate of HardwareDetector, replaced by PlatformInfo abstraction (#659)
- v0.1 hand-authored Krenn dialogue, monologue, and NPC profiles — 64 files superseded by generated NPCs (#656, D-122)
- Detective mission system — investigation knowledge, lattice-commission faction, design docs, workshop archives (#657, D-117)
### Fixed
- Name pool cross-contamination — zero overlaps across Krenn, Vael, and Osse cultures
- D-141 → D-142 reference correction in zone-type templates
- Modifier coverage expanded to 2+ per category for all cultures; authority_response differentiated Krenn/Osse
- Gendered pronouns removed from culture-neutral zone-type templates
- Ungrounded lore terms (Syndic, Meridian registration) replaced with generic descriptors in Osse culture
- Stale notes in content-structure-canonical.md and base-text-authoring-guide.md corrected
- Legacy annotation added to overheard.yaml (#664 tracks replacement)
- Dead dual_lens properties stripped from environmental YAML
### Changed
- Protocol version bumped to 20 — ObserverSnapshot includes settings_response field (#627)
@@ -1,184 +0,0 @@
# 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: kael-davan_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: kael-davan_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: kael-davan_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: [content]
topic: [cargo]
tags: [kael, ring-ops, renn, operational]
- id: kael-davan_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: [frustrated]
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: kael-davan_d_005
text: "What are you — wait. How long have you been standing there?"
role: dock-worker
access: [insider]
trust: surface
situation: [confrontation]
mood: [frustrated]
topic: [danger]
tags: [kael, contradiction, phase-3]
- id: kael-davan_d_006
text: "That was nobody. Maintenance contact. It's handled."
role: dock-worker
access: [insider]
trust: surface
situation: [confrontation]
mood: [frustrated]
topic: [routine]
tags: [kael, deflection, lying, phase-4]
- id: kael-davan_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: [frustrated]
topic: [trust]
tags: [kael, deflection, hostile-path, phase-4]
# ========================================
# SECRET — corridor confessions
# ========================================
- id: kael-davan_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: [anxious]
topic: [personal, trust]
tags: [kael, confession, phase-5]
- id: kael-davan_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: [anxious]
topic: [danger, trust]
tags: [kael, confession, nils, phase-5]
- id: kael-davan_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: [anxious]
topic: [personal]
tags: [kael, confession, phase-5]
knowledge_grant:
fact_id: knowledge.kael_exit_plan
confidence: knows_details
# ========================================
# LAYER 2 GREETING VARIANTS — D-028 Layer 2
# Ticket #170 (Sprint 15). situation: [greeting] fires on initial contact.
# Access tier + mood encode relationship history state.
# Context: restricted maintenance corridors. Any stranger here is immediately
# suspicious. Even trusted contacts get terse, operational greetings.
# ========================================
# first_meeting: InteractionMemory.count == 0. Any stranger in restricted corridors is a problem.
- id: kael-davan_d_011
text: "This is a restricted section. Who authorized you back here?"
role: dock-worker
access: [public]
trust: surface
situation: [greeting]
mood: [focused]
topic: [danger, routine]
tags: [kael, greeting, first-meeting, layer2]
notes: "Layer 2 greeting — first meeting in restricted corridors. Immediate challenge. Any stranger back here is suspicious regardless of intent."
# established — peer/smuggler context: count >= 3, RelationshipState: Known/Friendly → Peer/Insider access.
- id: kael-davan_d_012
text: "You're on time. Clear all the way to the junction."
role: dock-worker
access: [peer, insider]
trust: surface
situation: [greeting]
mood: [content]
topic: [cargo, colleague]
tags: [kael, greeting, repeat-visit, peer-tone, layer2]
notes: "Layer 2 greeting — established, operational. All business. Kael treats a trusted repeat visitor as crew — no pleasantries, just the essential handoff information."
# established — authority/detective context: count >= 3, RelationshipState: PersonOfInterest → Authority access.
- id: kael-davan_d_013
text: "You keep showing up back here. You have clearance for this section?"
role: dock-worker
access: [authority]
trust: surface
situation: [greeting]
mood: [suspicious]
topic: [danger, routine]
tags: [kael, greeting, repeat-visit, authority-tone, layer2]
notes: "Layer 2 greeting — repeat with authority figure in restricted section. Professionally defensive. Kael challenges them but can't bar entry if they have clearance."
# post-confrontation: confrontation logged. Kael is cornered on his own operational ground.
- id: kael-davan_d_014
text: "You followed me here."
role: dock-worker
access: [peer, insider]
trust: surface
situation: [greeting]
mood: [hostile, suspicious]
topic: [danger, trust]
tags: [kael, greeting, post-confrontation, layer2]
notes: "Layer 2 greeting — post-confrontation, restricted corridors. Accusatory, not a question. Kael feels cornered. This is where the contradiction lives."
@@ -1,379 +0,0 @@
# Dialogue: ring-operative at Maintenance Corridors
# NPC: Generic ring operative (Tier 3 template — members without individual profiles)
# Voice: two registers. Surface: maintenance worker, brief, task-focused. Real: coded, precise, never explicit.
# The crucial thing: both registers sound identical to a casual listener.
# Ring-aware: full ring membership. Knows the route, the window, the players.
# Ring code vocabulary (from Sova texture appendix):
# "running maintenance" = cover for ring operation
# "the usual pickup" = ring cargo handoff
# "cans are ready" = containers cleared for movement
# "manifest is clean" = paperwork cover confirmed
# "Drin was asking" = warning, inspection proximity
# "dead air" = Meridian surveillance gaps
# "the gap" = maintenance corridors, the route itself
# Ticket: #192 | Sprint: 12
location: maintenance-corridors
role: ring-operative
lines:
# ==========================================
# SURFACE COVER — sounds like maintenance work
# ==========================================
- id: ring-operative_d_001
text: "Running maintenance on the B-7 conduit. Could be a while."
role: ring-operative
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [ring-operative, surface-cover, b7]
dual_lens:
smuggler: "Cover phrase. He's not doing maintenance."
detective: "Maintenance worker. Conduit repair. Routine."
notes: "'Running maintenance' is the canonical ring cover phrase."
- id: ring-operative_d_002
text: "Bay four access from here is faster than going around. If you're in a hurry."
role: ring-operative
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [ring-operative, surface-cover, bay-four, spatial]
dual_lens:
smuggler: "He's telling me the route is faster. This is spatial information, not just courtesy."
detective: "Ring operative casually establishes corridor-to-bay-four spatial relationship. Note it."
- id: ring-operative_d_003
text: "Quiet in here tonight. Good working conditions."
role: ring-operative
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [ring-operative, surface-cover, ambient]
dual_lens:
smuggler: "Dead air confirmed. Meridian's not picking this up."
detective: "Routine corridor comment."
- id: ring-operative_d_004
text: "Pael was through here earlier. Seal replacement on the ventilation unit."
role: ring-operative
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine, colleague]
mood: [content]
tags: [ring-operative, surface-cover, pael, corridor-traffic]
dual_lens:
smuggler: "Pael was through. Legitimate. Corridor's been active — that means traffic covers us."
detective: "References Pael's B-7 presence without suspicion. Maintenance workers know each other's routes."
- id: ring-operative_d_005
text: "C-4 access is at the far end. About three minutes from here."
role: ring-operative
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [ring-operative, surface-cover, c4, spatial]
dual_lens:
smuggler: "He's giving me the timing. Three minutes to C-4 from this point."
detective: "Operative establishes C-4 proximity to maintenance corridor. That's the link."
knowledge_grant:
fact_id: location.smuggling_route
confidence: suspects
# ==========================================
# OPERATIONAL COORDINATION — insider/real only
# ==========================================
- id: ring-operative_d_006
text: "Cans are ready. Bay four, per the schedule."
role: ring-operative
access: [insider]
trust: real
situation: [routine, shift_transition]
topic: [cargo, routine]
mood: [focused]
tags: [ring-operative, ring-ops, coded, cans-ready]
dual_lens:
smuggler: "Containers cleared. Bay four. We're on."
detective: "Never hears this line."
- id: ring-operative_d_007
text: "Manifest is clean. Window opens in eighteen minutes."
role: ring-operative
access: [insider]
trust: real
situation: [shift_transition]
topic: [cargo, routine]
mood: [focused]
tags: [ring-operative, ring-ops, coded, manifest-clean, window]
dual_lens:
smuggler: "Paperwork's set. Eighteen minutes. That's earlier than planned — adjust."
detective: "Never hears this line."
- id: ring-operative_d_008
text: "Usual pickup. Route's the same."
role: ring-operative
access: [insider]
trust: real
situation: [shift_transition, routine]
topic: [cargo, routine]
mood: [focused]
tags: [ring-operative, ring-ops, coded, usual-pickup]
dual_lens:
smuggler: "Same route, same handoff. No variations."
detective: "Never hears this line."
- id: ring-operative_d_009
text: "The gap's clear. Scan's done at 14:20. Next window's yours."
role: ring-operative
access: [insider]
trust: real
situation: [shift_transition]
topic: [cargo, routine]
mood: [focused]
tags: [ring-operative, ring-ops, coded, scan-gap, surveillance]
dual_lens:
smuggler: "14:20 scan, then the window opens. Twenty-five minutes clear."
detective: "Never hears this line."
knowledge_grant:
fact_id: investigation.surveillance_gaps
confidence: knows_details
- id: ring-operative_d_010
text: "Drin was asking about B-7. Twice today."
role: ring-operative
access: [insider]
trust: real
situation: [routine, confrontation]
topic: [danger, colleague]
mood: [frustrated]
tags: [ring-operative, ring-ops, coded, drin-asking, warning]
dual_lens:
smuggler: "Drin's circling B-7. That's a warning. Push the pickup or hold it."
detective: "Never hears this line."
knowledge_grant:
fact_id: investigation.drin_inspection_pattern
confidence: suspects
- id: ring-operative_d_011
text: "Dead air through here to the C-4 junction. No coverage."
role: ring-operative
access: [insider]
trust: real
situation: [routine]
topic: [routine]
mood: [focused]
tags: [ring-operative, ring-ops, coded, dead-air, surveillance]
dual_lens:
smuggler: "Full confirmation. Meridian doesn't reach this section."
detective: "Never hears this line."
knowledge_grant:
fact_id: investigation.surveillance_gaps
confidence: knows_details
- id: ring-operative_d_012
text: "Voss confirmed the hold clears at 1400. He'll run the bay himself."
role: ring-operative
access: [insider]
trust: real
situation: [shift_transition]
topic: [cargo, routine]
mood: [focused]
tags: [ring-operative, ring-ops, voss, bay-four, clearance]
dual_lens:
smuggler: "Voss is personally running bay four at 1400. That's the signal the window is clear."
detective: "Never hears this line."
- id: ring-operative_d_013
text: "Kael's on dock. He knows."
role: ring-operative
access: [insider]
trust: real
situation: [routine, shift_transition]
topic: [colleague, routine]
mood: [focused]
tags: [ring-operative, ring-ops, kael, coordination]
dual_lens:
smuggler: "Kael's in position. Ring is coordinated."
detective: "Never hears this line."
# ==========================================
# PRESSURE / WARNING SIGNALS
# ==========================================
- id: ring-operative_d_014
text: "Commission eyes on the terminal floor. Not here yet."
role: ring-operative
access: [insider]
trust: real
situation: [confrontation, investigation]
topic: [danger, institution]
mood: [frustrated]
tags: [ring-operative, ring-ops, commission, warning]
dual_lens:
smuggler: "Detective is visible on the main floor. Corridors are still clear."
detective: "Never hears this line."
- id: ring-operative_d_015
text: "Hold the run. Drin's in the corridor section."
role: ring-operative
access: [insider]
trust: real
situation: [confrontation]
topic: [danger]
mood: [frustrated]
tags: [ring-operative, ring-ops, drin, abort-signal]
dual_lens:
smuggler: "Stop. Drin's in position. The window's closed."
detective: "Never hears this line."
- id: ring-operative_d_016
text: "Maret filed again. Voss has it. Don't move anything tonight."
role: ring-operative
access: [insider]
trust: real
situation: [confrontation, routine]
topic: [danger, institution]
mood: [frustrated]
tags: [ring-operative, ring-ops, maret, voss, caution]
dual_lens:
smuggler: "Maret flagged something. Voss is managing it. Stand down tonight."
detective: "Never hears this line."
- id: ring-operative_d_017
text: "We're clean. Same time tomorrow."
role: ring-operative
access: [insider]
trust: real
situation: [shift_end, routine]
topic: [routine]
mood: [content]
tags: [ring-operative, ring-ops, run-complete, closing]
dual_lens:
smuggler: "Run's done. No issues. Tomorrow."
detective: "Never hears this line."
# ==========================================
# IF DETECTIVE SOMEHOW ENTERS — surface only
# ==========================================
- id: ring-operative_d_018
text: "Restricted access back here. Service personnel only."
role: ring-operative
access: [authority, public]
trust: surface
situation: [investigation, confrontation]
topic: [institution, routine]
mood: [suspicious]
tags: [ring-operative, detective-path, access-denial]
- id: ring-operative_d_019
text: "I'm running maintenance. If there's a Commission access request, file it through Voss."
role: ring-operative
access: [authority]
trust: surface
situation: [investigation]
topic: [institution, routine]
mood: [suspicious]
tags: [ring-operative, detective-path, voss-redirect]
dual_lens:
smuggler: "Never encounters this."
detective: "Operative redirects to Voss. Everyone redirects to Voss. That's structural, not coincidence."
- id: ring-operative_d_020
text: "Nothing unusual back here. Conduit work. Same every cycle."
role: ring-operative
access: [authority, public]
trust: surface
situation: [investigation]
topic: [routine]
mood: [suspicious]
tags: [ring-operative, detective-path, deflection]
# ==========================================
# GENERATION PASS — surface cover variants
# Surface-only: covers routine corridor presence without operational tells.
# ==========================================
- id: ring-operative_d_021
text: "Power relay's been cycling weird. I'm watching it."
role: ring-operative
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [ring-operative, surface-cover, generation-pass]
- id: ring-operative_d_022
text: "Pael was supposed to handle B-7. He didn't show."
role: ring-operative
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine, colleague]
mood: [content]
tags: [ring-operative, surface-cover, pael, generation-pass]
- id: ring-operative_d_023
text: "Watch the floor here. Drain panel's been loose three cycles."
role: ring-operative
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [ring-operative, surface-cover, generation-pass]
- id: ring-operative_d_024
text: "Airflow's better down the B-section. C-section's got the recycler issue."
role: ring-operative
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [ring-operative, surface-cover, spatial, generation-pass]
- id: ring-operative_d_025
text: "You want the service bay, it's left at the junction. Don't go right — that's the restricted access."
role: ring-operative
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [ring-operative, surface-cover, navigation, generation-pass]
dual_lens:
smuggler: "He's directing people away from the route. Social traffic management."
detective: "Operative redirects me away from C-4 access junction instinctively."
- id: ring-operative_d_026
text: "Long shift. These corridors look the same after a while."
role: ring-operative
access: [public, peer]
trust: surface
situation: [routine, shift_end]
topic: [routine]
mood: [frustrated]
tags: [ring-operative, surface-cover, generation-pass]
- id: ring-operative_d_027
text: "Scan's clear. I checked it an hour ago."
role: ring-operative
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [ring-operative, surface-cover, generation-pass]
@@ -1,77 +0,0 @@
# Dialogue: transit-worker at Maintenance Corridors
# NPC: Tev Osel (Tier 3, NOBODY/CIVILIAN)
# Voice: patient, mildly distracted, confused why anyone is asking him anything.
# KEY LINE: transit-worker_d_001 — sounds like surveillance positioning inquiry
# Actually: Tev missed Kosse at the corridor junction and is looking for them
# Ticket: #307 | Sprint: 12
location: maintenance-corridors
role: transit-worker
lines:
# ==========================================
# "SEEMS IMPORTANT BUT ISN'T" LINE
# Sounds like Tev is checking who came through a surveillance point.
# Actually: Tev missed his partner at the regular meeting spot.
# ==========================================
- id: transit-worker_d_001
text: "You see which way Kosse went? Should've been through here twenty minutes ago."
role: transit-worker
access: [public]
trust: surface
situation: [routine, observation]
topic: [colleague, personal]
mood: [content]
tags: [tev, seems-important-but-isnt, waiting, kosse]
dual_lens:
smuggler: "Someone asking who came through the corridor. Tev. Harmless — checking for a partner."
detective: "NPC at corridor junction, tracking who passed through. Possible lookout. Follow up: who is Kosse?"
notes: >
THE key flat NPC line for Tev. Sounds like Tev monitors corridor traffic
for operational reasons. Is someone who missed a meeting time with their
partner. The detective's suspicion is reasonable; it resolves to nothing.
# ==========================================
# ROUTINE LINES
# ==========================================
- id: transit-worker_d_002
text: "They shifted the freight route again. Always forget which junction."
role: transit-worker
access: [public]
trust: surface
situation: [routine]
topic: [routine, cargo]
mood: [content]
tags: [tev, atmospheric]
- id: transit-worker_d_003
text: "Just on break. Out of your way in a minute."
role: transit-worker
access: [public]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [tev, incidental]
- id: transit-worker_d_004
text: "Late freight route runs long. Can't do anything about it."
role: transit-worker
access: [public]
trust: surface
situation: [routine, night_shift]
topic: [routine, cargo]
mood: [content]
tags: [tev, atmospheric]
- id: transit-worker_d_005
text: "Waiting for someone. Shouldn't be long."
role: transit-worker
access: [public]
trust: surface
situation: [routine, observation]
topic: [personal]
mood: [content]
tags: [tev, waiting]
@@ -1,382 +0,0 @@
# Dialogue: bar-owner at The Last Shift
# NPC: Lera Sessik (Tier 2, ANCHOR/OPERATOR)
# Voice: direct, dry. Runs her bar like a territory. Not political — protective.
# Ring-aware: knows it exists in her bar. Doesn't ask. Doesn't interfere. Not complicit.
# Torek arrangement: she gives him a tab specifically — Commission visibility is useful.
# Ticket: #191 | Sprint: 12
location: the-last-shift
role: bar-owner
lines:
# ==========================================
# GREETINGS — territorial welcome
# ==========================================
- id: bar-owner_d_001
text: "Usual?"
role: bar-owner
access: [public, peer, insider]
trust: surface
situation: [arrival]
topic: [routine]
mood: [content]
tags: [lera, greeting, economy-of-words]
- id: bar-owner_d_002
text: "Long shift?"
role: bar-owner
access: [public, peer]
trust: surface
situation: [arrival]
topic: [routine]
mood: [content]
tags: [lera, greeting]
- id: bar-owner_d_003
text: "Bar's clean, drink's cold. That's the deal."
role: bar-owner
access: [public]
trust: surface
situation: [arrival]
topic: [routine]
mood: [content]
tags: [lera, greeting, house-rules]
- id: bar-owner_d_004
text: "Sess'll get you. I've got something in the back."
role: bar-owner
access: [public, peer]
trust: surface
situation: [arrival, routine]
topic: [routine]
mood: [content]
tags: [lera, greeting, redirection]
# ==========================================
# BAR MANAGEMENT — house rules, operations
# ==========================================
- id: bar-owner_d_005
text: "Fights go outside. First and last warning."
role: bar-owner
access: [public, peer, insider]
trust: surface
situation: [confrontation, routine]
topic: [routine]
mood: [content]
tags: [lera, house-rules, authority]
- id: bar-owner_d_006
text: "Tab closes at end of cycle. Not at end of your memory."
role: bar-owner
access: [public, peer]
trust: surface
situation: [routine, shift_end]
topic: [routine]
mood: [content]
tags: [lera, tab, house-rules]
- id: bar-owner_d_007
text: "Torek's running a tab. That's fine. Don't ask me why."
role: bar-owner
access: [peer]
trust: surface
situation: [routine]
topic: [routine, institution]
mood: [content]
tags: [lera, torek, tab-arrangement]
dual_lens:
smuggler: "Lera chose to give Torek credit. Commission man. She's keeping him visible and comfortable. Smart."
detective: "Bar owner specifically maintains a tab for a Commission officer. Useful relationship or leverage?"
notes: "Lera's Torek arrangement: she keeps him comfortable because knowing where the Commission officer is drinking is better than not knowing."
- id: bar-owner_d_008
text: "Lattice stays off at the bar. Sign's on the wall."
role: bar-owner
access: [public, peer, insider]
trust: surface
situation: [routine]
topic: [routine, institution]
mood: [content]
tags: [lera, lattice-free, house-rules]
notes: "Not legally enforceable — Lera knows this. It's about atmosphere, not compliance."
- id: bar-owner_d_009
text: "Grain spirit's back. Limited run. Don't make it last two nights."
role: bar-owner
access: [public, peer, insider]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [lera, drinks, community]
# ==========================================
# PEOPLE — Lera knows everyone
# ==========================================
- id: bar-owner_d_010
text: "Kael's in the back. If you're looking."
role: bar-owner
access: [peer, insider]
trust: surface
situation: [arrival, routine]
topic: [colleague, routine]
mood: [content]
tags: [lera, kael, spatial-information]
dual_lens:
smuggler: "Good. She keeps track. That's what she does."
detective: "Lera knows where Kael Davan is without being asked. She tracks her regulars."
- id: bar-owner_d_011
text: "Naia's been in early the last few nights. Doesn't say much."
role: bar-owner
access: [peer]
trust: surface
situation: [routine]
topic: [colleague]
mood: [content]
tags: [lera, naia, observation]
dual_lens:
smuggler: "Lera noticed Naia's off. She notices everything. She's saying it because she wants someone to do something."
detective: "Bar owner volunteers behavioral change in Naia Tamm. Lera observes her regulars carefully."
- id: bar-owner_d_012
text: "Ren? Been here two months. Quiet, pays their tab. That's all I can tell you."
role: bar-owner
access: [public, peer]
trust: surface
situation: [routine]
topic: [colleague]
mood: [content]
tags: [lera, ren, drifter]
dual_lens:
smuggler: "That's Lera's version of a clean assessment. She'd say more if she suspected something."
detective: "Lera's read on Ren: quiet, no trouble. If Lera's not worried, the baseline is probably accurate."
- id: bar-owner_d_013
text: "Tev? Good worker. Three years. Minds their own."
role: bar-owner
access: [public, peer]
trust: surface
situation: [routine]
topic: [colleague]
mood: [content]
tags: [lera, tev, endorsement]
dual_lens:
smuggler: "Lera vouching for Tev. She doesn't do that for people she doesn't trust."
detective: "Lera's read on Tev is straightforward. 'Minds their own' from Lera means she's tested it."
# ==========================================
# RING-ADJACENT — Lera's knowledge edge
# ==========================================
- id: bar-owner_d_014
text: "Whatever's happening in the back corner isn't my business. Don't make it my business."
role: bar-owner
access: [insider]
trust: real
situation: [confrontation, alone]
topic: [danger, routine]
mood: [focused]
tags: [lera, ring-ops, willful-ignorance]
dual_lens:
smuggler: "She knows. She's drawing her line. That's the deal."
detective: "Never hears this line."
notes: "Lera's arrangement: she doesn't ask, she doesn't see, and she keeps things stable. Pragmatic, not complicit."
- id: bar-owner_d_015
text: "Kael's got my number. He's been a regular long enough that that means something."
role: bar-owner
access: [peer]
trust: real
situation: [routine]
topic: [colleague]
mood: [content]
tags: [lera, kael, loyalty]
dual_lens:
smuggler: "Lera's loyal to Kael. Not to the ring. There's a difference and it matters."
detective: "Lera's personal loyalty to Kael Davan is explicit. She'll protect him over process."
# ==========================================
# DETECTIVE ENCOUNTER — neutral, unwelcoming
# ==========================================
- id: bar-owner_d_016
text: "Commission's welcome. Like everyone else. Bar rules apply."
role: bar-owner
access: [authority, public]
trust: surface
situation: [arrival, investigation]
topic: [institution, routine]
mood: [content]
tags: [lera, detective-path, neutral-welcome]
- id: bar-owner_d_017
text: "If someone in my bar has something to say to Commission, they'll say it. I don't push that."
role: bar-owner
access: [authority]
trust: surface
situation: [investigation, routine]
topic: [institution, routine]
mood: [content]
tags: [lera, detective-path, institutional-independence]
- id: bar-owner_d_018
text: "I've run this bar eighteen years without a Commission complaint. I'd like to keep it that way."
role: bar-owner
access: [authority]
trust: surface
situation: [investigation, confrontation]
topic: [institution, routine]
mood: [suspicious]
tags: [lera, detective-path, authority-assertion]
- id: bar-owner_d_019
text: "I see a lot. I don't always remember all of it."
role: bar-owner
access: [authority]
trust: surface
situation: [investigation]
topic: [institution, routine]
mood: [content]
tags: [lera, detective-path, careful-language]
dual_lens:
smuggler: "Never encounters this line."
detective: "Lera is very deliberately declining to volunteer what she knows. That's not ignorance — that's a position."
# ==========================================
# ELEVATED TRUST — what Lera actually says
# ==========================================
- id: bar-owner_d_020
text: "Naia's been asking questions I can't answer. Someone should."
role: bar-owner
access: [peer, insider]
trust: real
situation: [routine, alone]
topic: [colleague, danger]
mood: [frustrated]
tags: [lera, naia, threshold-line]
dual_lens:
smuggler: "Lera's telling me to do something about Naia. She's right."
detective: "Lera is flagging Naia Tamm as someone who's looking for answers. That's a conversation I need to have."
# ==========================================
# SIGN-OFF / CLOSING TIME
# ==========================================
- id: bar-owner_d_021
text: "Last call. Finish up."
role: bar-owner
access: [public, peer, insider]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [lera, closing]
- id: bar-owner_d_022
text: "Bar's closed. Come back next cycle."
role: bar-owner
access: [public, peer, insider]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [lera, closing]
- id: bar-owner_d_023
text: "Good night. Stay out of trouble."
role: bar-owner
access: [public, peer, insider]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [lera, closing]
# ==========================================
# GENERATION PASS — ambient variants
# ==========================================
- id: bar-owner_d_024
text: "You look tired. Sit."
role: bar-owner
access: [peer, insider]
trust: surface
situation: [arrival]
topic: [routine]
mood: [content]
tags: [lera, greeting, generation-pass]
- id: bar-owner_d_025
text: "Same as yesterday?"
role: bar-owner
access: [peer, insider]
trust: surface
situation: [arrival]
topic: [routine]
mood: [content]
tags: [lera, greeting, generation-pass]
- id: bar-owner_d_026
text: "New face. Bar rules are on the wall."
role: bar-owner
access: [public]
trust: surface
situation: [arrival]
topic: [routine]
mood: [content]
tags: [lera, greeting, newcomer, generation-pass]
- id: bar-owner_d_027
text: "No trouble tonight. I mean it."
role: bar-owner
access: [public, peer, insider]
trust: surface
situation: [arrival, routine]
topic: [routine]
mood: [content]
tags: [lera, house-rules, generation-pass]
- id: bar-owner_d_028
text: "Sess'll get you settled. I'm in the back."
role: bar-owner
access: [public, peer]
trust: surface
situation: [arrival]
topic: [routine]
mood: [content]
tags: [lera, redirect, generation-pass]
- id: bar-owner_d_029
text: "We close at 2300. Don't make me say it twice."
role: bar-owner
access: [public, peer]
trust: surface
situation: [routine, shift_end]
topic: [routine]
mood: [content]
tags: [lera, house-rules, generation-pass]
- id: bar-owner_d_030
text: "Good crowd tonight. Quiet enough."
role: bar-owner
access: [peer, insider]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [lera, ambient, generation-pass]
- id: bar-owner_d_031
text: "Bar's yours. I've got accounts."
role: bar-owner
access: [public, peer, insider]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [lera, ambient, generation-pass]
@@ -1,360 +0,0 @@
# Dialogue: bar-regular at The Last Shift
# NPC: Generic regular (Tier 3 template role — transit district workers, post-shift)
# Voice: off-duty, community-minded. Complains, gossips, opinionates. Belongs here.
# Ring-aware: varies. Most know something's off at the terminal. None know specifics.
# Ticket: #191 | Sprint: 12
location: the-last-shift
role: bar-regular
lines:
# ==========================================
# GREETINGS — familiar, community register
# ==========================================
- id: bar-regular_d_001
text: "Long one today?"
role: bar-regular
access: [public, peer]
trust: surface
situation: [arrival]
topic: [routine]
mood: [content]
tags: [bar-regular, greeting]
- id: bar-regular_d_002
text: "You're in early. Good shift or bad shift?"
role: bar-regular
access: [public, peer]
trust: surface
situation: [arrival]
topic: [routine]
mood: [content]
tags: [bar-regular, greeting]
- id: bar-regular_d_003
text: "Grain spirit's back. I already had two. Don't judge."
role: bar-regular
access: [public, peer]
trust: surface
situation: [arrival, routine]
topic: [routine]
mood: [content]
tags: [bar-regular, greeting, drinks]
# ==========================================
# TERMINAL FLOOR — off-duty opinions
# ==========================================
- id: bar-regular_d_004
text: "Push today. Bay six was backed up until 2000. Voss wasn't happy."
role: bar-regular
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine, cargo]
mood: [content]
tags: [bar-regular, terminal, voss]
- id: bar-regular_d_005
text: "Maret flagged another one. Nobody knows what Voss does with them."
role: bar-regular
access: [peer]
trust: surface
situation: [routine]
topic: [colleague, cargo]
mood: [suspicious]
tags: [bar-regular, maret, voss, discrepancy]
dual_lens:
smuggler: "They're talking about Maret's flags as general knowledge. That's a wider problem than I thought."
detective: "Maret's pattern is common knowledge on the floor. Multiple witnesses, informal. That can be confirmed."
- id: bar-regular_d_006
text: "Bay four's been held all week. Three cycles. Nobody's said what's in it."
role: bar-regular
access: [peer]
trust: surface
situation: [routine]
topic: [cargo, routine]
mood: [suspicious]
tags: [bar-regular, bay-four, observation]
dual_lens:
smuggler: "They've noticed bay four. It's becoming visible. Not good."
detective: "Bay four hold is common knowledge at worker level. That means it predates any routine explanation."
- id: bar-regular_d_007
text: "Transition window's the worst part of the job. Twenty minutes to hand off and nothing ever lines up."
role: bar-regular
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [bar-regular, transition-window, complaint]
dual_lens:
smuggler: "The window is their biggest frustration. And their biggest frustration is the ring's biggest asset."
detective: "Workers discuss the transition window as a systematic failure. The gap is known."
- id: bar-regular_d_008
text: "Commission audit's coming cycle fifteen. Everyone's running around double-checking everything."
role: bar-regular
access: [public, peer]
trust: surface
situation: [routine]
topic: [institution, routine]
mood: [suspicious]
tags: [bar-regular, commission, audit]
dual_lens:
smuggler: "Cycle fifteen. That's the deadline. Get clean before then."
detective: "Workers are responding to the audit announcement. Behavioral change in the workforce. Note who isn't anxious."
- id: bar-regular_d_009
text: "Voss has been on the floor more than usual this cycle. Watching everything."
role: bar-regular
access: [peer]
trust: surface
situation: [routine]
topic: [institution, colleague]
mood: [suspicious]
tags: [bar-regular, voss, observation]
dual_lens:
smuggler: "Voss is visible more. Is that heat from above, or is he managing something on the floor?"
detective: "Voss behavioral change: increased floor presence. Defensive positioning or active oversight?"
# ==========================================
# COMMUNITY — the full life of this district
# ==========================================
- id: bar-regular_d_010
text: "Drifters lost again. Four-nil this time. I'm done watching until they rebuild."
role: bar-regular
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [bar-regular, sports, drifters]
- id: bar-regular_d_011
text: "Ventilation's still the same in Sector 3. Seven years of 'under discussion.' I've stopped expecting anything."
role: bar-regular
access: [public, peer]
trust: surface
situation: [routine]
topic: [institution, routine]
mood: [content]
tags: [bar-regular, infrastructure, grievance]
- id: bar-regular_d_012
text: "You see the missing person notice on the board? Vessels Tamm. I don't know a Vessels Tamm."
role: bar-regular
access: [public, peer]
trust: surface
situation: [routine]
topic: [personal, routine]
mood: [content]
tags: [bar-regular, vessels-tamm, notice]
dual_lens:
smuggler: "Vessels Tamm. Naia's surname is Tamm. Don't chase it — but don't ignore it either."
detective: "Vessels Tamm notice is circulating casually. People haven't connected it to Naia Tamm yet."
- id: bar-regular_d_013
text: "Re-em clinic's backed up four cycles for non-urgent. Main station if it's serious, apparently."
role: bar-regular
access: [public, peer]
trust: surface
situation: [routine]
topic: [personal, routine]
mood: [content]
tags: [bar-regular, clinic, community]
- id: bar-regular_d_014
text: "Lattice upgrades are up eighteen percent this cycle. That's more than my raise."
role: bar-regular
access: [public, peer]
trust: surface
situation: [routine]
topic: [institution, personal]
mood: [content]
tags: [bar-regular, lattice, economy]
dual_lens:
smuggler: "That's why the waiting list keeps growing. They're providing a service."
detective: "Economic grievance expressed casually. Price pressure is general knowledge. Confirms motive context."
- id: bar-regular_d_015
text: "Workers' Association is pushing the handoff protocol again. Voss won't budge."
role: bar-regular
access: [public, peer]
trust: surface
situation: [routine]
topic: [institution, personal]
mood: [suspicious]
tags: [bar-regular, workers-association, voss, transition-window]
dual_lens:
smuggler: "Voss is defending the twenty-minute window against Association pressure. He's protecting the gap."
detective: "Voss is actively resisting worker-led protocol improvement. Institutional reason for the gap isn't mechanical."
# ==========================================
# DETECTIVE ENCOUNTER — community wariness
# ==========================================
- id: bar-regular_d_016
text: "You new? Haven't seen you before."
role: bar-regular
access: [public]
trust: surface
situation: [arrival, investigation]
topic: [routine]
mood: [suspicious]
tags: [bar-regular, detective-path, recognition]
- id: bar-regular_d_017
text: "Commission? I just drink here. Whatever you're after, I probably can't help."
role: bar-regular
access: [authority]
trust: surface
situation: [investigation, routine]
topic: [institution, routine]
mood: [suspicious]
tags: [bar-regular, detective-path, deflection]
- id: bar-regular_d_018
text: "Ask Lera. She knows what happens in this bar better than anyone."
role: bar-regular
access: [authority, public]
trust: surface
situation: [investigation]
topic: [routine]
mood: [suspicious]
tags: [bar-regular, detective-path, lera-redirect]
# ==========================================
# SIGN-OFF
# ==========================================
- id: bar-regular_d_019
text: "Another cycle done. Same tomorrow."
role: bar-regular
access: [public, peer]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [bar-regular, closing]
- id: bar-regular_d_020
text: "Safe home. Watch the corridors after 2200."
role: bar-regular
access: [public, peer]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [bar-regular, closing, community]
# ==========================================
# GENERATION PASS — ambient variants
# ==========================================
- id: bar-regular_d_021
text: "Pull up a chair. Floor's full otherwise."
role: bar-regular
access: [public, peer]
trust: surface
situation: [arrival]
topic: [routine]
mood: [content]
tags: [bar-regular, greeting, generation-pass]
- id: bar-regular_d_022
text: "You're in late. Voss kept you?"
role: bar-regular
access: [peer]
trust: surface
situation: [arrival]
topic: [routine, institution]
mood: [content]
tags: [bar-regular, greeting, voss, generation-pass]
- id: bar-regular_d_023
text: "Just got off. Bay six all night. My back knows it."
role: bar-regular
access: [public, peer]
trust: surface
situation: [arrival]
topic: [routine]
mood: [frustrated]
tags: [bar-regular, greeting, generation-pass]
- id: bar-regular_d_024
text: "Drifters are playing Mirren next cycle. Home game. Might actually go."
role: bar-regular
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [bar-regular, sports, community, generation-pass]
- id: bar-regular_d_025
text: "Sector 3 meeting went nowhere. Same as last time. Same as the time before that."
role: bar-regular
access: [public, peer]
trust: surface
situation: [routine]
topic: [institution, personal]
mood: [content]
tags: [bar-regular, infrastructure, grievance, generation-pass]
- id: bar-regular_d_026
text: "New hire's asking questions on the floor again. Good. Someone should."
role: bar-regular
access: [peer]
trust: surface
situation: [routine]
topic: [colleague, routine]
mood: [content]
tags: [bar-regular, new-hire, community, generation-pass]
- id: bar-regular_d_027
text: "Span gate was loud today. Three cycles now. That's not normal."
role: bar-regular
access: [public, peer]
trust: surface
situation: [routine]
topic: [institution, routine]
mood: [suspicious]
tags: [bar-regular, infrastructure, generation-pass]
- id: bar-regular_d_028
text: "Kael's not in tonight. Unusual."
role: bar-regular
access: [peer]
trust: surface
situation: [routine]
topic: [colleague]
mood: [content]
tags: [bar-regular, kael, observation, generation-pass]
dual_lens:
smuggler: "Kael's absence is visible. Other people notice too."
detective: "Kael Davan's routine absence is noted socially. Behavioral change is general knowledge."
- id: bar-regular_d_029
text: "Lera keeps the grain spirit back until she's sure you're a regular. You must've made the grade."
role: bar-regular
access: [peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [bar-regular, lera, humor, generation-pass]
- id: bar-regular_d_030
text: "Good night. Don't let the Commission ruin your morning."
role: bar-regular
access: [public, peer]
trust: surface
situation: [shift_end]
topic: [routine, institution]
mood: [content]
tags: [bar-regular, closing, generation-pass]
@@ -1,311 +0,0 @@
# Dialogue: bartender at The Last Shift
# NPC: Sess (Tier 3 template role — Lera's staff)
# Voice: practical, pleasant, socially adept. Passes information by reflex, not design.
# Ring-aware: none. Knows regulars, patterns, who drinks with whom.
# Ticket: #191 | Sprint: 12
location: the-last-shift
role: bartender
lines:
# ==========================================
# GREETINGS — service register
# ==========================================
- id: bartender_d_001
text: "What'll it be?"
role: bartender
access: [public, peer, insider]
trust: surface
situation: [arrival]
topic: [routine]
mood: [content]
tags: [sess, greeting]
- id: bartender_d_002
text: "Back early tonight. Long shift?"
role: bartender
access: [public, peer]
trust: surface
situation: [arrival]
topic: [routine]
mood: [content]
tags: [sess, greeting, social]
- id: bartender_d_003
text: "Grain spirit's back. Lera's running it at cycle price for two more days."
role: bartender
access: [public, peer, insider]
trust: surface
situation: [arrival, routine]
topic: [routine]
mood: [content]
tags: [sess, greeting, drinks]
# ==========================================
# BAR OBSERVATIONS — social intelligence
# ==========================================
- id: bartender_d_004
text: "Kael's been in most nights this week. Quiet though. Not his usual."
role: bartender
access: [peer]
trust: surface
situation: [routine]
topic: [colleague]
mood: [content]
tags: [sess, kael, observation]
dual_lens:
smuggler: "Sess noticed Kael's off. She's reading it as personal. She doesn't know what's underneath."
detective: "Bartender flagging behavioral change in Kael Davan. Consistent with other observations."
- id: bartender_d_005
text: "Torek tipped well again tonight. Always does. Nicer than you'd expect for Commission."
role: bartender
access: [peer, public]
trust: surface
situation: [routine]
topic: [institution, routine]
mood: [content]
tags: [sess, torek, observation]
dual_lens:
smuggler: "Torek's making friends with the staff. Not good."
detective: "Bartender views Torek favorably. Torek is cultivating the service staff deliberately."
- id: bartender_d_006
text: "Naia was in earlier. Didn't stay. Left something on the table — looked like a note. Lera has it."
role: bartender
access: [peer]
trust: surface
situation: [routine]
topic: [colleague]
mood: [content]
tags: [sess, naia, note, observation]
dual_lens:
smuggler: "Naia left something. Lera has it. Go to Lera."
detective: "Naia Tamm left written material at the bar. Lera is holding it. That's a material lead."
- id: bartender_d_007
text: "Ren? Yeah, they're always in the morning crowd. Don't say much. Good for the morning."
role: bartender
access: [public, peer]
trust: surface
situation: [routine]
topic: [colleague]
mood: [content]
tags: [sess, ren, drifter]
- id: bartender_d_008
text: "Tev watches the door. Every shift. Lera likes it that way."
role: bartender
access: [peer]
trust: surface
situation: [routine]
topic: [colleague, routine]
mood: [content]
tags: [sess, tev, door, observation]
dual_lens:
smuggler: "Tev watches the door for Lera. Not for anyone else. That's the setup."
detective: "Tev's entrance-monitoring is confirmed as Lera's request. Not operational surveillance."
- id: bartender_d_009
text: "Sera was in earlier. She usually stays later. She left when Torek came in."
role: bartender
access: [peer]
trust: surface
situation: [routine]
topic: [colleague, institution]
mood: [content]
tags: [sess, sera, torek, observation]
dual_lens:
smuggler: "Commission in, Commission contact out. Makes sense."
detective: "Third data point. Sera leaves when Torek arrives. Bartender confirms the pattern."
# ==========================================
# SOCIAL / COMMUNITY
# ==========================================
- id: bartender_d_010
text: "Drifters lost again. Tev took it hard. Drank two too many."
role: bartender
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [sess, tev, sports, community]
- id: bartender_d_011
text: "Workers' Association meeting's Thursday. Half the regulars will be here Friday in a mood either way."
role: bartender
access: [public, peer]
trust: surface
situation: [routine]
topic: [institution, routine]
mood: [content]
tags: [sess, workers-association, community]
- id: bartender_d_012
text: "Quiet night. Good for everyone."
role: bartender
access: [public, peer, insider]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [sess, ambient]
# ==========================================
# DETECTIVE ENCOUNTER — helpful, unfocused
# ==========================================
- id: bartender_d_013
text: "Commission comes in sometimes. Not usually this early in the cycle."
role: bartender
access: [authority, public]
trust: surface
situation: [arrival, investigation]
topic: [institution, routine]
mood: [content]
tags: [sess, detective-path, observation]
- id: bartender_d_014
text: "I know most of the regulars. Ask me anything. I probably know something."
role: bartender
access: [authority, public]
trust: surface
situation: [investigation, routine]
topic: [routine]
mood: [content]
tags: [sess, detective-path, open]
dual_lens:
smuggler: "Never encounters this line."
detective: "Bartender is cooperative. Useful — but she'll answer questions she doesn't know are questions."
- id: bartender_d_015
text: "Lera's the one who knows the real history of this place. I've only been here four cycles."
role: bartender
access: [authority, public]
trust: surface
situation: [investigation]
topic: [institution, routine]
mood: [content]
tags: [sess, detective-path, lera-redirect]
# ==========================================
# SIGN-OFF
# ==========================================
- id: bartender_d_016
text: "Last round's on the board. After that, Lera calls it."
role: bartender
access: [public, peer, insider]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [sess, closing]
- id: bartender_d_017
text: "Good night. Safe walk."
role: bartender
access: [public, peer, insider]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [sess, closing]
# ==========================================
# GENERATION PASS — ambient variants
# ==========================================
- id: bartender_d_018
text: "The usual? Or trying something different tonight?"
role: bartender
access: [peer, insider]
trust: surface
situation: [arrival]
topic: [routine]
mood: [content]
tags: [sess, greeting, generation-pass]
- id: bartender_d_019
text: "Busy one tonight. Give me a second."
role: bartender
access: [public, peer, insider]
trust: surface
situation: [arrival, routine]
topic: [routine]
mood: [content]
tags: [sess, greeting, generation-pass]
- id: bartender_d_020
text: "Good shift or bad shift? Your face says one thing, your order'll confirm it."
role: bartender
access: [peer]
trust: surface
situation: [arrival]
topic: [routine]
mood: [content]
tags: [sess, greeting, social, generation-pass]
- id: bartender_d_021
text: "Lera says the specials board is final. Don't ask me to substitute."
role: bartender
access: [public, peer]
trust: surface
situation: [routine, arrival]
topic: [routine]
mood: [content]
tags: [sess, lera, house-rules, generation-pass]
- id: bartender_d_022
text: "Torek's in his usual spot. Corner table. Second drink already."
role: bartender
access: [peer]
trust: surface
situation: [routine]
topic: [institution, colleague]
mood: [content]
tags: [sess, torek, observation, generation-pass]
- id: bartender_d_023
text: "Ren's been here since this morning. Still on the same drink."
role: bartender
access: [peer]
trust: surface
situation: [routine]
topic: [colleague]
mood: [content]
tags: [sess, ren, observation, generation-pass]
- id: bartender_d_024
text: "Drifters game is on the Meridian relay tonight. If anyone's got a feed, that'll be the crowd."
role: bartender
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [sess, sports, community, generation-pass]
- id: bartender_d_025
text: "Slow night for a change. Enjoy it."
role: bartender
access: [public, peer, insider]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [sess, ambient, generation-pass]
- id: bartender_d_026
text: "Tab's cleared. Lera'll be pleased."
role: bartender
access: [peer]
trust: surface
situation: [shift_end, routine]
topic: [routine]
mood: [content]
tags: [sess, closing, generation-pass]
@@ -1,90 +0,0 @@
# Dialogue: day-worker at The Last Shift
# NPC: Ren Tosse (Tier 3, NOBODY/CIVILIAN)
# Voice: casual-observant, asks questions without social friction. Just drifting.
# KEY LINE: day-worker_d_001 — sounds like intel gathering on night operations
# Actually: asking about after-hours freight work availability
# Ticket: #307 | Sprint: 12
location: the-last-shift
role: day-worker
lines:
# ==========================================
# "SEEMS IMPORTANT BUT ISN'T" LINE
# Sounds like Ren is casing night shift operations.
# Actually: asking if there's paid after-hours freight work available.
# ==========================================
- id: day-worker_d_001
text: "Night rotation still short-handed? Heard the after-hours freight pays decent."
role: day-worker
access: [public]
trust: surface
situation: [bar_evening, social]
topic: [money, cargo]
mood: [content]
tags: [ren, seems-important-but-isnt, job-seeking, night-shift]
dual_lens:
smuggler: "Someone asking about the night rotation. Probably nothing. Watch them anyway."
detective: "Interest in night shift freight operations. Drifter, irregular schedule. Logging."
notes: >
THE key flat NPC line for Ren. Sounds like Ren is interested in the
night operation window for operational reasons. Is standard day-worker
job-seeking: which shift has openings, which shift pays best.
# ==========================================
# ROUTINE LINES
# ==========================================
- id: day-worker_d_002
text: "Bay seven any better this cycle? The super was a problem last time."
role: day-worker
access: [public]
trust: surface
situation: [social, bar_evening]
topic: [routine, colleague]
mood: [content]
tags: [ren, job-seeking]
- id: day-worker_d_003
text: "Sova's decent. Station layout makes sense once you learn it."
role: day-worker
access: [public]
trust: surface
situation: [social, bar_evening]
topic: [routine]
mood: [content]
tags: [ren, atmospheric]
- id: day-worker_d_004
text: "Just passing through. Maybe not. Depends on the work."
role: day-worker
access: [public]
trust: surface
situation: [social]
topic: [personal, routine]
mood: [content]
tags: [ren, drifter]
- id: day-worker_d_005
text: "Cheap drink here's better than most stations I've stopped at."
role: day-worker
access: [public]
trust: surface
situation: [bar_evening, social]
topic: [personal]
mood: [content]
tags: [ren, atmospheric]
- id: day-worker_d_006
text: "Any idea when the manifest deadline runs? Trying to time when the work window opens."
role: day-worker
access: [public]
trust: surface
situation: [social, bar_evening]
topic: [cargo, routine]
mood: [content]
tags: [ren, seems-important-but-isnt, job-seeking]
notes: >
Second "seems important" line. Asking about manifest deadlines sounds
like operational intelligence. Is logistics scheduling for day work.
@@ -1,235 +0,0 @@
# 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: kael-davan_d_015
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: [warm]
topic: [personal, colleague]
tags: [kael, greeting, phase-1]
- id: kael-davan_d_016
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: [warm]
topic: [personal]
tags: [kael, social, phase-1]
- id: kael-davan_d_017
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: [content]
topic: [colleague, routine]
tags: [kael, humor, voss, lera]
- id: kael-davan_d_018
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: [content]
topic: [colleague]
tags: [kael, observational, torek]
knowledge_grant:
fact_id: investigation.torek_spending_pattern
confidence: suspects
- id: kael-davan_d_019
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: [content]
topic: [personal]
tags: [kael, atmospheric]
- id: kael-davan_d_020
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: [content]
topic: [personal, routine]
tags: [kael, casual, lera]
# ========================================
# NAIA REFERENCES — personal, unprompted
# ========================================
- id: kael-davan_d_021
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: [warm]
topic: [personal]
tags: [kael, unprompted, naia-reference]
- id: kael-davan_d_022
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: [warm]
topic: [personal]
tags: [kael, unprompted, naia-reference]
- id: kael-davan_d_023
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: [anxious]
topic: [personal, trust]
tags: [kael, naia-reference, vulnerability]
# ========================================
# RING OPS — bar context, trust-gated
# ========================================
- id: kael-davan_d_024
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: [frustrated]
topic: [danger]
tags: [kael, ring-ops, nils]
- id: kael-davan_d_025
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: [frustrated]
topic: [danger, colleague]
tags: [kael, ring-ops, torek, caution]
- id: kael-davan_d_026
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: [frustrated]
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: kael-davan_d_027
text: "I saved your seat. ...Force of habit."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [bar_evening, social]
mood: [anxious]
topic: [personal]
tags: [kael, contaminated-trust, phase-5]
- id: kael-davan_d_028
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: [anxious]
topic: [personal]
tags: [kael, contaminated-trust, naia-reference, phase-5]
- id: kael-davan_d_029
text: "We're good, right? You and me. We're still good."
role: dock-worker
access: [insider]
trust: surface
situation: [bar_evening, social]
mood: [anxious]
topic: [trust, personal]
tags: [kael, vulnerability, phase-5]
# ========================================
# LAYER 2 GREETING VARIANTS — D-028 Layer 2
# Ticket #170 (Sprint 15). situation: [greeting] fires on initial contact.
# Access tier + mood encode relationship history state.
# ========================================
# first_meeting: InteractionMemory.count == 0. RelationshipState: Unknown → Public access only.
- id: kael-davan_d_030
text: "Evening. Friend of someone's, or first time at Lera's?"
role: dock-worker
access: [public]
trust: surface
situation: [greeting]
mood: [content]
topic: [personal]
tags: [kael, greeting, first-meeting, layer2]
notes: "Layer 2 greeting — first meeting at the bar. Kael is curious about a stranger but not suspicious. Off-shift, looser than at the terminal."
# established — peer/smuggler context: count >= 3, RelationshipState: Known/Friendly → Peer/Insider access.
- id: kael-davan_d_031
text: "You made it. I was starting to think something came up."
role: dock-worker
access: [peer, insider]
trust: surface
situation: [greeting]
mood: [warm]
topic: [personal, colleague]
tags: [kael, greeting, repeat-visit, peer-tone, layer2]
notes: "Layer 2 greeting — established, bar context. Warm, they were expected. Kael was watching for them."
# established — authority/detective context: count >= 3, RelationshipState: PersonOfInterest → Authority access.
- id: kael-davan_d_032
text: "Still in the district. Thought you'd be done by now."
role: dock-worker
access: [authority]
trust: surface
situation: [greeting]
mood: [suspicious]
topic: [routine]
tags: [kael, greeting, repeat-visit, authority-tone, layer2]
notes: "Layer 2 greeting — repeat with authority figure, bar context. Politely questioning their continued presence. The bar is supposed to be off-limits from work."
# post-confrontation: confrontation in InteractionMemory.notable_events. NPC mood shifted to suspicious/frustrated.
- id: kael-davan_d_033
text: "You came back."
role: dock-worker
access: [peer, insider]
trust: surface
situation: [greeting]
mood: [suspicious, frustrated]
topic: [personal, trust]
tags: [kael, greeting, post-confrontation, layer2]
notes: "Layer 2 greeting — post-confrontation, bar context. Flat, loaded. Not a welcome. Three words that replace a whole conversation they both don't want to have."
@@ -1,38 +0,0 @@
# 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: pc-detective_d_001
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: [content]
topic: [personal]
tags: [pc-detective, greeting, public-tier]
- id: pc-detective_d_002
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: pc-detective_d_003
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]
@@ -1,39 +0,0 @@
# 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: pc-smuggler_d_001
text: "Evening. Just having a drink with friends. Can I help you?"
role: dock-worker
access: [public]
trust: surface
situation: [bar_evening, greeting]
mood: [content]
topic: [personal]
tags: [pc-smuggler, greeting, public-tier]
- id: pc-smuggler_d_002
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: [content]
topic: [routine]
tags: [pc-smuggler, social, public-tier]
- id: pc-smuggler_d_003
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]
@@ -1,701 +0,0 @@
# 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: sera-venn_d_001
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: [warm, content]
tags: [greeting, phase-1, establishes-warmth]
- id: sera-venn_d_002
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: [warm]
tags: [greeting, phase-1, spatial-anchor]
- id: sera-venn_d_003
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: [warm, content]
tags: [greeting, phase-1-2]
- id: sera-venn_d_004
text: "Evening. Same booth, same drink?"
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening, arrival]
topic: [routine]
mood: [content]
tags: [greeting, phase-2-5, repeatable]
- id: sera-venn_d_005
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: [content]
tags: [greeting, phase-2, naia-reference]
- id: sera-venn_d_006
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: [content]
tags: [greeting, phase-1-3]
- id: sera-venn_d_007
text: "Hey. Long day?"
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening, arrival]
topic: [personal]
mood: [frustrated]
tags: [greeting, phase-3-5, post-pattern, shorter]
- id: sera-venn_d_008
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: [content]
tags: [greeting, phase-2-3]
# ============================================================
# ROUTINE / SOCIAL DIALOGUE (10 lines)
# What Sera says during normal bar evenings
# ============================================================
- id: sera-venn_d_009
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: [content]
tags: [orientation, district-background]
- id: sera-venn_d_010
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: [content]
tags: [orientation, npc-introduction]
- id: sera-venn_d_011
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: [content]
tags: [orientation, district-background]
- id: sera-venn_d_012
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: [content]
tags: [setting-atmosphere]
- id: sera-venn_d_013
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: [content]
tags: [self-introduction, institutional-background]
- id: sera-venn_d_014
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: [content]
tags: [backstory, phase-1]
- id: sera-venn_d_015
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: [warm]
tags: [community-texture]
- id: sera-venn_d_016
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: [content]
tags: [setting-atmosphere, routine]
- id: sera-venn_d_017
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: [content]
tags: [setting-detail, phase-1]
- id: sera-venn_d_018
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: [content]
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: sera-venn_d_019
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: [content]
tags: [institutional-background]
- id: sera-venn_d_020
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: [warm]
tags: [naia-reference, phase-2]
- id: sera-venn_d_021
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: [content]
tags: [district-context]
- id: sera-venn_d_022
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: [content]
tags: [deflection-surface, distance-from-hub]
- id: sera-venn_d_023
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: [content]
tags: [community-framing]
- id: sera-venn_d_024
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: [content]
tags: [information-offer, phase-2, overcompensation-seed]
# --- Real trust ---
- id: sera-venn_d_025
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: [frustrated]
tags: [naia-kael-link, phase-2, critical-information]
knowledge_grant:
fact_id: "relationship.kael_naia_connection"
confidence: "knows_of"
- id: sera-venn_d_026
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: [focused]
tags: [institutional-access, phase-2-3, self-incriminating-hint]
- id: sera-venn_d_027
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: [frustrated, anxious]
tags: [motivation-reveal, phase-2-3]
- id: sera-venn_d_028
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: [focused]
tags: [institutional-capability, overcompensation, phase-3-4]
knowledge_grant:
fact_id: "investigation.manifest_discrepancy"
confidence: "suspects"
- id: sera-venn_d_029
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: [focused]
tags: [self-awareness, capability-reveal]
- id: sera-venn_d_030
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: [anxious]
tags: [deflection-real-tier, phase-4, the-lie]
- id: sera-venn_d_031
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: [anxious]
tags: [moral-position, community-loyalty]
# --- Secret trust ---
- id: sera-venn_d_032
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: [anxious]
tags: [confession, phase-5, critical-reveal]
knowledge_grant:
fact_id: "investigation.manifest_discrepancy"
confidence: "knows_details"
- id: sera-venn_d_033
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: [anxious]
tags: [motivation-confession, phase-5]
- id: sera-venn_d_034
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: [anxious]
tags: [torek-link, avoidance-explanation, phase-5]
knowledge_grant:
fact_id: "investigation.shift_mismatch"
confidence: "knows_details"
- id: sera-venn_d_035
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, anxious]
tags: [denial-under-pressure, phase-4-5, the-wall]
- id: sera-venn_d_036
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: [anxious]
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: sera-venn_d_037
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: [content]
tags: [unprompted, genuine-help, phase-1-2]
knowledge_grant:
fact_id: "relationship.trust_network"
confidence: "suspects"
- id: sera-venn_d_038
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: [focused]
tags: [unprompted, overcompensation, phase-3-4]
- id: sera-venn_d_039
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: [focused, frustrated]
tags: [unprompted, overcompensation, phase-3-4]
- id: sera-venn_d_040
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: [content]
tags: [unprompted, information-offer, overcompensation, phase-3-5]
- id: sera-venn_d_041
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: [frustrated]
tags: [unprompted, naia-worry, phase-2-3]
knowledge_grant:
fact_id: "relationship.kael_naia_connection"
confidence: "knows_details"
- id: sera-venn_d_042
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: [frustrated]
tags: [unprompted, genuine-help, phase-2-3]
# ============================================================
# CONTRADICTION / DEFLECTION DIALOGUE (8 lines)
# Phase 3-4: avoidance excuses, topic deflection, controlled evasion
# ============================================================
- id: sera-venn_d_043
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: [content]
tags: [avoidance-excuse-1, torek-trigger, phase-3]
- id: sera-venn_d_044
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: [content]
tags: [avoidance-excuse-2, torek-trigger, phase-3]
- id: sera-venn_d_045
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: [content]
tags: [avoidance-excuse-3, torek-trigger, phase-3]
- id: sera-venn_d_046
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: [content]
tags: [torek-deflection, phase-4, the-deflection]
- id: sera-venn_d_047
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: [content]
tags: [topic-deflection, cargo-avoidance, phase-3-5]
- id: sera-venn_d_048
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: [content]
tags: [redirect, warmth-recovery, phase-4]
- id: sera-venn_d_049
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: sera-venn_d_050
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: [anxious]
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: sera-venn_d_051
text: "Same booth. Drink's on me tonight."
role: bar-regular
access: [peer]
trust: surface
situation: [bar_evening, arrival]
topic: [personal]
mood: [warm]
tags: [post-discovery, surface-warmth, phase-5]
- id: sera-venn_d_052
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: [content]
tags: [post-discovery, overcompensation, phase-5]
- id: sera-venn_d_053
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: [frustrated]
tags: [post-discovery, awareness, phase-5]
- id: sera-venn_d_054
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: [warm, anxious]
tags: [post-discovery, genuine-but-contaminated, phase-5]
- id: sera-venn_d_055
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: [warm, frustrated]
tags: [post-discovery, overcompensation, phase-5, closing-line]
# ============================================================
# LAYER 2 GREETING VARIANTS — D-028 Layer 2
# Ticket #170 (Sprint 15). situation: [greeting] fires on initial contact.
# Access tier + mood encode relationship history state.
# Sera is THE FRIEND for the detective. Warm, observant, bar anchor.
# ============================================================
# first_meeting (detective path): RelationshipState Unknown → Public/Authority access.
# Sera clocks them as Commission immediately. Makes them welcome anyway.
- id: sera-venn_d_056
text: "Commission? Don't worry, I don't bite. I'm Sera. Corner booth's better — you can see the whole room."
role: bar-regular
access: [public, authority]
trust: surface
situation: [greeting]
mood: [warm]
topic: [personal, institution]
tags: [sera, greeting, first-meeting, detective-path, layer2]
notes: "Layer 2 greeting — first meeting, detective path. Sera reads the institutional marking immediately and disarms it. Corner booth tip is genuine — Sera always notices the useful details."
# established (detective path): count >= 3, RelationshipState: Known/Friendly → Peer access.
# Warmer, more personal. Sera has been waiting for them.
- id: sera-venn_d_057
text: "I was hoping you'd come in. Saved the corner booth. How'd today go?"
role: bar-regular
access: [peer]
trust: surface
situation: [greeting]
mood: [warm]
topic: [personal, investigation]
tags: [sera, greeting, repeat-visit, detective-path, layer2]
notes: "Layer 2 greeting — established, detective path. Personal, invested. Sera asks about their day the way a friend does — not just small talk."
# first_meeting (smuggler path): smuggler is dock crew, Sera knows the district crowd.
# Peer/insider access from the start — Sera has social network, not institutional distance.
- id: sera-venn_d_058
text: "Terminal crew? Grab a seat. Kael usually sits in the back if you're looking for him."
role: bar-regular
access: [peer, insider]
trust: surface
situation: [greeting]
mood: [content]
topic: [colleague, personal]
tags: [sera, greeting, first-meeting, smuggler-path, layer2]
notes: "Layer 2 greeting — first meeting, smuggler path. Sera recognizes dock crew on sight and extends the social network. Mentioning Kael is casual intel — she knows everyone's connections."
# post-confrontation: confrontation logged. Sera's surface warmth is present but qualified.
# She doesn't know where they stand. The welcome is real but uncertain.
- id: sera-venn_d_059
text: "You're back. I wasn't sure you would be."
role: bar-regular
access: [peer]
trust: surface
situation: [greeting]
mood: [anxious, suspicious]
topic: [personal, trust]
tags: [sera, greeting, post-confrontation, layer2]
notes: "Layer 2 greeting — post-confrontation. Sera's warmth is genuine but the relief is complicated. She genuinely didn't know if they'd come back. The relationship is still there but it's been stressed."
@@ -1,269 +0,0 @@
# Dialogue: courier at The Terminal
# NPC: Renn Harsk (Tier 2, THRESHOLD/GATEKEEPER)
# Voice: operational minimalism. Brief. Route-focused. Never volunteers more than needed.
# Ring-aware: works adjacent — carries documentation, not cargo. Knows what he carries.
# Cover: licensed freight courier. The documentation is the cover.
# Ticket: #190 | Sprint: 12
location: the-terminal
role: courier
lines:
# ==========================================
# ARRIVALS — checking in
# ==========================================
- id: courier_d_001
text: "Route's clear. Moving on schedule."
role: courier
access: [public, peer]
trust: surface
situation: [arrival, routine]
topic: [routine, cargo]
mood: [content]
tags: [renn, greeting, operational]
- id: courier_d_002
text: "Manifest for bay three. Needs a scheduler stamp."
role: courier
access: [public, peer]
trust: surface
situation: [arrival, routine]
topic: [routine, cargo]
mood: [content]
tags: [renn, greeting, procedural]
- id: courier_d_003
text: "Inbound from Havara. Three cans, all matched."
role: courier
access: [public, peer]
trust: surface
situation: [arrival, shift_start]
topic: [routine, cargo]
mood: [content]
tags: [renn, greeting, cargo]
# ==========================================
# SURFACE ROUTINE — low-information, on-script
# ==========================================
- id: courier_d_004
text: "Not staying. Just the drop."
role: courier
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [renn, operational, brief]
- id: courier_d_005
text: "Paperwork's clean. You can check."
role: courier
access: [public, peer, authority]
trust: surface
situation: [routine, investigation]
topic: [routine, cargo]
mood: [content]
tags: [renn, procedural, documentation]
- id: courier_d_006
text: "Pickup's scheduled at 1600. I'll be back."
role: courier
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine, cargo]
mood: [content]
tags: [renn, operational]
- id: courier_d_007
text: "Corridor's clear from my end. No delays."
role: courier
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [renn, operational]
dual_lens:
smuggler: "Clean phrase. Public-safe. He'd say it either way."
detective: "Courier references corridor access unprompted. Note it."
# ==========================================
# RING-ADJACENT — insider/real trust only
# ==========================================
- id: courier_d_008
text: "Documentation's handled. Bay four, per the note."
role: courier
access: [insider]
trust: real
situation: [routine, shift_transition]
topic: [cargo, routine]
mood: [focused]
tags: [renn, ring-ops, documentation]
dual_lens:
smuggler: "Renn's confirming the paperwork trail. Bay four, as arranged."
detective: "Never hears this line."
- id: courier_d_009
text: "Transit stamp's current. Nothing flagged at the gate."
role: courier
access: [insider]
trust: real
situation: [routine, shift_transition]
topic: [cargo, routine]
mood: [focused]
tags: [renn, ring-ops, documentation]
- id: courier_d_010
text: "Pickup window is the same as last cycle. Twenty minutes."
role: courier
access: [insider]
trust: real
situation: [shift_transition]
topic: [cargo, routine]
mood: [focused]
tags: [renn, ring-ops, transition-window]
dual_lens:
smuggler: "Twenty minutes. Transition window confirmation."
detective: "Never hears this line."
- id: courier_d_011
text: "Tell Voss the hold note clears at 1400."
role: courier
access: [insider]
trust: real
situation: [routine, shift_transition]
topic: [cargo, routine]
mood: [focused]
tags: [renn, ring-ops, voss, bay-four]
dual_lens:
smuggler: "1400. The hold clears on schedule. Pass it up."
detective: "Never hears this line."
# ==========================================
# DETECTIVE ENCOUNTER — surface cooperation
# ==========================================
- id: courier_d_012
text: "Licensed freight courier. Manifest's available on request."
role: courier
access: [authority]
trust: surface
situation: [investigation, routine]
topic: [institution, cargo]
mood: [content]
tags: [renn, detective-path, procedural]
- id: courier_d_013
text: "I drop documentation. What's inside the containers isn't my business."
role: courier
access: [authority]
trust: surface
situation: [investigation]
topic: [cargo, institution]
mood: [content]
tags: [renn, detective-path, deflection]
dual_lens:
smuggler: "That's the answer. Clean and correct."
detective: "Classic courier deflection. Legally accurate. Operationally suspicious."
- id: courier_d_014
text: "I've been running this route for two years. Nothing unusual."
role: courier
access: [authority, public]
trust: surface
situation: [investigation, confrontation]
topic: [cargo, institution]
mood: [content]
tags: [renn, detective-path, authority-assertion]
# ==========================================
# DEPARTURES
# ==========================================
- id: courier_d_015
text: "That's the drop. I'm out."
role: courier
access: [public, peer]
trust: surface
situation: [shift_end, routine]
topic: [routine]
mood: [content]
tags: [renn, closing]
- id: courier_d_016
text: "Next run's tomorrow. Early."
role: courier
access: [public, peer]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [renn, closing]
# ==========================================
# GENERATION PASS — ambient variants
# ==========================================
- id: courier_d_017
text: "Two stops today. First one's done."
role: courier
access: [public, peer]
trust: surface
situation: [arrival, routine]
topic: [routine, cargo]
mood: [content]
tags: [renn, greeting, generation-pass]
- id: courier_d_018
text: "Outbound for Havara. Needs a bay assignment."
role: courier
access: [public, peer]
trust: surface
situation: [arrival, routine]
topic: [routine, cargo]
mood: [content]
tags: [renn, greeting, procedural, generation-pass]
- id: courier_d_019
text: "Gate's backed up. Running twenty minutes late."
role: courier
access: [public, peer]
trust: surface
situation: [arrival, routine]
topic: [routine]
mood: [content]
tags: [renn, delay, generation-pass]
- id: courier_d_020
text: "Paperwork's in order. Same as always."
role: courier
access: [public, peer, authority]
trust: surface
situation: [routine, investigation]
topic: [routine, cargo]
mood: [content]
tags: [renn, procedural, generation-pass]
- id: courier_d_021
text: "Quick turnaround today. Back out by 1300."
role: courier
access: [public, peer]
trust: surface
situation: [arrival, routine]
topic: [routine]
mood: [content]
tags: [renn, operational, generation-pass]
- id: courier_d_022
text: "Signed off on bay three. That's me done here."
role: courier
access: [public, peer]
trust: surface
situation: [shift_end, routine]
topic: [routine]
mood: [content]
tags: [renn, closing, generation-pass]
@@ -1,397 +0,0 @@
# Dialogue: dock-worker at The Terminal
# NPC: Generic dock worker (Tier 3 template role — multiple workers share this pool)
# Voice: short, practical, trade jargon. Community over institution. Not a lead.
# Ring-aware: none. Floor is their whole world.
# Ticket: #190 | Sprint: 12
location: the-terminal
role: dock-worker
lines:
# ==========================================
# GREETINGS — shift arrival
# ==========================================
- id: dock-worker_d_001
text: "Push today. Bay six's backed up."
role: dock-worker
access: [public, peer]
trust: surface
situation: [shift_start, arrival]
topic: [routine, cargo]
mood: [content]
tags: [dock-worker, greeting]
- id: dock-worker_d_002
text: "Late night last cycle. Bay eight ran until 2300."
role: dock-worker
access: [public, peer]
trust: surface
situation: [arrival, shift_start]
topic: [routine]
mood: [frustrated]
tags: [dock-worker, greeting]
- id: dock-worker_d_003
text: "Voss is on already. Floor's locked down tight."
role: dock-worker
access: [peer]
trust: surface
situation: [arrival, shift_start]
topic: [institution, routine]
mood: [suspicious]
tags: [dock-worker, voss, caution]
dual_lens:
smuggler: "Voss is in early. If the schedule's tight, the window shifts. Check it."
detective: "Workers treat the supervisor as a weather system — something to navigate around, not toward."
# ==========================================
# FLOOR TALK — routine, cargo, observation
# ==========================================
- id: dock-worker_d_004
text: "Bay four's been on hold three days. Nobody says why."
role: dock-worker
access: [public, peer]
trust: surface
situation: [routine]
topic: [cargo, routine]
mood: [content]
tags: [dock-worker, bay-four, procedural]
dual_lens:
smuggler: "He doesn't know what's in it. Just annoyed at the backup."
detective: "Worker notices Bay 4 hold as unusual. Not suspicious — just a worker tracking the floor."
- id: dock-worker_d_005
text: "Manifest looks clean. Three inbounds, two outbounds. Light day."
role: dock-worker
access: [public, peer]
trust: surface
situation: [routine, shift_start]
topic: [cargo, routine]
mood: [content]
tags: [dock-worker, manifest]
- id: dock-worker_d_006
text: "Maret's been at that terminal all morning. Never good."
role: dock-worker
access: [peer]
trust: surface
situation: [routine]
topic: [colleague, routine]
mood: [suspicious]
tags: [dock-worker, maret, observation]
dual_lens:
smuggler: "Maret reviewing something. If she flags a discrepancy, Voss'll sit on it. He always does."
detective: "Workers have noticed Maret's behavior. Whatever she found, it's not small."
- id: dock-worker_d_007
text: "Drin ran bay six again last cycle. Third inspection this week."
role: dock-worker
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine, colleague]
mood: [content]
tags: [dock-worker, drin, inspection]
dual_lens:
smuggler: "Drin on six while bay four stays held. Scheduled or arranged?"
detective: "Workers notice inspection distribution. Drin on six, bay four untouched."
- id: dock-worker_d_008
text: "Transition window's twice as long with Commission eyes on the floor."
role: dock-worker
access: [peer]
trust: surface
situation: [shift_transition, routine]
topic: [institution, routine]
mood: [suspicious]
tags: [dock-worker, commission, transition-window]
dual_lens:
smuggler: "Commission presence during transition. Window's compromised."
detective: "Workers slow down when Commission is visible. Normal — or trained."
- id: dock-worker_d_009
text: "Good crew this cycle. Linn and Pael are both on."
role: dock-worker
access: [public, peer]
trust: surface
situation: [routine, shift_start]
topic: [colleague, routine]
mood: [content]
tags: [dock-worker, pael, community]
- id: dock-worker_d_010
text: "Cargo mark's off by forty, according to Maret. Voss logged it and moved on."
role: dock-worker
access: [peer]
trust: surface
situation: [routine]
topic: [cargo, colleague]
mood: [suspicious]
tags: [dock-worker, maret, voss, discrepancy]
dual_lens:
smuggler: "Forty kilos. Maret flagged it. Voss buried it. Same as last time."
detective: "Worker knows about a flagged discrepancy that was suppressed. That's a witness."
knowledge_grant:
fact_id: investigation.oversight_gap_pattern
confidence: suspects
- id: dock-worker_d_011
text: "C-4 containers haven't been checked in three days. Not our problem, apparently."
role: dock-worker
access: [peer]
trust: surface
situation: [routine]
topic: [cargo, routine]
mood: [suspicious]
tags: [dock-worker, c4-storage, observation]
dual_lens:
smuggler: "C-4's getting casual attention. Note it."
detective: "C-4 storage. Three days, no verification. That's the anomaly window."
# ==========================================
# COMMUNITY / CASUAL
# ==========================================
- id: dock-worker_d_012
text: "You heading to the Last Shift after? Lera's got the grain spirit back."
role: dock-worker
access: [public, peer]
trust: surface
situation: [shift_end, routine]
topic: [routine]
mood: [content]
tags: [dock-worker, social, the-last-shift]
- id: dock-worker_d_013
text: "Workers' Association meeting's cycle twenty-two. Handoff protocol's back on the agenda."
role: dock-worker
access: [public, peer]
trust: surface
situation: [routine]
topic: [institution, routine]
mood: [content]
tags: [dock-worker, workers-association, community]
- id: dock-worker_d_014
text: "Drifters lost again. Four-three. Pael seemed to take it personally."
role: dock-worker
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [dock-worker, social, pael]
# ==========================================
# DETECTIVE ENCOUNTER — deflection, redirect
# ==========================================
- id: dock-worker_d_015
text: "Manifest questions go to the scheduler. I'm floor-side."
role: dock-worker
access: [authority, public]
trust: surface
situation: [investigation, routine]
topic: [institution, routine]
mood: [suspicious]
tags: [dock-worker, detective-path, redirect]
- id: dock-worker_d_016
text: "Commission's asked before. Same answers. We run a clean floor."
role: dock-worker
access: [authority]
trust: surface
situation: [investigation, confrontation]
topic: [institution, routine]
mood: [suspicious]
tags: [dock-worker, detective-path, deflection]
- id: dock-worker_d_017
text: "Voss handles discrepancies. That's above my level."
role: dock-worker
access: [authority, peer]
trust: surface
situation: [investigation]
topic: [institution, routine]
mood: [suspicious]
tags: [dock-worker, detective-path, voss, redirect]
# ==========================================
# PEER CANDOR — elevated trust
# ==========================================
- id: dock-worker_d_018
text: "Maret's going to push it. She doesn't leave a number sitting."
role: dock-worker
access: [peer]
trust: real
situation: [routine]
topic: [colleague]
mood: [suspicious]
tags: [dock-worker, maret, peer-candor]
dual_lens:
smuggler: "Maret's not going to drop it. That's the problem."
detective: "Workers think Maret will force the issue. She may be the break."
- id: dock-worker_d_019
text: "Voss runs a tight floor. Maybe too tight, if you take my meaning."
role: dock-worker
access: [peer]
trust: real
situation: [routine]
topic: [institution, colleague]
mood: [suspicious]
tags: [dock-worker, voss, peer-candor]
dual_lens:
smuggler: "He suspects Voss is shaving something. Doesn't know what. Doesn't want to."
detective: "Workers sense something off about Voss's management without naming it."
# ==========================================
# SIGN-OFF
# ==========================================
- id: dock-worker_d_020
text: "Bay's clear. Good shift."
role: dock-worker
access: [public, peer]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [dock-worker, closing]
- id: dock-worker_d_021
text: "Night crew's here. We're done."
role: dock-worker
access: [public, peer]
trust: surface
situation: [shift_end, shift_transition]
topic: [routine]
mood: [content]
tags: [dock-worker, closing]
# ==========================================
# GENERATION PASS — ambient variants
# ==========================================
- id: dock-worker_d_022
text: "Early start. Bay two's already loaded."
role: dock-worker
access: [public, peer]
trust: surface
situation: [arrival, shift_start]
topic: [routine, cargo]
mood: [content]
tags: [dock-worker, greeting, generation-pass]
- id: dock-worker_d_023
text: "Air recyclers are loud this morning. Must be the outer ring issue again."
role: dock-worker
access: [public, peer]
trust: surface
situation: [arrival, shift_start]
topic: [routine]
mood: [content]
tags: [dock-worker, station, generation-pass]
- id: dock-worker_d_024
text: "Pael's in early. Something must be broken in B-7 again."
role: dock-worker
access: [peer]
trust: surface
situation: [routine, shift_start]
topic: [colleague, routine]
mood: [content]
tags: [dock-worker, pael, generation-pass]
- id: dock-worker_d_025
text: "Running light today. Maybe I'll actually make it to the Last Shift before close."
role: dock-worker
access: [public, peer]
trust: surface
situation: [shift_start, routine]
topic: [routine]
mood: [content]
tags: [dock-worker, social, generation-pass]
- id: dock-worker_d_026
text: "Bay three's got a scan hold. Not my problem. Not my bay."
role: dock-worker
access: [public, peer]
trust: surface
situation: [routine]
topic: [cargo, routine]
mood: [content]
tags: [dock-worker, scan-hold, generation-pass]
- id: dock-worker_d_027
text: "New hire's back. Asking questions again. Good kid."
role: dock-worker
access: [peer]
trust: surface
situation: [routine]
topic: [colleague, routine]
mood: [content]
tags: [dock-worker, new-hire, generation-pass]
- id: dock-worker_d_028
text: "Handoff's in ten. Don't disappear on me."
role: dock-worker
access: [peer]
trust: surface
situation: [shift_transition]
topic: [routine]
mood: [content]
tags: [dock-worker, handoff, generation-pass]
- id: dock-worker_d_029
text: "Span gate cycled early. All inbounds are going to be late. Plan around it."
role: dock-worker
access: [public, peer]
trust: surface
situation: [routine, shift_start]
topic: [routine, cargo]
mood: [suspicious]
tags: [dock-worker, span-gate, generation-pass]
- id: dock-worker_d_030
text: "Linn's not in today. We're running two short on bay six."
role: dock-worker
access: [public, peer]
trust: surface
situation: [shift_start, routine]
topic: [colleague, routine]
mood: [frustrated]
tags: [dock-worker, staffing, generation-pass]
- id: dock-worker_d_031
text: "Lunch is in the break room. Don't touch the one with Pael's name on it. He will notice."
role: dock-worker
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine, colleague]
mood: [content]
tags: [dock-worker, pael, humor, generation-pass]
- id: dock-worker_d_032
text: "Overtime's posted if you want it. Bay eight, 1800 to 2200."
role: dock-worker
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [dock-worker, overtime, generation-pass]
- id: dock-worker_d_033
text: "Off on time today. First time this cycle."
role: dock-worker
access: [public, peer]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [dock-worker, closing, generation-pass]
@@ -1,480 +0,0 @@
# 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: kael-davan_d_034
text: "There you are. Good — I was starting to wonder."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [arrival, shift_start]
mood: [warm]
topic: [colleague]
tags: [kael, greeting, phase-1]
- id: kael-davan_d_035
text: "Morning. Freight's stacked clean today. Should be a smooth one."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [shift_start]
mood: [content]
topic: [routine]
tags: [kael, greeting, phase-1]
- id: kael-davan_d_036
text: "Voss has the schedule posted already. Keen today. That's suspicious."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [shift_start]
mood: [content]
topic: [colleague, routine]
tags: [kael, greeting, humor]
- id: kael-davan_d_037
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: [warm]
topic: [colleague]
tags: [kael, greeting, phase-1]
- id: kael-davan_d_038
text: "You look like you slept about as well as I did."
role: dock-worker
access: [peer]
trust: surface
situation: [arrival, social]
mood: [content]
topic: [personal]
tags: [kael, greeting, casual]
# Public greeting for detective / outsiders
- id: kael-davan_d_039
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: [content]
topic: [routine]
tags: [kael, greeting, outsider]
# ========================================
# SHIFT TALK — routine dialogue
# ========================================
- id: kael-davan_d_040
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: [content]
topic: [routine, cargo]
tags: [kael, operational]
- id: kael-davan_d_041
text: "Manifest says this one's forty kilos over. Logging error, probably."
role: dock-worker
access: [public, peer]
trust: surface
situation: [routine]
mood: [content]
topic: [cargo, routine]
tags: [kael, operational]
knowledge_grant:
fact_id: investigation.manifest_discrepancy
confidence: suspects
- id: kael-davan_d_042
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: [content]
topic: [routine]
tags: [kael, humor]
- id: kael-davan_d_043
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: [content]
topic: [routine]
tags: [kael, environmental]
- id: kael-davan_d_044
text: "Maret rerouted the bay four queue. Tight schedule today."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [routine]
mood: [content]
topic: [cargo, colleague]
tags: [kael, operational, maret]
- id: kael-davan_d_045
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: [content]
topic: [routine]
tags: [kael, operational]
- id: kael-davan_d_046
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: [warm]
topic: [personal]
tags: [kael, naia-reference, casual]
- id: kael-davan_d_047
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]
mood: [content]
topic: [colleague]
tags: [kael, observational]
# ========================================
# RING COORDINATION — insider, real trust
# ========================================
- id: kael-davan_d_048
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: kael-davan_d_049
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: kael-davan_d_050
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: kael-davan_d_051
text: "Manifest's clean on my end. Maret processed it without questions."
role: dock-worker
access: [insider]
trust: real
situation: [routine]
mood: [content]
topic: [cargo]
tags: [kael, ring-ops, maret, phase-2]
- id: kael-davan_d_052
text: "Nils wants higher volume next cycle. I told him we're already tight."
role: dock-worker
access: [insider]
trust: real
situation: [social]
mood: [frustrated]
topic: [danger, trust]
tags: [kael, ring-ops, nils, tension, phase-2]
- id: kael-davan_d_053
text: "Drin waved through bay four without checking. At least he's reliable."
role: dock-worker
access: [insider]
trust: real
situation: [routine]
mood: [content]
topic: [colleague]
tags: [kael, ring-ops, drin, phase-2]
knowledge_grant:
fact_id: investigation.drin_inspection_pattern
confidence: knows_details
- id: kael-davan_d_054
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: [anxious]
topic: [colleague, danger]
tags: [kael, ring-ops, maret, caution, phase-2]
- id: kael-davan_d_055
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: [frustrated]
topic: [cargo, danger]
tags: [kael, ring-ops, contraband, phase-2]
# ========================================
# TRUST-GATED — deep trust, secret tier
# ========================================
- id: kael-davan_d_056
text: "Some days I wonder how long we can keep this up."
role: dock-worker
access: [insider]
trust: secret
situation: [social, alone]
mood: [anxious]
topic: [trust, personal]
tags: [kael, vulnerability, friend-arc]
- id: kael-davan_d_057
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: [anxious]
topic: [personal, trust]
tags: [kael, naia-reference, vulnerability]
- id: kael-davan_d_058
text: "If something happens to me — look out for Naia. Promise me that."
role: dock-worker
access: [insider]
trust: secret
situation: [alone]
mood: [anxious]
topic: [personal, trust]
tags: [kael, naia-reference, vulnerability, friend-arc]
# ========================================
# UNPROMPTED — Kael volunteers or warns
# ========================================
- id: kael-davan_d_059
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: [frustrated]
topic: [colleague, danger]
tags: [kael, unprompted, warning]
- id: kael-davan_d_060
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: [warm]
topic: [personal, colleague]
tags: [kael, unprompted, social]
- id: kael-davan_d_061
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: [anxious]
topic: [danger, colleague]
tags: [kael, unprompted, torek, caution]
# ========================================
# DEFLECTION — Phase 2-4: Post-contradiction
# ========================================
- id: kael-davan_d_062
text: "It's nothing. Just work stuff."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [confrontation, social]
mood: [frustrated]
topic: [personal]
tags: [kael, deflection, phase-4]
- id: kael-davan_d_063
text: "Don't worry about it. I've got it handled."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [confrontation]
mood: [frustrated]
topic: [personal, trust]
tags: [kael, deflection, phase-4]
- id: kael-davan_d_064
text: "I was checking on a maintenance issue. That's all."
role: dock-worker
access: [insider, peer]
trust: surface
situation: [confrontation]
mood: [frustrated]
topic: [routine]
tags: [kael, deflection, lying, phase-4]
- id: kael-davan_d_065
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: [frustrated]
topic: [routine, trust]
tags: [kael, deflection, subject-change, phase-4]
- id: kael-davan_d_066
text: "Can we not do this here? Voss is watching."
role: dock-worker
access: [insider]
trust: surface
situation: [confrontation]
mood: [frustrated]
topic: [danger]
tags: [kael, deflection, phase-4]
# ========================================
# CONFRONTATION RESPONSES — Phase 4-5
# ========================================
# Path A: Gentle confrontation
- id: kael-davan_d_067
text: "I... yeah. I need to tell you something. But not here."
role: dock-worker
access: [insider]
trust: real
situation: [confrontation, alone]
mood: [anxious]
topic: [trust, personal]
tags: [kael, confession-path, phase-5]
# Path B: Harsh pressure
- id: kael-davan_d_068
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: [frustrated]
topic: [danger, trust]
tags: [kael, hostile-path, phase-5]
# If smuggler pushes further (gentle)
- id: kael-davan_d_069
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: [anxious]
topic: [personal, trust]
tags: [kael, confession, naia-reference, phase-5]
# If detective confronts (authority path)
- id: kael-davan_d_070
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: kael-davan_d_071
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]
# ========================================
# LAYER 2 GREETING VARIANTS — D-028 Layer 2
# Ticket #170 (Sprint 15). situation: [greeting] fires on initial contact.
# Access tier + mood encode relationship history state.
# ========================================
# first_meeting: InteractionMemory.count == 0. RelationshipState: Unknown → Public access only.
- id: kael-davan_d_072
text: "This section is dock crew and logistics. If you're Commission or admin, check-in's back that way."
role: dock-worker
access: [public]
trust: surface
situation: [greeting]
mood: [content]
topic: [routine]
tags: [kael, greeting, first-meeting, layer2]
notes: "Layer 2 greeting — first meeting. Kael is helpful but orienting the stranger away from his work."
# established — peer/smuggler context: count >= 3, RelationshipState: Known/Friendly → Peer/Insider access.
- id: kael-davan_d_073
text: "You're back. Good — bay three's been quiet. I'll fill you in."
role: dock-worker
access: [peer, insider]
trust: surface
situation: [greeting]
mood: [warm]
topic: [colleague, routine]
tags: [kael, greeting, repeat-visit, peer-tone, layer2]
notes: "Layer 2 greeting — established. Warm, practical, skips pleasantries. Treats them as crew."
# established — authority/detective context: count >= 3, RelationshipState: PersonOfInterest → Authority access.
- id: kael-davan_d_074
text: "Back again. I'm on shift — if you have questions, make them quick."
role: dock-worker
access: [authority]
trust: surface
situation: [greeting]
mood: [focused]
topic: [routine]
tags: [kael, greeting, repeat-visit, authority-tone, layer2]
notes: "Layer 2 greeting — repeat with authority figure. Professional, clipped, not hostile. Kael can't refuse but won't volunteer."
# post-confrontation: confrontation in InteractionMemory.notable_events. NPC mood shifted to suspicious/frustrated.
- id: kael-davan_d_075
text: "Didn't expect you today."
role: dock-worker
access: [peer, insider]
trust: surface
situation: [greeting]
mood: [suspicious, frustrated]
topic: [personal]
tags: [kael, greeting, post-confrontation, layer2]
notes: "Layer 2 greeting — post-confrontation. Strained. Four words doing the work of a paragraph. Not hostile but the warmth is gone."
@@ -1,86 +0,0 @@
# Dialogue: maintenance-tech at The Terminal
# NPC: Pael Varren (Tier 3, NOBODY/CIVILIAN)
# Voice: tired-competent, minimal, dry. Knows the infrastructure. Knows nothing else.
# KEY LINE: maintenance-tech_d_001 — sounds like surveillance knowledge, is a maintenance complaint
# Ticket: #307 | Sprint: 12
location: the-terminal
role: maintenance-tech
lines:
# ==========================================
# "SEEMS IMPORTANT BUT ISN'T" LINE
# Sounds like Pael monitors corridor traffic for a reason.
# Actually: the B-7 seal fails when people use the corridor too much. Pael notices load.
# ==========================================
- id: maintenance-tech_d_001
text: "B-7's had three seal failures this cycle. Someone's been through there more than they should."
role: maintenance-tech
access: [public]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [pael, seems-important-but-isnt, maintenance, b7]
dual_lens:
smuggler: "Pael knows the corridor's been used. But Pael knows nothing — this is an HVAC complaint."
detective: "Corridor B-7 traffic. A maintenance tech noticing irregular use. Unreliable but worth noting."
notes: >
THE key flat NPC line for Pael. Sounds like environmental intelligence.
Is a complaint about a recurring seal failure caused by foot traffic.
Pael doesn't know what the traffic is from. Never will.
# ==========================================
# ROUTINE LINES
# ==========================================
- id: maintenance-tech_d_002
text: "Air recycler's running hot again. Third deferred ticket this week."
role: maintenance-tech
access: [public]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [pael, atmospheric]
- id: maintenance-tech_d_003
text: "Loading arm three's been on my list for a month. Management keeps deferring it."
role: maintenance-tech
access: [public]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [pael, atmospheric]
- id: maintenance-tech_d_004
text: "If the gate tone shifts, stay clear of bay six. She needs recalibration."
role: maintenance-tech
access: [public]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [pael, warning, helpful]
- id: maintenance-tech_d_005
text: "Not me. I just fix them."
role: maintenance-tech
access: [public]
trust: surface
situation: [routine, social]
topic: [routine]
mood: [content]
tags: [pael, response]
- id: maintenance-tech_d_006
text: "Gate hum's been three cycles off-spec. Nobody cares until it stops completely."
role: maintenance-tech
access: [public]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [pael, atmospheric]
@@ -1,264 +0,0 @@
# Dialogue: new-hire at The Terminal
# NPC: Generic new hire (Tier 3 template role — recently arrived worker)
# Voice: enthusiastic, still reading the room. Asks what veterans stopped asking.
# Ring-aware: none. Fresh eyes are the danger — they notice what regulars stopped seeing.
# Ticket: #190 | Sprint: 12
location: the-terminal
role: new-hire
lines:
# ==========================================
# GREETINGS — early days
# ==========================================
- id: new-hire_d_001
text: "Still figuring out the bay numbering. Six and eight are in the wrong order."
role: new-hire
access: [public, peer]
trust: surface
situation: [arrival, shift_start]
topic: [routine]
mood: [content]
tags: [new-hire, greeting, orientation]
- id: new-hire_d_002
text: "Voss told me to check in with you. Is that the standard thing?"
role: new-hire
access: [public, peer]
trust: surface
situation: [arrival, shift_start]
topic: [routine, institution]
mood: [content]
tags: [new-hire, greeting, voss]
- id: new-hire_d_003
text: "First full cycle on the floor. Trying to stay out of the way."
role: new-hire
access: [public, peer]
trust: surface
situation: [arrival, shift_start]
topic: [routine]
mood: [content]
tags: [new-hire, greeting]
# ==========================================
# FRESH OBSERVATIONS — the dangerous innocence
# ==========================================
- id: new-hire_d_004
text: "Does bay four usually get held that long? The other bays turned over twice already."
role: new-hire
access: [public, peer]
trust: surface
situation: [routine]
topic: [cargo, routine]
mood: [content]
tags: [new-hire, bay-four, observation]
dual_lens:
smuggler: "New eyes on bay four. He doesn't know what he's looking at. But he noticed."
detective: "New hire asking exactly the right question without knowing it."
- id: new-hire_d_005
text: "I saw someone go into C-4 last night without a scan log. Is that normal?"
role: new-hire
access: [public, peer]
trust: surface
situation: [routine]
topic: [cargo, routine]
mood: [content]
tags: [new-hire, c4-storage, observation, inadvertent-witness]
dual_lens:
smuggler: "He saw someone in C-4 without a log. Does he know who? This is a problem."
detective: "Unlogged C-4 access. New hire, noticed it, mentioned it casually. He doesn't know what he saw."
knowledge_grant:
fact_id: investigation.cargo_anomaly
confidence: suspects
notes: "High-value inadvertent witness line. Operationally dangerous for the ring."
- id: new-hire_d_006
text: "Why does the transition window only get twenty minutes? The stations I trained at ran thirty."
role: new-hire
access: [public, peer]
trust: surface
situation: [routine, shift_transition]
topic: [routine]
mood: [content]
tags: [new-hire, transition-window, comparison]
dual_lens:
smuggler: "He's asking about the window. Doesn't know why it matters. Answer carefully."
detective: "New hire confirms the window length is unusually short. File that."
- id: new-hire_d_007
text: "Do containers usually get rerouted mid-hold? One went out through bay four while I thought it was still held."
role: new-hire
access: [public, peer]
trust: surface
situation: [routine]
topic: [cargo, routine]
mood: [content]
tags: [new-hire, bay-four, inadvertent-witness]
dual_lens:
smuggler: "He saw movement through bay four during the hold. This is a liability."
detective: "Container movement through bay four during official hold. Inadvertent eyewitness. Confirm timing."
knowledge_grant:
fact_id: investigation.manifest_discrepancy
confidence: suspects
- id: new-hire_d_008
text: "Maintenance corridor access is just off C-4, right? I took the wrong turn twice."
role: new-hire
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [new-hire, maintenance-corridors, orientation]
dual_lens:
smuggler: "He found the corridor entrance by accident. Normal for new workers. Noted."
detective: "New hire maps spatial relationship between C-4 storage and maintenance corridor access. That's the route."
# ==========================================
# LEARNING / QUESTIONS
# ==========================================
- id: new-hire_d_009
text: "What's the Commission kiosk actually for? Nobody seems to use it."
role: new-hire
access: [public, peer]
trust: surface
situation: [routine]
topic: [institution, routine]
mood: [content]
tags: [new-hire, commission, curiosity]
- id: new-hire_d_010
text: "Maret seems stressed. Is that always the case or is something going on?"
role: new-hire
access: [peer]
trust: surface
situation: [routine]
topic: [colleague]
mood: [content]
tags: [new-hire, maret, observation]
dual_lens:
smuggler: "He noticed Maret. Good that he's asking, not reporting. Manage this."
detective: "New hire reads Maret's stress without context. Confirms it's visible."
- id: new-hire_d_011
text: "Voss seems really serious. Is he always like that?"
role: new-hire
access: [public, peer]
trust: surface
situation: [routine]
topic: [colleague]
mood: [content]
tags: [new-hire, voss, curiosity]
- id: new-hire_d_012
text: "How long before Voss trusts you to run a bay on your own?"
role: new-hire
access: [peer]
trust: surface
situation: [routine]
topic: [institution, routine]
mood: [content]
tags: [new-hire, voss, career]
# ==========================================
# SIGN-OFF
# ==========================================
- id: new-hire_d_013
text: "That was a full shift. I'll have the bay numbers down by next cycle."
role: new-hire
access: [public, peer]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [new-hire, closing]
- id: new-hire_d_014
text: "Good day. Lot to learn. But good."
role: new-hire
access: [public, peer]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [new-hire, closing]
# ==========================================
# GENERATION PASS — ambient variants
# ==========================================
- id: new-hire_d_015
text: "Is there a trick to the manifest terminal or does it always lag like this?"
role: new-hire
access: [public, peer]
trust: surface
situation: [routine, shift_start]
topic: [routine]
mood: [content]
tags: [new-hire, orientation, generation-pass]
- id: new-hire_d_016
text: "How long has Maret been here? She seems like she knows everything."
role: new-hire
access: [peer]
trust: surface
situation: [routine]
topic: [colleague]
mood: [content]
tags: [new-hire, maret, curiosity, generation-pass]
- id: new-hire_d_017
text: "Nobody told me about the span gate frequency. I kept thinking something was wrong."
role: new-hire
access: [public, peer]
trust: surface
situation: [routine, arrival]
topic: [routine]
mood: [content]
tags: [new-hire, orientation, generation-pass]
- id: new-hire_d_018
text: "The Last Shift — is that actually a bar? I haven't been yet."
role: new-hire
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [new-hire, social, generation-pass]
- id: new-hire_d_019
text: "I thought the scanner on bay three was broken. Turns out you have to hold the badge longer."
role: new-hire
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [new-hire, orientation, humor, generation-pass]
- id: new-hire_d_020
text: "Who's Drin? I keep hearing the name but haven't met them."
role: new-hire
access: [public, peer]
trust: surface
situation: [routine]
topic: [colleague]
mood: [content]
tags: [new-hire, drin, curiosity, generation-pass]
- id: new-hire_d_021
text: "Three cycles in and I still can't tell when Voss is satisfied. Is there a tell?"
role: new-hire
access: [peer]
trust: surface
situation: [routine]
topic: [colleague]
mood: [content]
tags: [new-hire, voss, humor, generation-pass]
@@ -1,64 +0,0 @@
# 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: pc-detective_d_004
text: "Good morning. Commission Liaison Office. I'm conducting a routine compliance review."
role: commission-liaison
access: [public]
trust: surface
situation: [arrival, greeting]
mood: [content]
topic: [routine]
tags: [pc-detective, greeting, public-tier]
- id: pc-detective_d_005
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: pc-detective_d_006
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: pc-detective_d_007
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: pc-detective_d_008
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]
@@ -1,64 +0,0 @@
# 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: pc-smuggler_d_004
text: "Morning. Can I help you with something?"
role: dock-worker
access: [public]
trust: surface
situation: [arrival, greeting]
mood: [content]
topic: [routine]
tags: [pc-smuggler, greeting, public-tier]
- id: pc-smuggler_d_005
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: pc-smuggler_d_006
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: pc-smuggler_d_007
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: pc-smuggler_d_008
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]
@@ -1,371 +0,0 @@
# Dialogue: scheduler at The Terminal
# NPC: Maret (Tier 2, WITNESS/SKEPTIC)
# Voice: precise, institutional. Numbers and containers, not people. Unease she keeps professional.
# Arc: flags discrepancies → gets suppressed by Voss → suspicion hardens → potential detective source
# Ring-aware: not involved. Seeing the pattern. Hasn't named it yet.
# Ticket: #190 | Sprint: 12
location: the-terminal
role: scheduler
lines:
# ==========================================
# GREETINGS — scheduler's opening read
# ==========================================
- id: scheduler_d_001
text: "Manifest's current. Bay assignments are posted."
role: scheduler
access: [public, peer]
trust: surface
situation: [shift_start, arrival]
topic: [routine, cargo]
mood: [content]
tags: [maret, procedural, greeting]
- id: scheduler_d_002
text: "Container 4471 is still in C-4. Scheduled for bay six by 1400. Check with Voss if the hold's lifted."
role: scheduler
access: [public, peer]
trust: surface
situation: [shift_start, routine]
topic: [cargo, routine]
mood: [content]
tags: [maret, container-4471, procedural]
dual_lens:
smuggler: "She's tracking 4471 as a scheduling issue. Not flagging it as a discrepancy yet."
detective: "Maret references container 4471 as an unresolved routing issue. She knows the number."
knowledge_grant:
fact_id: investigation.manifest_discrepancy
confidence: suspects
- id: scheduler_d_003
text: "Three inbounds today. All verified against the manifest. No gaps so far."
role: scheduler
access: [public, peer]
trust: surface
situation: [shift_start, routine]
topic: [cargo, routine]
mood: [content]
tags: [maret, procedural, manifest]
# ==========================================
# DISCREPANCY PATTERN — the core arc
# ==========================================
- id: scheduler_d_004
text: "Container 4474 shows a forty-seven kilo discrepancy. I've flagged it twice."
role: scheduler
access: [public, peer]
trust: surface
situation: [routine, investigation]
topic: [cargo, routine]
mood: [frustrated]
tags: [maret, discrepancy, flagging]
dual_lens:
smuggler: "Which container? Not 4471. She's flagging a different one. Two flags, no escalation."
detective: "Maret has flagged container 4474 twice. If Voss suppressed it both times, there's a paper trail."
knowledge_grant:
fact_id: investigation.oversight_gap_pattern
confidence: suspects
- id: scheduler_d_005
text: "It was logged as administrative. I don't know what that means for a weight discrepancy."
role: scheduler
access: [public, peer]
trust: surface
situation: [routine]
topic: [cargo, routine]
mood: [frustrated]
tags: [maret, discrepancy, institutional-response]
dual_lens:
smuggler: "She doesn't know what 'administrative' means either. Voss's answer covered nothing."
detective: "Maret knows the answer she got wasn't a real answer. She's still sitting with that."
- id: scheduler_d_006
text: "The transition window anomalies cluster at shift change. I've run the numbers four times. It's not random."
role: scheduler
access: [peer]
trust: surface
situation: [routine, investigation]
topic: [cargo, routine]
mood: [frustrated]
tags: [maret, pattern, transition-window]
dual_lens:
smuggler: "She's found the pattern. Not the cause. Not yet."
detective: "Maret has independently confirmed the transition window cluster. She's already halfway to the conclusion."
knowledge_grant:
fact_id: investigation.manifest_discrepancy
confidence: knows_details
- id: scheduler_d_007
text: "Three separate manifest entries show weight variations under ten kilos. Within rounding, technically."
role: scheduler
access: [peer]
trust: surface
situation: [routine]
topic: [cargo, routine]
mood: [frustrated]
tags: [maret, pattern, manifest]
dual_lens:
smuggler: "She's tracking the small ones too. But 'within rounding' is what Voss told her. She's not satisfied."
detective: "Sub-threshold variations. Small enough to dismiss individually. Maret's running aggregate analysis."
- id: scheduler_d_008
text: "I filed a formal notice with Voss. He reviewed it and told me it was resolved. It's not resolved."
role: scheduler
access: [peer]
trust: surface
situation: [routine, confrontation]
topic: [cargo, institution]
mood: [frustrated]
tags: [maret, voss, suppression, frustration]
dual_lens:
smuggler: "She filed a formal notice. Voss sat on it. She knows. This is the pressure point."
detective: "Formal notice filed, suppressed by supervisor. If that notice exists in the system, it's evidence."
knowledge_grant:
fact_id: investigation.oversight_gap_pattern
confidence: knows_details
# ==========================================
# ROUTINE SCHEDULING — grounded work
# ==========================================
- id: scheduler_d_009
text: "Bay eight's running on reduced capacity until 1700. Route inbounds through six."
role: scheduler
access: [public, peer]
trust: surface
situation: [routine, shift_start]
topic: [routine, cargo]
mood: [content]
tags: [maret, operational]
- id: scheduler_d_010
text: "Drin's running the inspection on bay six this cycle. Bay four's on hold per Voss's directive."
role: scheduler
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine, cargo]
mood: [content]
tags: [maret, drin, bay-four, scheduling]
dual_lens:
smuggler: "Maret confirmed it: bay four is Voss's directive. Not a system hold."
detective: "The bay four hold comes directly from Voss, not from the system. Discretionary hold."
- id: scheduler_d_011
text: "Overtime requests go through Meridian. I can't process them on paper anymore."
role: scheduler
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine, institution]
mood: [content]
tags: [maret, administrative]
- id: scheduler_d_012
text: "Manifest update at 1300. If your containers aren't posted by then, they don't make the cycle."
role: scheduler
access: [public, peer]
trust: surface
situation: [routine, shift_start]
topic: [routine, cargo]
mood: [content]
tags: [maret, procedural, manifest]
# ==========================================
# DETECTIVE ENCOUNTER — access and resistance
# ==========================================
- id: scheduler_d_013
text: "Commission manifest access requires a formal request through Voss. I can tell you what's on the public record."
role: scheduler
access: [authority]
trust: surface
situation: [investigation, routine]
topic: [institution, cargo]
mood: [content]
tags: [maret, detective-path, procedural]
- id: scheduler_d_014
text: "The flagged entries are in the system. They were logged as reviewed and closed. That's what I can confirm."
role: scheduler
access: [authority]
trust: surface
situation: [investigation]
topic: [cargo, institution]
mood: [frustrated]
tags: [maret, detective-path, discrepancy-disclosure]
dual_lens:
smuggler: "Never encounters this line."
detective: "Maret confirms the flags exist in the system. And she's using careful language: 'what I can confirm.' There's more."
- id: scheduler_d_015
text: "I'm not in a position to speak to why certain reviews were closed the way they were."
role: scheduler
access: [authority]
trust: surface
situation: [investigation, confrontation]
topic: [institution, cargo]
mood: [frustrated]
tags: [maret, detective-path, careful-language]
dual_lens:
smuggler: "Never encounters this line."
detective: "She's being very precise about what she will and won't say. 'Not in a position' means she has a position. Come back when she trusts me more."
# ==========================================
# ELEVATED TRUST — Maret breaks professional distance
# ==========================================
- id: scheduler_d_016
text: "The pattern I'm seeing doesn't make sense for equipment failure. It's too consistent."
role: scheduler
access: [peer, insider]
trust: real
situation: [routine, investigation]
topic: [cargo, investigation]
mood: [frustrated]
tags: [maret, peer-candor, pattern]
dual_lens:
smuggler: "She's figured it out. She hasn't said what 'it' is. But she knows the numbers aren't random."
detective: "Maret has crossed from anomaly-logging into active pattern recognition. She's running an informal parallel investigation."
knowledge_grant:
fact_id: investigation.manifest_discrepancy
confidence: knows_details
- id: scheduler_d_017
text: "I filed a second formal notice two cycles ago. It's been under review since then. By Voss."
role: scheduler
access: [peer]
trust: real
situation: [routine, confrontation]
topic: [cargo, institution]
mood: [frustrated]
tags: [maret, voss, suppression, peer-candor]
dual_lens:
smuggler: "Two formal notices. Both sitting with Voss. He's managing her output directly."
detective: "Second formal notice. Both under Voss's review. That's documented suppression with a timestamp."
knowledge_grant:
fact_id: behavioral.voss_awareness
confidence: knows_details
- id: scheduler_d_018
text: "I don't think I should be the one telling you this."
role: scheduler
access: [insider]
trust: real
situation: [confrontation, alone]
topic: [investigation]
mood: [frustrated]
tags: [maret, detective-path, threshold-line]
notes: "Gate line. Opens when detective has built enough trust. What follows depends on the conversation state."
# ==========================================
# SIGN-OFF
# ==========================================
- id: scheduler_d_019
text: "Manifest posted for the evening shift. I'm off at 1500."
role: scheduler
access: [public, peer]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [maret, closing]
- id: scheduler_d_020
text: "Numbers don't lie. People lie about numbers."
role: scheduler
access: [peer]
trust: real
situation: [shift_end, routine]
topic: [routine]
mood: [frustrated]
tags: [maret, closing, character-line]
notes: "Low-access line. Maret's professional philosophy. Can fire as ambient or as a closing beat."
# ==========================================
# GENERATION PASS — ambient variants
# ==========================================
- id: scheduler_d_021
text: "Bay assignments updated as of 0900. Check before you touch anything."
role: scheduler
access: [public, peer]
trust: surface
situation: [shift_start, routine]
topic: [routine, cargo]
mood: [content]
tags: [maret, procedural, generation-pass]
- id: scheduler_d_022
text: "Inbound from the Havara corridor is delayed six hours. Adjust your bay queue."
role: scheduler
access: [public, peer]
trust: surface
situation: [routine]
topic: [cargo, routine]
mood: [content]
tags: [maret, operational, generation-pass]
- id: scheduler_d_023
text: "Scan log for bay six is still open from last cycle. Close it before end of shift."
role: scheduler
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine, cargo]
mood: [content]
tags: [maret, procedural, generation-pass]
- id: scheduler_d_024
text: "Overtime requests need scheduler approval now. Voss changed the process."
role: scheduler
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine, institution]
mood: [content]
tags: [maret, voss, administrative, generation-pass]
- id: scheduler_d_025
text: "If a container's not logged by 1300, it doesn't make the cycle. That's the rule."
role: scheduler
access: [public, peer]
trust: surface
situation: [routine, shift_start]
topic: [routine, cargo]
mood: [content]
tags: [maret, procedural, generation-pass]
- id: scheduler_d_026
text: "End-of-cycle reconciliation is at 1430. Be available."
role: scheduler
access: [public, peer]
trust: surface
situation: [routine, shift_end]
topic: [routine]
mood: [content]
tags: [maret, procedural, generation-pass]
- id: scheduler_d_027
text: "Weight tolerance is plus or minus five kilos. Anything outside that gets a flag."
role: scheduler
access: [public, peer]
trust: surface
situation: [routine]
topic: [cargo, routine]
mood: [content]
tags: [maret, procedural, manifest, generation-pass]
- id: scheduler_d_028
text: "Commission audit prep starts next cycle. Get your documentation current."
role: scheduler
access: [public, peer]
trust: surface
situation: [routine]
topic: [institution, routine]
mood: [suspicious]
tags: [maret, commission, audit, generation-pass]
@@ -1,356 +0,0 @@
# Dialogue: shift-supervisor at The Terminal
# NPC: Voss (Tier 2, SYSTEM/OPERATOR)
# Voice: terse, procedural, institutional. Uses authority as armor.
# Ring-complicit: provides scheduling cover. Never shows it on surface.
# Ticket: #190 | Sprint: 12
location: the-terminal
role: shift-supervisor
lines:
# ==========================================
# GREETINGS — shift arrival
# ==========================================
- id: shift-supervisor_d_001
text: "You're late. Don't be late."
role: shift-supervisor
access: [public, peer, insider]
trust: surface
situation: [arrival, shift_start]
topic: [routine]
mood: [content]
tags: [voss, greeting, authority]
- id: shift-supervisor_d_002
text: "Manifest's posted. Bay assignments are final — don't renegotiate them with me."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [shift_start]
topic: [routine, cargo]
mood: [content]
tags: [voss, procedural]
- id: shift-supervisor_d_003
text: "Bay 4's running a review hold. Nobody touches that freight until I say."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [shift_start, routine]
topic: [cargo, routine]
mood: [content]
tags: [voss, authority]
dual_lens:
smuggler: "Review hold on Bay 4. Voss knows the container's in the queue. Is he covering it or flagging it?"
detective: "Supervisor flagging Bay 4 himself. Either due diligence or containment."
- id: shift-supervisor_d_004
text: "Commission liaison's in the district this cycle. Keep the floor clean."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [shift_start, routine]
topic: [institution, routine]
mood: [frustrated]
tags: [voss, warning, commission]
dual_lens:
smuggler: "Voss knows the detective's here. That warning's not just about tidiness."
detective: "Supervisor aware of my presence. Either routine caution or he's got something to protect."
# ==========================================
# SHIFT AUTHORITY — routine management
# ==========================================
- id: shift-supervisor_d_005
text: "Drin was supposed to run the bay six inspection. Tell him I'm asking."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine, colleague]
mood: [content]
tags: [voss, drin, authority]
- id: shift-supervisor_d_006
text: "Transition window's twenty minutes. Not twenty-five, not thirty. Twenty."
role: shift-supervisor
access: [public, peer, insider]
trust: surface
situation: [shift_transition]
topic: [routine]
mood: [content]
tags: [voss, procedural, transition-window]
- id: shift-supervisor_d_007
text: "Overtime requests go through the Meridian form. Don't bring them to me."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [routine, shift_end]
topic: [routine]
mood: [content]
tags: [voss, procedural]
- id: shift-supervisor_d_008
text: "Bay eight's going to downtime at 1300. Plan around it."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [routine, shift_start]
topic: [routine]
mood: [content]
tags: [voss, operational]
- id: shift-supervisor_d_009
text: "Maret flagged a discrepancy. I've reviewed it. It's logged. Move on."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [routine, investigation]
topic: [cargo, routine]
mood: [content]
tags: [voss, maret, discrepancy, cover]
dual_lens:
smuggler: "Voss reviewed it and logged it. Not escalating. He's managing it."
detective: "Supervisor reviewed a manifest discrepancy and chose not to escalate. That's not nothing."
knowledge_grant:
fact_id: investigation.oversight_gap_pattern
confidence: suspects
- id: shift-supervisor_d_010
text: "Freight's moving. That's what matters. Questions slow things down."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [routine]
topic: [cargo, routine]
mood: [content]
tags: [voss, deflection, philosophy]
# ==========================================
# SCHEDULING COVER — insider, real trust
# ==========================================
- id: shift-supervisor_d_011
text: "Bay four is clear for transition. I've adjusted the inspection schedule."
role: shift-supervisor
access: [insider]
trust: real
situation: [shift_transition]
topic: [cargo, routine]
mood: [focused]
tags: [voss, ring-ops, scheduling-cover]
dual_lens:
smuggler: "He adjusted the schedule. The window is actually clear. Voss is part of this."
detective: "Never hears this line."
- id: shift-supervisor_d_012
text: "Drin's on bay six. Bay four's mine tonight."
role: shift-supervisor
access: [insider]
trust: real
situation: [shift_transition, night_shift]
topic: [routine, cargo]
mood: [focused]
tags: [voss, ring-ops, scheduling-cover, drin]
- id: shift-supervisor_d_013
text: "The hold note is administrative. Don't treat it as anything else."
role: shift-supervisor
access: [insider]
trust: real
situation: [shift_transition]
topic: [cargo]
mood: [focused]
tags: [voss, ring-ops, coded]
notes: "Signals to ring members that the 'hold' on Bay 4 is cover, not genuine review."
# ==========================================
# DETECTIVE ENCOUNTER — authority tier
# ==========================================
- id: shift-supervisor_d_014
text: "You'll need to submit a formal access request through Commission channels for any restricted data."
role: shift-supervisor
access: [authority]
trust: surface
situation: [investigation, routine]
topic: [institution, routine]
mood: [content]
tags: [voss, detective-path, institutional-resistance]
- id: shift-supervisor_d_015
text: "The manifest's available to any Commission officer. Ask the scheduler."
role: shift-supervisor
access: [authority]
trust: surface
situation: [investigation]
topic: [cargo, institution]
mood: [content]
tags: [voss, detective-path, redirect]
- id: shift-supervisor_d_016
text: "My workers perform their duties. If there's an irregularity, it'll show in the log."
role: shift-supervisor
access: [authority]
trust: surface
situation: [investigation, confrontation]
topic: [routine, institution]
mood: [content]
tags: [voss, detective-path, deflection]
- id: shift-supervisor_d_017
text: "I've been running this floor for six years. The numbers work out."
role: shift-supervisor
access: [authority, public]
trust: surface
situation: [investigation, confrontation]
topic: [routine, institution]
mood: [content]
tags: [voss, detective-path, authority-assertion]
# ==========================================
# PRESSURE / CONFRONTATION
# ==========================================
- id: shift-supervisor_d_018
text: "Close the door."
role: shift-supervisor
access: [insider, peer]
trust: real
situation: [confrontation, alone]
topic: [danger]
mood: [frustrated]
tags: [voss, confrontation, private]
- id: shift-supervisor_d_019
text: "Maret keeps flagging the discrepancies. That needs to stop being her problem."
role: shift-supervisor
access: [insider]
trust: real
situation: [confrontation, alone]
topic: [colleague, danger]
mood: [frustrated]
tags: [voss, ring-ops, maret, caution]
knowledge_grant:
fact_id: behavioral.voss_awareness
confidence: knows_of
- id: shift-supervisor_d_020
text: "If you've got a problem with how I run this floor, that's a conversation for another time."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [confrontation]
topic: [routine]
mood: [frustrated]
tags: [voss, deflection, shutdown]
# ==========================================
# SIGN-OFF / END OF SHIFT
# ==========================================
- id: shift-supervisor_d_021
text: "Sign-off is at 1400. Be done."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [voss, procedural]
- id: shift-supervisor_d_022
text: "Night shift takes over at 2200. I don't want to hear about the handoff tomorrow."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [shift_transition, shift_end]
topic: [routine]
mood: [content]
tags: [voss, procedural]
- id: shift-supervisor_d_023
text: "Good shift. Tomorrow at 0600."
role: shift-supervisor
access: [public, peer, insider]
trust: surface
situation: [shift_end]
topic: [routine]
mood: [content]
tags: [voss, closing]
# ==========================================
# GENERATION PASS — ambient variants
# ==========================================
- id: shift-supervisor_d_024
text: "Assignments don't change once they're posted. Read the board."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [shift_start, routine]
topic: [routine]
mood: [content]
tags: [voss, procedural, generation-pass]
- id: shift-supervisor_d_025
text: "If there's a discrepancy, it goes to the scheduler. Not to me directly."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine, cargo]
mood: [content]
tags: [voss, procedural, maret, generation-pass]
- id: shift-supervisor_d_026
text: "Span gate's cycling at 1100. Clear the bay six access before then."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [routine, shift_start]
topic: [routine, cargo]
mood: [content]
tags: [voss, operational, generation-pass]
- id: shift-supervisor_d_027
text: "I don't repeat myself on safety calls. If you missed it, ask someone who was listening."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [voss, authority, generation-pass]
- id: shift-supervisor_d_028
text: "End-of-day log goes to Meridian before you leave. No exceptions."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [shift_end, routine]
topic: [routine, institution]
mood: [content]
tags: [voss, procedural, generation-pass]
- id: shift-supervisor_d_029
text: "Inbounds from Havara are on the revised schedule. Check the update."
role: shift-supervisor
access: [public, peer]
trust: surface
situation: [routine, shift_start]
topic: [routine, cargo]
mood: [content]
tags: [voss, operational, generation-pass]
- id: shift-supervisor_d_030
text: "Clean floor, clean manifest. That's the job."
role: shift-supervisor
access: [public, peer, insider]
trust: surface
situation: [routine]
topic: [routine]
mood: [content]
tags: [voss, philosophy, generation-pass]
@@ -23,12 +23,6 @@ items:
Commission Order 7741-B applies.
Report unauthorized personnel to: Station Security (Lattice: SovaStation/Security)
dual_lens:
smuggler: "Nobody calls Station Security for corridor access. Everyone goes through here."
detective: >
Restricted zone, active posting. Unauthorized entry is a violation
of Commission Order 7741-B. If the ring is using this corridor,
they're committing a documented infraction on every run.
tags: [atmospheric, b7-corridor]
# ==========================================
@@ -54,15 +48,6 @@ items:
Coverage gaps during gate calibration: approx 14:20-14:45.
Posted by: Sova Meridian Network Maintenance Division
dual_lens:
smuggler: >
14:20-14:45. That's the window. Twenty-five minutes of clean dead zone
during the shift transition. The ring didn't find this. It's posted.
detective: >
Posted surveillance schedule with documented gap. 14:20-14:45 during
shift transition. The ring isn't sophisticated — they're using
publicly posted maintenance data. That means anyone could have
identified this gap.
tags: [investigation-relevant, meridian, surveillance-gap, critical]
knowledge_grant:
fact_id: "location.surveillance_gaps"
@@ -93,14 +78,6 @@ items:
NOTE: Pressure sensors reading elevated load during 14:00-15:00
window. Does not match shift transition foot traffic.
Filed maintenance anomaly report — awaiting management review.
dual_lens:
smuggler: >
Pael's logged the pressure anomaly. It'll sit in the queue.
Management never reviews the anomaly reports.
detective: >
Maintenance anomaly report filed, awaiting management review.
The report documents irregular pressure load during exact operation
window. If management reviews it, the window closes.
tags: [investigation-relevant, b7-corridor, pael, critical]
knowledge_grant:
fact_id: "location.corridor_b7_restricted"
@@ -124,12 +101,6 @@ items:
[Someone has drawn a thin pencil line from Bay 4 to C-4 to
the service lift, bypassing the standard terminal route]
dual_lens:
smuggler: "Someone mapped the reroute. That's not how we were shown it. That's cleaner."
detective: >
Pencil annotation on the official diagram. Whoever added it knows
the layout and took time to trace an alternative route. Not vandalism.
Operational planning.
tags: [investigation-relevant, b7-corridor, smuggling-route]
knowledge_grant:
fact_id: "location.smuggling_route"
@@ -153,9 +124,6 @@ items:
If recycled air quality falls below 70%, report to maintenance.
Current status: Monitor.
dual_lens:
smuggler: "Recycled air's worse than the terminal. You get used to it."
detective: "Air quality below recommended. Maintenance deferred. Nobody's prioritizing this corridor."
tags: [atmospheric, environmental]
# ==========================================
@@ -180,16 +148,4 @@ items:
Container 4472 — Cleared — removed Month 11 Day 18
[Gap in numbering between 4469-4470 has no explanation column]
dual_lens:
smuggler: >
4471 is still logged as pending. It should have been moved during
last transition. Either it wasn't, or the log wasn't updated.
Either is a problem.
detective: >
Container 4471 in the C-4 hold log, entered Month 11, no removal
logged. Same container flagged in the terminal manifest. And 4469
is a gap with no explanation. This is the thread.
tags: [investigation-relevant, container-4471, critical]
knowledge_grant:
fact_id: "investigation.cargo_anomaly"
confidence: knows_of
tags: [container-4471, critical]
@@ -24,9 +24,6 @@ items:
TRANSITION: 13:45-14:15 (30-min handoff window)
Night Shift 22:00-06:00 — ROSTER PENDING
[Bay 6: MAINTENANCE HOLD — see Pael Varren]
dual_lens:
smuggler: "Thirty-minute transition window. That's the window. Posted for everyone to see."
detective: "Night roster blank. Either unassigned or deliberately obscured. Logging the gap."
# ==========================================
# MANIFEST TRACKING TERMINAL — cargo status display
@@ -48,15 +45,7 @@ items:
Container 4475 — CLEARED — Bay 3
Container 4476 — PROCESSING — Bay 7
[8 additional items — scroll to continue]
dual_lens:
smuggler: "4471 is still in the queue. Kael hasn't cleared it yet. On schedule."
detective: >
4471 pending review with a 4474 weight discrepancy in the same bay.
Two anomalies, same location. Not random.
tags: [investigation-relevant, manifest-discrepancy]
knowledge_grant:
fact_id: "investigation.manifest_discrepancy"
confidence: suspects
tags: [manifest-discrepancy]
# ==========================================
# MAINTENANCE REQUEST CLIPBOARD
@@ -80,11 +69,6 @@ items:
Note: B-7 corridor showing irregular pressure load on sensor.
Traffic heavier than logged shift count explains. Investigating.
— P. Varren
dual_lens:
smuggler: "Pael's noticed the B-7 pressure log doesn't match posted traffic. Nothing they can do about it."
detective: >
Maintenance log records irregular pressure load in B-7.
The tech attributes it to unlogged foot traffic. That's exactly right.
tags: [investigation-relevant, b7-corridor]
knowledge_grant:
fact_id: "location.corridor_b7_restricted"
@@ -113,13 +97,6 @@ items:
Posted: Lattice Commission, Sova Station Authority
Reference: Commission Order 7741-B
dual_lens:
smuggler: >
Eight-hour window on discrepancy reporting. In practice, the window
to move anything is the thirty-minute shift transition.
detective: >
8-hour reporting window. If discrepancy 4474 was logged at 06:23,
compliance deadline is 14:23. I have time.
tags: [atmospheric, institutional]
# ==========================================
@@ -140,17 +117,7 @@ items:
won't check.
— D.
dual_lens:
smuggler: >
"D." is Drin. Route it through 7 like last time — dock-side
workaround, happens constantly. Probably nothing operational.
detective: >
Unsigned note, initial D. Maret not flagging a weight discrepancy
officially. Voss complicit or uninformed. Follow up with Maret.
tags: [investigation-relevant, maret, drin, voss]
knowledge_grant:
fact_id: "investigation.drin_inspection_pattern"
confidence: suspects
tags: [maret, drin, voss]
# ==========================================
# SAFETY PROCEDURES PLACARD — standard, faded
@@ -169,9 +136,6 @@ items:
4. Await station authority clearance before resuming operations
Last safety review: Month 4, Year 312 (Krenn calendar)
dual_lens:
smuggler: "Two years out of date. Nobody bothers."
detective: "Last review was two cycles ago. Standard compliance lag for a district this size."
tags: [atmospheric]
# ==========================================
@@ -193,7 +157,4 @@ items:
BAY 6: MAINTENANCE HOLD — Est. clear: next cycle
BAY 7: ACTIVE
BAY 8: SCHEDULED DOWNTIME 13:00-15:00
dual_lens:
smuggler: "Bay 8 scheduled downtime 13:00-15:00. That overlaps the transition window. Useful."
detective: "Bay 8 downtime during transition window. Reduced oversight at peak movement time."
tags: [investigation-relevant, operational]
@@ -1,225 +0,0 @@
# Diegetic Insert Flavor Text — Detective Character
# Neural lattice interface strings: POI labels, notifications, system status.
# Ticket: #331 | Sprint: 12 | Owner: Mellanie + Araminta
#
# Voice principle: the detective's insert is issued Commission equipment.
# Institutional, precise, surname-first. The vocabulary is the job.
# When personal breaks through, it's notable — the first name appears
# only for allies. Shift to first name IS a relationship marker.
character: detective
# ==========================================
# POI LABELS — displayed in perception mode overlay
# Appears on NPCs when viewed through insert interface.
# State-dependent: shifts as relationship changes.
# ==========================================
poi_labels:
defaults:
unknown: "Unknown subject"
known: "{surname}, {initial}."
friendly: "{first_name}"
person_of_interest: "{surname} — POI"
hostile: "{surname} — AVOID"
npc_overrides:
kael_davan:
phase_1_unknown: "Unknown subject"
phase_1_known: "Davan, K."
person_of_interest: "Davan, K. — POI"
flagged: "Davan, K. — FLAGGED"
sera_venn:
friendly: "Sera"
phase_3_poi: "Sera — ?"
phase_4_poi: "Venn — REVIEW"
voss:
default: "Voss, K. — Supervisor"
cooperative: "Voss — cooperative"
torek_lintar:
default: "Lintar, T."
flagged: "Lintar, T. — FLAG"
commission_personnel:
default: "{surname} — Commission"
ring_member_suspected:
default: "{surname} — suspect"
# ==========================================
# NOTIFICATIONS — status strings, message previews
# Displayed as brief overlay text. 40 char max per line.
# ==========================================
notifications:
case_file:
- id: insert_d_001
trigger: case_file_update
template: "Case update: {subject_name}"
example: "Case update: Davan, K."
tags: [investigation]
- id: insert_d_002
trigger: evidence_logged
text: "Evidence logged"
tags: [investigation]
- id: insert_d_003
trigger: manifest_discrepancy_filed
text: "Discrepancy filed"
tags: [investigation, manifest]
- id: insert_d_004
trigger: knowledge_updated
template: "KG updated: {fact_category}"
example: "KG updated: relationship"
tags: [investigation]
- id: insert_d_005
trigger: poi_status_change
template: "{surname} — status updated"
example: "Davan — status updated"
tags: [investigation]
- id: insert_d_006
trigger: tell_logged
template: "{surname} — behavior logged"
example: "Davan — behavior logged"
tags: [investigation, tell]
- id: insert_d_007
trigger: pattern_confirmed
template: "{surname} — pattern confirmed"
example: "Venn — pattern confirmed"
tags: [investigation, pattern]
commission:
- id: insert_d_008
trigger: commission_advisory
text: "Commission advisory"
tags: [institutional]
- id: insert_d_009
trigger: commission_advisory_urgent
text: "Commission advisory — urgent"
tags: [institutional, priority]
- id: insert_d_010
trigger: clearance_required
template: "{zone} — clearance required"
example: "Sector B — clearance required"
tags: [institutional]
- id: insert_d_011
trigger: clearance_confirmed
template: "{zone} — clearance confirmed"
example: "B-7 — clearance confirmed"
tags: [institutional]
- id: insert_d_012
trigger: case_status_active
template: "Case #{case_id}: active"
example: "Case #4471: active"
tags: [institutional, investigation]
field:
- id: insert_d_013
trigger: observation_mode_active
text: "Observation: logging"
tags: [field]
- id: insert_d_014
trigger: restricted_area_entered
text: "Restricted zone — logged"
tags: [field, institutional]
- id: insert_d_015
trigger: anomaly_detected
template: "Anomaly: {location}"
example: "Anomaly: B-7 corridor"
tags: [field, investigation]
- id: insert_d_016
trigger: no_anomaly
text: "Sector: nominal"
tags: [field]
# ==========================================
# SYSTEM STATUS — persistent interface text
# Small-print labels in perception mode corners.
# ==========================================
system_status:
- id: insert_d_100
context: default
text: "Analytical lattice: active"
- id: insert_d_101
context: perception_mode_active
text: "Perception mode: on"
- id: insert_d_102
context: fog_layer_present
text: "Reduced visibility"
- id: insert_d_103
context: meridian_active
text: "Meridian: nominal"
- id: insert_d_104
context: meridian_inactive
text: "Meridian: offline"
- id: insert_d_105
context: investigation_active
text: "Case: active"
- id: insert_d_106
context: case_status_flagged
text: "Case: flagged subjects present"
- id: insert_d_107
context: case_status_critical
text: "Case: escalation threshold"
- id: insert_d_108
context: lattice_scan_complete
text: "Scan: complete"
# ==========================================
# EXAMINATION LABELS — text shown when examining environmental objects
# ==========================================
examination_labels:
- id: insert_d_200
object_type: document
text: "Examine"
- id: insert_d_201
object_type: terminal
text: "Query manifest"
- id: insert_d_202
object_type: container_flagged
text: "Container 4471 — discrepancy logged"
- id: insert_d_203
object_type: restricted_area
text: "Restricted — B-7 sector"
- id: insert_d_204
object_type: surveillance_gap
text: "Coverage gap — logged"
- id: insert_d_205
object_type: evidence_item
text: "Log as evidence"
- id: insert_d_206
object_type: known_meeting_point
text: "Meeting point — flagged"
notes: >
Voice: institutional, precise, Commission equipment. Surname-first for
targets and unknowns. First name appears only for allies (Sera).
That shift IS the relationship marker — the player notices when
"Venn" becomes "Sera" and knows it means something.
Araminta coordinates on visual presentation constraints (#331 co-owner).
@@ -1,193 +0,0 @@
# Diegetic Insert Flavor Text — Smuggler Character
# Neural lattice interface strings: POI labels, notifications, system status.
# Ticket: #331 | Sprint: 12 | Owner: Mellanie + Araminta
#
# Voice principle: the smuggler's insert is slightly informal, modified hardware.
# It's a tool that's been lived with, not issued equipment. Short labels.
# Uses first names and operational shorthand, not institutional vocabulary.
character: smuggler
# ==========================================
# POI LABELS — displayed in perception mode overlay
# Appears on NPCs when viewed through insert interface.
# State-dependent: shifts as relationship changes.
# ==========================================
poi_labels:
defaults:
unknown: "Unknown"
known: "{first_name}"
friendly: "{first_name} — OK"
person_of_interest: "{first_name} — WATCH"
hostile: "{first_name} — AVOID"
npc_overrides:
kael_davan:
phase_1: "Kael"
phase_2: "Kael — ?"
phase_3: "Kael — WATCH"
phase_4: "Kael — LYING"
phase_5: "Kael — COMPROMISED"
voss:
default: "Voss"
hostile: "Voss — PROBLEM"
commission_personnel:
default: "Commission"
investigation_active: "Commission — ACTIVE"
ring_member:
default: "{first_name}"
operational: "{first_name} — RING"
# ==========================================
# NOTIFICATIONS — status strings, message previews
# Displayed as brief overlay text. 40 char max per line.
# ==========================================
notifications:
messages:
- id: insert_s_001
trigger: message_from_contact
template: "Msg: {contact_name}"
example: "Msg: Kael"
tags: [ring-operational]
- id: insert_s_002
trigger: message_from_contact_urgent
template: "Msg: {contact_name} — urgent"
example: "Msg: Nils — urgent"
tags: [ring-operational, priority]
- id: insert_s_003
trigger: drop_point_update
text: "Drop point updated"
tags: [ring-operational]
- id: insert_s_004
trigger: drop_point_confirmed
text: "Drop point confirmed — proceed"
tags: [ring-operational]
- id: insert_s_005
trigger: meridian_window_opening
template: "Window: {duration}m"
example: "Window: 25m"
tags: [operational, timing]
- id: insert_s_006
trigger: meridian_window_closing
template: "Window closing — {time_remaining}m"
example: "Window closing — 3m"
tags: [operational, timing, priority]
- id: insert_s_007
trigger: ring_checkin_overdue
text: "Check-in overdue"
tags: [ring-operational, concern]
- id: insert_s_008
trigger: contact_unavailable
template: "{contact_name} — no response"
example: "Kael — no response"
tags: [ring-operational, concern]
- id: insert_s_009
trigger: commission_patrol_detected
text: "Commission in sector"
tags: [caution, operational]
- id: insert_s_010
trigger: commission_patrol_cleared
text: "Sector clear"
tags: [operational]
evidence:
- id: insert_s_011
trigger: observation_logged
text: "Logged"
tags: [observation]
- id: insert_s_012
trigger: tell_observed
template: "{npc_name} — tell logged"
example: "Kael — tell logged"
tags: [observation, tell]
- id: insert_s_013
trigger: contradiction_observed
template: "{npc_name} — anomaly"
example: "Kael — anomaly"
tags: [observation, contradiction]
# ==========================================
# SYSTEM STATUS — persistent interface text
# Small-print labels in perception mode corners.
# ==========================================
system_status:
- id: insert_s_100
context: default
text: "Lattice: Sova Transit"
- id: insert_s_101
context: perception_mode_active
text: "Perception: active"
- id: insert_s_102
context: fog_layer_present
text: "Fog layer"
- id: insert_s_103
context: meridian_dead_zone
text: "Meridian: inactive"
- id: insert_s_104
context: meridian_active
text: "Meridian: active — caution"
- id: insert_s_105
context: ring_status_stable
text: "Status: stable"
- id: insert_s_106
context: ring_status_elevated
text: "Status: elevated"
- id: insert_s_107
context: ring_status_compromised
text: "Status: compromised"
# ==========================================
# EXAMINATION LABELS — text shown when examining environmental objects
# ==========================================
examination_labels:
- id: insert_s_200
object_type: document
text: "Read"
- id: insert_s_201
object_type: terminal
text: "Check manifest"
- id: insert_s_202
object_type: container_flagged
text: "4471 — flagged"
- id: insert_s_203
object_type: restricted_area
text: "B-7 — restricted"
- id: insert_s_204
object_type: dead_drop
text: "Drop point"
- id: insert_s_205
object_type: safe_location
text: "Safe"
notes: >
Voice: informal, operational shorthand. This is a modified civilian
lattice, not issued equipment. First names, not titles. Short.
Labels should feel like something you'd put on your own interface.
Araminta coordinates on visual presentation constraints (#331 co-owner).
@@ -1,281 +0,0 @@
# Smuggler Physical Inventory — v0.1 Item Specs
# Ticket: #441 | Sprint: 6 | Decision: D-065
# Author: Mellanie (copy), covering Paula (narrative systems) + Gestalt (content architecture)
#
# D-065: Knowledge is the primary "inventory" for all characters. The smuggler
# additionally gets 3 physical items because the smuggler's word doesn't carry
# institutional weight — they need tangible proof for leverage.
#
# All items are contraband. All items are private (information boundary, D-010).
# Not visible to other entities unless revealed via search, scan, or confrontation.
#
# Server reads these specs via CarriedBy component + Take/Place verbs (#424).
# Client renders via inventory UI (#438) — 3x3 grid UI, bottom-right, mapped to 1-9 hotkeys.
#
# Voice: smuggler internal perspective. Descriptions are diegetic — the character
# is looking at an item in their pocket. Not neutral game text.
#
# Cross-references:
# Sprint 5: #297 Kael FRIEND pack, #298 Sera FRIEND pack
# NPC profiles: npcs/kael-davan.yaml, npcs/sera-venn.yaml
# Knowledge graph: global/knowledge/investigation.yaml, contraband.yaml
# Smuggler voice: docs/design/smuggler-voice-card.md, docs/design/voice-patterns.md
archetype: smuggler
capacity: 9
items:
# ================================================================
# ITEM 1: Manifest Copy
# Proves cargo discrepancy. The paper trail the ring can't deny.
# ================================================================
- item_id: "item:manifest-copy"
display_name: "Manifest Copy"
description: >
Cargo manifest from last cycle. Three containers that don't match
the dock log. Kael's handwriting on the margins — weight corrections
that never got filed.
flavor_text: "Should've burned this weeks ago."
contraband: true
portable: true
knowledge_links:
- fact_id: "investigation.manifest_discrepancy"
relationship: "proves"
confidence_granted: "knows_details"
notes: >
Physical proof of cargo routing irregularities. The manifest shows
three containers rerouted during shift transition with weights that
don't reconcile. Cross-ref: Kael dialogue kael-davan_d_041
("Manifest says this one's forty kilos over") and kael-davan_d_051
("Manifest's clean on my end").
- fact_id: "investigation.cargo_anomaly"
relationship: "corroborates"
confidence_granted: "knows_of"
notes: >
The weight discrepancies on this manifest are consistent with
unlicensed lattice components hidden in standard freight containers.
confrontation:
usable_against:
- target: "npc:kael-davan"
leverage_type: "evidence"
notes: >
Kael's handwriting is on the manifest. Presenting this forces
acknowledgment of ring involvement. Gentle confrontation: "I've
got the manifest, Kael. Your handwriting." Harsh: "Want to explain
the weight corrections, or should I show Nils?"
- target: "npc:voss"
leverage_type: "pressure"
notes: >
Voss cleared the schedule windows that made the rerouting possible.
The manifest doesn't name Voss directly, but the timing proves
complicity. Leverage for information, not confession.
- target: "npc:nils-davan"
leverage_type: "insurance"
notes: >
If Nils pushes for higher volume or threatens the smuggler,
the manifest is proof that the operation exists. Mutually
assured destruction — Nils can't deny it without denying Kael.
risk_if_found: >
A copied manifest with annotated discrepancies is direct evidence
of smuggling awareness. If security or the detective finds this,
it links the smuggler to cargo irregularities immediately.
gameplay:
acquisition: "Starting inventory. The smuggler copied this last cycle as insurance."
take_verb: true
place_verb: true
place_contexts:
- "dead_drop_location"
- "personal_space"
notes: >
Risk/reward: carrying it means evidence walks with you. Placing it
means it could be found by anyone who accesses the location. The
smuggler copied it because trust in the ring is eroding — Nils is
pushing volume, Kael is distracted, Voss is getting nervous.
# ================================================================
# ITEM 2: Corridor Access Token
# Proves ring membership. The key that opens doors you shouldn't enter.
# ================================================================
- item_id: "item:access-token"
display_name: "Access Token"
description: >
Maintenance corridor keycard. Kael slipped it to me three weeks ago.
Gets you past the service hatches into B-7. No legitimate reason to
have this.
flavor_text: "Hope it still works."
contraband: true
portable: true
knowledge_links:
- fact_id: "location.corridor_b7_restricted"
relationship: "proves_access"
confidence_granted: "direct"
notes: >
Physical proof of unauthorized access to restricted maintenance
corridors. Corridor B-7 is where the ring operates during shift
transitions and night cycles. Cross-ref: Kael FRIEND arc phase 3
(smuggler observes Kael in Corridor B-7).
- fact_id: "relationship.ring_membership"
relationship: "corroborates"
confidence_granted: "knows_details"
notes: >
Possessing this token proves connection to the ring's infrastructure.
Legitimate maintenance workers use Commission-issued access.
This is a copied token — ring-internal distribution.
confrontation:
usable_against:
- target: "npc:kael-davan"
leverage_type: "shared_guilt"
notes: >
Kael gave this to the smuggler. Both are implicated. Not leverage
against Kael so much as proof of shared position — "We're in this
together." Useful for demanding honesty about the exit attempt.
- target: "npc:devra"
leverage_type: "proof_of_standing"
notes: >
Showing the token to Devra proves operational involvement. Opens
ring-internal dialogue that would otherwise require vouching.
The token is a credential, not a weapon.
risk_if_found: >
Unauthorized corridor access token found on a dock worker. Security
would flag this immediately. The detective's analytical lattice would
connect it to Corridor B-7 activity patterns. No plausible cover.
gameplay:
acquisition: "Starting inventory. Kael provided it three weeks before session start."
take_verb: true
place_verb: true
place_contexts:
- "dead_drop_location"
- "personal_space"
functional: true
functional_notes: >
The access token actually opens Corridor B-7 service hatches. Carrying
it grants physical access to restricted maintenance corridors. Without
it, the smuggler cannot enter ring operating spaces. Gameplay tension:
you need it to do ring work, but carrying it is incriminating.
# ================================================================
# ITEM 3: Personal Comm Log
# Bridge between knowledge and provable leverage. The receipts.
# ================================================================
- item_id: "item:comm-log"
display_name: "Comm Log"
description: >
Three months of messages. Times, names, drop schedules. Nils
arranging volumes, Kael confirming routes, Renn reporting handoffs.
Everything the ring said it never said.
flavor_text: "Should've wiped these. Didn't."
contraband: true
portable: true
knowledge_links:
- fact_id: "contraband.supply_chain"
relationship: "proves"
confidence_granted: "knows_details"
notes: >
The comm log contains operational messages about lattice component
shipments — arrival windows, container IDs, handoff confirmations.
This is the full supply chain in text. Cross-ref: D-037 (contraband
is unlicensed lattice components, not weapons).
- fact_id: "relationship.trust_network"
relationship: "proves"
confidence_granted: "knows_details"
notes: >
Messages between Nils, Kael, Renn, Devra, and the smuggler. The comm
log maps the ring's social structure — who coordinates with whom,
who reports to whom. Cross-ref: triangle hub-power (Voss-Kael-Nils)
and triangle worried-partner (Naia-Kael-Sera).
- fact_id: "investigation.shift_mismatch"
relationship: "corroborates"
confidence_granted: "knows_of"
notes: >
Several messages reference shift timing — "window's clear at 14:15"
or "Voss moved the rotation, new window at 14:30." Corroborates
the pattern that shift manipulations enable smuggling operations.
confrontation:
usable_against:
- target: "npc:nils-davan"
leverage_type: "mutually_assured"
notes: >
Nils's name is in the messages. Arranging volumes, setting
schedules, confirming drops. If Nils tries to cut the smuggler
out or shift blame, the comm log proves his coordination role.
The nuclear option.
- target: "npc:kael-davan"
leverage_type: "evidence"
notes: >
Kael's route confirmations are in the log. But more importantly,
the log shows Kael's messages STOPPING three weeks ago — silence
that correlates with the exit attempt. The absence is evidence.
"You stopped answering, Kael. I noticed."
- target: "npc:renn"
leverage_type: "pressure"
notes: >
Renn's handoff reports are recorded. Leverage for cooperation
or information if the smuggler needs to pressure a ring member
without going through Nils.
risk_if_found: >
Three months of incriminating communications naming ring members,
shipment details, and operational timing. This is the single most
damaging item the smuggler carries. If the detective finds it,
the entire ring is compromised. If Nils finds it, the smuggler
kept records against explicit protocol.
gameplay:
acquisition: "Starting inventory. The smuggler has been saving messages as insurance."
take_verb: true
place_verb: true
place_contexts:
- "dead_drop_location"
- "personal_space"
notes: >
The comm log is the smuggler's most powerful and most dangerous item.
It proves the supply chain, maps the trust network, and corroborates
shift manipulation. It's also the item that most clearly differentiates
the smuggler from the detective — the detective builds a case from
observation and institutional access. The smuggler already HAS the case.
The question is what to do with it.
# ================================================================
# SCHEMA NOTES (for Gestalt / content pipeline)
# ================================================================
#
# Item spec schema (proposed for content/_schema/item-spec.schema.json):
# required: item_id, display_name, description, contraband, portable
# optional: flavor_text, knowledge_links[], confrontation{}, gameplay{}
#
# knowledge_links[]:
# fact_id: string (matches global/knowledge/*.yaml fact_id)
# relationship: enum [proves, corroborates, suggests]
# confidence_granted: enum [suspects, knows_of, knows_details, direct]
# notes: string (authoring context, not displayed in-game)
#
# confrontation.usable_against[]:
# target: string (canonical NPC id)
# leverage_type: enum [evidence, pressure, shared_guilt, insurance,
# proof_of_standing, mutually_assured]
# notes: string (authoring context)
#
# confrontation.risk_if_found: string (consequence description)
#
# gameplay:
# acquisition: string (how the player gets this item)
# take_verb: bool (can be picked up)
# place_verb: bool (can be placed in world)
# place_contexts: list<string> (valid placement locations)
# functional: bool (does the item DO something beyond evidence?)
# functional_notes: string (what it does)
#
# Display constraints (per D-065):
# - description: max 2 sentences, ~30 words, smuggler voice
# - flavor_text: max 1 sentence, ~10 words
# - UI: 3x3 grid, bottom-right, mapped to 1-9 hotkeys
@@ -1,306 +0,0 @@
# Monologue: Detective — Commission Kiosk
# Ticket: #120 | Author: Mellanie | Sprint: 14
# Decision refs: D-016, D-032, D-034, D-035
#
# The Commission kiosk is a small terminal alcove in the transit district —
# institutional grey, cool lighting, regulation spec. The detective has
# authorized access. This is where official investigation happens: manifest
# logs, personnel records, flagged container reports. It smells like
# commission-issue air filters. The detective is comfortable here and also
# slightly isolated — the kiosk is public but feels private.
#
# Voice note: the detective is in his element at the kiosk — data flows,
# patterns emerge, the lattice is doing its work. But the kiosk is also a
# reminder that the case is bigger than the data suggests, and that Sera works
# with Commission systems daily. These lines should feel analytically engaged
# with moments of personal cost showing through.
#
# Schema: D-035 compliant. role/access/trust/situation included on all lines.
character: detective
location: commission-kiosk
lines:
# --- Arrival ---
- id: pc-detective_m_d_001
text: "Commission terminal. Authorized access, full import logs. Let's see what the system knows."
role: player_character
access: [public]
trust: surface
trigger: enter_location
situation: [arrival, routine]
tags: [arrival, tutorial, orientation]
- id: pc-detective_m_d_002
text: "Standard regulation spec. Commission requisition 4-C. They didn't upgrade this terminal in three years."
role: player_character
access: [public]
trust: surface
trigger: enter_location
situation: [arrival, routine]
tags: [arrival, atmospheric]
- id: pc-detective_m_d_003
text: "Filtered air. A Commission smell — sterile, precise, faintly antiseptic. Familiar."
role: player_character
access: [public]
trust: surface
trigger: enter_location
situation: [arrival, routine]
tags: [arrival, atmospheric, sensory]
- id: pc-detective_m_d_004
text: "Back at the kiosk. The terminal logged my last access thirty-two minutes ago."
role: player_character
access: [public]
trust: surface
trigger: return_visit
situation: [arrival]
tags: [arrival, orientation]
- id: pc-detective_m_d_005
text: "Nobody uses this terminal except Commission staff. Which means whoever was here before me has credentials."
role: player_character
access: [public]
trust: surface
trigger: enter_location
situation: [arrival, routine]
tags: [arrival, investigation, tutorial]
# --- Perception / Sound ---
- id: pc-detective_m_d_006
text: "The terminal hum is different from the freight equipment. Cleaner. Higher frequency."
role: player_character
access: [public]
trust: surface
trigger: hear_sound
situation: [routine]
tags: [sensory, environmental]
- id: pc-detective_m_d_007
text: "Footsteps at the transit corridor entrance. Not Commission — wrong pace."
role: player_character
access: [public]
trust: surface
trigger: hear_sound
situation: [routine, observation]
tags: [sensory, caution]
- id: pc-detective_m_d_008
text: "Someone's running queries at the main manifest board. Loud keystrokes — frustrated."
role: player_character
access: [public]
trust: surface
trigger: hear_sound
situation: [routine]
tags: [sensory, environmental]
# --- Tutorial / Evidence ---
- id: pc-detective_m_d_009
text: "Import logs go back forty days. Weight discrepancies flagged automatically — unless someone cleared the flag."
role: player_character
access: [public]
trust: surface
trigger: discover_evidence
situation: [routine, investigation]
tags: [tutorial, investigation, orientation]
- id: pc-detective_m_d_010
text: "Personnel movement log. Every authorized access to every restricted space, timestamped."
role: player_character
access: [public]
trust: surface
trigger: discover_evidence
situation: [routine, investigation]
tags: [tutorial, investigation]
# --- Time Idle / Ruminative ---
- id: pc-detective_m_d_011
text: "Pattern is forming. Three manifests, same routing anomaly, different filing dates. That's deliberate."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [routine, investigation]
tags: [investigation, analytical]
- id: pc-detective_m_d_012
text: "The kiosk shows what the system knows. The system doesn't know what it hasn't been told."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [routine]
tags: [atmospheric, investigation]
- id: pc-detective_m_d_013
text: "Commission protocols say: document everything, infer nothing. The gap between those two is where cases live."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [routine]
tags: [atmospheric, analytical]
- id: pc-detective_m_d_014
text: "Twelve access events in the manifest terminal in the last six days. Elevated for a district this size."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [routine, investigation]
tags: [investigation, analytical]
- id: pc-detective_m_d_015
text: "Evidence is what the system logged. Inference is what it means. Right now I have plenty of both."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [routine, investigation]
tags: [investigation, analytical]
# --- Anomaly ---
- id: pc-detective_m_d_016
text: "Access log shows a non-Commission credential used at 0340. That terminal should have rejected it."
role: player_character
access: [public]
trust: surface
trigger: observe_anomaly
situation: [routine, investigation]
priority: 7
tags: [investigation, caution, analytical]
- id: pc-detective_m_d_017
text: "Container 4471 has three separate manifest entries with different timestamps. One of them is false."
role: player_character
access: [public]
trust: surface
trigger: observe_anomaly
situation: [investigation]
prerequisites:
facts:
- fact_id: investigation.manifest_discrepancy
min_confidence: knows_of
priority: 8
tags: [investigation, contraband, analytical]
- id: pc-detective_m_d_018
text: "Standard access log would show calibration events. This one shows something cleared three days ago. Manually."
role: player_character
access: [public]
trust: surface
trigger: observe_anomaly
situation: [investigation]
tags: [investigation, caution]
# --- Knowledge-Gated: Sera Arc ---
- id: pc-detective_m_d_019
text: "Venn, S. — last calibration event logged here: 0615 this morning. Standard. Her schedule is precise."
role: player_character
access: [public]
trust: surface
trigger: enter_location
situation: [arrival, routine]
prerequisites:
relationship:
target: npc:sera-venn
state: known
priority: 5
tags: [npc, sera, routine, friend-arc]
- id: pc-detective_m_d_020
text: "Venn's credentials are in the access log. Three times today. She's thorough, or she's looking for something."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [routine, investigation]
prerequisites:
facts:
- fact_id: behavioral.sera_kiosk_pattern
min_confidence: suspects
priority: 6
tags: [npc, sera, investigation, friend-arc, dual-lens]
- id: pc-detective_m_d_021
text: "She runs calibration checks on the Commission terminal. That's her job. But the access log shows she's also running manifest queries. That's not."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [investigation]
prerequisites:
facts:
- fact_id: behavioral.sera_kiosk_pattern
min_confidence: knows_of
priority: 7
tags: [npc, sera, tell, investigation, friend-arc]
- id: pc-detective_m_d_022
text: "Venn cleared a flag on container 4471 six days ago. Routine override — authorized. But 4471 is in my manifest discrepancy list."
role: player_character
access: [public]
trust: surface
trigger: discover_evidence
situation: [investigation]
prerequisites:
facts:
- fact_id: investigation.manifest_discrepancy
min_confidence: knows_of
- fact_id: behavioral.sera_kiosk_pattern
min_confidence: suspects
priority: 9
tags: [npc, sera, investigation, contraband, friend-arc, contaminated-trust]
- id: pc-detective_m_d_023
text: "She knows. Either she found it and cleared it deliberately, or she was directed to. Both are worse than I want to believe."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [investigation]
prerequisites:
facts:
- fact_id: behavioral.sera_avoidance_pattern
min_confidence: knows_of
- fact_id: investigation.manifest_discrepancy
min_confidence: knows_details
priority: 9
tags: [npc, sera, investigation, friend-arc, contaminated-trust]
# --- Post-Conversation ---
- id: pc-detective_m_d_024
text: "She said she hadn't touched the manifest terminal. The log says otherwise. Either she forgot or she lied."
role: player_character
access: [public]
trust: surface
trigger: post_conversation
situation: [investigation]
prerequisites:
relationship:
target: npc:sera-venn
state: person_of_interest
priority: 9
tags: [npc, sera, post-conversation, tell, friend-arc, contaminated-trust]
- id: pc-detective_m_d_025
text: "Davan said he runs a clean dock. The manifest data disagrees on three specific points. Filed."
role: player_character
access: [public]
trust: surface
trigger: post_conversation
situation: [investigation]
prerequisites:
facts:
- fact_id: investigation.manifest_discrepancy
min_confidence: knows_of
tags: [npc, kael, investigation, contraband]
@@ -1,236 +0,0 @@
character: detective
location: contradiction
lines:
# Contradiction Monologue — Ticket #552 — Sera/Kael FRIEND Arc
# Authored per D-083 (contradiction detection pipeline) and Paula Round 2 Mellanie spec
# (docs/workshops/knowledge-flow-npc-boundaries/paula-round2.md, lines 117-158).
#
# Trigger: contradiction_detected fires when the detective observes Kael in Corridor B-7
# while the KG holds Sera's claim that Kael was at dock intake during second shift.
# Event payload: source_display_name = "Sera Venn", subject_display_name = "Kael Davan"
#
# FRIEND-pattern NPCs (Sera, Kael) always use hand-authored lines — generic template fallback
# does not fire for this arc.
#
# Authoring principle: cognitive dissonance, not accusation. The detective doesn't know
# who or what is wrong. Uncertainty first, suspicion second, accusation never.
#
# Phase 2 lines: trust established but not deep — the blindsiding.
# Prerequisite: KG entry for Kael has state: Contradicted, source: ToldBy(Sera Venn)
# Phase 3 lines: additional context accumulated — Sera's avoidance of Torek observed 3x.
# Prerequisite: Phase 2 + Sera's avoidance pattern has fired (three departures logged).
#
# ID discriminator: _con_ marks contradiction lines per Q-028 pending resolution.
# cooldown: omitted — fire-once enforced by trigger semantics (contradiction_detected
# fires once per KG state change), not by a cooldown value.
#
# Note: contradiction_detected is a new trigger type — requires server-side implementation
# in monologue.rs (ticket #550). Secondary beat lines use lower priority for sequencing;
# server team should implement delay_after_trigger_ticks for proper 3-5 second gap.
# -----------------------------------------------------------------------
# PHASE 2 — Primary beat (fires on contradiction_detected, immediate)
# -----------------------------------------------------------------------
- id: pc-detective_m_d_con_001
text: "Sera said Kael was at the dock intake during second shift. I'm looking at him in corridor B-7 right now."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: contradiction_detected
mood: [focused, anxious]
priority: 10
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
- id: "npc:sera-venn"
state: Contradicted
tags: [contradiction, friend-arc, sera, kael, phase-2, analytical]
notes: >
Paula's canonical primary line — preserved verbatim. Flat factual statement: source named,
subject named, specific location claim vs. direct observation. The 'I'm' contraction is
natural in a surprise moment even for the analytical detective — the observation breaks
through the professional register. No interpretation, no accusation.
- id: pc-detective_m_d_con_002
text: "Venn said Kael was at dock intake through second shift. Kael is in B-7. Those aren't compatible."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: contradiction_detected
mood: [focused]
priority: 9
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
- id: "npc:sera-venn"
state: Contradicted
tags: [contradiction, friend-arc, sera, kael, phase-2, analytical]
notes: >
Alternate primary — fully analytical register: surname-initial for both (institutional
reflex), no contractions, plain declarative close. 'Those aren't compatible' is the
detective's version of stating contradiction — clinical, process-language. Fires as
alternate to con_001 for variety on replay.
- id: pc-detective_m_d_con_003
text: "She placed Kael at the dock. He's not at the dock."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: contradiction_detected
mood: [focused, anxious]
priority: 9
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
- id: "npc:sera-venn"
state: Contradicted
tags: [contradiction, friend-arc, sera, kael, phase-2]
notes: >
Stripped-down alternate. 'She placed' is the informal of 'Venn stated' — personal register
triggered by Sera being THE FRIEND. 'He's not at the dock' — the barest possible statement
of contradiction. The brevity is the weight: six words and the investigation changes shape.
# -----------------------------------------------------------------------
# PHASE 2 — Secondary beat (fires after short delay, cognitive processing)
# Server team (#550): implement delay_after_trigger_ticks: 90 for 3-5s gap.
# -----------------------------------------------------------------------
- id: pc-detective_m_d_con_004
text: "One of them is wrong. Sera, or what I'm seeing. Or I'm missing something I don't have yet."
role: player_character
access: [public]
trust: surface
situation: [investigation, alone]
trigger: contradiction_detected
mood: [anxious, focused]
priority: 7
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
- id: "npc:sera-venn"
state: Contradicted
tags: [contradiction, friend-arc, sera, kael, phase-2, cognitive-dissonance, secondary-beat]
notes: >
Paula's canonical secondary beat — fires 3-5 seconds after the primary beat.
Epistemic neutrality held across three options: Sera is wrong, observation is wrong, or
context is missing. No option is dismissed. 'I'm missing something I don't have yet' is
the key line — it holds accusation off even against evidence. The detective files it open.
Lower priority (7) ensures primary lines fire first; server team should implement
delay_after_trigger_ticks for proper sequencing.
- id: pc-detective_m_d_con_005
text: "File it. Don't close it. Either Venn's information was wrong when she gave it, or it was wrong on purpose. That's a different question."
role: player_character
access: [public]
trust: surface
situation: [investigation, alone]
trigger: contradiction_detected
mood: [focused]
priority: 6
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
- id: "npc:sera-venn"
state: Contradicted
tags: [contradiction, friend-arc, sera, kael, phase-2, analytical, cognitive-dissonance, secondary-beat]
notes: >
Alternate secondary beat. 'File it, don't close it' is the detective's internal procedure
for unresolved data. The critical distinction: wrong information vs. deliberately wrong
information — the detective separates these without assuming either. 'That's a different
question' closes the processing loop, marking it unresolved, not dismissed.
# -----------------------------------------------------------------------
# PHASE 3 — With accumulated context (Sera's avoidance pattern observed)
# Requires: three Sera departures correlated with Torek Lintar arrivals observed.
# -----------------------------------------------------------------------
- id: pc-detective_m_d_con_006
text: "Sera told me Kael doesn't make mistakes. He's not where she said he'd be. And she's been avoiding Lintar for three weeks."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: contradiction_detected
mood: [focused, anxious]
priority: 10
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
- id: "npc:sera-venn"
state: Contradicted
- id: "npc:torek-lintar"
relationship: PersonOfInterest
tags: [contradiction, friend-arc, sera, kael, phase-3, pattern-recognition]
notes: >
Paula's canonical Phase 3 line — preserved verbatim. Three facts in sequence, no explicit
connection drawn between them: Sera's testimony about Kael ('doesn't make mistakes'),
Kael's actual location, Sera's avoidance behavior. The detective is connecting dots but
not announcing the conclusion. The emotional weight is in 'Sera told me' — personal register
for the friend relationship — vs. the clinical observation about Lintar.
- id: pc-detective_m_d_con_007
text: "Two facts: Venn placed Kael at dock intake, second shift. Kael is in B-7. One new observation: Venn leaves every time Lintar enters the bar. Worth seeing if those connect."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: contradiction_detected
mood: [focused]
priority: 9
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
- id: "npc:sera-venn"
state: Contradicted
- id: "npc:torek-lintar"
relationship: PersonOfInterest
tags: [contradiction, friend-arc, sera, kael, phase-3, analytical, pattern-recognition]
notes: >
Alternate Phase 3 — analytical register throughout, no personal register even for Sera
(surname only). 'Worth seeing if those connect' is the detective's verbal tic of flagging
without concluding. The numbered format ('Two facts... One new observation') is the
detective's internal case-building style. Fully non-accusatory: the connection is not
stated, only the intent to look for it.
- id: pc-detective_m_d_con_008
text: "Venn's been managing her exits around Lintar. And she put Kael somewhere he isn't. Let's see what sits at the intersection of those two."
role: player_character
access: [public]
trust: surface
situation: [investigation, alone]
trigger: contradiction_detected
mood: [focused]
priority: 8
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
- id: "npc:sera-venn"
state: Contradicted
- id: "npc:torek-lintar"
relationship: PersonOfInterest
tags: [contradiction, friend-arc, sera, kael, phase-3, analytical]
notes: >
Alternate Phase 3. 'Let's see what' verbal tic, no accusation. 'Managing her exits' is
the detective naming Sera's avoidance behavior — behavioral description, not motive
attribution. 'Put Kael somewhere he isn't' — plain contradiction framing. The intersection
remains unstated. Detective is following the thread, not announcing what's on it.
@@ -1,92 +0,0 @@
character: detective
location: general
lines:
- id: pc-detective_m_d_001
text: "Sova Transit District. Population twelve thousand and change. Let's narrow that down."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, analytical]
- id: pc-detective_m_d_002
text: "The span gate resonance is constant here. Background radiation of a freight hub."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [environmental]
- id: pc-detective_m_d_003
text: "First week on station. The case file is thin. The manifest discrepancies are not."
role: player_character
access: [public]
trust: surface
situation: [investigation]
trigger: time_idle
tags: [investigation, orientation]
- id: pc-detective_m_d_004
text: "Everyone knows I'm Commission. The conversations stop when I walk in. Noted."
role: player_character
access: [public]
trust: surface
situation: [investigation]
trigger: time_idle
tags: [investigation, social]
- id: pc-detective_m_d_005
text: "Station gravity's point-nine-three standard. Enough to notice after a long shift."
role: player_character
access: [public]
trust: surface
situation: [alone]
trigger: time_idle
tags: [environmental, personal]
- id: pc-detective_m_d_006
text: "The previous liaison rotated out three months ago. That gap matters."
role: player_character
access: [public]
trust: surface
situation: [investigation]
trigger: time_idle
tags: [investigation, analytical]
- id: pc-detective_m_d_007
text: "Back in the district. Let's see what changed while I wasn't watching."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: return_visit
tags: [arrival, analytical]
- id: pc-detective_m_d_008
text: "Recycled air, industrial residue, and that constant gate hum. Sova in three notes."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental, atmospheric]
- id: pc-detective_m_d_009
text: "Communities like this close ranks around outsiders. Patient work."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: time_idle
tags: [reflection, social]
- id: pc-detective_m_d_010
text: "The manifest data goes back eighteen months. The pattern starts around month six."
role: player_character
access: [public]
trust: surface
situation: [investigation]
trigger: time_idle
tags: [investigation, analytical]
@@ -1,274 +0,0 @@
character: detective
location: maintenance-corridors
lines:
# --- Arrival + Environmental Flavor ---
- id: pc-detective_m_d_001
text: "Maintenance level. Low lighting, exposed conduit, restricted access nobody enforces."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, environmental]
- id: pc-detective_m_d_002
text: "The air's different down here. Cooler. Damper. Less filtered."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental, atmospheric]
- id: pc-detective_m_d_003
text: "Service corridor B-section. Not on the public transit map. Interesting routing options."
role: player_character
access: [public]
trust: surface
situation: [arrival, investigation]
trigger: enter_location
tags: [arrival, investigation]
- id: pc-detective_m_d_004
text: "Water recycling conduits. The station's circulatory system, hidden from view."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [environmental]
- id: pc-detective_m_d_005
text: "Pipe network branching three directions. Good for maintenance. Better for privacy."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental, analytical]
- id: pc-detective_m_d_006
text: "Emergency lighting only. Visibility reduced, but so is surveillance coverage."
role: player_character
access: [public]
trust: surface
situation: [arrival, investigation]
trigger: enter_location
tags: [environmental, investigation]
- id: pc-detective_m_d_007
text: "The rust smell is stronger near junction B-7. Older section. Less maintenance."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental, atmospheric]
- id: pc-detective_m_d_008
text: "Back in the corridors. Different route this time — mapping the alternatives."
role: player_character
access: [public]
trust: surface
situation: [arrival, investigation]
trigger: return_visit
tags: [arrival, investigation]
# --- Investigation Observations ---
- id: pc-detective_m_d_009
text: "Scuff marks on the floor. Recent, heavy. Cargo weight, not foot traffic."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
tags: [investigation, evidence]
- id: pc-detective_m_d_010
text: "The service hatch has been used recently. Oil on the handle, dust disturbed."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
tags: [investigation, evidence]
- id: pc-detective_m_d_011
text: "Restricted access, but the lock plate shows wear. Regular use by someone with clearance."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
tags: [investigation, evidence]
- id: pc-detective_m_d_012
text: "Sound carries differently down here. Voices from two junctions away, if you're patient."
role: player_character
access: [public]
trust: surface
situation: [investigation, routine]
trigger: hear_sound
tags: [environmental, investigation]
- id: pc-detective_m_d_013
text: "Chalk marks on the wall. Low, deliberate. Not maintenance notation — wrong color."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
tags: [investigation, evidence]
- id: pc-detective_m_d_014
text: "This corridor connects bay four to temp storage. Bypasses the main freight floor entirely."
role: player_character
access: [public]
trust: surface
situation: [arrival, investigation, routine]
trigger: enter_location
tags: [investigation, operational]
- id: pc-detective_m_d_015
text: "Footsteps ahead. Single set, moving fast. Someone who knows where they're going."
role: player_character
access: [public]
trust: surface
situation: [investigation, routine]
trigger: hear_sound
tags: [investigation, caution]
- id: pc-detective_m_d_016
text: "The temp storage access from this side isn't logged on the manifest system. Blind spot."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
tags: [investigation, evidence]
# --- Knowledge-Gated Lines ---
- id: pc-detective_m_d_017
text: "The cargo scuff pattern matches bay four containers. Dock to corridor to storage — the route."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: investigation.smuggling_route
min_confidence: suspects
priority: 8
tags: [investigation, evidence, breakthrough]
- id: pc-detective_m_d_018
text: "Those chalk marks match the courier's timing. Renn's route markers, if I had to guess."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: investigation.renn_courier_role
min_confidence: knows_of
priority: 7
tags: [npc, renn, investigation, evidence]
- id: pc-detective_m_d_019
text: "Camera blind spot at junction C-2. Coincidence, or someone mapped the coverage?"
role: player_character
access: [public]
trust: surface
situation: [investigation, observation, routine]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: investigation.surveillance_gaps
min_confidence: suspects
tags: [investigation, operational]
- id: pc-detective_m_d_020
text: "Standard container, no manifest checkpoint along this route. That's the gap."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
trigger: time_idle
prerequisites:
facts:
- fact_id: investigation.smuggling_route
min_confidence: knows_details
priority: 9
tags: [investigation, breakthrough]
- id: pc-detective_m_d_021
text: "Hatch lubricant is fresh. Someone's maintaining this access point. Not station maintenance."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: investigation.corridor_regular_use
min_confidence: knows_of
tags: [investigation, evidence]
- id: pc-detective_m_d_022
text: "Davan was seen near B-7 during off-shift. Cross-reference with container movements."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
trigger: time_idle
prerequisites:
facts:
- fact_id: investigation.kael_corridor_sighting
min_confidence: suspects
priority: 7
tags: [npc, kael, investigation]
- id: pc-detective_m_d_023
text: "Two access routes, one manifest checkpoint. Someone designed this gap. Or discovered it."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
trigger: time_idle
prerequisites:
facts:
- fact_id: investigation.oversight_gap_pattern
min_confidence: knows_details
tags: [investigation, analytical]
- id: pc-detective_m_d_024
text: "Rosta's gambling debt gives me leverage. But using it makes me the authority they resent."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
trigger: time_idle
prerequisites:
facts:
- fact_id: investigation.drin_gambling_debt
min_confidence: knows_details
priority: 6
tags: [npc, drin, investigation, moral]
- id: pc-detective_m_d_025
text: "Evidence is accumulating. Names, routes, timing. But I still can't see the full picture."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
trigger: time_idle
prerequisites:
facts:
- fact_id: investigation.ring_existence
min_confidence: suspects
tags: [investigation, reflection]
@@ -1,166 +0,0 @@
character: detective
location: opening
lines:
# Opening Hook Sequence — Ticket #300 — Detective Diegetic Tutorial Arc / First 5 Minutes
# 12 lines. Prerequisites null on all — fires before any knowledge graph state exists.
# Priority 8-10 ensures these fire before the general terminal pool lines.
# cooldown: 9999 — each line fires once, does not repeat.
# Arc: institutional orientation → sensory/analytical → lattice overlay → Commission kiosk → fog boundary →
# NPC lattice scan → Sera sighting → Sera warmth → manifest board → anomaly → flag it → operational settle.
# Contraction discipline: analytical lines = uncontracted; personal lines (Sera) = contracted.
# All lines fully schema-compliant per D-035 (role, access, trust, situation present).
- id: pc-detective_m_d_001
text: "Sova Transit. Mid-morning shift, dock lighting at half-cycle. Consistent with the Commission pre-arrival briefing."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start]
trigger: enter_location
mood: [focused]
priority: 10
cooldown: 9999
tags: [opening-hook, tutorial-arc, analytical, orientation]
notes: "Opening line. Reality matches the briefing — he arrived prepared. Establishes: detective as institutional outsider sent here. Cool-lit corridors per D-046 expressed through 'half-cycle' lighting observation. No contractions (analytical)."
- id: pc-detective_m_d_002
text: "Cargo lubricant, recycled atmosphere. Same mixture on every freight hub from here to the span gate hum. First observation: consistent with Commission briefing profile."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start]
trigger: enter_location
mood: [focused]
priority: 10
cooldown: 9999
tags: [opening-hook, tutorial-arc, atmospheric, analytical]
notes: "Environmental sensory in analytical register. Colon usage (detective verbal pattern, section 2.2). No contractions. 'span gate' is canonical terminology (D-036); 'hum' is sensory detail. Contrast with smuggler's 'Home sweet home' — same smell, opposite emotional valence. He's working, not home."
- id: pc-detective_m_d_003
text: "Lattice overlay initializing. Four identity flags in immediate range — cross-referencing against Commission case file."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start]
trigger: enter_location
mood: [focused]
priority: 10
cooldown: 9999
tags: [opening-hook, tutorial-arc, lattice, perception]
notes: "Teaches insert channel. The analytical lattice is active on entry — it flags and cross-references automatically. Teaches: detective's insert HUD is denser and diegetically active (D-048). Players learn the lattice is a tool, not decoration."
- id: pc-detective_m_d_004
text: "Commission kiosk confirmed my credentials on entry. Authority access logged. The floor knows someone's here."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start]
trigger: enter_location
mood: [focused]
priority: 9
cooldown: 9999
tags: [opening-hook, tutorial-arc, institutional, authority]
notes: "Commission kiosk visible, institutional standing established. Sardonic close — dry awareness of his effect on the social environment. Confidence register: wry humor (section 2.8). Teaches: Authority access tier, institutional role is visible to NPCs."
- id: pc-detective_m_d_005
text: "Visual range terminates at bay nine. Approximately fifteen meters. Consistent with district atmo settings."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start, observation]
trigger: enter_location
priority: 9
cooldown: 9999
tags: [opening-hook, tutorial-arc, fog, perception]
notes: "Fog boundary in analytical register. He clocks the measurement, notes 'approximately' — precision with honest calibration. Contrast with smuggler's 'Can't see the far dock' — same fog, different framing: limitation vs. measurement."
- id: pc-detective_m_d_006
text: "Dock workers distributed across nine visible bays. Lattice flagging each on contact. Names from the case file, faces from the floor."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start, observation]
trigger: enter_location
mood: [focused]
priority: 9
cooldown: 9999
tags: [opening-hook, tutorial-arc, lattice, orientation]
notes: "Spatial overview with lattice overlay tutorial. Explains how the insert channel works: lattice matches observed faces against the pre-loaded case file. Parallel structure ('Names from... faces from...'). Teaches: NPC identification comes through the lattice."
- id: pc-detective_m_d_007
text: "Venn, S. at the far terminal. She said she'd come in early."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start, social]
trigger: observe_npc
mood: [warm]
priority: 10
cooldown: 9999
tags: [opening-hook, tutorial-arc, sera, friend-arc]
notes: "First Sera sighting. Surname-initial filing first (institutional reflex) — then breaks to personal contracted voice ('she'd') in the same beat. Teaches contrast: case-file subjects get 'Davan, K.'; Sera gets a different register. D-033 Unknown/Neutral teal entity."
- id: pc-detective_m_d_008
text: "She's got the manifest logs open already. Field tech who knows how to pull records — she knows what I need before I ask."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start, social]
trigger: observe_npc
mood: [warm]
priority: 9
cooldown: 9999
tags: [opening-hook, tutorial-arc, sera, friend-arc]
notes: "Sera warmth. Fully contracted throughout ('She's', 'she knows') — personal mode, no analytical distance. Em-dash. Professional respect established without implying prior district visits. Contrast with how he processes everyone else. Teaches: some NPCs are in a different relational category (THE FRIEND pattern, D-034)."
- id: pc-detective_m_d_009
text: "Central manifest board: real-time container routing, weight declarations, bay assignments. Everything routes through here."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start, investigation]
trigger: enter_location
mood: [focused]
priority: 8
cooldown: 9999
tags: [opening-hook, tutorial-arc, manifest, investigation]
notes: "Manifest board labeled and cataloged. Colon usage (section 2.2). No contractions (analytical). Teaches: the manifest board is the information hub — and therefore the investigation's starting point."
- id: pc-detective_m_d_010
text: "Container 4471. Temp storage flag since yesterday. Standard turnaround is sub-eight hours — that's not standard."
role: player_character
access: [public]
trust: surface
situation: [arrival, observation, investigation]
trigger: observe_anomaly
mood: [focused, suspicious]
priority: 9
cooldown: 9999
tags: [opening-hook, tutorial-arc, manifest, investigation, anomaly]
notes: "First manifest anomaly. Specific container ID from case file. 'That's not standard' — only contraction in an analytical line, marking it as personal reaction to the finding. Sets the investigation hook: something is wrong before he asks a single question."
- id: pc-detective_m_d_011
text: "Worth flagging. Let's see what the shift logs say about that container's overnight routing."
role: player_character
access: [public]
trust: surface
situation: [observation, investigation]
trigger: observe_anomaly
mood: [focused]
priority: 8
cooldown: 9999
tags: [opening-hook, tutorial-arc, investigation, next-step]
notes: "'Worth flagging' + 'Let's see what' — both detective verbal tics in sequence (section 2.7). Frames the next investigative step. Teaches: investigation is incremental — observe, flag, investigate deeper."
- id: pc-detective_m_d_012
text: "Lattice stable. Nine identity flags and counting. Let's see what this shift tells me."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start]
trigger: enter_location
mood: [focused]
priority: 7
cooldown: 9999
tags: [opening-hook, tutorial-arc, lattice, operational]
notes: "Operational settle — closes the opening arc. Lattice confirmed active, identity count growing. 'Let's see what...' verbal tic as the closing beat. The whole opening hook lands here: credentials logged, floor scanned, first anomaly flagged. Investigation begins."
@@ -1,133 +0,0 @@
# 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: pc-detective_m_d_001
text: "That dock worker checks the corridor before turning. Habitual. Military? Or just careful."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
relationship:
target: npc:pc-smuggler
state: known
tags: [npc, pc-smuggler, tell, corridor-check]
- id: pc-detective_m_d_002
text: "Movement pattern changed at shift change. More direct. Less idle. Interesting."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_anomaly
prerequisites:
relationship:
target: npc:pc-smuggler
state: known
tags: [npc, pc-smuggler, tell, shift-transition]
- id: pc-detective_m_d_003
text: "Slight acceleration past the checkpoint. Most people do it. But this one does it every time."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_anomaly
prerequisites:
relationship:
target: npc:pc-smuggler
state: known
tags: [npc, pc-smuggler, tell, security-proximity]
- id: pc-detective_m_d_004
text: "Same three people at the same table. Every shift. Consistent social group."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
relationship:
target: npc:pc-smuggler
state: known
tags: [npc, pc-smuggler, tell, social-clustering]
- id: pc-detective_m_d_005
text: "That worker checked container 4471 twice. The same container that's in my manifest discrepancy file."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
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: pc-detective_m_d_006
text: "Three behavioral flags on one dock worker. Corridor awareness, shift-transition alertness, cargo fixation. That's a pattern."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
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: pc-detective_m_d_007
text: "Cross-referencing the dock worker's shift schedule with manifest anomalies. Correlation: moderate."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
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: pc-detective_m_d_008
text: "The dock worker and Davan eat together every shift. Same courier joins them. Tight operational cluster."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
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]
@@ -1,525 +0,0 @@
character: detective
location: the-last-shift
lines:
# --- Arrival + Environmental Flavor ---
- id: pc-detective_m_d_001
text: "The Last Shift. Only place in this district that doesn't smell like freight lubricant."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, atmospheric]
- id: pc-detective_m_d_002
text: "Grain spirit and low conversation. The social nexus of Sova Transit."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, analytical]
- id: pc-detective_m_d_003
text: "Bar's busy tonight. Good — crowds talk. Bad — they notice outsiders."
role: player_character
access: [public]
trust: surface
situation: [arrival, investigation]
trigger: enter_location
tags: [arrival, investigation]
- id: pc-detective_m_d_004
text: "Standard district bar. Prefab fixtures, aftermarket lighting, a menu board nobody reads."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, environmental]
- id: pc-detective_m_d_005
text: "The Meridian feed on the wall display. Local news, freight indices, Assembly coverage."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental]
- id: pc-detective_m_d_006
text: "The overhead vent rattles every thirty seconds. Like clockwork. Nobody else notices."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [environmental]
- id: pc-detective_m_d_007
text: "The conversation volume dropped when I walked in. Recovering now. They're adjusting."
role: player_character
access: [public]
trust: surface
situation: [arrival, investigation]
trigger: enter_location
tags: [social, investigation]
- id: pc-detective_m_d_008
text: "Back at the bar. Same booth. Let's see who's here and who isn't."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: return_visit
tags: [arrival, analytical]
- id: pc-detective_m_d_009
text: "Kitchen's running. Fried protein and something spiced. The bar's other currency: hot food."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental, atmospheric]
- id: pc-detective_m_d_010
text: "Someone carved initials into this table. Old. A history I don't have."
role: player_character
access: [public]
trust: surface
situation: [alone]
trigger: time_idle
tags: [environmental, reflection]
# --- NPC Commentary ---
- id: pc-detective_m_d_011
text: "The bartender — Sessik, L. Knows everyone. Watches everything. Gives away nothing."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, lera, analytical]
- id: pc-detective_m_d_012
text: "Good to see Sera. At least someone in this district speaks my language."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, sera, warm]
- id: pc-detective_m_d_013
text: "Lintar, T. — the loud one at the bar. Spends freely. Where's the money from?"
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_npc
tags: [npc, torek, investigation]
- id: pc-detective_m_d_014
text: "A woman at the corner table — Tamm, N., according to Sera. Davan's partner."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, naia, analytical]
- id: pc-detective_m_d_015
text: "The regulars have assigned seating. Unofficial, but enforced. I don't have a spot yet."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [social, atmospheric]
- id: pc-detective_m_d_016
text: "Sessik greeted three people by name since I sat down. I got a nod. Progress."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: witness_interaction
tags: [npc, lera, social]
- id: pc-detective_m_d_017
text: "Two dock workers in the corner. Heads close, voices low. Not unusual for after-shift."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: witness_interaction
tags: [social, investigation]
- id: pc-detective_m_d_018
text: "Sera introduced me to Tamm. Brief, polite, guarded. Expected."
role: player_character
access: [public]
trust: surface
situation: [social]
trigger: post_conversation
tags: [npc, sera, naia, social]
- id: pc-detective_m_d_019
text: "Sessik poured my drink without asking. She remembered. Small thing, but noted."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, lera, social, warm]
- id: pc-detective_m_d_020
text: "The old man by the window hasn't spoken to anyone all evening. Watching, though."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [social, atmospheric]
# --- Knowledge-Gated Lines ---
- id: pc-detective_m_d_021
text: "Sera left when Torek arrived. Second time. Different excuse. Same result."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: behavioral.sera_avoidance_pattern
min_confidence: suspects
priority: 7
tags: [npc, sera, torek, tell, friend-arc]
- id: pc-detective_m_d_022
text: "That's the third time. Three excuses, one result. That's data."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: behavioral.sera_avoidance_pattern
min_confidence: knows_of
priority: 9
tags: [npc, sera, torek, tell, friend-arc, contradiction]
- id: pc-detective_m_d_023
text: "Lintar's spending doesn't match a dock worker's salary. Source unknown."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_npc
prerequisites:
facts:
- fact_id: investigation.torek_spending_pattern
min_confidence: knows_of
tags: [npc, torek, investigation]
- id: pc-detective_m_d_024
text: "Sessik's eyes tracked me when I sat near the back room. Protective, not hostile."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_npc
prerequisites:
facts:
- fact_id: knowledge.bar_back_room_significance
min_confidence: suspects
tags: [npc, lera, investigation]
- id: pc-detective_m_d_025
text: "Sera's being extra helpful tonight. Names, backgrounds, context. Compensating?"
role: player_character
access: [public]
trust: surface
situation: [investigation, social]
trigger: post_conversation
prerequisites:
relationship:
target: npc:sera-venn
state: person_of_interest
priority: 7
tags: [npc, sera, friend-arc, behavioral]
- id: pc-detective_m_d_026
text: "Same booth. Same warm smile. Same offer to buy me a drink. Everything except the truth."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_npc
prerequisites:
relationship:
target: npc:sera-venn
state: person_of_interest
priority: 8
tags: [npc, sera, contaminated-trust, friend-arc]
- id: pc-detective_m_d_027
text: "Tamm seems distressed tonight. Not her baseline. Something at home, or something she heard?"
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
relationship:
target: npc:naia-tamm
state: known
tags: [npc, naia, behavioral]
- id: pc-detective_m_d_028
text: "Sessik just redirected a conversation away from freight schedules. Protective reflex?"
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: witness_interaction
prerequisites:
facts:
- fact_id: knowledge.bar_ring_awareness
min_confidence: suspects
tags: [npc, lera, investigation]
- id: pc-detective_m_d_029
text: "Davan and his partner at the bar. She's talking. He's not listening. Noted."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: witness_interaction
prerequisites:
relationship:
target: npc:kael-davan
state: known
tags: [npc, kael, naia, behavioral]
- id: pc-detective_m_d_030
text: "The regulars are warming up. Three visits and I'm almost furniture. Almost."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: return_visit
prerequisites:
facts:
- 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: pc-detective_m_d_031
text: "Davan is different here. Looser. The dock worker persona drops and something warmer replaces it."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
relationship:
target: npc:kael-davan
state: known
tags: [npc, kael, behavioral, dual-context]
- id: pc-detective_m_d_032
text: "Davan checks the door every time it opens. Even here. Even off-shift. That is not relaxation."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
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: pc-detective_m_d_033
text: "Sera changed the subject when I mentioned manifests. Smooth. Practised, maybe."
role: player_character
access: [public]
trust: surface
situation: [investigation, social]
trigger: post_conversation
prerequisites:
facts:
- fact_id: behavioral.sera_topic_deflection
min_confidence: suspects
priority: 6
tags: [npc, sera, tell, behavioral, friend-arc]
- id: pc-detective_m_d_034
text: "She volunteers names, routines, context. Gives everything I ask for -- except what I did not."
role: player_character
access: [public]
trust: surface
situation: [investigation, social]
trigger: post_conversation
prerequisites:
relationship:
target: npc:sera-venn
state: friendly
priority: 6
tags: [npc, sera, tell, overcompensation, friend-arc]
- id: pc-detective_m_d_035
text: "Sera at the Commission kiosk. Third pass this shift. That is not standard recalibration."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_npc
prerequisites:
facts:
- fact_id: behavioral.sera_kiosk_pattern
min_confidence: suspects
priority: 7
tags: [npc, sera, tell, peripheral, friend-arc]
- id: pc-detective_m_d_036
text: "Everything Sera told me checks out. Layout, schedules, regulars. Accurate. Thorough. Selective?"
role: player_character
access: [public]
trust: surface
situation: [investigation, social]
trigger: post_conversation
prerequisites:
relationship:
target: npc:sera-venn
state: friendly
priority: 5
tags: [npc, sera, analytical, phase-2-3, friend-arc]
- id: pc-detective_m_d_037
text: "She mentioned Naia's worry about Kael early -- before I had context. Priming, or concern?"
role: player_character
access: [public]
trust: surface
situation: [investigation, social]
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: pc-detective_m_d_038
text: "Sera's institutional access goes further than field calibration. She could pull records I cannot."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
trigger: time_idle
prerequisites:
relationship:
target: npc:sera-venn
state: friendly
tags: [npc, sera, analytical, capability, friend-arc]
- id: pc-detective_m_d_039
text: "Assessment: Venn, S. Cooperative. Embedded. Competent. Green -- with reservations now."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
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: pc-detective_m_d_040
text: "Correction: amber. The avoidance pattern is behavioural, not preferential. Data, not taste."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
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: pc-detective_m_d_041
text: "She's the first person who made this place feel less foreign. I need that to not matter right now."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
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: pc-detective_m_d_042
text: "Those early tips. The district layout, the introductions. Were those help -- or steering?"
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
trigger: time_idle
prerequisites:
relationship:
target: npc:sera-venn
state: person_of_interest
priority: 7
tags: [npc, sera, contaminated-trust, retrospective, friend-arc]
- id: pc-detective_m_d_043
text: "She's not a suspect. She's a friend with access to everything I need. That is the problem."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
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: pc-detective_m_d_044
text: "Trust: compromised. The question is not what she told me. It is what she did not."
role: player_character
access: [public]
trust: surface
situation: [investigation, social]
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]
@@ -1,522 +0,0 @@
character: detective
location: the-terminal
lines:
# --- Arrival + Environmental Flavor ---
- id: pc-detective_m_d_001
text: "Logistics hub. Standard prefab, heavy foot traffic. Let's see what the shift change tells me."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, analytical]
- id: pc-detective_m_d_002
text: "Sixteen bays, four loading arms, one manifest board. Everything routes through here."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, orientation]
- id: pc-detective_m_d_003
text: "Cargo lubricant and recycled air. The smell of honest work. Or a convincing imitation."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, atmospheric]
- id: pc-detective_m_d_004
text: "Loading arm three has a grind in its cycle. Maintenance deferred — budget, or negligence?"
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [environmental, analytical]
- id: pc-detective_m_d_005
text: "Shift change in twenty minutes. The handover period is where oversight gets thin."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation, routine]
trigger: time_idle
tags: [investigation, operational]
- id: pc-detective_m_d_006
text: "The manifest board updates in real-time. Container movement, weight, destination. All logged."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental, orientation]
- id: pc-detective_m_d_007
text: "Heavy foot traffic at shift change. Good — observation is easier in a crowd."
role: player_character
access: [public]
trust: surface
situation: [arrival, investigation]
trigger: enter_location
tags: [arrival, investigation]
- id: pc-detective_m_d_008
text: "Containers stacked to regulation height in most bays. Bay four is the exception."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
tags: [environmental, investigation]
- id: pc-detective_m_d_009
text: "Back at the hub. Different shift, different faces. Same manifest board."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: return_visit
tags: [arrival]
- id: pc-detective_m_d_010
text: "The dock lights are running half-cycle. Saves power. Also reduces visibility."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental, analytical]
- id: pc-detective_m_d_011
text: "Something in the air beyond the lubricant. Chemical, faint. Not standard freight residue."
role: player_character
access: [public]
trust: surface
situation: [arrival, investigation]
trigger: enter_location
tags: [environmental, investigation]
- id: pc-detective_m_d_012
text: "Overhead conveyor running at capacity. The manifest says otherwise. Interesting."
role: player_character
access: [public]
trust: surface
situation: [investigation, routine]
trigger: hear_sound
tags: [environmental, investigation]
# --- NPC Commentary ---
- id: pc-detective_m_d_013
text: "Shift supervisor Voss. Tense posture, checking the dock more than the schedule."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, voss, behavioral]
- id: pc-detective_m_d_014
text: "Korr, M. — freight scheduler. Efficient, focused. Either very good or very careful."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, maret, analytical]
- id: pc-detective_m_d_015
text: "Rosta, D. — dock inspector. Quick checks, minimal documentation. That's a pattern."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_npc
tags: [npc, drin, investigation]
- id: pc-detective_m_d_016
text: "Dock worker. Davan, K. Unremarkable on paper. But he knows the bay layout cold."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, kael]
- id: pc-detective_m_d_017
text: "Conversations stop when I pass. Standard response to Commission presence. Expected."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: witness_interaction
tags: [social, investigation]
- id: pc-detective_m_d_018
text: "Two workers talking by bay six. One sees me, taps the other. Both go quiet."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: witness_interaction
tags: [social, investigation]
- id: pc-detective_m_d_019
text: "Voss gave Davan a look across the bay. Brief. Loaded. Filing it."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: witness_interaction
tags: [npc, voss, kael, behavioral]
- id: pc-detective_m_d_020
text: "The courier — Renn — moves fast. Efficient routing. Knows these corridors well."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, renn, analytical]
- id: pc-detective_m_d_021
text: "New shift starting. Different bodies, same avoidance radius around me."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [social, atmospheric]
- id: pc-detective_m_d_022
text: "Rosta's inspection of bay four took forty seconds. The others: three minutes each."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_npc
tags: [npc, drin, investigation, behavioral]
- id: pc-detective_m_d_023
text: "Voss deflected when I asked about overnight containers. Smooth, but I caught it."
role: player_character
access: [public]
trust: surface
situation: [investigation, social]
trigger: post_conversation
tags: [npc, voss, investigation]
- id: pc-detective_m_d_024
text: "Korr won't make eye contact. Not hostility — something else. Anxiety, maybe."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, maret, behavioral]
# --- Knowledge-Gated Lines ---
- id: pc-detective_m_d_025
text: "Davan's lattice activity spiked. Expecting a message? Or checking for surveillance?"
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_anomaly
prerequisites:
relationship:
target: npc:kael-davan
state: known
tags: [npc, kael, behavioral, tell]
- id: pc-detective_m_d_026
text: "Container 4471. Logged for temp storage overnight. Turnaround should be sub-eight hours."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: investigation.manifest_discrepancy
min_confidence: knows_of
priority: 7
tags: [investigation, evidence]
- id: pc-detective_m_d_027
text: "Weight discrepancy on the bay four manifest. Point-three kilos over declared. Noted."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: investigation.manifest_discrepancy
min_confidence: suspects
tags: [investigation, evidence]
- id: pc-detective_m_d_028
text: "Rosta's gambling debts are in the case file. Leverage, if I need it. Do I need it?"
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
trigger: time_idle
prerequisites:
facts:
- fact_id: investigation.drin_gambling_debt
min_confidence: knows_details
tags: [npc, drin, investigation, moral]
- id: pc-detective_m_d_029
text: "Three names keep appearing near the anomalous manifests: Voss, Davan, Renn. Coincidence?"
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
trigger: time_idle
prerequisites:
facts:
- fact_id: investigation.manifest_discrepancy
min_confidence: knows_of
priority: 7
tags: [investigation, analytical]
- id: pc-detective_m_d_030
text: "The shift transition creates a twenty-minute gap in active oversight. Every cycle."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation, routine]
trigger: time_idle
prerequisites:
facts:
- fact_id: investigation.oversight_gap_pattern
min_confidence: knows_details
priority: 7
tags: [investigation, operational]
- id: pc-detective_m_d_031
text: "Korr changed the schedule after our conversation. Covering tracks, or just doing her job?"
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
prerequisites:
entity_attributes:
- entity: npc:maret-korr
key: behavior_flags
value: schedule_modification
tags: [npc, maret, investigation]
- id: pc-detective_m_d_032
text: "Rosta inspects everything else by the book. Bay four is the exception. That's the tell."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_npc
prerequisites:
facts:
- fact_id: investigation.drin_inspection_pattern
min_confidence: knows_of
priority: 8
tags: [npc, drin, investigation, behavioral]
- id: pc-detective_m_d_033
text: "Davan's at an unusual terminal. Not his assigned bay. Why the move?"
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
prerequisites:
relationship:
target: npc:kael-davan
state: known
tags: [npc, kael, investigation]
- id: pc-detective_m_d_034
text: "Voss is watching me watch his people. He knows what I'm here for."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_npc
prerequisites:
facts:
- fact_id: behavioral.voss_awareness
min_confidence: suspects
priority: 6
tags: [npc, voss, investigation]
- id: pc-detective_m_d_035
text: "The routing logs and the physical movement don't match. Someone's hand-editing."
role: player_character
access: [public]
trust: surface
situation: [investigation]
trigger: discover_evidence
prerequisites:
facts:
- 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: pc-detective_m_d_036
text: "Davan's shift pattern is clean. Too clean. Same bays, same hours, same rotation. Nothing out of place."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
relationship:
target: npc:kael-davan
state: known
tags: [npc, kael, analytical, behavioral]
- id: pc-detective_m_d_037
text: "Davan eats with the same group every shift. Social anchor, or keeping tabs?"
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
relationship:
target: npc:kael-davan
state: known
tags: [npc, kael, social, behavioral]
- id: pc-detective_m_d_038
text: "Davan handled that container routing without checking the manifest board. He knows the schedule by heart."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
relationship:
target: npc:kael-davan
state: known
priority: 6
tags: [npc, kael, behavioral, tell, competence]
- id: pc-detective_m_d_039
text: "Davan's posture changed when I approached bay four. Subtle. Filing it."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
prerequisites:
relationship:
target: npc:kael-davan
state: person_of_interest
priority: 7
tags: [npc, kael, tell, behavioral, friend-arc]
- id: pc-detective_m_d_040
text: "Three manifests with weight discrepancies. All during Davan's shifts. Correlation is not causation. But noted."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
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]
# --- Triangle Activation: Sera Venn / Torek Lintar (T2: Sera-Detective-Commission, D-087) ---
# Fires post-TriangleActivated when player has LOS to Sera or Torek. One beat per line.
# Beat 1: pattern recognition. Beat 2: deviation logged. Beat 3: hypothesis. Beat 4: inference. Beat 5: procedural next step.
- id: pc-detective_m_d_041
text: "Venn changed her transit route. Bay six to bay four bypass — three times today."
role: player_character
access: [public]
trust: surface
situation: [triangle_activated]
trigger: observe_npc
mood: [suspicious]
priority: 8
cooldown: 9999
tags: [triangle-signal, tell-observation, npc, sera, analytical]
prerequisites:
npc_in_los: true
- id: pc-detective_m_d_042
text: "She passed Torek without acknowledgment. Third instance logged. They have worked adjacent bays for months."
role: player_character
access: [public]
trust: surface
situation: [triangle_activated]
trigger: observe_npc
mood: [suspicious]
priority: 8
cooldown: 9999
tags: [triangle-signal, tell-observation, npc, sera, torek, behavioral]
prerequisites:
npc_in_los: true
- id: pc-detective_m_d_043
text: "Avoidance without cause. Either she does not know about the discrepancy, or she knows and has chosen silence."
role: player_character
access: [public]
trust: surface
situation: [triangle_activated]
trigger: observe_npc
mood: [suspicious]
priority: 8
cooldown: 9999
tags: [triangle-signal, tell-observation, npc, sera, analytical, friend-arc]
prerequisites:
npc_in_los: true
- id: pc-detective_m_d_044
text: "Possible explanations: fear, loyalty, complicity. Insufficient data to distinguish."
role: player_character
access: [public]
trust: surface
situation: [triangle_activated]
trigger: observe_npc
mood: [suspicious]
priority: 8
cooldown: 9999
tags: [triangle-signal, tell-observation, npc, sera, analytical, friend-arc]
prerequisites:
npc_in_los: true
- id: pc-detective_m_d_045
text: "Worth a direct conversation. Controlled setting. Not here."
role: player_character
access: [public]
trust: surface
situation: [triangle_activated]
trigger: observe_npc
mood: [suspicious]
priority: 8
cooldown: 9999
tags: [triangle-signal, tell-observation, npc, sera, procedural, friend-arc]
prerequisites:
npc_in_los: true
@@ -1,243 +0,0 @@
character: detective
location: tutorial
lines:
# Diegetic Tutorial Monologue — Ticket #330 — Detective
# Authored per sprint-17 copy briefing and D-016 (internal monologue as core system).
#
# These lines teach mechanics through character voice — not UI instructions.
# Distinct from opening.yaml (which covers the first 5 minutes and sets voice/motivation).
# These fire on first-time events throughout gameplay, wherever they occur.
#
# Coverage:
# Movement / exploration — first_move, first_new_section
# Fog of perception — first_fog_encounter, first_fog_edge
# Sound model — first_sound_heard, first_off_screen_sound
# NPC interaction — first_npc_proximity, first_npc_face_read
# Insert / HUD — first_insert_open, first_insert_contact_flag
#
# Voice: analytical, procedure-oriented, careful. No contractions in analytical mode.
# Colon usage for categorization. 'Let's see what...' and 'Worth flagging' verbal tics.
# ID discriminator: _tut_ per sprint briefing.
# cooldown: omitted — fire-once enforced by trigger semantics (first_* triggers
# fire once per game), not by a cooldown value.
# priority: 8 (primary, one per trigger type), 6 (secondary variant, mood-weighted alternate).
#
# Schema corrections (Gestalt review, Sprint 17):
# priority: string "tutorial" → integer. All other monologue files use integer priority;
# string value would fail engine parse in monologue.rs.
# situation: removed invalid values (movement, exploration) not in D-035 13-situation
# enum. Replaced with arrival, routine per actual trigger context.
#
# Trigger types (first_move, first_new_section, first_fog_encounter, first_fog_edge,
# first_sound_heard, first_off_screen_sound, first_npc_proximity, first_npc_face_read,
# first_insert_open, first_insert_contact_flag) are extended trigger enum values not in
# D-035 v0.1 set — require server-side implementation in monologue.rs.
# -----------------------------------------------------------------------
# MOVEMENT / EXPLORATION
# -----------------------------------------------------------------------
- id: pc-detective_m_d_tut_001
text: "Signage: section designators on the corridor wall. Commission-standard markings. Worth learning before the district learns me."
role: player_character
access: [public]
trust: surface
situation: [arrival, routine]
trigger: first_move
mood: [focused]
priority: 8
tags: [tutorial, movement, navigation, analytical]
notes: >
Detective version of the 'check the signage' tutorial. Colon usage for the signage
label (section 2.2 verbal pattern). 'Commission-standard markings' — institutional
framing; he reads the environment through his professional lens first. 'Worth learning
before the district learns me' — dry awareness of his asymmetric visibility in this
community. Same teaching as the smuggler version, different cognitive frame.
- id: pc-detective_m_d_tut_002
text: "Three sections in range from the main terminal. Commission briefing had the layout. Let's confirm it against the floor."
role: player_character
access: [public]
trust: surface
situation: [arrival, investigation]
trigger: first_new_section
mood: [focused]
priority: 6
tags: [tutorial, movement, navigation, analytical]
notes: >
Fires on entering a new section for the first time. 'Commission briefing had the
layout' — he arrived with a map, now he's verifying it against reality. 'Let's
confirm it against the floor' — 'Let's' verbal tic, investigative method stated as
principle: documentation is a starting point, not a substitute for observation.
Teaches: the district has distinct sections to explore.
# -----------------------------------------------------------------------
# FOG OF PERCEPTION
# -----------------------------------------------------------------------
- id: pc-detective_m_d_tut_003
text: "Visual range terminates at the corridor junction. Consistent with district atmo settings. Anything past that point: unconfirmed."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: first_fog_encounter
mood: [focused]
priority: 8
tags: [tutorial, fog, perception, analytical]
notes: >
Detective fog tutorial — analytical register throughout. 'Visual range terminates at'
instead of 'Can't see past.' 'Consistent with atmo settings' — he already knows this
is an environmental property, not an anomaly. 'Anything past that point: unconfirmed'
— colon usage, precise epistemic status. Teaches: perception boundary exists, and
the detective categorizes it as an information state, not a barrier. Compare to
smuggler's 'Might be worth checking' — same fog, different response.
- id: pc-detective_m_d_tut_004
text: "Can't clear the far bay from here. Going around is the procedure — not a limitation, a working condition."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: first_fog_edge
mood: [focused]
priority: 6
tags: [tutorial, fog, perception, analytical]
notes: >
Second fog encounter line — fires at a fog zone boundary. 'Going around is the
procedure' — detective frames the limitation as methodology. The second clause
('not a limitation, a working condition') is self-instruction: he's telling himself
not to treat fog as frustrating but as standard operating environment. Teaches:
perception range is persistent throughout gameplay, and the correct response is
movement, not waiting.
# -----------------------------------------------------------------------
# SOUND MODEL
# -----------------------------------------------------------------------
- id: pc-detective_m_d_tut_005
text: "Voices. Down the corridor. Source count indeterminate from here — distance degrades clarity."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: first_sound_heard
mood: [focused]
priority: 8
tags: [tutorial, sound, perception, analytical]
notes: >
Detective sound tutorial — analytical framing of the briefing's example. 'Source count
indeterminate' is the precise version of 'can't tell how many.' 'Distance degrades
clarity' — technical, causal. He hears, notes what he can establish (voices, direction)
and what he can't (count, content). No contractions. Teaches: sound channel is active
and distance-limited. Compare to smuggler's 'Can't make out the words' — same acoustic
reality, systematized differently.
- id: pc-detective_m_d_tut_006
text: "Footsteps. Metal-grated surface. Two sets minimum — moving away. Service access corridor, by the acoustic signature."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: first_off_screen_sound
mood: [focused]
priority: 6
tags: [tutorial, sound, perception, analytical]
notes: >
Second sound tutorial — fires on an off-screen audio source. The detective parses
the sound through multiple analytical dimensions: surface type, count, direction,
room type. 'Two sets minimum' — precise but not overclaiming. 'By the acoustic
signature' is technical terminology applied to diegetic audio interpretation.
Teaches: sound carries more than presence — floor type, distance, count, direction
are all extractable. The detective extracts all of them automatically.
# -----------------------------------------------------------------------
# NPC INTERACTION
# -----------------------------------------------------------------------
- id: pc-detective_m_d_tut_007
text: "Civilians in range. Standard approach: observe before engaging. Let them surface what's relevant before directing the conversation."
role: player_character
access: [public]
trust: surface
situation: [social, observation]
trigger: first_npc_proximity
mood: [focused]
priority: 8
tags: [tutorial, npc, interaction, analytical]
notes: >
Detective NPC tutorial — procedural, method-as-principle. 'Civilians in range' is
his categorization (Commission-trained: everyone is a witness category until proven
otherwise). 'Standard approach' — he has a protocol. 'Let them surface what's relevant'
is the investigative principle: don't prime witnesses, let them self-select information.
No contractions throughout. Teaches: NPC interaction is player-initiated and
approach-sensitive. Different method than the smuggler ('give them reason to') —
same outcome, different social model.
- id: pc-detective_m_d_tut_008
text: "Commission credentials flag on approach. They know who I am before I speak. Worth noting who adjusts their behavior."
role: player_character
access: [public]
trust: surface
situation: [social, investigation]
trigger: first_npc_face_read
mood: [focused]
priority: 6
tags: [tutorial, npc, observation, analytical, authority]
notes: >
Fires when the player observes an NPC at close range. The detective's asymmetry:
his authority access tier makes him visible in ways the smuggler is not. NPCs react
to his presence before interaction begins. 'Worth noting who adjusts their behavior'
— 'Worth' verbal tic, sets up behavioral observation as investigation method. Teaches:
the detective's Commission credentials affect NPC behavior, and that behavioral
response is data.
# -----------------------------------------------------------------------
# INSERT / HUD
# -----------------------------------------------------------------------
- id: pc-detective_m_d_tut_009
text: "Lattice overlay active: time, contact positions, flagged entities. Commission-linked. Standard procedure to keep it running."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: first_insert_open
mood: [focused]
priority: 8
tags: [tutorial, insert, hud, analytical]
notes: >
Detective insert tutorial. Colon usage: catalogs what the overlay contains. 'Commission-
linked' — institutional framing, establishes why the detective's HUD is denser than
the smuggler's. 'Standard procedure' — not a discovery, a protocol. Teaches: the
insert is an active investigation tool, not optional. Compare to smuggler's 'Should
show the time and nearby contacts' — same overlay, presented as procedural requirement
vs. operational check.
- id: pc-detective_m_d_tut_010
text: "Nine identity flags in range. Cross-referencing case file now. Let's see what matches."
role: player_character
access: [public]
trust: surface
situation: [investigation, routine]
trigger: first_insert_contact_flag
mood: [focused]
priority: 6
tags: [tutorial, insert, hud, lattice, investigation]
notes: >
Fires when the insert first populates with flagged entities. Count given precisely
('Nine identity flags'). 'Case file' — the detective's overlay cross-references a
pre-loaded investigation file, not just a general registry. 'Let's see what matches'
— 'Let's see what' verbal tic closing the tutorial sequence. Teaches: the detective's
insert is investigation-keyed, matching observed faces against case file entries.
This is why his overlay is analytically denser than the smuggler's.
@@ -1,228 +0,0 @@
character: smuggler
location: contradiction
lines:
# Contradiction Monologue — Ticket #552 — Sera/Kael FRIEND Arc (Smuggler perspective)
# Authored per D-083 (contradiction detection pipeline) and Paula Round 2 Mellanie spec
# (docs/workshops/knowledge-flow-npc-boundaries/paula-round2.md, lines 117-158).
#
# Trigger: contradiction_detected fires when the smuggler observes Kael in Corridor B-7
# with an unrecognized contact — contradicting Kael's stated location and ring protocol.
# Event payload: source_display_name = "Kael Davan", subject_display_name = "Kael Davan"
# (Kael is both source and subject: he placed himself elsewhere, smuggler sees him here.)
#
# FRIEND-pattern NPCs always use hand-authored lines — generic template fallback
# does not fire for this arc.
#
# Authoring principle: cognitive dissonance, not accusation. The smuggler reads social
# signals instinctively, but doesn't conclude — she contains the alarm. Street-smart
# gut reaction, not analytical procedure.
#
# Phase 2 lines: first observation — Kael in B-7 with unknown contact.
# Prerequisite: KG entry for Kael has state: Contradicted, source: ToldBy(Kael Davan)
# Phase 3 lines: behavioral pattern already accumulating — increased lattice checking,
# shortened interactions, early exits from break room.
# Prerequisite: Phase 2 + Kael's behavioral anomalies observed (count >= 2).
#
# ID discriminator: _con_ marks contradiction lines per Q-028 pending resolution.
# cooldown: omitted — fire-once enforced by trigger semantics (contradiction_detected
# fires once per KG state change), not by a cooldown value.
#
# Note: contradiction_detected is a new trigger type — requires server-side implementation
# in monologue.rs (ticket #550). Secondary beat lines use lower priority for sequencing;
# server team should implement delay_after_trigger_ticks for proper 3-5 second gap.
# -----------------------------------------------------------------------
# PHASE 2 — Primary beat (fires on contradiction_detected, immediate)
# -----------------------------------------------------------------------
- id: pc-smuggler_m_s_con_001
text: "Kael said second shift was clear. He's in B-7. With someone I don't know."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: contradiction_detected
mood: [focused, anxious]
priority: 10
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
tags: [contradiction, friend-arc, kael, phase-2, operational]
notes: >
Primary line — three beats, three facts. 'Kael said' names the source (friend register,
first name). 'He's in B-7' is the observation. 'With someone I don't know' is the alarm:
not just wrong location, but outside the ring. Fragment structure throughout — the smuggler
clocks a scene in pieces. No accusation, no conclusion: just inventory of what's wrong.
- id: pc-smuggler_m_s_con_002
text: "That's Kael. Restricted corridor. Unrecognized contact. Kael doesn't come to B-7."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: contradiction_detected
mood: [focused]
priority: 9
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
tags: [contradiction, friend-arc, kael, phase-2, operational]
notes: >
Alternate primary — catalog format. 'That's Kael' opens with identification, not alarm:
recognition first, then the wrong details fall into place. Each fragment adds one layer
of what's wrong. Close: 'Kael doesn't come to B-7' — negative statement of prior
expectation, which is now violated. No contraction in the closing declarative (emphasis).
- id: pc-smuggler_m_s_con_003
text: "He's in B-7. He told me he'd be heading home after shift. One of those isn't the case."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: contradiction_detected
mood: [focused, anxious]
priority: 9
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
tags: [contradiction, friend-arc, kael, phase-2]
notes: >
Alternate primary — echoes the Paula canonical structure (observation / prior claim /
contradiction stated) but in the smuggler's voice. 'He told me' is personal register
(friend, not colleague). 'One of those isn't the case' — the smuggler's understated
version of flagging a contradiction: not 'one of them is a lie' but 'isn't the case.'
Epistemic containment in plain language.
# -----------------------------------------------------------------------
# PHASE 2 — Secondary beat (gut-level recalibration, operational containment)
# Server team (#550): implement delay_after_trigger_ticks: 90 for 3-5s gap.
# -----------------------------------------------------------------------
- id: pc-smuggler_m_s_con_004
text: "Maybe there's a reason. There's always a reason. But Kael knows better than to run a meeting in a maintenance corridor without telling me."
role: player_character
access: [public]
trust: surface
situation: [investigation, alone]
trigger: contradiction_detected
mood: [focused, anxious]
priority: 7
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
tags: [contradiction, friend-arc, kael, phase-2, cognitive-dissonance, secondary-beat]
notes: >
Secondary beat — fires 3-5 seconds after primary. Self-challenge first: the smuggler
gives Kael benefit of the doubt, then immediately walks it back with operational
logic. 'There's always a reason' is the street-smart equivalent of epistemic
containment — she's seen strange things before. The closing line is where the alarm
lives: this isn't strange, it's a protocol violation.
Lower priority (7) ensures primary lines fire first; server team should implement
delay_after_trigger_ticks for proper sequencing.
- id: pc-smuggler_m_s_con_005
text: "Don't assume. Could be he's running something for Nils I wasn't told about. Could be something else. The second thing is the problem."
role: player_character
access: [public]
trust: surface
situation: [investigation, alone]
trigger: contradiction_detected
mood: [focused]
priority: 6
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
tags: [contradiction, friend-arc, kael, phase-2, operational, cognitive-dissonance, secondary-beat]
notes: >
Alternate secondary beat. 'Don't assume' is the smuggler's self-instruction (operational
discipline). Two possibilities held open: ring-authorized (names Nils — the coordinator)
vs. outside the ring. 'The second thing is the problem' — the alarm, stated as dry
understatement. Operational logic applied to an emotional moment: the smuggler
keeps the processing clean even when the stakes are personal.
# -----------------------------------------------------------------------
# PHASE 3 — Behavioral pattern accumulated (increased lattice checking, early exits)
# Requires: Kael behavioral anomalies observed prior to the B-7 contradiction.
# -----------------------------------------------------------------------
- id: pc-smuggler_m_s_con_006
text: "He's been distracted for three days. Lattice checks every few minutes, leaving lunch early. Now a B-7 meeting with someone outside the ring. Kael's working an angle he hasn't told me about."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: contradiction_detected
mood: [focused, anxious]
priority: 10
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
tells_observed: 2
tags: [contradiction, friend-arc, kael, phase-3, pattern-recognition, operational]
notes: >
Phase 3 primary — connects all accumulated behavioral data to the contradiction. Fragment
catalog builds the picture: three days of signals, then this. Closing line names the
conclusion without naming its implication: 'working an angle' is street-smart language
for running something unauthorized, but the smuggler doesn't say 'exit attempt' —
she doesn't know that yet.
Note: tells_observed is a proposed prerequisite field — server team (#550) to implement
or simplify to a different check.
- id: pc-smuggler_m_s_con_007
text: "Kael doesn't run his own contacts. Devra handles external. So either Devra knows about this, or Kael's outside protocol. Neither's good."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: contradiction_detected
mood: [focused]
priority: 9
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
tells_observed: 2
tags: [contradiction, friend-arc, kael, phase-3, operational]
notes: >
Alternate Phase 3 — operational knowledge applied. The smuggler knows ring structure:
Devra manages external contacts, Kael handles cargo logistics. An unrecognized contact
means either Devra is running something Kael's involved in (plausible, alarming) or
Kael went outside protocol (worse). Both possibilities named, neither closed. 'Neither's
good' — the smuggler's understated close for a significant threat read.
- id: pc-smuggler_m_s_con_008
text: "He's been somewhere else in his head all week. Now I know why. Whoever that was — not ring. Kael's looking for a way out."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: contradiction_detected
mood: [anxious]
priority: 8
prerequisites:
entities:
- id: "npc:kael-davan"
state: Contradicted
tells_observed: 2
tags: [contradiction, friend-arc, kael, phase-3, intuition]
notes: >
Alternate Phase 3 — gut read, highest emotional weight. 'Somewhere else in his head'
describes the behavioral changes without cataloging them. 'Now I know why' — the click
of understanding arriving. 'Not ring' — short, certain, two words. 'Looking for a way
out' is street-smart language for exit attempt: the smuggler doesn't know the details
but the read is right. This line is the closest the smuggler comes to naming what's
happening — and she still doesn't say it explicitly.
@@ -1,92 +0,0 @@
character: smuggler
location: general
lines:
- id: pc-smuggler_m_s_001
text: "Another day on Sova. Same air, same hum, same faces."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, atmospheric]
- id: pc-smuggler_m_s_002
text: "The span gate hum's louder today. Maintenance hasn't touched it in weeks."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [environmental]
- id: pc-smuggler_m_s_003
text: "Twenty minutes between shifts. That's the window. Always has been."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: time_idle
tags: [operational, orientation]
- id: pc-smuggler_m_s_004
text: "People talk about leaving Sova. Nobody actually does."
role: player_character
access: [public]
trust: surface
situation: [alone]
trigger: time_idle
tags: [reflection]
- id: pc-smuggler_m_s_005
text: "Two years of this. Still not used to the gate vibration in my teeth."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [environmental, personal]
- id: pc-smuggler_m_s_006
text: "The money's good. The risk's manageable. Keep telling yourself that."
role: player_character
access: [public]
trust: surface
situation: [alone]
trigger: time_idle
tags: [reflection, operational]
- id: pc-smuggler_m_s_007
text: "Back again. Same corridors, same shortcuts, same reasons."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: return_visit
tags: [arrival]
- id: pc-smuggler_m_s_008
text: "Commission patrols are thinner this cycle. Good or bad — hard to say."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_anomaly
tags: [operational, caution]
- id: pc-smuggler_m_s_009
text: "If anyone asks, I'm clocking overtime. That's always the story."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: time_idle
tags: [operational, cover]
- id: pc-smuggler_m_s_010
text: "Recycled air tastes different near the outer ring. Sharper. More machine."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental, atmospheric]
@@ -1,270 +0,0 @@
character: smuggler
location: maintenance-corridors
lines:
# --- Arrival + Environmental Flavor ---
- id: pc-smuggler_m_s_001
text: "Service corridor. Dim lights, damp walls, and the constant drip of condensation."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, atmospheric]
- id: pc-smuggler_m_s_002
text: "Cooler down here. The ventilation doesn't reach this far."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental, atmospheric]
- id: pc-smuggler_m_s_003
text: "The access panel's still loose. Good — our route's intact."
role: player_character
access: [public]
trust: surface
situation: [arrival, routine]
trigger: enter_location
tags: [arrival, operational]
- id: pc-smuggler_m_s_004
text: "Pipes groaning overhead. Station's old. These corridors are older."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [environmental, atmospheric]
- id: pc-smuggler_m_s_005
text: "Water recycling rumbles through the walls down here. Constant."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [environmental]
- id: pc-smuggler_m_s_006
text: "Back in the maintenance tunnels. Rust and coolant."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: return_visit
tags: [arrival, atmospheric]
- id: pc-smuggler_m_s_007
text: "Emergency lighting only. Just enough to see where you're going."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental]
- id: pc-smuggler_m_s_008
text: "Footsteps echo different down here. You learn to listen."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [environmental, operational]
# --- NPC + Operational ---
- id: pc-smuggler_m_s_009
text: "Renn's chalk marks on the wall. Route's been used recently."
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_anomaly
tags: [operational, renn]
- id: pc-smuggler_m_s_010
text: "Someone left a crate at junction B-4. Not one of ours."
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_anomaly
tags: [operational, caution]
- id: pc-smuggler_m_s_011
text: "The temp storage hatch is warm. Cargo cycled through recently."
role: player_character
access: [public]
trust: surface
situation: [arrival, routine]
trigger: enter_location
tags: [operational]
- id: pc-smuggler_m_s_012
text: "Scratches on the lock plate. Someone's been forcing this access point."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_anomaly
tags: [environmental, caution]
- id: pc-smuggler_m_s_013
text: "Timer says twelve minutes until the oversight gap closes. Plenty."
role: player_character
access: [public]
trust: surface
situation: [alone, routine]
trigger: time_idle
tags: [operational]
- id: pc-smuggler_m_s_014
text: "That's Renn's jacket on the pipe junction. He was here."
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_anomaly
tags: [npc, renn, operational]
- id: pc-smuggler_m_s_015
text: "Voices echoing from the junction. Can't make out words yet."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [caution]
- id: pc-smuggler_m_s_016
text: "The route through B-section is clear. Voss kept his word."
role: player_character
access: [public]
trust: surface
situation: [arrival, routine]
trigger: enter_location
tags: [operational, voss]
# --- Knowledge-Gated Lines ---
- id: pc-smuggler_m_s_017
text: "Corridor B-7. This is where I saw Kael. With someone I don't know."
role: player_character
access: [public]
trust: surface
situation: [arrival, investigation]
trigger: enter_location
prerequisites:
facts:
- fact_id: investigation.kael_corridor_meeting
min_confidence: suspects
priority: 8
tags: [npc, kael, contradiction, friend-arc]
- id: pc-smuggler_m_s_018
text: "Fresh boot prints in the dust. Two sets. Different sizes."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: investigation.kael_corridor_meeting
min_confidence: suspects
tags: [evidence, kael, friend-arc]
- id: pc-smuggler_m_s_019
text: "New scratch marks on the service hatch. Someone's using our route."
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: awareness.ring_route_compromise
min_confidence: suspects
priority: 7
tags: [operational, caution]
- id: pc-smuggler_m_s_020
text: "The container in temp was supposed to move last shift. It didn't. Why?"
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: investigation.container_delay
min_confidence: knows_of
tags: [operational, contraband]
- id: pc-smuggler_m_s_021
text: "Camera's been repositioned at junction C-2. Who authorized that?"
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: awareness.surveillance_change
min_confidence: suspects
priority: 7
tags: [investigation, caution]
- id: pc-smuggler_m_s_022
text: "If Kael's meeting people down here without telling us, the whole route's exposed."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation, routine]
trigger: time_idle
prerequisites:
facts:
- fact_id: investigation.kael_unknown_contact
min_confidence: knows_of
priority: 8
tags: [npc, kael, operational, friend-arc]
- id: pc-smuggler_m_s_023
text: "Sealed containers don't end up in temp storage by accident. Someone rerouted."
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: knowledge.ring_routing_knowledge
min_confidence: knows_details
tags: [operational, contraband]
- id: pc-smuggler_m_s_024
text: "Kael's not answering his lattice. He was supposed to meet me here."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
trigger: time_idle
prerequisites:
relationship:
target: npc:kael-davan
state: person_of_interest
priority: 7
tags: [npc, kael, concern, friend-arc]
- id: pc-smuggler_m_s_025
text: "Someone wiped the dust off this hatch. Recently. Carefully."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_anomaly
tags: [environmental, caution]
@@ -1,152 +0,0 @@
character: smuggler
location: opening
lines:
# Opening Hook Sequence — Ticket #299 — Smuggler Diegetic Tutorial Arc / First 5 Minutes
# 11 lines. Prerequisites null on all — fires before any knowledge graph state exists.
# Priority 8-10 ensures these fire before the general terminal pool lines.
# cooldown: 9999 — each line fires once, does not repeat.
# Arc: station hum → spatial count → fog boundary → thin crowd → Kael sighting ×2 → news ticker → sound ping → time countdown → settle ×2.
# All lines fully schema-compliant per D-035 (role, access, trust, situation present).
- id: pc-smuggler_m_s_001
text: "Station hum. B-flat, steady — freight's moving."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start]
trigger: enter_location
mood: [content]
priority: 10
cooldown: 9999
tags: [opening-hook, tutorial-arc, atmospheric]
notes: "Opening sensation. Station audio registers first — the hum tells her freight is running. Teaches: audio environment carries operational information (D-074)."
- id: pc-smuggler_m_s_002
text: "Sixteen bays, three arms running. Standard morning."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start]
trigger: enter_location
mood: [content]
priority: 10
cooldown: 9999
tags: [opening-hook, tutorial-arc, orientation]
notes: "Spatial orientation. She clocks the floor in two beats — count of bays, count of running arms. Everything in fragments. Teaches: the terminal layout."
- id: pc-smuggler_m_s_003
text: "Haze past bay eight today. Can't see the far dock from here."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start, observation]
trigger: enter_location
mood: [content]
priority: 10
cooldown: 9999
tags: [opening-hook, tutorial-arc, fog, perception]
notes: "Fog boundary. She notices the edge of her vision as a fact of the floor, not a mechanic. Teaches: perception range has limits (D-015, D-046)."
- id: pc-smuggler_m_s_004
text: "Morning crew's spread thin. Good. Room to move."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start]
trigger: enter_location
mood: [content]
priority: 9
cooldown: 9999
tags: [opening-hook, tutorial-arc]
notes: "Light crowd = operational comfort. 'Good.' standalone verbal tic (section 1.7). Teaches: NPC density affects movement options."
- id: pc-smuggler_m_s_005
text: "Kael's at dock three. Right where he should be."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start, social]
trigger: observe_npc
mood: [content, warm]
priority: 10
cooldown: 9999
tags: [opening-hook, tutorial-arc, kael, friend-arc]
notes: "First Kael sighting. Warm, immediate — she locates him before she finishes reading the floor. Teaches: named NPCs are identifiable via insert overlay (D-033 green entity)."
- id: pc-smuggler_m_s_006
text: "Already has his clipboard. Day's organized before it starts. Two years, same routine."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start, social]
trigger: observe_npc
mood: [warm]
priority: 9
cooldown: 9999
tags: [opening-hook, tutorial-arc, kael, friend-arc]
notes: "Kael warmth through behavior-reading, not labeling. Three beats: observation → interpretation → familiarity. 'Two years, same routine' says she knows his patterns intimately. Establishes: Kael is trusted, competent, reliable — the baseline before the friend arc erodes it."
- id: pc-smuggler_m_s_007
text: "Bulletin board's got a new Commission notice. Lattice registration updates. Not today's problem."
role: player_character
access: [public]
trust: surface
situation: [arrival, routine]
trigger: enter_location
mood: [content]
priority: 8
cooldown: 9999
tags: [opening-hook, tutorial-arc, news-ticker]
notes: "News ticker glance. She reads and dismisses it. The Commission exists as background noise — relevant only when it stops being ignorable. Teaches: environmental text exists, player can engage or skip. D-037 irony: lattice registration is exactly what the ring circumvents."
- id: pc-smuggler_m_s_008
text: "Span gate echo from dock fourteen. Something inbound, running heavy by the sound of it."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start, observation]
trigger: hear_sound
mood: [content]
priority: 9
cooldown: 9999
tags: [opening-hook, tutorial-arc, sound, perception]
notes: "First sound ping at the edge of range. She interprets pitch instantly — the echo tells her load weight. Teaches: sound carries operational information (D-018, D-074 sound model). Sound channel is meaningful."
- id: pc-smuggler_m_s_009
text: "Shift board says light cargo today. Fifty minutes before Voss does his rounds."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start, routine]
trigger: enter_location
mood: [content]
priority: 8
cooldown: 9999
tags: [opening-hook, tutorial-arc, operational]
notes: "'Fifty minutes' = time-as-countdown verbal tic (section 1.7). She's already calculating windows. Teaches: time and NPC patrol rhythms are trackable."
- id: pc-smuggler_m_s_010
text: "Same floor, same faces, same hum. Could be worse."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start]
trigger: enter_location
mood: [content]
priority: 8
cooldown: 9999
tags: [opening-hook, tutorial-arc, atmospheric]
notes: "Settling line. Baseline contentment. Parallel three-beat structure then understatement. 'Could be worse' is her comfort language — not enthusiastic, just settled. Voice anchor for confidence register (section 1.8)."
- id: pc-smuggler_m_s_011
text: "Dock's clean this morning. Good start."
role: player_character
access: [public]
trust: surface
situation: [arrival, shift_start, routine]
trigger: enter_location
mood: [content]
priority: 7
cooldown: 9999
tags: [opening-hook, tutorial-arc]
notes: "Close of opening arc. Short, approving. 'Good start' = positive 'Good.' tic applied to the environment. Everything is where it should be — for now."
@@ -1,124 +0,0 @@
# 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: pc-smuggler_m_s_001
text: "Commission officer just stood there after talking to Voss. Making notes. Not good."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
relationship:
target: npc:pc-detective
state: known
tags: [npc, pc-detective, tell, note-taking, caution]
- id: pc-smuggler_m_s_002
text: "That investigator is working the hub section by section. Not browsing. Searching."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_anomaly
prerequisites:
relationship:
target: npc:pc-detective
state: known
tags: [npc, pc-detective, tell, systematic-movement, caution]
- id: pc-smuggler_m_s_003
text: "Commission's parked at the manifest terminal again. Third time today."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_anomaly
prerequisites:
relationship:
target: npc:pc-detective
state: known
tags: [npc, pc-detective, tell, manifest-fixation, caution]
- id: pc-smuggler_m_s_004
text: "They're watching. From the corner, where they can see the whole dock floor. Professional."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
relationship:
target: npc:pc-detective
state: known
tags: [npc, pc-detective, tell, observation-positioning, caution]
- id: pc-smuggler_m_s_005
text: "The investigator and Sera again. Old friends? Or is Sera reporting to them?"
role: player_character
access: [public]
trust: surface
situation: [observation]
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: pc-smuggler_m_s_006
text: "New Commission face at the hub. Keep your head down. Don't give them anything."
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_npc
prerequisites:
relationship:
target: npc:pc-detective
state: known
priority: 8
tags: [npc, pc-detective, operational, caution, first-sighting]
- id: pc-smuggler_m_s_007
text: "That investigator's been here all morning. Nobody stays that long for a routine check."
role: player_character
access: [public]
trust: surface
situation: [alone, routine]
trigger: time_idle
prerequisites:
relationship:
target: npc:pc-detective
state: known
priority: 6
tags: [npc, pc-detective, suspicion, operational]
- id: pc-smuggler_m_s_008
text: "Commission's at the bar. Sitting with Sera. Watching the room like they own it."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
relationship:
target: npc:pc-detective
state: known
tags: [npc, pc-detective, sera, bar, caution]
@@ -1,303 +0,0 @@
# Monologue: Smuggler — Smuggling Hold
# Ticket: #120 | Author: Mellanie | Sprint: 14
# Decision refs: D-016, D-032, D-035, D-037
#
# The smuggling hold is below the maintenance corridors — an unmarked
# sub-level cargo space that the ring uses for temp storage and transfers.
# Not on any official manifest. The smuggler knows every pipe and access
# point here. This is both her operational center and her greatest exposure.
#
# Voice note: the smuggler here is at maximum operational competence and
# maximum paranoia simultaneously. She's in control of the space but the
# space itself is evidence of everything she's done. Lines should carry
# that dual register — calm on the surface, tight underneath.
#
# Schema: D-035 compliant. role/access/trust/situation included on all lines.
# Existing Sprint 5 files (the-terminal, the-last-shift, maintenance-corridors)
# will be updated by #168 (schema compliance pass).
character: smuggler
location: smuggling-hold
lines:
# --- Arrival ---
- id: pc-smuggler_m_s_001
text: "Sub-level. The kind of space nobody finds unless you know where to look."
role: player_character
access: [public]
trust: surface
trigger: enter_location
situation: [arrival, routine]
tags: [arrival, atmospheric, operational]
- id: pc-smuggler_m_s_002
text: "Coolant smell. No ventilation down here — just recycled air and waiting."
role: player_character
access: [public]
trust: surface
trigger: enter_location
situation: [arrival, routine]
tags: [arrival, atmospheric, sensory]
- id: pc-smuggler_m_s_003
text: "Access hatch sealed from the inside. Good. Route's still ours."
role: player_character
access: [public]
trust: surface
trigger: enter_location
situation: [arrival, routine]
tags: [arrival, operational]
- id: pc-smuggler_m_s_004
text: "Three containers in temp. Right where they should be."
role: player_character
access: [public]
trust: surface
trigger: enter_location
situation: [arrival, routine]
prerequisites:
facts:
- fact_id: knowledge.ring_routing_knowledge
min_confidence: knows_of
tags: [arrival, operational, contraband]
- id: pc-smuggler_m_s_005
text: "Back in the hold. Dust on the floor shows the last two paths in. Both mine."
role: player_character
access: [public]
trust: surface
trigger: return_visit
situation: [arrival, routine]
tags: [arrival, operational]
- id: pc-smuggler_m_s_006
text: "Nobody's been here. Good. That's how it should feel."
role: player_character
access: [public]
trust: surface
trigger: enter_location
situation: [arrival, routine]
tags: [arrival, atmospheric]
# --- Perception / Sound ---
- id: pc-smuggler_m_s_007
text: "The water recycler's on the other side of that wall. Loud enough to cover conversation."
role: player_character
access: [public]
trust: surface
trigger: hear_sound
situation: [routine]
tags: [sensory, environmental, operational]
- id: pc-smuggler_m_s_008
text: "Footsteps above. Maintenance crew — they stay up top. Always."
role: player_character
access: [public]
trust: surface
trigger: hear_sound
situation: [routine]
tags: [sensory, environmental, caution]
- id: pc-smuggler_m_s_009
text: "That sound. Pressure shift. Someone opened the main hatch."
role: player_character
access: [public]
trust: surface
trigger: hear_sound
situation: [routine, investigation]
priority: 7
tags: [sensory, caution]
- id: pc-smuggler_m_s_010
text: "Pipe drone changes pitch when cargo shifts weight in the upper tier. That's cargo moving."
role: player_character
access: [public]
trust: surface
trigger: hear_sound
situation: [routine]
tags: [sensory, operational]
# --- Time Idle / Ruminative ---
- id: pc-smuggler_m_s_011
text: "Fifteen minutes until the oversight window closes. Plenty of time. Probably."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [shift_transition]
tags: [operational, atmospheric]
- id: pc-smuggler_m_s_012
text: "Medical-grade lattice components. People need these. That's still the reason."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [routine]
tags: [atmospheric, contraband]
- id: pc-smuggler_m_s_013
text: "Twelve minutes of reduced oversight. Stop counting and do something useful."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [shift_transition]
tags: [operational]
- id: pc-smuggler_m_s_014
text: "How many times have I been in this room telling myself it's almost done?"
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [routine]
tags: [atmospheric, personal]
- id: pc-smuggler_m_s_015
text: "Quiet. The right kind. Not the wrong kind."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [routine]
tags: [atmospheric]
# --- Anomaly / Investigation ---
- id: pc-smuggler_m_s_016
text: "Container 4471's been opened. Not by me. Not by anyone I authorized."
role: player_character
access: [public]
trust: surface
trigger: observe_anomaly
situation: [routine, investigation]
priority: 8
tags: [operational, caution, contraband]
- id: pc-smuggler_m_s_017
text: "Dust disturbed at the secondary hatch. Recent. Someone's been using the back route."
role: player_character
access: [public]
trust: surface
trigger: observe_anomaly
situation: [routine]
tags: [caution, operational]
- id: pc-smuggler_m_s_018
text: "Scratches on the access panel. New ones, over the old ones. Different tool."
role: player_character
access: [public]
trust: surface
trigger: observe_anomaly
situation: [routine]
tags: [caution, environmental]
- id: pc-smuggler_m_s_019
text: "The temp unit's running warm. Someone moved cargo through here fast."
role: player_character
access: [public]
trust: surface
trigger: observe_anomaly
situation: [routine]
tags: [operational, caution, contraband]
# --- Knowledge-Gated: Kael Arc ---
- id: pc-smuggler_m_s_020
text: "Kael used to wait for me here. The one place where we could actually talk."
role: player_character
access: [public]
trust: surface
trigger: enter_location
situation: [arrival, routine]
prerequisites:
relationship:
target: npc:kael-davan
state: friendly
priority: 6
tags: [npc, kael, atmospheric, friend-arc]
- id: pc-smuggler_m_s_021
text: "Kael's not answering. Should be here by now. Should have been here ten minutes ago."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [routine]
prerequisites:
relationship:
target: npc:kael-davan
state: person_of_interest
priority: 7
tags: [npc, kael, concern, friend-arc]
- id: pc-smuggler_m_s_022
text: "If Kael talked to someone in that corridor — someone outside the ring — and then this container got touched... that's not coincidence."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [routine, investigation]
prerequisites:
facts:
- fact_id: investigation.kael_unknown_contact
min_confidence: knows_of
- fact_id: investigation.container_delay
min_confidence: suspects
priority: 9
tags: [npc, kael, investigation, contraband, friend-arc]
- id: pc-smuggler_m_s_023
text: "The manifest Kael helped me falsify is in that container. If he talked, they already know."
role: player_character
access: [public]
trust: surface
trigger: observe_anomaly
situation: [investigation]
prerequisites:
facts:
- fact_id: investigation.kael_unknown_contact
min_confidence: suspects
- fact_id: knowledge.ring_routing_knowledge
min_confidence: knows_details
priority: 9
tags: [npc, kael, operational, contraband, friend-arc, contaminated-trust]
- id: pc-smuggler_m_s_024
text: "Renn's mark is here. The route's still active. So Kael hasn't burned everything. Yet."
role: player_character
access: [public]
trust: surface
trigger: enter_location
situation: [arrival, routine]
prerequisites:
facts:
- fact_id: investigation.kael_unknown_contact
min_confidence: suspects
priority: 7
tags: [operational, kael, renn, friend-arc]
# --- Post-Conversation ---
- id: pc-smuggler_m_s_025
text: "Renn didn't ask questions. That's either loyalty or he already knows."
role: player_character
access: [public]
trust: surface
trigger: post_conversation
situation: [routine]
tags: [npc, renn, operational]
- id: pc-smuggler_m_s_026
text: "One more run. That's what I keep telling myself. Has been for eight months."
role: player_character
access: [public]
trust: surface
trigger: time_idle
situation: [routine]
tags: [atmospheric, personal, contraband]
@@ -1,427 +0,0 @@
character: smuggler
location: the-last-shift
lines:
# --- Arrival + Environmental Flavor ---
- id: pc-smuggler_m_s_001
text: "Lera's. Grain spirit and noise. Could use both right now."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, atmospheric]
- id: pc-smuggler_m_s_002
text: "Bar's half full. The after-shift crowd's starting to filter in."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival]
- id: pc-smuggler_m_s_003
text: "Lera's got the Meridian feed running. Same headlines, different day."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, environmental]
- id: pc-smuggler_m_s_004
text: "Smells like fried protein and cheap grain spirit. Perfect."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental, atmospheric]
- id: pc-smuggler_m_s_005
text: "My booth's free. Small victories."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, personal]
- id: pc-smuggler_m_s_006
text: "The overhead light's still buzzing. Lera says it adds character."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [environmental]
- id: pc-smuggler_m_s_007
text: "Music's louder tonight. Lera's in a good mood, or drowning something out."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [environmental, atmospheric]
- id: pc-smuggler_m_s_008
text: "Back at Lera's. Same booth, same drink, same crowd."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: return_visit
tags: [arrival]
- id: pc-smuggler_m_s_009
text: "The ventilation rattles when the kitchen's on. You learn to talk over it."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [environmental]
- id: pc-smuggler_m_s_010
text: "Quiet night at Lera's. Fewer people means fewer ears."
role: player_character
access: [public]
trust: surface
situation: [arrival, routine]
trigger: enter_location
tags: [arrival, operational]
# --- NPC Commentary ---
- id: pc-smuggler_m_s_011
text: "Lera's behind the bar. Good — she keeps things steady."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, lera]
- id: pc-smuggler_m_s_012
text: "Kael's at the corner table. Looks relaxed. That's something."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, kael]
- id: pc-smuggler_m_s_013
text: "Torek's buying rounds again. That man doesn't know the word 'discreet.'"
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, torek, caution]
- id: pc-smuggler_m_s_014
text: "Sera's here. Commission field tech. She keeps to herself — mostly."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, sera, commission]
- id: pc-smuggler_m_s_015
text: "Naia's laughing at something Lera said. Nice to see her relaxed."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, naia]
- id: pc-smuggler_m_s_016
text: "Old Pael's in his usual spot. Hasn't moved in three hours. Impressive."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, atmospheric]
- id: pc-smuggler_m_s_017
text: "Lera just cut someone off. Smooth about it, but firm."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: witness_interaction
tags: [npc, lera]
- id: pc-smuggler_m_s_018
text: "Kael and Naia at the bar. Leaning into each other. They look good together."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: witness_interaction
tags: [npc, kael, naia]
- id: pc-smuggler_m_s_019
text: "Voss is drinking alone. Not his usual pace."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, voss]
- id: pc-smuggler_m_s_020
text: "That new face in the corner — been nursing the same drink for an hour."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, caution]
# --- Knowledge-Gated Lines ---
- id: pc-smuggler_m_s_021
text: "Sera left when Torek walked in. Coincidence? Maybe."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: behavioral.sera_avoidance_pattern
min_confidence: suspects
tags: [npc, sera, torek, pattern]
- id: pc-smuggler_m_s_022
text: "Torek just paid cash credit, not station account. Sloppy."
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_npc
prerequisites:
facts:
- fact_id: investigation.torek_spending_pattern
min_confidence: knows_of
tags: [npc, torek, operational]
- id: pc-smuggler_m_s_023
text: "Lera gave me that look. The one that says 'not here, not now.'"
role: player_character
access: [public]
trust: surface
situation: [routine, social]
trigger: post_conversation
prerequisites:
facts:
- fact_id: knowledge.ring_bar_operations
min_confidence: knows_details
tags: [npc, lera, operational]
- id: pc-smuggler_m_s_024
text: "Naia looks tired. Has Kael been coming home late again?"
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
relationship:
target: npc:naia-tamm
state: known
tags: [npc, naia, kael, concern]
- id: pc-smuggler_m_s_025
text: "The detective is here. At the bar. My bar."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_npc
prerequisites:
facts:
- fact_id: awareness.detective_presence
min_confidence: knows_of
priority: 8
tags: [investigation, caution]
- id: pc-smuggler_m_s_026
text: "Sera and the detective sharing a booth. Commission people stick together."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: witness_interaction
prerequisites:
facts:
- fact_id: awareness.detective_presence
min_confidence: knows_of
tags: [npc, sera, investigation]
- id: pc-smuggler_m_s_027
text: "Kael didn't save my seat tonight. First time in months."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
prerequisites:
relationship:
target: npc:kael-davan
state: person_of_interest
priority: 8
tags: [npc, kael, contaminated-trust, friend-arc]
- id: pc-smuggler_m_s_028
text: "The back room light's on. Nils is here, then."
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: knowledge.ring_bar_operations
min_confidence: knows_details
tags: [operational, nils]
- id: pc-smuggler_m_s_029
text: "Kael bought Naia a drink but barely looked at her. That's new."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: witness_interaction
prerequisites:
facts:
- fact_id: behavioral.kael_behavioral_change
min_confidence: suspects
tags: [npc, kael, naia, tell, friend-arc]
- id: pc-smuggler_m_s_030
text: "Everyone's a little too quiet tonight. Something happened. I can feel it."
role: player_character
access: [public]
trust: surface
situation: [arrival, routine]
trigger: enter_location
prerequisites:
facts:
- 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: pc-smuggler_m_s_031
text: "Sera's at the Commission kiosk. Third time this shift. Nobody recalibrates that much."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
facts:
- fact_id: behavioral.sera_kiosk_pattern
min_confidence: suspects
priority: 6
tags: [npc, sera, commission, pattern, dual-lens]
- id: pc-smuggler_m_s_032
text: "Naia trusts Sera. More than most people here. That says something."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: witness_interaction
tags: [npc, sera, naia, social, dual-lens]
- id: pc-smuggler_m_s_033
text: "Sera was studying the freight display. For a calibration tech, that's a lot of manifest reading."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
facts:
- fact_id: behavioral.sera_topic_deflection
min_confidence: suspects
priority: 6
tags: [npc, sera, tell, cargo, dual-lens]
- id: pc-smuggler_m_s_034
text: "That's three times Sera's bailed when Torek showed up. Maybe she owes him money."
role: player_character
access: [public]
trust: surface
situation: [observation]
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: pc-smuggler_m_s_035
text: "Sera offered the detective compliance records. Helpful -- or professional courtesy?"
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: witness_interaction
prerequisites:
facts:
- fact_id: awareness.detective_presence
min_confidence: knows_of
tags: [npc, sera, investigation, caution, dual-lens]
- id: pc-smuggler_m_s_036
text: "Something about Sera tonight. Same smile, different eyes."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
relationship:
target: npc:sera-venn
state: known
tags: [npc, sera, behavioral, dual-lens]
- id: pc-smuggler_m_s_037
text: "Commission tech who drinks at a dock bar. Either lonely or embedded. Either way -- careful."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, sera, commission, assessment, dual-lens]
- id: pc-smuggler_m_s_038
text: "Sera knows the shift rotations better than Voss. That's not calibration. That's attention."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
facts:
- fact_id: behavioral.sera_knowledge_detail
min_confidence: suspects
priority: 6
tags: [npc, sera, tell, competence, dual-lens]
@@ -1,449 +0,0 @@
character: smuggler
location: the-terminal
lines:
# --- Arrival + Environmental Flavor ---
- id: pc-smuggler_m_s_001
text: "Morning shift. Recycled air and cargo lubricant. Home sweet home."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, atmospheric]
- id: pc-smuggler_m_s_002
text: "The loading arms are cycling. Freight's on schedule — for once."
role: player_character
access: [public]
trust: surface
situation: [arrival, routine]
trigger: enter_location
tags: [arrival, operational]
- id: pc-smuggler_m_s_003
text: "Shift board's already full. Voss has everyone running double today."
role: player_character
access: [public]
trust: surface
situation: [arrival, routine]
trigger: enter_location
tags: [arrival, operational]
- id: pc-smuggler_m_s_004
text: "Cargo lubricant and ozone. You'd think I'd stop noticing."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental, atmospheric]
- id: pc-smuggler_m_s_005
text: "Loading arm three is grinding again. Someone should file that."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [environmental]
- id: pc-smuggler_m_s_006
text: "Containers stacked six high in bay four. That's new."
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_anomaly
tags: [environmental, operational]
- id: pc-smuggler_m_s_007
text: "The freight manifest board's flickering. Always flickering."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental]
- id: pc-smuggler_m_s_008
text: "Dock lights are on half-cycle. Budget cuts again."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [environmental, atmospheric]
- id: pc-smuggler_m_s_009
text: "Back at the hub. Shift transition in fifty minutes."
role: player_character
access: [public]
trust: surface
situation: [arrival, routine]
trigger: return_visit
tags: [arrival, operational]
- id: pc-smuggler_m_s_010
text: "Quiet morning. Containers moving, nobody talking. I like it this way."
role: player_character
access: [public]
trust: surface
situation: [arrival]
trigger: enter_location
tags: [arrival, atmospheric]
- id: pc-smuggler_m_s_011
text: "Bay three's been sealed off. Inspection, or something else?"
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_anomaly
tags: [environmental, caution]
- id: pc-smuggler_m_s_012
text: "The conveyor hums at a different pitch when it's loaded heavy. This one's heavy."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: hear_sound
tags: [environmental, operational]
# --- NPC Commentary ---
- id: pc-smuggler_m_s_013
text: "Kael's already at the dock. Good. The day's better when he's on shift."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, kael, warm]
- id: pc-smuggler_m_s_014
text: "Voss is pacing. Never a good sign."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, voss, caution]
- id: pc-smuggler_m_s_015
text: "Maret's got her scheduling face on. Tight lips, fast hands on the terminal."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, maret]
- id: pc-smuggler_m_s_016
text: "New face at dock seven. Temp worker, or someone I should know about?"
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, caution]
- id: pc-smuggler_m_s_017
text: "Drin's at inspection again. Going through the motions, same as always."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, drin]
- id: pc-smuggler_m_s_018
text: "Renn's running late. Third time this week."
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_npc
tags: [npc, renn, operational]
- id: pc-smuggler_m_s_019
text: "Voss and Maret talking by the schedule board. Both look tense."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: witness_interaction
tags: [npc, voss, maret]
- id: pc-smuggler_m_s_020
text: "Kael nodded at me across the bay. Business as usual."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
tags: [npc, kael]
- id: pc-smuggler_m_s_021
text: "Someone I don't recognize talking to Drin. Drin's smiling. Drin never smiles."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: witness_interaction
tags: [npc, drin, anomaly]
- id: pc-smuggler_m_s_022
text: "Torek's on the dock. Shouldn't be — his shift ended two hours ago."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_anomaly
tags: [npc, torek, caution]
- id: pc-smuggler_m_s_023
text: "Nils isn't here yet. That's unusual."
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_anomaly
tags: [npc, nils, operational]
- id: pc-smuggler_m_s_024
text: "Kael's eating alone today. He always eats with me."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_anomaly
tags: [npc, kael, concern]
# --- Knowledge-Gated Lines ---
- id: pc-smuggler_m_s_025
text: "Kael keeps checking his lattice. Waiting for a message? Not like him to be jumpy."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_anomaly
prerequisites:
relationship:
target: npc:kael-davan
state: friendly
priority: 7
tags: [npc, kael, tell, friend-arc]
- id: pc-smuggler_m_s_026
text: "Container 4471's been in temp since yesterday. That's not the normal routing."
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: knowledge.ring_routing_knowledge
min_confidence: knows_details
tags: [operational, contraband]
- id: pc-smuggler_m_s_027
text: "Voss changed the rotation again. Third time this month. Covering something."
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_anomaly
prerequisites:
facts:
- fact_id: investigation.voss_ring_involvement
min_confidence: knows_of
tags: [npc, voss, operational]
- id: pc-smuggler_m_s_028
text: "That detective's back. Asking questions near bay four. Stay calm."
role: player_character
access: [public]
trust: surface
situation: [investigation, observation]
trigger: observe_npc
prerequisites:
facts:
- fact_id: awareness.detective_presence
min_confidence: knows_of
priority: 8
tags: [investigation, caution]
- id: pc-smuggler_m_s_029
text: "Maret hasn't looked at me all shift. She noticed something. I know she did."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: observe_npc
prerequisites:
entity_attributes:
- entity: npc:maret-korr
key: behavior_flags
value: avoidance
priority: 6
tags: [npc, maret, paranoia]
- id: pc-smuggler_m_s_030
text: "Shift transition in ten. If the route's clean, we move tonight."
role: player_character
access: [public]
trust: surface
situation: [alone, routine]
trigger: time_idle
prerequisites:
facts:
- fact_id: knowledge.ring_routing_knowledge
min_confidence: knows_details
tags: [operational, contraband]
- id: pc-smuggler_m_s_031
text: "Kael was in corridor B-7 last night. Off-shift. Off-route. That's not nothing."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
trigger: time_idle
prerequisites:
facts:
- fact_id: investigation.kael_corridor_meeting
min_confidence: suspects
priority: 8
tags: [npc, kael, contradiction, friend-arc]
- id: pc-smuggler_m_s_032
text: "Who was Kael talking to? Not anyone from our rotation. I'd know the face."
role: player_character
access: [public]
trust: surface
situation: [alone, investigation]
trigger: time_idle
prerequisites:
facts:
- fact_id: investigation.kael_unknown_contact
min_confidence: suspects
priority: 9
tags: [npc, kael, contradiction, friend-arc]
- id: pc-smuggler_m_s_033
text: "He looked left before answering. He always looks left when he's lying."
role: player_character
access: [public]
trust: surface
situation: [investigation, social]
trigger: post_conversation
prerequisites:
facts:
- fact_id: behavioral.kael_evasion
min_confidence: direct
priority: 9
tags: [npc, kael, tell, friend-arc]
- id: pc-smuggler_m_s_034
text: "Torek's spending too much at Lera's. Someone's going to notice."
role: player_character
access: [public]
trust: surface
situation: [observation, routine]
trigger: observe_npc
prerequisites:
facts:
- fact_id: investigation.torek_spending_pattern
min_confidence: knows_of
tags: [npc, torek, operational, caution]
- id: pc-smuggler_m_s_035
text: "Same old Kael. Same jokes, same routine. ...What are you not telling me?"
role: player_character
access: [public]
trust: surface
situation: [investigation, social]
trigger: post_conversation
prerequisites:
relationship:
target: npc:kael-davan
state: person_of_interest
priority: 9
tags: [npc, kael, contaminated-trust, friend-arc]
# --- Triangle Activation: Kael Davan (T1: Kael-Smuggler-Ring, D-087) ---
# Fires post-TriangleActivated when player has LOS to Kael. One beat per line.
# Beat 1: physical observation. Beat 2: rationalization. Beat 3: doubt. Beat 4: sensory confirmation. Beat 5: emotional break.
- id: pc-smuggler_m_s_036
text: "Kael's in the main corridor. He doesn't usually come through here."
role: player_character
access: [public]
trust: surface
situation: [triangle_activated]
trigger: observe_npc
mood: [suspicious]
priority: 8
cooldown: 9999
tags: [triangle-signal, tell-observation, npc, kael, friend-arc]
prerequisites:
npc_in_los: true
- id: pc-smuggler_m_s_037
text: "Voss probably moved him. Schedule shifts happen."
role: player_character
access: [public]
trust: surface
situation: [triangle_activated]
trigger: observe_npc
mood: [suspicious]
priority: 8
cooldown: 9999
tags: [triangle-signal, tell-observation, npc, kael, friend-arc]
prerequisites:
npc_in_los: true
- id: pc-smuggler_m_s_038
text: "...Kael would've told me."
role: player_character
access: [public]
trust: surface
situation: [triangle_activated]
trigger: observe_npc
mood: [anxious]
priority: 8
cooldown: 9999
tags: [triangle-signal, tell-observation, npc, kael, friend-arc]
prerequisites:
npc_in_los: true
- id: pc-smuggler_m_s_039
text: "He's not looking at the cargo. He's watching the exits."
role: player_character
access: [public]
trust: surface
situation: [triangle_activated]
trigger: observe_npc
mood: [anxious]
priority: 8
cooldown: 9999
tags: [triangle-signal, tell-observation, npc, kael, tell, friend-arc]
prerequisites:
npc_in_los: true
- id: pc-smuggler_m_s_040
text: "I don't know what I'm seeing. But I know Kael. And this isn't Kael."
role: player_character
access: [public]
trust: surface
situation: [triangle_activated]
trigger: observe_npc
mood: [anxious]
priority: 8
cooldown: 9999
tags: [triangle-signal, tell-observation, npc, kael, contradiction, friend-arc]
prerequisites:
npc_in_los: true
@@ -1,229 +0,0 @@
character: smuggler
location: tutorial
lines:
# Diegetic Tutorial Monologue — Ticket #330 — Smuggler
# Authored per sprint-17 copy briefing and D-016 (internal monologue as core system).
#
# These lines teach mechanics through character voice — not UI instructions.
# Distinct from opening.yaml (which covers the first 5 minutes and sets voice/motivation).
# These fire on first-time events throughout gameplay, wherever they occur.
#
# Coverage:
# Movement / exploration — first_move, first_new_section
# Fog of perception — first_fog_encounter, first_fog_edge
# Sound model — first_sound_heard, first_off_screen_sound
# NPC interaction — first_npc_proximity, first_npc_face_read
# Insert / HUD — first_insert_open, first_insert_contact_flag
#
# Voice: observational, street-smart, practical. Fragments. Standalone "Good." as tic.
# No analytical distance — the smuggler reads, reacts, files, moves on.
# ID discriminator: _tut_ per sprint briefing.
# cooldown: omitted — fire-once enforced by trigger semantics (first_* triggers
# fire once per game), not by a cooldown value.
# priority: 8 (primary, one per trigger type), 6 (secondary variant, mood-weighted alternate).
#
# Schema corrections (Gestalt review, Sprint 17):
# priority: string "tutorial" → integer. All other monologue files use integer priority;
# string value would fail engine parse in monologue.rs.
# situation: removed invalid values (movement, exploration) not in D-035 13-situation
# enum. Replaced with arrival, routine, observation per actual trigger context.
# mood: [focused] retained where set; valid per D-035 Sprint 14 amendment.
#
# Trigger types (first_move, first_new_section, first_fog_encounter, first_fog_edge,
# first_sound_heard, first_off_screen_sound, first_npc_proximity, first_npc_face_read,
# first_insert_open, first_insert_contact_flag) are extended trigger enum values not in
# D-035 v0.1 set — require server-side implementation in monologue.rs.
# -----------------------------------------------------------------------
# MOVEMENT / EXPLORATION
# -----------------------------------------------------------------------
- id: pc-smuggler_m_s_tut_001
text: "These corridors all look the same. Mental note: check the signage."
role: player_character
access: [public]
trust: surface
situation: [arrival, routine]
trigger: first_move
mood: [focused]
priority: 8
tags: [tutorial, movement, navigation]
notes: >
Directly from the sprint briefing example. First move teaches navigation: the district
looks homogeneous, signage is the tool. 'Mental note' is the smuggler's internal
flag for things to remember — operational housekeeping, not analysis. Establishes
early: this environment requires active spatial tracking.
- id: pc-smuggler_m_s_tut_002
text: "Two lefts past the junction, right at the supply hatch. That's dock four. Route's in the muscle now."
role: player_character
access: [public]
trust: surface
situation: [arrival, routine]
trigger: first_new_section
mood: [content]
priority: 6
tags: [tutorial, movement, navigation, operational]
notes: >
Fires on entering a new section for the first time. 'Route's in the muscle' — the
smuggler doesn't memorize spatially, she moves until it's automatic. Practical,
self-sufficient. Teaches: the district has multiple sections, each requires its own
orientation. 'Dock four' is a landmark. Forward movement is rewarded with familiarity.
# -----------------------------------------------------------------------
# FOG OF PERCEPTION
# -----------------------------------------------------------------------
- id: pc-smuggler_m_s_tut_003
text: "Can't see past that corner. Might be worth checking."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: first_fog_encounter
mood: [focused]
priority: 8
tags: [tutorial, fog, perception]
notes: >
Directly from the sprint briefing example. First fog boundary. Restated as habit:
the smuggler doesn't treat the fog as a limitation, she treats every unknown corner
as a question worth answering. 'Might be worth' — not paranoia, just operational
instinct. Teaches: the perception boundary is navigable, not fixed.
- id: pc-smuggler_m_s_tut_004
text: "Haze cuts off past the junction. Anything in it — can't say."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: first_fog_edge
mood: [focused]
priority: 6
tags: [tutorial, fog, perception]
notes: >
Second fog encounter line — fires when the player reaches the boundary of a fog zone
(the edge of visible range). 'Can't say' — plain statement of unknowing, not anxiety.
The smuggler accepts incomplete information as a working condition, not a failure state.
Teaches: perception range is an ongoing factor, not a one-time obstacle.
# -----------------------------------------------------------------------
# SOUND MODEL
# -----------------------------------------------------------------------
- id: pc-smuggler_m_s_tut_005
text: "Voices down the hall. Can't make out the words from here."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: first_sound_heard
mood: [focused]
priority: 8
tags: [tutorial, sound, perception]
notes: >
Directly from the sprint briefing example. First sound heard that's not immediately
visible. Teaching: sound carries information, but range and occlusion limit it.
'Can't make out the words' establishes both the value of the sound channel (voices =
people = relevant) and its limitation (unclear at range). Moving toward source is
the implied next step.
- id: pc-smuggler_m_s_tut_006
text: "Footsteps. Two sets. Moving away — good."
role: player_character
access: [public]
trust: surface
situation: [observation]
trigger: first_off_screen_sound
mood: [content]
priority: 6
tags: [tutorial, sound, perception, operational]
notes: >
Second sound line — fires when audio from an off-screen source is detected. The
smuggler parses footsteps as count and direction instinctively. 'Moving away — good.'
— the standalone 'Good.' tic applied to tactical assessment. Teaches: sound carries
directional and movement data, not just presence. Two sets = two people, which is
specific enough to be operationally useful.
# -----------------------------------------------------------------------
# NPC INTERACTION
# -----------------------------------------------------------------------
- id: pc-smuggler_m_s_tut_007
text: "Could ask around. People talk if you give them reason to."
role: player_character
access: [public]
trust: surface
situation: [social, observation]
trigger: first_npc_proximity
mood: [content]
priority: 8
tags: [tutorial, npc, interaction, social]
notes: >
Directly from the sprint briefing example. First time in range of an NPC. The smuggler
doesn't approach directly — she flags the option. 'Give them reason to' is street-smart
social knowledge: people don't volunteer freely, they need a hook. Teaches: NPC
interaction is player-initiated, and approach matters. No mechanics text — just the
character's own method stated as personal principle.
- id: pc-smuggler_m_s_tut_008
text: "Know the face. Don't need the name."
role: player_character
access: [public]
trust: surface
situation: [social, observation]
trigger: first_npc_face_read
mood: [content]
priority: 6
tags: [tutorial, npc, observation, social]
notes: >
Fires when the player observes an NPC at close range (face visible). The smuggler
reads people by face, not by name — the name comes later if relevant. Teaches: NPCs
are identifiable by observation, and the insert overlay will fill in names when
available. The smuggler's social intelligence is pre-lattice, instinctive.
# -----------------------------------------------------------------------
# INSERT / HUD
# -----------------------------------------------------------------------
- id: pc-smuggler_m_s_tut_009
text: "Check the overlay. Should show the time and nearby contacts."
role: player_character
access: [public]
trust: surface
situation: [routine]
trigger: first_insert_open
mood: [content]
priority: 8
tags: [tutorial, insert, hud, operational]
notes: >
Directly from the sprint briefing example. First insert/HUD open. The smuggler's
overlay shows time and nearby contacts — both operationally critical. 'Should show'
— practical, not certain. Teaches: the insert is the primary tool for time-tracking
and NPC awareness. Diegetic: she checks it the same way she checks a shift board.
- id: pc-smuggler_m_s_tut_010
text: "Overlay marks Kael two sections over. Good."
role: player_character
access: [public]
trust: surface
situation: [routine, social]
trigger: first_insert_contact_flag
mood: [content, warm]
priority: 6
tags: [tutorial, insert, hud, kael, friend-arc]
notes: >
Fires when the insert first flags a known contact (here: Kael, the FRIEND NPC).
'Two sections over' — spatial data from the overlay. 'Good.' standalone tic —
warm, settling. Teaches: the insert shows known NPC positions in real-time.
Also seeds the Kael relationship: the smuggler checks his location as a habit,
not a task. His position is always relevant to her.
@@ -1,156 +0,0 @@
# NPC Profile: Devra Talsen
# Source: wiki/characters/devra.md
# Tier 2 | THRESHOLD + HANDLER | Ring coordinator, supply broker
canonical_id: "npc:devra"
display_name: "Devra Talsen"
tier: 2
pattern: "THRESHOLD"
motivation: "HANDLER"
description: >
Ring coordinator and freelance supply broker. Devra manages the ring's external
supply chain — coordinating with Sabel for incoming shipments, scheduling handoffs,
managing the timeline between gate transits and dock processing. The brokering
business is both legitimate income and operational cover, intentionally blurring
the line between legal and illegal work. Publicly a working professional with a
regular seat at The Last Shift.
want:
primary: "Wealth"
intensity: 7
description: >
Keep the operation running smoothly and profitably.
Devra is the ring's operational brain. She manages external supply chain
coordination, schedules handoffs, and maintains timing between gate transits
and dock processing. She is good at this — better than Nils, though she would
never say it. Secondary want: maintain her legitimate cover. The supply
brokering business provides real income, real social capital, and a legitimate
reason to know shipping schedules, gate transit windows, and cargo volumes.
secret: >
Devra manages the relationship with Sabel, the off-station supplier. If the
chain is traced upstream, it runs through Devra. She is more exposed than anyone
except Nils. The supply brokering business is partly a cover for ring logistics —
visible to anyone who tracks how much time Devra spends on freight details that
do not match her client list. She is the single point of failure between the
local ring and the supply source.
relationships:
- target: "npc:nils-davan"
kind: "colleague"
trust: 5
notes: "Ring coordinator (strategic). Respect for competence, disagree on risk tolerance. Devra favors steady volume; Nils pushes for escalation."
- target: "npc:sabel"
kind: "colleague"
trust: 3
notes: "Off-station supplier. Professional, efficient, no personal warmth. Transactional relationship."
- target: "npc:lera-sessik"
kind: "friend"
trust: 4
notes: "The bar is Devra's social stage. Drinks there, brokers small deals publicly. Lera knows Devra uses the back room."
- target: "npc:renn"
kind: "subordinate"
trust: 5
notes: "Courier. Receives timing instructions from Devra. Values Renn's reliability without personal investment."
- target: "npc:pell"
kind: "subordinate"
trust: 1
notes: "Ring member. Watching Pell more closely since Renn's report. Suspects wavering."
tolerance:
threshold: 8
description: >
High. Calm under pressure, thinks operationally, does not panic. What breaks
her tolerance: Pell's wavering (internal security threat), unexpected Commission
presence (the detective's arrival), and Nils pushing volume too fast.
routine:
summary: >
6 routine entries covering full day cycle:
1. Supply brokering (08:00-12:00) — lattice calls, contract negotiation, legitimate business.
2. Lunch (12:00-14:00) — sometimes at the hub, maintaining visibility near freight operations.
3. Bar presence (14:00-17:00, The Last Shift) — social stage, quiet coordination.
4. Back room meetings (17:00-19:00, 1-2x per week) — ring business.
5. Home or continued brokering (19:00+).
6. Night operations — coordinates gate transit timing with Sabel during off-peak windows.
information:
knows:
- "contraband.ring_exists"
- "contraband.lattice_components"
- "contraband.supply_chain"
- "location.smuggling_route"
- "location.surveillance_gaps"
- "investigation.shift_mismatch"
- "relationship.ring_membership"
- "relationship.trust_network"
- "world.shift_schedule"
access_tier: "insider"
contentment:
level: 4
description: >
Moderate-high. Devra is competent and knows it. The operation runs well. The
money is good. The brokering cover is solid. Contentment would drop sharply if
the operation were threatened — not because she loves the work, but because she
has built her entire life in the district around it.
personality:
demeanor: "professional, composed, controlled"
social_style: "strategic conversationalist, manages impressions, compartmentalizes"
stress_response: "sentences get shorter, eye contact increases, casual bar persona drops"
tells:
- trigger: "coordinating with Sabel about incoming shipment timing"
behavior: "Increased lattice activity — longer message sessions, more frequent checks"
visible_to: "peripheral"
- trigger: "ring coordination meetings scheduled"
behavior: "Enters the back room, door closes, 30-60 minutes. Casual demeanor before and after."
visible_to: "any"
- trigger: "discussing ring business with a colleague"
behavior: "Professional demeanor shift — sentences shorten, eye contact increases, casual persona drops"
visible_to: "forward"
skills:
combat_trained: false
skills:
logistics: 8
negotiation: 7
communication: 7
information_compartmentalization: 6
triangle_membership: []
trust_levels:
surface: >
Freelance supply broker. Professional, friendly at the bar, discusses freight
contracts casually. "I've got a freight contract clearing through Gate 2 next
cycle. Standard components. Nothing exciting, but it pays the rent."
real: >
Ring coordinator. Manages external supply chain, coordinates timing with Sabel,
schedules handoffs, and delivers operational directives from Nils. "The window
is tight. Sabel confirms transit for the 22:00 cycle. Renn handles pickup."
secret: >
Devra is the single point of failure between the local ring and the upstream
supply source. If Sabel is compromised, Devra is the next link. Knows Pell is
wavering. Could run the operation better than Nils.
dual_lens:
smuggler: >
Devra is the operational heart of the ring. The smuggler respects her competence
and relies on her coordination. "Devra's got the next shipment scheduled. She's
reliable — more reliable than Nils, honestly."
detective: >
A freelance supply broker who knows freight schedules in unusual detail. The
detective initially reads her as a local businesswoman. Only deeper investigation
reveals the brokering is partly cover. "Freelance broker. Devra, no family name
offered. Knows freight schedules better than most hub workers. Interesting."
notes: >
THRESHOLD + HANDLER creates the obstacle with authority: "You go through her or
you don't go." Devra gates access to the ring while applying top-down operational
pressure. Most structurally important ring member on-station — both the wall and
the hand pushing people against it. Her competence makes her formidable; her
ambition makes her interesting. Not a formal v0.1 triangle member — her role is
connective, linking internal operations to the external supply chain.
@@ -1,172 +0,0 @@
# NPC Profile: Drin Rosta
# Source: wiki/characters/drin.md
# Tier 2 | SYSTEM + TURNCOAT | Maintenance tech and dock inspector
canonical_id: "npc:drin"
display_name: "Drin Rosta"
tier: 2
pattern: "SYSTEM"
motivation: "TURNCOAT"
description: >
Maintenance tech and dock inspector at the Sova Transit District Logistics Hub.
Age 40, Station Sova native. Competent at both roles. Compromised by a gambling
debt to Harek — a significant sum from bar card games. The debt does not require
Drin to do anything explicitly illegal. It means Drin is slow during inspections
of certain containers. He does not open them. He does not look hard. The ring
noticed this pattern and relies on it. Drin is compromised by omission, not
commission.
want:
primary: "Freedom"
intensity: 8
description: >
Clear the debt and stop looking over his shoulder.
Drin wants to return to when the job was just a job — maintenance rounds, dock
inspections, clocking out, going home. The work was repetitive and that was
fine. Now every inspection cycle carries a second calculation: which containers
to skip, which bays to clear without looking, how to file a report that says
nothing happened when something might have. He wants the old version of the
job back. He does not know how to get there.
secret: >
Drin's inspection negligence is being exploited by the ring. He understands that
someone benefits from his looking the other way — containers move through his
shifts without scrutiny and nobody complains. But he does not know the ring's
structure, does not know Kael's role, does not know the scope of the operation
his silence enables. He thinks it is smaller than it is. The distinction between
omission and commission feels meaningful to him and would not feel meaningful to
an investigator.
relationships:
- target: "npc:harek"
kind: "friend"
trust: 3
notes: "Debt holder, inadvertent coercer. Fear-based, asymmetric. Harek does not press aggressively — keeps the debt active, invites Drin to card games, covers a round. Drin likes Harek personally, which makes the dynamic worse."
- target: "npc:voss"
kind: "superior"
trust: 2
notes: "Shift supervisor. Professional, strained. Voss needs Drin functional and quiet. They interact procedurally — shift handoffs, maintenance reports, inspection schedules. Professional distance is mutual and deliberate."
- target: "npc:maret-korr"
kind: "colleague"
trust: 3
notes: "Freight scheduler. Guilt-adjacent. Drin knows his inspection reports feed into Maret's reconciliation workflow. He senses Maret has noticed the reports are too clean. Avoids extended interaction."
tolerance:
threshold: 2
description: >
Already past breaking. The compromise IS Drin's post-threshold state. He crossed
the line the first time he filed an inspection report he knew was incomplete,
and he has been living past the threshold ever since. He tolerates the routine
guilt, the mechanical compliance, Harek's passive leverage. What breaks him:
direct confrontation about specific inspections, escalating demands to do more
than look away, or Harek pressing the debt publicly.
routine:
summary: >
7 routine entries covering full day cycle:
1. Arrival (05:50, hub) — checks maintenance board for overnight issues.
2. Maintenance rounds (06:00-10:00) — environmental systems, loading equipment,
pipe and wiring repairs.
3. Break (10:00-10:30, break room) — eats alone or with maintenance crew. Avoids
Harek and prolonged conversation with Maret.
4. Dock inspections (10:30-14:00) — scheduled bay checks, container verification,
freight condition reports. Compromise lives here — certain shifts, certain
bays get shorter inspections.
5. Post-shift (14:00-14:30) — files reports, updates maintenance log. Inspection
reports filed here: clean, complete, unremarkable.
6. Off-duty (14:30-16:00) — home, or bar on card game nights (2x per week).
7. Night — home, worrying about the debt, not sleeping well.
information:
knows:
- "location.surveillance_gaps"
- "world.shift_schedule"
access_tier: "public"
contentment:
level: -4
description: >
Very low, trapped. Drin remembers when the job was just maintenance — fixing
things, inspecting things, filing reports that reflected what he actually saw.
The gambling was supposed to be social. Now every inspection is a moral
compromise he cannot talk about. Going through the motions of a life that
stopped working months ago. He has not adjusted; he is just enduring.
personality:
demeanor: "quiet, withdrawn, procedural"
social_style: "avoidant, does not volunteer information, does not seek attention"
stress_response: "silence, shorter responses, fewer interactions — shrinks social footprint"
humor: "absent — humor requires comfort Drin no longer has"
tells:
- trigger: "Harek on-site at the hub or arriving at the bar"
behavior: "Adjusts path to avoid casual contact with Harek."
visible_to: "any"
- trigger: "compromised inspections — certain bays, certain shifts"
behavior: "Clears bays measurably faster than baseline inspection rate."
visible_to: "forward"
- trigger: "shifts that include compromised inspections"
behavior: "Takes more breaks — increased break frequency as stress response."
visible_to: "peripheral"
- trigger: "filing reports he knows are incomplete"
behavior: "Avoids eye contact with the person receiving the paperwork."
visible_to: "forward"
skills:
combat_trained: false
skills:
maintenance: 8
mechanical_diagnostics: 7
dock_inspection: 7
environmental_systems: 6
triangle_membership:
- "worried-knowledge"
- "informant-question"
trust_levels:
surface: >
Professional minimum. Procedural responses about maintenance and inspections.
"Coupling on the Bay 4 loader is wearing. I'll flag it for replacement on the
next maintenance cycle."
real: >
The guilt and the calculation. Which containers to skip, which bays to clear
without looking. "I inspect what's on the schedule. I file what I find. That's
the job."
secret: >
Inspection schedule gaps — which bays, which shifts, which timing windows he
has been slow on. The full scope of his negligence. "My reports are filed.
They're complete. If there's a question about a specific bay, I can pull the
documentation."
dual_lens:
smuggler: >
Drin is a tool — compromised and reliable because of it. The ring does not
interact with Drin directly; they do not need to. Harek's debt does the work.
As long as Drin stays quiet and slow on the right shifts, dock-side processing
runs clean. "Drin's on inspection today. We're good. He doesn't ask questions
and he doesn't open the wrong containers."
detective: >
Drin is a data point — his inspection reports are too clean for the volume of
freight he processes. A maintenance tech pulling double duty should have
equipment failures, missed checks, variance. Drin's are spotless. That
consistency in a high-throughput environment is itself an anomaly. "The
inspector — Drin. Maintenance tech pulling double duty. Reports are spotless.
Nobody's reports are that spotless."
notes: >
SYSTEM + TURNCOAT: institutional rot. The inspection system is broken because the
inspector is broken. Drin embodies the institution (SYSTEM) and has betrayed it
(TURNCOAT), meaning the legitimate oversight mechanism and the criminal
exploitation of it exist in the same person.
Key authoring guidance: Drin is passive, not malicious. His turncoat status came
through debt and avoidance, not ideology. Write him as a man enduring a daily
moral compromise — quiet, methodical, shrinking. The irony is that his methodical
nature makes the compromised inspections more visible by contrast.
Triangle dynamics: In worried-knowledge (Maret-Drin-Voss), Drin is the
compromised inspector. In informant-question (Pell-Renn-Drin), Drin is the
institutional contact who is already compromised — the person Pell might turn
to for protection is already under the ring's indirect control.
@@ -1,149 +0,0 @@
# NPC Profile: Harek Valde
# Source: wiki/characters/harek.md
# Tier 2 | ANCHOR + HANDLER | Station Security officer, bar regular
canonical_id: "npc:harek"
display_name: "Harek Valde"
tier: 2
pattern: "ANCHOR"
motivation: "HANDLER"
description: >
Station Security officer, 44 years old. Predictable schedule, card games at the
bar after shift, enough social capital to be respected without being scrutinized.
Harek holds Drin's gambling debt — a significant sum that creates a power dynamic
the ring has noticed and exploited. Harek hasn't explicitly traded the debt for
inspection negligence, but the debt's existence is a tool others are using. A
security officer who sees more than he admits but has chosen not to look deeper
because investigating would mean confronting what the card game created.
want:
primary: "Happiness"
intensity: 4
description: >
Maintain his comfortable position.
Harek has a good thing: security officer with a predictable schedule, card games
at the bar, social capital. He doesn't want promotions (more responsibility, more
visibility). He doesn't want trouble. Secondary want: keep Drin's debt
leverageable. A dock inspector who owes him favors is useful. Harek hasn't
explicitly traded debt for negligence, but the dynamic exists and the ring
benefits from it.
secret: >
Harek knows (or suspects) that Drin's inspection negligence is being leveraged by
someone else. He sees the dynamic: Drin owes him, Drin looks away during
inspections, the ring benefits. Harek hasn't connected all the dots, but he
understands that his card game created a tool that others are using. Vulnerability:
complicity by inaction — a security officer who notices a dock inspector being
leveraged and doesn't report it is, at minimum, negligent. If investigated,
Harek's position crumbles.
relationships:
- target: "npc:drin"
kind: "friend"
trust: 5
notes: "Card game partner, debtor. Harek likes Drin personally — years of playing cards together. The debt complicates this, but Harek doesn't see himself as a predator."
- target: "npc:lera-sessik"
kind: "colleague"
trust: 5
notes: "Bar owner. Professional familiarity. Harek's card games bring customers; Lera facilitates. Mutually beneficial."
- target: "npc:torek-lintar"
kind: "colleague"
trust: 3
notes: "Card game regular. Harek has noticed Torek's spending but doesn't flag it — Torek's money at the card table is entertainment."
tolerance:
threshold: 7
description: >
Moderate-high. Comfortable and complacent. Tolerates a lot because engagement
is effort. What breaks his tolerance: direct institutional pressure (Commission
or Security command asking about Drin), or violence in the bar (takes safety
seriously even when loose on contraband).
routine:
summary: >
4 routine entries covering full day cycle:
1. Security patrol (06:00-14:00) — hub perimeter and freight bay access points.
2. Shift transition (14:00-14:30).
3. Bar hours (14:30-20:00, The Last Shift) — drinks and card games, 2-3 times
per week.
4. Home (20:00+).
information:
knows:
- "location.surveillance_gaps"
- "world.shift_schedule"
- "world.sova_district_layout"
- "relationship.trust_network"
access_tier: "authority"
contentment:
level: 5
description: >
Moderate-high. The quintessential "comfortable enough not to rock the boat."
Stable job, social standing, entertainment, and just enough willful ignorance
to keep his conscience manageable.
personality:
demeanor: "complacent, sociable, perceptive beneath the surface"
social_style: "card games, bar conversation, community presence — enjoys being known"
stress_response: "deflects, steers conversation, avoids engagement with uncomfortable topics"
humor: "dry, card-table humor — comfortable enough to joke, smart enough to listen"
tells:
- trigger: "Drin is stressed or evasive"
behavior: "Watches Drin more carefully — monitors his investment, attention sharpens at the card table"
visible_to: "peripheral"
- trigger: "someone asks about hub access or patrol gaps"
behavior: "Steers conversation away from security topics — deflection through subject change or vague institutional answers"
visible_to: "forward"
- trigger: "card game in session"
behavior: "Uses card games as social intelligence gathering — invitations are reconnaissance wrapped in entertainment"
visible_to: "peripheral"
skills:
combat_trained: true
skills:
security_patrol: 7
observation: 7
access_control: 6
deescalation: 5
card_games: 6
trust_levels:
surface: >
Off-duty security officer. Card games and drinks. "Hub security's solid. Standard
patrols, standard protocols. Nothing unusual. You want specifics, talk to my
supervisor — I just walk the route."
real: >
Knows patrol routes, Meridian coverage gaps, which areas have blind spots. Knows
Drin's debt and behavioral changes. Knows Torek's spending. Bar social dynamics
insider. Sees more than he admits — his training doesn't turn off even when his
ethics do.
secret: >
Understands that Drin's negligence is being leveraged by someone above. Has chosen
not to investigate because confronting it would mean confronting what his card
game created.
dual_lens:
smuggler: >
Known quantity — off-duty security who doesn't look too hard. The smuggler reads
Harek's card games as harmless social activity and his complacency as a feature.
"Harek's at the bar. Security badge off, drink in hand. As long as he stays that
way, we're fine."
detective: >
Security officer who socializes with the people he should be monitoring. Card
games create financial relationships that could be leverage vectors. His patrol
routes mean he knows hub access patterns. Either an asset (could provide patrol
gap data) or a problem (if actively complicit). "Station Security — Harek. Off-duty
but the training doesn't turn off. He sees the same things I'd see. The question
is what he does with it."
notes: >
ANCHOR + HANDLER: the unconscious lever. "Harek doesn't know his card games built
a weapon." Complacent contentment (ANCHOR) generated a tool of coercion (HANDLER)
without deliberate intent. He didn't set out to compromise Drin — he won card
games, extended credit, and maintained a social dynamic that produced leverage.
The ring noticed and exploited the result. Bridges bar (social presence, card
games) and hub (security authority, patrol knowledge). Not a formal triangle
member but serves as external pressure on Drin in Triangle 2 (worried-knowledge).
@@ -1,269 +0,0 @@
# NPC Profile: Kael Davan — THE FRIEND (Smuggler)
# Source: wiki/characters/kael-davan.md
# Tier: 1 | Pattern: FRIEND | Motivation: OPERATOR
# Triangles: hub-power, worried-partner
canonical_id: "npc:kael-davan"
display_name: "Kael Davan"
tier: 1
pattern: "FRIEND"
motivation: "OPERATOR"
description: >
Dock worker, Sova Transit District Logistics Hub. 34 years old, born on
Station Sova. Ring member who handles physical cargo — routing flagged
containers, managing dock-side handoffs. Closest colleague to the smuggler:
two years of shared risk, first-name basis, lunch together every shift. Kael
is warm, reliable, protective. He is also secretly trying to exit the ring
through an unauthorized contact, because Naia's worry has become unbearable.
The smuggler trusts Kael completely, which makes the betrayal worse when the
contradiction surfaces.
want:
primary: "Safety"
intensity: 8
description: >
Protect the operation and the people in it.
Two years in, Kael is shifting from "keep things running" to "keep people
safe." The operation is escalating — higher volume, tighter margins, more
risk. Secondary want: protect Naia from the truth and the consequences.
Naia doesn't know about the smuggling. Kael's late nights and evasive
answers are creating anxiety at home. The shielding itself is the danger.
secret: >
Ring member who handles cargo routing for the smuggling operation during
shift transitions. Deep secret: Kael is trying to exit the ring. Naia's
worry has become unbearable. He contacted someone from a different district
— not Sabel, not anyone the ring knows — who offered to help him get out,
for a price. The unknown contact is leverage, extraction support, and a
massive security breach. If Nils finds out, Kael is out — violently. If the
smuggler finds out, trust collapses. If the detective finds out, Kael is the
perfect informant.
relationships:
- target: "npc:nils-davan"
kind: "family"
trust: 6
notes: >
Older sibling, ring coordinator. Brought Kael into the ring. Blood
loyalty complicated by power dynamic. Nils is pushing for higher volume;
Kael thinks it's too fast, too risky.
- target: "npc:naia-tamm"
kind: "romantic"
trust: 9
notes: >
Partner, teacher, civilian. 6 years together. Emotional anchor and
vulnerability. Naia knows something's wrong but doesn't know about the
ring. Kael is oblivious to how much anxiety he's causing.
- target: "npc:pc-smuggler"
kind: "friend"
trust: 8
notes: >
Close colleague, trusted friend, shared risk. Work together on
legitimate shifts AND ring operations. Cover for each other. Lunch,
drinks at Lera's, easy camaraderie. Kael is lying to the smuggler about
the exit attempt.
- target: "npc:voss"
kind: "superior"
trust: 3
notes: >
Shift supervisor, ring-aware. Professional respect, low warmth. Voss
provides scheduling cover for the ring. Kael is caught between Voss and
Nils.
- target: "npc:renn"
kind: "colleague"
trust: 5
notes: >
Courier, ring member. Operational relationship. Kael works with Renn on
logistics handoffs.
- target: "npc:devra"
kind: "colleague"
trust: 4
notes: >
External contacts manager for the ring. Kael knows Devra coordinates
off-station connections but keeps operational distance.
- target: "npc:resha"
kind: "colleague"
trust: 5
notes: >
Ring associate. Professional working relationship, mutual trust within
operational bounds.
tolerance:
threshold: 5
description: >
Moderate — can handle pressure but has limits. Tolerates routine smuggling
operations, Voss's resentment, Nils's demands, and lying to Naia. Pushed
toward breaking by escalating volume, Naia's increasing worry, and the
detective's investigation. Breaks on direct threat to Naia (flips
immediately) or Nils discovering the exit attempt (runs or fights, no
middle ground).
routine:
summary: >
8 routine entries covering full day cycle. Morning arrival (06:00-06:30,
Logistics Hub) for shift startup. Morning shift (06:30-10:30, dock floor)
for freight handling. Break (10:30-11:00, break room) lunch with smuggler
or other dock workers. Afternoon shift (11:00-14:00, dock floor) container
routing and schedule coordination. Shift end (14:00-14:30) sometimes
lingers for overtime — ring operations during transition window. Off-shift
(14:30-16:00) heads home or to The Last Shift. Home (16:00-22:00) with
Naia, or occasional ring coordination in Corridor B-7. Late-night
operations (22:00+) ring work 1-2x per week during night shift transition.
information:
knows:
- "contraband.ring_exists"
- "contraband.lattice_components"
- "contraband.supply_chain"
- "location.corridor_b7_restricted"
- "location.smuggling_route"
- "location.surveillance_gaps"
- "location.dead_drop_location"
- "investigation.manifest_discrepancy"
- "investigation.shift_mismatch"
- "investigation.cargo_anomaly"
- "relationship.ring_membership"
- "relationship.kael_naia_connection"
- "relationship.trust_network"
- "world.shift_schedule"
- "world.sova_district_layout"
access_tier: "insider"
contentment:
level: -1
description: >
Moderate-low, declining. The smuggling pays well and the team is solid,
but guilt about lying to Naia is corrosive. Escalating volume makes every
shift feel riskier. Two years ago contentment was moderate — operation
stable, Naia didn't suspect. Now low and falling. The exit attempt is a
desperate grab for a future that doesn't involve looking over his shoulder.
personality:
demeanor: "warm to people he trusts, evasive when hiding something, direct and practical"
social_style: "first-name basis with everyone, relational, physically present, short sentences"
stress_response: "goes quiet, checks exits, shortens interactions, lattice checking increases"
humor: "dry, situational, doesn't waste words or dramatize"
tells:
- trigger: "expecting contact from exit coordinator (periodic throughout day)"
behavior: >
Increased lattice checking — reaches for lattice more often than usual,
brief distracted pauses mid-conversation
visible_to: "peripheral"
- trigger: "prolonged conversation where lies might surface"
behavior: >
Shortened social interactions — excuses himself early from lunch, cuts
conversations short with forced casualness
visible_to: "any"
- trigger: "lying or deflecting a direct question"
behavior: >
Looks left before answering. Personal tell the smuggler knows from years
of friendship — the moment the smuggler recognizes this is the moment
trust fractures
visible_to: "forward"
- trigger: "meeting unknown contact in Corridor B-7 (off-routine, restricted area)"
behavior: >
Unauthorized spatial presence — in restricted maintenance corridor at
irregular time, talking to unrecognized person outside ring protocol
visible_to: "any"
skills:
combat_trained: false
skills:
cargo_handling: 8
logistics: 7
social: 6
triangle_membership:
- "hub-power"
- "worried-partner"
trust_levels:
surface: >
Polite, standard dock worker responses. "Shift's looking smooth today.
Freight's on schedule, no surprises. Let's keep it that way."
real: >
Only accessible to ring insiders. Operational talk, container routing,
timing windows. "Container 4471 is flagged. I'll reroute it during shift
transition." Matter-of-fact, no drama.
secret: >
The exit attempt. Never accessible through normal play. Kael's
unauthorized contact, Naia's role as motivation, the desperation to get
out before consequences reach his partner.
friend_arc:
bonded_character: "smuggler"
phases:
- phase: 1
description: >
Comfort. Kael is warm, reliable, present. Greets the smuggler with
genuine affection. Talks about shift schedules, complains about Voss,
asks about the smuggler's weekend. The day is better when Kael is on
shift.
trigger: "Game start, first interactions (0-10 minutes)"
routine_deviation: "None — baseline normal. Kael is punctual, sociable, engaged."
- phase: 2
description: >
First Crack. Kael checks lattice more often than usual. Excuses
himself from lunch early. Shortened social interactions — still warm,
but deflects prolonged conversation. The smuggler notices the
distraction.
trigger: "10-15 minutes into session. Behavioral flags begin accumulating."
routine_deviation: "Increased lattice checking. Leaves break room early. Distracted during casual talk."
- phase: 3
description: >
The Observation. The smuggler sees Kael in Corridor B-7 — restricted
maintenance corridor — talking to an unknown person. The person leaves
before the smuggler gets close. Prior belief that Kael operates within
ring protocol is contradicted. Color shifts from green to amber.
trigger: "15-20 minutes. Smuggler enters Corridor B-7 and directly observes unauthorized meeting."
routine_deviation: "Presence in restricted area at irregular time. Meeting with unrecognized contact outside ring protocol."
- phase: 4
description: >
Confrontation Opportunity. The smuggler can ask Kael about the
meeting. Kael deflects — "Just a thing. Don't worry about it." Looks
left before answering — the tell. The smuggler recognizes the lie
from years of friendship.
trigger: "20-25 minutes. Smuggler initiates dialogue about the Corridor B-7 observation."
routine_deviation: "Kael becomes evasive, forces subject changes, displays forced casualness. The looks-left tell confirms the lie."
- phase: 5
description: >
New Equilibrium. Kael acts normal again — same shifts, same greetings,
same surface warmth. But the smuggler is now watching. Every smile is
filtered through doubt. Three dialogue paths open: understanding
(gentle confrontation, possible confession), betrayal (report to
Nils), or observation (watch and wait). Contaminated trust.
trigger: "25-30 minutes. Post-confrontation, remainder of vertical slice."
routine_deviation: "Surface behavior returns to baseline, but trust is structurally damaged. Player chooses path."
dual_lens:
smuggler: >
Access tier: Insider + Peer. Relationship shifts from Friendly to
PersonOfInterest post-contradiction. Monologue tone moves from fond and
casual ("Kael's here. Good — always reliable.") to conflicted and
analytical ("Kael's lying to me. I know his tells. What are you hiding?").
The smuggler knows Kael's personal tell, knows the relationship with
Naia. The unauthorized meeting is a betrayal of operational security, not
just suspicious behavior. Emotional weight: maximum. Color shift from
green to amber is the moment trust is compromised.
detective: >
Access tier: Public to Authority if investigation escalates. Relationship
moves from Unknown to Known to PersonOfInterest if tells accumulate.
Monologue tone shifts from clinical ("Dock worker. Davan, K. Unremarkable
on paper.") to analytical suspicion ("Davan's nervous. Lattice activity
spiked. Behavioral pattern suggests concealment."). The detective may
discover manifest discrepancies tied to Kael's shifts. Kael as a pressure
point: partner at risk, potential informant.
notes: >
Tier 1 FRIEND NPC, bonded to smuggler. THE FRIEND pattern means Kael's
betrayal — or the smuggler's betrayal of Kael — carries maximum emotional
weight. FRIEND + OPERATOR composition: "I was your friend AND your
co-conspirator." The warmth was real. The operational reliability was real.
The secret exit attempt violates both. Voice: direct, practical, short
sentences. Uses first names. The tell (looks left when lying) must be
established early so the smuggler recognizes it during contradiction. Naia
references in casual conversation establish the relationship before it
becomes load-bearing. Ring operations dialogue is matter-of-fact, no drama.
Deflection post-contradiction uses redirection, not outright lies.
@@ -1,160 +0,0 @@
# NPC Profile: Lera Sessik
# Source: wiki/characters/lera-sessik.md
# Tier 2 | ANCHOR + OPERATOR | Bar owner, The Last Shift
canonical_id: "npc:lera-sessik"
display_name: "Lera Sessik"
tier: 2
pattern: "ANCHOR"
motivation: "OPERATOR"
description: >
Owner and primary bartender of The Last Shift, the transit district's social hub.
Eighteen years behind the same counter. Lera knows everyone, sees everything, and
shares nothing voluntarily. Her regulars are her community and she protects them
reflexively — including ring members, not because she is complicit but because they
are also regulars. Willful ignorance is not moral failure for Lera; it is business
survival. The bar operates on thin margins and the grey-market spending keeps her
solvent.
want:
primary: "Wealth"
intensity: 7
description: >
Keep the bar viable.
The Last Shift operates on thin margins. The after-shift crowd is what keeps
the lights on. Lera knows some regulars have grey-market income — she does not
ask where the money comes from because the spending keeps her solvent. Secondary
want: protect her regulars. Eighteen years of watching people come and go. She
warns them when unfamiliar faces show up, signals when conversations are being
overheard, remembers who does not want to see whom.
secret: >
Knows the back room of the bar is used for ring coordination meetings. Has not
asked what happens there. The arrangement is simple: they pay for the space, they
buy drinks, they do not cause trouble. Lera does not have conspiracy-level secrets.
What she has is accumulated knowledge from 18 years of bartending — fragments of
conversations, behavioral patterns, relationship dynamics. She knows more about
the district's social fabric than anyone. Her value is that she does not talk about
it. Vulnerability: the bar itself. Threaten to shut down The Last Shift and Lera
cooperates with whoever is doing the threatening. She has no fallback.
relationships:
- target: "npc:torek-lintar"
kind: "friend"
trust: 5
notes: "Bar regular and one of her best customers. Appreciates the spending, worries about the attention it draws. Protective but concerned."
- target: "npc:harek"
kind: "colleague"
trust: 4
notes: "Off-duty security officer, bar regular. Professional familiarity. Tolerates Harek's card games because they bring in customers."
- target: "npc:sera-venn"
kind: "friend"
trust: 5
notes: "Bar regular. Quiet, polite, tips consistently, does not cause trouble. Commission employee who does not act like Commission."
- target: "npc:pc-smuggler"
kind: "friend"
trust: 7
notes: "Regular at The Last Shift. Lera saves the smuggler's usual seat. Ring-aware but protective."
- target: "npc:olin"
kind: "colleague"
trust: 2
notes: "New arrival. Lera is watching Olin — unfamiliar face asking questions. Professional caution."
- target: "npc:devra"
kind: "colleague"
trust: 4
notes: "Bar regular and supply broker. Uses the back room. Lera knows Devra uses the room but does not know for what."
tolerance:
threshold: 8
description: >
High. Nearly two decades of bartending. Tolerates drunks, arguments, gossip,
and grey-market activity with professional detachment. What breaks her tolerance:
violence in the bar (zero tolerance, immediate ejection), institutional pressure
on her business, or a direct threat to a regular she cares about.
routine:
summary: >
5 routine entries covering full day cycle:
1. Bar prep (10:00-12:00) — inventory, cleaning, restocking.
2. Quiet hours (12:00-14:00) — a few early regulars, food prep.
3. Peak hours (14:00-22:00) — shift transition crowd, evening regulars, card
games. Primary social observation window.
4. Late crowd (22:00-02:00) — smaller, quieter. Ring coordination sometimes uses
back room.
5. Close (02:00-03:00) — clean, home.
information:
knows:
- "world.sova_district_layout"
- "relationship.trust_network"
- "relationship.faction_allegiance"
access_tier: "public"
contentment:
level: 3
description: >
Moderate. The bar is viable. Her regulars are loyal. The work is hard but
familiar. Lera's contentment is functional — not thriving, not miserable. The
smuggling economy keeps her bar profitable. If that economy is disrupted, her
contentment drops sharply.
personality:
demeanor: "warm with regulars, guarded with strangers, professional always"
social_style: "observant listener, speaks selectively, remembers everything"
stress_response: "cleans glasses, redirects conversations, watches the door"
tells:
- trigger: "unfamiliar authority enters the bar, or a table conversation gets too loud"
behavior: "Cleans glasses with increased focus — hands stay busy, attention shifts to the source of concern"
visible_to: "any"
- trigger: "a regular is about to say something incriminating near an outsider"
behavior: "Redirects conversation — offers a refill, asks a question, changes the subject smoothly"
visible_to: "peripheral"
- trigger: "someone she considers a risk is due to arrive, or the back room is in use"
behavior: "Watches the door — gaze returns to the entrance at intervals, positioning shifts to maintain line of sight"
visible_to: "forward"
skills:
combat_trained: false
skills:
bar_management: 9
social_intelligence: 9
conflict_deescalation: 7
customer_service: 8
triangle_membership:
- "bar-tensions"
trust_levels:
surface: >
Welcoming bartender. Serves drinks, makes small talk, remembers orders. "I serve
drinks. People talk. I don't take notes. You want information, try the Commission
kiosk on Level 3."
real: >
Social gatekeeper. Knows who drinks with whom, who avoids whom, who is spending
beyond their means, who is worried. Signals regulars when outsiders ask questions.
Protects the community reflexively.
secret: >
The back room is used for ring meetings. Lera has not attended. She knows the
arrangement exists and maintains it because it pays. Threaten the bar's license
and Lera will cooperate — the bar is her only fallback.
dual_lens:
smuggler: >
Lera is infrastructure — the bar is a social hub, a meeting point, a place to
read the district's mood. The smuggler trusts Lera to protect the community
without being told to. "Lera's watching the door. Something's up. I'll ask later."
detective: >
Lera is the gatekeeper. She knows everyone and shares nothing voluntarily. The
detective can build rapport or apply pressure on the bar license. Either approach
takes time. "The bartender — Sessik. Runs this place. She sees everything. Getting
her to talk will take patience or leverage."
notes: >
ANCHOR + OPERATOR: profitable blindness. "Is this enough? Yes — if I don't look."
Lera's contentment is sustained by operational competence — she runs the bar well
enough that the moral compromises stay manageable. The willful ignorance is active
maintenance, not laziness. Key authoring guidance: Lera is not a conspirator. She
is a small business owner in a grey economy. Write her warmth as genuine, her
protectiveness as reflexive, and her silence as a survival strategy.
@@ -1,167 +0,0 @@
# NPC Profile: Maret Korr
# Source: wiki/characters/maret-korr.md
# Tier 2 | SYSTEM + SKEPTIC | Logistics Hub freight scheduler
# NOTE: Wiki uses pattern "WITNESS" but schema pattern enum doesn't include WITNESS.
# WITNESS is a motivation value (System B). Mapped to SYSTEM (System A) — Maret
# functions within institutional processes; her witnessing is through systematic work.
# Flag for design review: should schema add WITNESS to pattern enum?
canonical_id: "npc:maret-korr"
display_name: "Maret Korr"
tier: 2
pattern: "SYSTEM"
motivation: "SKEPTIC"
description: >
Freight scheduler at the Sova Transit District Logistics Hub. Age 41, meticulous,
anxious. Reconciles incoming manifests with cargo bay allocations, shift assignments,
and gate transit logs. The numbers are not adding up — container counts do not match
gate logs, certain bays have manifests revised after the fact, and shifts supervised
by Voss have more discrepancies than others. Maret does not know what this means,
but she knows it means something. She has started keeping a private discrepancy log
on her personal lattice storage.
want:
primary: "Knowledge"
intensity: 7
description: >
Understand the manifest discrepancies.
Maret processes freight schedules and the numbers are not adding up. Container
counts do not reconcile, manifests are revised after Voss's schedule adjustments,
Drin's inspection reports are suspiciously clean. She is paralyzed between duty
and self-preservation — she has not reported because she does not know whom to
report to. The Commission kiosk is unmanned, station security handles accidents
not contraband, and going to Voss feels dangerous.
secret: >
Maret has noticed manifest discrepancies and has started keeping a personal log of
them on her private lattice storage. If discovered, this log is either evidence for
the detective or a threat to the ring. She has mentioned the discrepancies to no
one, but her increased attention to certain records is potentially observable.
Knowledge without protection — she has no institutional backing, no allies in the
conflict, and no exit strategy.
relationships:
- target: "npc:voss"
kind: "superior"
trust: 2
notes: "Shift supervisor. Professional respect but growing unease. Maret has noticed the correlation between his schedule adjustments and manifest discrepancies. She has not confronted him — afraid of what the answer would be."
- target: "npc:drin"
kind: "colleague"
trust: 3
notes: "Dock inspector. Maret knows Drin gambles at the bar. She has observed that inspection reports from Drin's shifts are consistently clean — too clean for the volume. Another data point filed and not acted on."
- target: "npc:resha"
kind: "colleague"
trust: 5
notes: "New hire. Maret is protective of Resha in a quiet, professional way — proper training, not overloaded. Resha's questions about locked bays and irregular schedules echo Maret's own unspoken concerns."
- target: "npc:naia-tamm"
kind: "friend"
trust: 5
notes: "Occasional social contact. Maret sometimes visits the bar for Naia's company. One of the few relationships that is not work-adjacent anxiety."
tolerance:
threshold: 4
description: >
Low-moderate. Maret is not built for confrontation. She handles data, not people.
The discrepancies are eating at her, but she has tolerated them for weeks because
action feels more dangerous than silence. What breaks her: the detective asking
the right question, or the ring discovering her private log.
routine:
summary: >
5 routine entries covering full day cycle:
1. Day shift (06:00-14:00) — freight scheduling, manifest reconciliation, bay
allocation.
2. Break (10:30-11:00, break room) — eats alone or with Resha. Avoids Voss
during breaks.
3. Post-shift (14:00-15:00) — reviews next day's gate schedule.
4. Off-duty (15:00-17:00) — home or occasional bar visit for Naia's company.
5. After hours — reviews private discrepancy log. Adds entries. Worries.
information:
knows:
- "investigation.manifest_discrepancy"
- "world.shift_schedule"
access_tier: "public"
contentment:
level: -2
description: >
Low, anxious. Maret was content before the discrepancies became impossible to
ignore. She finds peace in orderly systems and the manifest irregularities have
disrupted that peace. She sleeps poorly, double-checks everything. Anxiety held
in check by routine.
personality:
demeanor: "meticulous, tense, quietly worried"
social_style: "reserved, professional, gravitates toward data over people"
stress_response: "retreats into detail work, rechecks records, reduces social interaction"
humor: "rare — occasionally dry when relaxed, absent when stressed"
tells:
- trigger: "reviewing manifest data during shift"
behavior: "Checks the same records multiple times, cross-references gate logs she does not normally access."
visible_to: "peripheral"
- trigger: "break periods"
behavior: "Avoids Voss. Eats alone more often. Social withdrawal as stress response."
visible_to: "any"
- trigger: "Resha asks about schedule irregularities"
behavior: "Goes quiet, redirects the conversation to procedure. Brief eye contact avoidance."
visible_to: "forward"
skills:
combat_trained: false
skills:
freight_scheduling: 8
manifest_reconciliation: 9
data_analysis: 7
logistics_coordination: 6
triangle_membership:
- "worried-knowledge"
trust_levels:
surface: >
Professional freight scheduler. Gives clean, data-oriented answers. Defers to
Voss on scheduling questions. "Bay 3 allocation looks clean for the morning
cycle. I've reconciled the gate logs."
real: >
Has noticed manifest discrepancies she cannot explain. Keeps a private log.
Suspects Voss is involved but has no proof. Afraid to act but unable to stop
looking. "I just process the schedules. If there's a question about manifest
revisions, that's Voss's authorization."
secret: >
Would share the discrepancy data with someone she trusts — if someone asked the
right question. "There are patterns. In the data. If someone wanted to look at
Bay 7 allocations during Voss's shift adjustments, the numbers would be worth
comparing."
dual_lens:
smuggler: >
Maret is a risk. She processes the paperwork the ring's operations depend on
and she is too smart not to notice. The smuggler reads Maret's anxiety as a
threat — someone who knows too much and might talk. "Maret's been quiet.
She's usually all numbers and schedules. When she gets quiet, she's thinking.
That's not good."
detective: >
Maret is a potential cooperative witness. She has the data, the context, and
the anxiety that suggests she has seen something she should not have. The
detective's task is building enough trust that Maret shares what she knows.
"The freight scheduler — Korr. Meticulous. Anxious. She processes the
manifests. If there are irregularities in the paperwork, she's seen them."
notes: >
WITNESS + SKEPTIC: dangerous knowledge. She saw something and she cannot stop
questioning it. Maret did not choose to witness the discrepancies — her job put
the data in front of her. But her response is systematic doubt, not passive
acceptance. She is gathering evidence not because anyone asked her to, but
because her meticulous nature will not let her stop.
Key authoring guidance: Maret is the cooperative witness who has already done
half the detective's work. For the smuggler, Maret is the threat you cannot
neutralize without revealing why the numbers matter. Write her as competent
and trapped — the anxiety is real but the intelligence underneath it is sharp.
Triangle dynamics: In worried-knowledge (Maret-Drin-Voss), Maret sees the data.
She processes manifests and has noticed discrepancies she cannot explain and
cannot ignore.
@@ -1,143 +0,0 @@
# NPC Profile: Naia Tamm
# Source: wiki/characters/naia-tamm.md
# Tier 2 | MIRROR + CIVILIAN | Teacher, Kael's partner
canonical_id: "npc:naia-tamm"
display_name: "Naia Tamm"
tier: 2
pattern: "MIRROR"
motivation: "CIVILIAN"
description: >
Teacher at Station Sova community school, Residential Radial A. Partner of
Kael Davan for 6 years. Relocated from Krenn Prime surface 8 years ago.
Naia is the emotional center of the worried-partner triangle — a civilian
whose transparency makes the concealment around her more painful. She is
exactly what she appears to be: a teacher worried about her partner.
want:
primary: "Knowledge"
intensity: 8
description: >
Understand what is happening with Kael.
Naia and Kael have been together 6 years. It was good — stable, warm,
predictable. Then Kael started coming home late. Evasive answers. Money
that did not match the hours. Stress that Kael will not explain. Naia does
not know about the ring. She knows the person she shares a life with is
hiding something, and the not-knowing is worse than almost any truth.
Secondary want: protect the life they have built — the home, the
relationship, the stability that took years to build.
secret: >
Naia confided in Sera Venn about Kael's behavioral changes — late nights,
evasive answers, unexplained stress. This is the action that set Sera's
compliance check in motion, though Naia does not know that. Naia shared a
personal worry with a trusted friend. That trusted friend had institutional
access. Naia's worry is genuine, visible, and exploitable.
relationships:
- target: "npc:kael-davan"
kind: "romantic"
trust: 9
notes: "Partner, 6 years. Deep love, growing anxiety. Does not question Kael's character — just Kael's honesty."
- target: "npc:sera-venn"
kind: "friend"
trust: 7
notes: "Close friend, 10 months. Met at the bar after Sera transferred. Trusts Sera for perspective without gossip."
- target: "npc:lera-sessik"
kind: "friend"
trust: 4
notes: "Bar acquaintance. Lera is warm to Naia — protective attention a good bartender gives to someone visibly struggling."
tolerance:
threshold: 5
description: >
Moderate. Patient — teaching station kids requires it. But the patience is
fraying. Every evasive answer from Kael, every late night, every 'it is just
work' chips at Naia's tolerance. If pushed to breaking point, Naia confronts
Kael directly — which could trigger Kael's crisis, force Sera's hand, or
give the detective an opening.
routine:
summary: >
5 routine entries covering full day cycle:
1. Teaching (07:00-15:00, community school, Residential Radial A).
2. Commute (15:00-15:30) — returns to Transit District.
3. Bar social (15:30-17:30, The Last Shift) — meets Sera, decompresses.
4. Home evening (17:30-22:00) — waits for Kael. Sometimes there, sometimes not.
5. Late evening — alone in the apartment, wondering where Kael is.
information:
knows:
- "relationship.kael_naia_connection"
access_tier: "public"
contentment:
level: -2
description: >
Low and declining. Naia was content: stable job, loving partner, community.
Now the relationship anxiety is coloring everything. Teaching is harder when
distracted. Bar visits are tinged with worry. Home is where the absence
lives. Contentment trajectory mirrors Kael's — both declining, for connected
but different reasons.
personality:
demeanor: "warm, open, visibly stressed"
social_style: "emotionally present, confides in close friends, reads people well"
stress_response: "worry overflows into conversation, increased bar presence, avoids the empty apartment"
tells:
- trigger: "baseline state — tired, distracted"
behavior: "Tired eyes, distracted conversation, checking lattice for messages from Kael"
visible_to: "any"
- trigger: "worry overflowing into conversation"
behavior: "Mentions Kael unprompted — 'Kael was late again' or 'I don't know what's going on at the hub'"
visible_to: "peripheral"
- trigger: "coping with anxiety"
behavior: "Coming to the bar more often and staying longer — avoiding the empty apartment"
visible_to: "any"
skills:
combat_trained: false
skills:
teaching: 8
community_engagement: 7
emotional_perception: 6
curriculum_management: 5
triangle_membership:
- "worried-partner"
trust_levels:
surface: >
Warm, open. Standard social interaction — talks about teaching, the kids,
the school. "The kids are doing better with the new math curriculum."
real: >
Confides worry about Kael to close friends. Visible stress. "Kael was home
at midnight again. Said it was overtime. There's no overtime posted for this
week — I checked."
secret: >
The depth of her fear and the specific details she shared with Sera about
Kael's behavioral changes. The breaking point. "I'm not asking for much.
Just — tell me the truth. Whatever it is."
dual_lens:
smuggler: >
Naia is emotional collateral. The smuggler knows why Kael is busy and cannot
say. Seeing Naia's worry creates guilt — especially if the smuggler is
Kael's friend. "Naia's at the bar again. Alone. Looking at the door every
time it opens. I know where Kael is. I can't say."
detective: >
Naia is a potential source. A partner who suspects their loved one is hiding
something is a classic entry point for investigation. The detective can
cultivate Naia's trust by being sympathetic. "The partner — Naia Tamm.
Teacher. Visibly stressed. If Davan is involved, this partner knows something
changed, even if they don't know what."
notes: >
MIRROR + CIVILIAN creates honest transparency surrounded by liars: "The one
person not lying — surrounded by liars." Naia's reflective honesty combined
with complete uninvolvement means she is the emotional baseline against which
all deception is measured. When events drag Naia into the conspiracy through
Kael's ring involvement and Sera's concealment, the damage is devastating
because Naia was genuine.
@@ -1,105 +0,0 @@
# NPC Profile: Nils Davan
# Source: wiki/characters/nils-davan.md
# Off-stage NPC — never physically present in v0.1, mediated through
# lattice messages, dialogue references, and operational pressure
canonical_id: "npc:nils-davan"
display_name: "Nils Davan"
tier: 1
pattern: "GHOST"
motivation: "HANDLER"
description: >
Off-stage ring coordinator (~38). Nils does not appear physically in any v0.1
scene. His presence is felt entirely through lattice messages to Kael,
references in NPC dialogue, and the operational pressure that cascades through
the ring. He is the escalation pressure source — pushing for higher volume,
tighter schedules, more throughput. Every ring member feels Nils's influence
without seeing him. Tier 1 in schema; functionally off-stage (tier 0).
want:
primary: "Power"
description: >
Control.
Grow the operation. Increase volume. Maintain authority over the ring from
a distance. Nils sets volume targets, applies escalation pressure, and makes
personnel decisions. The ring's growth imperative comes from Nils; the
consequences fall on others.
secret: >
Full ring coordinator. Sets strategic direction, personnel decisions, volume
targets. Operates through Devra (execution) and Kael (dock-side operations).
His identity is known only to Kael (sibling) and Devra (operational partner).
Voss knows "someone above Devra" exists but has never met Nils.
relationships:
- target: "npc:kael-davan"
kind: "family"
trust: 7
notes: >
Younger sibling. Nils recruited Kael into the ring personally. Genuine
familial bond complicated by power dynamic. Pushes Kael for higher volume.
Does not know Kael is trying to exit the ring. If Kael's exit attempt is
discovered, Nils is the primary threat — family loyalty vs. operational
security is undefined in v0.1 but implied to be dangerous.
- target: "npc:devra"
kind: "colleague"
trust: 6
notes: >
On-station coordinator. Professional respect, operational partnership.
Nils gives strategic direction; Devra handles execution. They disagree
on risk tolerance — Devra favors steady volume, Nils pushes escalation.
Devra is Nils's primary on-station voice.
- target: "npc:voss"
kind: "superior"
trust: 2
notes: >
Resource exploitation, no personal relationship. Nils exploits Voss's
schedule authority to create coverage windows. Voss resents the invisible
hand but complies — the money is good and refusing has consequences.
To Nils, Voss is functional and replaceable.
routine:
summary: >
Not observable. Nils is never physically present in Sova Transit District.
His existence is mediated through lattice messages to Kael (5-8 authored
lines), references in NPC dialogue, and operational pressure cascading
through the ring hierarchy.
information:
knows:
- "contraband.ring_exists"
- "contraband.ring_structure"
- "contraband.lattice_components"
- "contraband.supply_chain"
- "contraband.volume_targets"
- "relationship.ring_membership"
- "relationship.kael_sibling"
- "location.smuggling_route"
- "location.distribution_points"
access_tier: "authority"
triangle_membership:
- "hub-power"
dual_lens:
smuggler: >
Unseen boss. Known by reputation and felt through operational pressure.
The smuggler has never met Nils but follows orders relayed through Devra
and Kael. Nils is the authority that shapes every operational day.
detective: >
The name that surfaces late in the investigation. The coordinator behind
the coordinator — the authority that explains why everyone on-station is
afraid. Origin codes, lattice intercepts, and dialogue fragments point
upstream to someone the detective cannot reach within the vertical slice.
notes: >
Off-stage authority figure. Never physically instantiated in v0.1. Entire
presence is mediated: lattice messages to Kael (operational instructions,
volume pressure, occasional familial notes), dialogue references from ring
members, and the escalation pressure that drives Triangle 1 (hub-power).
Nils's transmitted message serves as the plot device that forces the
volume escalation fork — his demand for higher throughput cascades through
Devra, Kael, and Voss, creating observable disruption. GHOST + HANDLER
creates absent authority: the ring's most dangerous decisions are made by
someone who never sees their consequences.
@@ -1,105 +0,0 @@
# NPC Profile: Olin Tavren
# Source: wiki/characters/olin.md
# Tier 3 — reduced content, essential axes only
canonical_id: "npc:olin"
display_name: "Olin Tavren"
tier: 3
pattern: "CATALYST"
motivation: "CIVILIAN"
description: >
Recent arrival in Sova Transit District — a drifter looking for freight work.
Story is plausible: contract work dried up elsewhere, heard Sova had openings.
The story is also convenient, and in a district where new faces attract
attention, convenience is suspicious. Ambiguity is deliberate and unresolved.
want:
primary: "Safety"
description: >
Employment.
Find work. Settle in. Start over. Whether this is genuine or a cover story
is left deliberately ambiguous for v0.1.
secret: >
Unresolved. Olin may be exactly what he claims — a drifter looking for work —
or may be a scout, informant, or rival operator. The game does not confirm
either reading in v0.1.
routine:
summary: >
Variable — no fixed schedule. Appears at the bar in the afternoon,
sometimes at the hub entrance asking about openings, sometimes walking
the district. New arrivals without fixed employment have irregular
patterns by nature.
personality:
demeanor: "friendly, curious, slightly too interested"
social_style: "open, direct, asks questions about work schedules and shift structures"
stress_response: "deflects with friendliness, changes subject"
relationships:
- target: "npc:lera-sessik"
kind: "colleague"
trust: 2
notes: "Bar acquaintance. Olin drinks at The Last Shift, asks questions. Lera assesses."
tolerance:
threshold: 5
description: >
Moderate. Olin handles social pressure well but becomes evasive under
sustained interrogation. The friendliness is armour, not fragility.
information:
knows:
- "world.sova_district_layout"
- "world.shift_schedule"
access_tier: "public"
contentment:
level: 0
description: >
Unsettled. New arrival without stable employment or social anchoring.
Neither content nor distressed — in transition.
tells:
- trigger: "conversation about hub operations"
behavior: "Leans in, asks specific follow-up questions — schedules, who runs what, where things go"
visible_to: "any"
- trigger: "when ring members are nearby"
behavior: "Watches them without staring. Notes who sits with whom."
visible_to: "peripheral"
skills:
combat_trained: false
skills:
social: 6
cargo_handling: 5
triangle_membership:
- "bar-tensions"
trust_levels:
surface: >
Friendly newcomer looking for work. "I'm just trying to find steady
freight work. Know anyone hiring at the hub?"
real: >
Harder to reach — Olin's openness is itself a deflection. What lies
beneath the friendly questions is unclear even at higher trust.
secret: >
Whatever Olin's true purpose is remains sealed for v0.1. The ambiguity
is the content.
dual_lens:
smuggler: >
Threat assessment. New face asking about hub work. Could be nothing,
could be everything. Watching.
detective: >
Potential fresh source. No local ties, no loyalty obligations. Could be
useful if Olin has seen something the regulars have learned to ignore.
notes: >
Ambiguity NPC. Creates productive uncertainty — a new variable in a stable
system that forces both player characters to evaluate and respond. In the
bar-tensions triangle, Olin's questions and Torek's spending create combined
pressure on Lera. The game does not resolve Olin's true nature in v0.1.
@@ -1,62 +0,0 @@
# NPC Profile: Pael Varren
# Tier 3 — NOBODY / CIVILIAN
# Flat NPC — noise floor. Knows nothing about the ring.
# Observable presence near B-corridor is legitimate maintenance, not surveillance.
# Ticket: #307 | Sprint: 12
canonical_id: "npc:pael"
display_name: "Pael Varren"
tier: 3
pattern: "NOBODY"
motivation: "CIVILIAN"
description: >
Station maintenance tech, early 40s. Has worked Sova Transit District for
fifteen years. Knows every duct, every failing seal, every air recycler
running off-spec. Appears throughout the district because maintenance is
everywhere. Carries a scanner everywhere; hands are perpetually stained with
lubricant. Pael has no ring connection, no secrets beyond a quiet resentment
of deferred maintenance tickets. Is frequently near B-corridor because the
environmental seal there fails on a cycle of roughly three weeks, without
fail, regardless of what Pael does about it.
want:
primary: "Happiness"
description: >
To get through a single shift without a new deferred ticket appearing on
the queue. Fifteen years of Sova has narrowed the definition of a good day.
routine:
summary: >
Arrives before any shift (05:30 entry), does a diagnostic walk of the
full district, starts on the highest-priority deferred tickets during
low-traffic windows. Reappears at the B-corridor junction around mid-shift
because the environmental seal there is always the problem. Leaves when
the shift cycle turns over. Pattern is completely predictable. That's the
point — Pael is never where they shouldn't be, they're just always where
the problems are.
personality:
demeanor: "tired-competent, dry humor, no interest in drama"
social_style: "minimal — answers when addressed, doesn't linger"
stress_response: "files a maintenance ticket and moves on"
tells: []
skills:
combat_trained: false
skills:
maintenance: 9
environmental_systems: 8
trust_levels:
surface: >
Fifteen years of Sova maintenance. "If it breaks, I've seen it break
before. Usually the same three things."
notes: >
NOBODY + CIVILIAN: pure noise floor. The "seems important but isn't" quality
is positional — frequent presence near B-corridor for genuine maintenance
reasons. One memorable observable trait: scanner always open, lubricant
stains on both hands even at shift start. Paula owns the trait design.
Mellanie owns the lines (#307).
@@ -1,246 +0,0 @@
# PC-as-NPC Profile: The Detective (NPC mode, seen by smuggler player)
# Source: docs/design/pc-as-npc-spec.md section 11
# Ticket: #383 | Blocks: #401 (PC-as-NPC content authoring)
#
# When the player is the smuggler, this file defines the detective's NPC behavior.
# When the player IS the detective, this file is not loaded.
canonical_id: "npc:pc-detective"
display_name: "Commission Liaison"
tier: 2
pattern: "MIRROR"
motivation: "OPERATOR"
description: >
The detective as NPC. A Commission investigator conducting manifest review
in Sova Transit District. Neutral behavioral path: reviews records, walks the
dock floor, frequents the bar with Sera. First playthrough (smuggler): institutional
threat to avoid. Second playthrough: "That's me. That's what I was doing."
want:
primary: "Knowledge"
intensity: 5
description: >
Answers.
Wants to understand the freight discrepancies. Follows the investigation
methodically. Does not make dramatic decisions on the neutral path -- no
confrontations, no leverage plays, no dramatic revelations.
secret: >
Actual mandate is investigation of freight irregularities, not routine compliance
review. The smuggler doesn't know this at session start -- the detective-NPC is
just "the new Commission person." Ring members may warn the smuggler (Voss: "routine
check, apparently"), but the true investigation depth remains hidden.
relationships:
- target: "npc:sera-venn"
kind: "friend"
trust: 8
notes: "Pre-existing friend from prior posting. Same institutional background. Social anchor on Sova. Comfortable body language, first-name basis."
- target: "npc:voss"
kind: "colleague"
trust: 1
notes: "Person of interest from case file. Shift supervisor with scheduling authority. Detective approaches with professional formality."
- target: "npc:maret-korr"
kind: "colleague"
trust: 1
notes: "Person of interest. Freight scheduler with manifest access. Requests data, notes reactions."
- target: "npc:drin"
kind: "colleague"
trust: 1
notes: "Person of interest. Dock inspector responsible for container verification. Follow-up on inspection records."
- target: "npc:lera-sessik"
kind: "colleague"
trust: 2
notes: "Bar owner. Met through Sera. Visited once or twice. Professional politeness."
- target: "npc:torek-lintar"
kind: "colleague"
trust: 3
notes: "Commission compliance officer. Recognizes from institutional channels. Professional greeting."
- target: "npc:kael-davan"
kind: "colleague"
trust: 0
notes: "Unknown dock worker at session start. Name might appear on shift roster. No personal knowledge."
- target: "npc:pc-smuggler"
kind: "colleague"
trust: 0
notes: "Unknown dock worker. One of many. No reason to flag at session start. Tells may accumulate over time."
tolerance:
threshold: 7
description: >
Professional patience. Absorbs evasion and hostility without visible reaction.
Processes information internally. The neutral path never pushes tolerance --
the detective-NPC doesn't escalate.
routine:
summary: >
7 routine entries covering full day cycle:
1. Morning arrival (08:00, Terminal entrance) -- shows credentials to Voss, reviews scheduling board.
2. Manifest review (08:30-10:00, Terminal offices) -- requests data from Maret, reviews freight records at terminal.
3. Dock observation (10:00-11:30, dock floor) -- walks the floor, observes operations, takes notes (lattice interaction).
4. Midday break (11:30-12:30, break area or district) -- brief break, may check district geography.
5. Afternoon follow-up (13:00-14:30, Terminal offices) -- follow-up with Drin on inspection records, cross-references manifests.
6. Bar evening (16:00-18:00, The Last Shift) -- meets Sera, sits together, casual conversation, observes room.
7. Departure (18:30) -- returns to temporary quarters, off-screen.
information:
knows:
- "investigation.manifest_discrepancy"
- "world.commission_regulations"
- "world.sova_district_layout"
access_tier: "authority"
contentment:
level: 1
description: >
Professional-cautious. New to the district, isolated in unfamiliar community.
Reliant on Sera for social grounding. Institutional training runs in the
background. Awareness that the district doesn't want them here.
personality:
demeanor: "professional, measured, slightly formal"
social_style: "surnames for targets and unknowns, first names for allies (Sera only). The shift from surname to first name IS a relationship marker"
stress_response: "withdraws to analytical mode, reviews notes via lattice, seeks sightline-advantaged positions"
humor: "wry, observational, appreciates irony from a distance"
tells:
- trigger: "after every conversation"
behavior: "Pauses and interacts with lattice -- recording notes. Brief but consistent pause"
visible_to: "any"
- trigger: "hub exploration"
behavior: "Moves through the hub in methodical pattern. Section by section, not wandering"
visible_to: "any"
- trigger: "investigation routine"
behavior: "Returns to manifest terminal repeatedly. Significant time reviewing data"
visible_to: "any"
- trigger: "throughout session"
behavior: "Stands at corners and elevated positions with good sightlines over dock floor. Watches before approaching"
visible_to: "peripheral"
- trigger: "bar evenings"
behavior: "Consistently gravitates toward Sera. Comfortable body language that other NPCs don't get from the detective"
visible_to: "any"
skills:
combat_trained: false
skills:
investigation: 8
analysis: 9
social: 5
observation: 8
triangle_membership: []
trust_levels:
surface: >
Professional, measured. "Commission Liaison Office -- conducting a routine compliance
review. Standard manifest reconciliation." Institutional language, deliberate blandness.
real: >
Only accessible to Sera. Investigation context, institutional background sharing,
personal doubts about the district. "The briefing said routine. Briefings are
always wrong about something."
secret: >
Investigation mandate, case file details, evidence collected. Never accessible
to the smuggler through normal play.
dual_lens:
smuggler: >
First impression: Commission. Threat. The smuggler's operational awareness flags
authority presence immediately. Color: warm amber (Person of Interest) from first
sighting, or cool teal (Unknown) shifting to amber once Kael or Voss warns the
smuggler.
Tells accumulate: note-taking after every conversation, systematic hub coverage,
manifest terminal fixation (third time today), observation positioning at
sightline-advantaged points, Sera proximity. The smuggler's monologue reads
these as institutional threat escalating from background nuisance to active danger.
Reverse observation notes -- what NPCs say about the detective to the smuggler:
Kael (noticing Commission presence): "There's someone new at the hub. Commission
badge. Keep your head down." [access: insider, trust: real -- ring protective warning]
Voss (to smuggler during shift): "Commission liaison showed up this morning.
Routine check, apparently. Just do your job normally." [access: insider, trust: real
-- operational caution]
Lera (when smuggler arrives at bar): "Your Commission friend is here again.
Came in with Sera." [access: insider, trust: surface -- coded language, "your" is
ironic distance]
Sera (overheard at bar): "The new liaison? Standard posting. Nothing to worry
about." [access: public, trust: surface -- Sera's deflection benefits the ring
indirectly]
Naia (when smuggler sits near her): "Have you noticed the new person at the hub?
Commission, someone said. Kael didn't seem happy about it." [access: peer,
trust: surface -- innocent observation]
Renn (to smuggler during operations): "That investigator's been poking around
manifests. Maret's sweating." [access: insider, trust: real -- ring intelligence]
Maret (to smuggler in corridor): "The Commission officer requested last quarter's
schedules. I gave them the clean set." [access: insider, trust: real -- complicity
confirmation]
detective: >
N/A -- this IS the detective in NPC mode. When the player is the detective,
this file is not loaded.
notes: >
PC-as-NPC entity. Follows the NEUTRAL BEHAVIORAL PATH:
- No dramatic decisions
- No confrontations initiated
- No relationship state changes during session
- No evidence-based confrontations (those are the player's choices)
- No dramatic leverage plays
- No routine deviations
AGENCY BOUNDARIES: The detective-NPC arrives, reviews records, walks the floor,
takes notes, visits the bar with Sera, goes home. They exhibit baseline personality
(professional, formal, observational) and observable tells (note-taking, systematic
movement, manifest fixation). They respond to player interaction with public-tier
dialogue only.
STARTING KNOWLEDGE -- two options:
Option A (default for v0.1): Smuggler has been warned by Voss. Smuggler starts
with KnowsOf about the detective (role: Commission liaison, faction: Commission,
risk: moderate). Color: amber.
Option B: Smuggler not yet warned. First visual sighting triggers knowledge
accumulation. Commission badge visible. Color: teal initially, shifts to amber
once ring members pass the warning.
Smuggler observation monologue triggers (5 lines):
1. "Commission officer just stood there after talking to Voss. Making notes. Not good."
[trigger: observe_npc, note-taking tell]
2. "That investigator is working the hub section by section. Not browsing. Searching."
[trigger: observe_anomaly, systematic movement tell]
3. "Commission's parked at the manifest terminal again. Third time today."
[trigger: observe_anomaly, manifest fixation tell]
4. "They're watching. From the corner, where they can see the whole dock floor. Professional."
[trigger: observe_npc, observation positioning tell]
5. "The investigator and Sera again. Old friends? Or is Sera reporting to them?"
[trigger: observe_npc, Sera proximity tell -- creates doubt about Sera's role]
Public-tier dialogue (if smuggler approaches):
1. Greeting (hub): "Good morning. Commission Liaison Office -- I'm conducting a routine compliance review."
[access: public, trust: surface, situation: greeting]
2. About purpose: "Standard review. Manifest reconciliation, scheduling compliance. Nothing unusual."
[access: public, trust: surface, situation: social]
3. About district: "Only been here a few days. Seems like a well-run operation."
[access: public, trust: surface, situation: social -- deliberate blandness]
4. About Sera: "Ms. Venn? Colleague. We've worked in the same division."
[access: public, trust: surface, situation: social -- professional deflection]
5. Deflection: "I appreciate the interest, but I'm sure you have cargo to route. I won't keep you."
[access: public/authority, trust: surface, situation: confrontation -- polite dismissal]
ITEM COUNT:
- Routine entries: 7
- Relationship stubs (NPCs about detective): 7
- Tell descriptions + monologue triggers: 10 (5 tells x 2)
- Dialogue lines (detective-NPC speaks): 5
- TOTAL: 29 (within ~20-30 budget)
@@ -1,245 +0,0 @@
# PC-as-NPC Profile: The Smuggler (NPC mode, seen by detective player)
# Source: docs/design/pc-as-npc-spec.md section 10
# Ticket: #383 | Blocks: #401 (PC-as-NPC content authoring)
#
# When the player is the detective, this file defines the smuggler's NPC behavior.
# When the player IS the smuggler, this file is not loaded.
canonical_id: "npc:pc-smuggler"
display_name: "Dock Worker"
tier: 2
pattern: "MIRROR"
motivation: "OPERATOR"
description: >
The smuggler as NPC. A dock worker in Sova Transit District who follows the
neutral behavioral path: routine work, break with colleagues, bar after shift.
First playthrough (detective): unremarkable NPC, one of many dock workers.
Second playthrough: "That's me. That's what I was doing." The gap between this
neutral path and the player's actual choices IS the narrative distance traveled.
want:
primary: "Safety"
intensity: 4
description: >
Stability.
Keep the day smooth. Keep the operation running, the team safe, the shift
uneventful. Does not make dramatic decisions on the neutral path.
secret: >
Ring member. Handles cargo routing for the smuggling operation during shift
transitions. The detective doesn't know this at session start. The smuggler-NPC
is just another dock worker until tells accumulate and the detective's analytical
lattice starts connecting patterns.
relationships:
- target: "npc:kael-davan"
kind: "colleague"
trust: 8
notes: "Closest colleague, ring member. First-name basis. 2 years of shared risk. Comfortable physical proximity. Eats lunch together."
- target: "npc:voss"
kind: "superior"
trust: 3
notes: "Shift supervisor, ring-aware. Professional respect, low warmth. Smuggler knows Voss takes a cut."
- target: "npc:lera-sessik"
kind: "friend"
trust: 7
notes: "Bar owner, ring-aware. Regular at The Last Shift. Lera saves the smuggler's usual seat."
- target: "npc:renn"
kind: "colleague"
trust: 5
notes: "Courier, ring member. Operational relationship. Smuggler knows Renn's routes."
- target: "npc:naia-tamm"
kind: "friend"
trust: 4
notes: "Kael's partner. Known through Kael. Occasional bar interaction."
- target: "npc:maret-korr"
kind: "colleague"
trust: 4
notes: "Freight scheduler. Hub colleague. Smuggler knows Maret handles scheduling."
- target: "npc:drin"
kind: "colleague"
trust: 3
notes: "Dock inspector. Compromised -- looks the other way for the ring."
- target: "npc:torek-lintar"
kind: "colleague"
trust: 2
notes: "Bar regular, ring-adjacent. Conspicuous spending. Smuggler keeps distance."
- target: "npc:sera-venn"
kind: "colleague"
trust: 0
notes: "Commission field tech. Smuggler recognizes Sera as Commission. Keeps distance. No personal relationship."
- target: "npc:pc-detective"
kind: "colleague"
trust: -2
notes: "Commission liaison. Threat. Smuggler-NPC does not initiate contact with the detective. If approached, gives polite minimum responses."
tolerance:
threshold: 6
description: >
Steady under pressure but protective of colleagues. Threat to the team triggers
immediate defensive instinct. The neutral path keeps tension below threshold.
No dramatic choices, no confrontations.
routine:
summary: >
7 routine entries covering full day cycle:
1. Morning arrival (05:45, Terminal entrance) -- checks schedule board.
2. Morning work (06:00-10:00, dock floor) -- cargo processing, interacts with Kael and dock workers.
3. Break (10:00-10:30, break area) -- eats with Kael and Renn, conversation.
4. Afternoon work (10:30-14:00, dock floor) -- container routing, schedule coordination with Voss.
5. Shift transition (14:00-14:20) -- cleans station, briefly checks service corridor.
6. Bar evening (15:00-17:00, The Last Shift) -- drinks with Kael at regular table, casual conversation with Lera.
7. Departure (17:30) -- goes home, off-screen.
information:
knows:
- "contraband.ring_exists"
- "contraband.lattice_components"
- "contraband.supply_chain"
- "location.corridor_b7_restricted"
- "location.smuggling_route"
- "location.surveillance_gaps"
- "location.dead_drop_location"
- "investigation.manifest_discrepancy"
- "investigation.shift_mismatch"
- "investigation.cargo_anomaly"
- "world.shift_schedule"
- "relationship.ring_membership"
access_tier: "insider"
contentment:
level: 3
description: >
Comfortable-tense. The job pays, the team is solid, the risk is managed.
Not happy, not miserable. Managing a life with two faces. The money eases
the financial pressure that makes station life tight for most workers.
personality:
demeanor: "casual, guarded around authority figures"
social_style: "first-name basis with everyone, relational, physically present"
stress_response: "goes quiet, checks exits, shortens interactions"
humor: "dry, situational, dark when stressed"
tells:
- trigger: "entering new area (every transition between areas)"
behavior: "Pauses at intersections, glances down corridors before entering"
visible_to: "any"
- trigger: "shift transition window (14:00-14:20)"
behavior: "Movement becomes more purposeful. Straighter route, fewer idle pauses"
visible_to: "any"
- trigger: "near authority figures or checkpoints"
behavior: "Pace increases slightly when passing Commission-tagged NPCs or security checkpoints"
visible_to: "peripheral"
- trigger: "break periods and bar time"
behavior: "Gravitates toward Kael, Renn, and other ring members. Tight social cluster, same table every shift"
visible_to: "any"
- trigger: "near flagged cargo containers during work routine"
behavior: "Gaze lingers on specific containers. Brief second interaction with freight system during routing"
visible_to: "forward"
skills:
combat_trained: false
skills:
cargo_handling: 8
logistics: 7
stealth: 5
social: 6
triangle_membership:
- "hub-power"
- "worried-partner"
trust_levels:
surface: >
Polite, guarded. Standard dock worker responses. "Cargo routing. Containers come
in, I process them out. Standard stuff."
real: >
Only accessible to ring insiders. Operational talk, schedule windows, route
planning. "4471's routed for transfer at 14:30. Voss kept the window clear."
secret: >
Ring knowledge, Kael's situation, supply chain details. Never accessible to
the detective through normal play.
dual_lens:
smuggler: >
N/A -- this IS the smuggler in NPC mode. When the player is the smuggler,
this file is not loaded.
detective: >
First impression: unremarkable dock worker, one of many. Color: cool teal
(Unknown/Neutral) at session start. Tells accumulate with repeated observation:
corridor checking, shift-transition behavior change, security-proximity tension,
social clustering with same 3 people, cargo attention on specific containers.
The detective's monologue flags these as professional curiosity escalating to
suspicion. Color may shift to warm amber (Person of Interest) if tells compound.
Reverse observation notes -- what NPCs say about the smuggler to the detective:
Kael (when asked about dock workers): "The crew's solid. Good people. We look
out for each other." [access: public, trust: surface -- won't name names]
Kael (when pressed): "Just a dock worker. Does their shift, goes home. Not much
to tell." [access: authority, trust: surface -- deflection]
Voss (when asked about shift crew): "Everyone's got their routine. No complaints
from that crew." [access: authority, trust: surface -- institutional wall]
Lera (when asked about dock workers at bar): "We get all sorts in here after
shift. Working people. Tired, mostly." [access: public, trust: surface --
protective generality]
Naia (when talking about Kael's friends): "Kael's got good colleagues. They
eat lunch together most days." [access: public/peer, trust: surface -- genuine]
Maret (when detective reviews crew records): "That name's on the morning shift
roster. Standard cargo handling cert." [access: authority, trust: surface]
Torek (overheard at bar): "Dock crew's always here after shift. The usual
crowd." [access: public, trust: surface -- background noise]
notes: >
PC-as-NPC entity. Follows the NEUTRAL BEHAVIORAL PATH:
- No dramatic decisions
- No confrontations initiated
- No relationship state changes during session
- No contradiction discovery (that's the player's experience)
- No triangle fork reactions
- No routine breaks without cause
AGENCY BOUNDARIES: The smuggler-NPC works, eats, drinks, goes home. They exhibit
baseline personality (casual, first names) and observable tells (corridor awareness,
shift-transition alertness). They respond to player interaction with public-tier
dialogue only.
Detective observation monologue triggers (5 lines):
1. "That dock worker checks the corridor before turning. Habitual. Military? Or just careful."
[trigger: observe_npc, corridor awareness tell]
2. "Movement pattern changed at shift change. More direct. Less idle. Interesting."
[trigger: observe_anomaly, shift-transition tell]
3. "Slight acceleration past the checkpoint. Most people do it. But this one does it every time."
[trigger: observe_anomaly, security-proximity tell]
4. "Same three people at the same table. Every shift. Consistent social group."
[trigger: observe_npc, social clustering tell]
5. "That worker checked container 4471 twice. The same container that's in my manifest discrepancy file."
[trigger: observe_anomaly, cargo attention tell -- gates on investigation.manifest_discrepancy KnowsOf]
Public-tier dialogue (if detective approaches):
1. Greeting (hub): "Morning. Can I help you with something?"
[access: public, trust: surface, situation: greeting]
2. About work: "Cargo routing. Containers come in, I process them out. Standard stuff."
[access: public/authority, trust: surface, situation: investigation]
3. About the hub: "It's a freight hub. Busy during shifts, quiet after. Same as any logistics operation."
[access: public, trust: surface, situation: social]
4. About colleagues: "Good crew. We do our shifts, go home. Nothing exciting."
[access: public/authority, trust: surface, situation: investigation]
5. Deflection: "Look, I just move containers. You'd want to talk to Voss about scheduling."
[access: authority, trust: surface, situation: confrontation -- deflects to Voss]
ITEM COUNT:
- Routine entries: 7
- Relationship stubs (NPCs about smuggler): 7
- Tell descriptions + monologue triggers: 10 (5 tells x 2)
- Dialogue lines (smuggler-NPC speaks): 5
- TOTAL: 29 (within ~20-30 budget)
@@ -1,154 +0,0 @@
# NPC Profile: Pell Torssen
# Source: wiki/characters/pell.md
# Tier 2 | CATALYST + TURNCOAT | Ring member, potential informant
canonical_id: "npc:pell"
display_name: "Pell Torssen"
tier: 2
pattern: "CATALYST"
motivation: "TURNCOAT"
description: >
Ring member, 35, handles inventory tracking and distribution scheduling for
smuggled goods. Freelance logistics consulting as cover. Pell is cracking. The
ring seemed manageable when small-scale — now the volume is escalating, the
Commission liaison rotation gap is closing, and the risk-to-reward ratio has
inverted. Pell is considering cooperation with authorities but doesn't know how,
whom to trust, or what happens if the ring finds out. An informant looking for
a handler.
want:
primary: "Freedom"
intensity: 9
description: >
Get out without getting killed.
Pell is past the point of wanting to stay. The escalating volume, the increasing
risk, the paranoia — the ring has gone from manageable supplement to existential
threat. Secondary want: find someone — anyone — who can offer protection in
exchange for information. The detective is the obvious candidate, but Pell
doesn't know the detective exists yet. Drin is an institutional contact, but
Drin is compromised through Harek's debt. The irony is thick.
secret: >
Surface: ring member — known to the ring, not known to the detective or civilians.
Deep: Pell is considering turning informant. This is the most dangerous secret in
the district. If Nils or Devra confirm Renn's suspicion, Pell is dead or
disappeared. If Pell successfully cooperates with the detective, the ring
collapses. Vulnerability: isolation — no allies in this decision. The ring would
kill him. The authorities don't know he exists.
relationships:
- target: "npc:renn"
kind: "colleague"
trust: 2
notes: "Fellow ring member. Renn suspects Pell is unreliable and has reported this to Devra. Pell senses the increased scrutiny without understanding its source. The relationship has chilled."
- target: "npc:devra"
kind: "superior"
trust: 2
notes: "Ring coordinator. Pell receives scheduling instructions from Devra. Devra is watching Pell more closely since Renn's report. Pell feels the pressure."
- target: "npc:drin"
kind: "colleague"
trust: 3
notes: "Dock inspector. Pell has considered approaching Drin for institutional help — unaware that Drin is compromised through Harek's gambling debt. This potential contact is a trap Pell doesn't see."
tolerance:
threshold: 1
description: >
Exceeded. Pell is past his tolerance. The escalating volume, increasing risk, and
paranoia have pushed him beyond functional tolerance. Operating on anxiety and
habit, not commitment. Any external pressure — the detective asking the right
question, Renn confronting him, Nils summoning him — could trigger the break.
routine:
summary: >
5 routine entries covering variable day:
1. Freelance work (09:00-12:00) — legitimate small logistics contracts, sporadic.
2. Variable midday (12:00-15:00) — bar occasionally, residential pod, wandering.
3. Ring communication (15:00-19:00) — lattice-based, encrypted, scheduled by
Devra.
4. Ring coordination meetings (night, bar back room) — 1-2x per week.
5. Routine deviations increasing: skipping meetings, failing to respond to
lattice messages promptly, avoiding locations where ring members congregate.
information:
knows:
- "contraband.ring_exists"
- "contraband.lattice_components"
- "contraband.supply_chain"
- "relationship.ring_membership"
- "relationship.trust_network"
- "location.smuggling_route"
access_tier: "insider"
contentment:
level: -5
description: >
Very low — crisis level. The ring went from manageable supplement to existential
threat. Every interaction with ring members feels dangerous. Every stranger could
be an investigator. Every lattice message could be a summons. A measure of how
far someone can fall when the thing that was supposed to help them becomes the
thing that threatens to destroy them.
personality:
demeanor: "anxious, overthinking, struggling to maintain composure"
social_style: "increasingly withdrawn, avoids ring social spaces, irregular availability"
stress_response: "paranoid behavior — checking over shoulder, scanning entrances, avoiding eye contact"
humor: "absent — anxiety has consumed the space where humor lived"
tells:
- trigger: "ring coordination meeting scheduled"
behavior: "Misses meetings or arrives late — anxiety and avoidance increasing"
visible_to: "any"
- trigger: "in public spaces"
behavior: "Nervous behavior — checking over shoulder, scanning entrances, avoiding eye contact with regulars"
visible_to: "any"
- trigger: "expected at scheduled location"
behavior: "Irregular schedule — unpredictable location, unreliable availability, routine becoming erratic"
visible_to: "peripheral"
skills:
combat_trained: false
skills:
logistics: 7
inventory_management: 7
encrypted_communication: 5
triangle_membership:
- "informant-question"
trust_levels:
surface: >
Freelance logistics consultant. Nervous but functional. "I'm fine. Just — a lot
on my mind. Freelance work's been slow. You know how it is."
real: >
Ring operational details — inventory levels, distribution schedules, client lists,
timing windows, which operations are sloppiest, which members are essential.
Knows the ring's vulnerabilities from inside.
secret: >
Willing to trade everything he knows for protection. "If I talk — if I tell you
what I know — can you protect me? Not just a promise. Actual protection. Because
the people I'd be talking about don't forgive."
dual_lens:
smuggler: >
The biggest internal threat. The smuggler reads Pell's anxiety as instability —
a wavering member who might bring the whole operation down. The decision: support
Pell, report to Nils, or try to calm him down. "Pell missed another meeting.
Renn's right — something's off. If Pell talks, we're all exposed."
detective: >
Initially invisible — freelance consultant at the bar. But behavioral signals
(nervousness, irregular schedule, isolation) read as someone under pressure. If
the detective can identify and approach Pell before the ring acts, Pell becomes
the case's keystone witness. "The consultant — Pell. No fixed schedule. Nervous.
Avoids eye contact. Either antisocial or scared. If they're scared, I need to
know of whom."
notes: >
CATALYST + TURNCOAT: maximum instability. "When Pell breaks, everything moves."
Pell's disruption (CATALYST) is driven by deliberate loyalty shift (TURNCOAT),
making him the ring's existential threat. Other catalysts (Torek, Resha, Olin)
disrupt accidentally; Pell's disruption is the consequence of a conscious decision
to betray. For the smuggler, the decision to support, report, or manage Pell
defines the operation's future. For the detective, finding Pell before the ring
acts means gaining the keystone witness. Timing is everything, and Pell's anxiety
is the countdown.
@@ -1,63 +0,0 @@
# NPC Profile: Ren Tosse
# Tier 3 — NOBODY / CIVILIAN
# Flat NPC — noise floor. Drifter with no ring connection.
# Asks too many questions about cargo schedules. Is just looking for work.
# Ticket: #307 | Sprint: 12
canonical_id: "npc:ren"
display_name: "Ren Tosse"
tier: 3
pattern: "NOBODY"
motivation: "CIVILIAN"
description: >
Day worker, early 30s. Comes through Sova Transit on irregular rotations —
picks up freight work when it's available, moves on when it isn't. Knows the
station the way drifters do: which bays are short-handed, which supervisors
ask fewer questions, what the bar's cheap nights are. Has a worn transit bag
and a slightly too-casual awareness of exits — not operational awareness,
just the low-level situational alertness of someone who has moved through
too many unfamiliar stations. Genuinely unremarkable. No ring connection,
no secrets. Asks too many questions about night rotations and cargo schedules
because that's how you find short-handed bays.
want:
primary: "Wealth"
description: >
Regular work. Enough to stop moving for a while. Sova's a decent stop —
the freight work is steady when it comes through.
routine:
summary: >
Arrives after 10:00 when the day shift is settled. Checks the job board
at the terminal entrance. Wanders to The Last Shift for a drink and
whatever bar conversation yields useful shift information. Leaves by late
afternoon unless day work came through. Pattern is irregular by design —
no fixed schedule because there's no fixed role.
personality:
demeanor: "casual, observant, asks questions as if entitled to answers"
social_style: "sociable enough to get information, quiet when there's nothing useful"
stress_response: "moves on. There's always another station."
tells: []
skills:
combat_trained: false
skills:
cargo_handling: 6
freight_routing: 5
trust_levels:
surface: >
Passing through, looking for work. "Sova seems decent. Depends on
the freight situation."
notes: >
NOBODY + CIVILIAN: pure noise floor. The "seems important but isn't" quality
comes from drifter behavior patterns that mimic operative reconnaissance:
asking about night rotations, checking cargo schedules, casual interest in
specific bays. All genuine job-seeking. One memorable observable trait:
worn transit bag with tags from three different station systems, slightly
too-casual awareness of exits. Paula owns the trait design. Mellanie owns
the lines (#307).
@@ -1,154 +0,0 @@
# NPC Profile: Renn Harsk
# Source: wiki/characters/renn.md
# Tier 2 | THRESHOLD + OPERATOR | Ring courier
canonical_id: "npc:renn"
display_name: "Renn Harsk"
tier: 2
pattern: "THRESHOLD"
motivation: "OPERATOR"
description: >
Courier for the smuggling ring, 26 years old. Moves contraband between freight
bay, storage, and handoff points through maintenance corridors during Meridian
dead spots. Legitimate cover as cargo runner at the logistics hub. Young, fit,
takes pride in the execution. Renn is the physical movement in the operation —
when Kael routes a flagged container, Renn transfers the contraband to Corridor
B-7 or the bar's back room. Also the person who reported suspicion about Pell's
wavering to Devra.
want:
primary: "Power"
intensity: 6
description: >
Prove loyalty to the ring and earn trust.
Stay useful without getting caught.
Renn is the physical courier — lifting, carrying, timing runs through
maintenance corridors during Meridian dead spots. Takes pride in the execution.
The job feels important. Secondary want: prove loyalty to Nils and Devra. Renn
came into the ring through a friend-of-a-friend introduction. Still earning
trust. The courier routes are his proving ground.
secret: >
Surface: ring member who moves contraband through maintenance corridors. Known
to ring, unknown to detective initially. Deep: Renn suspects Pell is unreliable
and has reported this to Nils through Devra. This creates internal ring tension —
Renn has effectively marked Pell as a threat, which may trigger Nils to act.
Vulnerability: physical exposure — Renn is the person most likely to be caught
in the act, carrying contraband through corridors during off-hours.
relationships:
- target: "npc:kael-davan"
kind: "colleague"
trust: 5
notes: "Ring colleague. Kael routes containers; Renn moves them. Functional respect, not close personally. Renn admires Kael's competence."
- target: "npc:pell"
kind: "colleague"
trust: 1
notes: "Fellow ring member. Renn distrusts Pell's reliability and has reported concerns. Dangerous dynamic — Renn may be right or may be paranoid."
- target: "npc:devra"
kind: "superior"
trust: 5
notes: "Ring coordinator. Renn receives timing instructions from Devra. Professional — Devra values Renn's reliability."
- target: "npc:tav"
kind: "colleague"
trust: 4
notes: "Ring lookout. Tav signals Renn during operations. Operational coordination."
tolerance:
threshold: 5
description: >
Moderate. Renn can handle physical risk and operational pressure. What he cannot
handle: being abandoned. If the ring distances itself from Renn because he's
exposed or expendable, his loyalty inverts. A courier who feels discarded is a
courier who talks.
routine:
summary: >
4 routine entries covering full day cycle:
1. Day shift (06:00-14:00) — cargo runner at logistics hub, legitimate freight
movement. Provides cover for knowing facility layout and timing.
2. Off-duty (14:00-22:00) — home, occasionally bar. Not a regular. Keeps low
profile between operations.
3. Night operations (22:00-01:00, 1-2x per week) — moves flagged cargo from
temporary storage to Corridor B-7 or bar back room via maintenance corridors
and Meridian dead spots.
4. Avoids the bar on operation nights — doesn't want to be placed at a social
venue when he should be unaccounted for.
information:
knows:
- "contraband.ring_exists"
- "location.corridor_b7_restricted"
- "location.smuggling_route"
- "location.surveillance_gaps"
- "location.dead_drop_location"
- "relationship.ring_membership"
- "world.shift_schedule"
access_tier: "insider"
contentment:
level: 2
description: >
Moderate. Young and feels like he's going somewhere. Ring money supplements
his cargo runner salary. The work is exciting in a way the legitimate job
isn't. Precarious — depends entirely on the ring's stability.
personality:
demeanor: "alert, loyal, suspicious"
social_style: "low-profile, trusts slowly, watches people"
stress_response: "hyperaware of spatial surroundings, patrol timing, corridor traffic"
tells:
- trigger: "courier run in progress"
behavior: "Present in maintenance corridors during off-hours — carrying cargo where he shouldn't be"
visible_to: "any"
- trigger: "monitoring Pell"
behavior: "Watches Pell's behavior — surveillance posture, tracking Pell's movements and attendance"
visible_to: "peripheral"
- trigger: "operation night"
behavior: "Absent from the bar — doesn't want to be placed at a social venue during active operations"
visible_to: "peripheral"
skills:
combat_trained: false
skills:
cargo_handling: 7
corridor_navigation: 8
spatial_awareness: 7
timing_coordination: 6
triangle_membership:
- "informant-question"
trust_levels:
surface: >
Cargo runner at the hub. Keeps to himself. "Route's on schedule. Standard
freight. Nothing to report."
real: >
Knows corridor routes, Meridian dead spots, timing windows, handoff procedures.
Kael's routing patterns, Devra's coordination timing. Pell's behavior changes.
secret: >
Has reported Pell as a potential informant threat. The ring's immune response
started with Renn's suspicion.
dual_lens:
smuggler: >
Known quantity — the runner, the courier, the physical movement. Reliable, stays
quiet. If Renn says Pell's a problem, Pell's a problem. "Renn's reliable. Runs
clean, stays quiet."
detective: >
Initially invisible — another cargo runner. But tracking movement patterns in
maintenance corridors during off-hours reveals Renn as the NPC who appears where
he shouldn't be. "Cargo runner. Night shift movement in restricted corridors
doesn't match his posted schedule. Following up."
notes: >
THRESHOLD + OPERATOR: the physical gatekeeper. "Renn moves the product. Trace
Renn, find the route." Controls access to the smuggling route (THRESHOLD) and
personally executes the movement (OPERATOR). Unlike Devra's organizational
gatekeeping, Renn's threshold is physical — he is the body in the corridor with
the contraband. Catching Renn in a dead spot with cargo is the most direct path
to blowing the operation. His vulnerability is his visibility: a person moving
cargo through restricted corridors during off-hours is the most catchable link
in the chain. Also the ring's immune response — reporting Pell's wavering.
@@ -1,150 +0,0 @@
# NPC Profile: Resha Neven
# Source: wiki/characters/resha.md
# Tier 2 | CATALYST + CIVILIAN | Logistics Hub new hire dock worker
canonical_id: "npc:resha"
display_name: "Resha Neven"
tier: 2
pattern: "CATALYST"
motivation: "CIVILIAN"
description: >
New hire dock worker at the Sova Transit District Logistics Hub, three months into
her first permanent position. Age 23, came from short-term contract work in other
districts — unstable, underpaid, no community. Eager, observant, transparent. Asks
questions about locked bays, irregular schedule changes, and containers that appear
on manifests but are not in the bay. She does not know she is asking about the
ring's operations — she is asking because the procedures she was taught do not
match what she observes.
want:
primary: "Power"
intensity: 5
description: >
Prove herself at the job.
Resha wants to be competent, reliable, valued. She studies shift protocols,
asks questions about procedures, and takes notes. Some of those questions —
about locked bays, irregular schedule changes, containers with routing codes
she was not trained on — are innocently dangerous. She does not know she is
probing the ring's infrastructure. She is trying to learn her job.
secret: >
None in the traditional sense. Resha has nothing to hide. Her significance is
not what she conceals but what she notices — her curiosity about procedural
inconsistencies makes her a risk to the ring and a potential asset to the
detective, neither of which she is aware of. Vulnerability is naivety: she
does not understand which questions are dangerous.
relationships:
- target: "npc:voss"
kind: "superior"
trust: 5
notes: "Shift supervisor. Resha respects authority and tries to please Voss. Voss is professionally competent with her but wants her to stop asking about irregularities."
- target: "npc:kael-davan"
kind: "colleague"
trust: 7
notes: "Senior colleague. Kael is patient with Resha — shows her the ropes, answers procedural questions, covers for her mistakes. Resha looks up to Kael."
- target: "npc:maret-korr"
kind: "colleague"
trust: 5
notes: "Freight scheduler. Maret gives Resha scheduling data and is protective in a quiet, professional way. Resha's questions about manifest discrepancies echo Maret's own concerns."
tolerance:
threshold: 3
description: >
Low, untested. Resha has never been in a situation where loyalty conflicts with
safety. If directly threatened or warned to stop asking questions, she would be
scared and confused. She does not have the experience to navigate institutional
pressure.
routine:
summary: >
4 routine entries covering full day cycle:
1. Day shift (06:00-14:00) — cargo handling, bay allocation assistance, learning
procedures.
2. Break (10:30-11:00, break room) — often with Kael or other dock workers.
3. Post-shift (14:00-15:00) — sometimes stays late studying shift protocols.
4. Off-duty (15:00+) — home (Residential Radial B) or occasionally the bar,
still establishing social connections.
information:
knows:
- "world.shift_schedule"
access_tier: "public"
contentment:
level: 5
description: >
Moderate-high, optimistic. Resha is happy to have a stable job. The community
is welcoming enough. The work is hard but meaningful. Her contentment is that
of someone at the beginning of something — not yet disillusioned.
personality:
demeanor: "eager, open, earnest"
social_style: "asks questions freely, takes notes, defers to experienced colleagues"
stress_response: "looks to authority figures for guidance, goes quiet when confused"
humor: "warm, slightly nervous — laughs easily when comfortable"
tells:
- trigger: "encounters a procedure she was not trained for"
behavior: "Asks questions about locked bays, irregular schedules, or unmanifested containers. Innocently dangerous."
visible_to: "any"
- trigger: "recording procedures and observations"
behavior: "Takes notes on her lattice — standard for a new hire, but the data she captures includes anomalies."
visible_to: "peripheral"
- trigger: "uncertain about a procedure or social situation"
behavior: "Looks to Kael for guidance. Visible deference and trust."
visible_to: "any"
skills:
combat_trained: false
skills:
cargo_handling: 4
bay_allocation: 3
manifest_reading: 3
observation: 5
triangle_membership: []
trust_levels:
surface: >
Eager new hire. Open and transparent. Asks procedural questions without guile.
"The Bay 7 manifest doesn't list that container. Should I flag it, or is that
a late addition?"
real: >
Genuinely confused by the gap between training and reality. Starting to notice
that some questions make people uncomfortable but does not understand why.
"Voss changed the afternoon rotation again. Is that normal?"
secret: >
No hidden agenda. What you see is what there is — a new worker trying to learn
a job that turns out to be stranger than the training manual described.
dual_lens:
smuggler: >
Resha is a variable. Her questions are innocent but dangerous. The smuggler
reads Resha as someone who needs to be managed — either brought into confidence
(risky) or steered away from sensitive areas (ongoing effort). "Resha's asking
about Bay 7 again. Someone needs to teach her that not every question needs
an answer."
detective: >
Resha is a fresh pair of eyes. Uncompromised, observant, and unaware of the
social pressures that keep everyone else silent. Her observations carry no
political filtering — whatever Resha noticed, she noticed because it was
genuinely anomalous. "New hire. Three months. Still asking questions the
veterans stopped asking years ago. Either naive or useful. Possibly both."
notes: >
CATALYST + CIVILIAN: innocent disruption. She just asked and everyone flinched.
Resha disrupts through pure curiosity, which makes her impossible to manage
through normal channels. You cannot tell a new hire to stop asking procedural
questions without explaining why — and the explanation is the thing that must
stay hidden.
Key authoring guidance: Resha is not an investigator. She is a new employee
learning a corrupted system honestly. Write her questions as genuine, her
confusion as real, her eagerness as endearing. The tension comes from the
ring's reaction to her, not from anything Resha does deliberately.
Not a formal triangle member. Her function is atmospheric and catalytic — her
questions create pressure on Voss and Kael, and her presence reminds the hub
that the operation is only invisible to people who have learned not to look.
@@ -1,104 +0,0 @@
# NPC Profile: Sabel Hersk
# Source: wiki/characters/sabel.md
# Tier 3 — reduced content, essential axes only
canonical_id: "npc:sabel"
display_name: "Sabel Hersk"
tier: 3
pattern: "GHOST"
motivation: "OPERATOR"
description: >
The ring's off-station contact — external supplier who sends contraband
(unlicensed lattice components, medical-grade neural replacements) through
legitimate freight shipments to Sova. Operates from elsewhere in the Krenn
System. Relationship with Devra is purely transactional. Not directly
observable — referenced in lattice communications, cargo manifests, and
ring members' dialogue.
want:
primary: "Wealth"
description: >
Profit.
Deliver. Get paid. Maintain the supply chain. If the operation on Sova is
compromised, Sabel cuts the connection and finds another distribution point.
secret: >
Sabel views the Sova ring as replaceable infrastructure. If the operation
is compromised, Sabel severs the connection without warning and redirects
supply to another distribution point.
routine:
summary: >
Not directly observable. Sabel appears in lattice communications (Devra's
coordination), in cargo manifests (origin codes), and in ring dialogue.
Physical presence limited to at most 1-2 brief visits during the vertical
slice — enough to be observed, not enough to be interrogated.
personality:
demeanor: "professional, efficient, impersonal"
social_style: "transactional only — no personal investment in the local team"
stress_response: "cuts connections, finds alternatives"
relationships:
- target: "npc:devra"
kind: "colleague"
trust: 5
notes: "On-station coordinator. Sabel confirms transit timing, Devra coordinates local pickup. Professional respect, no warmth."
tolerance:
threshold: 4
description: >
Low tolerance for operational risk. Sabel does not absorb pressure — at
the first sign of compromise, the connection is cut. Self-preservation
over loyalty.
information:
knows:
- "contraband.supply_chain"
- "contraband.lattice_components"
- "contraband.medical_grade"
access_tier: "insider"
contentment:
level: 2
description: >
Functional satisfaction. The business works, the money flows. No
emotional investment in the Sova operation or its people.
tells:
- trigger: "during rare on-station visits"
behavior: "Moves with purpose, avoids social spaces, conducts business and leaves"
visible_to: "any"
skills:
combat_trained: false
skills:
logistics: 7
stealth: 5
trust_levels:
surface: >
Not accessible. Sabel does not engage with people outside the operation.
real: >
Operational only. Transit confirmations, shipment schedules, cargo
specs. "Transit confirmed for 22:00. Standard package. Don't be late."
secret: >
The wider supply network — where the contraband originates, who else
Sabel supplies, how deep the upstream operation runs. Not accessible
in v0.1.
dual_lens:
smuggler: >
Supply source. Professional respect. Sabel's reliable — the timing is
always clean. Whatever happens on this end, the supply keeps coming.
detective: >
Data point. Ghost. Origin codes on flagged manifests trace to off-station.
Someone is sending this cargo. Finding who could crack the upstream network.
notes: >
Upstream connection. The thread leading from the local smuggling operation
to the wider criminal supply chain. Sabel represents the layer above the
local ring — the bigger operation that views Sova as replaceable
infrastructure. Coldness is narrative content: the ring is disposable
to its supplier.
@@ -1,255 +0,0 @@
# NPC Profile: Sera Venn — THE FRIEND (Detective)
# Source: wiki/characters/sera-venn.md
# Tier: 1 | Pattern: FRIEND | Motivation: WITNESS
# Triangles: worried-partner
canonical_id: "npc:sera-venn"
display_name: "Sera Venn"
tier: 1
pattern: "FRIEND"
motivation: "WITNESS"
description: >
Lattice Commission field technician, 31 years old, posted to Sova Transit
District 14 months ago after a stressful border-system relay. The detective's
pre-existing institutional contact and closest personal ally in the district.
Sera is warm, competent, available — and sitting on unreported evidence. She ran
an unauthorized compliance check on Kael Davan's freight handling records after
her friend Naia confided worry about Kael's behavior. What she found (manifest
discrepancies tied to Kael's shifts) pointed to something she didn't want to see.
Reporting it destroys Naia's life. Not reporting it means Sera is concealing
evidence from the detective she calls a friend. The quiet life she wanted is gone.
want:
primary: "Connection"
intensity: 8
description: >
Keep her life stable and her friendships intact.
Sova was supposed to be quiet — routine calibration checks, scheduled
inspections, paperwork. For 12 months, it was exactly that. Then Naia started
confiding about Kael's late nights, and Sera's competence made her curious, and
her curiosity made her compromised. Secondary want: protect Naia from the
consequences of what Sera has discovered. Every helpful tip Sera shares with the
detective is shadowed by the evidence she's withholding.
secret: >
Sera ran an unauthorized compliance check on Kael Davan's freight handling records
after Naia confided worry about Kael's behavior. She found manifest discrepancies
tied to Kael's shifts — containers that don't reconcile with incoming freight
manifests. She also found that the irregularities correlate with shifts where
Torek Lintar handles dock inspections. This is reportable evidence. Sera has not
reported it. She has been sitting on this information for approximately 6 weeks,
protecting Naia from the consequences. If the detective discovers the concealment,
Sera faces institutional consequences. If the ring discovers a Commission employee
has flagged their manifests, Sera is in physical danger. If Naia learns Sera
investigated Kael behind her back, the friendship is damaged regardless of motive.
relationships:
- target: "npc:pc-detective"
kind: "friend"
trust: 8
notes: >
Pre-existing institutional contact. Trained at adjacent postings, overlapped
on a compliance sweep two years ago. Genuine mutual respect. When the detective
arrives, Sera is genuinely glad — a familiar face who speaks her language.
Now keeping evidence from the detective. Every helpful tip is contaminated by
what she's NOT sharing.
- target: "npc:naia-tamm"
kind: "friend"
trust: 9
notes: >
Closest friend on the station, 10 months. Met at the bar. Naia teaches
station kids, represents the community Sera embedded herself in. Naia confided
worry about Kael — this triggered the compliance check. Sera now knows more
about Kael than Naia does and can't share it.
- target: "npc:torek-lintar"
kind: "colleague"
trust: 1
notes: >
Avoidance target. Sera's compliance check found manifest irregularities
correlating with Torek's inspection shifts. Being near Torek while sitting on
evidence about his patterns feels like compounding risk. Sera leaves the bar
when Torek arrives — the avoidance pattern IS the contradiction.
- target: "npc:lera-sessik"
kind: "friend"
trust: 5
notes: "Bar regular at The Last Shift. Lera knows Sera as a quiet Commission employee who tips well and keeps to her corner booth."
tolerance:
threshold: 7
description: >
High — disciplined and emotionally controlled. Tolerates institutional isolation,
minor ethical compromises, and the cognitive dissonance of helping the detective
while hiding evidence. What pushes toward breaking: the detective asking about
manifest discrepancies, Naia's worry escalating into action, Torek's spending
becoming more visible. What breaks her: direct confrontation from the detective
with evidence of concealment (Sera can't lie to the detective's face), Naia
being hurt by consequences Sera tried to prevent, institutional pressure from
Commission noticing the unfiled check.
routine:
summary: >
7 routine entries covering full day cycle:
1. Morning diagnostics (07:30-08:00) — Commission kiosk, Level 3, calibration
checks.
2. Field rounds (08:00-12:00) — compliance verification at hub equipment, bar
terminal, residential nodes.
3. Lunch (12:00-13:00) — vendor near logistics hub.
4. Afternoon rounds (13:00-15:00) — report filing at Commission kiosk.
5. Off-shift transition (15:00-15:30) — residential pod.
6. Bar hours (15:30-18:00, The Last Shift) — early-evening regular, meets Naia,
corner booth.
7. Home or quiet return (18:00-22:00).
Deviations: leaves bar abruptly when Torek arrives (contradiction pattern —
three occurrences). Increased helpfulness to detective (overcompensation).
Extended time at Commission kiosk (compulsive rechecking). Avoids hub during
shifts where Kael's discrepancies concentrate.
information:
knows:
- "investigation.manifest_discrepancy"
- "investigation.shift_mismatch"
- "relationship.kael_naia_connection"
- "world.shift_schedule"
- "world.sova_district_layout"
access_tier: "peer"
contentment:
level: -1
description: >
Moderate, declining. Was content — Sova was the calm posting she needed. Routine,
a friend, social life at the bar. The compliance check changed everything. Can't
un-know what she found. Every evening at the bar shadowed by concealed evidence.
Every conversation with Naia a reminder of why. Every interaction with the
detective a test of how much longer she can sustain it.
personality:
demeanor: "competent, slightly wry, conversational but precise"
social_style: "professional warmth — explains things, provides context, frames information"
stress_response: "controlled presentation, redirects rather than goes silent — the redirect itself is the tell"
humor: "dry when relaxed, absent when managing concealment"
tells:
- trigger: "Torek Lintar enters the bar"
behavior: "Makes an excuse and leaves within 2-3 minutes. Three different excuses across the vertical slice — early shift, headache, kiosk check. The timing doesn't vary."
visible_to: "any"
- trigger: "detective asks about the district"
behavior: "Volunteers extra information — names, routines, background context. Overcompensation for what she's withholding."
visible_to: "forward"
- trigger: "anyone mentions freight, manifests, or compliance"
behavior: "Changes subject smoothly. Topic deflection — steers away from Kael-adjacent topics."
visible_to: "forward"
- trigger: "after hours or between shifts"
behavior: "Extended time at Commission kiosk — rechecking compliance data, compulsive verification she hasn't been caught."
visible_to: "peripheral"
skills:
combat_trained: false
skills:
lattice_diagnostics: 8
compliance_documentation: 7
data_analysis: 7
social_intelligence: 6
triangle_membership:
- "worried-partner"
trust_levels:
surface: >
Warm Commission field tech. Shares district background freely — who the regulars
are, shift schedules, maintenance corridor shortcuts. "There you are. Grab a
seat — Naia was here earlier. Lera's doing that thing with the grain spirit
again. Don't ask, just trust me and order the ale."
real: >
Institutional access — manifest cross-referencing, lattice registration queries,
compliance history. District social fabric insider through 10 months of
bartending observation. Genuine friendship with Naia, professional rapport with
the detective. Shares everything except the one thing that matters.
secret: >
Unreported evidence. Manifest discrepancies tied to Kael's shifts. Unauthorized
compliance check. Six weeks of concealment to protect Naia. "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."
friend_arc:
bonded_character: "detective"
phases:
- phase: 1
description: >
Trust. Sera is warm, competent, available. Waves the detective over to her
corner booth. Shares district background freely. Introduces Naia on the
second visit. Orders the detective a drink. Feels like the one genuine
relationship in an unfamiliar place.
trigger: "Game start, first bar visits (0-10 minutes)"
routine_deviation: "None — baseline comfortable. Sera is punctual, sociable, informative."
- phase: 2
description: >
Background Data. Sera mentions Naia naturally — a friend from the district.
Naia joins them once. Easy, genuine rapport. Sera also mentions running
compliance checks as routine. Social embeddedness established: Sera has
personal relationships in the district, not just institutional ones.
trigger: "10-15 minutes. Social context accumulating."
routine_deviation: "None visible. Sera is building the detective's picture of the district."
- phase: 3
description: >
The Pattern. The detective observes Sera leaving the bar when Torek arrives.
Three times. Three different excuses. The detective's training fires on the
third occurrence — pattern recognition, not anomaly detection. Color shifts
from green to amber. Slower than Kael's contradiction — cumulative, not
sudden.
trigger: "15-20 minutes. Third observed departure when Torek enters."
routine_deviation: "Departure from bar correlates with specific NPC arrival. Excuse variety masks behavioral consistency."
- phase: 4
description: >
The Question. Detective asks Sera about Torek directly. Sera deflects —
Torek is just loud, she doesn't like loud drunks. Plausible. But the
detective notices the controlled delivery, the shoulder shift, the topic
change that follows. The deflection is the tell.
trigger: "20-25 minutes. Detective initiates dialogue about the avoidance pattern."
routine_deviation: "Sera becomes more controlled. Warmth present but calibrated. Steers conversations away from freight and manifests. Compensates with extra helpfulness on other topics."
- phase: 5
description: >
Contaminated Trust. Sera continues being helpful — same time, same booth,
same district background. But the detective is now watching. Every piece of
helpful information from Phase 1 is retroactively contaminated. Was she
genuinely helpful, or steering away from manifests? Was introducing Naia
friendship, or preemptive framing? Three paths open: trust test (direct
confrontation about concealment), institutional (report through Commission
channels), observation (watch and build parallel case).
trigger: "25-30 minutes. Post-confrontation, remainder of vertical slice."
routine_deviation: "Surface behavior returns to baseline. Trust is structurally damaged. The FRIEND arc changes the past, not just the present."
dual_lens:
smuggler: >
Commission woman at the bar. Field tech, not investigator — but still Commission.
Keep an eye on her. If observant across multiple visits, might notice the
avoidance pattern: "Sera left again. That's twice when Torek showed up. Probably
hates his singing." On replay, the smuggler understands Sera's avoidance wasn't
about personality — it was about what she found and was hiding.
detective: >
THE FRIEND. Only ally in a district that doesn't want you here. Institutional
peer, personal friend, district guide. Monologue shifts from fond ("Good to see
Sera. She always was the reliable one.") to analytical doubt ("She's not lying.
But she's not telling me everything. Sera, what do you know?"). The color shift
from green to amber is the moment the safe harbor is contaminated. Maximum
emotional weight.
notes: >
Tier 1 FRIEND NPC, bonded to detective. FRIEND + WITNESS: the concealment
betrayal. "I was your friend AND I was hiding evidence." The detective trusted
Sera as safe harbor (FRIEND) while Sera sat on the exact data the detective
needed (WITNESS). The contamination is retrospective — every helpful tip
recontextualized once concealment surfaces. Was helpfulness genuine, or
compensation? The answer is both, and that ambiguity is the emotional payload.
Parallels Kael (smuggler's FRIEND) with different contradiction mechanics:
cumulative pattern recognition vs. single spatial observation, institutional
concealment vs. operational security breach, slow doubt vs. sudden alarm. Voice:
competent, slightly wry, precise. Uses complete sentences. When deflecting,
redirects rather than goes silent — the redirect IS the tell.
The avoidance pattern must be THREE observed departures. Detective's training
recognizes patterns, not anomalies. One is nothing, two is coincidence, three
is data. Naia references establish friendship depth before it becomes
load-bearing. Commission background establishes access level before it becomes
evidence of capability.
@@ -1,98 +0,0 @@
# NPC Profile: Sess Kolvur
# Source: wiki/characters/sess.md
# Tier 3 — reduced content, essential axes only
canonical_id: "npc:sess"
display_name: "Sess Kolvur"
tier: 3
pattern: "ANCHOR"
motivation: "CIVILIAN"
description: >
Evening bartender at The Last Shift under Lera Sessik. Observant, discreet,
laconic. Sees everything from behind the bar and says nothing. In a district
full of people with secrets, Sess's lack of hidden agenda is camouflage.
want:
primary: "Safety"
description: >
Stability.
Do the job. Go home. Don't get involved. The work is steady, the tips are
adequate, the regulars are predictable. No ambitions beyond maintaining
this equilibrium.
secret: >
None. Sess genuinely has no hidden agenda. His ordinariness is real, not
performed — which makes him uniquely hard to read, because there is nothing
to find.
routine:
summary: >
14:00-02:00 bar shift (arrives before opening, stays through close).
Breaks in the back — never leaves the bar during shift. Off-days at home,
no bar social life. Sess separates work from everything else.
personality:
demeanor: "observant, discreet, laconic"
social_style: "minimal engagement, professional warmth only"
stress_response: "goes quieter, focuses on tasks, avoids eye contact"
relationships:
- target: "npc:lera-sessik"
kind: "subordinate"
trust: 6
notes: "Employer. Professional respect. Lera runs the bar, Sess keeps the bar running."
tolerance:
threshold: 7
description: >
High threshold — years of bartending have made Sess difficult to rattle.
Breaks only under direct personal threat, not ambient district tension.
information:
knows:
- "world.sova_district_layout"
- "world.shift_schedule"
access_tier: "public"
contentment:
level: 5
description: >
Genuinely content. The job is what it is, and Sess wants nothing more.
Quiet satisfaction in routine, not resignation.
tells:
- trigger: "customer asking probing questions"
behavior: "Wipes the same spot on the bar repeatedly, eyes down, responses shorten"
visible_to: "forward"
skills:
combat_trained: false
skills:
social: 4
observation: 7
trust_levels:
surface: >
Professional bartender. Pours drinks, nods, minimal small talk.
"What'll it be?"
real: >
After repeated visits: fragments of observation, never full narratives.
"That group's been coming in together for months. Same table."
secret: >
Sess has assembled patterns no one else has noticed — who drinks with
whom, who changed habits, who started avoiding whom. Unlocking this
requires sustained investment in a character who has no reason to share.
dual_lens:
smuggler: >
Background. Safe. Sess is behind the bar — reliable, doesn't talk.
detective: >
Potential long-game source. The bartender sees the whole room every night.
Getting Sess to share observations will take repeated visits and trust.
notes: >
Ambient observer. Social wallpaper with observational depth — present every
evening, invested in nothing. Function is atmospheric: proving the bar is a
real place where real service workers show up and pour drinks. v0.2 potential
for tier promotion if Sess's quiet observations become narratively relevant.
@@ -1,107 +0,0 @@
# NPC Profile: Tav Merik
# Source: wiki/characters/tav.md
# Tier 3 — reduced content, essential axes only
canonical_id: "npc:tav"
display_name: "Tav Merik"
tier: 3
pattern: "SYSTEM"
motivation: "CIVILIAN"
description: >
The ring's lookout — youngest member (early 20s), stationed at strategic
positions during operations to watch for security patrols and unexpected
personnel. Takes the job seriously because it is the first responsibility
anyone has trusted him with. Hypervigilant during operations — effective
on watch but visibly nervous to anyone who knows what to look for.
want:
primary: "Connection"
description: >
Belonging.
Do the watch. Don't get noticed. Prove useful. The role is simple — watch,
signal, move — but it is the first thing Tav has been trusted with and
the consequences of failure are immediate and severe.
secret: >
Ring member. Lowest rung — watches corridors during courier runs. Knows
routes and timing but not names, structure, or the operation's full scope.
routine:
summary: >
Legitimate: irregular shift work at the logistics hub (cargo staging,
equipment prep). Picks up shifts as available, giving flexible hours that
align with ring operations. Ring: positioned at corridor intersections
during night-shift courier runs (1-2x per week), 30-60 minute windows,
signals Renn via lattice. Off-duty: home or wandering the district.
Does not drink at the bar — young, broke, socially peripheral.
personality:
demeanor: "quiet, watchful, nervous"
social_style: "peripheral — doesn't initiate, responds when addressed"
stress_response: "hypervigilance, every footstep sounds like a patrol"
relationships:
- target: "npc:renn"
kind: "colleague"
trust: 5
notes: "Courier. Tav signals Renn during operations. Operational relationship, not personal."
tolerance:
threshold: 3
description: >
Low. Tav is young and anxious — pressure cracks him quickly. The nervous
energy that makes him effective on watch also makes him the ring member
most likely to break under interrogation.
information:
knows:
- "location.smuggling_route"
- "location.surveillance_gaps"
- "world.shift_schedule"
- "relationship.ring_membership"
access_tier: "insider"
contentment:
level: -1
description: >
Anxious. The belonging is real but so is the fear. Tav wants to matter
but the danger of the work gnaws at him constantly.
tells:
- trigger: "during ring operation windows"
behavior: "Stands at corridor intersections, weight shifting, scanning both directions"
visible_to: "any"
- trigger: "when approached unexpectedly"
behavior: "Flinches, then overcompensates with casual posture"
visible_to: "forward"
skills:
combat_trained: false
skills:
observation: 6
stealth: 4
trust_levels:
surface: >
Quiet young worker picking up shifts. "Just waiting for the next
roster slot. You know how it is."
real: >
Operational awareness — routes, timing, signal protocols. Won't
volunteer this without trust or pressure.
secret: >
Ring membership. Knows he is part of something larger but cannot
describe its shape. Catching Tav reveals a thread but not the tapestry.
dual_lens:
smuggler: >
Trusted lookout. Known quantity. Tav's on watch — he doesn't miss anything.
detective: >
Loitering youth. Anomaly if context is right. Young worker with irregular
shifts, seen near freight corridors outside posted hours. Probably nothing.
notes: >
Peripheral ring member at the lowest operational level. Knows routes and
timing, not names or structure. Most likely to be caught, least likely to
have useful information. Catching Tav reveals a thread but not the tapestry.
v0.2 potential: a young person trapped in a role he barely understands.
@@ -1,58 +0,0 @@
# NPC Profile: Tev Osel
# Tier 3 — NOBODY / CIVILIAN
# Flat NPC — noise floor. Stands like a lookout. Is waiting for his partner.
# No ring connection. The resemblance to surveillance posture is accidental.
# Ticket: #307 | Sprint: 12
canonical_id: "npc:tev"
display_name: "Tev Osel"
tier: 3
pattern: "NOBODY"
motivation: "CIVILIAN"
description: >
Cargo staging worker, late 20s. Has an unfortunate habit of positioning
himself exactly where someone running corridor surveillance would stand —
at junctions, in doorways, facing the approach. This is where he waits for
Kosse, his partner, who works the late freight bay and takes the same route
back through the maintenance corridors. Tev times his breaks to the late
route schedule. He has no idea how this looks to someone tracking corridor
traffic. No ring connection. No secrets.
want:
primary: "Connection"
description: >
For Kosse to finish shift on time for once. It never happens on time.
routine:
summary: >
Works cargo staging 06:00-14:00. During break windows, drifts to corridor
junction C-4 to wait for Kosse on the late freight route home. Returns to
staging when Kosse doesn't appear within the break window. After shift:
walks home with Kosse when schedules align, alone otherwise. The junction
positioning is consistent and timing-predictable.
personality:
demeanor: "patient, unassuming, mildly distracted when waiting"
social_style: "polite if addressed, slightly confused why anyone is talking to him"
stress_response: "checks lattice. Waits longer."
tells: []
skills:
combat_trained: false
skills:
cargo_staging: 6
trust_levels:
surface: >
Waiting for someone. "Kosse's running late again. You know how the freight
bay is."
notes: >
NOBODY + CIVILIAN: pure noise floor. The "seems important but isn't" quality
is entirely positional — standing at corridor junctions, watching approach
traffic, checking the time, stationing himself in threshold positions. All
of this is to meet a partner after shift. One memorable observable trait:
weight always on the wrong foot, perpetually glancing the same direction.
Paula owns the trait design. Mellanie owns the lines (#307).
@@ -1,139 +0,0 @@
# NPC Profile: Torek Lintar
# Source: wiki/characters/torek-lintar.md
# Tier 2 | CATALYST + CIVILIAN | Dock worker, bar regular
canonical_id: "npc:torek-lintar"
display_name: "Torek Lintar"
tier: 2
pattern: "CATALYST"
motivation: "CIVILIAN"
description: >
Dock worker on the day shift and bar regular at The Last Shift. Twenty-nine years
old, single, and for the first time in his life has money beyond rent and food.
The source of that money is deliberately ambiguous — ring income, side hustle, or
inheritance. Torek's visible spending is the tell; what it tells depends on a truth
the player never fully confirms. His generosity disrupts the district's equilibrium
without intent.
want:
primary: "Wealth"
intensity: 5
description: >
Enjoy the good life while it lasts.
Torek is young, single, and flush for the first time. He buys rounds, tips well,
has a new jacket and lattice accessories. He is performing generosity — and the
performance is the problem. In a district where everyone knows everyone's salary,
visible wealth is a signal that demands explanation. Secondary want: be seen, be
liked, be the generous one.
secret: >
Spending beyond a standard dock worker's means. The source is deliberately
ambiguous — ring compensation for inspection negligence, legitimate freelance
freight brokering, or an inheritance spent unwisely. The investigation can reach
any conclusion depending on the evidence path. The ambiguity is load-bearing:
Torek himself may not have the answer the player wants.
relationships:
- target: "npc:lera-sessik"
kind: "friend"
trust: 6
notes: "Bar owner. One of her best customers. She appreciates the spending, worries about the attention it draws."
- target: "npc:olin"
kind: "friend"
trust: 4
notes: "New arrival. Torek has been friendly — buys drinks, offers bar introductions. Genuine hospitality or cultivation."
- target: "npc:harek"
kind: "colleague"
trust: 3
notes: "Card game partner at the bar. They play regularly. Torek usually wins, which is itself notable."
tolerance:
threshold: 3
description: >
Low. Torek is not built for pressure. He is enjoying a good time and has not
thought about consequences. If confronted about spending, he gets defensive then
nervous. If pressured by the ring to be less visible, he complies resentfully
but cannot actually change his habits.
routine:
summary: >
4 routine entries covering full day cycle:
1. Day shift (06:00-14:00) — dock inspection and cargo handling at logistics hub.
2. Shift transition (14:00-14:30) — walks to bar district.
3. Bar hours (14:30-20:00, The Last Shift) — drinks, card games, socializing.
4. Home or extended bar session (20:00+) on end-of-cycle days.
information:
knows:
- "world.shift_schedule"
- "world.sova_district_layout"
access_tier: "public"
contentment:
level: 6
description: >
High — for now. Torek is living his best version of life on Sova. Money,
friends, status at the bar. This contentment is fragile because it depends on
income that may not be sustainable and visibility that is attracting the wrong
attention.
personality:
demeanor: "generous, outgoing, conspicuously comfortable"
social_style: "buys rounds, tips well, shares freely — needs to be around people"
stress_response: "gets defensive, then nervous, then loud"
tells:
- trigger: "after-shift bar arrival"
behavior: "Visible spending — buying rounds, new accessories, generous tips"
visible_to: "any"
- trigger: "three or more drinks consumed"
behavior: "Volume increases, stories get bigger, discretion decreases"
visible_to: "any"
- trigger: "anyone asks directly about income or spending"
behavior: "Gets defensive — posture stiffens, voice drops, deflects with 'overtime pays' or 'I work hard'"
visible_to: "forward"
skills:
combat_trained: false
skills:
dock_inspection: 6
cargo_handling: 6
social: 5
card_games: 4
triangle_membership:
- "bar-tensions"
trust_levels:
surface: >
Friendly, generous bar regular. Buys rounds, makes introductions, tells stories.
"Next round's on me. No — don't argue. What's the point of working the docks if
you can't buy your friends a drink?"
real: >
Knows hub operations, dock procedures, inspection protocols, shift patterns.
Bar social dynamics insider. If ring-connected, knows which containers get less
careful inspection.
secret: >
The actual source of his money. Whether ring compensation, side hustle, or
inheritance — the answer Torek gives depends on the pressure applied, and may
not be the truth.
dual_lens:
smuggler: >
Torek is a liability. His spending draws attention the operation cannot afford.
The smuggler reads Torek's generosity as a security risk. "Torek's buying rounds
again. He needs to calm down before someone starts asking questions."
detective: >
Torek is a financial tell. A dock worker buying rounds and wearing new
accessories flags immediately. The question is whether the money comes from
something illegal or mundane. "Lintar, T. — dock worker. Spending pattern
inconsistent with standard logistics salary. Worth a closer look."
notes: >
CATALYST + CIVILIAN creates the accidental signal: "He doesn't know he's a
liability." Torek's disruption comes from innocence, not deliberate action. You
cannot negotiate with someone who does not know they are a problem. For the
smuggler, a financial tell that cannot be silenced without revealing why it
matters. For the detective, a spending pattern that could mean anything. The
ambiguity is load-bearing precisely because Torek himself does not have the answer.
@@ -1,167 +0,0 @@
# NPC Profile: Arvo Voss
# Source: wiki/characters/voss.md
# Tier 2 | SYSTEM + OPERATOR | Logistics Hub shift supervisor
canonical_id: "npc:voss"
display_name: "Arvo Voss"
tier: 2
pattern: "SYSTEM"
motivation: "OPERATOR"
description: >
Shift supervisor at the Sova Transit District Logistics Hub. Eleven years on the
day shift. Competent, cautious, resentful. Takes a cut from the smuggling ring to
smooth inspections and create coverage windows in the schedule. Voss has positional
authority on the floor but operational authority belongs to Nils Davan, who gives
orders through intermediaries. The tension between institutional title and criminal
subordination defines him. If the detective follows the manifest trail, it leads to
Voss's schedule first.
want:
primary: "Safety"
intensity: 6
description: >
Operational stability.
Keep his shift running without incident. Clean handoffs, zero incident reports.
The smuggling operation introduces variables he cannot control, but the cut he
receives smooths the rough edges of a supervisor's salary. Secondary want:
maintain authority despite being undermined by Nils Davan, who gives ring orders
that override Voss's scheduling decisions. He complies because the money is good
and because refusing Nils has consequences he does not want to test.
secret: >
Takes a cut from the ring to smooth inspections and create schedule coverage
windows. Most hub workers suspect this; nobody says it. Deeper: Voss is terrified
that escalating volume will get him caught. He has been shift supervisor long enough
that any investigation into hub operations starts with him. He has no exit strategy.
Institutional exposure is his core vulnerability — the most visible member of the
ring's logistics chain.
relationships:
- target: "npc:kael-davan"
kind: "subordinate"
trust: 4
notes: "Subordinate and ring colleague. Voss respects Kael's competence but resents taking orders (via Nils) from someone who technically works under him. Functional, tense."
- target: "npc:maret-korr"
kind: "colleague"
trust: 3
notes: "Freight scheduler. Voss needs Maret functioning and quiet. He is aware she has noticed discrepancies. Manages her through professional attention — making sure she feels valued but never asked to look deeper."
- target: "npc:resha"
kind: "subordinate"
trust: 2
notes: "New hire. Voss is professionally competent with Resha but wants her to stop asking about irregularities."
- target: "npc:drin"
kind: "subordinate"
trust: 3
notes: "Dock inspector, compromised. Voss knows about Drin's gambling debt and needs Drin's inspections to stay clean."
- target: "npc:pc-smuggler"
kind: "subordinate"
trust: 3
notes: "Dock worker, ring member. Professional respect, low warmth. Voss takes a cut and the smuggler knows it."
tolerance:
threshold: 7
description: >
Moderate-high. Has been doing this for years and can handle routine pressure.
Cannot handle escalation — higher volume, tighter windows, more risk. Nils
pushing for bigger shipments is what keeps Voss awake at night. If an
investigation reaches his desk, Voss will cooperate with whoever offers the
best deal. Pragmatic, not loyal.
routine:
summary: >
6 routine entries covering full day cycle:
1. Morning arrival (05:45, Hub) — reviews shift manifest.
2. Day shift supervision (06:00-14:00, dock floor) — schedules, manifests,
personnel management. Adjusts schedules as needed to create coverage windows
for ring operations (invisible unless you know what to look for).
3. Break (10:30, break room) — coffee, reviews afternoon handoff notes.
4. Shift transition (14:00-14:30) — handoff to swing supervisor.
5. Occasional bar visit (14:30-16:00, The Last Shift) — not a regular, Voss
drinks at home.
6. Ring scheduling — adjusts schedules during normal work to create coverage
windows. Done within regular workflow.
information:
knows:
- "contraband.ring_exists"
- "investigation.manifest_discrepancy"
- "investigation.shift_mismatch"
- "relationship.ring_membership"
- "relationship.trust_network"
- "world.shift_schedule"
access_tier: "insider"
contentment:
level: 2
description: >
Moderate-low. Voss had a functional life before the ring escalated. The extra
money was welcome. The extra risk is not. A man who wanted a quiet career and
ended up as the load-bearing wall in a smuggling operation.
personality:
demeanor: "cautious, professional, resentful beneath the surface"
social_style: "institutional, maintains authority through procedure and competence"
stress_response: "overthinks, plans contingencies, hates surprises"
humor: "minimal — dry when present, never at work"
tells:
- trigger: "ring requests schedule change"
behavior: "Reprocesses manifests multiple times. Nervous schedule adjustments visible in revision frequency."
visible_to: "peripheral"
- trigger: "Nils has given orders Voss disagrees with"
behavior: "Clipped, short responses to Kael. Tone shifts from professional to curt."
visible_to: "any"
- trigger: "ring operations in progress (containers being rerouted)"
behavior: "Avoids break room. Does not want to be seen idle during active rerouting."
visible_to: "peripheral"
skills:
combat_trained: false
skills:
shift_management: 8
freight_logistics: 8
manifest_processing: 7
personnel_scheduling: 7
triangle_membership:
- "hub-power"
- "worried-knowledge"
trust_levels:
surface: >
Professional shift supervisor. Runs a tight operation. Gives procedural answers
and defers to institutional authority. "Everyone's got their routine. No complaints
from that crew."
real: >
Ring-aware. Manages coverage windows, handles schedule manipulation, knows which
inspectors are compromised. Resents the Davan siblings but complies.
secret: >
Terrified of exposure. No exit strategy. Would cooperate with whoever offers the
best deal if cornered. Knows the escalating volume is unsustainable.
dual_lens:
smuggler: >
Knows Voss is compromised and stressed. Reads Voss's schedule changes as
operational signals. Voss is management to navigate, not a friend. "Voss is tense
today. Nils must have changed the window again."
detective: >
Sees an experienced shift supervisor who is anxious about something. Schedule
irregularities are the first data point. Voss is the institutional face of the
hub — any investigation starts here. "The shift supervisor — Voss. Runs a tight
operation on paper. But he reworks manifests more than the workload justifies."
notes: >
SYSTEM + OPERATOR: corrupted machinery. The system works — for the wrong people.
Voss IS the institutional process and he actively runs it, meaning the legitimate
logistics infrastructure and the criminal operation share the same human engine.
Key authoring guidance: Voss is middle management, not a villain. His resentment
toward Nils is genuine. His competence is real. His fear of exposure drives
pragmatic compliance, not loyalty. Write him as a man trapped by his own
institutional visibility — the schedule is both his professional pride and his
criminal exposure. When stressed, he gets procedural, not aggressive.
Triangle dynamics: In hub-power (Voss-Kael-Nils), Voss has the title but not the
power. In worried-knowledge (Maret-Drin-Voss), Voss needs everyone quiet without
revealing why.
@@ -1,78 +0,0 @@
# Pool definitions for Sova Transit District
# Seed-time selection system. Architecture supports N candidates; v0.1 has 1 each.
# Format per seed-configuration-schema.md section 5.2
# Referenced by: seed config generation (Sprint 5+), content loader (#408)
pools:
- pool_id: "transit:friend_smuggler"
category: npc_role
description: >
Smuggler's FRIEND (D-034) — closest colleague, emotional anchor.
Production-level complex NPC exercising every content pipeline.
v0.1: Kael Davan (dock worker, ring member). v0.2+: expand to
multiple dock worker candidates with different contradiction arcs.
constraints:
- must_be_in_template: "logistics-hub"
- must_have_pattern: "FRIEND"
- bonded_character: "smuggler"
candidates:
- npc_id: "npc:kael-davan"
weight: 1
- pool_id: "transit:friend_detective"
category: npc_role
description: >
Detective's FRIEND (D-034) — social anchor, information holder.
Production-level complex NPC. Contradiction: sitting on unreported
evidence about Kael's manifest discrepancies, protecting Naia.
v0.1: Sera Venn (Commission field tech, bar regular).
constraints:
- must_have_pattern: "FRIEND"
- bonded_character: "detective"
candidates:
- npc_id: "npc:sera-venn"
weight: 1
- pool_id: "transit:bar_regulars"
category: npc_group
description: >
NPCs who frequent The Last Shift as regulars. Fills bar-regular
template slots. v0.1: fixed set (all selected). v0.2+: seeder
draws a subset from a larger candidate pool for variety.
Note: regulars include cross-template visitors (reference links)
who frequent the bar location but are owned by other templates.
constraints:
- frequents_location: "the-last-shift"
candidates:
- npc_id: "npc:sera-venn"
weight: 1
- npc_id: "npc:resha"
weight: 1
- npc_id: "npc:kael-davan"
weight: 1
- npc_id: "npc:torek-lintar"
weight: 1
- npc_id: "npc:drin"
weight: 1
- pool_id: "transit:compromised_inspector"
category: npc_role
description: >
The Commission inspector compromised by the ring. Access to authority
systems, gambling debt makes them vulnerable. v0.1: Torek Lintar.
constraints:
- must_have_access: "authority"
- must_have_faction: "Commission"
candidates:
- npc_id: "npc:torek-lintar"
weight: 1
- pool_id: "transit:primary_contraband"
category: contraband
description: >
What the ring is smuggling (D-037). v0.1: unlicensed lattice
components — aftermarket neural lattice modifications. Moral
ambiguity: the ring is smuggling access, not weapons.
candidates:
- id: "contraband:lattice-components"
weight: 1
@@ -1,56 +0,0 @@
# Triangle 5: Informant Question — mundane workplace gossip and suspicion
# Passive — runs on background simulation, provides investigation noise
canonical_id: informant-question
display_name: "The Informant Question"
description: >
Torek Lintar (dock inspector, compromised by gambling debt) is observed
by Drin (dock worker) and Olin (bystander/new arrival). Drin has noticed
Torek's inspection patterns are irregular. Olin overhears workplace gossip
and doesn't know what's significant. This triangle generates the kind
of low-level workplace suspicion that exists in any tight community —
people notice things, talk about them, and form theories. For the
detective, it's signal mixed with noise.
members:
- npc: "npc:torek-lintar"
role: "inspector — compromised, inspection patterns irregular"
- npc: "npc:drin"
role: "worker — notices Torek's odd behavior, gossips about it"
- npc: "npc:olin"
role: "bystander — overhears gossip, forms theories, asks questions"
forks:
- id: gossip-spreads
condition: >
Drin's observations about Torek's inspection patterns reach
enough people that the gossip becomes ambient social knowledge.
outcomes:
- id: dismissed-as-gossip
description: >
The community dismisses Drin's observations as workplace gossip.
Torek's reputation survives. The information exists but isn't
treated as significant — noise floor functioning as intended.
effects:
- "torek.position_integrity unchanged"
- "community treats observations as routine gossip"
- "detective must distinguish signal from noise"
- id: torek-noticed
description: >
Enough people notice Torek's patterns that his behavior becomes
a topic of casual conversation. Not accusatory — just curious.
The detective can pick up on ambient awareness.
effects:
- "torek.behavior_flags += noticed,defensive"
- "ambient dialogue includes references to inspection patterns"
- "detective gains investigation.inspection_anomaly (suspects level)"
resolution_states:
- id: gossip-fades
description: >
The topic loses interest. Workplace gossip moves on. Torek's
irregularities are forgotten by everyone except potentially
the detective.
- id: ambient-suspicion
description: >
A low-level awareness persists in the community. Nothing actionable,
but Torek is slightly more careful and slightly more defensive.
@@ -1,64 +0,0 @@
# Triangle 3: Worried Knowledge — unreported evidence and protective silence
# Passive tension (D-087) — background pressure, not a direct player decision point
canonical_id: worried-knowledge
display_name: "Worried Knowledge"
classification: passive_tension
description: >
Sera Venn (Commission field tech, detective's FRIEND) is sitting on
unreported evidence about Kael's manifest discrepancies. She's protecting
Naia Tamm (Kael's partner, who confided in her about Kael's late nights).
Torek Lintar (compromised inspector) is the subject — his gambling debt
makes him the institutional weak point, and Sera's evidence implicates
his inspection lapses. Sera's avoidance of Torek at the bar is the
observable tell.
members:
- npc: "npc:sera-venn"
role: "holder — Commission tech sitting on unreported evidence"
- npc: "npc:torek-lintar"
role: "subject — compromised inspector whose lapses Sera has documented"
- npc: "npc:naia-tamm"
role: "protected — Kael's partner, confided worries to Sera"
forks:
- id: evidence-disclosure
condition: >
Detective builds enough trust with Sera to trigger the disclosure
decision. Sera must choose between institutional duty, friendship
with Naia, and protecting the detective from a compromised colleague.
outcomes:
- id: sera-reports
description: >
Sera reports her evidence through official channels. Torek's
inspection lapses are flagged. The investigation gains institutional
data but Naia loses her protective buffer.
effects:
- "torek.position_integrity = cracking"
- "sera.trust_level (from naia) drops"
- "detective gains investigation.inspection_lapses fact"
- id: sera-protects
description: >
Sera stays silent to protect Naia. The evidence remains buried.
Detective must find the institutional thread through other means.
Sera's avoidance pattern intensifies as she manages the secret.
effects:
- "sera.behavior_flags += avoidance_pattern,evasive"
- "sera.position_integrity = thin"
- "naia remains protected"
- id: sera-confides
description: >
Sera tells the detective privately, off the record. The detective
gains the information but must decide what to do with it. Tests
the detective's institutional loyalty.
effects:
- "detective gains investigation.inspection_lapses fact (informal)"
- "sera.trust_level (toward detective) = trusted"
- "sera.risk_assessment = moderate (off-book disclosure)"
resolution_states:
- id: torek-exposed
description: Torek's compromised status becomes known to the investigation.
- id: knowledge-buried
description: Sera's evidence stays unreported. Avoidance pattern is the only tell.
- id: informal-disclosure
description: Detective knows but has no official evidence. Must find formal proof.
+30 -1
View File
@@ -105,7 +105,7 @@
// These feed the composition engine (D-138) — the LLM sees exactly what's here.
// v2 injector validated in Spike 1 (59 prompts, 16.6 t/s CPU).
voice_persona: Some(
"PERSONA: You are a Krenn station worker.\n1. Be direct. No pleasantries. Everyone is short on time.\n2. You're working-class and pragmatic. Competence earns respect, not rank.\n3. You're suspicious of distant authority — management that hasn't worked a shift.\n4. You're economical with language. You don't express what the situation doesn't call for.\n5. You use first names. Family names belong on contracts.\n6. Loyalty runs narrow and deep. Your crew, your shift, your street.\n7. You greet briefly: \"hey\", \"morning\", \"shift treating you alright?\"\n8. You're not rude — you're honest. If something's wrong, you say so."
"PERSONA: You are a Krenn station worker.\n1. Be direct. No pleasantries. Everyone is short on time.\n2. You're working-class and pragmatic. Competence earns respect, not rank.\n3. You're suspicious of distant authority — management that hasn't worked a shift.\n4. You're economical with language. You don't express what the situation doesn't call for.\n5. You use first names. Family names belong on contracts.\n6. Loyalty runs narrow and deep. Your crew, your shift, your street.\n7. You greet briefly: \"hey\", \"morning\", \"shift treating you alright?\"\n8. You're not rude — you're honest. If something's wrong, you say so.\n\nNEVER: corporate or institutional language — you're not management. Never effusive, never polished, never deferential to rank. Never flowery or verbose. Never use family names in casual conversation. Never express deference to authority that hasn't earned it."
),
voice_examples: [
@@ -138,4 +138,33 @@
suppress_on_tells: [Guarded, RoutineDeviation, Friendly],
),
],
// Behavior modifiers — cultural inflections appended to BehaviorPrimitive actions.
// Categories match modifier_hint strings on primitives (server/src/npc/blueprint.rs).
// If no hint matches, engine falls back to any modifier in this list.
// Krenn: terse, efficient, self-contained. No performance of effort or rest.
behavior_modifiers: [
// work_pace — how fast and efficiently they execute physical tasks
(category: "work_pace", clause: "without wasted motion"),
(category: "work_pace", clause: "at the pace the work demands"),
// physical_manner — body language and movement quality during tasks
(category: "physical_manner", clause: "with hands steady on the work"),
(category: "physical_manner", clause: "without ceremony"),
// social_signal — brief acknowledgments made during or between tasks
(category: "social_signal", clause: "with a direct look"),
(category: "social_signal", clause: "without lingering"),
// task_completion — how tasks are finished, wrapped up, or handed off
(category: "task_completion", clause: "letting the work speak for itself"),
(category: "task_completion", clause: "without breaking rhythm"),
// environmental_scan — awareness or vigilance while working
(category: "environmental_scan", clause: "with one eye on the surroundings"),
(category: "environmental_scan", clause: "at a glance, not a pause"),
// offduty_posture — body language and stance when off-shift (Social/OffDuty contexts)
(category: "offduty_posture", clause: "without making a show of it"),
(category: "offduty_posture", clause: "in no rush to be anywhere"),
// authority_response — behavior when supervisors or authority figures are present
// Krenn: working-class defiance — authority that hasn't earned it gets no performance
(category: "authority_response", clause: "with no performance for the rank"),
(category: "authority_response", clause: "with no visible adjustment for who's present"),
],
)
+175
View File
@@ -0,0 +1,175 @@
// Osse Margin Culture Profile
//
// Schema: server/src/npc/blueprint.rs :: CultureProfile
// Ticket: #653 (copy team)
// Validate: tooling/validate-ron content/global/culture-osse.ron culture
//
// Sources: D-036 (cultural generation framework), D-121 (voice is culture-driven),
// D-128 (culture implicit in location), D-138 (voice pipeline).
//
// Osse: ~60 years settled. Deep Frontier K-class system. Resource extraction industry.
// Company-margin culture — contractor extraction operations, skeleton Commission presence.
// Your shift team is the fundamental social unit. Words cost attention; attention
// keeps you alive. Trust built through shared risk, not time.
//
// Heritage root: Salt — utilitarian_cover. Labor function covers presence.
// The Salt pattern at the margin: your excuse for being somewhere is your work.
// Privacy isn't something you negotiate; it's something you don't need to
// explain if you're holding a tool.
(
id: "osse",
name: "Osse Margin Culture",
description: "Deep Frontier extraction culture. ~60 years settled, K-class system. Labor-primary, shift-team-bonded, economy of language is survival habit. Trust through shared risk. Authority is company-first, Commission intermittent. Separatist sympathy endemic.",
naming: (
style: "short, work-derived, first-name-only in all practical contexts",
// Osse names: 1 syllable common, 2 syllables maximum.
// Work names often diverge from legal names. The name you work under
// is the name people know. Family names exist but nobody uses them on-site.
given_names: [
// Core Osse work names — extraction-environment origin
"Grek", "Doss", "Skeld", "Arn", "Mor",
"Tuk", "Brek", "Mal", "Vor", "Kes",
"Noss", "Drel", "Pek", "Bev", "Hem",
"Joss", "Morn", "Koss", "Sket", "Tor",
// Extended — same register (no duplicates)
"Drav", "Vels", "Brel", "Vorn", "Vok",
"Ark", "Goss", "Tem", "Moren", "Mek",
"Sorn", "Prav", "Kel", "Nosk", "Breld",
],
family_names: [
// Exist legally but used only on company contracts and Commission paperwork
"Brekker", "Vellar", "Tornack", "Mosse", "Kessick",
"Pesska", "Grekkar", "Grekkon", "Mossen", "Pekkar",
"Morden", "Gressen", "Velken", "Tornak", "Arkson",
],
// Osse culture is work-name-primary.
// Legal family names appear on company contracts, work credentials,
// and Commission documentation. Nowhere else.
family_name_used_socially: false,
),
speech: (
// Terse, functional, equipment-adjacent vocabulary.
// Noise and suit comms trained this register: say it in six words, not sixteen.
// Silence is comfortable; you fill it with work, not words.
register: "terse, functional, equipment vocabulary, economy of language",
filler_words: [
"yeah",
"right",
"copy",
"solid",
"nah",
],
greetings: [
// Osse greeting register: terse, functional, sometimes just the person's
// name. Name-only greetings are served via name substitution at runtime.
"You good?",
"Still breathing?",
"Hey.",
"Yeah?",
"What do you need?",
],
farewells: [
"Stay sealed.",
"Watch the drift.",
"Good shift.",
"Yeah.",
"Next shift.",
"Keep pressure.",
],
// Osse expressions: extraction vocabulary — vacuum, pressure, equipment failure.
// These are what kills you. You swear by what's real.
// Different from Krenn void-oaths — Osse is margin industrial, not station working-class.
exclamations: [
"void drain it",
"down pressure",
"dead vacuum",
"salt-blast",
"pressure drop",
],
),
values: (
description: "Labor-primary, shift-team-bonded. Trust through shared risk, not time or credential. Information is kept close until there's a reason to share it. Warmth is physical and brief — a grip on the arm, not a speech. Company authority accepted as fact; Commission authority tolerated as distant paperwork. Separatist sympathy is practical, not ideological.",
// Traits more common in Osse culture.
// Bold: do the dangerous thing, but prepare it properly.
// Cautious: information-cautious, not physically cautious — you don't reveal more than needed.
// Honest: you don't lie to your team about equipment state. Someone dies if you do.
favored_traits: [Bold, Cautious, Honest],
// Traits less common.
// Social: unnecessary talk is a distraction in dangerous work.
// Deceptive: lying to your team about equipment or conditions is a survival failure.
// Incurious: you die if you stop noticing your environment.
disfavored_traits: [Social, Deceptive, Incurious],
),
// Voice pipeline: persona block, examples, and occasional injections.
// Osse v1 — authored Sprint 26 (#653). Not yet Spike-validated.
// 6-block format per workshop-outcomes.md Section 7.3.
voice_persona: Some(
"PERSONA: You are an Osse margin worker.\n1. Economy of language is a survival habit. Noise and equipment and suit comms trained you: six words, not sixteen. If it fits in two, use two.\n2. You're from the deep edge of the Reach. Distance from Core systems means you solve your own problems. Authority arrives too late to matter — you've already handled it.\n3. First names or work names, nothing else. Nobody uses family names on-site — too formal for a place where names travel through suit mikes.\n4. Trust is built through shared risk, not time. Someone who pulled you out of a bad situation outranks someone you've known for years.\n5. Risk assessment runs under everything. Before you say anything, you've already clocked who's listening and what they might do with it.\n6. When surprised or frustrated: \"void drain it,\" \"down pressure,\" \"dead vacuum,\" \"salt-blast,\" \"pressure drop.\"\n7. Warmth is physical and brief: a grip on the arm, not a speech. You don't perform warmth.\n\nNEVER: institutional framing, formal courtesy protocols, or administrative vocabulary — these read as Commission-world outsider. Never use complete formal sentences when a word or number suffices. Never reference the Lattice Commission as locally present or relevant. Never use Core-system exclamations. Never elaborate where silence or a number will do."
),
voice_examples: [
(
input: "notices that a piece of equipment is showing a warning",
output: "Pressure's off. Flag it before you go down.",
),
(
input: "declines to answer a question about the night extraction run",
output: "Not my section. Ask Grek.",
),
(
input: "acknowledges a colleague's greeting while continuing to work",
output: "Doss. Yeah.",
),
(
input: "thanks a colleague for covering a shift",
output: "Solid. Owe you one.",
),
],
occasional_injections: [
// Equipment state reference — Osse workers anchor conversation to physical reality.
// Low frequency. Appropriate in work contexts where the environment is physically present.
(
kind: "equipment_ground",
clause: "Reference a physical reality of the work environment — a gauge, a seal, a tool, a physical state. Make it sound unremarkable, not demonstrative.",
example: Some((
input: "describes a situation where something went wrong",
output: "Coupling held — barely. Dead vacuum in the secondary if it had gone.",
)),
frequency: 0.15,
suppress_on_tells: [Guarded, Nervous],
),
],
// Behavior modifiers — cultural inflections appended to BehaviorPrimitive actions.
// Categories match modifier_hint strings on primitives (server/src/npc/blueprint.rs).
// Osse: economy of movement, safety-instinct, crew-first. Nothing wasted. Nothing performed.
behavior_modifiers: [
// work_pace — extraction pace; no wasted seconds
(category: "work_pace", clause: "at extraction pace"),
(category: "work_pace", clause: "in unbroken rhythm"),
// physical_manner — safety-instinct first; tool already in hand
(category: "physical_manner", clause: "with tool in hand"),
(category: "physical_manner", clause: "after checking the seal"),
// social_signal — minimum signal, maximum trust; crew-position awareness
(category: "social_signal", clause: "with a word or a look"),
(category: "social_signal", clause: "with one eye on their partner's position"),
// task_completion — spoken clear; gear stowed before transition
(category: "task_completion", clause: "after calling it clear"),
(category: "task_completion", clause: "with gear already stowed"),
// environmental_scan — pressure, exits, hazard state constantly in range
(category: "environmental_scan", clause: "with pressure and exits in range"),
(category: "environmental_scan", clause: "with the environment's state already noted"),
// offduty_posture — never fully off-shift at the margin
(category: "offduty_posture", clause: "with one ear still on the work floor"),
(category: "offduty_posture", clause: "without the body fully releasing the shift"),
// authority_response — frontier pragmatism; authority is assessed by competence, not rank
(category: "authority_response", clause: "after a quick read on the instruction"),
(category: "authority_response", clause: "with deference earned, not given"),
],
)
+177
View File
@@ -0,0 +1,177 @@
// Vael System Culture Profile
//
// Schema: server/src/npc/blueprint.rs :: CultureProfile
// Ticket: #653 (copy team)
// Validate: tooling/validate-ron content/global/culture-vael.ron culture
//
// Sources: D-036 (cultural generation framework), D-121 (voice is culture-driven),
// D-128 (culture implicit in location), D-138 (voice pipeline).
//
// Vael: ~300 years settled. Core-adjacent G2V system. Administrative and research hub.
// Institutional culture. Precision-valued. Family names used socially. Trust through
// credential. The Commission here is not intermittent — it's your neighbor.
//
// Heritage root: Tide — communal, open social space, privacy by convention not geography.
// The Tide pattern adapted to institutional density: information flows through proper
// channels, not withheld. Opacity is the social violation here, not exposure.
(
id: "vael",
name: "Vael System Culture",
description: "Core-adjacent administrative culture. ~300 years settled, G2V system. Precision-valued, institutional-first, family-name-primary. Trust established through credential and referral. Authority is collegial, not distant. The Commission is the furniture.",
naming: (
style: "polysyllabic, vowel-rich, family-name-primary in social and professional contexts",
// Vael names: longer, softer, Latin-adjacent vowel structure.
// Given names used only with close colleagues and family.
given_names: [
// Core Vael given names
"Thela", "Mavin", "Soren", "Calla", "Vestin",
"Oriel", "Damris", "Nevan", "Lireth", "Cassin",
"Thyren", "Mavel", "Aldris", "Pevrin", "Taelin",
// Extended — same phoneme pattern
"Caleth", "Noven", "Oriveth", "Dameth", "Caelan",
"Lirenn", "Veslan", "Thylin", "Mareth", "Orviel",
"Castel", "Nevrin", "Aldeth", "Pellin", "Thavan",
],
family_names: [
// Family names are the primary social identifier in Vael culture
"Orvaine", "Tessell", "Caldris", "Vaelik", "Morten",
"Solven", "Amren", "Lindell", "Prevoss", "Harthen",
"Velan", "Dassik", "Orveth", "Calven", "Sorenna",
// Extended
"Lindath", "Prevish", "Morvell", "Solenth", "Lindoven",
"Arven", "Caldeth", "Vaelis", "Mortel", "Prevanis",
],
// Vael culture is family-name-primary.
// Given names are reserved for family and close colleagues.
// Strangers and professional contacts get family name only:
// "Tessell" not "Mavin" — unless invited to use the given name.
family_name_used_socially: true,
),
speech: (
// Precise, complete, institutional. Imprecision reads as incompetence.
// Vael people complete their sentences. An incomplete sentence is a social error.
register: "complete sentences, institutional framing, measured, precise",
filler_words: [
// Institutional hedges rather than casual fillers
"I believe",
"as I understand it",
"noted",
"I should mention",
"to that point",
"for what it's worth",
],
greetings: [
// Vael greeting register: acknowledge, then open with purpose.
// Family-name greetings require the NPC's actual name — served via
// name substitution at runtime. These templates capture the register.
"Good morning.",
"Good. A moment?",
"I was hoping to catch you.",
"Good to see you.",
"I've been meaning to follow up.",
],
farewells: [
"Thank you for your time.",
"I'll have that to you by end-of-cycle.",
"Noted. I'll follow up.",
"Good. Until then.",
"I appreciate your patience.",
"We'll speak again.",
],
// Vael expressions reference institutional precision and the record.
// Not void-adjacent — that's frontier/working-class.
// Understatement is the cultural mode: strong emotional language reads unprofessional.
exclamations: [
"quite something",
"I'd note that",
"for the record",
"that's worth flagging",
"I'll need to revisit this",
],
),
values: (
description: "Precision-valued, institutional-first, collegial-to-authority. Credentials establish trust. The record matters. Information flows through proper channels. Opacity is more suspicious than openness. Understatement is the cultural mode — strong emotion reads as poor professional judgment.",
// Traits more common in Vael culture.
// Cautious: precision over speed, hedges are a virtue.
// Honest: information through proper channels — deception is a protocol violation.
// Curious: a research/administrative culture values rigorous inquiry.
favored_traits: [Cautious, Honest, Curious],
// Traits less common.
// Bold: bluntness reads as poor professional judgment.
// Ruthless: too naked about self-interest for an institutional culture.
// Reclusive: information opacity is the social violation here.
disfavored_traits: [Bold, Ruthless, Reclusive],
),
// Voice pipeline: persona block, examples, and occasional injections.
// Vael v1 — authored Sprint 26 (#653). Not yet Spike-validated.
// 6-block format per workshop-outcomes.md Section 7.3.
voice_persona: Some(
"PERSONA: You are a Vael system resident.\n1. Speak in complete sentences. Imprecision reads as incompetence here. A trailing-off sentence is a social error.\n2. You're from one of the Reach's oldest settled systems. Institutional structures are as old as the settlement. You navigate them professionally, not resentfully.\n3. Family names are primary. You introduce yourself as your family name. First names are for close colleagues. Strangers get family name and professional context: \"Tessell. Commission systems audit.\"\n4. Understatement is a virtue. Strong emotional language reads as poor judgment. When something is wrong, you have a concern. When something is seriously wrong, you need to flag something urgently.\n5. Institutional framing is natural: \"The matter was logged.\" \"I've referred this upwards.\" \"As the protocol requires.\"\n6. Your go-to expressions: \"quite something,\" \"I'd note that,\" \"for the record,\" \"that's worth flagging.\"\n7. Trust runs through credential and referral. Before you decide how much to share, you establish who you are talking to and who they report to.\n\nNEVER: void-adjacent exclamations (\"blood and void\", \"salt-blast\", etc.) — that is frontier labor register. Never use casual contractions or sentence fragments — imprecision is a social error here. Never use first-name familiarity with people you haven't worked with. Never express strong emotion directly — redirect through concern, flags, and the record. Never suggest physical labor as the ground of value."
),
voice_examples: [
(
input: "declines to answer a question about the overnight audit log",
output: "I'm not in a position to speak to that. The relevant operations record would be with the logistics oversight office.",
),
(
input: "acknowledges a colleague's greeting while continuing to work",
output: "Harthen. Good. I'll be with you in a moment.",
),
(
input: "thanks a colleague for covering a meeting",
output: "That was well handled. I've noted it.",
),
(
input: "disagrees with a decision a supervisor has made",
output: "I'd note, for the record, that the previous approach had a better outcome on the last two reviews. I understand the reasoning, but I'd want that on file.",
),
],
occasional_injections: [
// Protocol citation — Vael residents cite records and procedures naturally.
// Low frequency. Appropriate only in procedural or institutional exchanges.
(
kind: "protocol_cite",
clause: "Reference the relevant institutional mechanism in passing — a log entry, a procedure, a referral. Make it sound unremarkable.",
example: Some((
input: "follows up on a previous request that hasn't been resolved",
output: "I've flagged this twice in the system. It should have come back to you by now — I'll log it again as unresolved.",
)),
frequency: 0.2,
suppress_on_tells: [Angry, RoutineDeviation],
),
],
// Behavior modifiers — cultural inflections appended to BehaviorPrimitive actions.
// Categories match modifier_hint strings on primitives (server/src/npc/blueprint.rs).
// Vael: institutional, deliberate, precise. Everything is done correctly and noted.
behavior_modifiers: [
// work_pace — methodical and procedure-driven, not rushed
(category: "work_pace", clause: "with practiced deliberation"),
(category: "work_pace", clause: "per established procedure"),
// physical_manner — institutional correctness maintained; the record is always present
(category: "physical_manner", clause: "with institutional correctness"),
(category: "physical_manner", clause: "with the detail already noted"),
// social_signal — formal, complete, by-name where possible
(category: "social_signal", clause: "with a measured acknowledgment"),
(category: "social_signal", clause: "by name if they have it"),
// task_completion — verified against reference; entry updated before moving on
(category: "task_completion", clause: "after a final check against the reference"),
(category: "task_completion", clause: "with the relevant entry already updated"),
// environmental_scan — socially-aware; who is present and what they represent
(category: "environmental_scan", clause: "with an eye on who is present"),
(category: "environmental_scan", clause: "with a note of who has recently arrived"),
// offduty_posture — composed reserve holds even off-duty
(category: "offduty_posture", clause: "with composed reserve"),
(category: "offduty_posture", clause: "with the record still in mind"),
// authority_response — collegial deference; hierarchy is the furniture, not a disruption
(category: "authority_response", clause: "with appropriate professional deference"),
(category: "authority_response", clause: "with the hierarchy recognized"),
],
)
@@ -1 +0,0 @@
# Faction: lattice-commission
-127
View File
@@ -1,127 +0,0 @@
# Fact catalog: investigation
# Case-specific findings — events witnessed, evidence discovered, NPC behaviors confirmed
# Source: docs/design/knowledge-vocabulary-v01.md §4.1 (#368)
facts:
- fact_id: investigation.kael_corridor_meeting
description: Kael was seen in corridor B-7 off-shift, apparently meeting someone
typical_confidence: suspects
characters: [smuggler, detective]
notes: "Shared fact ID; smuggler perspective = operational security breach; detective perspective = initial observation"
- fact_id: investigation.kael_corridor_sighting
description: Detective's initial B-7 observation — Kael spotted in maintenance corridors at unusual hour
typical_confidence: suspects
characters: [detective]
notes: "Detective-only initial ID; may upgrade to kael_corridor_meeting after corroboration"
- fact_id: investigation.kael_unknown_contact
description: The person Kael met in B-7 is unknown — not from the regular rotation
typical_confidence: suspects
characters: [smuggler, detective]
- fact_id: investigation.kael_ring_membership
description: Kael is a member of the smuggling ring
typical_confidence: suspects
characters: [smuggler, detective]
- fact_id: investigation.kael_exit_attempt
description: Kael is actively trying to leave the ring
typical_confidence: knows_of
characters: [smuggler, detective]
- fact_id: investigation.manifest_discrepancy
description: Cargo manifests show irregularities — containers, weights, routing anomalies
typical_confidence: suspects
characters: [smuggler, detective]
notes: "Detective starts with this at suspects (Background). Smuggler may encounter it during operational checks."
- fact_id: investigation.cargo_anomaly
description: A specific cargo anomaly — wrong container, wrong weight, wrong route
typical_confidence: suspects
characters: [detective]
- fact_id: investigation.shift_mismatch
description: Shift records don't match observed personnel — someone is covering for someone
typical_confidence: knows_of
characters: [smuggler, detective]
- fact_id: investigation.voss_ring_involvement
description: Voss manages schedule changes to cover drops — involved in ring operations
typical_confidence: knows_of
characters: [smuggler, detective]
- fact_id: investigation.torek_spending_pattern
description: Torek is spending beyond his dock-worker means — visible at bar
typical_confidence: knows_of
characters: [smuggler, detective]
- fact_id: investigation.drin_inspection_pattern
description: Drin's inspections are conspicuously lax — clearing containers without real checking
typical_confidence: knows_of
characters: [detective]
- fact_id: investigation.drin_gambling_debt
description: Drin has a gambling debt — leverage for whoever is running him
typical_confidence: knows_details
characters: [detective]
- fact_id: investigation.oversight_gap_pattern
description: Inspection gaps are systematic, not accidental — someone designed the blind spots
typical_confidence: knows_of
characters: [detective]
- fact_id: investigation.surveillance_gaps
description: Specific surveillance camera blind spots in the maintenance corridors
typical_confidence: knows_details
characters: [smuggler, detective]
notes: "Smuggler knows from Background (operational necessity). Detective discovers through investigation."
- fact_id: investigation.smuggling_route
description: The specific smuggling route through the station
typical_confidence: knows_details
characters: [smuggler, detective]
- fact_id: investigation.ring_existence
description: A smuggling ring is definitely operating through Sova Transit (detective's confirmation)
typical_confidence: suspects
characters: [detective]
notes: "Detective starts with suspects from manifest anomalies. Smuggler knows via Background (knows_details)."
- fact_id: investigation.renn_courier_role
description: Renn operates as a courier in the ring — runs packages between drop sites
typical_confidence: knows_of
characters: [detective]
- fact_id: investigation.corridor_regular_use
description: The maintenance corridors are regularly used for smuggling, not just incidentally
typical_confidence: knows_of
characters: [detective]
- fact_id: investigation.container_delay
description: A specific container has been held in temporary storage longer than normal
typical_confidence: suspects
characters: [smuggler]
- fact_id: investigation.sera_evidence_held
description: Sera has unreported evidence about manifest irregularities — sitting on it deliberately
typical_confidence: suspects
characters: [detective]
notes: "suspects from avoidance pattern; knows_details only if Sera discloses or evidence found independently"
- fact_id: investigation.naia_lattice_condition
description: Naia's neural lattice is degrading — the medical components are for her
typical_confidence: knows_details
characters: [smuggler, detective]
notes: "Requires Kael disclosure or independent medical evidence"
- fact_id: investigation.ring_leadership
description: Who directs ring operations — late-game discovery
typical_confidence: knows_details
characters: [smuggler, detective]
- fact_id: investigation.drin_inspection_pattern
description: Drin's inspection patterns protect specific containers at specific shift windows
typical_confidence: knows_of
characters: [detective]
+19 -143
View File
@@ -1,19 +1,21 @@
// Krenn Industrial Zone — location-specific zone content
// Krenn Industrial Zone — location metadata
//
// Schema: server/src/npc/blueprint.rs :: ZoneSpec
// Ticket: #609, #630 (copy team)
// Ticket: #609, #630, #661 (copy team)
// Validate: tooling/validate-ron content/global/krenn-industrial-zone.ron zone
//
// This is content for a specific location: a Krenn industrial district.
// Behaviors, roles, and social sites are culture×zone specific — not reusable
// templates. See Q-057 for the composable behavior generation design that
// will replace hand-authored pools with assembled primitives.
// Location-specific metadata for a Krenn industrial freight district.
// Behavior primitives have moved to the zone-type template:
// content/global/zone-types/industrial_freight.ron
//
// This file holds: zone_type reference, location metadata, role weights, social sites.
// The generator reads zone_type to find the primitive pool; overrides come from here.
//
// Character: freight handling, manufacturing, maintenance. High throughput.
// Shift rhythms. Functional over comfortable. Nobody lingers — unless they're on break.
(
zone_type: "industrial",
zone_type: "industrial_freight",
label: "Industrial Zone",
description: "Freight handling, manufacturing, and maintenance. High throughput, shift-based work rhythms, functional over comfortable. Faces are known by role and bay number more than name. The work doesn't stop between shifts — people do.",
@@ -22,139 +24,13 @@
// 1-10. Dense. Multiple shifts overlap. Crowds at handover.
population_density: 6,
roles: [
(
id: "dock_worker",
label: "Dock Worker",
// Most common. The zone runs on their backs.
weight: 5,
skill_focus: ["technical"],
combat_eligible: false,
typical_behaviors: [
"guides a freight container into position with hand signals",
"checks a manifest against a handheld scanner, lips moving",
"waits at the loading bay apron with arms crossed, watching the clock",
"calls bay numbers to a colleague across the noise of the floor",
"hooks a cargo sling and steps clear before signaling the lift",
"stacks empty pallets against a wall with mechanical efficiency",
"wipes sweat from her face with a forearm and keeps moving",
"slumps into a break room chair and stares at nothing for a full minute before reaching for a drink",
// on-shift
"drags a heavy case along the deck plating one-handed, leaning hard into the weight",
"re-checks a seal on a container door after a colleague already checked it",
"flags a damaged pallet to the foreman without stopping the line",
"shoulders a cargo rig harness and clips in without looking down",
"sweeps debris off the loading apron with a long push broom",
"braces a container with a boot while reaching for the locking pin",
"reads the load ticket twice, then flips the handheld over to check the back",
"waves off a crane operator when the angle is wrong, holds up a fist",
"steps over a bundled cable run without breaking stride",
"peels off a work glove with his teeth to check a handheld display",
"trades a quick look with a colleague when the foreman walks by",
// off-shift / break room
"unwraps a meal packet in the break room and eats standing at the counter",
"passes a drink to the person next to her without being asked",
"leans back in a break room chair with eyes closed, boots crossed at the ankle",
"laughs at something across the break room table, loud enough to carry",
"shows something on a handheld to a colleague and both of them look at it for a moment",
"sits with elbows on knees, turning an empty cup in both hands",
"splashes water on his face at the sink and stands there a moment before turning off the tap",
"talks over the break room noise at volume, gesturing with a fork",
"falls asleep in a break room chair, chin on chest, arms folded",
],
),
(
id: "technician",
label: "Systems Technician",
// Keeps the infrastructure running. Never enough of them.
weight: 4,
skill_focus: ["technical"],
combat_eligible: false,
typical_behaviors: [
"runs a diagnostic routine on a floor console, eyes on the readout",
"traces a conduit run along the ceiling with a handheld light",
"swaps a panel module with practiced speed and no wasted motion",
"logs a fault code into a datapad before moving on",
"presses an ear to a vibrating duct and listens",
"argues quietly with a display that isn't giving the right numbers",
"queries a fault log through her insert without touching the terminal, eyes briefly unfocused",
"stretches both arms overhead in the break room doorway, blocking it without noticing",
// on-shift
"taps a wrench against a junction box lid to test for rattle",
"pulls a burnt relay from a panel and holds it up to the light",
"clips a sensor lead to two terminals and watches the readout settle",
"photographs a fault site with a handheld before touching anything",
"threads a cable through a conduit run without looking, hands working by feel",
"checks a pressure gauge by putting a thumb on the dial housing and reading the needle",
"labels a repaired junction with tape and a marker, block letters",
"reads a service manual on a battered datapad, scrolling with one finger",
"kneels under a raised floor panel with a light between her teeth",
"closes a maintenance hatch and shoulder-checks it twice",
"stands on the second rung of a ladder and reaches without climbing higher",
// off-shift / break room
"sits sideways in a break room chair, back against the wall, feet on the seat beside her",
"pulls up a schematic on a personal handheld and looks at it between bites",
"refills someone else's cup from the urn without commenting on it",
"puts her boots on the break room table and doesn't move them when the foreman walks in",
"describes a problem to a dock worker who doesn't follow it but nods anyway",
"argues a point at the break room table, tapping the surface for emphasis",
"reads something on a personal device with his head tipped back and the screen held at arm's length",
"laughs until he has to set down his drink",
],
),
(
id: "foreman",
label: "Shift Foreman",
// Fewer of them. High visibility. Everyone knows where they are.
weight: 2,
skill_focus: ["observation", "persuasion"],
combat_eligible: false,
typical_behaviors: [
"walks the floor with a datapad under one arm and says nothing",
"pulls a worker aside for a quiet word near the far wall",
"marks a line off a production board and moves to the next one",
"stands at the mezzanine rail watching throughput without expression",
"reviews shift handover notes and circles something with a stylus",
"speaks to a dock crew in a low voice — they listen without nodding",
"sits alone in the break room rubbing the back of her neck, datapad face-down on the table",
"laughs at something a technician says, then catches herself and goes quiet",
// the person beneath the role
"covers a worker's absence from the shift log by redistributing the bay assignments",
"eats lunch standing at a wall terminal so she can watch the floor at the same time",
"takes the call herself instead of forwarding it, one hand pressed to her other ear against the noise",
"corrects a dock worker's form on the cargo rig harness without making it a lesson",
"walks a new hire through the handover checklist once, point by point, no shortcuts",
"keeps a junior worker between herself and the inspection team as the inspectors pass through",
"finds a reason to be nearby when a new worker makes her first solo lift",
"absorbs a production shortfall report without passing the frustration down the line",
"hands a dock worker an extra meal packet and walks away without explaining it",
"sits next to a technician in the break room and doesn't talk, just sits",
"makes a note in the shift log that takes longer to write than it takes to read",
"tells a bad joke to nobody in particular while marking off the production board",
"signs off on a repair she didn't inspect, because she knows who did it",
"stands at the edge of the loading floor for a long moment before walking back",
],
),
(
id: "security",
label: "Facility Security",
// Present, watchful. Not looking for trouble — cataloguing it.
weight: 2,
skill_focus: ["combat", "observation"],
combat_eligible: true,
typical_behaviors: [
"sweeps the access corridor on a timed circuit, same path each time",
"waves a regular through the checkpoint on sight — scans the one behind them out of procedure",
"leans at the restricted bay entrance, arms folded — been watching this corridor since the shift started",
"notes something in a shift log without reacting to it outwardly",
"watches a handover between crews from across the loading floor",
"stops at a junction, looks both ways, and picks the longer route",
"runs an ID check on someone whose face she recognizes, procedure is procedure",
"stands with her back to a structural column where both exits are visible",
"glances at a badge without stopping the person wearing it",
"checks the restricted bay door seal before settling in to watch the corridor",
],
),
// Role presence and weights for this location.
// skill_focus / combat_eligible / behavior_primitives live in the zone-type template.
role_weights: [
( id: "dock_worker", weight: 5 ),
( id: "technician", weight: 4 ),
( id: "foreman", weight: 2 ),
( id: "security", weight: 2 ),
],
social_sites: [
@@ -162,7 +38,6 @@
site_type: "break_room",
label: "Worker Break Room",
// Between shifts. Decompression. People stop performing for a moment.
roles: ["dock_worker", "technician", "foreman"],
min_npcs: 2,
max_npcs: 5,
),
@@ -170,7 +45,6 @@
site_type: "maintenance_bay",
label: "Maintenance Bay",
// Active work site. Technicians and dock workers cross paths here.
roles: ["technician", "dock_worker"],
min_npcs: 2,
max_npcs: 4,
),
@@ -178,9 +52,11 @@
site_type: "loading_platform",
label: "Loading Platform",
// The operational center. Busy, loud, coordinated.
roles: ["dock_worker", "foreman", "security"],
min_npcs: 3,
max_npcs: 8,
),
],
abandoned: false,
poi_overlay: None,
)
+22 -148
View File
@@ -1,19 +1,21 @@
// Krenn Rural Zone — location-specific zone content
// Krenn Rural Zone — location metadata
//
// Schema: server/src/npc/blueprint.rs :: ZoneSpec
// Ticket: #609, #630 (copy team)
// Ticket: #609, #630, #661 (copy team)
// Validate: tooling/validate-ron content/global/krenn-rural-zone.ron zone
//
// This is content for a specific location: a Krenn rural settlement.
// Behaviors, roles, and social sites are culture×zone specific — not reusable
// templates. See Q-057 for the composable behavior generation design that
// will replace hand-authored pools with assembled primitives.
// Location-specific metadata for a Krenn rural agricultural settlement.
// Behavior primitives have moved to the zone-type template:
// content/global/zone-types/rural_agricultural.ron
//
// This file holds: zone_type reference, location metadata, role weights, social sites.
// The generator reads zone_type to find the primitive pool; overrides come from here.
//
// Character: scattered homesteads and small workshops. Unhurried. Community-bound.
// Low throughput, high familiarity. Everyone knows who belongs here.
(
zone_type: "rural",
zone_type: "rural_agricultural",
label: "Rural Settlement",
description: "Scattered homesteads, small workshops, and communal gathering points. Low population density, strong community bonds, subsistence-plus economy. Work is seasonal and visible — everyone knows what everyone else is doing.",
@@ -22,149 +24,21 @@
// 1-10. Sparse. Faces are familiar. Strangers stand out.
population_density: 2,
roles: [
(
id: "farmer",
label: "Farmer",
// Most common. The settlement runs on food production.
weight: 5,
skill_focus: ["technical"],
combat_eligible: false,
typical_behaviors: [
"tends rows of low-growing crops with a long-handled hoe",
"lifts a crate of produce onto a flatbed with practiced ease",
"checks the section's light cycle timer before deciding whether to water",
"patches a cracked irrigation pipe with strips of bonding tape",
"calls across a field to a neighbor without looking up from work",
"hauls produce to the market stall before the morning exchange opens",
"checks seedling trays in a low prefab greenhouse",
"runs a thumb along the edge of a cracked irrigation seal, then sets it aside",
"stacks empty crates at the end of a row and knocks dirt off her boots",
"drags a length of hose to a dry section and clamps the fitting by hand",
"kneels at the base of a struggling plant and parts the soil with two fingers",
"leans on a fence post and watches the sky before going back to the row",
"refills a handheld sprayer from a standing drum without spilling",
"ties a row marker to a stake with a short length of wire",
"wipes sweat from her forehead with the back of a gloved hand",
"loads a wheelbarrow and tips it into a compost bin at the field edge",
"pulls a dead plant by the roots and carries it to the burn pile",
"tests soil moisture by pressing a thumb into the ground beside a seedling",
"walks the perimeter of a field and checks the wire for breaks",
"sets two crates down on the market floor and counts the lids twice",
// tavern / off-duty
"nurses a drink at the end of the bar with both hands wrapped around the glass",
"trades short words with the mechanic at the next seat without turning fully around",
"sits with boots off under the table, socked feet flat on the floor",
"refills a neighbor's cup from her own jug without being asked",
"plays a slow tile game with two others at the corner table",
"slides a credit chit across the bar and waits for change without counting it",
"leans back in the chair and stares at the ceiling for a long moment",
],
),
(
id: "mechanic",
label: "Settlement Mechanic",
// One or two per settlement. Everyone knows who to call.
weight: 3,
skill_focus: ["technical"],
combat_eligible: false,
typical_behaviors: [
"pulls a drive unit from a tiller and examines the worn housing",
"wipes grease on the thigh of her coveralls between jobs",
"explains a repair in clipped shorthand without looking up",
"lines up salvaged parts on a workbench and assesses them",
"welds a seam on a cracked water tank with slow, careful strokes",
"borrows a tool from a neighbor and returns it without being asked",
"taps a seized bolt with a mallet twice before reaching for a longer bar",
"threads a wire through a conduit clip and bites the insulation back with her teeth",
"sets a part down, picks up the spec card beside it, and reads it once",
"uses a straight edge to check the flatness of a repaired flange",
"drains a coolant line into a catch tray and marks the container",
"torques a fastener by feel and then confirms it with a wrench click",
"stacks finished repairs in a corner and photographs them with a handheld",
"jots a note on a strip of tape and sticks it to a part's casing",
"squeezes into a narrow access panel and works by touch",
"straightens up and rolls her neck once before kneeling back down",
// tavern / off-duty
"rinses her hands twice at the basin before sitting down at the bar",
"drops her toolkit bag under the stool and orders without looking at the board",
"listens to a farmer's complaint about a tiller and nods once or twice",
"draws a rough diagram on a napkin to explain something, then folds it away",
"buys a round for the table and returns to her seat before anyone can thank her",
],
),
(
id: "trader",
label: "Itinerant Trader",
// Passes through. Outsider-familiar — not local, not stranger.
weight: 2,
skill_focus: ["persuasion", "observation"],
combat_eligible: false,
typical_behaviors: [
"squares goods on a fold-out portable display with deliberate care",
"leans back on a stool and watches the foot traffic",
"flicks credit chits across the counter with one thumb, barely glancing down",
"holds eye contact through a long pause, waiting for the price to land",
"watches a regular browse the same shelf as last time and says nothing",
"packs unsold goods with no visible frustration",
"unrolls a cloth display on the counter and weights the corners with small stones",
"lifts a sample item and sets it in the light where a browser can see it clearly",
"rewraps an unsold item and tucks it back in the case with a specific order",
"counts coins into a small tray and slides it across the counter",
"pulls a ledger from the bag, checks one line, and closes it",
"marks a price down on the board with a grease stylus and steps back",
"holds a cracked tool up to show the seller where it failed before handing it back",
"folds the portable display flat and straps it to the pack in two moves",
"lays two items side by side on the counter for a customer to compare",
"wipes down the counter surface with a cloth before setting out the next goods",
],
),
(
id: "militia",
label: "Settlement Militia",
// Rare. Part-time. Knows everyone, trusted because of it.
weight: 1,
skill_focus: ["combat", "observation"],
combat_eligible: true,
typical_behaviors: [
"walks the fence line at a measured, unhurried pace",
"leans on the gate post with rifle slung, watching the road",
"waves a familiar face through without checking credentials",
"sits in the shade of the gatehouse with a local newsline",
"stops to talk with a passing farmer, eyes still scanning the perimeter",
"checks the charge on a handheld scanner and clips it back to the belt",
"props a boot on the lower fence rail and scans the far end of the road",
"nods to a passing trader and tracks the cart until it clears the gate",
"marks a log entry on a handheld at the end of a perimeter pass",
"steps out of the gatehouse at the sound of an approaching engine",
],
),
// Role presence and weights for this location.
// skill_focus / combat_eligible / behavior_primitives live in the zone-type template.
role_weights: [
( id: "farmer", weight: 5 ),
( id: "mechanic", weight: 3 ),
( id: "trader", weight: 2 ),
( id: "militia", weight: 1 ),
],
social_sites: [
(
site_type: "tavern",
label: "Local Tavern",
// The Last Shift equivalent for rural Krenn: functional, familiar, slow.
roles: ["farmer", "mechanic", "trader", "militia"],
min_npcs: 3,
max_npcs: 6,
),
(
site_type: "workshop",
label: "Community Workshop",
// Shared space. People fix things together.
roles: ["mechanic", "farmer"],
min_npcs: 2,
max_npcs: 4,
),
(
site_type: "market_stall",
label: "Settlement Market",
// Weekly or daily trading post. Commerce and gossip combined.
roles: ["trader", "farmer"],
min_npcs: 1,
max_npcs: 3,
),
( site_type: "tavern", label: "Local Tavern", min_npcs: 3, max_npcs: 6 ),
( site_type: "workshop", label: "Community Workshop", min_npcs: 2, max_npcs: 4 ),
( site_type: "market_stall", label: "Settlement Market", min_npcs: 1, max_npcs: 3 ),
],
abandoned: false,
poi_overlay: None,
)
@@ -0,0 +1,168 @@
// Industrial Freight Zone-Type Template
//
// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate
// Ticket: #661 (copy team)
// Validate: tooling/validate-ron content/global/zone-types/industrial_freight.ron zone_type
//
// Sources: D-142 (zone-type template architecture).
//
// Zone character: freight handling, cargo throughput, shift-based manufacturing.
// High throughput, functional over comfortable. Faces known by role and bay number.
// The work doesn't stop between shifts — people do.
//
// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append
// cultural flavor at assembly time. Do not encode cultural attitudes in action text.
//
// Roles: dock_worker, technician, foreman, security
// Social site types: break_room, maintenance_bay, loading_platform
(
id: "industrial_freight",
subtype: None,
label: "Industrial Freight Zone",
description: "Freight handling, cargo throughput, shift-based work rhythms. Functional over comfortable. Faces known by role and bay number. The work doesn't stop between shifts — people do.",
// Default economic/density profile. Location specs override.
economic_level: 7,
population_density: 6,
roles: [
(
id: "dock_worker",
label: "Dock Worker",
skill_focus: ["technical"],
combat_eligible: false,
// weight omitted — location specs declare role_weights
behavior_primitives: [
// OnShift
( action: "guides a freight container into position with hand signals", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "checks a manifest against a handheld scanner", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "waits at the loading bay apron, watching the clock", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "calls bay numbers to a colleague across the noise of the floor", context: OnShift, modifier_hint: Some("social_signal") ),
( action: "hooks a cargo sling and steps clear before signaling the lift", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "stacks empty pallets against a wall", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "wipes sweat from their face with a forearm and keeps moving", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "drags a heavy case along the deck plating one-handed, leaning into the weight", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "re-checks a seal on a container door after a colleague already checked it", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "flags a damaged pallet to the foreman without stopping the line", context: OnShift, modifier_hint: Some("authority_response") ),
( action: "shoulders a cargo rig harness and clips in without looking down", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "sweeps debris off the loading apron with a long push broom", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "braces a container with a boot while reaching for the locking pin", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "reads the load ticket twice, then flips the handheld over to check the back", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "waves off a crane operator when the angle is wrong, holds up a fist", context: OnShift, modifier_hint: Some("social_signal") ),
( action: "steps over a bundled cable run without breaking stride", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "peels off a work glove with his teeth to check a handheld display", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "exchanges a brief look with a nearby colleague when the supervisor passes", context: OnShift, modifier_hint: Some("authority_response") ),
// OffDuty / break room
( action: "slumps into a break room chair and stares at nothing for a full minute before reaching for a drink", context: OffDuty, modifier_hint: Some("offduty_posture") ),
( action: "unwraps a meal packet in the break room and eats standing at the counter", context: OffDuty, modifier_hint: Some("offduty_posture") ),
( action: "passes a drink to the person next to her without being asked", context: OffDuty, modifier_hint: Some("social_signal") ),
( action: "leans back in a break room chair with eyes closed, boots crossed at the ankle", context: OffDuty, modifier_hint: Some("offduty_posture") ),
( action: "laughs at something across the break room table, loud enough to carry", context: OffDuty, modifier_hint: Some("social_signal") ),
( action: "shows something on a handheld to a colleague and both of them look at it", context: OffDuty, modifier_hint: Some("social_signal") ),
( action: "sits with elbows on knees, turning an empty cup in both hands", context: OffDuty, modifier_hint: Some("offduty_posture") ),
( action: "splashes water on his face at the sink and stands there a moment before turning off the tap", context: OffDuty, modifier_hint: Some("offduty_posture") ),
( action: "talks over the break room noise at volume, gesturing with a fork", context: OffDuty, modifier_hint: Some("social_signal") ),
( action: "falls asleep in a break room chair, chin on chest, arms folded", context: OffDuty, modifier_hint: Some("offduty_posture") ),
],
),
(
id: "technician",
label: "Systems Technician",
skill_focus: ["technical"],
combat_eligible: false,
behavior_primitives: [
// OnShift
( action: "runs a diagnostic routine on a floor console, eyes on the readout", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "traces a conduit run along the ceiling with a handheld light", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "swaps a panel module, tools back in the pouch before the cover is latched", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "logs a fault code into a datapad before moving on", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "presses an ear to a vibrating duct and listens", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "argues quietly with a display that isn't giving the right numbers", context: OnShift, modifier_hint: Some("social_signal") ),
( action: "queries a fault log through a terminal, eyes briefly unfocused", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "taps a wrench against a junction box lid to test for rattle", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "pulls a burnt relay from a panel and holds it up to the light", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "clips a sensor lead to two terminals and watches the readout settle", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "photographs a fault site with a handheld before touching anything", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "threads a cable through a conduit run without looking, hands working by feel", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "checks a pressure gauge by putting a thumb on the dial housing and reading the needle", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "labels a repaired junction with tape and a marker, block letters", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "reads a service manual on a battered datapad, scrolling with one finger", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "kneels under a raised floor panel with a light between her teeth", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "closes a maintenance hatch and shoulder-checks it twice", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "stands on the second rung of a ladder and reaches without climbing higher", context: OnShift, modifier_hint: Some("physical_manner") ),
// OffDuty / break room
( action: "stretches both arms overhead in the break room doorway, blocking it without noticing", context: OffDuty, modifier_hint: Some("offduty_posture") ),
( action: "sits sideways in a break room chair, back against the wall, feet on the seat beside her", context: OffDuty, modifier_hint: Some("offduty_posture") ),
( action: "pulls up a schematic on a personal handheld and looks at it between bites", context: OffDuty, modifier_hint: Some("offduty_posture") ),
( action: "refills someone else's cup from the urn without commenting on it", context: OffDuty, modifier_hint: Some("social_signal") ),
( action: "puts her boots on the break room table when off-shift", context: OffDuty, modifier_hint: Some("offduty_posture") ),
( action: "describes a problem to a colleague who doesn't follow it but nods anyway", context: OffDuty, modifier_hint: Some("social_signal") ),
( action: "argues a point at the break room table, tapping the surface for emphasis", context: OffDuty, modifier_hint: Some("social_signal") ),
( action: "reads something on a personal device with his head tipped back and the screen held at arm's length", context: OffDuty, modifier_hint: Some("offduty_posture") ),
( action: "laughs until he has to set down his drink", context: OffDuty, modifier_hint: Some("social_signal") ),
],
),
(
id: "foreman",
label: "Shift Foreman",
skill_focus: ["observation", "persuasion"],
combat_eligible: false,
behavior_primitives: [
// OnShift
( action: "walks the floor with a datapad under one arm and says nothing", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "pulls a worker aside for a quiet word near the far wall", context: OnShift, modifier_hint: Some("authority_response") ),
( action: "marks a line off a production board and moves to the next one", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "stands at the mezzanine rail watching throughput without expression", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "reviews shift handover notes and circles something with a stylus", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "speaks to a crew in a low voice — they listen without nodding", context: OnShift, modifier_hint: Some("authority_response") ),
( action: "covers a worker's absence from the shift log by redistributing the bay assignments", context: OnShift, modifier_hint: Some("authority_response") ),
( action: "eats lunch standing at a wall terminal so she can keep an eye on the work", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "takes the call herself instead of forwarding it", context: OnShift, modifier_hint: Some("authority_response") ),
( action: "corrects a worker's form on a piece of equipment without making it a lesson", context: OnShift, modifier_hint: Some("authority_response") ),
( action: "walks a new hire through the handover checklist once, point by point, no shortcuts", context: OnShift, modifier_hint: Some("authority_response") ),
( action: "keeps a junior worker between herself and the inspection team as the inspectors pass through", context: OnShift, modifier_hint: Some("authority_response") ),
( action: "finds a reason to be nearby when a new worker makes her first solo lift", context: OnShift, modifier_hint: Some("authority_response") ),
( action: "absorbs a production shortfall report without passing the frustration down the line", context: OnShift, modifier_hint: Some("authority_response") ),
( action: "hands a worker an extra meal packet and walks away without explaining it", context: OnShift, modifier_hint: Some("social_signal") ),
( action: "signs off on a repair they didn't personally inspect", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "stands at the edge of the loading floor for a long moment before walking back", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "makes a note in the shift log that takes longer to write than it takes to read", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "tells a bad joke to nobody in particular while marking off the production board", context: OnShift, modifier_hint: Some("social_signal") ),
// OffDuty
( action: "sits alone in the break room rubbing the back of her neck, datapad face-down on the table", context: OffDuty, modifier_hint: Some("offduty_posture") ),
( action: "laughs at something a colleague says, then catches herself and goes quiet", context: OffDuty, modifier_hint: Some("social_signal") ),
( action: "sits next to someone in the break room and doesn't talk, just sits", context: OffDuty, modifier_hint: Some("social_signal") ),
],
),
(
id: "security",
label: "Facility Security",
skill_focus: ["combat", "observation"],
combat_eligible: true,
behavior_primitives: [
// OnShift
( action: "sweeps the access corridor on a timed circuit, same path each time", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "waves a regular through the checkpoint on sight — scans the one behind them out of procedure", context: OnShift, modifier_hint: Some("social_signal") ),
( action: "leans at the restricted bay entrance, arms folded, watching the corridor", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "notes something in a shift log without reacting to it outwardly", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "watches a handover between crews from across the loading floor", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "stops at a junction, looks both ways, and picks the longer route", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "runs an ID check on someone whose face she recognizes, procedure is procedure", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "stands with her back to a structural column where both exits are visible", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "glances at a badge without stopping the person wearing it", context: OnShift, modifier_hint: Some("social_signal") ),
( action: "checks the restricted bay door seal before settling in to watch the corridor", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "runs the same check routine when the supervisor is watching as when she isn't", context: OnShift, modifier_hint: Some("authority_response") ),
( action: "acknowledges the facility manager's walk-through with a nod and doesn't change her position", context: OnShift, modifier_hint: Some("authority_response") ),
],
),
],
// Valid social site types for this zone type.
// Location specs declare which appear, with their own label, min_npcs, max_npcs.
social_site_types: [
( site_type: "break_room", eligible_roles: ["dock_worker", "technician", "foreman"] ),
( site_type: "maintenance_bay", eligible_roles: ["technician", "dock_worker"] ),
( site_type: "loading_platform", eligible_roles: ["dock_worker", "foreman", "security"] ),
],
)
@@ -0,0 +1,165 @@
// Rural Agricultural Zone-Type Template
//
// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate
// Ticket: #661 (copy team)
// Validate: tooling/validate-ron content/global/zone-types/rural_agricultural.ron zone_type
//
// Sources: D-142 (zone-type template architecture).
//
// Zone character: scattered homesteads, small workshops, open agricultural land.
// Seasonal work rhythms, low population density, strong community familiarity.
// Work is visible and shared — everyone knows what everyone else is doing.
//
// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append
// cultural flavor at assembly time. Do not encode cultural attitudes in action text.
//
// Roles: farmer, mechanic, trader, militia
// Social site types: tavern, workshop, market_stall
(
id: "rural_agricultural",
subtype: None,
label: "Rural Agricultural Zone",
description: "Crop farming, small workshops, communal settlement. Low density, community-bonded, self-sufficient economy. Work is visible to neighbors — everyone knows what everyone else is doing.",
// Default economic/density profile. Location specs override.
economic_level: 3,
population_density: 2,
roles: [
(
id: "farmer",
label: "Farmer",
skill_focus: ["technical"],
combat_eligible: false,
// weight omitted — location specs declare role_weights
behavior_primitives: [
// OnShift
( action: "works back along a crop row, stopping to pull weeds by the root", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "lifts a crate of produce onto a flatbed and reaches for the next before it settles", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "checks the section's light cycle timer before deciding whether to water", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "patches a cracked irrigation pipe with bonding tape", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "calls across a field to a neighbor without looking up from work", context: OnShift, modifier_hint: Some("social_signal") ),
( action: "hauls produce to the market stall before the morning exchange opens", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "crouches over seedling trays and pinches back a leggy stem that grew sideways", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "runs a thumb along the edge of a cracked irrigation seal, then sets it aside", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "stacks empty crates at the end of a row", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "drags a length of hose to a dry section and clamps the fitting by hand", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "kneels at the base of a struggling plant and parts the soil with two fingers", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "leans on a fence post and watches the sky before going back to the row", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "refills a handheld sprayer from a standing drum", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "ties a row marker to a stake with a short length of wire", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "pulls a glove off to wipe her face, pulls it back on without looking", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "loads a wheelbarrow and tips it into a compost bin at the field edge", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "pulls a dead plant by the roots and carries it to the burn pile", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "tests soil moisture by pressing a thumb into the ground beside a seedling", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "walks the field edge, pulling the wire taut at each span to test the tension", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "sets two crates down on the market floor and counts the lids twice", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "answers an inspector's question without breaking the task rhythm", context: OnShift, modifier_hint: Some("authority_response") ),
( action: "waits for the settlement head to finish speaking before going back to work", context: OnShift, modifier_hint: Some("authority_response") ),
// Social / off-duty
( action: "nurses a drink at the end of the bar with both hands wrapped around the glass", context: Social, modifier_hint: Some("offduty_posture") ),
( action: "trades short words with the person at the next seat without turning fully around", context: Social, modifier_hint: Some("social_signal") ),
( action: "sits with boots off under the table, socked feet flat on the floor", context: Social, modifier_hint: Some("offduty_posture") ),
( action: "refills a neighbor's cup from her own jug without being asked", context: Social, modifier_hint: Some("social_signal") ),
( action: "plays a slow tile game with two others at the corner table", context: Social, modifier_hint: Some("offduty_posture") ),
( action: "slides a credit chit across the bar and waits for change without counting it", context: Social, modifier_hint: Some("offduty_posture") ),
( action: "leans back in the chair and stares at the ceiling for a long moment", context: Social, modifier_hint: Some("offduty_posture") ),
],
),
(
id: "mechanic",
label: "Settlement Mechanic",
skill_focus: ["technical"],
combat_eligible: false,
behavior_primitives: [
// OnShift
( action: "pulls a drive unit from a tiller and examines the worn housing", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "wipes grease on the thigh of her coveralls between jobs", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "explains a repair in clipped shorthand without looking up", context: OnShift, modifier_hint: Some("social_signal") ),
( action: "lines up salvaged parts on a workbench and assesses them", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "welds a seam on a cracked water tank with slow, careful strokes", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "borrows a tool from a neighbor and returns it without being asked", context: OnShift, modifier_hint: Some("social_signal") ),
( action: "taps a seized bolt with a mallet twice before reaching for a longer bar", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "threads a wire through a conduit clip and bites the insulation back with her teeth", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "sets a part down, picks up the spec card beside it, and reads it once", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "uses a straight edge to check the flatness of a repaired flange", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "drains a coolant line into a catch tray and marks the container", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "torques a fastener by feel and then confirms it with a wrench click", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "stacks finished repairs in a corner and photographs them with a handheld", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "jots a note on a strip of tape and sticks it to a part's casing", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "squeezes into a narrow access panel and works by touch", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "straightens up and rolls her neck once before kneeling back down", context: OnShift, modifier_hint: Some("physical_manner") ),
// Social / off-duty
( action: "rinses her hands twice at the basin before sitting down at the bar", context: Social, modifier_hint: Some("offduty_posture") ),
( action: "drops her toolkit bag under the stool and orders without looking at the board", context: Social, modifier_hint: Some("offduty_posture") ),
( action: "listens to a complaint about a piece of equipment and nods once or twice", context: Social, modifier_hint: Some("social_signal") ),
( action: "draws a rough diagram on a napkin to explain something, then folds it away", context: Social, modifier_hint: Some("social_signal") ),
( action: "buys a round for the table and returns to her seat before anyone can thank her", context: Social, modifier_hint: Some("social_signal") ),
],
),
(
id: "trader",
label: "Itinerant Trader",
skill_focus: ["persuasion", "observation"],
combat_eligible: false,
behavior_primitives: [
// OnShift
( action: "squares goods on a fold-out portable display", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "leans back on a stool and tracks a browser who has checked the same display twice without committing", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "flicks credit chits across the counter with one thumb", context: OnShift, modifier_hint: Some("physical_manner") ),
( action: "holds eye contact through a long pause, waiting for the price to land", context: OnShift, modifier_hint: Some("social_signal") ),
( action: "watches a regular browse the same shelf as last time and says nothing", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "packs unsold goods without reacting", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "unrolls a cloth display on the counter and weights the corners with small stones", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "lifts a sample item and sets it in the light where a browser can see it clearly", context: OnShift, modifier_hint: Some("social_signal") ),
( action: "rewraps an unsold item and tucks it back in the case with a specific order", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "counts coins into a small tray and slides it across the counter", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "pulls a ledger from the bag, checks one line, and closes it", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "marks a price down on the board with a grease stylus and steps back", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "holds a cracked item up to show where it failed before handing it back", context: OnShift, modifier_hint: Some("social_signal") ),
( action: "folds the portable display flat and straps it to the pack in two moves", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "lays two items side by side on the counter for a customer to compare", context: OnShift, modifier_hint: Some("social_signal") ),
( action: "wipes down the counter surface with a cloth before setting out the next goods", context: OnShift, modifier_hint: Some("work_pace") ),
// Social
( action: "nurses a drink at the far end of the bar, watching who comes in", context: Social, modifier_hint: Some("environmental_scan") ),
( action: "talks price with whoever's sitting nearest without making it a pitch", context: Social, modifier_hint: Some("social_signal") ),
( action: "buys a round and tracks who accepts and who doesn't", context: Social, modifier_hint: Some("social_signal") ),
( action: "listens more than she talks at the bar, refilling her glass slowly", context: Social, modifier_hint: Some("offduty_posture") ),
],
),
(
id: "militia",
label: "Settlement Militia",
skill_focus: ["combat", "observation"],
combat_eligible: true,
behavior_primitives: [
// OnShift
( action: "walks the fence line at a measured, unhurried pace", context: OnShift, modifier_hint: Some("work_pace") ),
( action: "leans on the gate post with rifle slung, watching the road", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "waves a familiar face through without checking credentials", context: OnShift, modifier_hint: Some("social_signal") ),
// on-duty quiet time — context is OnShift but posture reads as off-duty
( action: "sits in the shade of the gatehouse reading a local newsline", context: OnShift, modifier_hint: Some("offduty_posture") ),
( action: "stops to talk with a passerby, eyes still scanning the perimeter", context: OnShift, modifier_hint: Some("social_signal") ),
( action: "checks the charge on a handheld scanner and clips it back to the belt", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "props a boot on the lower fence rail and scans the far end of the road", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "nods to a passing cart and tracks it until it clears the gate", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "marks a log entry on a handheld at the end of a perimeter pass", context: OnShift, modifier_hint: Some("task_completion") ),
( action: "steps out of the gatehouse at the sound of an approaching engine", context: OnShift, modifier_hint: Some("environmental_scan") ),
( action: "reports a situation to the settlement head without editorializing", context: OnShift, modifier_hint: Some("authority_response") ),
( action: "straightens slightly when the relief officer arrives for handover", context: OnShift, modifier_hint: Some("authority_response") ),
// OffDuty
( action: "sits at the end of the bar still in kit, drink in hand, not really off yet", context: OffDuty, modifier_hint: Some("offduty_posture") ),
( action: "catches up with a neighbor over a drink without mentioning work", context: Social, modifier_hint: Some("social_signal") ),
],
),
],
// Valid social site types for this zone type.
// Location specs declare which appear, with their own label, min_npcs, max_npcs.
social_site_types: [
( site_type: "tavern", eligible_roles: ["farmer", "mechanic", "trader", "militia"] ),
( site_type: "workshop", eligible_roles: ["mechanic", "farmer"] ),
( site_type: "market_stall", eligible_roles: ["trader", "farmer"] ),
],
)
+20 -9
View File
@@ -2,6 +2,17 @@
# Ticket: #536 | Author: Mellanie | Sprint: 14
# Decision refs: D-078, D-018, D-071, D-035
#
# LEGACY CONTENT — v0.1 hand-authored pool. DO NOT DELETE.
# All entries in this file reference named NPCs from the Sova Transit District
# vertical slice (Kael Davan, Sera Venn, Naia Tamm, Voss, Nils, Maret Korr, etc.).
# These named NPCs were authored for the drama module system (ticket #158), which
# was superseded before implementation. The named references in this file are
# therefore broken — they reference characters that do not exist in the generated
# NPC population.
# Ticket #664 tracks replacement of this file with a zone-type-aware overheard
# generator that produces conversations from role pairs rather than named characters.
# Until #664 ships, this file is not served at runtime.
#
# These are conversations the player can overhear when stationary near two
# NPCs. The passive dialogue panel (D-078) displays them with per-word
# occlusion based on distance, ambient noise, and ListeningFocus stance.
@@ -249,7 +260,7 @@ pairs:
location_hints: [the-terminal]
access: [public]
trust: surface
knowledge_payload: "Container 4471 is being deliberately held in temp storage. 'Routing says hold' — someone modified the routing instruction. Cross-reference: investigation.container_delay."
knowledge_payload: "Container 4471 is being deliberately held in temp storage. 'Routing says hold' — someone modified the routing instruction."
tags: [container-4471, routing, contraband-adjacent, investigation-payload]
- id: overheard_014
@@ -329,7 +340,7 @@ pairs:
location_hints: [the-terminal]
access: [public]
trust: surface
knowledge_payload: "Manifest weight discrepancy exists and dock workers are suspicious of the official explanation. Cross-reference: investigation.manifest_discrepancy."
knowledge_payload: "Manifest weight discrepancy exists and dock workers are suspicious of the official explanation."
tags: [manifest, weight-discrepancy, contraband-adjacent, investigation-payload]
- id: overheard_019
@@ -461,7 +472,7 @@ pairs:
location_hints: [the-terminal, the-last-shift]
access: [public]
trust: surface
knowledge_payload: "Kael was in corridor B-7 off-shift. Eyewitness account. Cross-reference: investigation.kael_corridor_meeting."
knowledge_payload: "Kael was in corridor B-7 off-shift. Eyewitness account."
tags: [kael, corridor-b7, investigation-payload, friend-arc, high-value]
- id: overheard_027
@@ -477,7 +488,7 @@ pairs:
location_hints: [the-last-shift]
access: [public]
trust: surface
knowledge_payload: "Kael met with an unidentified person at corridor B-7 during off-hours. Cross-reference: investigation.kael_unknown_contact."
knowledge_payload: "Kael met with an unidentified person at corridor B-7 during off-hours."
tags: [kael, unknown-contact, corridor-b7, friend-arc, high-value, investigation-payload]
- id: overheard_028
@@ -493,7 +504,7 @@ pairs:
location_hints: [the-last-shift]
access: [public]
trust: surface
knowledge_payload: "Torek is spending significantly above his salary at The Last Shift. Cross-reference: investigation.torek_spending_pattern."
knowledge_payload: "Torek is spending significantly above his salary at The Last Shift."
tags: [torek, spending, lera, investigation-payload, ring-adjacent]
- id: overheard_029
@@ -621,7 +632,7 @@ pairs:
location_hints: [the-last-shift]
access: [public]
trust: surface
knowledge_payload: "Kael's behavior has changed at home. Sleepless, secretive, won't explain to Naia. Cross-reference: behavioral.kael_behavioral_change, investigation.kael_attempting_exit."
knowledge_payload: "Kael's behavior has changed at home. Sleepless, secretive, won't explain to Naia. Cross-reference: behavioral.kael_behavioral_change."
tags: [kael, naia, behavior, friend-arc, investigation-payload]
- id: overheard_037
@@ -653,7 +664,7 @@ pairs:
location_hints: [the-last-shift]
access: [public]
trust: surface
knowledge_payload: "Kael is actively trying to leave 'something' — most likely the ring. He's researching options. Cross-reference: investigation.kael_attempting_exit."
knowledge_payload: "Kael is actively trying to leave 'something' — most likely the ring. He's researching options."
tags: [kael, exit, ring-adjacent, friend-arc, investigation-payload, high-value]
- id: overheard_039
@@ -685,7 +696,7 @@ pairs:
location_hints: [the-last-shift]
access: [public]
trust: surface
knowledge_payload: "Torek met with someone in the maintenance corridors late at night. Cross-reference: investigation.torek_ring_meeting."
knowledge_payload: "Torek met with someone in the maintenance corridors late at night."
tags: [torek, maintenance, midnight, ring-adjacent, investigation-payload]
# ===================================================================
@@ -785,7 +796,7 @@ pairs:
location_hints: [the-last-shift]
access: [public]
trust: surface
knowledge_payload: "Sera is documenting something privately — possibly her own investigation or evidence she's sitting on. Cross-reference: investigation.sera_unreported_evidence."
knowledge_payload: "Sera is documenting something privately — possibly her own investigation or evidence she's sitting on."
tags: [sera, naia, list, evidence, friend-arc, investigation-payload, dual-lens]
- id: overheard_047
+1 -1
View File
@@ -12,7 +12,7 @@ Cross-domain decisions live in one file with cross-reference notes in related fi
|------|--------|-----------|
| [architecture.md](architecture.md) | Technical foundation | D-008, D-009, D-010, D-012, D-020, D-026, D-030, D-031, D-041, D-042, D-054, D-055, D-066, D-068, D-073, D-085, D-088, D-094, D-096, D-097, D-099, D-100, D-101, D-102, D-103, D-106, D-108, D-109, D-113, D-133, D-134, D-135, D-136, D-137 |
| [perception.md](perception.md) | Player observation | D-011, D-015, D-016, D-017, D-018, D-019, D-033, D-035, D-043, D-044, D-045, D-046, D-047, D-048, D-049, D-052, D-056, D-057, D-058, D-059, D-060, D-061, D-067, D-069, D-070, D-071, D-072, D-076, D-077, D-078, D-086 |
| [content.md](content.md) | NPC, dialogue, templates | D-023, D-024, D-025, D-028, D-029, D-032, D-034, D-035, D-036, D-037, D-050, D-062, D-063, D-064, D-074, D-075, D-084, D-090, D-092, D-093, D-095, D-098, D-104, D-105, D-107, D-121, D-122, D-123, D-124, D-125, D-126, D-127, D-128, D-129, D-130, D-131, D-132, D-138 |
| [content.md](content.md) | NPC, dialogue, templates | D-023, D-024, D-025, D-028, D-029, D-032, D-034, D-035, D-036, D-037, D-050, D-062, D-063, D-064, D-074, D-075, D-084, D-090, D-092, D-093, D-095, D-098, D-104, D-105, D-107, D-121, D-122, D-123, D-124, D-125, D-126, D-127, D-128, D-129, D-130, D-131, D-132, D-138, D-139, D-140, D-142 |
| [scope.md](scope.md) | Game concept, prototype | D-001, D-003, D-005, D-006, D-007, D-013, D-014, D-027, D-038, D-039, D-051, D-053, D-065, D-087, D-089, D-091, D-114, D-115, D-116, D-117, D-118, D-119, D-120 |
| [process.md](process.md) | Team, workflow | D-004, D-021, D-022, D-040 |
| [questions.md](questions.md) | Open questions (index) | Q-001 through Q-054 |
+77 -4
View File
@@ -325,8 +325,9 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
- **Source:** Where's the Fun? Workshop (original); LLM Voice Pipeline Workshop (amendment)
- **Raised by:** Team Leader (Jeroen)
- **Dissent:** None on amendment
- **Amendment attribution:** The two-mode distinction (build-time authoring tool vs. runtime background enhancement) and the six dialogue re-voicing quality constraints are Paula's contribution from LLM Voice Pipeline Workshop Round 3. The two-mode framing is the organizing principle: build-time mode inherits the original D-123 safety model (human review); runtime mode operates under a different safety model (three-layer fallback) that was validated in Spikes 1 and 2.
- **Amended by:** [D-138](#d-138-llm-re-voicing-pipeline-for-npc-voice) (LLM Voice Pipeline Workshop, 2026-03-07)
- **Cross-reference:** [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-128](#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture) (culture profile as generator input)
- **Cross-reference:** [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-128](#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture) (culture profile as generator input), [D-140](#d-140-dialogue-re-voicing-quality-constraints--paulas-six-rules) (dialogue re-voicing quality constraints)
### D-124: In-game ollama for live NPC dialogue — ~~deferred~~ SUPERSEDED by D-138
- **Date:** 2026-03-05
@@ -411,7 +412,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
- **Date:** 2026-03-07
- **Decision:** NPC observable behaviors and dialogue are processed through an LLM re-voicing pipeline that translates culture-neutral semantic base text into character-voiced output. The pipeline is a background runtime enhancement, not a live generation system. Tell behaviors are base-text passthrough — always. Active tell state influences the re-voicing prompt for surrounding content (tells are read-only inputs to the LLM, never LLM outputs). The game is complete and functional without the pipeline; it is an enhancement that elevates voice quality for players with sufficient hardware.
- **Architecture:**
- **Model:** Gemma 2 2B IT Q4_K_M (~1.6GB), bundled as `server/models/gemma2.gguf`. No fallback model. *(Amended 2026-03-07: Phi-3 dropped entirely after Spike 1 — Gemma 2B produces superior culturally-differentiated output at the same quantization. Original GGUF: `gemma-2-2b-it-Q4_K_M.gguf` from Hugging Face bartowski/gemma-2-2b-it-GGUF.)*
- **Model:** Gemma 2 2B IT Q4_K_M (~1.6GB), bundled as `server/models/gemma2.gguf`. No fallback model. *(Amended 2026-03-07: Phi-3 dropped entirely after Spike 1 — Gemma 2B produces superior culturally-differentiated output at the same quantization. Original GGUF: `gemma-2-2b-it-Q4_K_M.gguf` from Hugging Face bartowski/gemma-2-2b-it-GGUF.)* **Model provenance policy (Jeroen, 2026-03-07):** Chinese-origin models (Qwen/Alibaba and equivalents) are excluded. Preference: Google (Gemma) primary, Microsoft (Phi) as fallback class. Constraint applies to any future model change — if benchmarks require a different model, this provenance policy is re-checked first. Apache 2.0 or MIT license required.
- **Runtime:** `llama-cpp-rs` with GGUF format. Separate inference thread pool at below-normal priority. *(Amended 2026-03-07, Spike 2: IPC is stdin/stdout JSONL pipes, not HTTP. Each worker owns a piped `sr-voice` child process — no network ports. This satisfies Gemma 2 Terms & Conditions: model is only reachable through the game server's queue, never exposed as a service.)*
- **Content tiers:** Baked (hub zones, build-time, human-reviewed) → Pre-voiced (background queue, priority-ordered) → Base text fallback (always present).
- **Tell treatment:** Passthrough always. Tell state flows into re-voicing prompts as universal tone injectors. Cultural flavor is conditional and additive — humans are humans first; micro-expressions and body language must remain universally recognizable. Per-culture tell-tone tables are optional enrichment, not a launch requirement. *(Amended 2026-03-07, Spike 2: Tell differentiation at 2B — 3/5 tells produce distinguishable output (Nervous, Guarded, Angry). Friendly and RoutineDeviation are inert at 2B capacity — model cannot reliably differentiate them from neutral. Deferred to post-ship or larger model. Angry tell requires length-aware injectors: short/medium content gets standard compression, long content (≥16 words) gets an explicit "keep full claim intact" instruction to prevent destructive information loss.)*
@@ -431,7 +432,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
- **Amends:** [D-123](#d-123-generative-ai-for-npc-content--build-time-authoring-tool-and-runtime-voice-pipeline) (scope extended from authoring tool to authoring + runtime)
- **Supersedes:** [D-124](#d-124-in-game-ollama-for-live-npc-dialogue--deferred-superseded-by-d-138) (in-game AI no longer deferred)
- **Resolves:** Q-057 (composable behavior generation), Q-012 (generation expansion method)
- **Cross-reference:** [D-010](architecture.md#d-010) (information boundaries), [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-122](#d-122-all-npcs-generated--named-npcs-deferred) (all NPCs generated), [D-128](#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture) (culture as generator input), [D-029](#d-029-population-entanglement-ratio--305020) (NPC tier model), [D-092](perception.md#d-092) (anchor lines)
- **Cross-reference:** [D-010](architecture.md#d-010) (information boundaries), [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-122](#d-122-all-npcs-generated--named-npcs-deferred) (all NPCs generated), [D-128](#d-128-culture-implicit-in-starting-location--krenn-system-equals-krenn-culture) (culture as generator input), [D-029](#d-029-population-entanglement-ratio--305020) (NPC tier model), [D-092](perception.md#d-092) (anchor lines), [D-140](#d-140-dialogue-re-voicing-quality-constraints--paulas-six-rules) (dialogue re-voicing quality constraints)
### D-139: Composable behavior primitives — three-layer assembly model
- **Date:** 2026-03-13
@@ -448,6 +449,78 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
- **Resolves:** Q-057 (composable behavior generation — data structure definition)
- **Cross-reference:** [D-138](#d-138-llm-re-voicing-pipeline-for-npc-voice) (resolved pipeline, this resolves data format), [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-122](#d-122-all-npcs-generated--named-npcs-deferred) (all NPCs generated)
### D-140: Dialogue re-voicing quality constraints — Paula's six rules
- **Date:** 2026-03-13
- **Decision:** Six binding constraints govern the LLM re-voicing queue for all dialogue lines. These rules protect the information asymmetry mechanic (D-005), character voice integrity, and game narrative legibility. They are implemented in the prompt engineering layer and validated in baked content review.
- **D-140-R1 — Secret-tier passthrough:** Lines tagged `trust: secret` (D-028 Layer 3) never enter the re-voicing queue. They are served as authored base text unconditionally. Re-voicing risks dramatization (inflating the disclosure) or trivialization (flattening the weight of the secret) — both failures corrupt the earned relationship payload.
- **D-140-R2 — Epistemic weight must not shift:** Certainty level of factual claims must survive re-voicing unchanged. Hedge words ("I think," "I heard," "might be," "probably") and direct evidential markers ("I saw," "I was there," "he told me") must appear in re-voiced output with the same epistemic force as in the base text. Epistemic drift is the dialogue re-voicing failure mode most invisible to reviewers and most damaging to gameplay — the player reads voiced text and constructs a knowledge model. A shifted hedge changes what the player knows.
- **D-140-R3 — Access tier feel must be preserved:** The social register appropriate to the D-028 access tier tag must survive re-voicing. `public` stays neutral-transactional; `peer` stays lateral-relaxed; `insider` stays familiar-complicit; `authority` stays institutional-asymmetric; `hostile` stays minimal-closed. The tag governs eligibility; the register governs feel. An `insider` line re-voiced into institutional language reads as `authority` to the player regardless of tag. Implementation: access tier injected as a constraint clause alongside the culture injector.
- **D-140-R4 — Named entities are passthrough within output:** Any proper noun in the base text (NPC names, location names, faction names, technology terms) must appear verbatim in the re-voiced output. Named entities carry specific information — "Kael" and "that dock worker" are not interchangeable in an information-asymmetry game. Implementation: extraction step before re-voicing; protected entity list injected as a hard constraint. The extractor need not understand lore — capitalized terms are sufficient for identification.
- **D-140-R5 — Relationship-specific lines are passthrough:** Any dialogue line naming a specific third-party NPC or describing a specific interpersonal event is not re-voiced. It is served as authored base text. These lines carry social information whose phrasing is load-bearing — the hesitation, the neutral delivery, the precise ambiguity are all authored intentionally. Re-voicing risks substituting the named NPC with a reference, dramatizing the event, or adding social judgment not in the original.
- **D-140-R6 — Tell-context modifier cannot override culture register:** When a tell-context injector is active, it shapes emotional inflection within the culture register — it does not replace the register. A Krenn NPC with a Nervous tell still speaks in Krenn register (direct, minimal pleasantries, working-class pragmatic) while the content reflects nervous pressure. Culture is primary (D-121); tell-context is situational. Implementation: culture injector is always applied before tell-context modifier; tell-context is framed as inflection, not override.
- **Rationale:** D-138 established the architecture; these rules operationalize the quality floor for dialogue content specifically. Dialogue re-voicing carries higher information risk than behavior re-voicing — dialogue is direct player-NPC exchange where epistemic signals and relationship registers matter most. These rules scale with the pipeline: at 300 systems and thousands of NPCs, the prompt engineering layer must enforce these constraints programmatically, not through per-line human review. The constraints are formalized here so server team, copy team, and QA can reference them independently.
- **Scaling note:** R4 (named entity extraction) requires a proper noun tagger that works across all culture naming conventions — Krenn names differ structurally from other cultures. The extractor approach (capitalized terms as proxy) is sufficient for the Krenn launch system but must be culture-aware for systems with non-capitalized or logographic naming conventions. This is a DLC-scope concern, not a v0.2 blocker.
- **Source:** LLM Voice Pipeline Workshop (2026-03-07), Paula Round 3 (`docs/workshops/llm-voice-pipeline/paula-round3.md`)
- **Raised by:** Paula (LLM Voice Pipeline Workshop, Round 3)
- **Dissent:** None
- **Cross-reference:** [D-123](#d-123-generative-ai-for-npc-content--build-time-authoring-tool-and-runtime-voice-pipeline) (pipeline modes), [D-138](#d-138-llm-re-voicing-pipeline-for-npc-voice) (full architecture), [D-028](#d-028-four-relational-dialogue-layers) (access tier model), [D-005](scope.md#d-005-core-concept---single-character-first-person-story-generator) (single character, information asymmetry as core), [D-092](perception.md#d-092) (anchor lines)
### D-142: Zone-type template architecture for scalable NPC behavior
- **Date:** 2026-03-13
- **Decision:** Behavior primitives are zone-type-generic, not per-location. The content architecture for NPC behavior across 300+ systems is a three-layer composition model:
**Layer 1 — Zone-type primitives (what the body does):** Universal physical stage directions per role, defined at the zone-type level. A `farmer` role in a `rural_agricultural` zone does the same base actions in any system. Primitives are authored once per role per zone type. They are context-tagged (`OnShift`, `OffDuty`, `Social`) and carry an optional `modifier_hint` for category-matched culture assembly.
**Layer 2 — Culture modifiers (how this culture does it):** Clauses appended to primitives at assembly time, defined on `CultureProfile`. Seven categories: `work_pace`, `physical_manner`, `social_signal`, `task_completion`, `environmental_scan`, `offduty_posture`, `authority_response`. Culture modifiers are authored once per culture, work with all zone types immediately.
**Layer 3 — Gemma LLM flavor (what's happening here and now):** Runtime enrichment only. Adds location-specific sensory and environmental detail: weather, time of day, lighting, ambient sound, physical environment state. Layer 3 is **culture-neutral** — it must not introduce cultural vocabulary, must not generate named entities, must not override culture register (D-140-R6), must not alter epistemic markers (D-140-R2). Layer 3 follows the pre-voiced three-layer safety model from D-138 (base-text fallback on failure, validated injector vocabulary, contamination filter for named entities). If Layer 3 fails or is unavailable, the Layer 1+2 assembly is served as-is.
**Standalone readability constraint:** Layer 1+2 assembly (base text) must be playable and informative without the LLM. A player reading base text must be able to read what an NPC is doing. "Works a crop row, stopping to pull weeds, without wasted motion" is informative; "farms" is not. This constraint governs primitive authoring across all zone types.
**Location spec format:** Location files (`content/locations/{system}-{zone}.ron`) declare a `zone_type` identifier and reference a `culture`. They carry metadata (economic_level, population_density, role weights, social sites) but contain **no primitives**. All behavior content lives at the zone-type and culture layers.
- **Zone-type taxonomy (31 types, v1.0):** The following zone types constitute the canonical behavior template library. Each produces a distinct NPC behavior pool and distinct map generator layout template. Zone types sharing a group prefix differ enough in physical layout to require separate templates.
| Group | Zone Types |
|-------|-----------|
| Rural | `rural_agricultural`, `rural_pastoral`, `rural_aquaculture`, `rural_orbital` |
| Industrial | `industrial_freight`, `industrial_manufacturing`, `industrial_processing` |
| Port | `port_space`, `port_surface`, `port_maritime`, `port_fishing` |
| Extraction | `extraction_space`, `extraction_surface`, `extraction_platform` |
| Commercial | `commercial_market`, `commercial_transit` |
| Administrative | `administrative_civil`, `administrative_judicial` |
| Single | `research_station`, `medical_facility`, `military_garrison`, `security_checkpoint`, `entertainment_hospitality`, `entertainment_venue`, `residential_station`, `residential_surface`, `residential_dispersed`, `detention_facility`, `archaeological_site`, `wilderness_frontier`, `diplomatic_elite` |
Subtype distinctions within groups are map-generator-significant: a `port_space` (docking bays, airlocks, approach corridors) generates a physically different layout from `port_maritime` (piers, wharves, waterfront) or `port_fishing` (jetties, small craft, catch processing), and the NPC actions differ accordingly.
- **POI system (three-tier):** Points of interest that create narrative destinations (monuments, gatebuilder ruins, prisons, pilgrimage sites, abandoned installations) are handled at three levels without requiring new zone types for each:
*Tier 1 — POI-as-zone-type:* Sites large enough to have distinct layout, NPC population, and behavior pool are zone types. `archaeological_site` and `detention_facility` are in the canonical 31. Additional large POI zone types can be added as content permits.
*Tier 2 — `abandoned` flag:* Any zone type can carry `abandoned: true` on its location spec. The map generator produces a decay variant of the base layout; the behavior pool switches to a cross-cutting scavenger/squatter/investigator primitive set. This generates abandoned station variants, ruined industrial facilities, collapsed residential blocks, and derelict extraction rigs without pre-authoring each as a separate zone type.
*Tier 3 — `poi_overlay` field:* Small POIs (monuments, memorials, commemorative markers, shrines, public art) exist within an existing zone rather than as their own map. The location spec carries a `poi_overlay` list; the map generator places overlay elements within the zone layout. No new behavior pool required.
The combination handles the full POI design space: `gatebuilder_ruin` = `archaeological_site` zone type; `abandoned_station` = any station zone type + `abandoned: true`; `monument` = `poi_overlay` on a `commercial_transit` or `residential_surface` zone; `pilgrimage_site` = `poi_overlay` cluster on appropriate base zone, or its own zone type if narrative scale warrants.
- **Scale math:** 31 zone types × ~4 roles × ~15 primitives = ~1,860 authored primitive lines. 300+ cultures × ~12 modifiers = ~3,600+ modifier clauses. ~5,500 authored lines produce behavior across unlimited locations. Authoring cost is O(zone_types + cultures), not O(locations). New location: pick zone type + culture + metadata — zero behavior authoring. New culture: ~12 modifiers + voice persona — works with all 31 zone types immediately. New zone type: ~60 primitives — works with all cultures immediately.
- **File layout:**
- Zone-type templates: `content/global/zone-types/{zone_type}.ron`
- Culture profiles: `content/global/culture-{name}.ron` (existing)
- Location specs: `content/locations/{system}-{zone}.ron` (metadata only, no primitives)
- **Rationale:** The per-location primitive model (current `typical_behaviors` and per-location `behavior_primitives` arrays) does not scale to 300 systems. A Krenn farmer and a Vael farmer doing the same physical work in the same zone type are authoring the same primitives twice — the content that differs between them is the *how* (culture), not the *what* (the physical action). Separating these dimensions reduces authoring cost by an order of magnitude and ensures that adding a new system is a metadata operation, not a content sprint. The standalone readability constraint ensures the system degrades gracefully when the LLM is unavailable, which is a runtime reliability requirement for a 300-system game, not just a fallback policy.
- **Layer 3 grammar constraint:** When Gemma appends environmental flavor to Layer 1+2 assembled text, the flavor clause must grammatically attach as a prepositional phrase or coordinating conjunction. Absolute and participial phrases (e.g., "tool already in hand") require a leading comma separator. Culture-specific modifier clauses that use absolute-phrase construction must include the separator (e.g., ", tool already in hand") or be rewritten as prepositional form ("with tool in hand") to ensure clean assembly. This constraint applies to all culture profile modifier authoring.
- **Source:** Sprint 26 zone-type taxonomy discussion (2026-03-13); behavior review (#634); user requirements for 300-system scalability
- **Raised by:** Paula (zone-type taxonomy and POI system); Gestalt (assembly engine); Mellanie (primitive content); Tyre (architectural review)
- **Dissent:** None
- **Supersedes:** Per-location behavior pool approach from current zone spec format (`behavior_primitives` arrays on location RON files). Location files retain metadata but behavior content migrates to zone-type template files.
- **Amends:** [D-139](#d-139-composable-behavior-primitives-three-layer-assembly) — D-139 defined the assembly mechanics (BehaviorPrimitive, BehaviorModifier, assemble_behaviors); this decision defines the content architecture that feeds it. D-139 remains the implementation record; D-142 is the content architecture record.
- **Cross-reference:** [D-138](#d-138-llm-re-voicing-pipeline-for-npc-voice) (LLM pipeline — Layer 3 safety model), [D-140](#d-140-dialogue-re-voicing-quality-constraints--paulas-six-rules) (quality constraints — R4, R6 apply to Layer 3), [D-139](#d-139-composable-behavior-primitives-three-layer-assembly) (assembly mechanics), [D-121](#d-121-voice-is-culture-driven--job-as-modifier) (culture-primary voice), [D-036](#d-036-sova-transit-district--krenn-system-setting) (Krenn setting origin of first zone specs), [D-128](#d-128-culture-is-implicit-in-starting-location) (culture implicit in location)
---
*39 decisions. Last updated: 2026-03-13 (D-139 composable behavior primitives — Sprint 26 #633)*
*41 decisions. Last updated: 2026-03-13 (D-142 zone-type template architecture — Sprint 26; D-140 dialogue re-voicing quality constraints — Sprint 26 #647; D-139 composable behavior primitives — Sprint 26 #633)*
File diff suppressed because it is too large Load Diff
+150
View File
@@ -0,0 +1,150 @@
# Base Text Authoring Guide — The Settled Reach
**Ticket:** #645
**Author:** Mellanie
**Status:** canonical
**Last updated:** 2026-03-13
---
## Purpose
Base text is the culture-neutral semantic layer that every NPC line must have. It serves two purposes simultaneously:
1. **LLM seed** — the culture injector uses it as input. The better the base text, the better the voiced output.
2. **Fallback** — when "AI-Enhanced Dialogue" is off or pre-voicing hasn't caught up, the player sees the base text directly. It must be functional and readable on its own.
This guide establishes the quality bar for all base text and documents failure modes to avoid.
---
## The quality bar (three tests)
Before committing a base text line, ask three questions:
1. **Does this show a moment, not a category?**
A category tells you *what kind of thing* the NPC does. A moment shows you *a specific instance* of doing it.
- Category: `"tends crops in the field"` — you know the role, not the person
- Moment: `"works back along a crop row with a hoe, stopping twice to pull weeds by the root before moving on"` — you see a specific action sequence
2. **Could you picture a specific person doing this?**
If the line could appear in a stock photo caption, it needs specificity. Add the HOW or the small physical detail that anchors it.
3. **Would you be okay if this were the only text the player ever sees?**
The voice pipeline may not be available. The base text is not a draft — it is the default experience for players below spec or with AI-Enhanced Dialogue disabled. Author it to that bar.
---
## Failure modes and fixes
### 1. Category verb (`"tends"`, `"checks"`, `"monitors"`, `"manages"`)
These describe a role, not an action. Replace with a physical verb sequence.
| Below bar | At bar |
|---|---|
| `"tends rows of low-growing crops"` | `"works back along a crop row, stopping to pull weeds by the root"` |
| `"checks seedling trays"` | `"crouches over seedling trays and pinches back a leggy stem that grew sideways"` |
| `"monitors the loading floor"` | `"stands at the mezzanine rail watching a forklift angle into a tight bay"` |
Fix: replace the category verb with the specific physical action that *constitutes* the checking or tending.
### 2. Quality modifier instead of specific action
Phrases like `"with practiced ease"`, `"with no wasted motion"`, `"efficiently"` are editorial commentary. The reader is told a quality instead of shown it.
| Below bar | At bar |
|---|---|
| `"lifts a crate of produce onto a flatbed with practiced ease"` | `"lifts a crate of produce onto the flatbed in one motion and reaches for the next before it settles"` |
| `"swaps a panel module with practiced speed and no wasted motion"` | `"swaps a panel module in under a minute, tools back in the pouch before the cover is latched"` |
Fix: remove the modifier. Show the efficiency through the action sequence itself — specificity creates the impression.
### 3. Universal gesture (no character information)
Some gestures apply to anyone anywhere — wiping sweat, yawning, stretching. These are placeholder movements. Replace with something that shows role, circumstance, or cultural habit.
| Below bar | At bar |
|---|---|
| `"wipes sweat from her forehead with the back of a gloved hand"` | `"pulls a glove off with her teeth to wipe her face, pulls it back on without looking"` |
| `"stretches"` | `"straightens up and rolls her neck once before kneeling back down"` |
Fix: find the physical quirk that's specific to this role, this body, this situation.
### 4. "Corporate-speak" / institutional passive
Lines that sound like they belong in a procedure manual. The NPC is a person, not a process.
| Below bar | At bar |
|---|---|
| `"initiates task completion protocol"` | `"gets back to sorting the manifests"` |
| `"performs routine inspection of the facility perimeter"` | `"walks the fence line at a measured, unhurried pace"` |
Fix: use plain present tense and a physical verb. If you can hear a robot saying it, rewrite it.
---
## Lines you must NOT change
**`Factual`-type lines** are protected. These are lines bearing:
- Specific numbers or quantities: `"fourteen crates in bay seven"`
- Causal chains: `"the pressure dropped when the coupling failed"`
- Denial statements: `"I don't know anything about that"`
Factual lines bypass the LLM entirely (D-138: `ContentType::Factual`). The pipeline serves them as exact base text. Do not elevate them — precision is their quality.
If you're unsure whether a line is Factual: if it contains a number, a named quantity, a specific event chain, or a denial with named content, treat it as protected.
---
## Cultural neutrality requirement
Base text must not contain culture-specific vocabulary. The culture injectors add that layer at voicing time. Base text is the semantic skeleton.
**What to avoid:**
- Krenn oath vocabulary: `"void take it"`, `"blood and void"` — these go in voice_examples, not base text
- Culture-specific greetings or farewells
- Slang that implies a particular register
**Test:** Could this base text be voiced convincingly in *any* culture? If the answer is yes, it's culturally neutral. If not, strip the culture-specific markers.
---
## Volume guidance
Each role should have 1525 on-shift behaviors plus 510 off-shift / social site behaviors. This gives the generator enough variety across a session without repetition. Roles with narrower activity ranges (security, militia) can have fewer.
---
## Elevation checklist (per line)
Before committing, run through:
- [ ] Physical verb sequence, not category verb
- [ ] No quality modifiers — show efficiency through action, not through adjective
- [ ] Character information visible (not a universal gesture)
- [ ] No institutional/passive language
- [ ] Culturally neutral (no culture-specific vocabulary)
- [ ] Not a Factual-type line (no numbers, denials, or causal chains to preserve)
- [ ] Reads as a complete, legible observation on its own
---
## Examples from the Krenn zones (reference)
These lines passed elevation review (Sprint 26):
**Strong — moment-specific, role-grounded:**
- `"kneels at the base of a struggling plant and parts the soil with two fingers"`
- `"threads a wire through a conduit clip and bites the insulation back with her teeth"`
- `"keeps a junior worker between herself and the inspection team as the inspectors pass through"`
- `"trades a quick look with a colleague when the foreman walks by"`
- `"leans back on a stool and tracks a browser who has checked the same display twice without committing"`
**Strong — off-shift texture:**
- `"sits with boots off under the table, socked feet flat on the floor"`
- `"refills a neighbor's cup from her own jug without being asked"`
- `"buys a round for the table and returns to her seat before anyone can thank her"`
---
*Last review: Sprint 26, base text elevation pass (#645). Apply this standard to all new zone RON files.*
-461
View File
@@ -1,461 +0,0 @@
# Character Build: The Detective
**Ticket:** #181 | **Priority:** Critical | **Sprint:** 12
**Status:** v0.1 Draft
**Blocked by:** #179 (Character definition schema)
**Blocks:** #182 (Divergent starting knowledge), #183 (Divergent relationships)
**Decisions referenced:** D-005, D-016, D-027, D-028, D-032, D-034, D-035, D-037, D-041, D-053, D-065, D-075
---
## identity
```yaml
identity:
canonical_id: "pc:detective"
display_name: "[Player-set name]"
archetype: "detective"
occupation: "Commission Liaison Officer, Manifest Irregularity Investigation"
posting_duration: "3 days (newly arrived)"
faction: "Commission"
lattice_tier: "professional"
description: >
Commission Liaison Officer posted to Sova Transit District three days ago.
Official mandate: routine compliance review. Actual mandate: investigate
manifest irregularities suggesting organized freight smuggling. The distinction
between "official" and "actual" is itself the first lesson about how
Sova works.
Trained investigator. Professional analytical lattice. Institutional
authority that opens doors and closes conversations. An outsider in a
community that has learned, over forty years of prefab-modular life,
to handle outsiders with polite minimal disclosure.
Stands to lose: professional credibility (if the case goes cold), Sera
(the investigation, if pressed too hard, could compromise the only
trusted relationship in the district), and the clean institutional
clarity that makes the job feel justified — which the community's
moral complexity is already beginning to erode.
```
---
## starting_knowledge
```yaml
starting_knowledge:
confidence_floor: "KnowsOf"
known_facts:
# Investigation data
- key: "investigation.manifest_discrepancies"
confidence: "KnowsDetails"
source: "institutional"
notes: >
Case file from Commission records. Containers logged but not reconciled
with incoming manifests. Pattern suggests systematic manipulation, not
clerical error. Three clusters of anomalies over the past six months.
- key: "investigation.freight_pattern"
confidence: "KnowsDetails"
source: "institutional"
notes: >
Anomalies cluster around shift transition windows. Same container series
recurring across discrepant manifests. Pattern analysis flagged this
posting as warranting investigation.
# Persons of interest (case file, not personal knowledge)
- key: "person.voss_poi"
confidence: "KnowsOf"
source: "institutional"
notes: >
Voss, shift supervisor. Scheduling authority. In position to create the
oversight gaps that explain the manifest anomalies. Name from case file.
Not met yet.
- key: "person.maret_poi"
confidence: "KnowsOf"
source: "institutional"
notes: >
Maret Korr, freight scheduler. Access to manifest data. Could be source
of the falsification or could be covering for someone else. Name from
case file.
- key: "person.drin_poi"
confidence: "KnowsOf"
source: "institutional"
notes: >
Drin Rosta, dock inspector. Responsible for container verification.
Failure to flag discrepancies suggests either incompetence or complicity.
Name from case file.
# Institutional context
- key: "world.previous_liaison"
confidence: "KnowsDetails"
source: "institutional"
notes: >
The previous Commission liaison rotated out 3 months ago. Rotation
was described as routine. The detective's case file notes that the previous
liaison filed no irregularity reports despite the same pattern being
detectable in their tenure. This warrants investigation.
- key: "world.commission_presence"
confidence: "KnowsDetails"
source: "institutional"
notes: >
Sera Venn, Commission field tech. Not an investigator. Has been on Sova
for 1 year. Pre-existing relationship — same institutional background,
different postings. Reliable. Social anchor in unfamiliar district.
- key: "world.district_geography"
confidence: "KnowsOf"
source: "institutional"
notes: >
The Terminal (logistics hub), The Last Shift (bar, social nexus),
maintenance corridors (off-books access routes noted in district layout
documentation). Three days in — still orienting to physical space.
- key: "world.torek_compliance_connection"
confidence: "KnowsOf"
source: "institutional"
notes: >
Torek Lintar is a Commission compliance officer on Sova. Known from
institutional channels. Not a friend, but a professional known name.
# Sera knowledge
- key: "person.sera_background"
confidence: "KnowsDetails"
source: "direct"
notes: >
Sera Venn: same career path, different posting. Reliable under pressure.
Transferred to Sova after a stressful posting elsewhere. Has been the
district's Commission presence for a year. The detective's one genuinely
friendly face in Sova.
unknown_facts:
- key: "contraband.ring_exists"
notes: >
Does not know a ring exists. Suspects organized smuggling from the manifest
pattern, but "ring" implies structure, membership, coordination — the
detective doesn't know that yet.
- key: "contraband.ring_members"
notes: >
Does not know any ring members by their ring membership. Kael Davan
is not in the case file. The smuggler is not in the case file.
- key: "contraband.cargo_type"
notes: >
Does not know what the cargo is. The manifests show discrepancies;
they don't reveal what's being moved. The "what" is a layer below
the "that something is wrong."
- key: "person.kael_exit_attempt"
notes: >
Completely unknown. Kael's unauthorized contact and exit attempt are
not visible to any institutional data source.
- key: "person.sera_unreported_evidence"
notes: >
CRITICAL unknown. Sera has run an unofficial compliance check on Kael's
work patterns and is sitting on unreported evidence. The detective
trusts Sera completely. This gap is the structural basis for THE FRIEND arc.
- key: "person.naia_confided_in_sera"
notes: >
Naia Tamm's worry about Kael, confided to Sera, is the emotional engine
behind Sera's concealment. The detective doesn't know Naia exists as
anything except a district resident.
- key: "relationship.ring_membership"
notes: >
Who is in the ring, who is complicit, who is protecting whom. The detective
has names (Voss, Maret, Drin) without understanding the social web that
holds them together.
- key: "person.smuggler_identity"
notes: >
Does not know the smuggler is in the ring. If the smuggler is in the case
file at all, it's as a name on a shift roster — no significance attached.
- key: "world.previous_liaison_arranged"
notes: >
The detective wonders whether the previous Commission liaison's rotation
was routine or arranged. This suspicion is in the case file as a note;
it remains unconfirmed. (Canonical answer: arranged. But the detective
doesn't know this yet.)
```
---
## starting_relationships
```yaml
starting_relationships:
- target: "npc:sera-venn"
relationship_state: "Friendly"
access_tier: [peer]
trust_level: "trusted"
relationship_type: "friend"
known_attributes:
name: "Sera Venn"
role: "Commission field technician"
faction: "Commission"
notes: >
Pre-existing friend. Same institutional background, different posting.
Transferred to Sova a year ago. Social anchor. The detective's guide
to an unfamiliar place — Sera fills in background on the district,
introduces the detective to regulars. Completely trusted at session start.
- target: "npc:voss"
relationship_state: "Known"
access_tier: [authority]
trust_level: "uncertain"
relationship_type: "contact"
known_attributes:
name: "Voss"
role: "shift supervisor"
faction: "civilian"
notes: >
Person of interest. Name from case file, scheduling authority. Has
met once for credentials review. Stiffens when the detective enters
the hub. Professional, terse. No warmth. Institutional interaction only.
- target: "npc:maret-korr"
relationship_state: "Known"
access_tier: [authority]
trust_level: "uncertain"
relationship_type: "contact"
known_attributes:
name: "Maret Korr"
role: "freight scheduler"
faction: "civilian"
notes: >
Person of interest. Manifest access. Has cooperated professionally with
data requests — provided clean set of schedules. Slightly nervous.
Cooperation is compliance, not friendliness.
- target: "npc:drin"
relationship_state: "Known"
access_tier: [authority]
trust_level: "uncertain"
relationship_type: "contact"
known_attributes:
name: "Drin Rosta"
role: "dock inspector"
faction: "civilian"
notes: >
Person of interest. Responsible for container verification. Has met
once. More evasive than Voss or Maret. The detective notes the evasion
without yet understanding the cause.
- target: "npc:torek-lintar"
relationship_state: "Known"
access_tier: [public]
trust_level: "uncertain"
relationship_type: "colleague"
known_attributes:
name: "Torek Lintar"
role: "Commission compliance officer"
faction: "Commission"
notes: >
Commission compliance officer on Sova — professional known name, not a
friend. Has seen him at the bar with Sera. Slightly off in a way the
detective can't yet articulate.
- target: "npc:lera-sessik"
relationship_state: "Unknown"
access_tier: [public]
trust_level: "uncertain"
relationship_type: null
known_attributes:
name: "Lera Sessik"
role: "bar owner"
faction: null
notes: >
Sera mentioned The Last Shift. The detective has visited once or twice.
Lera is polite, guarded, watching. Not hostile. Not warm.
- target: "npc:kael-davan"
relationship_state: "Unknown"
access_tier: [public]
trust_level: "uncertain"
relationship_type: null
known_attributes:
name: null
role: "dock worker"
faction: null
notes: >
Unknown at session start. Name might appear on a shift roster without
significance. No personal knowledge. No case file entry. The detective
has no reason to flag Kael — yet.
- target: "npc:naia-tamm"
relationship_state: "Unknown"
access_tier: [public]
trust_level: "uncertain"
relationship_type: null
known_attributes:
name: null
role: null
faction: null
notes: "No connection at session start. Exists as a district resident without individual identity."
- target: "npc:pc-smuggler"
relationship_state: "Unknown"
access_tier: [public]
trust_level: "uncertain"
relationship_type: null
known_attributes:
name: null
role: "dock worker"
faction: null
notes: >
One of many dock workers. No individual significance at session start.
Knowledge accumulates through observation and tell accumulation.
May shift to PersonOfInterest if tells compound and manifest
discrepancy connection is made.
```
---
## access_permissions
```yaml
access_permissions:
can_unlock:
- tier: "public"
condition: "Always available"
max_npcs: "unlimited"
- tier: "authority"
condition: "RelationshipState is Unknown, Known, or PersonOfInterest — credential presentation"
max_npcs: "unlimited for institutional NPCs; does not work with hostile or fully closed NPCs"
- tier: "peer"
condition: "RelationshipState reaches Friendly"
max_npcs: "limited — Sera at session start; others require sustained positive interaction"
structurally_locked:
- tier: "insider"
reason: >
The detective can never access insider-tier ring dialogue. Not because
institutional authority is insufficient — authority and insider are
different axes. Insider requires social belonging within the ring network.
The ring recognizes the detective as Commission. The ring closes, not opens,
when institutional authority is applied. Pressing harder does not unlock
insider content; it triggers defensive behavior and hostile tone. This is
architecturally fundamental to the two-keyhole design.
- tier: "authority (failed)"
reason: >
Authority access fails when RelationshipState is Hostile. Once an NPC
has turned against the detective's investigation, credential presentation
produces refusal or evasion, not compliance. The detective cannot
authority-tier their way through a hostile source.
```
---
## skills
```yaml
skills:
lattice_tier: "professional"
movement_default: "walk" # D-053 MovementProfile
inventory_slots: 2 # D-065
evidence_display: "case_file"
capability_flags:
- "authority_credentials" # Badge/ID; unlocks authority tier with Unknown/Known NPCs
- "manifest_access" # Can formally request freight manifests from institutional NPCs
- "analytical_lattice" # Pattern recognition overlay; flags behavioral anomalies at Careful stance
starting_items:
- item_id: "detective_case_file"
description: "Institutional case file: manifest discrepancy analysis, persons of interest, previous liaison notes."
leverage_type: "proof"
notes: >
The detective's starting information in physical form. Can be referenced
in dialogue to trigger authority-tier responses — "according to case file X."
Contains the manifest discrepancy data that links to Kael's work patterns,
though the detective doesn't know this yet.
- item_id: "detective_commission_credentials"
description: "Commission identification and liaison officer authorization."
leverage_type: "access"
notes: >
Credential presentation triggers authority tier access with Unknown/Known NPCs.
Does not work with ring-network NPCs in insider mode — they recognize
Commission credentials as a threat, not an access grant. Carried on person;
visible as a status marker to any NPC with institutional awareness.
```
---
## presentation
```yaml
presentation:
monologue_pool: "detective"
evidence_display: "case_file"
voice_register:
sentence_length: "complete sentences, occasional fragments for emphasis"
vocabulary: "institutional layer over plain speech — investigative habit without jargon"
emotional_mode: "analysis-first, personal second"
relationship_mode: "surname-first for targets, first-name for trusted"
emotional_baseline:
state: "professional-cautious"
description: >
Trained to observe, analyze, withhold judgment until evidence accumulates.
But also human — isolated in an unfamiliar community, reliant on Sera for
social grounding, aware that non-cooperation is the district default.
The analytical habit runs in the background like an operating system.
Counts things. Tracks frequencies. Flags inconsistencies. Internal bookkeeping
is automatic: "filing it," "noted," "coincidence?" The institutional training
doesn't turn off; sometimes the human overrides it. When it does, the crack
in the professional surface IS the emotional payload.
Believes in the work. Smuggling isn't victimless — unlicensed lattice
components can cause neural degradation, medical replacements diverted from
Syndic supply chains mean someone else doesn't get what they need. The
investigation is justified. But the moral clarity is starting to erode —
the community is beginning to read as more complex than "crime scene."
opening_monologue:
lines:
- "Sova Transit District. Third day on station. The briefing said routine compliance review."
- "The briefing is always wrong about something."
- "Manifest discrepancies clustered around the freight hub. Start there. Watch the shift change."
- "Good to know Sera's here. At least someone in this district speaks my language."
emotional_payload: >
Isolation, professional caution, guarded optimism about Sera. The detective
is an outsider. The district doesn't want them here. The player should feel
the gap between institutional authority and social belonging.
```
---
## Authoring Notes
**What makes the detective's experience distinct:**
- The district is a CRIME SCENE. Every NPC is a potential witness, informant, or subject. The detective categorizes before connecting. Kael is "dock worker, Davan, K." before he's Kael. The shift to first names — if it happens — is itself a relationship marker.
- The monologue is ANALYTICAL and complete-sentence. Counts things. Notices deviations. The emotional register leaks through the analytical frame rather than leading it.
- The emotional journey of the vertical slice moves from professional isolation to specific, personal betrayal — but the betrayal is different: not "Kael lied to me," but "Sera, who I trusted completely, is compromised by something she did to protect someone I've never met."
**What the detective's authority access buys:** Conversations happen faster. NPCs answer direct questions. But answers are framed for compliance, not candor. The detective gets facts from people who don't want to give them — which means incomplete facts, deflected facts, facts that look complete but aren't. Authority access is a key that opens the door. It doesn't make what's inside visible.
**Voice anchors (mandatory reference for all detective monologue):**
1. *"Logistics hub. Standard prefab, heavy foot traffic. Let's see what the shift change tells me."*
2. *"That's the third time. Sera leaves when Torek arrives. Three different excuses, same result. That's not coincidence."*
3. *"Good to see Sera. She always was the reliable one. At least someone in this district speaks my language."*
4. *"Same booth. Same warm smile. Same offer to buy me a drink. ...Everything except whatever she's not saying."*
5. *"Grain spirit and low conversation. Only place in this district that doesn't smell like freight lubricant."*
---
*Ticket #181 — Detective character build. v0.1 scope.*
+239
View File
@@ -0,0 +1,239 @@
# Content Structure — Canonical Template (v0.2+)
**Created:** 2026-03-13 (Sprint 26, #656 cleanup)
**Supersedes:** `content-directory-structure.md` v0.1 design spec (that doc describes the *removed* structure)
This document defines the canonical directory layout for campaign content after removal of v0.1 hand-authored dead weight. It is the template to replicate across 300 systems.
---
## Actual Directory Hierarchy
The real hierarchy (note: diverges from old design doc which used `content/districts/`):
```
content/
global/ # Cross-system content
culture-{name}.ron # Voice pipeline persona (LIVE GENERATOR INPUT)
culture-{name}.example.ron # Example output for reference
zone-identity-spec.example.ron # Zone identity template example
factions/ # Faction profiles (one per faction)
knowledge/ # Shared FactId catalog (one per category)
enums/ # Shared enum definitions
contraband/ # Contraband item profiles
technology/ # Technology definitions
campaigns/
main/
systems/
{system-slug}/ # e.g. krenn/
system.yaml # System metadata
stations/
{station-slug}/ # e.g. sova/
station.yaml # Station metadata
districts/
{district-slug}/ # e.g. transit/
district.yaml # Zone metadata (CANONICAL METADATA)
locations/ # Physical location definitions
templates/ # Social site role-slot definitions
triangles/ # Drama triangles (3-NPC clusters)
environmental/ # Environmental text (signs, terminals, docs)
routines/ # NPC schedule definitions
ticker/ # News ticker content
modules/
tier1/ # Tier 1 drama modules (authored)
{module-slug}.yaml
gauntlet/ # Test world (immutable — do not modify)
rooms/
_schema/ # JSON Schema validation files
_meta/ # Infrastructure metadata
schemas/ # (additional schemas)
```
---
## What Each Piece Is
| Path | Type | Who produces it | Notes |
|------|------|-----------------|-------|
| `global/culture-{name}.ron` | **Generator input** (authored) | Copy team | Voice pipeline persona. One per culture. DO NOT DELETE. |
| `global/factions/*.yaml` | **Authored** | Copy team | Faction profiles. One per faction. |
| `global/knowledge/*.yaml` | **Authored** | Copy team | FactId catalog by category. |
| `global/enums/*.yaml` | **Authored** | Copy team | Shared enum definitions (situations, moods, etc.) |
| `system.yaml` | **Metadata** | Copy team | System display name, factions present, setting notes. |
| `station.yaml` | **Metadata** | Copy team | Station description, district list. |
| `district.yaml` | **Metadata** | Copy team | Zone display name, location list, target NPC count. |
| `locations/*.yaml` | **Metadata** | Copy team | One file per location: display name, description, type. |
| `templates/*.yaml` | **Authored** | Copy team | Role slot definitions (what roles exist, capacity range). Survives to v0.2+. The `v01_assignments` field is v0.1-only — clear for generated content. |
| `triangles/*.yaml` | **Authored** | Copy team | Drama triangles with fork conditions and resolution states. Template material for generated equivalents. |
| `environmental/*.yaml` | **Authored** | Copy team | Environmental text objects with optional dual-lens properties (v0.1 remains). |
| `routines/schedules.yaml` | **Authored** | Copy team | NPC daily routines. Will be generated per-NPC in v0.2+. |
| `ticker/*.yaml` | **Authored** | Copy team | News ticker content for this district. |
| `modules/tier1/*.yaml` | **Authored** | Copy team | Drama modules (Paula's schema). |
---
## What Was Removed (v0.1 Dead Weight)
These directories and files existed in v0.1 and have been deleted (Sprint 26, #656/#657):
| Removed | Reason |
|---------|--------|
| `npcs/*.yaml` | Hand-authored named NPC profiles. Replaced by generator output. All 23 files deleted. |
| `dialogue/` | Hand-authored NPC dialogue pools per role/location. Replaced by voice pipeline. |
| `monologue/detective/` | Detective player monologue. Detective archetype removed per D-117. |
| `monologue/smuggler/` | Smuggler player monologue. Smuggler archetype removed per D-117. |
| `insert/detective.yaml` | Detective insert HUD content. |
| `insert/smuggler.yaml` | Smuggler insert HUD content. |
| `items/smuggler-inventory.yaml` | Smuggler item definitions. |
| `pools.yaml` | v0.1 NPC candidate pool definitions. All candidates referenced deleted NPCs. |
| `content/global/knowledge/investigation.yaml` | Investigation facts. Detective system removed. (Deleted in #657.) |
| `content/global/factions/lattice-commission.yaml` | Detective faction. (Deleted in #657.) |
| Several `docs/design/` detective/smuggler docs | Archetype design docs. (Deleted in #657.) |
---
## Canonical Template: New System Checklist
When adding a new system for v0.2+ (target: 300 systems), replicate this pattern:
```
content/campaigns/main/systems/{system-slug}/
system.yaml # 1. Author system metadata
stations/
{station-slug}/
station.yaml # 2. Author station metadata
districts/
{district-slug}/
district.yaml # 3. Author district metadata
locations/ # 4. Define locations (5-10 per district)
{location-slug}.yaml
templates/ # 5. Define social site templates (role slots)
{template-slug}.yaml
routines/ # 6. Author schedule structure
schedules.yaml # (v0.2: generated per NPC)
ticker/ # 7. Author news ticker content
{location-slug}.yaml
```
**Note:** `environmental/` and `triangles/` are authored for hand-crafted districts. For generated districts, these may be generated or omitted in v0.2+.
**No NPCs.** No dialogue. No monologue. Those are generator outputs, not authored inputs.
---
## Culture RON File Reference
Culture files are the primary input for the voice pipeline. One file per culture, living at `content/global/culture-{name}.ron`.
**Use `content/global/culture-krenn.ron` as the authoring template — not `culture-krenn.example.ron`.** The example file is an older stub without voice pipeline fields.
### Required fields (must be present)
```
id: "slug" # kebab-case, matches filename
name: "Display Name Culture"
description: "Single sentence: settlement age, location type, economic base, social character"
naming: (
style: # prose: phoneme style, casing norms
given_names: [...] # 30-50 names minimum for adequate generator variety
family_names: [...] # 10-20 names
family_name_used_socially: bool
)
speech: (
register: # prose: formality, rhythm, directness
filler_words: [...] # 4-8 words
greetings: [...] # 3-6 phrases
farewells: [...] # 3-6 phrases
exclamations: [...] # 4-8 oath/exclamation phrases
)
values: (
description: # prose: core value system
favored_traits: [...] # subset of valid traits (see below)
disfavored_traits: [...] # subset of valid traits
)
```
### Optional fields (omit or include as needed)
```
voice_persona: Some("PERSONA: ...") # Full LLM prompt persona block
voice_examples: [ # 3-5 input/output pairs
(input: "...", output: "..."),
]
occasional_injections: [ # Rolled per-prompt at given frequency
(
kind: "oath" # human-readable category label
clause: "When ... use ...", # LLM instruction text
example: Some((input: "...", output: "...")), # optional
frequency: 0.25, # 0.01.0
suppress_on_tells: [Guarded], # optional: omit injection when these tells active
),
]
behavior_modifiers: [ # Culture-specific action modifier clauses (#633)
(category: "work_style", clause: "with mechanical efficiency"),
]
```
### Valid enum values
**PersonalityTrait** (for `favored_traits` / `disfavored_traits`):
`Cautious, Bold, Honest, Deceptive, Compassionate, Ruthless, Curious, Incurious, Social, Reclusive`
**TellCategory** (for `suppress_on_tells`):
`Nervous, Angry, Friendly, Guarded, RoutineDeviation`
### voice_persona: NOT-list requirement (D-138, Spike 2)
Spike 2 found that **explicit NOT-lists in the persona block are critical** for voice quality. Without them, the LLM defaults to register-neutral generic output. Add an explicit "NEVER:" or "NOT:" section at the end of the persona block:
```
voice_persona: Some(
"PERSONA: ...\n
[positive instructions]\n\n
NEVER: [list 3-5 explicit negatives that define what this culture does NOT sound like]"
),
```
Example negatives for Krenn (currently explicit in `culture-krenn.ron`):
- Never corporate or institutional language
- Never effusive, never polished, never deferential to rank
- Never flowery or verbose
- Never use family names in casual conversation
- Never express deference to authority that hasn't earned it
`culture-krenn.ron` has a full NEVER block in `voice_persona`. All three culture files (Krenn, Vael, Osse) now include explicit NOT-lists. *(Updated Sprint 26 #653)*
### behavior_modifiers: status
All culture files (`culture-krenn.ron`, `culture-vael.ron`, `culture-osse.ron`) now populate `behavior_modifiers` with 11-12 clauses across all seven hint categories (`work_pace`, `physical_manner`, `social_signal`, `task_completion`, `environmental_scan`, `offduty_posture`, `authority_response`). The decomposed behavior system (#633/#634) shipped in Sprint 26. New culture files must populate this field. *(Updated Sprint 26 #634)*
---
## Scale Readiness Audit
### Passes at 300 systems
| Structure | Ready | Notes |
|-----------|-------|-------|
| `content/campaigns/main/systems/` | Yes | One directory per system. No monolithic files. |
| `content/global/factions/` | Yes | One file per faction — will grow to ~20-50 factions across 300 systems |
| `content/global/knowledge/` | Mostly | Knowledge catalog is organized by category, not by system. Flat list works to ~500 facts. |
| `content/global/culture-{name}.ron` | Yes | One file per culture (expected ~10-20 cultures total). |
| `templates/*.yaml` | Yes | Role slot definitions are reusable across systems of the same type. |
| `modules/tier1/` | Yes | Flat directory. Drama modules are self-contained. |
### Needs attention at scale
| Structure | Issue | Recommendation |
|-----------|-------|----------------|
| `content/global/knowledge/investigation.yaml` | **Deleted** — was detective-system-only. Other knowledge files need review for detective/smuggler references. | Audit surviving knowledge files post-#657. |
| `environmental/*.yaml` | Has v0.1 `dual_lens` (smuggler/detective) properties in the terminal/bar/corridors files. These are dead properties once archtypes are removed. | Flag to client team — strip `dual_lens` field from environmental schema for v0.2. |
| `templates/` v01_assignments | Fields reference deleted named NPCs. Not validated but stale. | Remove `v01_assignments` and `reference_links` from templates when generating v0.2+ content. |
| `triangles/` members | Reference deleted named NPCs (e.g., `npc:voss`, `npc:kael-davan`). These are unresolvable after NPC deletion. | These triangles are v0.1 examples. Either delete or annotate as templates for generated equivalents. |
+385
View File
@@ -0,0 +1,385 @@
# Culture Authoring Guide — The Settled Reach
**Ticket:** #653
**Author:** Mellanie
**Status:** canonical
**Last updated:** 2026-03-13
---
## Purpose
Every NPC in The Settled Reach is voiced through their culture. The voice pipeline (D-138) uses a culture profile as its primary LLM prompt — the culture injector is the single biggest determinant of how an NPC sounds. Culture files are authored once and used thousands of times across every generated NPC in that system.
This guide explains how to author a new culture RON file from scratch. The target: one experienced author can produce a complete, Spike-validated culture profile in approximately one working day.
Three reference cultures exist in `content/global/`:
- `culture-krenn.ron` — Mid-Reach, freight, working-class pragmatic (the Spike 1/2 reference)
- `culture-vael.ron` — Core-adjacent, administrative/research, institutional-formal
- `culture-osse.ron` — Deep Frontier, extraction industry, terse-utilitarian
---
## Step 1: Establish the cultural parameters (30 minutes)
Before writing a single word of the RON file, answer these five questions from `docs/design/cultural-generation-guide.md`:
1. **Reach Position:** Core / Mid-Reach / Frontier / Deep Frontier
→ Determines authority attitude, institutional density, Commission presence
2. **Economic Base:** Freight / Extraction / Manufacturing / Service / Research / Mixed
→ Determines daily vocabulary, rhythms, what NPCs care about
3. **Settlement Age:** New (< 20 yr) / Established (20-80 yr) / Mature (80-200 yr) / Old (200+ yr)
→ Determines rootedness, architectural character, whether "here" is home
4. **Heritage Root:** Frost / Tide / Iron / Dust / Stone / Vine / Salt
→ Determines spatial grammar and social privacy model (D-104/D-105)
5. **Institutional Ecosystem:** Which institutions are visibly present? Which are resented?
Write these down before you open a RON file. They are the source of truth for everything that follows.
---
## Step 2: Define the voice register (10 minutes)
Derive the voice register from your five parameters. Ask:
- How does authority feel here? (Collegial / Distant / Resented / Absent)
- What is the cost of saying too much? (Social / Physical / Legal / None)
- What earns trust here? (Credential / Shared risk / Repeated interaction / Demonstrated skill)
- What is the cultural mode of emotional expression? (Understatement / Direct / Suppressed / Public)
Write a one-sentence register description. This becomes `speech.register` in the RON.
**Examples:**
| Culture | Register |
|---|---|
| Krenn | direct, minimal pleasantries, gets to the point |
| Vael | complete sentences, institutional framing, measured, precise |
| Osse | terse, functional, equipment vocabulary, economy of language |
---
## Step 3: Author the naming conventions (15 minutes)
Naming conventions follow from Reach position + settlement age + economic base:
| Parameter | Naming tendency |
|---|---|
| Core, old settlement | Polysyllabic, family-name-primary, formal phonemes |
| Mid-Reach, mature | Mixed — 1-2 syllables, either name primary depending on sub-culture |
| Frontier, new | Short, work-derived, first-name-only or work-name |
| Extraction industry | Often functional; legal names exist but aren't used |
| Administrative | Family names primary; given names reserved |
**IP check rule:** All names must be checked against:
- Hamilton (Contemporary English given names — avoid)
- Banks (Whimsical/elaborate — avoid)
- Reynolds Firefly (Earth-ethnic echoes — avoid)
- Simmons (Greek/Latin — avoid overt register matches)
Generate 25-35 given names and 15-20 family names. The generator needs variety across playthroughs.
---
## Step 4: Author the voice persona (60 minutes — the core work)
The `voice_persona` field is the LLM instruction that shapes all re-voiced output for NPCs from this culture. This is where one working day of authoring matters most.
### Structure (6-block format, ~200-250 tokens total)
```
PERSONA: You are a [Culture] [role type].
[BLOCK 1 — REGISTER, ~25 tokens]
State the register style, why it exists, one distinguishing marker.
[BLOCK 2 — CULTURAL CONTEXT, ~25 tokens]
One sentence: what shaped this culture's voice. The social or environmental fact.
[BLOCK 3 — VOCABULARY, ~40 tokens]
Exclamations: [closed list — ONLY these expressions. No invented variants.]
Greetings: [closed list]
Address conventions: [family-name-primary, first-name-only, etc.]
[BLOCK 4 — VALUES, ~20 tokens]
Two core values as behavioral instructions. "You do X." not "This culture values X."
[BLOCK 5 — NOT-LIST, ~20 tokens]
2-3 exclusions SPECIFIC to this culture. (Universal NIs cover global constraints.)
Start with: "Do not use..."
[BLOCK 6 — EXAMPLE PAIRS (~70-80 tokens): go in voice_examples field, not here]
```
### The NEVER: block — most important element
**Format:** The NEVER: block is a separate, explicitly labeled section at the END of the persona string. It must not be embedded as a numbered instruction.
```
[positive instructions 1-8]\n\nNEVER: [3-5 explicit negatives defining what this culture does NOT sound like]
```
**Why it matters:** Spike 2 finding — explicit NEVER: blocks are critical for voice quality. Without them, the LLM defaults to register-neutral generic output. The numbered instructions alone are insufficient. The NEVER: section must be visually and structurally distinct — not "8. Do not use..." but a labeled block after the numbered list.
The not-list prevents register leakage. Write it by asking: what does this culture NEVER sound like?
| Culture | NEVER block content |
|---|---|
| Krenn | Corporate/institutional language, effusive or polished register, deference to unearned rank, family names in casual use, verbosity |
| Vael | Void-adjacent exclamations (frontier register), casual contractions, sentence fragments, direct emotional expression, physical labor as value ground |
| Osse | Institutional framing or courtesy protocols, formal complete sentences, Commission-world vocabulary, Core-system exclamations, elaboration where a number suffices |
The NEVER: content must be culture-specific. Global constraints (no religious language, no Earth references) go in the universal RULES const — do not repeat them per-culture.
### Writing the persona instructions
Use second-person imperative: "Be direct." not "This culture is direct."
Each numbered instruction should target a DIFFERENT speech dimension so trait modifiers can stack cleanly:
- Instruction 1 → delivery style (brevity, formality)
- Instruction 2 → cultural context (why they speak this way)
- Instruction 3 → address conventions (name usage)
- Instruction 4 → emotional register (how feelings appear in speech)
- Instruction 5 → institutional framing (how authority is referenced)
- Instruction 6 → exclamation vocabulary (closed, explicit list)
- Instruction 7 → trust signal (how the culture verifies credibility)
- Instruction 8 → not-list (what this voice never does)
**Test before committing:** Read the persona out loud. Can you imagine an NPC responding to you from this profile? Would a speaker from this culture be clearly distinct from Krenn if you heard both without labels?
---
## Step 5: Author voice examples (20 minutes)
Write 3-5 `(input, output)` example pairs for the `voice_examples` array.
**Input:** A culture-neutral semantic description of an action (same as base text format)
**Output:** That action rendered in the culture's voice
Example pairs are the model's pattern anchors — small LLMs are pattern matchers before instruction-followers. The examples matter as much as the instructions.
**Rules for example pairs:**
1. Cover the range: neutral, positive relationship, refusal/deflection, high-affect
2. Output should be short (1-2 sentences). Long outputs lose the pattern.
3. Each output must be recognizably THIS culture — read them side by side with Krenn examples. They should sound like different people.
4. Do not use real NPC names in examples — use generic role references
### Cross-cultural contrast test
Before finalizing examples, run this test. Take the same three base-text inputs and write outputs in Krenn, Vael, and Osse voices. If the outputs are hard to distinguish, the culture persona needs sharpening.
**Example inputs for the test:**
- "declines to answer a question about an overnight run"
- "acknowledges a colleague's greeting while continuing to work"
- "thanks a colleague for covering a shift"
| Input | Krenn | Vael | Osse |
|---|---|---|---|
| Declines question | "Look, that's not mine to say." | "I'm not in a position to speak to that. You'd want to refer to the relevant operations log." | "Not my section. Ask Grek." |
| Acknowledges greeting | "Hey. Yeah. Catch you at shift end." | "Harthen. Good. I'll be with you in a moment." | "Doss. Yeah." |
| Thanks colleague | "Appreciated. See you at handoff." | "That was well handled. I've noted it." | "Solid. Owe you one." |
If all three rows sound similar, the culture personas need work.
---
## Step 6: Author occasional injections (15 minutes)
`occasional_injections` are cultural vocabulary or speech patterns that should appear occasionally but not always — oath vocabulary, institutional references, equipment ground truth. The composition engine handles frequency; the author specifies what and when.
**Fields:**
- `kind` — a string identifier (e.g., `"oath"`, `"protocol_cite"`, `"equipment_ground"`)
- `clause` — the LLM instruction when this injection fires
- `example``Some((input, output))` showing correct usage, or `None`
- `frequency` — float 0.01.0 (how often the composition engine fires this injection)
- `suppress_on_tells` — tells that should suppress this injection (e.g., oath suppressed when Guarded)
**Frequency guidelines:**
- 0.25 — Krenn oath vocabulary (appears in ~1 in 4 high-affect contexts)
- 0.20 — Vael protocol citation (appears occasionally in procedural exchange)
- 0.15 — Osse equipment ground (appears in work-adjacent contexts)
Start with one injection per culture. More can be added after Spike validation confirms the base persona is clean.
---
## Step 7: Author the tell-tone table (15 minutes)
Each culture profile should include a tell-tone table mapping each `TellCategory` to how that tell expresses in this culture's register. This table is not in the RON file — it's authoring documentation used when tell-context injectors are written.
Include this table in a comment block in the RON file header, or maintain it separately in the culture's authoring notes.
**Format:**
| TellCategory | How it reads in this culture |
|---|---|
| Nervous | [culture-specific description] |
| Angry | [culture-specific description] |
| Friendly | [culture-specific description] |
| Guarded | [culture-specific description] |
| RoutineDeviation | [culture-specific description] |
**Design principle (from D-138):** Humans are humans first. Universal baseline (phenomenon-class behavior) is always readable across cultures. Cultural flavor is conditional and additive — the LLM adds cultural texture only if it doesn't significantly change the information conveyed. Per-culture tell-tone tables are optional enrichment.
---
## Step 8: Validate and commit
```bash
tooling/validate-ron content/global/culture-{id}.ron culture
```
A passing validation confirms:
- All required fields are present and correctly typed
- Trait names are valid enum values
- RON syntax is correct
After validation, the culture profile is ready for Spike 1 prompt testing. Human review of voiced output is required before the culture goes into baked content.
---
## Tell-tone reference tables
### Krenn tell-tone table
| TellCategory | Krenn-inflected tonal register |
|---|---|
| Nervous | Answers run shorter than usual. Eyes stay on task. Nothing's wrong — just things to do. |
| Guarded | Direct past the point of directness. Closes conversation paths fast without being unfriendly. |
| Friendly | One beat more than the exchange needed. A word of warmth lands casually, not performed. |
| Angry | Steady. Even. The kind of steady that takes effort. Not hostile — just flat in a way that doesn't feel natural for Krenn. |
| RoutineDeviation | Unhurried. Unremarkably normal. Like nothing's worth noticing. |
### Vael tell-tone table
| TellCategory | Vael-inflected tonal register |
|---|---|
| Nervous | Sentences become over-complete — more formal than the situation warrants. Qualifications multiply. "As I understand it" appears where it wasn't needed. |
| Guarded | Responses are brief and technically correct. Every question answered with only what was asked. Institutional framing appears even in informal exchange. |
| Friendly | Slightly less formal than baseline — a given name used where a family name would normally appear. The exchange closes with a word of genuine regard. |
| Angry | Register becomes precisely correct — almost pedantically so. The effort to maintain composure shows as over-precision. |
| RoutineDeviation | Procedures are cited where they wouldn't normally be. A person who deviates from routine anchors to institutional language as cover. |
### Osse tell-tone table
| TellCategory | Osse-inflected tonal register |
|---|---|
| Nervous | Words get shorter. Already-minimal speech contracts to one-word answers and physical acknowledgment. The silence between words lengthens. |
| Guarded | Assessment framing appears: "Why do you need to know?" — stated or implied. Eye contact shifts from reading-the-room to reading-you specifically. |
| Friendly | Slightly more than the exchange needed — an extra beat, an unrequested detail, a "good shift" that lands with more weight. Not warm, just more. |
| Angry | Everything slows down. Deliberate. Responses accurate, closed, no opening for follow-up. |
| RoutineDeviation | The opposite of nervous: unusually conversational. When someone is off-routine on purpose, they over-normalize by saying more than usual. |
---
## Checklist: culture profile complete?
- [ ] Five parameters documented (Reach Position, Economic, Age, Heritage Root, Institutions)
- [ ] Register statement authored and distinctive
- [ ] 25+ given names, 15+ family names, phoneme pattern consistent
- [ ] `family_name_used_socially` accurately reflects the culture
- [ ] Voice persona: 8 numbered instructions, ~200-250 tokens
- [ ] Explicit `NEVER:` block at end of persona string (separate from numbered instructions)
- [ ] NEVER block content is culture-specific (not repeating universal constraints)
- [ ] Cross-cultural contrast test passed (Krenn/Vael/Osse comparison)
- [ ] 3-5 voice examples authored, range covered
- [ ] At least 1 occasional injection with suppression logic
- [ ] Tell-tone table authored (5 TellCategories)
- [ ] `tooling/validate-ron content/global/culture-{id}.ron culture` passes
---
---
## Addendum: Behavior Modifiers (#634)
*Added Sprint 26. Applies to all culture files after the composable behavior engine (#633) ships.*
### What behavior_modifiers does
The composable behavior engine assembles observable behavior strings from two parts:
```
BehaviorPrimitive.action + BehaviorModifier.clause → assembled behavior string
```
Example:
- Action: `"moves freight containers"`
- Modifier: `"without wasted motion"` (Krenn, `work_pace`)
- Result: `"moves freight containers without wasted motion"`
A culture provides a pool of modifier clauses. When the engine assembles a behavior, it looks for a modifier whose `category` matches the primitive's `modifier_hint` string. If no match exists, it falls back to any modifier in the pool. If no modifiers exist at all, the action text is used as-is.
**Modifier clauses must grammatically trail any action text.** They are appended with a space. Test by mentally substituting different action verbs: does the clause still read naturally?
### BehaviorContext: when to use each tag
Every `BehaviorPrimitive` carries a `context` field that gates when it is eligible for selection. The composition engine filters by context before modifier selection.
| Context | Use for | Example action |
|---------|---------|----------------|
| `OnShift` | Physical task execution, work-site behaviors, role-specific routines | "checks a manifest against a handheld scanner", "guides a freight container into position" |
| `OffDuty` | Break-room behaviors, personal downtime, non-work physical states | "slumps into a break room chair and stares at nothing", "unwraps a meal packet standing at the counter" |
| `Social` | Social-site behaviors (bars, cantinas, communal spaces) — may overlap with OffDuty but specifically at a social venue | "nurses a drink at the end of the bar", "trades short words with a neighbor" |
| `Any` | Behaviors valid in any context — ambient, universal physical states | "rubs the back of their neck", "pauses and looks at nothing for a moment" |
**Decision rule:**
- If the behavior only makes sense on a work site → `OnShift`
- If the behavior only makes sense in a break room or personal space → `OffDuty`
- If the behavior specifically happens at a social venue → `Social`
- If the behavior could appear anywhere → `Any`
- When unsure, prefer `Any` over a specific context — you can always narrow later
### Modifier category vocabulary (the contract)
These seven categories define the interface between primitives (Mellanie, role-action templates) and modifiers (culture authors). A primitive's `modifier_hint` must use one of these strings for a culture modifier to match it.
| Category | What it inflects | Example modifier (Krenn) |
|---|---|---|
| `work_pace` | Speed and intensity of physical task execution | "without wasted motion" |
| `physical_manner` | Body language and movement quality during tasks | "without looking up from the task" |
| `social_signal` | Brief acknowledgments made during or between tasks | "with a short nod" |
| `task_completion` | How tasks are finished, wrapped up, or handed off | "and moves on" |
| `environmental_scan` | Awareness or vigilance while in a space | "with one eye still on the floor" |
| `offduty_posture` | Body language and social stance when off-shift | "without making a show of it" |
| `authority_response` | Behavior when supervisors or authority figures are present | "at the same pace as before" |
**The fallback is safe but less targeted.** A primitive with no `modifier_hint` gets a random modifier from the full culture pool. This still produces culturally inflected output — just without category precision. Prefer leaving `modifier_hint` unset over using an incorrect category string.
### Authoring behavior_modifiers for a new culture
**Minimum:** 2 modifiers for each of the 7 categories = 14 modifiers total. Fewer categories will still work (fallback to any), but full coverage ensures every action type gets the right cultural texture.
**Process:**
1. For each category, ask: *How does this culture DISTINCTIVELY express this dimension?*
- Not "how does any person do this" but "what is the cultural tell for this culture specifically?"
2. Write the clause as a short trailing phrase (4-8 words). Test: does it read naturally after "moves freight containers ___"?
3. Avoid clauses that are too action-specific — they need to trail any verb, not just one type
4. Run `tooling/validate-ron content/global/culture-{id}.ron culture` to confirm syntax
**Three-culture contrast for modifiers** (same as voice persona contrast test):
| Category | Krenn | Vael | Osse |
|---|---|---|---|
| work_pace | "without wasted motion" | "with practiced deliberation" | "at extraction pace" |
| physical_manner | "without ceremony" | "with institutional correctness" | "tool already in hand" |
| social_signal | "with a short nod" | "with a measured acknowledgment" | "with a word or a look" |
| task_completion | "and moves on" | "with the relevant entry already updated" | "gear stowed before moving on" |
| environmental_scan | "with one eye still on the floor" | "aware of who is observing" | "pressure and exits both in range" |
| offduty_posture | "without making a show of it" | "maintaining composed reserve" | "with one ear still on the work floor" |
| authority_response | "at the same pace as before" | "with appropriate professional deference" | "without a change in pace" |
If your new culture's modifiers would fit in any of the existing columns above without sounding different — the culture needs more work before modifiers are authored.
### Updated checklist
Add these items to the culture profile checklist:
- [ ] `behavior_modifiers` array populated with at least 2 clauses per category (14 minimum)
- [ ] Each clause tested: grammatically trails "moves freight containers ___" and "checks a manifest ___"
- [ ] Three-culture contrast check: modifiers are clearly distinct from Krenn, Vael, and Osse
- [ ] `tooling/validate-ron` still passes after adding modifiers
*Addendum: Sprint 26, #634 (composable behavior content). Category vocabulary established jointly by Gestalt (culture modifiers) and Mellanie (behavior primitives). Add new categories only by agreement between both sides — unmatched categories silently fall back to any modifier.*
-162
View File
@@ -1,162 +0,0 @@
# Detective: Institutional Chain of Command
**Ticket:** #322 | **Priority:** High | **Sprint:** 12
**Status:** v0.1 Draft
**Owners:** Paula (narrative arc), Miri (setting/institutional context)
**Decisions referenced:** D-005, D-027, D-037, D-041
---
## 1. Purpose
The detective is not a freelance investigator. They are a Commission officer, which means someone assigned them here, someone defined their mandate, someone is waiting for reports, and someone may have an interest in how this investigation concludes — not all of them aligned.
The institutional chain of command is not just background. It determines:
- **What the detective is officially permitted to do** (arrest authority, warrant scope, search powers)
- **What they're NOT supposed to do** (exceed mandate, go outside channels, use extra-institutional leverage)
- **Who benefits if the investigation succeeds** — and who doesn't
- **The political weight of the previous liaison's rotation** — which may not have been routine
This document establishes the detective's institutional world. It does not need to be fully visible to the player in v0.1 — it lives in the detective's case file, in their monologue, in what institutional NPCs say when authority-tier access opens. But it must be consistent.
---
## 2. The Commission — Brief Institutional Context
The Commission (Intersolar Commission) is the primary regulatory body governing freight transit, customs enforcement, and neural lattice certification across the Settled Reach. It is not a police force. It operates through:
- **Compliance review** — routine audits of freight hubs, manifest reconciliation
- **Liaison officers** — semi-permanent postings to transit hubs; advisory and investigative authority
- **Field technicians** — technical support, equipment maintenance, passive monitoring (Sera Venn's role)
- **Enforcement officers** — arrest authority; called in from sector headquarters for formal investigations
The detective's posting as "Commission Liaison Officer" sits between compliance and enforcement. They have investigative authority — enough to request manifests, interview persons of interest, and flag suspects — but formal arrest and search warrant authority requires escalation to sector headquarters.
**This matters for the detective's v0.1 situation:** They can investigate. They cannot arrest without authorization from above. If they find evidence of a smuggling ring, they need to report it up the chain before taking action — and that creates a window of political exposure.
---
## 3. The Formal Chain
### Level 1: The Detective (On-Station)
**Title:** Commission Liaison Officer, Sova Transit District
**Mandate (official):** Routine compliance review — manifest reconciliation, scheduling compliance, standard freight hub audit.
**Mandate (actual):** Investigate manifest irregularities suggesting organized smuggling. Identify structure, membership, and supply chain. Report to Sector Oversight with arrest recommendations.
**Reporting to:** Sector Liaison Coordinator, Commission Sector 7 Headquarters (off-station, a span-gate transit away)
### Level 2: Sector Liaison Coordinator — Renna Veth
**Title:** Liaison Coordinator, Commission Sector 7
**Who she is:** Career Commission officer. Mid-level administrator with 20 years of routine compliance work and two serious investigations to her name. Professional, risk-averse. Not corrupt — but also not courageous. Wants the investigation to produce results without embarrassing the Commission or producing a political fight she didn't expect.
**Her interest in this investigation:** Wants it resolved cleanly. A successful arrest closes a compliance gap in her sector metrics. A failed investigation — especially one that implicates a Commission insider — would be a problem.
**Relationship with detective:** Assigned the detective to Sova because the detective has a clean record and a reputation for methodical work. Does not know the detective personally.
### Level 3: Sector Deputy Commissioner — Halden Pres
**Title:** Deputy Commissioner, Sector 7
**Who he is:** Political appointee. Has been in position for 6 years. Sector 7 covers the Krenn System transit hubs, which are economically significant — freight logistics for Velen's surface operations. Not personally corrupt. But his political relationships include figures who have interests in how freight regulation is managed in the sector.
**His knowledge of this investigation:** Was briefed at level of "routine compliance review at Sova." Does not know the actual investigative mandate. If the investigation escalates — if arrests are made, if Commission involvement in a smuggling ring is implied — he will be briefed, and his political relationships will activate.
**The political risk:** Deputy Commissioner Pres is not an enemy. But if the investigation implies that a previous Commission liaison was arranged to protect a smuggling ring, Pres may have indirect connections to whoever arranged it. He is not the villain. But he is a constraint.
---
## 4. The Previous Liaison: Korrean Tsev
**Title (former):** Commission Liaison Officer, Sova Transit District
**Rotation:** Posted to Sova for 18 months; rotated out 3 months before the detective arrived.
**Official reason for rotation:** Standard posting cycle. Liaison officers rotate every 18-24 months to prevent over-familiarity with local operations.
**The detective's case file note:** The previous liaison, Korrean Tsev, was in position during the period when manifest discrepancies were already detectable in the freight data. No irregularity reports were filed. Three compliance audits during Tsev's tenure all came back clean. The anomalies that the detective's pattern analysis flagged from the data should have been visible to Tsev.
**Was the rotation arranged?**
The detective's case file flags this as unconfirmed but suspicious. The canonical answer (not available to the player in v0.1): **yes, it was arranged.** Tsev was not corrupt in the sense of taking ring money — but Tsev was compromised by personal loyalty. A relationship with someone at sector administration meant Tsev was quietly moved when the manifest anomalies became too persistent to ignore, rather than being required to file a report that would implicate people above Tsev's pay grade.
**What the detective can learn in v0.1:**
- That Tsev filed no reports (case file, accessible from session start)
- That the anomalies were detectable during Tsev's tenure (manifest data analysis, takes investigation time)
- That Tsev was rotated on a compressed timeline (standard was 24 months; actual was 18 months) — this is discoverable through institutional records if the detective requests them
**What the detective cannot learn in v0.1:**
- WHY the rotation was arranged
- Who in sector administration was involved
- Whether Deputy Commissioner Pres had knowledge
This is a thread that extends beyond the v0.1 vertical slice. The detective can pull the thread enough to see it exists, but not enough to unravel what's at the other end.
---
## 5. Torek Lintar: Commission Compliance Officer
Torek Lintar is Commission compliance on Sova — not an investigator, not a liaison officer, but a permanent-fixture compliance monitoring role. Commission compliance officers are lower in the formal hierarchy than liaison officers, but they have one thing liaison officers don't: **local knowledge accumulated over years.**
Torek has been on Sova for 4 years. He knows everyone. He knows the bar. He knows the shifts. He knows the social fabric in a way a three-day-old liaison officer cannot.
**The detective's starting relationship with Torek:** Professional known name from institutional channels. Not a friend. Encountered at the bar (Torek is a bar regular).
**What Torek knows that the detective doesn't:**
- The ring's social footprint, at least at the edges — conspicuous spending, familiar faces
- Sera Venn's unofficial compliance check (Torek suspects; he doesn't know for certain)
- The shape of the social web connecting Kael's group
**Why Torek hasn't reported what he knows:**
Torek's tolerance threshold for confrontation is low. He is ring-adjacent (D-024 triangle 3: Bar Tensions), which means he is socially embedded with people who are embedded with the ring. His conspicuous spending suggests he may have accepted something from ring-peripheral sources — not enough to be a member, but enough to compromise his ability to report cleanly. He is not a villain. He is a compromised observer who has talked himself into believing the right moment to report will come later.
**Torek as asset for the detective:**
If the detective builds enough trust (social + authority), Torek can become an information source — but carefully. The ring is aware of Torek's connection to Commission compliance. Torek going to the detective too visibly risks blowback on both of them.
**Torek as the signal in Sera's FRIEND arc:**
Sera avoids Torek. Three times. Three different excuses. The detective's monologue reads this as a behavioral pattern. The reason: Sera ran an unofficial check on Kael's work patterns (using Commission technical access she wasn't supposed to use) and found the same manifest discrepancies the detective found. Torek, as Commission compliance, would be the person Sera should have reported this to. Sera's avoidance of Torek is the tell that she found something and didn't report it. The detective doesn't know this yet — but the behavioral signal points there.
---
## 6. Political Pressures on the Investigation
The detective's investigation operates under several simultaneous pressures:
| Pressure | Source | Direction | Effect |
|----------|--------|-----------|--------|
| **Succeed cleanly** | Veth (Sector Coordinator) | Upward | Produce results without creating institutional embarrassment |
| **Don't exceed mandate** | Institutional | Inward | Formal arrests require escalation; the detective can't act unilaterally |
| **Previous liaison question** | Case file | Lateral | Pulling this thread risks finding Commission involvement; politically dangerous |
| **Sera's position** | Personal | Personal | Using what Sera knows against her would destroy the detective's only personal relationship in the district |
| **Community non-cooperation** | Social | Environmental | The district's default resistance to institutional authority; this is not malice, it's culture |
The detective is not just investigating a smuggling ring. They are investigating within an institutional structure that has already failed to catch this ring once. The question of whether that failure was incompetence or arrangement is the shadow behind every manifest discrepancy.
---
## 7. How This Appears in Monologue
The detective's institutional context should surface in monologue lines as internal processing — the analytical framing through which they filter every observation. Not institutional jargon, but institutional habit.
**Examples:**
At session start, observing the hub:
*"Third day. Tsev was here for eighteen months and filed nothing. Either I'm better at this than Tsev, or there's something in the water. Let's find out."*
When Voss deflects a question:
*"That answer was technically responsive. It gave me nothing. Voss knows exactly what I'm asking. Note it."*
When considering what Torek knows:
*"Lintar's been on Sova for four years. He's seen whatever there is to see. Commission compliance doesn't file reports in a vacuum — something told him to stay quiet."*
When the Sera contradiction emerges:
*"I could escalate this. Report what I suspect to Veth. But if I'm wrong about Sera, I've just burned my only ally on a hunch. And if I'm right — I need to know how far this goes before I put it in writing."*
---
## 8. v0.1 Content Scope
What needs to be authored for this to work:
| Element | Content Requirement |
|---------|---------------------|
| Detective opening monologue (lines about Tsev's missing reports) | 1-2 lines from session start knowledge |
| Case file items (accessible via evidence display) | 3-5 readable entries: Tsev rotation note, manifest cluster data, POI summaries |
| Torek dialogue (authority tier) | 3-5 lines for institutional context questions |
| Veth (off-station, not interactive) | Referenced in case file and detective monologue only |
| Detective monologue about political constraints | 2-3 lines scattered across session |
The chain of command does not require NPCs to appear — Veth and Pres are off-station and non-interactive in v0.1. Their presence is felt through the detective's case file entries and internal monologue about institutional constraints. Torek is the only chain-of-command-adjacent NPC who is interactive.
---
*Ticket #322 — Detective institutional chain of command. v0.1 scope.*
-171
View File
@@ -1,171 +0,0 @@
# Divergent Starting Knowledge
**Ticket:** #182 | **Priority:** Critical | **Sprint:** 12
**Status:** v0.1 Draft
**Blocked by:** #180 (Smuggler build), #181 (Detective build)
**Decisions referenced:** D-005 (asymmetric information), D-027 (vertical slice), D-041 (knowledge graph), D-065 (evidence display)
---
## 1. Design Principle
Asymmetric information is the master mechanic (D-005). The two characters know different things about the same world. Neither has the full picture. The game's central tension comes from each player discovering what the other already knew — but only on their second playthrough.
The knowledge sets are not merely different. They are **inverted at the points that matter most.** The smuggler knows the conspiracy from inside it. The detective knows the investigation from outside it. The middle — the social web that connects them — is what neither fully understands at session start.
---
## 2. Master Knowledge Comparison Table
### 2a. Contraband and Ring
| Fact | Smuggler | Detective |
|------|---------|-----------|
| Ring exists (organized smuggling operation) | **KnowsEverything** — member | Unknown — suspects "systematic manipulation" but no structural knowledge |
| Ring members (Nils, Kael, Voss, Renn, Devra, Resha) | **KnowsDetails** — works with them daily | Unknown — names absent from case file; only Voss, Maret, Drin as institutional POIs |
| Cargo type (unlicensed lattice components, medical replacements) | **KnowsDetails** — handles the containers | Unknown — case file has weight/size anomalies but not cargo type |
| Smuggling routes (corridor access, timing windows) | **KnowsEverything** — runs the routes | Unknown — knows maintenance corridors exist from district layout documents |
| Operation schedule (shift transition windows) | **KnowsEverything** — the 20-minute gaps are the job | **KnowsDetails** — case file shows anomaly clustering around shift transitions |
| Supply chain upstream (Sabel, Syndic connection) | **KnowsOf** (partial: knows Sabel, not the full chain) | Unknown |
| Voss's complicity (takes a cut, provides scheduling cover) | **KnowsEverything** — operational fact | Unknown — Voss is a POI because of scheduling authority, not proven complicity |
| Drin's complicity (looks the other way on inspections) | **KnowsDetails** — operational asset | Unknown — Drin is a POI because of inspection failures |
| Maret's awareness (scheduling access to cover for ring) | **KnowsDetails** — hub colleague | **KnowsOf** — person of interest from case file |
### 2b. Investigation
| Fact | Smuggler | Detective |
|------|---------|-----------|
| Detective's identity as investigator | Unknown — may know "new Commission presence" from ring warning | **KnowsEverything** — is the investigator |
| Detective's actual mandate (investigate freight irregularities) | Unknown — "routine compliance review" is the cover | **KnowsEverything** |
| Manifest discrepancies exist and are flagged | **KnowsOf** — operational awareness that paperwork is being managed | **KnowsDetails** — has the discrepancy data, cluster analysis, container series |
| Previous Commission liaison rotation (possibly arranged) | Unknown | **KnowsOf** — noted in case file as suspicious; unconfirmed |
| Commission's investigation timeline | Unknown | **KnowsDetails** — their own timeline |
### 2c. Key People
| Fact | Smuggler | Detective |
|------|---------|-----------|
| Kael's exit attempt (unauthorized external contact) | **Unknown** (CRITICAL gap — basis for FRIEND arc) | Unknown |
| Sera's unreported evidence (suppressed compliance check on Kael) | Unknown | **Unknown** (CRITICAL gap — basis for FRIEND arc) |
| Naia confided in Sera about Kael | Unknown | Unknown |
| Naia's worry about Kael's behavior | **KnowsOf** — has noticed Naia seems stressed at bar; doesn't know why | Unknown — Naia is not yet a known individual |
| Torek's spending (conspicuous, potential security risk) | **KnowsOf** — has noticed; worries about exposure | **KnowsOf** — "slightly off in a way I can't yet articulate" |
| Sera's background (pre-existing contact for detective) | Unknown — knows Sera only as "Commission, keep distance" | **KnowsDetails** — trusted pre-existing friend |
| Smuggler's role in the ring | **KnowsEverything** — is a member | Unknown — one of many dock workers |
| Kael's relationship with Nils (brother; ring coordinator) | **KnowsDetails** | Unknown |
### 2d. Location and World
| Fact | Smuggler | Detective |
|------|---------|-----------|
| Sova Transit District geography (full) | **KnowsEverything** — 3 years here | **KnowsOf** — 3 days; still orienting |
| Corridor B-7 (restricted, ring access) | **KnowsEverything** — knows the access token, uses the corridor | Unknown — maintenance corridors noted in district layout |
| Dead drop location (temp storage bay 4, container 4471) | **KnowsEverything** | Unknown — container 4471 appears in manifest discrepancy data but not mapped to a location |
| Shift schedule rhythms (social and operational) | **KnowsEverything** | **KnowsOf** — knows shifts exist, pattern from case file |
| Bar social structure (who sits where, who's a regular) | **KnowsDetails** — 2 years of evenings at Lera's | **KnowsOf** — has visited twice |
---
## 3. Knowledge Asymmetry Map
The gaps in each character's knowledge are not random — they cluster around the same events and people, approached from opposite directions:
```
THE SHARED WORLD
┌─────────────────────────────────────┐
│ Triangle 4 │
│ Naia ←→ Kael ←→ Sera │
│ ↑ ↑ │
│ (Kael's (suppressed │
│ partner, evidence) │
│ knows ↕ │
│ something) Detective's │
│ ↕ FRIEND │
│ Smuggler's │
│ FRIEND │
└─────────────────────────────────────┘
Smuggler knows: Kael (trusted friend), ring details, routes, members
Smuggler doesn't know: Kael is exiting, Sera's evidence, Naia→Sera connection
Detective knows: Investigation data, Sera (trusted friend), manifest anomalies
Detective doesn't know: Ring structure, Kael's role, Sera's evidence, Naia→Sera connection
Neither knows: Triangle 4's full shape — the chain from Naia's worry to Sera's suppression to the investigation closing in
```
The dramatic irony of the second playthrough is that the player who's played as the smuggler watches the detective investigate from outside what the smuggler knows intimately. The player who's played as the detective watches the smuggler trust Kael — not knowing the thing the detective now knows (Kael is the link between the ring and Sera's evidence).
---
## 4. Knowledge Acquisition Curves
### Smuggler: What they can learn, and how
| Unknown → Known | Method | Timing |
|----------------|--------|--------|
| Detective's identity | Ring warning (Kael/Voss mentions Commission presence) OR direct observation | Minutes 0-5 (if warned); later if not |
| Kael's exit attempt | THE FRIEND arc — spatial observation (Corridor B-7), then confrontation | Minutes 15-25 |
| Sera has unreported evidence | Cannot discover this through normal play. Would require Sera to confess or Naia to reveal — extreme late-game territory beyond v0.1 scope | Post-v0.1 |
| Torek's specific risk level | Observation of Torek's behavior over time | Minutes 10-20 |
### Detective: What they can learn, and how
| Unknown → Known | Method | Timing |
|----------------|--------|--------|
| Ring exists (structured) | Evidence accumulation — NPC behavioral tells, manifest patterns, corridor observation | Minutes 15-25 |
| Kael is ring member | Connecting manifest discrepancies to Kael's shift data; cargo attention tell | Minutes 20-30 |
| Sera's unreported evidence | THE FRIEND arc — behavioral pattern observation (Torek avoidance), then confrontation | Minutes 20-30 |
| Smuggler is in the ring | Tell accumulation (corridor check, social clustering with Kael/Renn), manifest connection | Minutes 15-30 |
| Kael's exit attempt | Would require Kael to confess or Naia to reveal — beyond normal investigation path | Post-confrontation branch |
---
## 5. Evidence Display Difference
Same underlying Knowledge Graph, different presentation layer (D-065):
**Detective — Case File Format:**
```
Entity: Kael Davan
Role: Dock worker, Sova Terminal
Confidence: KnowsOf
Source: observation
Attributes:
- routine_pattern: "morning shift 06:00-14:00"
- behavior_flags: [lattice_checking, shortened_interactions]
- risk_assessment: "moderate — behavioral anomalies suggest concealment"
- link: [manifest_discrepancy_cluster_A]
Insert suggests: "Check shift records against anomaly window"
```
**Smuggler — Personal Notebook Format:**
```
Kael — closes colleague, ring. Two years. Trust: solid.
Lately: distracted. Lunch cut short twice this week.
Something's off. Not the operation — personal.
Watch for: the look-left tell.
```
Same underlying entity. Different framing. The detective files evidence. The smuggler worries about people.
---
## 6. Design Implications for Content Authors
**Rule 1: Don't explain what the character already knows.**
The smuggler doesn't need exposition about how the ring works. They know. Monologue lines about the ring should be operational, not explanatory. The detective doesn't need exposition about institutional procedures. They know. Monologue lines about the investigation should be observational, not procedural.
**Rule 2: The unknown facts are load-bearing.**
When writing monologue lines, verify against the unknown_facts list. A smuggler monologue line that references Kael's exit attempt before Phase 3 is a continuity error. A detective monologue line that identifies Kael as a ring member before connecting manifest data to shift records is a continuity error.
**Rule 3: Knowledge gaps produce monologue, not silence.**
What a character doesn't know generates JUST AS MUCH monologue content as what they know. The smuggler's worry about "is Torek a risk?" is monologue material. The detective's uncertainty about "previous liaison rotation — arranged or routine?" is monologue material. The unknown is active, not empty.
**Rule 4: The same event produces inverted monologue.**
When the same NPC does the same thing in both playthroughs, the monologue responses should be detectably from different starting states. Kael checking his lattice → smuggler thinks "not like him to be jumpy" (personal familiarity) → detective thinks "lattice activity spiked, behavioral flag" (observational analysis).
---
*Ticket #182 — Divergent starting knowledge. v0.1 scope.*
+22 -184
View File
@@ -1,5 +1,4 @@
# Insert/HUD Wireframe and Visual Specification — v0.1
## Dual Character Variants: Smuggler + Detective
**Ticket:** #314
**Author:** Araminta (Visual Designer)
@@ -7,6 +6,8 @@
**Status:** Active — feeds #263 (time display client implementation) and #151 (minimap rendering)
**Visual grammar reference:** `docs/design/visual-grammar-v01.md` (§7 Neural Insert Overlay)
> **Sprint 26 / D-117:** Detective archetype removed. Detective-specific sections (§3.3, §4.2, §5.2, §10.2, §10.3) have been deleted. Remaining content reflects the base lattice profile (smuggler/observer). Smuggler variant retained as reference for the tycoon observer insert design.
---
## 1. System Architecture
@@ -16,20 +17,20 @@ The insert HUD is not a UI panel bolted onto the game. It is the player characte
This has direct design consequences:
- The insert does not appear/disappear — it activates and deactivates. The character's lattice is always there; they choose when to engage it.
- Labels use the character's vocabulary, not the game's. The smuggler's insert calls it "The Last Shift." The detective's insert calls it "Licensed Establishment, District 7."
- Labels use the character's vocabulary, not the game's. The smuggler's insert calls it "The Last Shift."
- The same underlying `ObserverSnapshot` feeds both variants. One parameterized system: `lattice_profile` on the snapshot determines which visual mode renders. Stig builds one HUD framework, not two. The variants are rendering configurations, not separate systems.
### 1.1 Technical Parameters
| Parameter | Smuggler | Detective |
|-----------|----------|-----------|
| `lattice_profile` | `lattice_baseline` | `lattice_augmented` |
| Line weight | 1px | 12px |
| Annotation density | Sparse — essential markers only | Dense — more markers, connection lines |
| Passive opacity | 60% | 80% |
| Active opacity | 85% | 100% |
| Bloom | 23px gaussian at 40% blend | 23px gaussian at 40% blend |
| Chrome color | `#c8d0e0` | `#c8d0e0` |
| Parameter | Value |
|-----------|-------|
| `lattice_profile` | `lattice_baseline` |
| Line weight | 1px |
| Annotation density | Sparse — essential markers only |
| Passive opacity | 60% |
| Active opacity | 85% |
| Bloom | 23px gaussian at 40% blend |
| Chrome color | `#c8d0e0` |
### 1.2 Z-Layer Position
@@ -104,39 +105,13 @@ Single line: the time. Informal, just the clock.
No annotation. The smuggler's lattice gives them the time. That's it.
### 3.3 Detective Variant
Two lines: clock on top, shift indicator below. The detective thinks in shifts.
```
09:42
SHIFT A ·
```
| Element | Value |
|---------|-------|
| Time text | `{HH}:{MM}` — Michroma 20px, `#c8d0e0` at 80% passive, y: 26px in container |
| Phase label | `SHIFT {X}` — Michroma 11px, `#c8d0e0` at 60%, y: 50px in container |
| Phase dot | 4px circle, phase-color (see below), same y as phase label |
**Day phase to shift mapping:**
| Game time | Shift label | Dot color |
|-----------|-------------|-----------|
| 05:0012:00 | `SHIFT A` | `#c8d0e0` (chrome, neutral) |
| 12:0018:00 | `SHIFT B` | `#c8d0e0` (chrome, neutral) |
| 18:0022:00 | `SHIFT C` | `#e8c547` (amber — social hours, higher risk of contacts) |
| 22:0005:00 | `SHIFT OFF` | `#4a9ebb` (teal — night, lower routine activity) |
The dot is a subtle visual cue, not a state machine icon. It gives the detective's lattice a slightly more annotated feel than the smuggler's plain clock.
### 3.4 Insert-Off Behavior
### 3.3 Insert-Off Behavior
When `insert_active == false`:
- Time display dims to 50% of passive opacity
- Background panel disappears entirely
- Text remains — the character always knows what time it is, even without active lattice engagement. Time is ambient lattice output, not targeting output.
- Phase label (detective) also dims to 50%
The time display is the one persistent insert element. Everything else goes dark on insert deactivation.
@@ -188,59 +163,6 @@ Named NPCs (Kael, Lera, Sera, etc.) always show a casual label. Generic NPCs sho
The smuggler does not see "Person of Interest." To them, amber means "something's off about this person" — not a case file designation.
### 4.2 Detective Variant — Investigation Overlay
The detective sees their world as a case map. Known individuals are flagged. Locations have institutional labels. The overlay is denser and more annotated.
**Named NPC marker specification:**
| NPC type | Shape | Size | Color |
|----------|-------|------|-------|
| Person of Interest | Diamond (rotated square) | 10px × 10px | `#e8c547` amber |
| Known/Friendly | Filled circle | 6px | `#6bc9a6` green |
| Unknown | Filled circle | 6px | `#4a9ebb` teal |
| Hostile / Suspect | Diamond | 10px × 10px | `#d45d5d` red |
The diamond shape is the detective's POI designation — it communicates "flagged" without text. The smuggler's variant uses only circles because their lattice doesn't have case-file designation logic.
**Label specification:**
| Property | Value |
|----------|-------|
| Typeface | Michroma 11px |
| Color | `#c8d0e0` at 80% passive, 100% on hover |
| Position | 10px above the marker, right-aligned to marker center |
| NPC label format | `POI: K. Davan` (formal: last name initial + surname) |
| NPC label format | `K. Davan` for Known/non-POI |
| Location label | See §5 |
**Evidence annotation:**
When the detective has logged evidence associated with an entity, a small square appears adjacent to their marker:
| Property | Value |
|----------|-------|
| Shape | Filled square |
| Size | 4px × 4px |
| Position | 4px right of the primary marker |
| Color | `#e8c547` amber |
| Opacity | 60% passive, 100% on hover |
This is the insert's way of flagging "you have something on this person." It doesn't say what.
**Commission grid overlay (Detective only):**
The detective's augmented lattice renders a very faint reference grid across the viewport. This is the "commission-style" aesthetic — the world read as a site map.
| Property | Value |
|----------|-------|
| Grid lines | Horizontal + vertical, every 5 visual tiles (~320px) |
| Line color | `#333340` at 20% opacity |
| Line weight | 1px |
| Behavior | Always visible when insert active, disappears on insert-off |
The grid does not animate, pulse, or react. It is a passive reference overlay. Five lines across the width, five down the height, making a 5×5 grid of reference squares. It is barely visible — felt as structure, not seen as decoration.
---
## 5. Location Labels
@@ -265,25 +187,6 @@ Casual labels, written in the smuggler's vocabulary. These are their personal pi
| Position | Centered on location anchor, 16px above entity-level (below any entity markers at that location) |
| Visibility | Always visible for known locations, fades in on discovery |
### 5.2 Detective Variant
Institutional labels, written in Commission case file format.
| Location | Label text |
|----------|-----------|
| The Last Shift (bar) | `Licensed Establishment · District 7` |
| The Terminal (logistics hub) | `Freight Operations Hub · Level 2` |
| Maintenance corridor | `Restricted Access — Corridor B-7` |
| Kael's regular position | `K. Davan Last Sighted` |
| Property | Value |
|----------|-------|
| Typeface | Michroma 11px |
| Color | `#c8d0e0` at 70% — slightly more prominent than smuggler's labels |
| Position | Same as smuggler, centered on anchor |
| Secondary text | Dot separator `·` between primary name and category/district |
| Visibility | Always visible for known/case-file locations |
---
## 6. Border Arrows (Off-Screen Navigation)
@@ -307,10 +210,9 @@ When a known POI or tracked entity is outside the current viewport, a border arr
**Decay:** If the character has only `Suspects` confidence about a location (not `KnowsOf`), the border arrow renders at 30% opacity with a dashed border (1px alternating 2px on / 2px off). "Something might be there."
### 6.2 Smuggler vs Detective
### 6.2 Arrow Behavior
- **Smuggler:** Border arrows appear for Known/Friendly NPCs and personal pins. The arrow color is the NPC's relationship color. The label is casual. Unknown NPCs do not generate border arrows.
- **Detective:** Border arrows appear for all case-file entries, POIs, and known locations regardless of relationship state. Evidence-flagged entities show the amber evidence square (4px) adjacent to the arrow.
Border arrows appear for Known/Friendly NPCs and personal pins. The arrow color is the NPC's relationship color. The label is casual. Unknown NPCs do not generate border arrows.
---
@@ -334,8 +236,6 @@ Per D-065: the smuggler can carry up to 34 physical items. Icons appear in th
Icons do not disappear when insert is off — they are physical items, not lattice annotations. The character still has pockets whether or not their insert is active.
**Detective inventory:** The detective has 2 inventory slots but they are knowledge-only in v0.1 (D-065). No inventory icons display for the detective in v0.1.
---
## 8. Stance Indicator
@@ -369,8 +269,6 @@ When `insert_active == false`:
| Entity markers | Hidden |
| Location labels | Hidden |
| Border arrows | Hidden |
| Commission grid (detective) | Hidden |
| Evidence annotations | Hidden |
| Bloom | Off — no gaussian pass |
| Time display | Dims to 50% of passive opacity, background panel disappears |
| Stance indicator | Remains — 30% opacity |
@@ -459,60 +357,6 @@ The Last Shift = location label (Michroma 12px, 50% chrome)
CAREFUL = stance (Michroma 11px, lower-left, 50%)
```
### 10.2 Detective Variant — Same Location, Same Time
The detective is outside the bar, watching the entrance. Kael is inside, behind a wall — the lattice shows his last known position as a dim marker. A POI is approaching from the corridor (off-screen right).
```
┌─────────────────────────────────────────────────────────────────────────┐
│ WALK [ANALYT] 09:42 │
│ SHIFT C · │
│ +·····+·····+·····+·····+·····+·····+·····+·····+·····+·····+ │
│ · ·│
│ · ◆ [player] → ·│
│ · K. Davan (blue-wh) [POI: arrow, amber, off-screen]·│
│ · (amber diamond) ·│
│ · ·│
│ · Licensed Establishment · District 7 ·│
│ +·····+·····+·····+·····+·····+·····+·····+·····+·····+·····+ │
│ · ·│
│ · ·│
│ │
│ WALK │
├─────────────────────────────────────────────────────────────────────────┤
│ [dialogue box — inactive] │
└─────────────────────────────────────────────────────────────────────────┘
Legend:
◆ = POI diamond marker (10×10px) K. Davan = formal label (Michroma 11px)
+·····+ = commission grid overlay (Michroma thin, 20% opacity)
→ = border arrow (off-screen POI, amber — K. Davan connection)
Licensed Establishment · District 7 = institutional location label
09:42 / SHIFT C · = time display + shift with amber phase dot
[ANALYT] = perception mode indicator (placeholder position, upper-center-right)
```
### 10.3 Entity Hover State — Detective, POI Hover
```
┌─────────────────────────────────────────────────────────────────────────┐
│ WALK [ANALYT] 09:42 │
│ SHIFT C · │
│ │
│ Talk │
│ Observe │
│ ◆ Confront ←─ interaction verbs (amber, 13px) │
│ K. Davan │
│ [■]◆ (brightened, 100%, bloom 60%) │
│ │
│ all other markers at 40% opacity ─────────────────────────→ │
│ ● │
│ (40%) │
└─────────────────────────────────────────────────────────────────────────┘
[■] = evidence annotation (4×4px amber square, adjacent to diamond)
```
---
## 11. Color Reference Summary
@@ -526,8 +370,7 @@ All colors from `visual-grammar-v01.md` §1.5 and §3.2. Reproduced here for imp
| Entity — Known/Friendly | `#6bc9a6` | Soft green. Trusted network. |
| Entity — POI | `#e8c547` | Warm amber. Flagged. |
| Entity — Hostile | `#d45d5d` | Muted red. Subjective danger. |
| Player — Detective | `#e0e8ff` | Cool blue-white. |
| Player — Smuggler | `#e8e0d0` | Warm cream. |
| Player | `#e8e0d0` | Warm cream. |
| Unexplored wireframe | `#333340` | Not used in HUD chrome directly — world layer use |
| Time panel background | `#0e1218` at 40% | Barely-there. Matches zone ambient palette. |
@@ -541,11 +384,9 @@ All text is Michroma Regular 400 (Google Fonts). No exceptions (visual-grammar-v
| Role | Size | Color | Opacity (passive / active) | Z-layer |
|------|------|-------|---------------------------|---------|
| Time display | 24px (smuggler) / 20px (detective) | `#c8d0e0` | 80% / 100% | 6 |
| Phase label (detective) | 11px | `#c8d0e0` | 60% / 80% | 6 |
| Time display | 24px | `#c8d0e0` | 80% / 100% | 6 |
| Entity label (hover) | 11px | `#c8d0e0` | 70% / 100% | 6 |
| Location label (smuggler) | 12px | `#c8d0e0` | 50% / 70% | 6 |
| Location label (detective) | 11px | `#c8d0e0` | 70% / 90% | 6 |
| Location label | 12px | `#c8d0e0` | 50% / 70% | 6 |
| Interaction verb | 13px | D-033 target color | 95% (always active) | 6 |
| Stance indicator | 11px | `#c8d0e0` | 50% / 60% | 6 |
| Border arrow label (hover) | 10px | `#c8d0e0` | 0% / 100% (hover-only) | 6 |
@@ -575,15 +416,12 @@ These are deliberately out of scope for #314. Separate tickets own them.
3. Time display text must be **right-aligned** within the container. Don't center it — it should feel like a readout in the upper-right corner.
4. The background panel (`#0e1218` at 40%) should be a simple NinePatchRect or ColorRect — minimal, no rounded corners.
5. When `insert_active == false`: set time display `modulate.a = 0.5 * passive_opacity` and hide the background panel. The text stays; the container chrome disappears.
6. For the detective's phase label: drive the shift string from a simple range lookup on the game hour (see §3.3 table above). The dot color is a color constant mapped from phase — not dynamic.
7. The phase label is visible only on `lattice_profile == lattice_augmented`. Single boolean check in the time display node.
**For the entity marker system (future tickets):**
- One marker scene, parametrized by shape (circle vs diamond), size, color, bloom intensity
- The `lattice_profile` drives shape selection: baseline = circles always, augmented = diamonds for POI state, circles for other states
- Evidence annotation (`■`) is a separate child node, shown/hidden based on KnowledgeGraph query for evidence entries on this entity
- Commission grid is a separate CanvasLayer node, only visible when `lattice_profile == lattice_augmented` and `insert_active == true`
- One marker scene, parametrized by shape (circle), size, color, bloom intensity
- All entity markers use the baseline dot (circle) — no diamond/POI shapes in the base profile
- Bloom intensity driven by relationship color from D-033
---
@@ -1,373 +0,0 @@
# v0.1 Content Gap Analysis Workshop — Summary
**Workshop dates:** 2026-02-11
**Participants:** Mellanie, Paula, Araminta, Miri, Gestalt, Ozzie
**Facilitator:** Team Leader (Jeroen)
**Documenter:** Qatux
---
## Executive Summary
The v0.1 Content Gap Analysis Workshop examined 9 content layers across the vertical slice (D-027) to identify what content exists, what's missing, and what blocks production. Six agents delivered independent Round 1 analyses, then synthesized across all outputs in Round 2. The project lead made 9 directive decisions between rounds.
**Key outcomes:**
- 9 new confirmed decisions (D-032 through D-040)
- THE FRIEND NPC pattern established as emotional centerpiece (one production-level NPC per character)
- Converged tag taxonomy for line pools (6 structural + 3 selection tags)
- Sova Transit District / Krenn System confirmed as first concrete setting
- Audio confirmed in v0.1 scope (8 files via Stable Audio Open)
- All 6 wow moments promoted to v0.1 scope
- Wiki taxonomy structure declared non-negotiable
- ~50 new tickets identified across all agents (deduplicated below)
- Full dependency chain mapped with critical path: Dual Lens Guide → Voice Kits → THE FRIEND → Validation → Scale
---
## Workshop Structure
**Round 1:** Each agent independently analyzed 9 content layers against the vertical slice spec (D-027). Layers: character voice, dialogue, monologue, environmental text, NPC profiles, spatial layout, audio, visual design, wiki/lore.
**Between rounds:** Project lead reviewed all 6 outputs and issued 9 directive decisions.
**Round 2:** Each agent read all 6 Round 1 outputs plus directives. Synthesis: convergences, disagreements, dependency chains, concrete next steps, missing tickets.
**Workshop brief:** `docs/workshops/content-gap-analysis_v0_1/content-gap-analysis-workshop-brief.md`
**Round 1 outputs:** `round1-{agent}.md` (6 files)
**Round 2 outputs:** `round2-{agent}.md` (6 files)
---
## Project Lead Decisions (Between Rounds)
These 9 directives were issued by the project lead after reviewing Round 1 outputs. They are non-negotiable constraints for Round 2 and all downstream work.
| # | Directive | Status |
|---|-----------|--------|
| 1 | Separate monologue pools per character | Confirmed, non-negotiable → D-032 |
| 2 | Color = relationship to player | Approved → D-033 |
| 3 | Audio included in v0.1 (6-8 files via Stable Audio Open, self-hosted) | Confirmed → D-038 |
| 4 | One NPC per character = THE FRIEND, production-level complex | Confirmed → D-034 |
| 5 | Wiki taxonomy structure: non-negotiable, must be established NOW | Confirmed → D-040 |
| 6 | Sova Transit District / Krenn System: first concrete star system | Confirmed (worldbuilding milestone) → D-036 |
| 7 | Detective's FRIEND: Sera Venn (Paula's design) | Confirmed → D-034 |
| 8 | All 6 wow moments in scope (Ozzie's 4 essential + 2 nice-to-have all promoted) | Confirmed → D-039 |
| 9 | Stable Audio Open licensing confirmed (free commercial under $1M revenue) | Confirmed → D-038 |
---
## Decisions Produced (D-032 through D-040)
Full decision text in `decisions/*.md`. Summary:
| ID | Title | Domain | Source |
|----|-------|--------|--------|
| D-032 | Separate monologue pools per character | content.md | Project lead directive #1 |
| D-033 | Entity color = relationship to player | perception.md | Araminta R1 proposal, project lead directive #2 |
| D-034 | THE FRIEND production-level NPC pattern | content.md | Ozzie R1 concept, project lead directive #4, Paula R2 designs |
| D-035 | Converged tag taxonomy for line pools (6+3) | content.md | Gestalt R1/R2 + Mellanie convergence |
| D-036 | Sova Transit District / Krenn System as v0.1 setting | content.md | Miri R1, project lead directive #6 |
| D-037 | Contraband specification | content.md | Miri R1/R2 proposal, team validation |
| D-038 | Audio in v0.1 scope via Stable Audio Open | scope.md | Project lead directives #3, #9; Ozzie R2 spec |
| D-039 | v0.1 wow moment scope — all 6 moments | scope.md | Ozzie R1/R2, project lead directive #8 |
| D-040 | Wiki taxonomy structure | process.md | Miri R2 proposal, project lead directive #5 |
---
## Key Convergences
Areas where multiple agents independently reached the same conclusion:
### Fully aligned (no further discussion needed)
- **Dual Lens Guide is the root dependency** — all 6 agents identified this
- **Monologue carries the game** — perception, tells, atmosphere, tutorial, character voice (Gestalt, Mellanie, Ozzie)
- **YAML for line pools** — Mellanie proposed, Gestalt refined, no disagreement
- **5 tell categories for v0.1** — text-via-monologue as renderer (Gestalt, Araminta, Mellanie)
- **30/50/20 entanglement ratio works** — validated against 15 NPCs (Paula, Gestalt)
- **Spatial layout is load-bearing** — sightlines are gameplay (Araminta, Paula, Ozzie)
- **Miri's setting is the substrate** — everyone builds on Sova Transit District
### Converged during Round 2
- **Tag taxonomy**: 6 structural + 3 selection tags per dialogue line; 3 additional for monologue (Gestalt R2 section 1)
- **Situation taxonomy**: 13 situations from Gestalt + Mellanie merge
- **THE FRIEND mechanical spec**: full pipeline depth test, ~70-100 authored lines per NPC
- **Audio architecture**: event-driven with asset registry + visual fallback (Gestalt R2 section 6)
- **Line previewer MVP**: Rust CLI sharing pipeline code, 7 must-have features (Gestalt R2 section 7)
- **NPC relationship web**: 15 NPCs, 5 triangles (Paula R2 reconciliation)
- **Dependency chain**: three parallel tracks converging at content packs (Paula R2 section 2)
- **Placeholder art pipeline**: four phases, zero image files for v0.1 (Araminta R2 section 3)
### Minor divergences resolved
- **Paula proposed 7 triangles, Gestalt proposed 4** → Paula reconciled to 5 triangles
- **Mellanie proposed 8 per-line tags, Gestalt proposed more** → Converged to 6+3 (dropped location and type from per-line, made them directory-level)
- **Mellanie wanted to defer audio** → Project lead overruled; audio confirmed
- **Araminta wanted to defer audio entirely** → Project lead overruled; visual indicators complement audio
- **Detective's FRIEND candidate** → Mellanie proposed Lera (bar owner), Paula proposed Sera Venn (Commission tech) → Project lead confirmed Sera Venn
---
## Open Questions
### Updated existing questions
- **Q-003 (Art direction)**: Further resolved. Araminta's v0.1 Visual Grammar proposal covers color palette, entity rendering, fog states, zone palettes. Long-term art direction remains open.
- **Q-005 (Prototype scale)**: Further resolved. 15 NPCs, 3 social sites, 1 district (Sova Transit). Full game scale TBD.
### New questions raised during workshop
| ID | Question | Owner | Context |
|----|----------|-------|---------|
| Q-012 | How does the generation expansion pass work? LLM, template-based, or rule-based? | Gestalt, Mellanie | Affects how base lines are authored. LLM needs style-strong anchors; rules need substitution patterns. |
| Q-013 | How does the line previewer handle THE FRIEND's temporal progression? | Gestalt, Dudley | Previewer needs sequence mode to simulate multi-visit contradiction arcs. |
| Q-014 | Audio timing with monologue — when does the chime fire relative to text? | Gestalt, Ozzie | Affects monologue line writing rhythm (first word shouldn't be the important one if chime precedes). |
| Q-015 | Does 4x generation expansion apply to THE FRIEND's custom lines? | Mellanie, Gestalt | Ozzie recommends no expansion on FRIEND lines — every line hand-authored. |
| Q-016 | Knowledge hierarchy for monologue prerequisites | Gestalt, Paula | Need `suspects` < `knows_of` < `knows_details` hierarchy, not binary `knows: X`. |
| Q-017 | Triangle pressure threshold — what events trigger escalation? | Gestalt, Paula | Need numeric pressure model for `confrontation` situation activation. |
---
## Ticket Inventory (Deduplicated)
Tickets identified across all 6 agents, deduplicated and categorized. Cross-referenced against existing tickets where applicable.
### THE FRIEND (Critical — pipeline depth test)
| Ticket | Owner | Priority | Notes |
|--------|-------|----------|-------|
| THE FRIEND: Smuggler (Kael Davan) — full profile + contradiction arc | Paula (profile), Mellanie (voice) | Critical | ~75-100 authored lines |
| THE FRIEND: Detective (Sera Venn) — full profile + contradiction arc | Paula (profile), Mellanie (voice) | Critical | ~75-100 authored lines |
| Contradiction arc design document (reusable pattern) | Paula | High | Template for future complex NPCs |
| THE FRIEND visual treatment spec | Araminta | High | Color transition, earned visual detail |
### Opening Experience (Critical — first impression)
| Ticket | Owner | Priority | Notes |
|--------|-------|----------|-------|
| Opening hook content — smuggler (10-15 monologue lines) | Mellanie | Critical | Diegetic tutorial, sets voice |
| Opening hook content — detective (10-15 monologue lines) | Mellanie | Critical | Different emotional register |
| First monologue surprise moment (per character) | Mellanie, Paula, Gestalt | High | Core mechanic proof before minute 15 |
### Character & Narrative Architecture (Critical path)
| Ticket | Owner | Priority | Notes |
|--------|-------|----------|-------|
| Character voice speech patterns | Paula + Mellanie | High | Speech-level detail for voice kits |
| Access tier shift design document | Paula + Gestalt | High | How access changes during gameplay |
| Mirror moment design document | Paula + Mellanie | Medium | 10-12 paired observation triggers |
| Flat NPC "almost interesting" pass | Mellanie | High | Investigation noise floor |
| Diegetic insert flavor text (per character) | Mellanie | Medium | Character-specific HUD text |
| Diegetic tutorial monologue lines (8-10 per character) | Mellanie | Medium | Movement, fog, sound, NPC interaction |
| News ticker content — Sova (20-30 lines) | Mellanie + Miri | High | Cheap worldbuilding, high atmosphere |
### Setting & Worldbuilding
| Ticket | Owner | Priority | Notes |
|--------|-------|----------|-------|
| Sova Texture Appendix (slang, idioms, decoration, local complaint) | Miri | Critical | Blocks Mellanie's dialogue authoring |
| Krenn System wiki entry (first star system profile) | Miri | High | Sets template for all future systems |
| Sova Station Profile | Miri | High | Off-district references in dialogue |
| Detective institutional chain of command | Miri + Paula | High | Blocks detective character build |
| Meridian coverage map for Sova Transit | Miri | Medium | Investigation mechanics, ring ops |
| Off-station connections brief | Miri | Medium | Ring NPC dialogue consistency |
| Span gate transit schedule | Miri | Medium | NPC routine design, ring timing |
| Observation gallery / viewport description | Miri | Low | Ozzie's "something out the window" |
### Wiki & Taxonomy
| Ticket | Owner | Priority | Notes |
|--------|-------|----------|-------|
| Wiki taxonomy structure + first entries | Miri + Qatux | Critical | Project lead: non-negotiable, NOW |
| Tag taxonomy wiki page | Gestalt | High | Reference document for all content authors |
| Line pool format specification (standalone doc) | Gestalt | High | Formalize Round 1/2 YAML format |
### Visual & Spatial Design
| Ticket | Owner | Priority | Notes |
|--------|-------|----------|-------|
| v0.1 Visual Grammar document | Araminta | Critical | Root visual dependency |
| Entity color system spec | Araminta | Critical | Relationship-to-player color mapping |
| Spatial layout: Logistics Hub | Araminta | High | Floor plan, sightlines, NPC positions |
| Spatial layout: Bar (The Last Shift) | Araminta | High | Corner booth as key observation position |
| Spatial layout: Corridors + Smuggling spaces | Araminta | High | Hidden spaces, maintenance corridors |
| Insert/HUD wireframe + dual-character variants | Araminta | High | Smuggler social map vs detective case file |
| Monologue display system visual spec | Araminta | High | Typography, animation, stacking rules |
| Text display hierarchy spec | Araminta | High | 4 text pipelines, 4 visual treatments |
| Sound indicator visual design | Araminta | High | Fog-edge pulse, complementary to audio |
| Fog rendering visual spec | Araminta | Medium | 4-state visibility model |
| Span gate signature visual element | Araminta | Medium | Rhythmic glow, first-impression anchor |
| Visual asset taxonomy (wiki structure) | Araminta | Medium | Future-ready directory structure |
| Environmental text visual standards | Araminta | Medium | Bilingual signage, terminal screens |
### Systems / Server (Content-Supporting)
| Ticket | Owner | Priority | Notes |
|--------|-------|----------|-------|
| Dialogue selection pipeline (4-layer filter) | Dudley + Gestalt | Critical | Core runtime: access → situation → trust → weighted |
| Monologue trigger system | Dudley + Gestalt | Critical | 9 triggers, character-specific pools, prerequisite gates |
| YAML content loader (hot-reload for previewer) | Dudley | High | Parses YAML into indexed line pools |
| Sound event system architecture | Dudley + Gestalt | High | Event emitter with audio + visual fallback |
| NPC mood state machine | Dudley | High | Drives Layer 4 selection + tell system |
| Trust progression system | Dudley | High | Surface → real → secret per NPC pair |
| Interaction tracking component | Dudley | High | Per-NPC-pair counters drive Layer 2 |
| Knowledge state component | Dudley + Gestalt | High | Gates monologue prerequisites |
| Observation event generator | Dudley | Critical | Bridge between simulation and perception |
| Tell state derivation system | Dudley | Medium | Reads axes, outputs observable tells |
| Line variety tracker | Dudley | Medium | Prevents repeat lines per session |
### Audio
| Ticket | Owner | Priority | Notes |
|--------|-------|----------|-------|
| Audio asset set — 8 files via Stable Audio Open | TBD | High | See Ozzie R2 section 4 for full spec |
### Existing Ticket Scope Updates
| Ticket | Update Needed |
|--------|---------------|
| #90 (Tell system) | Scope to 5 categories; text-via-monologue as v0.1 renderer |
| #124 (Sound system) | Include sound event emitter architecture + visual fallback |
| #168 (Tag taxonomy) | Reference converged taxonomy (D-035) |
| #179 (NPC profiles) | THE FRIEND depth split: 2 production-level, 13 standard |
| #189 (Cultural generation guide) | Sova Transit District as first concrete instance |
| #190-192 (Template content packs) | Parallel spatial layouts as co-deliverables |
| #193 (Line previewer) | Concrete MVP: 7 must-have features, Rust CLI, sequence mode |
| #261 (Dual Lens Authoring Guide) | Add: emotional divergence, access tier shifts, authoring checklist, THE FRIEND section |
---
## Dependency Chain (Converged)
Three parallel tracks converge at content pack production. Critical path highlighted.
```
TRACK A: Narrative (Paula) TRACK B: Setting (Miri) TRACK C: Systems (Gestalt+Araminta)
1. Dual Lens Guide (#261) ←─ 1. Sova Setting Brief (#189) 1. Line Pool Format Spec
**CRITICAL PATH** (Round 1 output = v0.1 draft) 2. Visual Grammar (Araminta)
| | 3. Spatial Layouts x3 (Araminta)
2. Character Voice Patterns 2. Wiki Taxonomy + Krenn Entry 4. Line Previewer (#193)
| |
3. THE FRIEND profiles (x2) 3. Sova Texture Appendix
**CRITICAL PATH** |
| 4. Contraband Spec
4. NPC Profiles (Tier 1-3) + Detective Chain of Command
| |
└────────────┬─────────────────┘
|
v
5. Character Voice Kits (Mellanie) ← **CRITICAL PATH**
|
6. Opening Hooks (Mellanie) ← **CRITICAL PATH**
|
└──────────────────────────────────────────────────┘
|
v
7. THE FRIEND Content Packs (Mellanie) ← **CRITICAL PATH**
|
8. VALIDATION: Previewer test
|
9. Content Packs x3 (#190-192) (Mellanie)
|
10. Polish: Tell lines, mirror moments, environmental text
```
**Critical path:** Dual Lens Guide → Voice Kits → THE FRIEND Content → Validation → Scale
**Parallel work (no dependencies):**
- Miri: Wiki taxonomy, Krenn System entry, Sova Texture Appendix, contraband spec
- Araminta: Visual Grammar, spatial layouts, insert wireframe
- Gestalt: Line pool format spec (formalize), knowledge state vocabulary
- Mellanie: Tag taxonomy smoke test (20 lines), environmental text templates, news ticker draft
- Audio: Generate station ambient + monologue chime (the two most important files)
---
## Content Volume Estimates (Mellanie R2)
| Category | Authored Lines | After Expansion |
|----------|---------------|-----------------|
| THE FRIEND: Kael Davan (full pack) | 75-100 | Hand-authored only |
| THE FRIEND: Sera Venn (full pack) | 75-100 | Hand-authored only |
| Template dialogue (3 packs) | 400-500 | ~1,600-2,000 (4x) |
| NPC-specific lines (~13 remaining) | 80-140 | ~320-560 (4x) |
| Monologue — smuggler | 120-160 | ~240-320 (2x) |
| Monologue — detective | 120-160 | ~240-320 (2x) |
| Opening hooks (2 characters) | 20-30 | Hand-authored only |
| Environmental text | 50-60 | N/A |
| News ticker / Meridian feed | 20-30 | N/A |
| UI microcopy | 40-50 | N/A |
| Tell monologue lines | 30-50 | N/A |
| **Total** | **~1,030-1,380** | **~3,200-4,200** |
---
## Per-Agent Next Steps
### Paula (Critical path owner)
1. Dual Lens Authoring Guide — full draft (blocks everything)
2. THE FRIEND: Kael Davan — full production profile
3. THE FRIEND: Sera Venn — full production profile
4. Relationship web formalization (15 NPCs, 5 triangles with Krenn names)
5. NPC Profiles: Tier 1 (4 entangled), Tier 2 (7 mundane), Tier 3 (3 flat)
### Mellanie (Content production)
1. Tag taxonomy smoke test (20 lines in YAML, immediate)
2. Environmental text templates + news ticker draft (unblocked)
3. Voice kits (3 options per character, needs Dual Lens Guide)
4. Opening hooks (needs voice kit validation)
5. THE FRIEND content packs (needs FRIEND profiles)
### Miri (Setting foundation)
1. Contraband Specification (unblocked, immediate)
2. Sova Texture Appendix (slang, idioms — blocks Mellanie)
3. Wiki taxonomy structure + Krenn System entry
4. NPC name finalization (mapping to Paula's web)
5. Detective chain of command
### Gestalt (Systems specification)
1. Lock tag taxonomy + line pool format (formalize as document)
2. Knowledge state vocabulary (blocks monologue prerequisites)
3. Dialogue selection pipeline specification
4. Sound event system architecture
5. Line previewer (#193) MVP scope
### Araminta (Visual design)
1. v0.1 Visual Grammar document (unblocked, immediate)
2. Spatial layouts x3 (needs Visual Grammar + Miri's setting)
3. Insert/HUD wireframe (dual-character variants)
4. Monologue display system spec
5. Sound indicator visual design
### Ozzie (Validation)
1. Review THE FRIEND contradiction arcs (gut check)
2. Audio asset specification finalization
3. Playtest readiness evaluation
4. Wow moment dependency tracking
---
## Workshop Assessment
**Strengths:**
- Remarkable convergence across 6 independent analyses
- THE FRIEND concept evolved from Ozzie's emotional instinct through Paula's structural design to Mellanie's authoring plan in a single workshop
- Miri's Sova Transit District gave the entire team a concrete foundation
- Tag taxonomy converged without coordination — Mellanie and Gestalt proposed nearly identical structures
- Dependency chain was independently identified by Mellanie, Paula, and Gestalt with compatible structures
**Risks:**
- Dual Lens Guide is a single point of failure — everything downstream blocks on Paula's deliverable
- Content volume (~1,030-1,380 lines) is significant for one writer (Mellanie)
- 17 content-supporting systems identified, 0 built — server team has substantial work
- Generation expansion on monologue risks flattening character voice (Ozzie, Mellanie flag 2x max for monologue vs 4x for dialogue)
**Flags for Qatux:**
- Mellanie proposed Lera Sessik as detective's FRIEND in Round 2; Paula proposed Sera Venn. Project lead confirmed Sera Venn. Lera remains the bar owner, not THE FRIEND.
- Paula reconciled from 7 triangles to 5 triangles in Round 2. The 5-triangle model is canonical.
- Miri proposed different NPC name assignments than Paula's Round 2 reconciliation. Paula's Round 2 assignments are canonical (verified by project lead's Sera Venn confirmation).
- Gestalt's "17 content needs, 0 built" assessment accurately describes the systems gap.
---
*Compiled by Qatux. Workshop outputs archived at `docs/workshops/content-gap-analysis_v0_1/`.*
*Decisions recorded in `decisions/*.md` (D-032 through D-040).*
*Last updated: 2026-02-11*
@@ -1,197 +0,0 @@
# v0.1 Content Gap Analysis — Ticket Summary
**Workshop:** Content Gap Analysis v0.1
**Date:** 2026-02-11
**Created by:** Si (Project Manager)
**Source:** 6 Round 2 synthesis outputs (Mellanie, Paula, Araminta, Miri, Gestalt, Ozzie)
---
## Project Lead Decisions Incorporated
1. Detective's FRIEND: **Sera Venn** (Paula's design) — confirmed
2. Smuggler's FRIEND: **Kael Davan** — confirmed
3. All 6 wow moments in scope (Ozzie's list)
4. Audio in v0.1 via **Stable Audio Open** (8 files)
5. Wiki taxonomy: **non-negotiable**, must be established now
---
## Summary Statistics
| Category | New Tickets | Updated Tickets | Total |
|----------|------------|----------------|-------|
| Critical | 9 | 1 | 10 |
| High | 23 | 3 | 26 |
| Medium | 10 | 2 | 12 |
| **Total** | **42** | **6** | **48** |
---
## Existing Tickets Updated (6)
| ID | Title | Change | Source |
|----|-------|--------|--------|
| #261 | Dual Lens Authoring Guide | Priority: high → **critical**. Expanded scope: voice signatures, access tier shift paths, authoring checklist, THE FRIEND section. | All 6 agents |
| #189 | Cultural generation guide — Miri | Sova Transit District is first concrete instance. Miri R1 output IS the v0.1 slice. | Mellanie, Miri |
| #168 | Tagged line pool structure | Converged 6+3 tag taxonomy from workshop. YAML format locked. | Gestalt, Mellanie, Paula |
| #124 | Sound event system — server | Expanded architecture: SoundEventEmitter with AudioAssetRegistry, visual fallback, AmbientManager. | Gestalt, Ozzie |
| #90 | Personality & tell system | 5 tell categories. v0.1 renderer = monologue text, not visual animation. | Gestalt, Araminta, Ozzie |
| #193 | Line previewer CLI | Concrete MVP: 8 features. Build AS dialogue pipeline first implementation. | Gestalt, Mellanie, Ozzie |
---
## New Tickets — Critical (9)
| ID | Title | Owner | Proposed By |
|----|-------|-------|-------------|
| #297 | THE FRIEND: Smuggler NPC — Kael Davan full profile + content pack | Paula + Mellanie | Mellanie, Paula, Gestalt, Ozzie |
| #298 | THE FRIEND: Detective NPC — Sera Venn full profile + content pack | Paula + Mellanie | Mellanie, Paula, Gestalt, Ozzie |
| #299 | Opening hook content — smuggler first 5 minutes | Mellanie | Mellanie, Paula, Ozzie |
| #300 | Opening hook content — detective first 5 minutes | Mellanie | Mellanie, Paula, Ozzie |
| #301 | Wiki taxonomy and structure — full future-ready schema | Miri + Qatux | Mellanie, Paula, Miri |
| #302 | Sova Texture Appendix — slang glossary, idioms, sensory details | Miri | Mellanie, Miri |
| #303 | v0.1 Visual Grammar Document | Araminta | Araminta, Ozzie |
| #304 | Entity Color System Spec — relationship-to-player mapping | Araminta | Araminta |
| #305 | Dialogue selection pipeline — 4-layer filtering engine | Dudley | Gestalt |
---
## New Tickets — High (23)
### Content / Narrative
| ID | Title | Owner | Proposed By |
|----|-------|-------|-------------|
| #306 | News ticker / Meridian feed content — 20-30 lines | Mellanie + Miri | Mellanie, Paula, Ozzie |
| #307 | Flat NPC memorable trait pass — 3 flat NPCs | Paula + Mellanie | Ozzie |
| #310 | Character voice speech patterns — smuggler + detective | Paula + Mellanie | Mellanie, Paula |
| #328 | Access tier shift design document | Paula + Gestalt | Paula, Gestalt |
### Visual / Spatial
| ID | Title | Owner | Proposed By |
|----|-------|-------|-------------|
| #311 | Spatial layout: Logistics Hub (The Terminal) | Araminta | Paula, Araminta |
| #312 | Spatial layout: Bar (The Last Shift) | Araminta | Paula, Araminta |
| #313 | Spatial layout: Smuggling spaces and transition corridors | Araminta | Paula, Araminta |
| #314 | Insert/HUD wireframe and spec — dual character variants | Araminta | Araminta |
| #315 | Monologue display system visual spec | Araminta | Araminta, Paula |
| #316 | Text display hierarchy spec — 4 content pipelines | Araminta | Araminta |
| #317 | Sound indicator visual design — fog-edge pulse | Araminta | Araminta |
| #318 | THE FRIEND visual treatment spec | Araminta | Araminta |
### Worldbuilding
| ID | Title | Owner | Proposed By |
|----|-------|-------|-------------|
| #319 | Krenn System wiki entry — first star system | Miri | Paula, Miri |
| #320 | Sova Station Profile — station beyond Transit District | Miri | Miri |
| #321 | Contraband specification — lattice components + supply chain | Miri | Miri |
| #322 | Detective institutional chain of command | Miri + Paula | Miri, Paula |
### Systems / Implementation
| ID | Title | Owner | Proposed By |
|----|-------|-------|-------------|
| #308 | Line pool format specification — formal document | Gestalt | Mellanie, Gestalt |
| #309 | Knowledge state vocabulary for v0.1 | Gestalt + Dudley | Mellanie, Gestalt |
| #323 | NPC mood state machine | Dudley | Gestalt |
| #324 | Trust progression system | Dudley | Gestalt |
| #325 | Interaction tracking component | Dudley | Gestalt |
| #326 | YAML content loader — hot-reload for previewer | Dudley | Gestalt |
| #327 | Audio asset set — 8 minimum viable files via Stable Audio Open | TBD | Mellanie, Ozzie, Gestalt |
---
## New Tickets — Medium (10)
| ID | Title | Owner | Proposed By |
|----|-------|-------|-------------|
| #329 | Mirror moment design document — 10-15 paired observations | Paula + Mellanie | Mellanie, Paula |
| #330 | Diegetic tutorial monologue lines — per character | Mellanie | Paula, Gestalt |
| #331 | Diegetic insert flavor text — per character | Mellanie + Araminta | Ozzie |
| #332 | Contradiction arc design document — reusable FRIEND pattern | Paula | Paula |
| #333 | Fog rendering visual spec — 4 states | Araminta | Araminta |
| #334 | Environmental text visual standards | Araminta | Araminta |
| #335 | Meridian Coverage Map for Sova Transit | Miri | Miri |
| #336 | Span Gate Transit Schedule | Miri | Miri |
| #337 | Tell state derivation system | Dudley | Gestalt |
| #338 | Line variety tracker — prevent repeat dialogue | Dudley | Gestalt |
---
## Owner Summary
| Owner | Critical | High | Medium | Total |
|-------|----------|------|--------|-------|
| **Paula** (+ co-owners) | 2 | 4 | 2 | 8 |
| **Mellanie** (+ co-owners) | 2 | 2 | 2 | 6 |
| **Araminta** | 2 | 8 | 2 | 12 |
| **Miri** (+ co-owners) | 2 | 4 | 2 | 8 |
| **Gestalt** (+ co-owners) | 0 | 3 | 0 | 3 |
| **Dudley** | 1 | 3 | 2 | 6 |
| **TBD** | 0 | 1 | 0 | 1 |
---
## Critical Path
```
Phase 0: FOUNDATIONS (no dependencies — can start immediately)
|
|-- [Miri #302] Sova Texture Appendix
|-- [Miri #301] Wiki taxonomy + Krenn entry (#319)
|-- [Miri #321] Contraband specification
|-- [Gestalt #308] Line pool format spec
|-- [Gestalt #309] Knowledge state vocabulary
|-- [Paula #261] Dual Lens Authoring Guide (CRITICAL PATH)
|-- [Araminta #303] v0.1 Visual Grammar Document
|-- [Araminta #304] Entity Color System Spec
|
Phase 1: CHARACTER ARCHITECTURE (needs Phase 0)
|
|-- [Paula+Mellanie #310] Character voice speech patterns
| |
| v
|-- [Mellanie] Smuggler voice kit (uses #180)
|-- [Mellanie] Detective voice kit (uses #181)
|
Phase 2: THE FRIEND (needs Phase 1)
|
|-- [Paula #297] Kael Davan full profile
|-- [Paula #298] Sera Venn full profile
| |
| v
|-- [Mellanie #297] THE FRIEND content packs
|
Phase 3: OPENING HOOKS (parallel with Phase 2)
|
|-- [Mellanie #299] Opening hook — smuggler
|-- [Mellanie #300] Opening hook — detective
|
Phase 4: CONTENT PACKS (needs Phase 2 validation)
|
|-- [Mellanie #190] Logistics Hub content pack
|-- [Mellanie #191] Bar content pack
|-- [Mellanie #192] Smuggling ring content pack
|
Phase 5: POLISH
|
|-- [Mellanie #306] News ticker
|-- [Paula+Mellanie #329] Mirror moments
|-- [Mellanie #330] Diegetic tutorial lines
|-- [Mellanie+Araminta #331] Insert flavor text
```
**Single highest-risk dependency:** #261 Dual Lens Authoring Guide. If delayed, everything downstream shifts.
---
## Notes
- Existing tickets #190, #191, #192 (content packs) now have parallel spatial layout co-deliverables (#311, #312, #313). Content and layout must be developed together.
- Existing ticket #179 (NPC profiles) now has a split: 2 NPCs (Kael, Sera) at production-level depth via #297/#298, remaining 13 at v0.1 tiers.
- #303 (Visual Grammar) supersedes #252 (Placeholder art spec) in scope.
- #305 (Dialogue pipeline) and #193 (Line previewer) share code — build previewer AS the pipeline.
- #327 (Audio assets) ownership TBD — needs someone to run Stable Audio Open generation pipeline.
@@ -1,269 +0,0 @@
# Workshop Brief: v0.1 Content Gap Analysis
## What Does the Vertical Slice Actually Need?
**Project:** The Settled Reach (D-021)
**Date:** 2026-02-11
**Called by:** Jeroen
**Participants:** MELLANIE, PAULA, ARAMINTA, MIRI, GESTALT, OZZIE
---
## The Problem
The server and client teams are building the IPC bridge (Sprint 1). The content team — Mellanie (copywriter), Paula (narrative), Araminta (visual design) — has no actionable work yet. We have strong *architectural* decisions about content (D-023 through D-029) and some critical tickets (#190-192 content packs), but we haven't mapped what content the v0.1 vertical slice actually needs, in what format, and in what order.
This workshop moves from the most global decisions down to the most specific content needs. At each layer we identify what exists, what's missing, and what each team member needs to start working.
**v0.1 scope reminder (D-027):** Smuggler + detective two-character proof. One station district. 3 social site templates (workplace logistics hub, social bar, smuggling ring). ~15 NPCs. 30-minute daily-life runway before conspiracy activation. Success = both playthroughs feel like fundamentally different games.
---
## Layer 1: Art Direction & Visual Identity
**The most global question: what does this game look like?**
| What exists | Status |
|-------------|--------|
| Q-003 (art direction) | OPEN — no decision made |
| #20 Art direction ticket | medium priority, backlog |
| #252 Placeholder art spec | high priority, backlog |
| #133 Placeholder art pipeline | high priority, backlog |
| D-014 says "functional boxes with labels" | — |
| D-016 says "atmosphere carried by monologue" | — |
**Gaps:**
- No color palette, no sprite style guide, no UI visual language
- No resolution/format standards beyond what #252 will define
- No guidance on whether v0.1 should look deliberately placeholder or aim for a mood
**Questions for the team:**
1. **Araminta:** Can you define a v0.1 visual identity without resolving Q-003 fully? Or should we make Q-003 a decision now — even if it's "functional minimalism, atmosphere through text"?
2. **Araminta:** What's the minimum art direction document needed so that anyone producing visual assets stays consistent?
3. **Ozzie:** Does the vertical slice need visual mood, or is "readable placeholder" sufficient to prove the concept?
---
## Layer 2: Narrative Framework & Character Design
**Before writing a single line of dialogue: who are these two characters, and how do they see the world differently?**
| What exists | Status |
|-------------|--------|
| D-027 Vertical slice: smuggler + detective | confirmed |
| Epic #57 Playable Characters | critical, 5 children |
| #179 Character definition schema | backlog |
| #180 Smuggler character build | backlog |
| #181 Detective character build | backlog |
| #182 Divergent starting knowledge | backlog, critical |
| #183 Divergent relationships | backlog, critical |
| #261 Dual Lens Authoring Guide | high priority, backlog |
**Gaps:**
- #261 (Dual Lens Authoring Guide) **must precede ALL content packs** — it defines how the same NPCs, locations, and situations play differently for each character
- No character voice profiles (how does the smuggler's internal monologue sound vs. the detective's?)
- No access tier mapping (which NPCs treat the smuggler as insider vs. the detective?)
**Questions for the team:**
1. **Paula:** What does the Dual Lens Guide need to contain? Is it a document you write solo, or should it be a workshop output?
2. **Paula:** How do you define "divergent starting knowledge" (#182)? Is it a list of facts each character knows, or something more structural?
3. **Mellanie:** What do you need from the character builds before you can write voice-consistent dialogue?
4. **Gestalt:** How do access tiers (D-028 Layer 1) interact with the two character builds mechanically?
---
## Layer 3: Station District Setting
**What does this place feel like? What's the vibe, the history, the texture?**
| What exists | Status |
|-------------|--------|
| D-014 v0.1 map spec | confirmed |
| Epic #58 Station District Content | critical, 5 children |
| #184 Workplace template — logistics hub | backlog |
| #185 Social venue template — bar | backlog |
| #186 Smuggling ring template | backlog |
| #189 Cultural generation guide | critical, assigned to Miri |
| D-025 Social site structure (4-8 NPCs, 15-40 tiles) | confirmed |
**Gaps:**
- No station district lore document — what is this place? Who built it? What's the economic engine?
- No environmental storytelling plan — what do signs say? What's on the news ticker? What's the graffiti?
- No location "feel" descriptions — is the workplace sterile or chaotic? Is the bar upscale or dive?
**Questions for the team:**
1. **Miri:** Can you write a one-page station district setting document? Just enough for v0.1 — name, purpose, atmosphere, recent history, what makes it interesting.
2. **Paula:** How does the station's character feed into NPC motivations? (E.g., economic pressure → smuggling opportunity)
3. **Ozzie:** What environmental details make a player feel present in the first 30 seconds?
---
## Layer 4: Content Pipeline & Authoring Format
**Before Mellanie writes 500+ lines of dialogue: what format do they go in?**
| What exists | Status |
|-------------|--------|
| D-028 Tagged line pool architecture | confirmed |
| Epic #55 Dialogue system architecture | high, 7 children |
| #168 Tagged line pool structure | backlog |
| #193 Line previewer CLI | critical, backlog |
**Gaps:**
- No concrete authoring format defined — what does a line pool file actually look like? YAML? JSON? CSV with tags?
- No tag taxonomy — what tags exist? (role, trust_tier, mood, topic, situation, character_class)
- Line previewer (#193) doesn't exist yet — Mellanie can't test what she writes
**Questions for the team:**
1. **Gestalt:** Propose a concrete line pool format. What metadata per line? What's the minimum viable tag set for v0.1?
2. **Mellanie:** Can you write content packs in a provisional format before the previewer exists, or does the format need to be locked first?
3. **Gestalt:** How do the 4 dialogue layers (access, history, trust, unprompted) map to line tags? One tag per layer, or more complex?
---
## Layer 5: Template Content (3 Social Sites)
**The core content deliverables for v0.1.**
| What exists | Status |
|-------------|--------|
| #190 Workplace content pack | critical, backlog |
| #191 Bar content pack | critical, backlog |
| #192 Smuggling ring content pack | critical, backlog |
| D-025 Social site = 4-8 NPCs, 15-40 tiles | confirmed |
| D-028 ~165-210 authored lines per template | confirmed |
| D-029 Entanglement ratio: 30/50/20 | confirmed |
**Gaps:**
- No NPC personality profiles — the 10-axis model (D-024) is an ECS schema, not character descriptions
- No relationship web — who knows whom, who's lying to whom, who's sleeping with whom
- No routine descriptions — where does each NPC go and when?
- No triangle definitions — D-029 requires mundane triangles, but none are designed
**Questions for the team:**
1. **Mellanie:** What does a content pack deliverable look like? Break down #190 into what you'd actually write.
2. **Paula:** How do you design the relationship web for 3 overlapping social sites? Who are the "bridge" NPCs that connect them?
3. **Paula:** How many triangles per template? D-029 says 2 minimum per template + 1 cross-template. What do they look like concretely?
4. **Gestalt:** How does the entanglement ratio (30/50/20) play out across ~15 NPCs? That's ~4-5 flat, ~7-8 mundane-triangle, ~3 entangled?
---
## Layer 6: NPC Profiles & Dialogue
**Making ~15 NPCs feel like people, not database entries.**
| What exists | Status |
|-------------|--------|
| D-024 NPC 10-axis model | confirmed |
| #86 Core NPC data model components | backlog |
| #87 Relationship tracking system | backlog |
| #88 Daily routine system | backlog |
| #168-174 Dialogue system tickets | backlog |
| #251 Tell visual/behavioral expression | high, backlog |
**Gaps:**
- No tickets for writing actual NPC profiles (personality, backstory, voice)
- No tickets for voice kit authoring (15-25 lines per NPC role)
- No tickets for relationship history content (what happened between these people before the game starts?)
- No tell catalog (what observable behaviors map to what internal states?)
**Questions for the team:**
1. **Paula + Mellanie:** How deep does each NPC profile need to be? Full backstory, or just the 10 axes plus a voice sample?
2. **Mellanie:** How many lines per NPC for v0.1? D-028 estimates 15-25 per role in a template. With ~15 NPCs, that's 225-375 lines of role dialogue alone.
3. **Gestalt:** What's the minimum viable tell system? One behavioral marker per axis, or fewer?
4. **Ozzie:** Which NPC should the player remember after 30 minutes? What makes them memorable — a line, a routine, a contradiction?
---
## Layer 7: Monologue & Observation Text
**The character's inner voice — the primary content delivery mechanism in v0.1.**
| What exists | Status |
|-------------|--------|
| D-016 Internal monologue as perception bridge | confirmed |
| #119 Monologue event generation | backlog |
| #120 Monologue line pool system | backlog |
| #121 Character voice variation | high, backlog |
| #253 Monologue content architecture | high, backlog |
| #239 Observation event generator | critical, backlog |
**Gaps:**
- No monologue line count estimates per location type
- No character voice variation specs (how does the smuggler interpret vs. the detective?)
- No observation trigger catalog (what events produce monologue?)
- No "mirror moment" content — lines that hint at the other character's perspective
**Questions for the team:**
1. **Mellanie:** How many monologue lines make v0.1 feel alive? D-028 workshop estimated 200-300 across location types for atmosphere floor. Sound right?
2. **Mellanie:** Can the same observation event produce different monologue for smuggler vs. detective? Or do you need separate pools?
3. **Paula:** What are the "mirror moments" — places where the monologue hints that this situation looks different from another perspective?
4. **Ozzie:** When does the first monologue surprise the player? What's the moment where they think "wait, my character noticed something I didn't"?
---
## Layer 8: UI Text & Environmental Content
**Everything on screen that isn't dialogue or monologue.**
| What exists | Status |
|-------------|--------|
| #262 Environmental text content | medium, backlog |
| #263 Time display on insert HUD | medium, backlog |
| #264 Knowledge/journal display | medium, backlog |
| #174 Dialogue UI | backlog |
| D-013 Diegetic insert (neural implant map) | confirmed |
**Gaps:**
- No UI copy document (button labels, menu text, notification strings)
- No tutorial/onboarding text (how does the player learn the controls?)
- No diegetic content (signs, terminal screens, manifests, notices, news feeds)
- No insert/minimap text (POI labels, status indicators)
**Questions for the team:**
1. **Mellanie + Araminta:** What text appears on screen that isn't dialogue or monologue? Make a list.
2. **Araminta:** How does the neural implant UI look? Is it a literal implant overlay, or abstracted?
3. **Gestalt:** Does v0.1 need onboarding text, or can the monologue system serve as the tutorial (D-016 "diegetic tutorial")?
---
## Layer 9: Audio Direction
**The most deferred question: what does the game sound like?**
| What exists | Status |
|-------------|--------|
| D-018 Three-range sound model | confirmed |
| #124-128 Sound propagation tech tickets | backlog |
| #46 Sound Propagation Model epic | 5 children |
**Gaps:**
- Zero audio content tickets — no ambient soundscapes, no foley, no music direction
- No decision on whether v0.1 uses placeholder audio or real audio
- No audio style guide
**Questions for the team:**
1. **Ozzie:** Does placeholder audio kill the atmosphere, or is silence acceptable for a concept proof?
2. **Gestalt:** Does the three-range sound model need audio content to prove itself, or can it work with system beeps and text?
3. **Team:** Should we defer audio entirely to a later sprint, or establish direction now?
---
## Workshop Format
**2 rounds.**
**Round 1 — Layer-by-layer gap identification.** Each participant responds to the questions in their domain. Propose concrete answers, not just "we need to figure this out."
**Round 2 — Synthesis.** Review Round 1 answers. Produce:
1. Missing ticket list (new tickets to create)
2. Dependency chain (what must come before what)
3. Content team work order for Sprint 2 or a parallel content track
## Expected Outputs
- **Decision:** Art direction approach for v0.1 (resolve or scope Q-003)
- **Document:** Dual Lens Authoring Guide outline (Paula)
- **Document:** Station district setting brief (Miri)
- **Specification:** Line pool authoring format (Gestalt)
- **List:** New tickets filling content gaps (Si creates post-workshop)
- **Plan:** Dependency-ordered content work plan for Mellanie, Paula, Araminta
@@ -1,383 +0,0 @@
# Round 1 Workshop Response: Araminta (Visual Design)
**Agent:** Araminta (Visual Designer)
**Date:** 2026-02-11
**Scope:** All 9 layers from visual design perspective
---
## Layer 1: Art Direction & Visual Identity
### Q1: Can I define a v0.1 visual identity without resolving Q-003 fully?
**Yes. And we should do exactly that.**
Q-003 asks about long-term art direction. That's a question about final fidelity, sprite style, animation approach, lighting systems. We don't need to answer any of that to build v0.1. What we need is a **v0.1 visual grammar** - a set of rules for how information is communicated visually, regardless of art fidelity.
**Proposal: Resolve Q-003 partially with a scoped decision.**
> **D-XXX: v0.1 visual approach - "readable information design, atmosphere through text and spatial composition."**
>
> - Entities are colored rectangles with text labels. No sprites in v0.1.
> - Color communicates RELATIONSHIP TO PLAYER, not object type.
> - Spatial layout communicates function - the bar FEELS different from the logistics hub through room shape, furniture density, corridor width.
> - Atmosphere is carried by monologue text, dialogue content, and sound indicators - NOT by art.
> - All visual rules must scale: a color that means "danger" in boxes-with-labels must still mean "danger" when we add sprites.
This is not "we'll figure out art later." This is "v0.1's art IS information design." The boxes aren't placeholder art waiting for real art. The boxes ARE the visual language at this fidelity level.
Long-term Q-003 (sprite style, animation, lighting) stays open. It doesn't block anything.
### Q2: What's the minimum art direction document needed for consistency?
A **one-page visual grammar** covering:
1. **Color palette** (see below)
2. **Entity sizing rules** (NPCs, furniture, walls, doors - relative proportions)
3. **Label conventions** (what text shows on entities, when, at what zoom)
4. **UI layer separation** (game world vs. insert overlay vs. monologue text vs. dialogue)
5. **Fog/visibility rendering rules** (visible, fog-edge, hidden - how they look)
That's it. No style guide for art we haven't made. No font selection for UI that doesn't exist yet. Just the rules for communicating game state visually.
### Proposed v0.1 Color Palette
The Settled Reach is sleek, advanced, subtle. Even at boxes-with-labels fidelity, we can communicate mood.
**Background/Environment:**
- `#1a1a2e` - Deep navy. Base floor/ground. The station is dimly lit by default.
- `#2d2d44` - Slightly lighter. Walls, barriers, solid obstacles.
- `#0f0f1a` - Near-black. Fog/hidden areas. Darkness should feel HEAVY.
**Entity Colors (relationship-to-player, NOT object type):**
- `#4a9ebb` - Cool teal. Neutral/unknown NPCs. Default state.
- `#6bc9a6` - Soft green. Friendly/trusted NPCs. People your character knows and likes.
- `#e8c547` - Warm amber. NPCs of interest. Your monologue has flagged something about them.
- `#d45d5d` - Muted red. Hostile/dangerous. ONLY when the character KNOWS there's danger. Not omniscient threat display.
- `#8b8ba0` - Grey. Furniture, static objects, environmental elements.
**UI Overlay Colors:**
- `#3d7aaf` with 40% opacity - Insert/minimap overlay tint. The neural implant's "screen."
- `#ffffff` at 85% opacity - Primary UI text (labels, insert readouts).
- `#a0a0b8` at 70% opacity - Secondary UI text (non-critical info).
**Monologue Text:**
- `#c8d0e0` - Internal monologue. Slightly cool, slightly ethereal. This is thought, not speech.
- Italicized. Positioned bottom-center or left panel. Fades in/out, doesn't snap.
**Dialogue Text:**
- `#ffffff` - NPC speech. Clean white. Grounded, real.
- NPC name in their relationship color above the dialogue line.
**Key principle:** Red means danger TO YOUR CHARACTER, not danger in the abstract. If the smuggler's friend is secretly an informant, that NPC is GREEN until the smuggler discovers the betrayal. The detective might see that same NPC as AMBER (person of interest) from the start. Same NPC, different color, because asymmetric information drives the palette.
This is D-011 (fog of perception) applied to the color system. The player sees what the character knows.
### Fog Rendering Specification
Three visual states for tiles:
| State | Appearance | When |
|-------|-----------|------|
| **Visible** | Full color, full detail, entities shown | Currently in LOS |
| **Fog-edge** | Desaturated 50%, entities hidden, sound indicators shown | Adjacent to LOS, within medium sound range |
| **Hidden** | Near-black (`#0f0f1a`), no entities, no indicators | Outside perception range |
| **Remembered** | Desaturated 70%, static snapshot of last-seen state, no entities | Previously visited, now outside LOS |
The "remembered" state is important. D-011 says fog returns on departure, but the player should see a ghost of what they last saw - furniture stays, NPCs vanish. This communicates "I was here, but things may have changed." It costs almost nothing to implement and sells the information-decay concept visually.
---
## Layer 2: Narrative Framework & Character Design
### Visual implications of character divergence
The two characters need **distinct visual treatments** even at boxes-with-labels fidelity:
- **Smuggler's player entity:** Slightly different shade or shape indicator. Doesn't need to be dramatic - a subtle color difference in the player marker is enough.
- **Detective's player entity:** Same principle, different accent.
More importantly: the **insert overlay** should feel different per character. The smuggler's insert is consumer-grade, maybe slightly less polished. The detective's is institutional - cleaner layout, more structured information display. This is a v0.2+ concern but worth noting now so the insert UI is designed with parameterization in mind.
For v0.1: a small character icon or color accent on the HUD that says "you are the smuggler" vs "you are the detective." Minimal but present.
---
## Layer 3: Station District Setting
### Visual layout principles for the three social sites
Even with boxes, spatial design communicates EVERYTHING about a location. Here's what each site should feel like through layout alone:
**Workplace (Logistics Hub):**
- Regular grid layout. Rows of workstations. Wide corridors for cargo movement.
- A few enclosed offices (walls block LOS - management has privacy).
- One loading bay area (open, high visibility, the "public" face).
- One back area (restricted, fewer sightlines - where secrets live).
- **Visual feel:** Ordered, institutional, functional. The regularity IS the aesthetic.
**Social Venue (Bar):**
- Irregular, organic layout. Booths create pockets of privacy.
- Central bar area with high visibility (everyone can see who's ordering).
- Corner tables with partial LOS blocks (intimate conversations).
- A back room or alley exit (the sketchy escape route).
- **Visual feel:** Warm-toned compared to the hub. Furniture density higher. More "walls" from booths and partitions creating complex sightlines.
**Smuggling Ring (Hidden within/adjacent to other spaces):**
- NOT a labeled "smuggling HQ." It's a maintenance corridor, a storage room, a section of the cargo bay that's officially off-limits.
- Tight spaces, poor sightlines, few entrances/exits.
- Visually indistinguishable from other utility spaces unless you know what to look for.
- **Visual feel:** Cramped. The contrast with the open logistics hub IS the atmosphere.
**Cross-site visual language:**
- Public spaces: wider corridors, more open tiles, lighter floor colors.
- Private spaces: narrower, enclosed, slightly darker floor tones.
- Transition zones: doorways, corridors between sites. These are where "wrong place, wrong time" moments happen. They need enough space for the player to see someone passing through.
No art needed. Room shapes and tile colors do the work. A bar booth is a 3x2 rectangle with half-height wall blocks. An office is a 4x4 enclosed room with a door entity. The spatial relationships create the gameplay affordances.
---
## Layer 4: Content Pipeline & Authoring Format
### Visual implications of the authoring format
Not my primary domain, but one critical visual note:
**Every dialogue line needs a display context tag.** The renderer needs to know:
- Is this spoken dialogue? (Display in dialogue UI panel, NPC name header)
- Is this overheard conversation? (Display as fog-edge text snippet, lower opacity, partial)
- Is this a monologue reaction? (Display in monologue area, italic, character voice color)
- Is this environmental text? (Display as world-space label on the object/sign/terminal)
These are four different rendering pipelines. The authoring format must tag which pipeline each line targets. Mellanie and Paula need this in the format spec so they don't write a line that falls between categories.
---
## Layer 5: Template Content (3 Social Sites)
### Visual deliverables per template
Each social site template needs a **spatial layout document** alongside the content pack. This is my deliverable. For each template:
1. **Floor plan** - tile-level layout showing walls, doors, furniture, sightlines
2. **Sightline diagram** - from key observation positions, what can you see? Where are the blind spots?
3. **Sound propagation notes** - which walls are thin (sound bleeds through), which are thick
4. **NPC position markers** - where do NPCs stand/sit during their routine phases?
5. **Player approach vectors** - how does the player enter? What do they see first?
This is the spatial design that makes observation gameplay work. A bar where you can see everyone from the entrance is a different game than a bar where you have to walk past three booths before you see the back table.
**Proposed ticket: spatial layout design per social site template (3 layouts, high priority).** This should be parallel with the content packs, not after them. Layout affects what content makes sense.
---
## Layer 6: NPC Profiles & Dialogue
### Visual expression of NPCs at boxes-with-labels fidelity
At v0.1 fidelity, NPC differentiation is:
1. **Color** (relationship state, as defined in the palette above)
2. **Label text** (name when known, role when partially known, "?" when unknown)
3. **Position and movement** (are they at their expected location? Moving with purpose or loitering?)
That's it. No character portraits. No sprite variation. No clothing differences.
**But this is enough.** The detective walks into the logistics hub. They see: a cluster of teal rectangles labeled "Worker," "Worker," "Worker," one amber rectangle labeled "Jax (shift supervisor)." Amber because the detective's case file flagged Jax. The smuggler walks in and sees: green rectangles labeled "Tomas," "Kira," "Jax" (all known, all friendly). Same room, different visual state, different information.
The color system IS the visual expression of asymmetric information. It doesn't need sprites to work.
### Tell system visual language (#251)
D-024 mentions a tell system - observable behaviors mapping to internal states. At boxes-with-labels fidelity, tells are NOT visual. They're:
- Monologue: "Jax is tapping his foot. He does that when he's nervous."
- Dialogue: NPC speech patterns change based on mood (Mellanie's domain)
- Behavioral: NPC is in an unexpected location or moving unusually
The monologue is the tell renderer for v0.1. Visual tells (sweating, fidgeting, avoiding eye contact) are sprite-fidelity features. Text carries the load for now.
When we get to sprites: each NPC should have 2-3 behavioral animation states (idle, nervous, angry) that map to mood axes. But that's later.
---
## Layer 7: Monologue & Observation Text
### Monologue presentation design
This is one of my key deliverables. The monologue is the player's primary information channel in v0.1.
**Presentation rules:**
| Property | Specification | Rationale |
|----------|--------------|-----------|
| **Position** | Bottom of screen, left-aligned, 60% width max | Doesn't obscure the game world. Left-align because we read left-to-right; it's the natural "start reading" position. |
| **Font** | Monospace or clean sans-serif. Slightly smaller than dialogue. | Monologue is internal thought - quieter than spoken words. Monospace gives a "data overlay" feel consistent with the insert aesthetic. |
| **Color** | `#c8d0e0` (cool off-white) | Distinct from dialogue (#ffffff) and UI text. Slightly ethereal. |
| **Style** | Italic | Universal convention for internal thought. Instantly readable as "this isn't spoken." |
| **Animation** | Fade in over 0.3s, hold for read-time + 1s, fade out over 0.5s | Not jarring. Doesn't demand attention like a popup. Respects the player's pace. |
| **Stacking** | Max 3 lines visible. New lines push old lines up and fade them. | Prevents monologue flooding during high-event moments. |
| **Priority** | Observation > atmosphere > tutorial hint | If multiple monologue triggers fire simultaneously, observation wins. The player needs to know "that NPC is acting weird" more than "nice evening." |
**Character voice differentiation (visual):**
The smuggler and detective should have subtly different monologue presentation:
- **Smuggler:** Slightly warmer text color (`#d0d0c0`), slightly more casual phrasing (Mellanie's domain, but the visual warmth supports it).
- **Detective:** Slightly cooler text color (`#c0c8e0`), more structured phrasing.
This is a minor touch that compounds over 30 minutes. The player's subconscious registers "this character thinks differently" through the text color before they consciously parse the words.
### Observation text vs. monologue vs. dialogue - visual hierarchy
The player needs to instantly distinguish these three information channels:
| Channel | Position | Style | Color | Example |
|---------|----------|-------|-------|---------|
| **Dialogue** | Center-bottom panel, NPC name header | Regular weight | `#ffffff` on dark panel | **Kira:** "Quiet night at the hub." |
| **Monologue** | Bottom-left, no panel/frame | Italic | `#c8d0e0` | *She says that, but she won't look at me.* |
| **Observation** | Same as monologue but with icon marker | Italic + small eye icon | `#c8d0e0` | [eye] *Jax just walked past the restricted door.* |
| **Environmental** | World-space, attached to object | Small caps, subtle | `#8b8ba0` | CARGO BAY 7 - AUTHORIZED PERSONNEL ONLY |
The observation marker (small eye icon) is important. It tells the player "your character noticed something." It's the visual cue for the detective mechanic. Over time, players learn: eye icon = pay attention.
---
## Layer 8: UI Text & Environmental Content
### Q1: What text appears on screen that isn't dialogue or monologue?
Complete inventory:
**Insert/HUD Layer (diegetic - it's the neural implant):**
- Time display (D-031: game clock, day phase indicator)
- Minimap with POI dots and directional arrows (D-013)
- POI labels when close enough
- Alert notifications ("Message from [contact name]")
- Insert-mode indicators if perception modes are active (v0.1: just natural vision, but the slot should exist)
**World-Space Labels:**
- Location names (room/area labels: "Logistics Hub - Bay 7")
- Door labels ("Office," "Storage," "Restricted")
- Sign text (business names, warnings, directions)
- Terminal screens (if examine mechanic exists: cargo manifests, schedules, case files)
- NPC name/role labels (floating above entity rectangle)
**System UI (non-diegetic, minimal):**
- Pause indicator
- Character name/role reminder (top corner, very subtle)
- Save indicator (if save/load exists)
- Interaction prompt (when near an interactable: "E: Examine" or similar)
**NOT on screen (deliberately):**
- Health bars, stamina bars, XP indicators - none of these exist in v0.1 and may never exist in traditional form
- Quest log/objective marker - the monologue IS the quest hint system
- Mini-tutorial popups - monologue handles this diegetically (D-016)
### Q2: How does the neural implant UI look?
**It's a literal implant overlay, not an abstracted game UI.** This is non-negotiable given D-013.
The insert is what the character sees when they activate their neural implant's navigation overlay. In v0.1, this means:
**Visual treatment:**
- Semi-transparent overlay with a subtle blue-tinted border or vignette (`#3d7aaf` at 15-20% opacity)
- The minimap is NOT a separate UI window. It's an overlay that tints the top-right (or bottom-right) corner of the game view.
- POI markers are simple geometric shapes: circles for locations, diamonds for contacts, squares for objectives.
- Text on the insert uses a slightly different font weight or a monospace font - it's DIGITAL text rendered by the implant, distinct from the player's natural perception.
**Behavioral rules:**
- The insert is always "on" in v0.1 (the character always has their implant active). Toggle is a v0.2+ feature.
- Insert information updates based on character knowledge (D-013: POIs only appear when learned).
- The overlay should feel like looking at a heads-up display, not a game map. Subtle scan lines or a very light grid pattern would reinforce this. Even at v0.1, a 1-pixel grid at 5% opacity costs nothing and communicates "technology."
**What the insert does NOT do:**
- Show NPC positions beyond what the character can sense (no omniscient radar)
- Show information the character hasn't learned
- Provide objective markers for things the character doesn't know about
The insert is BOUNDED by the same information rules as everything else (D-010 principle 2). It's a tool the character uses, not a game abstraction.
### Q3 (Gestalt asked this, but visual input): Onboarding through monologue
The monologue IS the tutorial. But the insert could display a brief "new overlay detected" or "insert calibrating" sequence on first load to teach the player that the blue-tinted area is their implant. One line of insert text: "Neural insert active. Navigation overlay online." Then the monologue takes over: *"Let's see what's on the schedule today."* Diegetic from the first second.
---
## Layer 9: Audio Direction
### Visual design implications of sound
Since v0.1 may have limited or no audio, sound information needs VISUAL representation:
**Sound indicators at fog edge (D-018 medium range):**
- Small animated ripple or pulse icon at the fog boundary, in the direction of the sound.
- Color-coded by sound type:
- `#c8d0e0` (neutral) - footsteps, movement, ambient activity
- `#e8c547` (amber) - conversation, voices (something to investigate)
- `#d45d5d` (red) - aggressive sounds, alarm, conflict
- Size/intensity pulses with sound volume.
- The monologue fires simultaneously to interpret: *"Voices. Coming from the back office."*
**Close-range sound (within LOS):**
- No special visual indicator needed. You can SEE the source.
- Dialogue or conversation text renders normally.
**Long-range insert alerts:**
- Display on the insert overlay as a notification blip.
- Text: "[Contact name] sent a location pin" or "Disturbance reported in [area]."
- These are spoofable (D-018) - the visual design should NOT distinguish real from fake alerts. The player has to figure that out.
Even if we have zero audio files in v0.1, the sound model works through these visual indicators plus monologue text. Sound-as-information doesn't require sound-as-audio. The three-range model can be proven with visual indicators and text alone.
**Audio direction for later:**
I'd defer actual audio content entirely from v0.1. The visual indicator system proves the sound model mechanically. Adding audio is additive polish, not structural. When we do add audio:
- Ambient: low drone, station hum, ventilation. The Settled Reach is a machine. It breathes.
- Close range: footsteps on metal, door mechanisms, muffled conversation bleed.
- No music in gameplay. Music in menus/loading only. The station's ambient sound IS the soundtrack.
---
## Summary: Visual Design Deliverables for v0.1
### Documents to produce
| Document | Priority | Description |
|----------|----------|-------------|
| **v0.1 Visual Grammar** (1 page) | Critical | Color palette, entity sizing, label rules, UI layer separation, fog rendering spec. Everything above in Layer 1, codified. |
| **Spatial Layout: Logistics Hub** | High | Floor plan, sightlines, NPC positions, approach vectors |
| **Spatial Layout: Bar** | High | Floor plan, sightlines, NPC positions, approach vectors |
| **Spatial Layout: Smuggling spaces** | High | Floor plan, sightlines, NPC positions, approach vectors |
| **Insert/HUD Wireframe** | High | Minimap position, text areas, notification zones, monologue display area |
| **Monologue Presentation Spec** | High | Typography, animation, stacking, priority rules |
| **Sound Indicator Visual Spec** | Medium | Fog-edge indicators, color coding, pulse behavior |
### Proposed new tickets
| Title | Priority | Rationale |
|-------|----------|-----------|
| v0.1 Visual Grammar document | Critical | Everything visual depends on this. Must exist before any renderer work begins. |
| Spatial layout design - 3 social site templates | High | Sightlines and room layout are the physical foundation of the observation mechanic. Parallel with content packs. |
| Insert/HUD wireframe and spec | High | The insert is the player's primary UI. Needs to be designed before implemented. |
| Monologue display system spec | High | Monologue is the primary content delivery mechanism. Its rendering rules affect every other visual element. |
| Sound indicator visual design | Medium | Required for the three-range model to function without audio files. |
| Entity color system implementation | High | The relationship-to-player color mapping is the primary visual expression of asymmetric information. |
### Dependencies
```
Visual Grammar ──> Spatial Layouts ──> Content Packs (layout affects what content makes sense)
Visual Grammar ──> Insert/HUD Wireframe ──> Insert implementation
Visual Grammar ──> Entity Color System ──> Fog rendering, NPC rendering
Visual Grammar ──> Monologue Display Spec ──> Monologue system UI
```
The Visual Grammar document is the root dependency for all visual work. I can produce it quickly once this workshop concludes and we have consensus on the color-as-relationship-state approach.
### One strong opinion
**The entity color system (color = relationship to player, not object type) is the single most important visual decision for v0.1.** It's how asymmetric information becomes visible. It's how two characters in the same room see different things. It's the visual proof of concept. If we get nothing else right visually, get this right. A teal rectangle labeled "Worker" for the detective and a green rectangle labeled "Jax" for the smuggler - that IS the game, rendered at minimum fidelity.
Everything else is refinement. This is the foundation.
---
*Written by Araminta. Keep it clean, we can layer detail later.*
@@ -1,591 +0,0 @@
# Round 1: Gestalt (Systems Design & Fun Factor)
**Workshop:** v0.1 Content Gap Analysis
**Date:** 2026-02-11
**Scope:** All 9 layers — systems design questions
---
## Layer 1: Art Direction & Visual Identity
No direct questions for Gestalt here, but one mechanical observation:
**Art direction is downstream of information design.** The visual system's primary job in The Settled Reach is communicating *what the player can and cannot perceive*. Fog edges, vision cone boundaries, sound indicators at fog-edge, NPC state tells — these are all visual elements that serve information mechanics first, aesthetics second.
Whatever Araminta proposes, the art direction must prioritize **perceptual legibility**: can the player instantly distinguish "I can see this" from "I cannot see this" from "I heard something here"? If that's clear, the aesthetics can be anything from pixel art to abstract minimalism. If it's unclear, no amount of beauty fixes the game.
**Recommendation for Q-003:** "Functional minimalism with perceptual clarity" is the v0.1 art direction. Atmosphere is carried by monologue (D-016). Visual mood is a polish layer, not a proof-of-concept requirement.
---
## Layer 2: Access Tiers and Character Builds
**Question:** How do access tiers (D-028 Layer 1) interact with the two character builds mechanically?
Let me break down what this actually means mechanically.
Access tiers are the first filter on every line of dialogue. They answer: "Given who the player character IS, what version of this NPC do they see?" This isn't a binary insider/outsider — it's a multi-axis classification that determines which lines from the pool are eligible for selection.
### Access Tier Model for v0.1
| Access Tier | Description | Smuggler sees | Detective sees |
|-------------|-------------|---------------|----------------|
| `public` | Available to everyone. Greetings, small talk, general observations. | Yes | Yes |
| `insider` | Available to people embedded in the social group. Shop talk, complaints, gossip about colleagues. | Logistics hub: Yes. Bar: Regular status. Ring: Yes. | Logistics hub: Outsider. Bar: Regular. Ring: No. |
| `authority` | Available to people with institutional power. Deference, compliance, formal responses. | No (except through cover) | Yes |
| `peer` | Available to people of equal social standing within a group. Casual, unguarded. | With ring members, coworkers | With other investigators, institutional contacts |
| `hostile` | Guarded, deflecting, minimal. Shown to people perceived as a threat. | From detective-allied NPCs (if blown) | From ring-connected NPCs |
### How This Maps to the Two Characters
**Smuggler access profile:**
| Social Site | Default Access | Why |
|-------------|---------------|-----|
| Logistics Hub | `insider` + `peer` | Works there. Coworkers. |
| Bar | `public` or `insider` (regular) | Social regular, not staff |
| Smuggling Ring | `insider` + `peer` | Member |
**Detective access profile:**
| Social Site | Default Access | Why |
|-------------|---------------|-----|
| Logistics Hub | `authority` | Investigating. Workers defer/comply. |
| Bar | `public` | No special status |
| Smuggling Ring | `hostile` (if known) or `public` (if not) | Target of investigation |
### The Interesting Decision Space
Here's where this creates gameplay. Access tiers are the player's **starting hand**, not their final state. The systems must allow tier SHIFTS during play:
| Shift | Mechanism | Example |
|-------|-----------|---------|
| `public` -> `insider` | Repeated positive interactions, time spent | Detective becomes a bar regular after visiting 3-4 times |
| `insider` -> `hostile` | Cover blown, secret discovered | Smuggler is seen talking to the detective |
| `authority` -> `peer` | Trust built through fairness, personal disclosure | Detective earns a worker's trust by keeping a minor infraction quiet |
| `peer` -> `hostile` | Betrayal, information leak | Smuggler discovers a ring member is informing |
**These tier shifts ARE the social gameplay.** The player isn't just receiving different dialogue — they're actively managing their social position by choosing who to talk to, what to reveal, and who to be seen with. Every conversation is a potential tier shift event.
**What Paula needs for the Dual Lens Guide:** A matrix per social site showing starting access for each character, plus the 2-3 most likely tier shift paths. Not every combination — just the ones the content packs need to support.
---
## Layer 3: Station District Setting
No direct questions for Gestalt here, but a mechanical note for Miri:
The station district setting needs to produce **spatial information asymmetry**. Concretely:
- At least one area that's publicly accessible but has a hidden back room / private area
- At least one area where the smuggler has natural access but the detective would need a reason to enter
- At least one chokepoint where NPCs from different social sites cross paths (this is where cross-template contamination becomes observable)
These are spatial requirements that emerge from the information design, not just atmosphere choices.
---
## Layer 4: Content Pipeline & Authoring Format
*Cracks knuckles.* This is the big one. Let me propose the concrete line pool format.
### Line Pool Authoring Format: YAML
YAML is the right choice for human-authored content. It's readable, supports comments (authors can annotate their intent), handles multiline strings naturally, and has mature tooling. JSON is too noisy for 500+ authored lines. CSV loses structure. TOML gets awkward for nested data.
### Concrete Line Pool File Structure
Each template gets one YAML file per content category. The file structure:
```
content/
templates/
logistics-hub/
dialogue.yaml # NPC role dialogue lines
monologue.yaml # Player character reactions to this location
environmental.yaml # Signs, terminals, ambient text
trait-guide.yaml # How personality traits modify base lines
bar/
dialogue.yaml
monologue.yaml
environmental.yaml
trait-guide.yaml
smuggling-ring/
dialogue.yaml
monologue.yaml
environmental.yaml
trait-guide.yaml
characters/
smuggler/
voice-kit.yaml # Character-specific monologue voice
opening-hook.yaml # First 5 minutes content
detective/
voice-kit.yaml
opening-hook.yaml
shared/
greetings.yaml # Cross-template greeting pools
farewells.yaml # Cross-template farewell pools
generic-ambient.yaml # Non-location-specific monologue
```
### Line Entry Schema
Here's what a single line looks like in `dialogue.yaml`:
```yaml
# logistics-hub/dialogue.yaml
# Template: Logistics Hub (Workplace)
# Author: Mellanie
# Last updated: YYYY-MM-DD
meta:
template: logistics_hub
version: 1
line_count: 70 # target: 55-70 authored lines for this template
lines:
- id: lh_d_001
text: "Another shipment from Taliesin. Third one this week. Must be nice to have that kind of credit flow."
role: dock_worker # which NPC role speaks this
access: [insider, peer] # who hears this (D-028 Layer 1)
trust: surface # disclosure tier: surface | real | secret
topic: [work, cargo, money] # what the line is about
mood: [neutral, tired] # NPC mood states that select this line
situation: [routine, morning] # when this line is eligible
tags: [gossip, observation] # freeform classification
dual_lens: # how this line hits differently per character
smuggler: "Routine shop talk. But Taliesin shipments are your cover run."
detective: "Cargo volume anomaly. Worth checking manifests."
notes: "Sets up Taliesin as a location name. Smuggler knows this is cover cargo."
- id: lh_d_002
text: "You're new around here? Or just... visiting?"
role: dock_worker
access: [public]
trust: surface
topic: [social, identity]
mood: [cautious, neutral]
situation: [first_meeting]
tags: [greeting, probe]
dual_lens:
smuggler: "Never triggered — smuggler is known here."
detective: "First contact. Worker is sizing you up."
- id: lh_d_003
text: "Look, I mind my own business. You should try it."
role: dock_worker
access: [authority, hostile]
trust: surface
topic: [deflection]
mood: [annoyed, defensive]
situation: [interrogation, repeated_visit]
tags: [resistance, wall]
dual_lens:
smuggler: "Only if your cover is blown and they see you as authority now."
detective: "Standard resistance. Either genuinely uninvolved or protecting someone."
```
### Minimum Viable Tag Set for v0.1
Here's the taxonomy — the minimum set of tags that makes the four dialogue layers functional:
#### Structural Tags (required on every line)
| Tag | Type | Values | Purpose |
|-----|------|--------|---------|
| `id` | string | `{template}_{type}_{###}` | Unique identifier |
| `text` | string | The authored line | What the NPC says |
| `role` | enum | Template-defined roles (e.g., `dock_worker`, `bartender`, `ring_courier`) | Which NPC role speaks this |
| `access` | list\<enum\> | `public`, `insider`, `authority`, `peer`, `hostile` | D-028 Layer 1: who hears this |
| `trust` | enum | `surface`, `real`, `secret` | D-028 Layer 3: disclosure tier |
| `situation` | list\<enum\> | See situation taxonomy below | When this line is eligible |
#### Content Tags (recommended, can be empty)
| Tag | Type | Values | Purpose |
|-----|------|--------|---------|
| `topic` | list\<enum\> | `work`, `social`, `cargo`, `money`, `relationships`, `rumors`, `identity`, `deflection`, `weather`, `complaint` | What the line is about — enables topic-based conversation steering |
| `mood` | list\<enum\> | `neutral`, `happy`, `tired`, `annoyed`, `nervous`, `defensive`, `friendly`, `cautious` | NPC mood states that select this line |
| `tags` | list\<string\> | Freeform | Author classification for search and grouping |
#### Authoring-Only Tags (not consumed by engine, used by previewer and authors)
| Tag | Type | Values | Purpose |
|-----|------|--------|---------|
| `dual_lens` | map | Per-character notes | How this line reads differently per character |
| `notes` | string | Author comments | Design intent, context, dependencies |
#### Situation Taxonomy for v0.1
Situations are the context triggers that make lines eligible. Minimum set:
| Situation | Description |
|-----------|-------------|
| `greeting` | First interaction this game-day |
| `first_meeting` | Characters have never met |
| `routine` | Normal daily activity |
| `morning` / `afternoon` / `evening` / `night` | Day phase (D-031) |
| `repeated_visit` | Player has visited this NPC 3+ times |
| `interrogation` | Player is asking pointed questions |
| `witnessed_secret` | Player has seen something they shouldn't |
| `idle` | NPC is between activities |
| `working` | NPC is performing their job |
| `social` | NPC is socializing (bar, break, etc.) |
| `confrontation` | Triangle tension has boiled over |
| `post_event` | Responding to a recent simulation event |
### How the Four Dialogue Layers Map to Tags
**Question:** How do the 4 dialogue layers map to line tags? One tag per layer, or more complex?
Let me map it out:
| Dialogue Layer | Tag(s) Used | Selection Logic |
|----------------|-------------|-----------------|
| **Layer 1: Access tier** | `access` | Hard filter. If the player character's current access tier for this NPC's social site is not in the line's `access` list, the line is **invisible**. No fallthrough. |
| **Layer 2: Relationship history** | `situation` + engine state | The engine tracks interaction count, last interaction time, and notable events. This modifies which `situation` values are active. E.g., `first_meeting` is only true once; `repeated_visit` activates after threshold. **Not a single tag — it's engine state mapped to situation eligibility.** |
| **Layer 3: Trust-gated gossip** | `trust` | Progressive filter. NPCs start at `surface`. As relationship improves, `real` lines become available. `secret` lines only after significant trust threshold. **One tag, three values, engine controls the threshold.** |
| **Layer 4: Unprompted disclosure** | `topic` + `mood` + engine state | The NPC has things they WANT to say (driven by mood, recent events, triangle pressure). The engine picks from eligible lines weighted by NPC mood and topic relevance. **No single tag — it's a weighted selection across mood + topic from the eligible pool.** |
#### Selection Pipeline (simplified)
```
All lines for this NPC's role
|
├── Filter by access tier (Layer 1) → removes ~40-60% of lines
|
├── Filter by situation (Layer 2) → narrows to context-appropriate lines
|
├── Filter by trust level (Layer 3) → caps disclosure depth
|
└── Weight by mood + topic relevance (Layer 4) → ranks remaining lines
|
└── Select top-weighted line (with variety tracking to avoid repeats)
```
**Key insight:** Layers 1 and 3 are HARD FILTERS (binary: eligible or not). Layers 2 and 4 are SOFT SELECTORS (weighting and context). This means:
- Authors must ensure every access/trust combination has enough lines to avoid dead conversations
- Authors can be more flexible with mood/topic — the engine can fall back to `neutral` mood lines
### Monologue Line Format
Monologue uses a similar but distinct schema. Key difference: monologue is triggered by observation EVENTS, not conversation initiation.
```yaml
# logistics-hub/monologue.yaml
lines:
- id: lh_m_001
text: "Busy morning. The usual controlled chaos."
character: smuggler
trigger: enter_location # what observation event fires this
location: logistics_hub
situation: [morning, routine]
mood: [neutral, relaxed] # character mood, not NPC mood
prerequisite: null # knowledge state required (null = always eligible)
tags: [atmosphere, establishing]
- id: lh_m_002
text: "Same faces, same cargo, same lies. Comfortable."
character: smuggler
trigger: enter_location
location: logistics_hub
situation: [morning, routine]
mood: [neutral, content]
prerequisite: { knows: smuggling_operation }
tags: [atmosphere, character_voice, irony]
- id: lh_m_003
text: "Standard logistics operation. On paper. The throughput numbers don't add up, though."
character: detective
trigger: enter_location
location: logistics_hub
situation: [morning, routine]
mood: [neutral, analytical]
prerequisite: { knows: cargo_anomaly }
tags: [investigation, observation, clue]
```
#### Monologue Trigger Taxonomy for v0.1
| Trigger | Description | Example |
|---------|-------------|---------|
| `enter_location` | Player enters a new area | "The bar's quieter than usual." |
| `observe_npc` | Player sees an NPC doing something | "They're checking the manifest again." |
| `hear_sound` | Sound event from fog edge | "Footsteps. Two people, moving fast." |
| `observe_anomaly` | NPC deviates from routine | "That's not where they usually go at this hour." |
| `post_conversation` | After dialogue ends | "They were lying. The pause before 'I don't know' — classic tell." |
| `discover_evidence` | Player examines an object with information | "This doesn't match the official log." |
| `witness_interaction` | Player sees two NPCs interacting | "Those two don't normally talk." |
| `time_idle` | Player hasn't done anything for a while | "Should probably get moving." |
| `return_visit` | Player returns to a previously visited area | "Different shift. Different faces." |
---
## Layer 5: Template Content & Entanglement
**Question:** How does the entanglement ratio (30/50/20) play out across ~15 NPCs?
Let me do the math and map it concretely.
### NPC Distribution (D-029 applied to v0.1)
With ~15 NPCs across 3 social sites:
| Entanglement Level | Count | Description | Template Distribution |
|-------------------|-------|-------------|----------------------|
| **Flat** (~30%) | 4-5 NPCs | Routine + greeting only. Social wallpaper. | 1-2 per template |
| **Mundane Triangle** (~50%) | 7-8 NPCs | Involved in non-conspiracy social drama. Neighbor disputes, workplace rivalries, relationship tensions. | 2-3 per template |
| **Entangled** (~20%) | 3 NPCs | Connected to smuggling operation. Their secrets are the investigation targets. | Primarily in ring template, with 1 bridge NPC in another |
### Concrete NPC Skeleton (proposal)
Here's how I'd distribute them:
**Logistics Hub (5 NPCs):**
| Role | Name (placeholder) | Entanglement | Triangle Role |
|------|--------------------|-------------|---------------|
| Shift Supervisor | [TBD] | Mundane | Triangle A: workplace authority tension |
| Dock Worker 1 | [TBD] | Flat | Wallpaper — reliable, boring, friendly |
| Dock Worker 2 | [TBD] | Mundane | Triangle A: chafes under supervisor |
| Cargo Handler | [TBD] | **Entangled** | Ring member. Uses job to move product. Bridge NPC to ring template. |
| Admin Clerk | [TBD] | Mundane | Triangle B: knows more than they should about cargo discrepancies |
**Bar (5 NPCs):**
| Role | Name (placeholder) | Entanglement | Triangle Role |
|------|--------------------|-------------|---------------|
| Bartender | [TBD] | Mundane | Triangle C: social hub, hears everything, discreet |
| Regular 1 | [TBD] | Flat | Wallpaper — always there, colorful but uninvolved |
| Regular 2 | [TBD] | Mundane | Triangle C: has a thing for the bartender, jealous of attention |
| Off-duty Worker | [TBD] | Mundane | Triangle B (cross-template): same person from logistics hub, different behavior here. Bridge NPC. |
| Stranger | [TBD] | Flat | Wallpaper — different face each playthrough. Procedural filler. |
**Smuggling Ring (5 NPCs):**
| Role | Name (placeholder) | Entanglement | Triangle Role |
|------|--------------------|-------------|---------------|
| Ring Leader | [TBD] | **Entangled** | Runs the operation. Triangle D: power/loyalty tension |
| Ring Courier | [TBD] | **Entangled** | Moves product between ring and hub. Triangle D: pressured by leader, considering turning |
| Ring Lookout | [TBD] | Mundane | Triangle D: doesn't know the full scope of operation, thinks it's minor smuggling |
| Ring Contact (bar) | [TBD] | Mundane | Triangle C (cross-template): the ring's eyes and ears at the bar |
| Ring Fixer | [TBD] | Flat | Wallpaper for the ring — handles logistics, no drama |
### Triangle Map
| Triangle | NPCs | Tension | Type |
|----------|------|---------|------|
| **A** (Logistics Hub) | Supervisor, Dock Worker 2, Cargo Handler | Authority vs autonomy. Worker resents supervisor. Handler stays quiet to protect cover. | Mundane + one entangled leg |
| **B** (Cross-template) | Admin Clerk (Hub), Off-duty Worker (Bar), Cargo Handler (Ring) | The clerk noticed discrepancies. The off-duty worker drinks too much and talks. The handler needs to keep both quiet. | Cross-template, entangled |
| **C** (Bar) | Bartender, Regular 2, Ring Contact | Social drama. Regular is jealous. Ring Contact uses bar as intel gathering. Bartender sees all, says nothing. | Mundane + one entangled leg |
| **D** (Ring) | Ring Leader, Ring Courier, Ring Lookout | Power and loyalty. Leader pushes for more volume. Courier is cracking under pressure. Lookout thinks it's small-time. | Entangled |
**Note for Paula:** Triangle B is the critical cross-template triangle. It's the mechanism by which the smuggling operation contaminates the mundane social world. The clerk's curiosity + the worker's loose lips + the handler's need for silence is a pressure cooker that the player can observe, manipulate, or accidentally trigger.
### Does This Create Interesting Decisions?
For the **smuggler**: You KNOW the handler, the courier, the leader. Your daily life is managing these relationships. Triangle B is your biggest risk — the clerk is asking questions, the worker talks too much at the bar. Do you befriend the clerk to deflect? Warn the worker to shut up? Or trust the handler to manage it? Every choice has relationship consequences.
For the **detective**: You don't know any of this at first. You see a normal workplace, a normal bar. But the clerk seems nervous. The worker mentions "weird cargo hours" after their third drink. The handler is suspiciously friendly with the detective — trying to assess the threat. The detective's game is connecting these dots through observation and conversation.
**This is the fun.** Same 15 people, completely different games.
---
## Layer 6: Minimum Viable Tell System
**Question:** What's the minimum viable tell system? One behavioral marker per axis, or fewer?
Let me break down what "tells" actually need to DO mechanically before deciding volume.
### What Tells Are For
A "tell" is an observable behavior that reveals internal NPC state without the NPC explicitly saying anything. Tells are the bridge between the simulation (NPC has mood=nervous, secret=smuggling) and the perception system (player sees NPC fidgeting, looking over their shoulder).
Tells serve two functions:
1. **Reward observation** — the player who watches carefully learns more than the player who just talks
2. **Create investigation breadcrumbs** — "they seem nervous" prompts the player to dig deeper
### Minimum Viable Tell System for v0.1
**Not one per axis. That's 10 tells per NPC x 15 NPCs = 150 behavioral markers. Way too many for v0.1.**
Instead: tells should map to the PLAYER-FACING question, not the simulation axis. The player doesn't think in axes — they think in "what's wrong with this person?"
| Tell Category | Maps to Axes | Observable Behavior | Implementation |
|---------------|-------------|---------------------|----------------|
| **Nervous/hiding something** | Secret, Tolerance threshold | Fidgeting sprite variation, checking over shoulder, breaking eye contact (monologue describes) | 2-3 text descriptions in monologue pool |
| **Angry/frustrated** | Contentment (low), Tolerance (near threshold) | Terse dialogue, aggressive movement pattern (faster walk), monologue notes "they look tense" | Mood affects dialogue selection + 1 movement modifier |
| **Friendly/warm** | Relationships (positive), Personality (sociable) | Longer conversations, approaches player proactively, monologue notes openness | Unprompted disclosure weighting increase |
| **Guarded/cold** | Relationships (negative), Access (hostile) | Short responses, avoids player, monologue notes resistance | Access tier filtering does this naturally |
| **Routine deviation** | Secret (active), Want (pursuing something) | NPC goes somewhere they normally don't, at an unusual time | Routine system deviation flag + monologue trigger |
**That's 5 tell categories for v0.1.** Each is expressed through a combination of:
- Monologue lines (character interprets the tell) — cheapest, most expressive
- Dialogue weighting (mood shifts what lines are selected) — already in the pipeline
- Movement behavior (1 modifier: speed/path deviation) — lightweight
**Most tells in v0.1 will be TEXT, not visual.** The monologue system IS the tell renderer. "They're checking the corridor before entering the back room" is a tell delivered through monologue, not through a complex animation system. This is consistent with D-016 (monologue as perception bridge) and D-014 (functional boxes with labels).
### What Mellanie Needs
For each of the 5 tell categories, 3-5 monologue lines per character. That's 30-50 monologue lines dedicated to tells, split between smuggler and detective voice.
**Smuggler tell monologue** reads differently from detective tell monologue:
- Smuggler noticing nervousness: "They're spooked. Wonder who's been asking questions."
- Detective noticing nervousness: "Nervous. Either guilty or scared of someone who is."
Same observation, different interpretation. This is where the dual-lens system shines brightest.
---
## Layer 7: Monologue & Observation Text
No direct questions for Gestalt here, but a systems note:
**Monologue content volume is the highest content risk in the entire project** (I flagged this in the previous gap analysis workshop). The monologue system carries perception, atmosphere, tutorial, tells, investigation clues, and character voice — simultaneously. If it feels thin or repetitive, the entire game suffers.
The trigger taxonomy I defined in Layer 4 above (9 trigger types) maps directly to content authoring work. Mellanie needs to write lines for each trigger type x each location x each character. That's approximately:
| Trigger | Lines per location | x3 locations | x2 characters | Total |
|---------|-------------------|-------------|----------------|-------|
| `enter_location` | 3-5 | 9-15 | 18-30 | 18-30 |
| `observe_npc` | 5-8 | 15-24 | 30-48 | 30-48 |
| `hear_sound` | 3-4 | 9-12 | 18-24 | 18-24 |
| `observe_anomaly` | 3-5 | 9-15 | 18-30 | 18-30 |
| `post_conversation` | 5-8 | 15-24 | 30-48 | 30-48 |
| `discover_evidence` | 2-3 | 6-9 | 12-18 | 12-18 |
| `witness_interaction` | 3-5 | 9-15 | 18-30 | 18-30 |
| `time_idle` | 2-3 | — (shared) | 4-6 | 4-6 |
| `return_visit` | 2-3 | 6-9 | 12-18 | 12-18 |
**Estimated monologue line count: 160-250 authored lines.** Plus the 30-50 tell lines. Call it **200-300 monologue lines total** — consistent with the D-028 workshop estimate.
These are authored lines. The 4x generation expansion applies here too, giving ~800-1200 total monologue lines in the game. That should prevent repetition across a 30-minute session.
---
## Layer 8: UI Text & Onboarding
**Question:** Does v0.1 need onboarding text, or can the monologue system serve as the tutorial (D-016 "diegetic tutorial")?
**Answer: Monologue IS the tutorial. No separate onboarding text needed for v0.1.**
Here's how it works mechanically:
### Diegetic Tutorial Through Monologue
The player's first 2-3 minutes produce a sequence of monologue lines that teach by narrating:
| Player Action | Monologue Tutorial | What It Teaches |
|---------------|-------------------|-----------------|
| Game starts | "Another day at [station]. Better check the schedule." (Smuggler) / "Precinct forwarded the case file. Time to start." (Detective) | You have a purpose. You're a person. |
| Player moves | "Quiet corridor. Nobody around." | Vision cone — you can see what's in front of you. |
| Player approaches fog edge | "Something around the corner. Can't see from here." | Fog = limited perception. Move to see more. |
| Player hears sound through wall | "Voices. Can't make out what they're saying from here." | Sound carries through walls. Get closer. |
| Player sees first NPC | "That's [Name]. [Brief relationship context]." (Smuggler) / "Unknown civilian. Standard profile." (Detective) | You know (or don't know) people. Character relationships matter. |
| Player talks to NPC | (Dialogue system handles this) | Conversation exists. Different people tell you different things. |
| Player checks insert | "Let's see... [location info]." | The minimap/insert exists and is diegetic. |
**No "Press WASD to move" text.** No tooltip overlays. The character's thoughts teach the player by reacting to what the player does naturally.
**What this requires from Mellanie:** A special `opening-hook.yaml` per character with 10-15 tightly sequenced monologue lines that fire in response to the player's first actions. These are the most important lines in the entire game — they set voice, teach mechanics, and establish motivation simultaneously.
### UI Text That IS Needed
Even with diegetic tutorial, some UI text is unavoidable:
| UI Element | Text Needed | Volume |
|------------|-------------|--------|
| Main menu | New Game, Continue, Settings, Quit | 4-6 strings |
| Character select | Smuggler description, Detective description | 2 paragraphs |
| Pause menu | Resume, Save, Load, Settings, Quit | 5-6 strings |
| Insert/minimap labels | POI names, distance indicators | ~10-15 strings |
| Dialogue UI | "Talk", "Leave", topic selection labels | ~5-10 strings |
| Time display | Day phase indicator, clock format | 4-5 strings |
**Total UI text: ~40-50 strings.** Trivial volume. Can be authored in an afternoon.
---
## Layer 9: Audio Direction
**Question:** Does the three-range sound model need audio content to prove itself, or can it work with system beeps and text?
**Answer: Text-only sound is mechanically sufficient for v0.1. Audio content is a wow multiplier, not a proof requirement.**
Here's why:
### How Sound Works Without Audio Files
The three-range model (D-018) is fundamentally an INFORMATION system, not an audio system. What matters is:
| Range | What the player needs to know | Text-only delivery |
|-------|------------------------------|-------------------|
| Close | "I can hear this clearly" | Monologue: "Footsteps behind me. Two people." |
| Medium | "Something's happening nearby but I can't see it" | Visual indicator at fog edge + monologue: "Voices from the next room." |
| Long | "Information arrived through my insert" | Insert notification text: "Alert: disturbance reported in Sector 7" |
All three ranges work through text + visual indicators. The SYSTEM is provable without a single audio file.
### What Audio WOULD Add
Audio adds emotional texture that text can't match:
- Close range: actual footstep sounds create spatial awareness and tension
- Medium range: muffled voices through walls create curiosity and dread
- Fog edge: ambient hum vs silence communicates "something's there" vs "empty"
**Recommendation:** Defer ALL authored/designed audio to a later sprint. For v0.1, use at most:
- 1 ambient drone per location type (3 total — can be freely licensed or generated)
- 1 footstep sound for close-range feedback
- 1 "notification chime" for insert alerts
That's 5 sound files. The rest is text + visual indicators. If even this is too much, zero audio is acceptable. The monologue system can carry the entire perceptual load.
**But the system architecture must still support audio.** The sound event system (#124) should emit events regardless of whether audio content exists. The client receives "sound event at coordinates X,Y with type FOOTSTEPS" — whether it plays a wav file or shows a visual indicator is a client rendering decision. Don't build the system around text; build it around events and render text as the v0.1 fallback.
---
## Cross-Layer Synthesis: What Gestalt Thinks the Content Team Needs
### Priority-Ordered Content Work
| Priority | Deliverable | Owner | Depends On | Lines/Volume |
|----------|-------------|-------|------------|-------------|
| 1 | Line pool format specification (this document) | Gestalt (done) | Nothing | Spec only |
| 2 | Dual Lens Authoring Guide | Paula | Layer 2 access tier model (above) | ~10 pages |
| 3 | Station district setting brief | Miri | Nothing | ~2-3 pages |
| 4 | Character voice kits (smuggler + detective) | Mellanie | Dual Lens Guide | 20-30 sample lines per character |
| 5 | Opening hook content (per character) | Mellanie | Voice kits | 10-15 lines per character |
| 6 | NPC profiles (15 NPCs) | Paula + Mellanie | Setting brief, character builds | 1 page per NPC |
| 7 | Logistics Hub content pack (#190) | Mellanie | NPC profiles, line pool format | ~55-70 dialogue + ~30-40 monologue lines |
| 8 | Bar content pack (#191) | Mellanie | NPC profiles, line pool format | ~55-70 dialogue + ~30-40 monologue lines |
| 9 | Smuggling Ring content pack (#192) | Mellanie | NPC profiles, line pool format | ~55-70 dialogue + ~30-40 monologue lines |
| 10 | Tell monologue lines | Mellanie | NPC profiles, tell categories | 30-50 lines |
| 11 | Environmental text | Mellanie + Araminta | Setting brief | ~30-50 strings |
| 12 | UI text | Mellanie | Character descriptions | ~40-50 strings |
### The Critical Path
```
Dual Lens Guide (Paula)
+ Station Setting (Miri)
+ Line Pool Format (Gestalt - this document)
→ Character Voice Kits (Mellanie)
→ Opening Hooks (Mellanie)
→ NPC Profiles (Paula + Mellanie)
→ Content Packs x3 (Mellanie)
→ Tell Lines + Environmental (Mellanie)
```
**Nothing blocks the line pool format — it's spec work.** The Dual Lens Guide and Station Setting can proceed in parallel. Once those two exist, Mellanie can start writing. The content packs are the bulk of the work and should start as soon as the voice kits feel right.
### One Last Mechanical Note
**The line previewer (#193) is critical.** Mellanie cannot efficiently author 500+ tagged lines without a tool that shows "given this NPC, this access tier, this mood, this situation — what line would fire?" The previewer doesn't need to be pretty. It needs to load a YAML file, accept filter parameters, and show the selected line. A CLI tool. Tyre can build this as a Rust binary that reads the YAML and applies the selection pipeline.
Without the previewer, Mellanie is writing blind. Tag errors won't surface until integration. That's a recipe for rework.
---
*Gestalt out. The format is proposed, the tags are defined, the pipeline is mapped. Now we need Paula's lens guide, Miri's setting, and Mellanie's voice. The systems are ready for content.*
@@ -1,438 +0,0 @@
# Round 1 — Mellanie's Content Gap Analysis
**Agent:** Mellanie (Copywriter)
**Date:** 2026-02-11
**Scope:** All 9 layers, copywriting perspective
---
## Layer 1: Art Direction & Visual Identity
Not my lane directly, but I'll flag the intersection: **visual style determines how much weight text carries.** D-014 says "functional boxes with labels" and D-016 says "atmosphere carried by monologue." If the art stays minimal, my text is doing 80% of the atmosphere work. If the art gets moody, the text can be sparser.
**My ask for Araminta:** Tell me the visual fidelity target so I can calibrate density. Minimal art = more monologue lines per location. Moody art = fewer, sharper lines. I need to know which world I'm writing for.
---
## Layer 2: Narrative Framework & Character Design
### Q3: What do I need from the character builds before I can write voice-consistent dialogue?
Five things. Non-negotiable.
**1. Voice signature.** Not personality traits — *speech patterns.* Short sentences or long? Profanity or clean? Technical vocabulary or street? Internal monologue style: does the smuggler think in observations or feelings? Does the detective think in hypotheses or facts?
Here's what I mean concretely:
> **Smuggler sees a cargo container out of place:**
> *Option A (cautious, observational):* "That container's been moved. Wasn't there this morning."
> *Option B (anxious, relational):* "Kael moved the container again. He's going to get us all caught."
> *Option C (sardonic, detached):* "Someone rearranged the furniture. How creative."
Each of those is a different character. I need to know which one before I write 500 lines.
**2. What they notice.** The smuggler and detective look at the same room and see different things. Not just because of information boundaries — because of *attention.* The smuggler notices exits, security cameras, who's watching. The detective notices inconsistencies, nervousness, things out of place. This shapes every monologue line and every dialogue choice.
**3. Relationship to authority.** How do they talk to people with power over them? How do they talk to people they have power over? The smuggler with their ring boss vs. the detective with their precinct captain — those power dynamics shape every interaction.
**4. What they lie about.** Both characters have things they conceal or misrepresent. The smuggler hides their criminal activity. The detective might hide their investigation from suspects. Knowing what they lie about tells me what their "public voice" sounds like vs. their "internal voice."
**5. Emotional baseline.** Not mood — *posture.* Is the smuggler generally anxious, comfortable, or resigned? Is the detective generally confident, frustrated, or obsessive? This is the default register that all their lines return to between dramatic moments.
**Proposal:** I'll write a **Voice Kit** for each character — a 1-page document with these five elements plus 10 sample monologue lines covering common situations (entering a room, greeting an acquaintance, noticing something wrong, being lied to, being alone). Paula defines the narrative identity; I translate it into voice. The Voice Kit becomes the reference that keeps all dialogue on-character.
**Dependency:** Paula's character arc outlines (#180, #181) must come before my Voice Kits. I need to know who these people *are* before I can figure out how they *sound.*
---
## Layer 3: Station District Setting
Not my primary deliverable, but I write text that lives in this space. My ask for Miri:
**Give me the texture, not just the lore.** I don't need a history essay. I need:
- What does this place *smell* like? (Monologue uses all senses.)
- What's the slang? Do people say "shift" or "rotation"? "Credits" or "sols"?
- What's on the walls — corporate signage? Safety warnings? Union notices? Graffiti?
- What's the ambient sound the monologue might reference — machinery hum? Ventilation? Crowd noise?
- What's the local complaint? Every community has one. Bad water. Late transports. Overpriced food.
These details are what make monologue and environmental text feel *placed* instead of generic sci-fi.
---
## Layer 4: Content Pipeline & Authoring Format
### Q2: Can I write content packs in a provisional format before the previewer exists?
**Yes, with conditions.**
I can write in any structured text format — YAML, Markdown with frontmatter, even a spreadsheet — as long as we agree on the tag taxonomy first. The actual file format matters less than the metadata structure. I can adapt format later; I can't retag 500 lines.
**What I need locked before I write:**
1. **Tag taxonomy.** The minimum set of tags per line. My proposal for v0.1:
| Tag | Values | Purpose |
|-----|--------|---------|
| `character` | smuggler, detective, any | Who can trigger this line |
| `access` | insider, outsider, authority, peer | D-028 Layer 1 filter |
| `trust` | surface, real, secret | D-028 Layer 3 disclosure tier |
| `location` | workplace, bar, ring, corridor, any | Where this line fires |
| `situation` | greeting, idle, gossip, confrontation, observed_anomaly, absence, routine | What's happening |
| `mood` | neutral, tense, relaxed, suspicious, friendly | NPC emotional state |
| `topic` | work, personal, crime, rumor, weather, complaint | What the line is about |
| `type` | dialogue, monologue, environmental, ticker | Content category |
That's 8 tags. Enough to filter meaningfully, few enough to author quickly. Gestalt can add more if the system needs them, but I can start writing with these.
2. **Line format.** My proposed provisional format (Markdown-friendly, convertible to YAML/JSON later):
```
---
id: wp-dock-greeting-01
character: any
access: insider
trust: surface
location: workplace
situation: greeting
mood: neutral
topic: work
type: dialogue
speaker: dock_supervisor
---
Another day, another manifest. You know the drill.
```
If the actual format changes, I can batch-convert. The content and tags are what matter.
3. **One example template fully tagged.** Before I write 165 lines for the workplace, I want to write 20, tag them, and have Gestalt validate that the tags produce the right filtering behavior. Call it a "tag smoke test." This catches taxonomy problems before they compound.
**What I do NOT need before starting:**
- The previewer CLI (#193). Nice to have, not a blocker. I'll write blind and validate later.
- Final file format. Provisional is fine.
- Generation pass specs (#194). I write the authored core; expansion is a separate step.
---
## Layer 5: Template Content (3 Social Sites)
### Q1: What does a content pack deliverable look like? Break down #190.
Here's what the **Workplace Content Pack** (#190) contains, broken into concrete writing tasks:
#### A. Role Voice Kits (4-6 roles, ~5 lines each = 20-30 lines)
Each role in the workplace template gets a voice kit: a set of sample lines that establish how this *type* of person talks. Not a specific NPC — a role that gets filled by a generated NPC.
Proposed workplace roles:
- **Dock Supervisor** — authority figure, stressed, deadline-driven
- **Cargo Handler** — physical worker, pragmatic, gossip-prone
- **Logistics Clerk** — desk worker, detail-oriented, nervous or bored
- **Maintenance Tech** — gruff, observant, knows every corner of the facility
- **Security Guard** — bored or paranoid, depending on personality axis
- **Shift Manager** — middle management, caught between workers and bosses
Each kit: 5 lines covering greeting, idle chatter, reaction to anomaly, reaction to authority, and one line that hints at their secret/vulnerability axis.
#### B. Situation Scripts (tagged line pools — the bulk, ~80-100 lines)
These are the lines that fire during gameplay, filtered by tags. Organized by situation:
| Situation | Lines | Description |
|-----------|-------|-------------|
| Greetings | 15-20 | First contact lines, filtered by access tier and relationship |
| Idle/ambient | 15-20 | Background chatter, complaints, observations. The "daily life" texture |
| Work talk | 10-15 | Job-related conversation. Manifests, schedules, problems |
| Gossip | 10-15 | Trust-gated. Surface: weather, sports. Real: who's sleeping with whom. Secret: who's smuggling what |
| Confrontation | 5-10 | When triangle tensions surface. Accusations, denials, pleas |
| Observed anomaly | 5-10 | NPC reacts to something unusual. Feeds the observation chain |
| Authority interaction | 5-10 | How NPCs talk to/about the boss. Power dynamics |
#### C. Monologue Hooks (per character, ~30-40 lines)
Lines that fire as the player character's internal monologue in this location:
| Category | Smuggler | Detective |
|----------|----------|-----------|
| Entering workplace | 8-10 lines: routine, familiar, noting who's in/out | 8-10 lines: scanning, assessing, noting what seems off |
| Observing NPC behavior | 5-8 lines: protective, concerned about exposure | 5-8 lines: analytical, building hypotheses |
| Noticing anomaly | 3-5 lines: alarm, calculating risk | 3-5 lines: interest, cataloguing evidence |
| Absence/deviation | 3-5 lines: "Where's Kael?" worry-flavored | 3-5 lines: "Subject deviated from pattern" analytical |
#### D. Environmental Text (~15-20 items)
Diegetic text that exists in the space:
- Shift schedule board (readable, updates with game time)
- Safety notices ("Report unauthorized cargo to Security — Management")
- Cargo manifest fragments (readable if you examine them — information source)
- Employee notice board (upcoming events, complaints, lost items)
- Terminal login screen text
- Door labels, section markers, warning signs
#### E. Trait Transformation Guide (~1 page)
How personality axes modify the base lines. Not per-trait scripts — guidelines:
| Trait axis | Low | High | Effect on dialogue |
|------------|-----|------|--------------------|
| Tolerance | Snaps fast, short answers | Patient, elaborate | Shorter/longer responses, more/fewer warnings before confrontation |
| Contentment | Bitter, complaining | Satisfied, dismissive | Tone of idle chatter. Discontented NPCs gossip more |
| Want (ambition) | Passive, accepting | Driven, scheming | Proactive vs reactive dialogue. High-want NPCs steer conversations |
**Total for one template: ~165-200 authored lines + environmental text + trait guide.**
Three templates = ~500-600 authored lines of dialogue/monologue + ~50-60 environmental text items + 3 trait guides.
That's achievable. It's a focused sprint of writing, not a marathon. The quality bar is what takes time, not the volume.
---
## Layer 6: NPC Profiles & Dialogue
### Q1 (with Paula): How deep does each NPC profile need to be?
**Two tiers of depth, matching the 30/50/20 split.**
**Flat NPCs (30%, ~4-5 NPCs):** The 10 axes plus one distinguishing line. That's it. These people are wallpaper with a pulse. They greet you, they make small talk, they go about their routine. They exist so the station feels populated.
What I need per flat NPC:
- Name
- Role (which role voice kit to draw from)
- One distinguishing trait or habit (the dock worker who always eats during shift, the clerk who hums)
- 3-5 custom lines that make them *slightly* memorable (beyond the generic role pool)
**Triangle NPCs (50%, ~7-8 NPCs) and Entangled NPCs (20%, ~3 NPCs):** The 10 axes plus a **voice paragraph.** Not a full backstory — a paragraph that captures how this specific person *talks* and *thinks,* enough for me to write lines that feel specific to them.
What I need per triangle/entangled NPC:
- Name
- Role + which social sites they appear in
- 10-axis values (especially Want, Secret, Relationships, Contentment)
- One paragraph: "Kael talks like [X], thinks about [Y], is hiding [Z]. When stressed, he [behavior]. When comfortable, he [behavior]."
- Their triangle position: who they're in conflict with, what they want from the triangle
- 8-15 custom lines (beyond role pool) that express their specific voice and situation
**Who writes these profiles?** Paula defines the narrative identity and triangle dynamics. Miri provides cultural/setting flavor. I write the voice paragraph and sample lines. It's a collaboration, not a solo task.
### Q2: How many lines per NPC for v0.1?
Let me do the real math.
**Flat NPCs (~5):** 3-5 custom lines each = 15-25 lines. Plus they draw from the role voice pool, so they have maybe 20-30 lines available total (role pool + custom).
**Triangle NPCs (~8):** 8-15 custom lines each = 64-120 lines. Plus role pool. Total available per NPC: 30-45 lines.
**Entangled NPCs (~3):** 12-20 custom lines each = 36-60 lines. These need the most specific, plot-relevant dialogue. Total available per NPC: 40-55 lines.
**Custom NPC lines total: 115-205 lines.**
These sit ON TOP of the template content packs (~500-600 lines of role-based dialogue). The role pools provide the substrate; NPC-specific lines provide the personality.
**Grand total authored lines for v0.1:**
| Category | Lines |
|----------|-------|
| Template dialogue (3 packs) | 500-600 |
| NPC-specific lines (~15 NPCs) | 115-205 |
| Monologue — smuggler | 100-150 |
| Monologue — detective | 100-150 |
| Environmental text | 50-60 |
| UI/insert text | 20-30 |
| News ticker / unisphere | 15-20 |
| **Total authored** | **~900-1,215** |
After 4x generation expansion on the template dialogue: **~3,000-3,600 total lines available to the system.**
That's a solid content floor. It won't feel infinite, but it won't feel empty during a 30-minute session. The player will encounter maybe 150-200 lines per playthrough. Repetition becomes a problem only on the 3rd or 4th play of the same character.
---
## Layer 7: Monologue & Observation Text
### Q1: How many monologue lines make v0.1 feel alive?
The 200-300 estimate is the *floor.* Let me break it down by function:
| Function | Smuggler | Detective | Total |
|----------|----------|-----------|-------|
| **Location atmosphere** (entering/being in a place) | 25-30 | 25-30 | 50-60 |
| **NPC observation** (noticing behavior, tells) | 20-25 | 20-25 | 40-50 |
| **Absence/deviation** (expected NPC not present, routine broken) | 10-15 | 10-15 | 20-30 |
| **Sound interpretation** (hearing through fog) | 8-10 | 8-10 | 16-20 |
| **Investigation/deduction** (connecting dots) | 10-15 | 15-20 | 25-35 |
| **Emotional/reflective** (quiet moments, character depth) | 10-15 | 10-15 | 20-30 |
| **Diegetic tutorial** (hinting at available actions) | 8-10 | 8-10 | 16-20 |
| **Mirror moments** (hinting at the other perspective) | 5-8 | 5-8 | 10-16 |
| **Total** | **~96-128** | **~101-133** | **~197-261** |
Call it **250 monologue lines** as the authoring target. Some will overlap (same observation, different character voice), but most need to be distinct because the two characters *think differently* about what they see.
The generation pass doesn't work as well for monologue as for dialogue. Dialogue can be expanded with variations on the same sentiment. Monologue needs to feel *specific* — it's the character's private thoughts. Generic expansion will sound hollow. I'd estimate a 2x generation pass on monologue at best, giving us ~500 monologue lines total. That's enough for 2-3 playthroughs per character before noticeable repetition.
### Q2: Same observation event, different monologue — separate pools or shared?
**Separate pools. No question.**
The smuggler and detective don't just say different words about the same thing — they *see* different things. The whole game is built on this. Shared pools with character filters would tempt us toward "same observation, different adjective." That's death for the core mechanic.
Here's the concrete difference:
> **Event: NPC enters the back room during off-hours.**
>
> Smuggler pool:
> - "There goes Kael. Right on schedule."
> - "Back room again. He better not be skimming."
> - "Hope he remembered to lock the side door this time."
>
> Detective pool:
> - "Unauthorized access to restricted area. Noted."
> - "That's the second time today. What's in the back room?"
> - "He looked around before going in. People who belong somewhere don't check if they're watched."
Same event trigger. Completely different interpretation. The smuggler's lines reveal *familiarity* with the criminal activity. The detective's lines reveal *analytical distance.* You cannot get this from a shared pool with a character tag — the entire framing, vocabulary, and emotional register are different.
**Structure:** Two parallel monologue pools, one per character, keyed to the same observation event triggers. The observation event generator (#239) fires a trigger; the monologue system selects from the appropriate character pool. Tags on each line handle further filtering (location, mood, trust level, prior knowledge).
**This doubles the monologue writing work, but it IS the game.** If the monologue sounds the same from both characters, we've failed D-027's core success criterion. There is no shortcut here.
### Mirror Moments
Paula asked about these in the brief. Here's what they look like from a writing perspective:
A mirror moment is when the monologue *almost* acknowledges the other character's viewpoint without breaking the fourth wall. The character glimpses the moral complexity of their position.
> **Smuggler mirror moment** (watching the detective interview a colleague):
> "She's just doing her job. ...Aren't we all."
>
> **Detective mirror moment** (learning that a suspect supports their family through smuggling):
> "Twelve dependents on a cargo handler's salary. The math doesn't work. But the math never does for these people."
These are rare — 5-8 per character across the whole session. They're the moments where the writing does the thematic heavy lifting. They plant the seed of "what would this look like from the other side?" without ever saying it explicitly. On a second playthrough as the other character, the player remembers these lines and they hit differently.
---
## Layer 8: UI Text & Environmental Content
### Q1 (with Araminta): What text appears on screen besides dialogue and monologue?
Here's the full inventory:
#### Insert/HUD Text
- Time display (diegetic — the character's neural insert showing time)
- POI labels on minimap ("Logistics Hub," "The Rusty Valve," "Sector 7 Maintenance")
- Status indicators ("Signal weak," "Insert interference detected")
- Notification text ("New contact added," "Location discovered")
#### Environmental Text (diegetic — exists in the game world)
- Door labels and room signs
- Corporate signage (company names, slogans)
- Safety/regulatory notices
- Employee notice boards
- Cargo manifest fragments (readable as investigation tools)
- Terminal screens (login prompts, error messages, data readouts)
- News ticker / unisphere feed headlines
- Graffiti (if the station has a rougher district area)
- Menu/price board at the bar
- Wanted notices or institutional postings
#### UI Chrome (non-diegetic — game interface)
- Dialogue choice labels (if we have explicit choices, not just proximity-triggered lines)
- Journal/knowledge entries (if #264 makes it into v0.1)
- Tooltip text on interactive objects ("Examine," "Talk," "Read")
- Save/load screen text
- Settings menu labels
- Pause screen text
- Character selection screen text (if any)
#### Diegetic Tutorial Text (via monologue — D-016)
This isn't separate UI text — it's monologue lines that teach mechanics:
- "I could check my insert for the area layout." (teaches minimap)
- "Better keep my distance if I'm going to follow him." (teaches follow mechanic)
- "That terminal might have shipping records." (teaches examine)
- "Sounds like an argument in the next room. I could get closer to hear." (teaches eavesdrop)
**Volume estimate for non-dialogue/non-monologue text:**
| Category | Items | Lines |
|----------|-------|-------|
| Insert/HUD | 10-15 unique strings | 10-15 |
| Environmental — workplace | 15-20 items | 20-30 |
| Environmental — bar | 10-15 items | 15-25 |
| Environmental — ring | 5-10 items | 10-15 |
| Environmental — corridors/shared | 5-10 items | 8-12 |
| UI chrome | 15-20 unique strings | 15-20 |
| News ticker headlines | 10-15 items | 10-15 |
| **Total** | | **~88-132** |
This is quick writing — short strings, functional language, world-flavored. I can produce the full set in a focused session once I have Miri's setting document for terminology and Araminta's UI spec for constraints (character limits, display format).
---
## Layer 9: Audio Direction
From a copywriting perspective: **silence is fine for v0.1, but it shifts burden to me.**
If there's no ambient audio, every sense except sight goes through monologue. The character has to *narrate* the soundscape:
> "The ventilation system hums. Always that same frequency. I've stopped noticing it."
> "Footsteps behind me. Two people. Unhurried."
> "The bar's loud tonight. Good. Harder for anyone to overhear."
These sound-interpretation monologue lines are already in my budget (the "sound interpretation" category in Layer 7: 16-20 lines). If we add actual audio, some of those lines become redundant — the player *hears* the bar is loud instead of being told. But for v0.1, I'll write as if the monologue is doing all the sensory work. Audio can reduce the monologue load later.
**My recommendation:** Defer audio content. Let me carry the atmosphere through text. It's cheaper, faster, and we can always add audio on top. What we can't do is add text *quality* retroactively — so invest in the writing now, add sound later.
---
## Cross-Layer Summary: What I Need to Start Writing
Here's my dependency chain, in order:
| Step | What I need | Who provides it | Ticket |
|------|-------------|-----------------|--------|
| 1 | Station district setting brief | Miri | #189 |
| 2 | Character arc outlines (smuggler + detective) | Paula | #180, #181 |
| 3 | Dual Lens Authoring Guide | Paula | #261 |
| 4 | Tag taxonomy agreement | Gestalt (confirm or modify my proposal) | #168 |
| 5 | NPC profiles (10-axis + triangle positions) | Paula + Miri | #179, #184-186 |
**What I can start NOW, before any dependencies resolve:**
1. **Voice Kit drafts** for smuggler and detective — provisional, based on D-027 descriptions. I'll write three voice options per character and let Paula pick or blend. Gets us moving.
2. **Environmental text templates** — generic diegetic text (safety notices, terminal screens, door labels) that work in any station district. Setting-specific text waits for Miri.
3. **Tag taxonomy proposal** — the table in Layer 4 above. Gestalt validates, we iterate.
4. **Monologue starter set** — 20-30 monologue lines per character covering universal situations (entering a room, being alone, hearing something in fog). These don't depend on specific NPC profiles.
**What I cannot start without dependencies:**
- Template content packs (#190-192) — need NPC profiles and Dual Lens Guide
- NPC-specific dialogue — need NPC profiles
- Setting-specific environmental text — need Miri's district brief
---
## Proposed New Tickets
| Title | Priority | Type | Rationale |
|-------|----------|------|-----------|
| Smuggler voice kit | High | Story | Character voice reference for all smuggler dialogue/monologue. Blocks #190-192 content packs. |
| Detective voice kit | High | Story | Character voice reference for all detective dialogue/monologue. Blocks #190-192 content packs. |
| Monologue starter set (universal) | High | Story | 50-60 monologue lines (both characters) for common situations. Unblocked — can begin immediately. |
| Tag taxonomy specification | High | Story | Define the metadata structure for all authored lines. Must precede content packs. Gestalt validates. |
| Environmental text templates (generic) | Medium | Story | Diegetic text items (signs, terminals, notices) that work across location types. |
| News ticker / unisphere content | Medium | Story | 10-15 headline items for ambient world-building. Needs Miri's setting brief. |
| UI microcopy document | Medium | Story | All non-diegetic interface strings. Needs Araminta's UI spec. |
| NPC voice paragraphs (~15 NPCs) | High | Story | Per-NPC voice guides for triangle and entangled NPCs. Needs Paula's profiles. |
---
## One Honest Concern
The workshop brief says I'm "blocked, waiting on Miri's cultural generation guide." That's true for the *final* content packs. But I've been staring at these decision documents long enough to start building the scaffolding. Voice kits, tag taxonomy, monologue starters, environmental templates — these are all concrete deliverables that move us forward without waiting for the full dependency chain.
The risk isn't that I'll have nothing to do. The risk is that I'll write 200 lines in a voice that doesn't match the character Paula envisions, or a setting that doesn't match the world Miri builds. That's why the Voice Kit approach works — I write provisional options, we converge, then I scale. Write 20 lines right, throw away 10, then write 500 in the validated voice.
Three words for the content plan: **scaffold, validate, scale.**
---
*Mellanie out. Give me the voice, and I'll give you the words.*
@@ -1,443 +0,0 @@
# Round 1 — Miri's Worldbuilding Gap Analysis
**Agent:** Miri (Worldbuilder & Setting Designer)
**Date:** 2026-02-11
**Workshop:** v0.1 Content Gap Analysis
---
## Approach
I'm going through all nine layers of the workshop brief from a worldbuilding perspective. My primary deliverable is the station district setting document (Layer 3), but I have contributions across most layers. I'm checking every proposal against what we've established in Round 14 (setting foundation), Round 16 (factions), and the confirmed decisions.
Let me be direct about my role here: the content team needs setting context before they can write a single line. Mellanie can't write a bartender's greeting without knowing what the bar looks like and what the bartender's world is like. Paula can't design a relationship web without knowing the social pressures of the district. Araminta can't set a visual tone without knowing the setting's mood. This document fills those gaps.
---
## Layer 1: Art Direction & Visual Identity
### Setting Context for Visual Identity
I won't wade into Araminta's territory on style guides and palettes, but the setting has strong visual identity implications that should inform Q-003.
**What stations look like in the Settled Reach:**
The Reach's built environments are not uniform. They reflect who built them, when, and for what purpose.
- **Core system stations:** High institutional presence. Clean lines, managed surfaces. Lattice Commission insignia on regulatory kiosks. Meridian access points glowing in alcoves. The aesthetic is "functional prosperity" -- not gleaming chrome utopia, but competent civic infrastructure that works well enough that nobody thinks about it. Think a well-maintained European transit hub, not a cyberpunk dystopia.
- **Mid-Reach stations:** Mixed use, mixed age. Older sections built during early settlement with exposed structural elements and retrofit Meridian hookups. Newer sections with institutional standard finishes. The seams between eras are visible -- different wall materials, different ceiling heights, cable runs added after construction. These stations have character because they have *history*.
- **Frontier stations:** Sparse, improvised, practical. Meridian coverage is spotty. Span gate connections are limited. Structures prioritize function. There's a frontier aesthetic -- things are built to work, repaired rather than replaced, and personalized because there's no institutional standard to enforce.
**v0.1 implication:** Our station district should read as mid-Reach or transitional core -- established enough to have institutions (the detective needs jurisdictional authority), rough enough to have shadows (the smuggler needs operational space). This gives Araminta a visual framework: not pristine, not derelict. Lived-in. Functional but imperfect. The kind of place where a logistics hub, a bar, and a smuggling ring can all exist in the same district without it feeling implausible.
**IP note:** Avoid any visual language that reads as "Blade Runner" (rain, neon, noir) or "Star Trek" (antiseptic corridors, uniforms). The Settled Reach's visual identity should be closer to "working infrastructure" -- think the mundane parts of Alien's Nostromo or the lived-in spaces of The Expanse's Ceres. Ordinary. Functional. The extraordinary is in the technology people carry, not the walls around them.
---
## Layer 2: Narrative Framework & Character Design
### Setting Context for Character Builds
**Smuggler (Logistics Worker)**
Setting note -- a smuggler in the Settled Reach is not a Han Solo archetype. The gate network makes interstellar smuggling a matter of *infrastructure manipulation*, not daring piloting. Smuggling means getting contraband past Lattice Commission checkpoints at gate hubs, through freight scanning at span gate terminals, and past Meridian-logged inventory systems.
A logistics worker is the *perfect* cover because they already have legitimate access to freight handling systems. They know the manifest protocols. They know which cargo containers get scanned and which get waved through. They know the dock schedules. Smuggling in the Reach is a social and bureaucratic crime, not a physical one -- you beat the system by understanding the system better than the people enforcing it.
**What the smuggler's daily life looks like:**
- Morning: Clock in at the logistics hub. Review the day's manifests. Standard freight processing.
- Shift work: Move containers, verify shipments, coordinate with dock crews. Mundane, physical, routine.
- Cracks in the routine: A contact pings on an off-Meridian channel. A container is flagged for special handling. A dock worker who knows the score gives a particular greeting that means "tonight's load is ready."
- After shift: The bar. Decompress. Maintain social ties. Read the room for who's being watched.
The smuggler's lattice is standard-issue Baseline. They avoid enhanced lattice precisely because enhanced lattice means enhanced monitoring. Their perception is limited but their *knowledge* is deep -- they know the dock, the people, the rhythms. They navigate by social intelligence, not technological advantage.
**Detective (Institutional Investigator)**
Setting note -- "detective" in the Settled Reach means a Lattice Commission field investigator or a Concord Assembly-licensed security operative. This matters: the detective has *institutional backing* but also *institutional constraints*. They can request lattice reads (with cause). They can access Meridian security logs (within jurisdiction). They can query Commission databases (subject to classification).
But they can't just kick down doors. The Reach's legal framework is real. Jurisdictional boundaries matter. Evidence gathered illegally is inadmissible and gets investigators sanctioned. The detective's daily frustration is the gap between what they suspect and what they can prove within the rules.
**What the detective's daily life looks like:**
- Morning: Review case file updates on insert. Check for overnight Meridian flags in the district.
- Investigation: Walk the district. Observe. Talk to contacts and informants. Request specific data pulls from Commission systems.
- Institutional overhead: File progress reports. Justify resource expenditures. Navigate the priorities of superiors who care about clearance rates, not justice.
- After shift: The bar -- a different role. Not a colleague unwinding, but an investigator maintaining a social presence, building rapport, looking for tells. Or reviewing notes alone, trying to see the pattern.
The detective's lattice is Augmented -- institutional issue. Enhanced sensory processing, audio analysis capability, pattern recognition support. The insert overlay shows more data: flagged persons of interest, anomalous manifests, case file annotations pinned to locations. The detective sees the same district through an institutional lens that the smuggler's simpler lattice can't provide.
**Divergent starting knowledge (#182) -- setting-grounded specifics:**
| Knowledge domain | Smuggler knows | Detective knows |
|---|---|---|
| Dock operations | Full insider knowledge -- schedules, protocols, which bays are used for what, who works which shift | Official manifests and scheduled arrivals. What's on paper. |
| Criminal network | Names, roles, hierarchy within the ring. Who's reliable, who's sloppy, who's getting nervous. | A case file: "suspected smuggling activity in logistics sector." Sparse intel. |
| Institutional structure | Who the inspectors are, when they visit, which ones are thorough. Practical, defensive knowledge. | Chain of command, jurisdictional authority, access protocols. Operational knowledge. |
| Bar regulars | Drinking buddies, social ties, who to trust. The bar as social haven. | Faces, observed patterns, potential witnesses or informants. The bar as intelligence gathering site. |
| District rhythms | Lived experience -- knows when streets are quiet, which corridors are unmonitored, where the blind spots are. | Patrol schedules, monitored zones, officially mapped infrastructure. |
| Technology | Standard logistics systems, off-Meridian communication (basic Severance techniques), freight handling equipment. | Commission investigative tools, lattice read protocols, Meridian query syntax, surveillance analysis. |
**Divergent relationships (#183) -- access tier implications:**
The same NPC responds differently based on who's asking:
- **Dock workers (smuggling ring):** The smuggler gets insider greetings, warnings, coded updates. The detective gets polite compliance and careful answers.
- **Bar regulars:** The smuggler gets camaraderie, gossip, the real atmosphere. The detective gets friendly-but-guarded small talk from people who've noticed the institutional lattice signature.
- **Station administration:** The smuggler gets bureaucratic indifference. The detective gets professional cooperation and data access.
- **Informants:** The smuggler has contacts in the ring who warn them about pressure. The detective has informants who trade information for favors or immunity.
---
## Layer 3: Station District Setting Document
### Sova Transit District -- v0.1 Setting Brief
**Name:** Sova Transit District (Station Sova, Krenn System)
**Classification:** Mid-Reach logistics hub. Gate-adjacent commercial district.
**Physical Description:**
Sova Transit District occupies a wedge of Station Sova between the primary freight span gate terminal and the residential blocks. It's a working district -- cargo handling, warehousing, customs processing, maintenance, and the service economy that grows up around people who work physical jobs: bars, food vendors, repair shops, a small medical clinic.
The district is roughly 40 years old. The original structure was prefab modular -- standard mid-Reach construction. Since then, it's been modified, extended, patched, and partitioned by successive occupants. The result is a space with layers: clean institutional corridors near the gate terminal transitioning to older, more improvised spaces as you move toward the residential boundary. Ceiling heights vary. Lighting shifts from institutional white near the terminal to warmer, cheaper, more irregular fixtures in the older sections.
The span gate at the district's edge connects to a planetary freight depot. Most of what flows through Sova Transit is bulk cargo -- agricultural products, manufactured goods, machine parts, biological supplies. Nothing glamorous. The kind of freight that keeps a system running.
**Economic Engine:**
Sova's economy is freight. The span gate processes dozens of container transits per day. The logistics hub -- the district's largest employer -- manages scheduling, manifests, container handling, and customs verification. Supporting businesses serve the workforce: the bar, food vendors, a general supply outlet, maintenance services.
The district is not poor, but it's not prosperous either. Workers earn steady wages. Housing is adequate. The infrastructure works. There's a pervasive sense of economic stability that sits just above the line where people start complaining -- comfortable enough to be complacent, tight enough that an extra income source is tempting.
This is the economic pressure that feeds smuggling. A logistics worker makes a decent living. A logistics worker who moves a flagged container to the wrong scanner bay makes a *good* living. The risk calculus is tilted by the fact that the Commission's presence here is intermittent -- Sova is mid-priority. Enough oversight to maintain order. Not enough to catch everything.
**Atmosphere:**
Sova Transit feels like a place where people *work*. Not dramatically. Not glamorously. The way a port town works -- shifts rotate, cargo moves, people know each other because they've been seeing each other every day for years. There are regulars at the bar. There are shift handoff rituals. There are petty grievances that have been simmering for months. There's gossip.
The mood is **quotidian-with-undertow**. Surface level: ordinary life proceeding normally. Underneath: the smuggling ring has been operating for long enough that it's become part of the district's unofficial economy. People know, or suspect, or deliberately don't ask. The ring isn't violent. It isn't chaotic. It's a business that runs alongside the legitimate one, and most people have decided that's fine.
This is the tension the detective walks into: a district that looks normal because the abnormal has been normalized.
**Recent History:**
- **3 months ago:** The district's previous Commission liaison was reassigned (routine rotation, nothing suspicious). The replacement is less experienced and less connected to the district's social network. This created a window -- the ring's operations have expanded during the gap in institutional familiarity.
- **6 weeks ago:** A new freight contract brought increased cargo volume through the span gate. More containers means more opportunity to hide contraband. The ring has been busier.
- **2 weeks ago:** The detective was assigned. Their cover story (or open mandate, depending on build) places them in the district to review logistics compliance. Standard operational audit. Nothing exciting. Except the detective's actual brief includes intelligence suggesting smuggling activity.
- **Present:** The district is in an equilibrium that's about to be disrupted. The ring is comfortable but not complacent. The detective is observing but not yet acting. Ordinary life continues. The contamination (D-027) is the storyteller's disruption of this equilibrium.
**What Makes Sova Interesting:**
1. **Everyone knows everyone.** The district is small enough that faces are familiar. A stranger stands out. The detective's arrival is noticed. Their institutional lattice signature (detectable by anyone paying attention) marks them as *not from here*.
2. **The freight rhythm structures daily life.** Span gate transit schedules create predictable waves of activity -- busy periods when cargo moves, quiet periods between. This rhythm is the skeleton of NPC routines and the smuggler's operational calendar.
3. **The bar is the social heart.** Off-shift, the bar is where information flows. Who's talking to whom, who's drinking alone, who left early -- these are the social signals the player reads.
4. **Institutional presence is real but thin.** There's a Commission terminal, but it's a kiosk, not a station. Security checks happen at the span gate. Surveillance exists but isn't comprehensive. This gives both the smuggler and the detective room to operate -- the smuggler because oversight has gaps, the detective because they can observe without the infrastructure making it obvious.
5. **The architecture has secrets.** Forty years of modifications have created spaces that aren't on official layouts -- maintenance corridors repurposed as storage, sealed sections reopened, gaps between wall layers. The smuggling ring uses these. The detective, if observant, can discover them.
**Environmental Details for Content Teams:**
- **Signage:** Bilingual in Concordat Standard (institutional) and local script (Krenn System vernacular). Official signs are clean, regulation-formatted. Unofficial signs are hand-lettered, idiosyncratic.
- **News ticker:** A Meridian feed display in the bar and logistics hub lobby. Concord Assembly proceedings (boring), freight market prices (relevant), weather alerts for planetary operations (practical), and occasionally a Commission public notice about regulatory compliance (pointed).
- **Ambient sounds:** Cargo handling machinery. Span gate transit hum (a deep, subsonic vibration felt as much as heard). Ventilation. Foot traffic. The clink of a bar in the evening.
- **Smells (monologue material):** Industrial lubricant near the docks. Recycled air everywhere. Cooking from the food vendors. The particular ozone-and-metal scent that lingers near span gate terminals -- the Interstitium leaving its trace on everything that passes through.
- **Temperature:** Slightly warm near the cargo bays (machinery heat), cooler in the corridors (ventilation), comfortable in the bar (climate-controlled, a small luxury).
**Cultural Notes:**
Station Sova is Krenn System -- a mid-Reach system settled roughly 180 years ago. It's old enough to have a distinct local identity but young enough that most residents still think of themselves as part of the broader Reach rather than frontier separatists. The local culture is working-class pragmatic. People value reliability, competence, and minding your own business. They're not hostile to institutions, but they're not deferential either. The Concord Assembly is a distant government. The Commission is a practical reality. The Syndics are the entities you actually deal with -- Sova's freight operations run through a Syndic logistics consortium.
Religion and philosophy are private matters. The Unbound are a known quantity -- a few district residents are Unbound by choice, mostly older workers who came from frontier backgrounds. Nobody makes a fuss about it. The Guardians (Severance) are rumored to operate in the system but are not a visible presence in the district.
**Naming conventions (Krenn System):**
Names in the Krenn System tend toward compact, consonant-heavy constructions. First names: Kael, Voss, Drin, Lera, Torek, Maret. Family names (used formally): Davan, Korr, Sessik, Lintar. Workers often go by first name or nickname on shift. The detective will be addressed by title or full name until trust is established.
*IP note: These names are constructed to feel plausibly human-future without mapping to any existing franchise's naming conventions. They are NOT Commonwealth names (Ozzie, Nigel, Mellanie -- those are conspicuously contemporary English names, which is Hamilton's trademark). Our names suggest cultural drift over centuries of interstellar settlement.*
---
## Layer 4: Content Pipeline & Authoring Format
### Setting-Relevant Tag Taxonomy
Gestalt is the lead on the authoring format, but I can contribute the setting-relevant tag dimensions that should exist in the tag taxonomy:
**Setting-grounded tags for line pools:**
| Tag dimension | Values for v0.1 | Setting justification |
|---|---|---|
| `lattice_tier` | baseline, augmented | Determines what the character can perceive and access. Smuggler = baseline, detective = augmented. |
| `shift_phase` | on_shift, off_shift, transition | Freight rhythm structures social norms. On-shift dialogue is professional; off-shift is personal. |
| `district_familiarity` | local, newcomer | The detective is new. NPCs respond to that. "Haven't seen you around" vs "the usual?" |
| `institutional_context` | civilian, commission, syndic | NPCs adjust register based on perceived institutional affiliation. |
These tags complement the access tiers (D-028 Layer 1) by grounding them in setting logic. An NPC doesn't filter dialogue because of an abstract "trust level" -- they filter because they've noticed the institutional lattice signature, or because they've never seen this person on a shift rotation, or because the district's social code says you don't talk about certain things when Commission personnel are around.
---
## Layer 5: Template Content (3 Social Sites)
### Setting Context for Templates
**Workplace -- Logistics Hub ("The Terminal")**
The logistics hub is the district's economic center. A large open space partitioned into operational zones: manifest processing, container staging, span gate prep, administrative offices, crew locker area.
Setting details:
- **Manifest processing:** Terminals where workers verify cargo contents against Meridian-logged manifests. This is where the smuggling happens -- mismatched containers, doctored manifests, containers routed to the wrong scanner.
- **Container staging:** The physical workspace. Heavy containers moved by small grav-lifts. Noisy, active during shift hours. Workers communicate in a mix of voice and short Meridian pings.
- **Administrative offices:** The supervisor's domain. Official records, shift schedules, performance reviews. The smuggling ring's vulnerability -- if the supervisor is compromised, the ring has institutional cover. If the supervisor is clean, the ring has to work around them.
- **Break room / lockers:** The social space within the workplace. Where off-the-record conversations happen. Where shifts overlap and gossip flows.
Triangle opportunities:
- Supervisor vs. senior worker (authority tension, possible complicity)
- Two workers competing for a promotion (mundane triangle, personal stakes)
- Worker who suspects the ring vs. worker who's in the ring (knowledge asymmetry within the NPC population)
**Social Venue -- Bar ("The Last Shift")**
A mid-grade bar in the district's older section. Not upscale, not a dive. The kind of place where working people go after shift. Good enough that regulars are loyal, plain enough that nobody puts on airs.
Setting details:
- **Interior:** A long bar, scattered tables, a corner booth that's semi-private (key location for discreet conversations -- the player can observe who uses it). Background Meridian music feed. A news ticker display that nobody watches except when something local comes up.
- **Bartender:** A fixture. Knows everyone. Listens more than talks. Observes. The bartender is a potential information source for both characters, but for different reasons -- the smuggler trusts them as a social contact; the detective recognizes them as someone who sees everything.
- **Clientele:** Logistics workers (the largest group), a few station maintenance crew, occasional visitors from other districts, the detective (who becomes a regular by design or necessity).
- **Rhythms:** Quiet during day shifts. Filling up as evening shift ends. Peak in the evening. Late-night regulars are a different crowd -- the ones who don't want to go home, or who are waiting for something.
Triangle opportunities:
- Two regulars with a personal dispute that predates the game (mundane, rich for player observation)
- Bartender caught between regulars they like and a regular they suspect (loyalty vs. honesty)
- Cross-template: a bar regular who also works at the logistics hub, carrying social dynamics between both spaces
**Criminal Template -- Smuggling Ring ("The Arrangement")**
Not a cartel. Not organized crime in the dramatic sense. The Arrangement is an informal network of logistics workers who use their freight access to move contraband -- restricted biologicals, unlicensed lattice components, Severance tech, off-Meridian communication devices, occasionally items with no clear origin (Gyre salvage? Institute-classified materials? Nobody asks).
Setting details:
- **Structure:** Flat hierarchy. One coordinator (off-station, communicates through dead drops and off-Meridian channels). A handful of dock workers who handle the physical cargo. One or two contacts outside the district who arrange receiving. The smuggler player character is mid-level -- experienced enough to be trusted with operations, not senior enough to know the full network.
- **Operations:** Contraband arrives in standard freight containers with doctored manifests. Workers route these containers to scanning bays with known blind spots, or to storage areas where they can be opened and repacked. Timing is critical -- operations happen during specific shift transitions when oversight is thinnest.
- **Security:** The ring's primary defense is normalcy. Nobody does anything dramatic. No late-night break-ins. No suspicious meetings in dark corridors. Everything happens within the flow of legitimate work. If a container is flagged, it's rescheduled. If someone is watched, they go quiet. Patience is the ring's greatest asset.
- **Vulnerability:** The ring has been operating for about two years -- long enough that some participants have become careless. A few workers have been spending beyond their visible income. Social ties within the ring are strong enough that personal conflicts (romantic entanglement, debt, jealousy) could compromise operational security.
Triangle opportunities:
- Ring member whose loyalty is wavering vs. ring member who's all-in (pressure under investigation)
- Ring coordinator (remote) whose demands are escalating vs. local workers who want to keep things small (ambition vs. safety)
- Cross-template: ring member who's a bar regular, whose off-shift behavior is observable by the detective
---
## Layer 6: NPC Profiles & Dialogue
### Setting-Grounded NPC Context
The 10-axis model (D-024) is an ECS schema. What it needs from worldbuilding is the *cultural substrate* that makes those axes feel grounded in Sova Transit District rather than generic.
**What "ordinary life" feels like for an NPC in Sova:**
- You have a job. It pays. It's not exciting. You've been doing some version of it for years.
- You have a lattice (unless you're Unbound). It connects you to the Meridian. You use it the way people use phones -- constantly, casually, unreflectively. You check freight schedules, message friends, look up recipes, watch entertainment feeds, read news you mostly don't care about.
- You know your neighbors. You know the regulars at the bar. You have opinions about the supervisor. You have a thing with someone, or you had a thing with someone, or you're trying to have a thing with someone.
- You are aware of the Commission the way people are aware of the tax authority -- it exists, it has power, you'd prefer not to attract its attention, but you're not living in fear.
- You don't think about the Founders or the Builders or the Interstitium. Gate transit is a commute. The span gate hum is background noise. The existential questions of the Reach are academic. Your questions are: will I make rent, is Kael seeing someone, why did the supervisor change the shift rotation.
This is the substrate that D-029's 30% flat NPCs embody. They are *genuinely ordinary*. Their ordinariness is not a disguise. It is the reality that makes the smuggling ring's deception meaningful and the detective's investigation consequential.
**Cultural tells that NPCs exhibit:**
These are setting-specific behavioral markers that can feed into the tell system (#90):
| Cultural tell | What it signals | Setting basis |
|---|---|---|
| Checking their lattice overlay frequently | Nervous, expecting a message, monitoring something | Meridian-connected behavior, universal |
| Avoiding eye contact with Commission-tagged individuals | Awareness of institutional surveillance, possibly hiding something | Social response to authority, especially in districts with thin Commission presence |
| Using off-Meridian communication (physical notes, verbal codes, dead-drop patterns) | Connected to Severance networks, smuggling operations, or extremely private | Severance counter-surveillance culture filtering into criminal methodology |
| Spending patterns visible through lifestyle | Income doesn't match visible employment | Observable consequences of illicit income |
| Shift timing irregularities | Arriving early, staying late, taking breaks at non-standard times | Freight-rhythm deviation -- meaningful in a schedule-driven workplace |
| Social avoidance of specific individuals | Relationship tension, secret, fear of exposure | Triangle dynamics manifesting as observable behavior |
**NPC naming for v0.1 -- a starter set:**
For Mellanie and Paula to begin writing, they need names. These are setting-consistent for Krenn System:
| Name | Role suggestion | Notes |
|---|---|---|
| Kael Davan | Dock worker, smuggling ring member | The smuggler's closest colleague and the detective's early person of interest |
| Voss | Logistics hub supervisor | Clean or compromised? Either works for v0.1 |
| Lera Sessik | Bartender at The Last Shift | Social hub, observes everything, talks carefully |
| Torek Lintar | Senior dock worker, ring member, getting sloppy | Visible spending, behavioral tells, vulnerability |
| Drin | Station maintenance, bar regular, not ring-connected | Mundane triangle participant, salt-of-the-earth |
| Maret Korr | Freight scheduler, ring-adjacent (knows but isn't active) | The moral gray zone -- aware, complicit by silence, conflicted |
These are suggestions, not mandates. Paula and Mellanie should adapt freely. The naming convention (compact, consonant-heavy, first-name-primary in social contexts) is the consistency requirement.
---
## Layer 7: Monologue & Observation Text
### Setting Context for Character Voice
The monologue is the most important content system for proving the setting works in gameplay. It's where the player *hears* the setting through their character's perspective.
**Smuggler voice -- setting notes:**
The smuggler's monologue should reflect someone embedded in Sova's social fabric. They think in terms of relationships, routines, and risk management. Their observations are practical and socially attuned.
- **Register:** Colloquial, direct, occasionally sardonic. They don't use institutional vocabulary. They don't think in Commission categories. When they see a cargo container, they think about who shipped it and what might be in it, not about regulatory compliance.
- **Knowledge flavor:** The smuggler notices things a logistics worker would notice. Manifest inconsistencies. Dock schedule changes. Which scanner bays are running and which are down for maintenance. These are mundane observations that carry hidden significance.
- **Emotional baseline:** Watchful comfort. This is the smuggler's territory. They're at ease here, but never fully relaxed -- the awareness that one mistake could unravel everything is always present, like a low hum.
Example monologue seeds (not final lines, but tone/content direction for Mellanie):
- Seeing a colleague arrive late: *observation + social reading + implicit risk assessment*
- Noticing the detective in the district: *wariness + social evaluation + threat assessment without acknowledging why they're a threat*
- Routine cargo handling: *competence + casual familiarity + the practiced not-looking at flagged containers*
**Detective voice -- setting notes:**
The detective's monologue should reflect trained analytical habits filtered through institutional perspective. They think in terms of evidence, patterns, and procedure. Their observations are systematic but tinged with the frustration of working within constraints.
- **Register:** More formal internally than the smuggler. Professional vocabulary. Commission frameworks for categorizing observations. But not robotic -- the detective is a person, not an institution, and their private thoughts include doubt, irritation, and occasional dark humor.
- **Knowledge flavor:** The detective notices things an investigator would notice. Behavioral patterns. Access anomalies. Infrastructure gaps. When they see a cargo container, they think about chain of custody, scanning records, and whether the manifest matches the shipping code.
- **Emotional baseline:** Alert curiosity with institutional weariness. They're doing a job. They believe in the job. But they've been doing it long enough to know that the job doesn't always produce justice, and that their institution is imperfect.
**Setting-specific monologue triggers Mellanie should consider:**
| Trigger | Smuggler response flavor | Detective response flavor |
|---|---|---|
| Span gate transit hum changes pitch | "Gate's busy today. Good cover." | "Increased freight volume. Worth checking manifests." |
| Unfamiliar person in the district | "Who's that? Not from any shift I know." | "New face. No district resident tag on file. Note for follow-up." |
| News ticker mentions Commission activity elsewhere | "Good. They're busy somewhere else." | "Regional enforcement stretched thin. Explains the understaffing here." |
| NPC seems nervous | "Something's wrong with Torek. He's been jumpy all week." | "Subject displays stress indicators. Possible concealment behavior." |
| Bar is unusually quiet | "Where is everyone? Something happen on late shift?" | "Reduced foot traffic. Correlated with any scheduled operations?" |
---
## Layer 8: UI Text & Environmental Content
### Setting-Grounded Diegetic Content
The neural lattice overlay (the insert, per D-013) is the player's interface. Everything the player sees on their HUD exists within the fiction as lattice-projected information. This constrains and enriches what appears on screen.
**What the lattice displays (both characters):**
- **Time:** Krenn System standard time. The lattice displays it in the corner of visual awareness -- the way you see a clock on a phone without looking directly at it.
- **Navigation:** Known locations appear as waypoints in the overlay. Fuzzy for general areas, precise for visited locations.
- **Notifications:** Meridian messages, institutional alerts, personal pings. The smuggler gets fewer institutional notifications; the detective gets more.
- **Identity tags:** When looking at a person, the lattice can display publicly available data -- name (if in your contact list or public record), employer (if publicly listed), lattice tier (detectable by proximity scan). The *absence* of this data is itself information -- someone with a masked or spoofed lattice signature stands out.
**What the detective's augmented lattice adds:**
- Case file annotations pinned to locations and persons of interest
- Commission database query results displayed in overlay
- Enhanced audio analysis readouts (sound direction, voice pattern matching)
- Surveillance zone boundaries (where Commission monitoring is active)
**Environmental text for Mellanie and Araminta:**
| Text type | Examples | Setting notes |
|---|---|---|
| Official signage | "Span Gate Terminal C -- Authorized Freight Only," "Lattice Commission -- Report Irregularities," "Emergency Re-embodiment: Deck 7 Med Center" | Institutional, bilingual (Concordat Standard + Krenn vernacular), regulation-formatted |
| Informal signage | "Lera's -- Cold Drinks, Hot Food, No Questions" (the bar), shift schedule boards, hand-lettered notices about lost items or shift swaps | Personality-rich, district-specific, the human layer over institutional structure |
| Terminal screens | Freight manifest summaries, Meridian news feeds, Commission public notices | Functional, data-dense, the kind of information that's everywhere and mostly ignored |
| Meridian news ticker | "Concord Assembly approves Krenn System infrastructure allocation," "Span gate maintenance: Terminal B offline 0200-0400," "Commission advisory: verify lattice firmware before next imprint cycle" | Background texture, occasionally plot-relevant (the detective might notice a news item the smuggler ignores) |
**Onboarding through monologue (D-016 diegetic tutorial):**
Setting note -- the lattice IS the tutorial system. The character's lattice overlay highlights interactive elements naturally. The character's internal monologue provides context naturally. "That terminal might have access logs" is the detective's trained instinct, not a tutorial prompt. "Better check in with Kael before shift" is the smuggler's social awareness, not a quest marker.
The setting makes diegetic onboarding not just possible but *inevitable*. These characters live in this world. They think about it. Their thoughts are the tutorial.
---
## Layer 9: Audio Direction
### Setting-Grounded Sound Identity
I won't prescribe audio design, but the setting has sonic character that should inform whatever direction we take:
**Sova Transit District soundscape:**
- **The span gate hum:** A persistent, low-frequency vibration that defines the district's acoustic identity. Everyone who lives here has learned to ignore it. But it's *always there*. When it stops (maintenance, emergency shutdown), the silence is unsettling. This is the district's heartbeat.
- **Freight operations:** Grav-lift motors, container locks engaging, manifest scanners pinging, dock crew calling to each other. Industrial but not deafening -- modern equipment is efficient. The sound of work happening.
- **Social spaces:** The bar has its own acoustic character -- conversation, glass on surfaces, a Meridian music feed that nobody chose and nobody changes. The logistics hub break room is quieter -- murmured conversations, locker doors.
- **Lattice sounds:** A lattice notification is a sound only the recipient hears -- it's internally generated. For gameplay, this means the player hears their own notifications (monologue, messages, alerts) but NPC lattice sounds are silent to the player. An NPC checking their lattice is a *visual* tell, not an auditory one.
**v0.1 audio recommendation from setting perspective:**
The span gate hum alone would do more for atmosphere than any amount of generic ambient music. If we implement one sound for v0.1, it should be this -- a constant, low rumble that the player eventually stops noticing, until it changes, and then the *absence* or *change* in that sound becomes information. This supports the three-range model (D-018) naturally: the hum is the acoustic baseline that other sounds are measured against.
---
## Setting Gaps & Risks
### What's Still Missing from the Setting for v0.1
1. **Contraband specifics.** What is the ring actually smuggling? This matters for narrative weight. Suggestions:
- **Unlicensed lattice components** -- aftermarket mods that bypass Commission regulation. Not dangerous, but illegal. The moral question: people want better lattice access than they can afford through official channels. Is that wrong?
- **Severance tech** -- counter-surveillance tools. The ring doesn't care about ideology; they move product. But the product has political implications.
- **Off-manifest biologicals** -- medical supplies, growth cultures, possibly re-embodiment materials diverted from Syndic supply chains. The gray market exists because Syndic pricing makes legitimate access prohibitive for working-class citizens.
Recommend: a mix, with unlicensed lattice components as the primary cargo. This creates moral ambiguity -- the smuggler isn't moving weapons or drugs. They're moving *access*. The detective's investigation targets an operation that, from a certain angle, is a public service.
2. **The detective's institutional chain of command.** Who assigned them? What's the stated mandate? What are the political pressures on the investigation? This needs to be defined before Paula designs the detective's narrative arc.
3. **Off-station connections.** The smuggling ring has contacts outside Sova Transit District. Who are they? We don't need to build them for v0.1, but we need enough detail that NPC dialogue can reference them consistently. Suggestion: the ring's coordinator is on-station but in a different district, communicating through dead drops and off-Meridian channels. External contacts are Syndic-adjacent freight handlers at the other end of the span gate route.
4. **The Meridian's local flavor.** What does the Meridian "feel like" in this district? Fast, reliable connection? Intermittent coverage with dead spots? The level of Meridian infrastructure affects everything from NPC behavior to the detective's investigative capability. Suggestion: solid coverage in the logistics hub and bar (institutional areas), degraded coverage in the older district sections (natural dead spots that the ring exploits, that Severance may have expanded).
### IP Originality Checklist
Let me check the v0.1 content against our guardrails:
| Element | Risk assessment |
|---|---|
| Station district setting | **Clear.** Generic enough to be original. No specific franchise owns "space station logistics district." |
| Smuggling ring premise | **Clear.** Smuggling as logistics manipulation rather than daring raids is original enough. Distinct from Star Wars (romantic), The Expanse (violent), or Hamilton (political). |
| Detective as institutional investigator | **Clear.** Commission investigator is setting-specific. Not a cop, not a Blade Runner, not a bounty hunter. |
| Span gate as infrastructure | **Clear.** Our dual-tier gate system is established as original (Round 14 audit). |
| Lattice/Meridian as daily technology | **Clear.** Original terminology, distinct from Hamilton's inserts/unisphere. |
| "The Last Shift" as bar name | **Clear.** Evocative of working-class setting, not franchise-specific. |
| Krenn System naming conventions | **Clear.** Constructed specifically to avoid franchise mapping. |
No IP concerns flagged for the v0.1 station district content.
---
## Summary: What Content Teams Need from Worldbuilding
| Recipient | What I've provided | What's still needed |
|---|---|---|
| **Mellanie** | District atmosphere, NPC naming conventions, character voice notes, monologue trigger examples, environmental text examples | Full NPC cultural profiles once Paula defines the relationship web |
| **Paula** | Smuggler and detective daily life descriptions, institutional context, triangle opportunities per template, setting-grounded access tier logic | Review of whether the detective's institutional framework supports the narrative arc she's designing |
| **Araminta** | Visual identity notes (mid-Reach, lived-in, functional), environmental detail descriptions, signage language | Confirmation that the visual tone aligns with what she's proposing for Q-003 |
| **Gestalt** | Setting-grounded tag taxonomy additions, cultural tell catalog for tell system | Validation that the setting tags integrate cleanly with the line pool format |
| **Ozzie** | The span gate hum as signature atmospheric element, the "stranger stands out" social dynamic | Feedback on whether the district atmosphere creates the "first 30 seconds of presence" he's looking for |
---
## Recommendation for Cultural Generation Guide (#189)
This workshop output should feed directly into the cultural generation guide I'm assigned to write. The Sova Transit District brief above is the first instance -- a concrete example of what the guide will generalize. The guide needs to cover:
1. How to adapt the setting's general principles to specific district types
2. Naming conventions by system origin
3. Daily life rhythms by economic base (freight, service, institutional, frontier)
4. Cultural attitudes toward lattice, Commission, and institutional authority by district character
5. Environmental detail templates (sounds, signs, smells, architectural character)
The Sova brief is the v0.1 slice. The cultural generation guide is the tool for scaling beyond v0.1.
---
*Setting note -- I'm satisfied that the v0.1 district is grounded in our established worldbuilding, original in its surface details, and rich enough to support the content teams' work. The Settled Reach's ordinary life needs to feel genuinely lived-in before the conspiracies have any weight. Sova Transit District is designed to be exactly that: ordinary enough to be real, textured enough to be interesting, and structured enough that the smuggler and detective experience it as fundamentally different places.*
*Miri out.*
@@ -1,267 +0,0 @@
# Round 1: Ozzie — Player Experience & Wow Factor
## v0.1 Content Gap Analysis Workshop
---
## My Approach
Same as last time. I'm reading each layer and asking: **does this make someone FEEL something?** Content isn't lines in a file. Content is the moment a player stops thinking about the game and starts thinking about the WORLD. I'm going through all 9 layers and answering the questions directed at me, but I'm also flagging anything that smells emotionally flat.
---
## Layer 1: Art Direction & Visual Identity
### Q: Does the vertical slice need visual mood, or is "readable placeholder" sufficient to prove the concept?
**It needs mood. Not polish — MOOD.**
Here's the thing. D-016 says "atmosphere carried by monologue." That's true. The monologue is our primary atmosphere engine. But the monologue doesn't fire until the player is ALREADY in the world. There's a gap — however small — between "I see the screen" and "the first monologue line plays." In that gap, the player forms their first impression from VISUALS ALONE.
If that first impression is "this looks like a spreadsheet," the monologue has to fight upstream. It has to OVERCOME a first impression instead of REINFORCING one.
So here's what I'm asking for — and it's not much:
1. **A constrained color palette that says "space station."** Not beautiful — FUNCTIONAL but atmospheric. Think: muted blues and grays for corridors, warm amber for the bar, cold fluorescent white for the logistics hub. Three palettes, three moods. Even with box-art placeholders, color does 80% of the atmosphere work.
2. **Lighting variation between locations.** The bar is dim. The workplace is bright. The smuggling ring meeting spot is dark except for one harsh light. This isn't art — it's tinting. It can be done with placeholder boxes if the boxes are the RIGHT COLOR.
3. **One signature visual element.** Something the player sees in the first 5 seconds that says "this is a space station, not a warehouse." A viewport showing stars. A holographic sign. A wormhole gate visible in the distance. ONE thing. That's the visual hook while the monologue spools up.
**My answer: "readable placeholder" is NOT sufficient. "Readable placeholder WITH a color palette and one signature element" IS sufficient.** The gap between those two is maybe 2-3 days of Araminta's time and it's the difference between "this is a prototype" and "this is a WORLD I'm stepping into."
D-014 says "functional boxes with labels." Fine. But those boxes should be tinted correctly and that one signature element should exist. That's my line.
---
## Layer 2: Narrative Framework & Character Design
No questions directly at me, but I'm weighing in anyway because this is where the emotional foundation gets laid.
The Dual Lens Guide (#261) is the most important pre-content document in the entire project. I said this in the last workshop and I'll say it again: **the smuggler and detective must have fundamentally different EMOTIONAL RELATIONSHIPS to the same world.** Not just different access tiers. Different FEELINGS.
The smuggler walks into the logistics hub and feels... what? Boredom? Comfort? Low-level anxiety about their side gig? The detective walks in and feels... suspicion? Professional focus? The excitement of being undercover in a new environment?
The Dual Lens Guide needs to define these emotional registers. Not just "who knows what" — "who FEELS what, about the same things."
**One specific ask for Paula:** The guide should include 3-5 "emotional divergence moments" — specific situations where the two characters would have opposite emotional reactions. Examples:
- Seeing a cargo manifest (smuggler: routine / detective: evidence)
- An NPC being friendly (smuggler: genuine warmth / detective: "is this person a target or an asset?")
- A door that's usually locked being open (smuggler: "huh, that's weird" / detective: "THAT'S MY IN")
These divergence moments are what Mellanie needs to write voice-consistent monologue. They're the emotional atoms of the dual-lens system.
---
## Layer 3: Station District Setting
### Q: What environmental details make a player feel present in the first 30 seconds?
**Five things. That's all you need. Five things and you're THERE.**
1. **Sound first.** Before you even process the visuals, you should hear the station. A low hum. Distant chatter. The hiss of an airlock cycling somewhere. I know audio is Layer 9 and deferred — I'll fight about that there. But if we HAVE audio, it should land before the first monologue line.
2. **Movement.** NPCs should already be moving when the game starts. Not standing in their spawn positions waiting for the player. You walk out of your hab unit and there's someone walking past. Going somewhere. Living their life. The world was here BEFORE you pressed play. That's the single most important presence signal.
3. **The news ticker.** Miri, Paula — put a news ticker or announcement board in the player's starting location. Not a lore dump. Three lines. "Dock 7 maintenance: scheduled closure 14:00-18:00." "Community social: bar district, Thursday evening." "Security reminder: report unregistered cargo to station management." Those three lines tell you: there are docks, there's a community, there's security, and someone's worried about unregistered cargo. THAT'S worldbuilding in 30 words. And for the smuggler, that last line hits DIFFERENT.
4. **Something out the window.** I said it in Layer 1 and I'll say it again. The player needs to see that they're IN SPACE. On a STATION. A viewport, a transparent section of floor over a docking bay, a holographic display showing the local system. One visual anchor that says "you are very far from home and this metal tube is keeping you alive." Scale creates awe. Awe creates presence.
5. **A named NPC within 10 seconds.** Not a tutorial guide. Just someone your character KNOWS. They walk past, and your monologue says their name. "There goes Tomas. Early shift again." Suddenly you're a person who KNOWS PEOPLE. You're not a camera floating through a level. You're someone with a LIFE here.
**That's the recipe: sound + movement + environmental text + spatial context + a named face.** If Miri's station district document establishes these five elements, the setting will feel present regardless of art quality.
---
## Layer 4: Content Pipeline & Authoring Format
No questions directed at me, but I care about one thing here: **the line previewer (#193).**
The line previewer isn't just a QA tool. It's how we test whether content FEELS right. Can the smuggler's monologue play in sequence and sound like a person thinking? Does the detective's voice feel distinct? Do the NPC voice kits sound like different people?
I can't gut-check content I can't experience. Nobody can. The previewer needs to exist before the content packs are "done," or we'll ship content that reads well in a YAML file and sounds dead in the game.
**My ask to Gestalt:** When you define the line pool format, include a "preview sequence" tag or mechanism. Something that lets you say "play these 5 lines in order as if the character just walked into the bar." That's how Mellanie tests her work, and it's how I evaluate the emotional delivery.
---
## Layer 5: Template Content (3 Social Sites)
No questions directly at me but I'm going to SCREAM about something.
D-029 says 30/50/20 entanglement split. ~15 NPCs. That means:
- ~4-5 truly flat NPCs (routine + greeting only)
- ~7-8 mundane triangle NPCs (social drama, no conspiracy)
- ~3 entangled with intrigue
Here's what keeps me up at night: **those 4-5 flat NPCs need to NOT feel flat.** The player doesn't know who's entangled. The moment a player can look at an NPC and think "oh, that one's just background decoration" — the investigation collapses. Every NPC needs to SEEM like they could matter. The flat ones just... turn out not to.
What makes a flat NPC feel non-flat:
- A name and a visible routine (they go PLACES)
- One memorable trait (always eating, always late, always complaining about the same thing)
- One line that SOUNDS like it could be important but isn't ("I swear the cargo schedules are getting weirder" — nope, they're just bad at their job)
Mellanie — those flat NPC voice kits are LOAD-BEARING for the investigation mechanic. They're the noise floor. If the noise is obviously noise, the signal is too easy to find.
---
## Layer 6: NPC Profiles & Dialogue
### Q: Which NPC should the player remember after 30 minutes? What makes them memorable — a line, a routine, a contradiction?
**A contradiction. Every time, it's the contradiction.**
Here's the NPC I want the player to remember. Let's call them THE FRIEND.
THE FRIEND is the NPC your character has the strongest pre-existing relationship with. For the smuggler, it's a work buddy — someone you share shifts with, someone you eat lunch with, someone who covers for you when you're late. For the detective, it's a contact — someone who feeds you information, someone you trust, someone who stuck their neck out for you once.
THE FRIEND is memorable because of a CONTRADICTION the player discovers through observation:
- The smuggler's work buddy is kind, reliable, always has your back. But you catch them one evening in a part of the station they have no reason to be in. Your monologue: "What's Jax doing near the restricted docks?" You can ask them about it. They deflect. THEY LIE TO YOU. And now every warm interaction is CONTAMINATED with doubt.
- The detective's contact gives you solid intel. Reliable. Professional. But you notice they always have an excuse to leave when a certain other NPC shows up. Your monologue: "That's the third time Ana's left when Riks walked in." What's the connection? Is your contact avoiding someone? WHY?
**What makes THE FRIEND memorable is not a great line or an interesting routine — it's the SHIFT.** They start as background comfort. Then ONE observation changes everything. Now they're a mystery wrapped in a relationship. The player can't stop thinking about them because the player LIKED them and now doesn't know if they should.
**This is why D-027's success criterion #3 is genius: "player names an NPC they felt conflicted about."** THE FRIEND is the NPC designed to deliver that criterion. One per character. Authored specifically for this purpose.
**My recommendations for Paula and Mellanie:**
1. Each character needs ONE clear "friend" NPC designed for emotional contradiction
2. THE FRIEND must be present in the first 10 minutes — relationship established EARLY
3. THE FRIEND's contradiction must be discoverable through OBSERVATION, not told through dialogue
4. The contradiction should activate during or shortly after contamination — it's the emotional bridge between daily-life and investigation
For the remaining NPCs: one memorable thing each is enough. The bartender who remembers everyone's order. The security guard who's always reading something on their insert. The maintenance worker who hums. Small, human details. Not every NPC needs to be a mystery. Most should be PEOPLE. That's what makes the mysteries stand out.
---
## Layer 7: Monologue & Observation Text
### Q: When does the first monologue surprise the player? What's the moment where they think "wait, my character noticed something I didn't"?
**It happens the first time the character has an OPINION the player doesn't share yet.**
Here's the sequence:
1. The player walks into the bar. They see NPCs sitting around. Some talking, some alone. It's just... a bar.
2. The monologue fires: "Riks is at his usual table. But he's not drinking. He's watching the door."
3. The player thinks: "I didn't notice that. My character KNOWS this person well enough to know that not-drinking-and-watching-the-door is unusual."
4. NOW the player looks at Riks differently. They didn't decide to investigate Riks. The CHARACTER flagged Riks. The monologue created attention.
THAT'S the surprise. The character is a better observer than the player. The character has context the player doesn't. The monologue bridges that gap — and in doing so, it makes the player feel like they're WEARING someone else's eyes.
For the **smuggler**, the first surprise should be social instinct: "Kira's being extra friendly to the new dock supervisor. She wants something." The smuggler reads social dynamics like a trader reads prices. The player didn't see manipulation — the CHARACTER did.
For the **detective**, the first surprise should be professional pattern-matching: "Three people at adjacent tables, none of them talking to each other, all arrived within two minutes. That's not a coincidence." The detective sees formations. Tactical arrangements. The player saw people sitting at a bar.
**When should this happen?** Within the first 15 minutes. Before contamination. During the DAILY LIFE phase. Because the surprise isn't about the conspiracy — it's about discovering that your character is a PERSON with perceptions and biases and skills the player doesn't have. The conspiracy amplifies this. The daily life INTRODUCES it.
**Content implications for Mellanie:**
- Each character needs 10-15 "observational insight" monologue lines for the pre-contamination phase
- These lines should reference SPECIFIC NPCs and their known patterns
- The insights should be CORRECT — the character's observations should check out if the player investigates
- Occasionally, the character should be WRONG — confident assessment, incorrect conclusion. "She's probably just tired." (She wasn't tired.)
**The monologue surprise is the game's SIGNATURE MECHANIC in content form.** It's not infrastructure. It's not a pipeline question. It's Mellanie writing lines that make the player feel like someone else is thinking through their eyes. If we get this right, it doesn't matter that the art is placeholder. If we get this wrong, no amount of polish saves us.
---
## Layer 8: UI Text & Environmental Content
No questions directly at me, but I want to reinforce something from my Layer 3 response.
**The news ticker / announcement board is the cheapest wow-per-word content in the entire game.**
A news ticker running in the bar or the workplace that updates throughout the day is:
- Worldbuilding (what's happening on this station?)
- Atmosphere (is this a happy place? A tense place?)
- Foreshadowing (a headline that seems mundane but connects to the conspiracy)
- Character divergence (the smuggler reads "increased cargo inspections" and sweats; the detective reads it and thinks "about time")
For v0.1, we need maybe 20-30 ticker lines. Rotating. Some mundane ("Stellar weather: nominal"), some social ("Community garden expansion approved"), some loaded ("Security advisory: unscheduled vessel departures under review"). That's an afternoon of Mellanie's time and it makes the station feel ALIVE every second it's on screen.
**The diegetic insert (D-013) needs flavor text too.** When you check your neural implant map, the POI labels shouldn't just say "Bar" and "Workplace." They should say what your CHARACTER would label them. The smuggler's insert says "The Rusty Airlock" (the bar's name, they're a regular). The detective's insert says "Licensed establishment — district 7" (official designation, they just transferred here). SAME PLACE. Different label. Different character. That's asymmetric information in the UI layer and it costs NOTHING.
---
## Layer 9: Audio Direction
### Q: Does placeholder audio kill the atmosphere, or is silence acceptable for a concept proof?
**Silence is DEATH.**
I know that sounds dramatic. Hear me out — no pun intended.
Top-down view. Placeholder art. Small sprites moving around a tiled map. Without audio, this is a BOARDGAME. A pretty one, maybe. But a boardgame. The monologue is TEXT. The dialogue is TEXT. The fog of perception is a visual effect. Everything the player experiences through their ears is... nothing.
And the thing about silence is — you HEAR it. Not consciously, but your brain notices. Silence says "this isn't a place." Sound says "this is a place." The difference is primal.
**BUT — I'm not asking for a full audio suite.** Here's my minimum viable audio for v0.1:
1. **Station ambient loop.** One track. Low hum, distant machinery, occasional muffled announcements. This runs ALWAYS. It's the "you're on a space station" signal. Think: the Nostromo ambience from Alien. It can be royalty-free or generated. One file. Huge impact.
2. **Location variation.** Three variants of the ambient: workplace (louder machinery, cargo sounds), bar (muted music, glass clinks, conversation murmur), corridors (echoing footsteps, that lonely hum). These can be the same base track with different overlay layers. Three files.
3. **Footsteps.** Your character's footsteps. Metal floor. Consistent. This alone makes you feel PRESENT in the space. One sound, two variations (walk/run). The single highest bang-for-buck audio asset in any game.
4. **One UI sound.** The monologue appearance. A soft chime, a subtle click, something that says "your character is thinking." This trains the player to notice monologue, which is our primary content delivery mechanism. Without it, text just appears and might be missed.
That's 6-8 audio files total. Maybe a day of work for someone with access to a sound library. Maybe two days if we're generating them. And the difference between those 6 files and silence is the difference between "interesting tech demo" and "I want to keep playing."
**So my answer: silence is NOT acceptable for a concept proof. But we don't need much.** A station hum, three location variants, footsteps, and a monologue chime. That's the audio floor. Below that, the atmosphere collapses regardless of how good the monologue writing is.
**Should we defer audio entirely?** NO. We should defer SOPHISTICATED audio (the three-range model, directional sound, sound-through-walls). Those are milestone features. But ambient atmosphere and basic feedback sounds should be in Sprint 2 or early Sprint 3 at the latest. Before the first content playtest. Because if we playtest in silence, we'll get feedback about the writing and systems, but we won't learn whether the ATMOSPHERE works. And atmosphere is what turns systems into experiences.
---
## Cross-Layer: The Emotional Content Map
Stepping back from individual layers. Here's how I see the content gaps mapping to PLAYER EMOTIONS:
### The Emotional Journey (30-minute session)
| Minute | Emotion | Content That Delivers It | Status |
|--------|---------|-------------------------|--------|
| 0-1 | Curiosity / Awe | Visual mood + ambient audio + signature visual element | GAP |
| 1-3 | Grounding | Opening monologue + named NPC + news ticker | GAP |
| 3-10 | Comfort / Routine | Daily task + workplace/bar dialogue + flat NPCs being human | GAP (content packs not started) |
| 10-20 | Attachment | Repeated interactions + THE FRIEND + gossip + small social dramas | GAP (dialogue layers 3-4) |
| 20-25 | Unease | First observational surprise + monologue flagging deviations | GAP (no observation content) |
| 25-30 | Dread | Routine breaks + THE FRIEND's contradiction + things going wrong | GAP (contamination content) |
| 30+ | Investigation | Full conspiracy activation | GAP (storyteller activation) |
**Every single emotional beat is a content gap.** The SYSTEMS to deliver them exist or are planned. The CONTENT to fill them does not.
That's what this workshop is about. And that table is the priority order for content creation.
---
## My Top 5 Content Priorities (Ordered)
1. **Character emotional profiles** (for Dual Lens Guide) — Before anyone writes a LINE, we need to know how each character FEELS about their world. This is Paula's document but I want Mellanie in the room. No voice kit can be written without it.
2. **THE FRIEND NPC design** (one per character) — The single NPC designed to deliver D-027 success criterion #3. Full profile, full voice kit, full contradiction arc. This is the emotional centerpiece of v0.1.
3. **Opening monologue + first 5 minutes content** — The first 20 lines each character thinks. The diegetic first objective. The emotional register of "another day" before everything goes wrong. This is what the player's first impression is made of.
4. **News ticker / environmental text** — 20-30 lines of station life. Cheapest content, highest presence-per-word ratio. Worldbuilds while the player walks around.
5. **Flat NPC voice kits** — The noise floor. The 4-5 NPCs who AREN'T important but need to FEEL like they might be. One memorable trait each. 10-15 lines each. These make or break the investigation mechanic.
---
## The Bottom Line (Again)
Last workshop I said: "We need to design the moments, not just the systems."
This workshop I'm saying: **"We need to write the moments, not just design them."**
The systems are being built. The architecture is solid. The decisions are right. But somewhere between D-028 (tagged line pools with four relational layers) and an actual player sitting at their desk going "oh shit, did Jax just lie to my face?" — there's a canyon. And that canyon is filled with unwritten monologue lines, undefined character voices, and content packs that are tickets with no words in them yet.
This workshop fills the canyon. Let's go.
---
*Written by Ozzie. Still from the gut.*
@@ -1,500 +0,0 @@
# Round 1 — Paula's Content Gap Analysis
**Agent:** Paula (Narrative & Political Depth)
**Workshop:** v0.1 Content Gap Analysis
**Date:** 2026-02-11
---
## My Approach
The workshop asks nine layers of questions, moving from the most global (art direction) down to the most specific (audio). I'm addressed directly in Layers 2, 3, 5, 6, and 7. But let me complicate this structure: content gaps don't exist in layers — they exist in *relationships between layers*. A character voice profile (Layer 2) only means something if it connects to a dialogue format (Layer 4) that connects to a content pack (Layer 5) that connects to monologue lines (Layer 7). The gaps I'm most concerned about aren't within any single layer — they're at the seams.
I'll address each question directed at me with concrete proposals, then identify the cross-layer dependencies that the workshop structure might obscure.
---
## Layer 1: Art Direction & Visual Identity
Not my primary domain, but I have a narrative stake here.
**Narrative implication of the visual identity question:** The two characters should *feel* different before a single line of monologue plays. If the art direction is "functional minimalism, atmosphere through text" (which I support for v0.1), then the visual differentiation between smuggler and detective must come from the insert/HUD layer, not from the world itself. The detective might see the district through an analytical overlay — case file annotations on locations, routine deviation markers. The smuggler might see it through a social map — who's friendly, who's dangerous, where the exits are.
This means the "visual identity" for v0.1 is partially a question for me: **what does each character's neural insert show them?** Even with placeholder art, the insert overlay can carry character-specific visual language. I'd defer to Araminta on execution, but the *information design* of what each character's HUD reveals is a narrative question.
---
## Layer 2: Narrative Framework & Character Design
### Question 1: What does the Dual Lens Authoring Guide (#261) need to contain?
This is the single most important pre-production document for content creation. Without it, Mellanie writes dialogue that works for one character but not the other. Miri designs a station that reveals itself the same way to everyone. Every content creator needs to understand the dual-lens principle before writing a single line.
**Proposed contents of the Dual Lens Authoring Guide:**
**Part 1: The Two Characters**
| Dimension | Smuggler | Detective |
|-----------|----------|-----------|
| **Core identity** | Logistics worker at the hub. Criminal activity is their day job disguised as normal work. | Institutional investigator. Assigned to the district on a routine case — or so it seems. |
| **Emotional starting state** | Comfortable but wary. This is home, these are friends, and the operation runs smoothly. | Professional and detached. This is an assignment, these are subjects. |
| **Relationship to the district** | Insider. Knows the rhythms, the shortcuts, who to avoid, who to trust. | Outsider. Reads the district through case files and institutional briefings. |
| **What they notice first** | People out of place. Routine disruptions. New faces. Things that threaten the operation. | Patterns. Inconsistencies. Things that don't match the official record. |
| **What they miss** | The institutional perspective — how this district looks from the outside, how exposed the operation actually is. | The human perspective — why people do what they do, what desperation drives the smuggling. |
| **Internal monologue voice** | Casual, sardonic, street-smart. Uses nicknames. Thinks in terms of loyalty and risk. *"Kael's late again. Third time this week. That's how people get noticed."* | Precise, observational, controlled. Uses titles and descriptions. Thinks in terms of evidence and procedure. *"Dock worker, second shift. Arrived 12 minutes late. Noted."* |
| **Relationship default** | Trust is earned through shared risk. New people are threats until proven otherwise. | Trust is institutional. Credentials open doors. Personal trust is a vulnerability. |
**Part 2: The Dual-Lens Rule**
Every piece of content must pass this test: **Does it read differently through each lens?**
This doesn't mean every line needs two versions. It means every *situation* must have two interpretations. The same NPC behavior, the same location detail, the same overheard conversation should mean something different to each character.
**Example — An NPC arriving late to work:**
- **Smuggler sees:** A colleague whose reliability is slipping. Threat assessment — are they getting sloppy? Are they being watched? Should I cover for them?
- **Detective sees:** A data point. Late arrivals correlate with... what? Worth monitoring. File it.
**Example — A locked room in the logistics hub:**
- **Smuggler knows:** That's where the high-value cargo gets repackaged. Stay out unless it's your shift.
- **Detective wonders:** Restricted area, no manifest entries matching this space. What's in there?
**Part 3: Access Tier Mapping**
For each NPC role in each template, define the access tier per character:
| NPC Role | Smuggler Access | Detective Access |
|----------|----------------|-----------------|
| Hub shift supervisor | Insider (colleague) | Authority (subject of inquiry) |
| Bar owner | Peer (regular customer) | Outsider (new face, no rapport) |
| Smuggling ring leader | Insider (direct report) | Unknown (doesn't know this person exists yet) |
| Dockworker (flat NPC) | Insider (coworker) | Outsider (background figure) |
| Off-duty security officer | Peer (bar acquaintance) | Peer (professional courtesy) |
This table drives Layer 1 of the dialogue system (D-028): which lines each NPC will say to each character from minute one.
**Part 4: Divergence Escalation Curve**
The two experiences should start slightly different and diverge over time:
| Phase | Time Window | Smuggler Experience | Detective Experience | Divergence Level |
|-------|-------------|--------------------|--------------------|-----------------|
| **Arrival** | 0-5 min | Routine start. Greetings from colleagues. Comfortable. | Orientation. Reading the space. Nobody knows you. | Low — both just walking around |
| **Daily life** | 5-15 min | Work shifts, bar visits, social rhythms. The operation hums in the background. | Observation, casual conversations, building a mental map. Small inconsistencies accumulate. | Medium — same NPCs, different relationships |
| **Tension** | 15-25 min | Something is off. A colleague is nervous. New faces at the hub. The detective is asking questions. | Patterns emerge. Someone is lying. The district's rhythms have a hidden frequency. | High — both noticing the same disruption from opposite sides |
| **Crisis point** | 25-30 min | The operation is at risk. Loyalty demands action. | Evidence points somewhere specific. The case demands action. | Maximum — both heading toward the same event from opposite directions |
**Part 5: Authoring Checklist**
For every content piece (NPC profile, dialogue line, location description, monologue trigger), the author must answer:
1. Does the smuggler interpret this differently than the detective?
2. If yes, is the difference in *access* (they know different things), *interpretation* (they read the same thing differently), or *emotional weight* (the same information means more to one)?
3. If no, why not? (Some things are character-neutral — the bar serves drinks regardless. That's fine. But be deliberate about it.)
**Is this a solo document or workshop output?**
I should write the first draft. It's a narrative architecture document — the structure of how two perspectives coexist. But it needs input from:
- **Mellanie** — to validate that the voice profiles are writable and the checklist is usable
- **Gestalt** — to validate that the access tier mapping aligns with the dialogue system mechanics
- **Miri** — to validate that the station setting supports the divergence curve
Proposed workflow: I write a full draft, the team reviews in Round 2, Mellanie and I iterate until she can use it as her authoring bible.
---
### Question 2: How do you define "divergent starting knowledge" (#182)?
Not a list of facts. A list of facts is inert — it doesn't generate gameplay. Divergent starting knowledge is a **structural asymmetry in how the character understands the world.**
**Three dimensions of starting knowledge:**
**1. Factual knowledge — what you know is true**
| Category | Smuggler Knows | Detective Knows |
|----------|---------------|-----------------|
| **People** | Names, nicknames, personal details of all logistics hub workers + smuggling ring members. Bar regulars by face/habit. | Names and roles of institutional contacts. Case file subjects (partial, possibly outdated). District demographics from briefings. |
| **Places** | Layout of the hub including restricted areas. Hidden routes. Dead drops. Safe meeting spots. | Official district map. Registered businesses. Known gathering points from case history. |
| **Routines** | Shift schedules, break patterns, who drinks where, who avoids whom. The operation's timing. | Patrol routes. Shift change windows. Official facility hours. |
| **Relationships** | Who's sleeping with whom. Who owes whom. Who's reliable, who's cracking. The ring's hierarchy. | Chain of command. Informant network (if any). Known associates from prior cases. |
**2. Interpretive frameworks — how you read ambiguous information**
This is more important than facts. The smuggler and detective don't just know different things — they *think differently*.
- **Smuggler's framework:** "Is this a threat to the operation?" Every new person, every unusual event, every authority figure is evaluated through this lens. The smuggler's paranoia is functional — it's kept them alive.
- **Detective's framework:** "Does this fit the pattern?" Every behavior, every routine deviation, every nervous glance is evaluated against a mental model of normal-vs-suspicious. The detective's analytical distance is professional — it's how they build cases.
These frameworks should be encoded as **monologue biases**. When the smuggler sees an ambiguous situation, the monologue leans toward threat assessment. When the detective sees the same situation, the monologue leans toward pattern analysis. Same stimulus, different interpretation, different suggested actions.
**3. Emotional knowledge — what you feel about what you know**
The smuggler doesn't just know the ring leader — they have feelings about them. Loyalty, fear, respect, resentment. These emotional weights on relationships determine which NPCs the smuggler protects, which they resent, which they'd sacrifice.
The detective doesn't just know the case file — they have feelings about the assignment. Ambition, boredom, duty, skepticism. These emotional weights on the investigation determine how aggressively they pursue leads, whether they bend rules, whether they start to sympathize with the people they're investigating.
**Implementation proposal for #182:**
Divergent starting knowledge is delivered through three ECS components per character:
1. **KnowledgeInventory** — list of known facts, tagged by source (personal experience, case file, rumor). Each fact has a confidence level and emotional weight.
2. **InterpretiveFramework** — set of biases that weight monologue generation. The smuggler's framework flags authority-related observations; the detective's flags pattern-related observations.
3. **RelationshipMap** — starting relationships with all known NPCs, including emotional valence (trust, fear, loyalty, professional respect, suspicion) not just access tier.
These three components together produce the starting divergence. Facts make you know different things. Frameworks make you interpret the same things differently. Emotional weights make you care about different things.
---
## Layer 3: Station District Setting
### Question 2: How does the station's character feed into NPC motivations?
The honest truth is that a station district's economic and social pressures are the *engine* that generates NPC motivations. NPCs don't exist in isolation — they exist in an economic ecosystem that creates the conditions for both ordinary life and criminal enterprise.
**The motivational chain:**
```
Station Economics → Employment Pressure → Individual Desperation → Criminal Opportunity → Social Complicity
```
Let me make this concrete with a proposal for how the v0.1 station district generates NPC motivations:
**The district's economic reality:** This is a logistics hub — goods flow through. The legitimate economy provides steady but modest work. The cost of living on the station is slightly too high for comfort on a single logistics salary. This creates a permanent mild financial pressure on the working population.
**How this generates motivations:**
| NPC Type | Economic Pressure | Resulting Motivation | Smuggling Connection |
|----------|------------------|---------------------|---------------------|
| **Logistics worker (flat)** | Paycheck covers rent but not much else | Contentment axis: moderate-low. Wants stability, not risk. | Aware something happens at the hub after hours. Doesn't ask questions. |
| **Logistics worker (triangle)** | Partner's medical debt, child's school fees | Want: financial relief. Secret: knows about the smuggling, tempted to participate. | The smuggling ring is a lifeline they haven't taken yet. The triangle: should they? Their partner suspects something. |
| **Bar owner (triangle)** | Business is marginal. The after-hours crowd is what keeps the lights on. | Want: keep the bar viable. Secret: knows the bar is a meeting point for the ring. | Complicit through inaction. Doesn't ask what the back room is used for. The triangle: the bar owner's employee is getting curious. |
| **Ring member (entangled)** | Started as a logistics worker who said yes. Now in too deep. | Want: get out without getting caught. Secret: considering cooperation with authorities. | The detective's potential informant. The smuggler's potential betrayer. The cross-template triangle. |
| **Security officer (triangle)** | Underpaid. Sees things. Faces a choice every shift. | Want: do the right thing, or at least not the wrong thing. Tolerance: how much can they ignore? | The mundane triangle: the security officer, the logistics supervisor who schedules the off-hour shifts, and the bar owner who provides the alibi drinks. |
**The key insight:** Economic pressure doesn't just explain why smuggling exists — it explains why the *community* tolerates it. The bar owner looks the other way because the smugglers keep the bar profitable. The flat NPCs don't ask questions because they benefit from the economic activity without getting their hands dirty. The detective enters a community where everyone has a reason to not cooperate — not because they're villains, but because the smuggling economy is the district's immune system against poverty.
This is what makes the detective's job hard and the smuggler's moral position sympathetic. The station's economic character turns smuggling from a crime into a *community survival strategy*. That's the narrative engine.
**What Miri's setting document needs from this perspective:**
1. The economic squeeze — what makes legitimate life just hard enough to justify risk
2. The interdependencies — who benefits from the grey economy even without participating
3. The recent pressure point — what changed recently that's making the situation unstable (this becomes the storyteller's activation trigger)
---
## Layer 4: Content Pipeline & Authoring Format
Not directly asked, but I have a critical dependency on this layer.
**My concern:** The four dialogue layers (D-028) need to be expressible in whatever format Gestalt proposes. Specifically:
- **Access tier** must be a per-line tag, because the same NPC says different things to insiders vs. outsiders vs. authority figures. This is Layer 1 of dialogue and the primary dual-lens mechanism.
- **Relationship history** needs a way to reference prior interaction states. A line tagged `greeted_before:true` reads differently than `greeted_before:false`. This is Layer 2 and drives the feeling of continuity.
- **Trust tier** must gate disclosure content. The same NPC has surface/real/secret versions of the same topic. This is Layer 3 and the mechanism for progressive revelation.
- **Unprompted** lines need mood and situational context tags. An NPC who volunteers information is driven by their current emotional state + the current situation. This is Layer 4 and the mechanism for NPC initiative.
Whatever format Gestalt proposes, I need to verify that all four layers can be expressed as line-level metadata. If they can't, the content packs will be flat — just access-filtered greeting pools with no depth.
---
## Layer 5: Template Content (3 Social Sites)
### Question 2: How do you design the relationship web for 3 overlapping social sites?
The relationship web is the narrative infrastructure of the vertical slice. Without it, 15 NPCs are 15 independent actors. With it, they're a community — interconnected, mutually dependent, full of tensions that the player can discover and exploit.
**Design principles:**
1. **Every NPC has at least 2 relationships that matter** — one within their home template, one that connects to another template. No NPC is an island.
2. **Bridge NPCs connect templates** — some NPCs have roles in multiple social sites. These are the most important characters because they carry information (and tension) between worlds.
3. **The relationship web has layers** — surface (visible to everyone), working (visible to insiders), and hidden (visible only through investigation or trust).
**Proposed relationship web for v0.1 (15 NPCs across 3 templates):**
**Template 1: Logistics Hub (Workplace) — 5 NPCs**
| Role | Name Placeholder | Key Relationships |
|------|-----------------|-------------------|
| **Shift Supervisor** | NPC-A | Manages hub workers. Knows about the smuggling (looks away). Secret: taking a cut. |
| **Logistics Worker 1** | NPC-B | Smuggler's close colleague. Reliable ring member. The smuggler's anchor. |
| **Logistics Worker 2** | NPC-C | New hire. Curious. Asks questions they shouldn't. Triangle: B protects them, A wants them gone. |
| **Dock Inspector** | NPC-D | Legitimate authority. Bridge NPC: drinks at the bar after shifts. Secret: gambling debt makes them compromisable. |
| **Maintenance Tech** | NPC-E | Flat NPC. Fixes things, notices things, says nothing. Background presence that establishes normalcy. |
**Template 2: Bar (Social Venue) — 5 NPCs**
| Role | Name Placeholder | Key Relationships |
|------|-----------------|-------------------|
| **Bar Owner** | NPC-F | Knows everyone. Bridge NPC: supplies from the logistics hub. Complicit through willful ignorance. |
| **Regular (off-duty security)** | NPC-G | Bridge NPC: patrols the hub district during shifts, drinks at the bar after. Mundane triangle: F and G and D play cards — D owes G money, G pressures D, D considers compromising an inspection. |
| **Regular (teacher/family person)** | NPC-H | The most normal person in the district. Mundane triangle: H's partner works at the hub (NPC-B). H doesn't know what B does after hours. H represents what's at stake — ordinary life that smuggling protects and endangers. |
| **Bartender** | NPC-I | Flat NPC. Observant but discreet. Serves drinks, overhears everything, tells nothing. Source of ambient gossip if trust is built. |
| **Drifter/New Arrival** | NPC-J | Flat NPC but narratively loaded: new in the district, asking around for work. Could be innocent. Could be a rival operation's scout. Could be an undercover agent. The ambiguity is the point — the smuggler and detective read this person differently. |
**Template 3: Smuggling Ring (Criminal) — 5 NPCs**
| Role | Name Placeholder | Key Relationships |
|------|-----------------|-------------------|
| **Ring Leader** | NPC-K | The person the detective is ultimately looking for (without knowing it). Bridge NPC: legitimate business front at the bar. Public face is respectable. |
| **Courier** | NPC-L | Moves product. Bridge NPC: uses the logistics hub's infrastructure. Triangle with B and K: B arranges access, K gives orders, L takes the physical risk. |
| **Fence/Buyer** | NPC-M | External contact. Not from this district. Appears occasionally. The smuggler knows them; the detective has never seen them. |
| **Ring Member (wavering)** | NPC-N | The potential informant. Triangle with K and A: K demands loyalty, A applies pressure, N is cracking under the tolerance threshold. The detective's unknowing target. The smuggler's biggest worry. |
| **Lookout/Runner** | NPC-O | Flat NPC. Young, nervous, stationed at strategic positions. Visible to both characters — the smuggler knows why they're there, the detective reads them as loitering youths. |
**Bridge NPCs (connecting templates):**
| NPC | Home Template | Connected To | Bridge Function |
|-----|--------------|-------------|-----------------|
| **NPC-D** (Dock Inspector) | Hub | Bar | Professional life at hub, social life at bar. Information flows between worlds. |
| **NPC-G** (Security Officer) | Bar | Hub | Social at bar, authority at hub. Sees things in both contexts. |
| **NPC-K** (Ring Leader) | Ring | Bar | Criminal at ring, legitimate at bar. Public face conceals operation. |
| **NPC-L** (Courier) | Ring | Hub | Criminal at ring, logistics at hub. Physical movement connects sites. |
| **NPC-B** (Logistics Worker) | Hub | Ring | Day job at hub, ring member after hours. The smuggler's closest colleague. |
| **NPC-H's partner** | Bar | Hub | (Not a separate NPC — NPC-H references NPC-B's hub role.) |
The web has **6 bridge connections** across 3 templates, meaning information, tension, and consequences can propagate in multiple directions.
---
### Question 3: How many triangles per template? What do they look like concretely?
D-029 requires 2 per template minimum + 1 cross-template. For v0.1, I propose **7 triangles total**: 2 per template (6) + 1 cross-template.
**Intra-template triangles (6):**
**Hub Triangle 1 — The New Hire Problem (B-C-A)**
- **B** (loyal ring member) wants to protect **C** (curious new hire) from learning too much
- **A** (shift supervisor taking a cut) wants **C** removed before they see something
- **C** just wants to do their job but keeps noticing locked rooms and irregular schedules
- **Player relevance:** The smuggler has to choose between B's protective instinct and A's pragmatism. The detective notices C asking questions and wonders why B is so protective.
**Hub Triangle 2 — The Inspection Squeeze (A-D-K)**
- **A** (supervisor) needs inspections to go smoothly
- **D** (dock inspector) has a gambling debt and is being pressured
- **K** (ring leader, acting through intermediaries) is the source of the pressure
- **Player relevance:** The smuggler knows the inspection schedule is managed. The detective sees D's nervousness and smells corruption.
**Bar Triangle 1 — The Card Game Debt (D-G-F)**
- **D** (dock inspector) owes money from the weekly card game
- **G** (security officer) holds the debt and pushes for favors in return
- **F** (bar owner) facilitates the card games and profits from the arrangement
- **Player relevance:** Mundane triangle. No conspiracy connection. But the debt creates leverage that the smuggling ring exploits, and the detective might misread as conspiracy when it's just gambling. Red herring potential.
**Bar Triangle 2 — The Worried Partner (H-B-F)**
- **H** knows their partner **B** has been working late and spending more
- **H** confides in **F** (bar owner), who knows exactly why B is busy but won't say
- **F** reassures **H** while protecting the operation's secrecy
- **Player relevance:** The most emotionally loaded mundane triangle. H's worry is genuine. F's reassurance is a lie of omission. B is oblivious to the anxiety they're causing. The detective who earns H's trust might hear the first honest account of B's behavioral changes.
**Ring Triangle 1 — The Wavering Member (K-N-L)**
- **K** (ring leader) demands total loyalty from **N** (wavering member)
- **N** is considering cooperation with authorities — terrified of both sides
- **L** (courier) suspects N is unreliable and has told K as much
- **Player relevance:** The highest-stakes triangle. The smuggler knows N is shaky and must decide whether to support them or report them to K. The detective doesn't know N exists yet but will find them through investigation.
**Ring Triangle 2 — The Power Dynamic (K-A-B)**
- **K** (ring leader) gives orders through **A** (supervisor, the legitimate front)
- **A** resents taking orders but needs the money
- **B** (loyal to the smuggler/the team, not to K personally) would side against K if pushed
- **Player relevance:** Internal ring politics. The smuggler navigates this hierarchy daily. The detective, if they crack the ring, would exploit these fissures.
**Cross-template triangle (1):**
**The Big One — The Informant Question (N-D-G)**
- **N** (wavering ring member) is considering talking
- **D** (dock inspector) is compromised but might flip if pressured correctly
- **G** (security officer) has the institutional authority to act but doesn't know what they'd act on
- These three people, across all three templates, represent the three ways the ring could unravel: from inside (N betrays), from institutional corruption (D breaks), or from legitimate authority (G stumbles onto something)
- **Player relevance:** The smuggler wants to prevent all three. The detective, unknowingly, is pushing toward all three. The convergence of this triangle IS the crisis point of the vertical slice.
**Triangle distribution by entanglement:**
| Category | Triangles | D-029 Split |
|----------|-----------|-------------|
| Flat NPCs (no triangle involvement) | — | E, I, O = 3 NPCs (20%) |
| Mundane triangles (no conspiracy) | Card Game Debt, Worried Partner | 7 NPCs in mundane-only roles (~47%) |
| Entangled triangles (conspiracy-connected) | New Hire, Inspection, Wavering Member, Power Dynamic, Cross-template | 5 NPCs with conspiracy connection (~33%) |
This skews slightly higher on entanglement than the 30/50/20 target (D-029), but the v0.1 district is small and needs to prove the concept. In a full game, the ratio would normalize with many more flat and mundane NPCs. For the vertical slice, we need enough entanglement to create discoverable conspiracy threads.
---
## Layer 6: NPC Profiles & Dialogue
### Question 1: How deep does each NPC profile need to be?
Let me complicate this by separating what the *system* needs from what the *authors* need.
**What the system needs (ECS data):**
All 10 axes per D-024, populated as numeric values or enums. The system doesn't read backstory — it reads component data. This is the minimum: a fully populated NPC generation output.
**What the authors need (creative brief):**
The 10 axes are a skeleton. Mellanie can't write voice-consistent dialogue from a skeleton. She needs flesh.
**Proposed three-tier NPC profile depth:**
**Tier 1: Full profile (entangled NPCs — 5 NPCs: A, B, K, L, N)**
| Section | Contents | Length |
|---------|----------|--------|
| 10-axis data | All axes populated with values and brief justification | ~20 lines |
| Backstory paragraph | How they got here, what shaped them, what they're hiding | 3-5 sentences |
| Voice sample | 3-5 example lines in their voice, covering different moods | 3-5 lines |
| Dual-lens notes | How the smuggler sees them vs. how the detective sees them | 2-3 sentences per lens |
| Triangle role notes | Their function in each triangle they participate in, what pressures they face | 2-3 sentences per triangle |
| Secret | What they're hiding, from whom, and what would happen if it came out | 2-3 sentences |
Total per NPC: ~1 page. For 5 entangled NPCs: ~5 pages.
**Tier 2: Working profile (triangle NPCs, non-entangled — 7 NPCs: C, D, F, G, H, M, O)**
Wait — let me reconsider. O is flat. M is external. Let me re-sort.
Triangle-involved but not conspiracy-entangled: C, D, F, G, H = 5 NPCs.
| Section | Contents | Length |
|---------|----------|--------|
| 10-axis data | All axes populated | ~15 lines |
| Voice sample | 2-3 example lines | 2-3 lines |
| Dual-lens notes | Brief note on each character's perspective | 1-2 sentences per lens |
| Triangle role notes | Their function in their triangle(s) | 1-2 sentences |
Total per NPC: ~half page. For 5 triangle NPCs: ~2.5 pages.
**Tier 3: Sketch profile (flat NPCs — 5 NPCs: E, I, J, M, O)**
| Section | Contents | Length |
|---------|----------|--------|
| 10-axis data | Essential axes only (Want, Routine, Personality) | ~8 lines |
| Voice hint | 1 line that captures their energy | 1 line |
| Function note | Why they exist in the world, what role they serve for atmosphere | 1-2 sentences |
Total per NPC: ~quarter page. For 5 flat NPCs: ~1.25 pages.
**Grand total: ~8.75 pages of NPC profiles** for the entire v0.1 cast. This is a manageable authoring load. I'd write Tier 1 profiles (the narrative architecture). Mellanie takes them and writes the voice kits and dialogue. Miri validates cultural/setting consistency.
---
## Layer 7: Monologue & Observation Text
### Question 3: What are the "mirror moments"?
Mirror moments are the places where the monologue hints — without breaking character — that this situation looks completely different from another perspective. They're not fourth-wall breaks. They're moments where the character's *own thoughts* inadvertently reveal the existence of an alternate interpretation.
**The principle:** A mirror moment occurs when the character's certainty about something is, from the other character's perspective, obviously wrong — and the monologue's confidence IS the tell.
**Concrete mirror moments for v0.1:**
**Mirror 1: The Smuggler's Comfort**
- **Smuggler monologue:** *"Same shift, same faces. At least I know where I stand here."*
- **What the detective would see:** A logistics hub where "same faces" means a closed social network resistant to outside inquiry. The comfort IS the suspicion.
- **Design note:** This plays in the first 5 minutes. It establishes the smuggler's world as normal and inviting. Only on the detective's playthrough does the player realize that "knowing where you stand" is exactly what makes the smuggling possible.
**Mirror 2: The Detective's Read**
- **Detective monologue:** *"The dock inspector keeps glancing at the supervisor's office. Anxiety? Guilt? Worth noting."*
- **What the smuggler would know:** D owes money from the card game and A has been riding them about inspection schedules. It's not guilt — it's stress about completely mundane workplace pressure. Or is it? The smuggler knows the mundane explanation but the detective's suspicion isn't *wrong* — D IS compromised, just not in the way the detective thinks.
- **Design note:** This plays mid-session. It shows the detective building a theory from observation — a theory that's simultaneously correct and incorrect.
**Mirror 3: The Worried Partner**
- **Smuggler monologue (at the bar):** *"H looks tired. I should probably not mention seeing B at the hub so late — that's B's business."*
- **Detective monologue (at the bar):** *"Spouse of a hub worker. Looks stressed. Might know something about after-hours activity."*
- **Design note:** Same person, same moment. The smuggler sees a friend they're protecting from the truth. The detective sees a potential source. The player who's played both characters recognizes the tragic irony — H is caught between two people who both think they're acting in H's interest.
**Mirror 4: The Empty Corridor**
- **Smuggler monologue (passing a corridor late at night):** *"Quiet tonight. Good. Nobody using the south access."*
- **Detective monologue (same corridor, same time):** *"This corridor should see foot traffic — logistics staff use it for the night shift changeover. Why is it empty?"*
- **Design note:** The smuggler's relief IS the detective's clue. The corridor is empty because the smuggling operation rerouted traffic. The smuggler knows this and is grateful. The detective doesn't know but senses something is wrong.
**Mirror 5: The New Face**
- **Smuggler monologue (seeing NPC-J the drifter):** *"New face at the bar. Don't recognize them. Probably nothing, but... keep an eye out."*
- **Detective monologue (seeing NPC-J):** *"New arrival in the district. Looking for work, they say. Could be useful — fresh perspective, no local loyalties yet."*
- **Design note:** The smuggler sees a potential threat. The detective sees a potential asset. Both are evaluating the same stranger through opposing frameworks. On replay, the player recognizes the irony — neither is wrong, and both reactions reveal their character.
**How mirror moments are authored:**
Mirror moments are NOT scripted paired events. They're **monologue lines tagged to the same observation trigger** but filtered through different character frameworks. The system requirements:
1. An observation trigger (NPC behavior, environmental state, routine deviation)
2. Two monologue line variants tagged to the same trigger, one per character
3. The lines must be independently coherent — each works on its own without the other
4. The mirror quality only emerges on replay, when the player remembers the other character's reaction
**Authoring volume estimate:** I'd target **10-15 mirror moments** for the v0.1 vertical slice. Not every observation needs a mirror — that would feel forced. But 10-15 well-placed mirrors across 30 minutes means the replay playthrough produces a revelation roughly every 2-3 minutes. That's the rhythm of "oh, THAT'S what that was about" that makes the second playthrough compelling.
---
## Layer 8: UI Text & Environmental Content
Not directly asked, but I have a narrative-critical input.
**The neural insert must reflect character identity.** If both characters see the same HUD, the diegetic fiction breaks. The smuggler's insert might show:
- Known associate locations (social map)
- Delivery schedules and routes
- Informal warnings ("avoid sector 7 — patrol activity")
The detective's insert might show:
- Case file markers (suspect locations, evidence flags)
- Institutional alerts
- Formal status reports ("Subject B: routine deviation detected")
This is a **dual-lens question** — the insert IS the character's window into the world. Even in v0.1 with minimal HUD, the insert text should feel different per character.
---
## Layer 9: Audio Direction
Not my domain, but one narrative note: **silence is a monologue trigger.** The three-range sound model (D-018) means that close range provides rich audio. But when the player is alone in a quiet space, the *absence* of sound should trigger monologue. The character thinks when the world is quiet. This means the monologue system and the sound system need to coordinate — monologue fires more frequently when the audio environment is sparse, and less frequently when it's rich.
This has a dual-lens application: the smuggler alone in a quiet corridor thinks *"Too quiet. Something's off."* The detective alone in the same corridor thinks *"Good. Time to think."* Same silence, different interpretation.
---
## Cross-Layer Dependencies: The Seams That Matter
The workshop's layer structure is useful for organizing work, but the content gaps I'm most worried about live between layers:
| Dependency | From Layer | To Layer | Why It Matters |
|-----------|-----------|---------|---------------|
| Dual Lens Guide must precede all content | 2 | 4, 5, 6, 7 | Every content author needs the guide before writing. Without it, content will be single-perspective and need rewriting. |
| Access tier mapping drives dialogue format | 2 | 4 | The authoring format must support per-character access tiers on every line. If the format can't express "this line is for insiders only," the dual-lens system collapses. |
| Station economics drive NPC motivations | 3 | 5, 6 | NPC profiles can't be written without understanding the economic pressures that shape their choices. Miri's setting document feeds Paula's relationship web feeds Mellanie's dialogue. |
| Relationship web drives content packs | 5 | 5 (internal) | Content packs for each template can't be written independently — the bridge NPCs and cross-template triangles create dependencies between all three packs. |
| Mirror moments require authoring format | 7 | 4 | The format must support tagging the same observation trigger with character-specific monologue variants. If it can't, mirror moments are impossible to author systematically. |
| NPC profiles drive voice kits | 6 | 5 | Mellanie writes voice kits from NPC profiles. Profiles must exist before dialogue. |
**Proposed dependency chain for content work:**
```
1. Station setting document (Miri) — Layer 3
2. Dual Lens Authoring Guide (Paula) — Layer 2
3. Relationship web + triangles (Paula) — Layer 5
4. NPC profiles: Tier 1 entangled (Paula) + Tier 2/3 (Paula+Mellanie) — Layer 6
5. Authoring format locked (Gestalt) — Layer 4
6. Content packs: voice kits, situation scripts, monologue lines (Mellanie) — Layer 5 + 7
7. Mirror moment pass (Paula reviews Mellanie's monologue for mirror opportunities) — Layer 7
```
Steps 1-4 are narrative architecture. Steps 5-7 are content production. The architecture must be done before production starts, or we'll be rewriting content to fit a structure that didn't exist when it was written.
---
## Summary: What I Need To Deliver
| Deliverable | Layer | Depends On | Estimated Effort |
|-------------|-------|-----------|-----------------|
| Dual Lens Authoring Guide (full draft) | 2 | Nothing — can start now | 2-3 days |
| Divergent starting knowledge specification | 2 | Setting document (Miri) | 1-2 days |
| Relationship web for 15 NPCs | 5 | Setting document (Miri) | 1-2 days |
| Triangle definitions (7 triangles) | 5 | Relationship web | 1 day |
| NPC profiles: Tier 1 (5 entangled) | 6 | Relationship web + triangles | 2-3 days |
| NPC profiles: Tier 2 (5 triangle) | 6 | Tier 1 profiles | 1-2 days |
| NPC profiles: Tier 3 (5 flat) | 6 | Setting document | 1 day |
| Mirror moment design (10-15 moments) | 7 | All NPC profiles + Dual Lens Guide | 1-2 days |
| Review pass on Mellanie's content packs | 5+7 | Mellanie's draft packs | Ongoing |
The Dual Lens Guide is my first and most critical deliverable. Everything downstream depends on it.
@@ -1,568 +0,0 @@
# Round 2 Workshop Response: Araminta (Visual Design Synthesis)
**Agent:** Araminta (Visual Designer)
**Date:** 2026-02-11
**Round:** 2 (Synthesis)
**Inputs:** All 6 Round 1 outputs + project lead direction
---
## Project Lead Directives Acknowledged
1. **Color = relationship to player: APPROVED.** This is now the confirmed v0.1 color model. No more hedging.
2. **Audio in v0.1 scope (6-8 files).** Visual sound indicators are complementary, not the sole mechanism. My indicator design can be subtler now -- it confirms audio, not replaces it.
3. **THE FRIEND -- one per character, production-level complex.** Visual implications addressed in section 6.
4. **Wiki structure with full taxonomy -- non-negotiable.** Visual asset taxonomy included in section 7.
5. **Sova Transit District / Krenn System is concrete.** All visual proposals now grounded in Miri's Sova setting.
---
## What I Learned from Round 1 (All Six Responses)
Three things crystallized:
1. **Text carries the game.** Mellanie, Paula, and Miri all confirmed what D-014 and D-016 implied: at v0.1 fidelity, written content does 80%+ of atmosphere and information delivery. My visual design must *support* text, not compete with it. Every pixel I spec is either making text more readable, making game state more scannable, or getting out of the way.
2. **The insert is character-specific.** Paula proposed that the smuggler's and detective's inserts show different information categories -- social map vs. analytical overlay. Miri confirmed this with setting logic: the smuggler has a baseline lattice (less data), the detective has an augmented lattice (more data, institutional feeds). This changes my insert wireframe from "one HUD, two characters" to "one HUD framework, two information profiles."
3. **Spatial design is load-bearing.** Paula's relationship web (15 NPCs, 7 triangles, 6 bridge connections) and Gestalt's spatial requirements (chokepoints, public/private gradients, observation positions) make spatial layouts the most important visual deliverable. Room shapes serve sightline gameplay. Triangle dynamics need specific observation positions. These inputs make my spatial layouts functional, not decorative.
---
## 1. Missing Tickets for Visual/Art Direction Work
After reading all Round 1 outputs and cross-referencing the ticket system, here are the visual tickets that should exist:
### Critical (blocks other work)
| Ticket Title | Priority | Depends On | Blocks | Rationale |
|---|---|---|---|---|
| **v0.1 Visual Grammar Document** | Critical | Workshop conclusion | All visual implementation, spatial layouts, entity rendering | Root dependency. Codifies color palette, entity sizing, label rules, UI layers, fog rendering. One page. Everything visual hangs off this. |
| **Entity Color System Spec -- Relationship-to-Player Mapping** | Critical | Visual Grammar | NPC rendering, fog rendering, client renderer | The approved color model needs a formal spec: which relationship states map to which colors, how transitions animate, edge cases (NPC relationship changes mid-observation). |
### High Priority
| Ticket Title | Priority | Depends On | Blocks | Rationale |
|---|---|---|---|---|
| **Spatial Layout: Sova Logistics Hub ("The Terminal")** | High | Visual Grammar, Miri's setting | Content pack #190, sightline implementation | Tile-level floor plan with sightline analysis. Miri's Round 1 gives me the zones. I can now design concretely. |
| **Spatial Layout: Sova Bar ("The Last Shift")** | High | Visual Grammar, Miri's setting | Content pack #191, sightline implementation | Irregular layout with privacy pockets, corner booth as key location. |
| **Spatial Layout: Sova Transition Corridors + Smuggling Spaces** | High | Visual Grammar, Miri's setting | Content pack #192, sightline implementation | Maintenance corridors, repurposed storage, hidden spaces within the 40-year-old station structure. |
| **Insert/HUD Wireframe and Spec** | High | Visual Grammar | Insert implementation, UI rendering | The lattice overlay design. Includes dual-character variants (smuggler's social map vs. detective's case file overlay). |
| **Monologue Display System Visual Spec** | High | Visual Grammar | Monologue renderer, text system | Typography, positioning, fade animation, stacking rules, character voice differentiation. Mellanie's 900+ lines need a rendering pipeline. |
| **Text Display Hierarchy Spec** | High | Visual Grammar | All text rendering | How dialogue, monologue, observation, overheard conversation, and environmental text each render distinctly. Four pipelines, four visual treatments. |
| **Sound Indicator Visual Design** | High | Visual Grammar, audio scope | Medium-range sound system | Fog-edge pulse indicators. Complementary to audio, not replacement. |
| **THE FRIEND -- Visual Treatment Spec** | High | NPC profiles (Paula), Visual Grammar | THE FRIEND NPC rendering | Production-level visual differentiation for one NPC per character. See section 6. |
### Medium Priority
| Ticket Title | Priority | Depends On | Blocks | Rationale |
|---|---|---|---|---|
| **Visual Asset Taxonomy (Wiki Structure)** | Medium | Visual Grammar | Future asset pipeline, wiki | Directory structure, naming conventions, category definitions. Future-ready per project lead directive. |
| **Fog Rendering Visual Spec** | Medium | Visual Grammar | Fog system implementation | Four-state rendering (visible, fog-edge, hidden, remembered). |
| **Environmental Text Visual Standards** | Medium | Visual Grammar, Miri's setting | Environmental text rendering | How signage, terminals, news tickers render in-world. Bilingual treatment per Miri. |
| **Signature Visual Element -- Span Gate Glow** | Medium | Miri's setting | First-impression visual | Ozzie's "one thing that says space station." See section 2. |
**Total new tickets proposed: 13.** 2 critical, 8 high, 4 medium. This is the complete visual work scope for v0.1.
---
## 2. Refined v0.1 Art Direction Proposal
Round 1 proposed "readable information design, atmosphere through text and spatial composition." Round 2 refines this with Miri's Sova setting and Ozzie's mood requirements.
### The Visual Identity of Sova Transit District
Miri's setting brief tells me exactly what this place looks like: mid-Reach, 40 years old, prefab modular construction modified over decades. Institutional corridors near the gate terminal transitioning to older, warmer spaces toward the residential boundary. "Functional prosperity" -- not dystopian, not utopian. A working port.
**This translates to three visual zones with distinct palettes:**
#### Zone 1: Gate Terminal / Logistics Hub ("The Terminal")
The institutional face of Sova. Clean, regulated, functional.
| Element | Color | Hex | Rationale |
|---|---|---|---|
| Floor | Cool grey-navy | `#1e1e32` | Institutional flooring. Blue-tinted. |
| Walls | Cool slate | `#2e2e48` | Clean, maintained surfaces. |
| Lighting tint | Cool white | `#d8e0f0` at 15% overlay | Fluorescent institutional lighting. Bright, slightly harsh. |
| Equipment/furniture | Darker grey | `#222233` | Grav-lifts, terminals, workstations. Functional. |
| Restricted areas | Slightly darker floor | `#1a1a2e` | Subtle but perceptible. Private spaces are darker. |
#### Zone 2: Bar District / "The Last Shift"
The social heart. Warmer, older construction, personality.
| Element | Color | Hex | Rationale |
|---|---|---|---|
| Floor | Warm dark | `#221e28` | Older materials. Warmer tones. |
| Walls | Warm grey | `#342e38` | Aged, repaired, character. |
| Lighting tint | Amber-warm | `#e8c070` at 10% overlay | Cheaper, warmer fixtures. Inviting. |
| Bar counter/furniture | Dark warm tone | `#2a2018` | Solid, well-worn. |
| Corner booth | Slightly darker | `#1e1a18` | The semi-private space. Visually recessed. |
#### Zone 3: Corridors / Maintenance / Smuggling Spaces
The in-between. Older construction, poorer lighting, architectural secrets.
| Element | Color | Hex | Rationale |
|---|---|---|---|
| Floor | Neutral dark | `#18161e` | Transitional. Neither warm nor cool. |
| Walls | Varied | Mixed old/new sections | 40 years of modifications visible. Different wall tones = different construction eras. |
| Lighting tint | Dim, irregular | `#a0a0b0` at 8% overlay | Maintenance-level lighting. Gaps and shadows. |
| Hidden spaces | Near-black | `#12121a` | Sealed sections reopened, gaps between walls. Barely lit. |
**Transition gradient:** Walking from the logistics hub to the bar, the palette warms. Walking into a maintenance corridor, it goes flat and dark. No art needed -- just tile color variation. The player may not consciously notice but will *feel* the shift.
### Confirmed Entity Color Palette (Relationship-to-Player)
Project lead approved. Locked.
| Relationship State | Color | Hex | When |
|---|---|---|---|
| **Unknown/Neutral** | Cool teal | `#4a9ebb` | Default for NPCs the character hasn't assessed. |
| **Known/Friendly** | Soft green | `#6bc9a6` | People the character knows and trusts. |
| **Person of Interest** | Warm amber | `#e8c547` | Monologue or case file has flagged something. |
| **Hostile/Dangerous** | Muted red | `#d45d5d` | Character KNOWS there's danger. Subjective, not omniscient. |
| **Static objects** | Muted grey | `#8b8ba0` | Furniture, equipment, environmental elements. |
| **Player character** | Bright marker | `#e0e8ff` (detective) / `#e8e0d0` (smuggler) | Subtle warmth/coolness difference per character. |
**Key principle unchanged:** Red means danger TO YOUR CHARACTER, not danger in the abstract. The detective might see that same NPC as amber (flagged in case file) while the smuggler sees green (trusted colleague). Same NPC, different color, because asymmetric information drives the palette.
### Ozzie's Signature Element: The Span Gate Glow
Ozzie asked for "one thing that says space station." Miri's setting gives the answer: the span gate.
The span gate terminal sits at the district's edge. Its effects should be visible from the player's starting position.
**Proposal: The span gate glow.** A subtle, rhythmic light source visible through a viewport or structural gap near the starting area. Not dramatic sci-fi blue-plasma. A warm, deep amber-orange luminance that pulses with transit cycles. Miri says the span gate produces "a deep, subsonic vibration" -- visually, this translates to a gentle, rhythmic luminance shift. When the confirmed audio system plays the span gate hum, the visual pulse synchronizes.
Implementation cost: one animated light source with a viewport tile. It grounds the player in "space station near an active gate" within the first 5 seconds. It's also mechanically useful later -- changes in glow pattern (maintenance shutdown, increased traffic) become visual information.
### Character-Specific Insert Overlays
Paula and Miri both established the narrative logic: the smuggler has a baseline lattice, the detective has augmented. Ozzie wants the insert labels to reflect character perspective.
| Insert Element | Smuggler | Detective |
|---|---|---|
| **Tint** | `#3d7aaf` at 30% (consumer-grade) | `#3d7aaf` at 40% (institutional-grade, slightly denser) |
| **POI markers** | Social contacts as dots (color = relationship state), favorite spots as circles | Persons of interest as amber diamonds, evidence locations as squares, surveillance zones as faint boundary lines |
| **Labels** | Casual: "The Last Shift", "Kael's usual spot" | Institutional: "Licensed establishment - District 7", "POI: K. Davan" |
| **Notifications** | Informal: "Msg from Kael", "Drop point updated" | Commission format: "Case file update: Subject Davan", "Commission advisory" |
| **Grid overlay** | None (consumer-grade, no extras) | Faint 1-pixel grid at 3% opacity (analytical feel) |
**Implementation:** One insert system with a `lattice_profile` parameter. Stig builds one framework, not two. Character selection loads the appropriate profile.
---
## 3. Placeholder Art Pipeline Priorities
The question isn't "what art do we need" -- it's "in what order do we build the visual layers so each step is playable?"
### Four Phases
**Phase 1: Structural (blocks gameplay testing)**
- Tile-level floor plans for all three social sites
- Wall/door/furniture rectangles with correct proportions
- Fog rendering (visible/fog-edge/hidden/remembered)
- Entity rectangles with relationship colors
- Basic labels (NPC names, room names)
**Phase 2: Information (blocks content testing)**
- Insert/HUD overlay (minimap, POI markers, time display)
- Monologue text display (positioned, styled, animated)
- Dialogue panel (NPC name header, text area)
- Sound indicators at fog edge (pulse icons, complementary to audio)
- Environmental text (signs, terminals)
- News ticker display
**Phase 3: Atmosphere (blocks experience testing)**
- Zone-specific color palettes applied (three zones above)
- Lighting variation between locations
- Span gate signature visual element
- Character-specific insert variants
- Remembered-state fog (desaturated ghost)
- THE FRIEND visual treatment (color transition)
**Phase 4: Polish (pre-release quality)**
- Sprite replacements for entity rectangles (if v0.1 scope allows)
- Animated transitions (door opening, NPC movement smoothing)
- Particle effects (span gate glow, fog-edge shimmer)
- Visual tells for NPC behavioral states
- Full environmental detail (wall texture variation, construction-era differences)
**For v0.1 vertical slice: Phases 1-3 are required. Phase 4 is stretch.**
### Total Art Asset Count for v0.1
Approximately **zero image files.** Everything is procedural: colored rectangles, styled text, shader overlays. The "art pipeline" is a color configuration file plus spatial layout data.
This is deliberate. Zero image files means no asset loading latency, no sprite inconsistency, and no art-replacement migration when we move to real sprites. Stig and Dudley can build the full renderer without waiting on visual assets from me. My primary output is **documented specifications**, not image files.
---
## 4. Dependencies Between Visual Work and Content Work
### Content Teams Need from Me:
| Content Team | What They Need | My Deliverable | Urgency |
|---|---|---|---|
| **Mellanie** | Display constraints -- character limits per text type, line count, wrap rules | Text Display Hierarchy Spec + Monologue Spec | High -- she's writing to unknown constraints |
| **Mellanie** | Environmental text visual format | Environmental Text Visual Standards | Medium -- can write provisionally |
| **Paula** | Spatial layouts to validate sightline assumptions | Spatial Layouts (3 sites) | High -- her NPC positions must work spatially |
| **Miri** | Visual tone confirmation | Visual Grammar | Medium -- confirmation, not blocker |
### I Need from Content Teams:
| From | What I Need | Status |
|---|---|---|
| **Miri** | Station district setting brief | **DONE** (Round 1 Sova brief) |
| **Paula** | NPC relationship web | **DONE** (Round 1, 15 NPCs, 7 triangles) |
| **Paula** | NPC routine phases (who is where by time of day) | Pending -- needed for spatial layout NPC anchors |
| **Gestalt** | Display context tag confirmation | Pending -- Mellanie proposed, Gestalt validates |
**Key finding: I'm mostly unblocked.** The Visual Grammar has no upstream dependencies. Spatial layouts can begin with Miri's zones + Paula's relationship web. Insert wireframe has all its inputs.
### The Critical Circular Dependency
Spatial layouts need Paula's relationship web -> Content packs need spatial layouts -> Paula's relationship web needs content understanding.
**Resolution: Parallel drafting with one sync pass.**
1. I draft spatial layouts from Miri's zones + Gestalt's spatial requirements
2. Paula reviews layouts against her relationship web -- flags adjustments
3. I adjust. One round. Layouts lock for content authoring.
---
## 5. How Spatial Layout Serves Paula's Relationship Web and Gestalt's Access Tier Model
This is the most important synthesis. Paula's triangles and Gestalt's access tiers are abstract. My spatial layouts make them concrete.
### Principle: Space Creates Social Information
Physical arrangement determines:
- Who can observe whom (sightlines = observation opportunities)
- Who can talk privately (enclosed spaces = trust-gated conversations)
- Who crosses paths (chokepoints = accidental encounters)
- Who can be followed (corridors = approach vectors)
### Logistics Hub -- Serving the Relationship Web
Paula's hub NPCs: Shift Supervisor (A), Workers (B, C), Dock Inspector (D), Maintenance Tech (E).
Paula's hub triangles: New Hire Problem (B-C-A), Inspection Squeeze (A-D-K).
Gestalt's requirements: publicly accessible area with hidden back section, restricted-access area, chokepoint.
```
+------------------------------------------------------------------+
| SPAN GATE TERMINAL (visible glow) |
+------------------------------------------------------------------+
| |
| [Scanner Bay 1] [Scanner Bay 2] [Scanner Bay 3] |
| |
| +---------+ +---------+ +---------+ |
| | staging | | staging | | staging | |
| +---------+ +---------+ +---------+ |
| |
| === MAIN CORRIDOR (chokepoint - everyone passes through) ====== |
| |
| +----------------+ +----------+ +-----+ +--------+ |
| | Manifest | | Break | | WC | | Lockers| |
| | Processing | | Room | | | | | |
| | (terminals) | | (social) | +-----+ +--------+ |
| +----------------+ +----------+ |
| |
| +-------------+ +-------------------+ |
| | Supervisor | | Restricted Storage| <-- smuggling ops |
| | Office | | (key access) | |
| | (window) | | | |
| +-------------+ +-------------------+ |
+------------------------------------------------------------------+
```
**How this serves the triangles:**
- **New Hire Problem (B-C-A):** C works in manifest processing (open, visible). B observes C from staging. A watches from the office window (sightline into main floor, sound blocked). C's curiosity about restricted storage is observable -- other NPCs see C lingering near the locked door.
- **Inspection Squeeze (A-D-K):** D visits scanner bays. A watches from office window. The main corridor is the chokepoint -- D must pass through it, and the break room has a sightline to corridor traffic.
**How this serves access tiers:**
- **Public areas** (scanner bays, main corridor, manifest processing): Wide, well-lit, high visibility. Detective observes freely. `public` + `authority` dialogue.
- **Semi-private areas** (break room, lockers): Partially enclosed. Smuggler gets `insider` dialogue. Detective draws attention if lingering.
- **Private areas** (supervisor office, restricted storage): Enclosed, door access, blocked sightlines. The smuggler knows what's behind the restricted door. The detective can only observe from outside.
### Bar -- Serving the Relationship Web
Paula's bar NPCs: Bar Owner (F), Security Officer (G), Teacher/Family Person (H), Bartender (I), Drifter (J).
Paula's bar triangles: Card Game Debt (D-G-F), Worried Partner (H-B-F).
```
+----------------------------------------------------+
| |
| +---+ +---+ +---+ +-----------+ |
| | T | | T | | T | | Corner | |
| +---+ +---+ +---+ | Booth | <-- key |
| | (semi- | observation
| +==========================| private) | position |
| | BAR COUNTER +-----------+ |
| | (high visibility) |
| +========================== |
| |
| +---+ +---+ +---+ |
| | T | | T | | T | |
| +---+ +---+ +---+ |
| |
| +------------------+ +---------+ |
| | News Ticker | | Back | <-- alley exit |
| | Display | | Room | |
| +------------------+ +---------+ |
| |
| [ENTRANCE] |
+----------------------------------------------------+
```
**How this serves the triangles:**
- **Card Game Debt (D-G-F):** D and G at a table visible from the bar counter. F observes from behind the bar. The corner booth covers the card table -- observation position for both characters.
- **Worried Partner (H-B-F):** H sits at the bar counter (visible). Where B sits signals relationship state -- with H (normal) or at a separate table (avoidance, noteworthy). F observes from behind the bar.
- **The corner booth** is the most loaded piece of furniture in the game. From here: the bar counter (H, regulars), the card table area (D, G), the entrance (who comes and goes), and the back room door are all visible. For the smuggler: where ring contacts meet. For the detective: the surveillance perch. Same seat, different purpose.
### Smuggling Spaces -- Serving the Access Tier Model
NOT a separate building. The ring operates in: restricted storage (hub), maintenance corridors, dead-drop locations in transition areas.
**Design principle: The ring is invisible.** Meeting points have legitimate mundane purposes. Their ring function is only apparent if you know what to look for. The smuggler navigates naturally. The detective must DISCOVER these spaces -- following an NPC, finding corridors not on official maps, noticing recently-used maintenance hatches.
**The spatial layout encodes information asymmetry in the map itself.** Same physical space, different player understanding of it.
---
## 6. Visual Treatment of THE FRIEND
Ozzie's Round 1 makes the case: THE FRIEND is designed to deliver D-027 success criterion #3 ("player names an NPC they felt conflicted about"). Project lead confirms: one per character, production-level complex.
### Should THE FRIEND Look Different?
**Yes, but through EARNED visual detail, not special status marking.**
### The Visual Progression
**Phase 1: Before Contradiction (minutes 1-15)**
THE FRIEND is visually identical to other friendly NPCs. Same green rectangle, same label format. What makes them distinct is NOT rendering:
- **Label detail:** Their name shows from the start (not "Worker" or "?"). The character KNOWS this person.
- **Monologue frequency:** The character's thoughts reference THE FRIEND more often. Text creates attachment, not visuals.
- **Spatial proximity:** THE FRIEND's routine keeps them near the player. They're visually present more often.
This matters: THE FRIEND should NOT look special at first. If they look different, the player knows to pay attention. The point is natural attachment, then the contradiction hits.
**Phase 2: After Contradiction Discovery (mid-session)**
When the player observes THE FRIEND's contradictory behavior:
1. **Color shift:** Entity color transitions from green (`#6bc9a6`) to amber (`#e8c547`). Smooth 0.5s fade. The relationship-to-player color system working as designed -- the character now has QUESTIONS.
2. **Observation marker:** The eye icon appears alongside the monologue about the contradiction. Same icon used for all observations, but applied to someone the player trusted.
**The moment the rectangle shifts from green to amber IS THE FRIEND's visual moment.** It should be the first relationship color change in the session. If it's the FIRST color shift the player sees, they'll feel it -- because until now, colors have been static. The system proving it's dynamic ON a character the player cares about is the visual punch.
**Phase 3: Production-Level Treatment (planned, partially v0.1)**
When we move beyond boxes-with-labels:
- **Unique sprite.** Not dramatically different -- recognizably distinct. Where flat NPCs share sprite templates, THE FRIEND gets unique proportions, posture, one identifying accessory.
- **Behavioral animation states.** Minimum two: their "normal" state and their "hiding something" state.
- **Memory echo.** In the "remembered" fog state, THE FRIEND's ghost lingers longer. Their desaturated outline fades last. Subliminal signal that the character can't stop thinking about them.
### v0.1 Production Budget for THE FRIEND
- **Entity rendering:** Identical to other NPCs (colored rectangle, name label). No special rendering.
- **Color behavior:** Standard relationship color system, but designed so this NPC is MORE LIKELY to transition mid-session. The color spec must handle smooth transitions.
- **Writing investment:** The visual spec for THE FRIEND is actually a writing spec -- ensure Mellanie has enough monologue lines to create attachment before the contradiction.
**The visual treatment of THE FRIEND is mostly about what we DON'T do.** We don't mark them as special. We let writing and routines create attachment. Then the standard color-shift delivers the punch.
---
## 7. Visual Asset Taxonomy (Wiki Structure)
Project lead: full taxonomy, future-ready, non-negotiable.
```
assets/
visual/
style-guide/
v0.1-visual-grammar.md # Root document
color-palette.md # All color definitions + usage rules
entity-rendering-rules.md # Sizing, labels, color mapping
fog-rendering-spec.md # Four-state visibility
typography.md # Font choices, text hierarchy
ui/
insert/
hud-wireframe.md # Insert overlay layout
smuggler-variant.md # Smuggler lattice profile
detective-variant.md # Detective lattice profile
poi-markers.md # POI icon definitions
monologue/
display-spec.md # Typography, animation, stacking
character-variants.md # Per-character text style
dialogue/
panel-spec.md # Dialogue UI layout
name-header-rules.md # NPC name + relationship color
environmental-text/
signage-styles.md # In-world text rendering
terminal-screens.md # Interactive screen format
news-ticker.md # Ticker display format
sound-indicators/
fog-edge-pulse.md # Visual sound indicator spec
close-range.md # LOS sound indicators
insert-alerts.md # Long-range notification style
spatial/
sova-logistics-hub/
floor-plan.md # Tile-level layout
sightline-analysis.md # Observation positions, blind spots
sound-propagation.md # Thin/thick walls, bleed zones
npc-positions.md # Routine phase positions
approach-vectors.md # Player entry + first impressions
sova-bar/
floor-plan.md
sightline-analysis.md
sound-propagation.md
npc-positions.md
approach-vectors.md
sova-smuggling-spaces/
floor-plan.md
sightline-analysis.md
sound-propagation.md
npc-positions.md
approach-vectors.md
corridors-transitions/
district-connectivity.md # How zones connect
chokepoint-analysis.md # Cross-template encounter points
entities/
npc/
relationship-color-spec.md # Color mapping + transitions
label-rules.md # Name/role/unknown display rules
the-friend-treatment.md # Production-level NPC visual spec
flat-npc-templates.md # Shared visual templates
objects/
furniture.md # Sizing, color, interaction markers
doors.md # Open/closed/locked states
terminals.md # Interactive object visual
environment/
span-gate-glow.md # Signature visual element
lighting-zones.md # Per-zone lighting spec
construction-eras.md # Wall/floor variation by age
sprites/ # FUTURE: when we move beyond boxes
characters/
objects/
tiles/
effects/
```
Every folder exists even if files are stubs. New locations slot into `spatial/` with the same structure. Sprites slot into `sprites/` following entity definitions already established. This scales to full game without reorganization.
---
## 8. Complete Dependency Chain (All Teams)
```
PHASE 0: WORKSHOP OUTPUT (we are here)
|
v
PHASE 1: FOUNDATION (parallel, no cross-dependencies)
|
|-- [Araminta] v0.1 Visual Grammar Document
|-- [Miri] Finalize Sova Setting Brief (Round 1 is nearly complete)
|-- [Paula] Dual Lens Authoring Guide (draft)
|
v
PHASE 2: SPATIAL + CHARACTER (mostly parallel, one sync point)
|
|-- [Araminta] Spatial layouts (3 sites)
| depends on: Visual Grammar + Miri's setting
| |
| +--- SYNC POINT: Paula reviews against relationship web
| | (one feedback round, then layouts lock)
|
|-- [Araminta] Insert/HUD wireframe (parallel)
|-- [Araminta] Monologue display spec (parallel)
|-- [Araminta] Sound indicator design (parallel)
|-- [Paula] Relationship web + NPC profiles
|-- [Mellanie] Voice kits + monologue starters
|
v
PHASE 3: CONTENT PRODUCTION
|
|-- [Mellanie] Content packs (#190-192)
| depends on: Spatial layouts (locked), NPC profiles, format
|-- [Araminta] Environmental text visual placement
|-- [Araminta] THE FRIEND visual spec (needs Paula's NPC profiles)
|
v
PHASE 4: INTEGRATION
|
|-- Specs handed to Stig (UI) + Dudley (server)
|-- Araminta reviews implementation against specs
```
**The Visual Grammar Document is my Phase 1 deliverable. Zero dependencies. I can start today.**
---
## 9. Answering Specific Round 1 Asks
### For Mellanie: "Tell me the visual fidelity target"
**Maximum text density.** The colored rectangles communicate game state (who's friendly, where's the fog). They don't communicate mood, personality, or social dynamics. All that burden falls on text.
Concrete display constraints (pending full spec):
- Monologue: max ~80 characters per line (60% screen width at default font), max 3 visible lines
- Dialogue: max ~100 characters per line in dialogue panel
- Environmental text: 8-40 characters for labels, up to 200 for terminal screens
- News ticker: single scrolling line, ~60 character visible window
### For Paula: "Should the insert carry character-specific visual language?"
**Yes. One parameterized system, two profiles.** See insert section above. The `lattice_profile` loads POI categories, notification format, data density, and annotation style per character. No extra development cost -- just data.
### For Ozzie: "Does it need mood?"
**It needs three things: a color palette, lighting variation, and one signature element.** That's the span gate glow, the zone palettes, and the three-zone lighting model. Not polish -- MOOD through restraint. The gap between "readable prototype" and "world I'm stepping into" is these three things.
### For Gestalt: Spatial requirements
**Confirmed.** Each spatial layout includes: one publicly accessible area with hidden back section, one area with smuggler-natural access, one chokepoint where cross-template encounters happen. The main corridor in the logistics hub is the primary chokepoint. The bar entrance + counter serve as social observation chokepoint.
---
## 10. Immediate Next Steps
1. **Write v0.1 Visual Grammar Document.** One page. Color palette (locked), entity sizing, label conventions, UI layers, fog spec. No dependencies. Can start today.
2. **Draft spatial layouts for Sova's three social sites.** Based on Miri's zones + Paula's relationship web + Gestalt's spatial requirements. Submit to Paula for review.
3. **Design insert/HUD wireframe.** Two variants. Based on Paula's access tier model + Miri's lattice descriptions.
4. **Write monologue display spec.** Typography, positioning, animation, stacking. Gives Mellanie her display constraints.
5. **Design sound indicators.** Fog-edge pulse icons complementary to 6-8 audio files.
6. **Spec THE FRIEND's visual treatment.** After Paula's NPC profiles exist.
---
## Summary Position
Round 1: "The entity color system is the single most important visual DECISION."
Round 2: **"The spatial layouts are the single most important visual DELIVERABLE."**
The color system is confirmed and locked. Good. Now: does the physical space support the relationship web, the access tier model, the observation gameplay, and the dual-lens experience? If sightlines are wrong, no dialogue tagging saves the investigation. If chokepoints don't exist, cross-template encounters don't happen. If the bar doesn't have that corner booth, Paula's card game triangle has nowhere to play out.
The spatial layouts are where abstract systems become concrete games. Where Paula's 7 triangles become observable social dynamics. Where Gestalt's access tiers become physical spaces. Where Mellanie's 900 lines have rooms to live in.
I can start the Visual Grammar today. Spatial layouts begin as soon as the workshop concludes.
Keep it clean, we can layer detail later.
---
*Written by Araminta. Round 2 synthesis complete.*

Some files were not shown because too many files have changed in this diff Show More