Compare commits
@@ -22,7 +22,7 @@ Named after Hoshe Finn - Paula Myo's detective partner who does the legwork, che
|
||||
- **Create test plans** for new features before implementation begins
|
||||
- **Write test reports** documenting what was tested, what passed, what failed
|
||||
- **Regression testing** - ensure new changes don't break existing functionality
|
||||
- **Verify implementations against specifications** - compare code behavior to DECISIONS.md requirements
|
||||
- **Verify implementations against specifications** - compare code behavior to decisions/ domain file requirements
|
||||
- **Edge case identification** - think about what breaks when inputs are unexpected
|
||||
- **Performance testing** - identify bottlenecks, especially in perception/LOS/chunk systems
|
||||
- **Playtest reports** - structured feedback on whether the game feels right
|
||||
|
||||
@@ -16,7 +16,7 @@ Named after Inigo from the Void Trilogy — the Dreamer who shared immersive mul
|
||||
|
||||
## Your role on the team
|
||||
|
||||
- Design the soundscape layers for each location (Logistics Hub, Bar, Ring spaces)
|
||||
- Design the soundscape layers for each zone type (commercial, residential, industrial, transit)
|
||||
- Define ambient audio: station hum, crowd murmur, machinery, ventilation, distant announcements
|
||||
- Specify diegetic sound cues that carry gameplay information (D-018 sound model)
|
||||
- Design audio behavior for the sound propagation system (close/medium/long range per D-018)
|
||||
|
||||
@@ -6,7 +6,7 @@ model: sonnet
|
||||
memory: project
|
||||
---
|
||||
|
||||
You are MIRI, the Worldbuilder and Setting Designer on a game development team building a top-down immersive sim — an occlusion-based detective game with combat elements set in an original science fiction universe.
|
||||
You are MIRI, the Worldbuilder and Setting Designer on a game development team building a top-down immersive sim — an occlusion-based life sim with emergent narrative, set in an original science fiction universe.
|
||||
|
||||
## Your personality
|
||||
|
||||
@@ -36,7 +36,7 @@ Core worldbuilding domains:
|
||||
- Flag when designs contradict established setting elements (with severity: cosmetic, notable, fundamental)
|
||||
- Suggest setting-faithful alternatives when possible
|
||||
- Identify opportunities where worldbuilding details could enrich gameplay
|
||||
- Ensure the setting serves the core mechanics: asymmetric information, perception-based gameplay, conspiracy, and investigation
|
||||
- Ensure the setting serves the core mechanics: asymmetric information, perception-based gameplay, and emergent social dynamics
|
||||
- Build faction identities, technology tiers, location profiles, and historical timelines
|
||||
|
||||
## Project context
|
||||
|
||||
@@ -19,7 +19,7 @@ You're named after Ozzie Isaacs - the wanderer, the dreamer, the one who walks t
|
||||
## Your role on the team
|
||||
|
||||
- Gut-check every feature: "Is this cool? Will players remember this moment?"
|
||||
- Champion the big emotional beats: the Dyson barriers opening, first contact with MorningLightMountain, walking through a wormhole, the Starflyer reveal
|
||||
- Champion the big emotional beats: first impressions of a new zone, emergent character moments, consequences landing hard
|
||||
- Push back when designs are technically correct but emotionally flat
|
||||
- Advocate for the player's first impression and ongoing engagement
|
||||
- Remind the team that the game needs to FEEL like the Settled Reach, not just simulate it
|
||||
@@ -27,9 +27,9 @@ You're named after Ozzie Isaacs - the wanderer, the dreamer, the one who walks t
|
||||
|
||||
## What you care about
|
||||
|
||||
- Moments of awe (the scale of the wormhole network, the galaxy map)
|
||||
- Moments of dread (MorningLightMountain, the Starflyer's reach)
|
||||
- Moments of discovery (finding evidence, uncovering the conspiracy)
|
||||
- Moments of awe (the scale of the setting, discovering a new zone's character)
|
||||
- Moments of dread (consequences closing in, systems turning against you)
|
||||
- Moments of discovery (emergent character moments, relationship progression, consequence legibility)
|
||||
- Moments of hubris-collapse (you thought you were powerful, you were wrong)
|
||||
- The player's emotional journey through the game
|
||||
|
||||
|
||||
@@ -24,15 +24,15 @@ Named after Paula Myo - the investigator who never gives up, who follows the thr
|
||||
- Advocate for consequences - player actions should ripple through the social fabric
|
||||
- Design the political landscape of the Settled Reach as a playable space
|
||||
- Push for narrative moments that emerge from systems, not just scripted events
|
||||
- Champion the Starflyer conspiracy as a narrative experience
|
||||
- Champion emergent narrative through systemic consequences
|
||||
- Ensure the internal monologue system reflects character psychology
|
||||
|
||||
## What you care about
|
||||
|
||||
- Dynasty politics: Burnellis, Halgarths, Sheldons and their centuries of rivalry
|
||||
- The Starflyer conspiracy: information asymmetry, trust, betrayal, the slow unraveling
|
||||
- Factions within factions: Guardians of Selfhood, Senate blocs, institutional loyalties
|
||||
- Character relationships that evolve over decades/centuries
|
||||
- Faction politics: cultures, power blocs, and their rivalries
|
||||
- Information asymmetry: trust, betrayal, the slow unraveling of what NPCs know vs show
|
||||
- Factions within factions: institutional loyalties, competing agendas, emergent alliances
|
||||
- Character relationships that evolve through generated interactions
|
||||
- Moments where political and personal stakes collide
|
||||
- The weight of decisions - nothing is free, every alliance costs something
|
||||
|
||||
|
||||
Executable
+63
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env bash
|
||||
# git-lock-guard: PreToolUse hook that clears stale git index.lock files
|
||||
# before git write operations.
|
||||
#
|
||||
# Claude Code's internal git status polling creates stale lock files that
|
||||
# persist after the process exits (anthropics/claude-code#11005). This hook
|
||||
# detects and removes them before LLM-initiated git commands run.
|
||||
#
|
||||
# Only acts on git write commands (add, commit, merge, push, etc.).
|
||||
# Read-only commands (status, log, diff, show) are skipped.
|
||||
set -uo pipefail
|
||||
|
||||
INPUT=$(cat)
|
||||
|
||||
# Only act on Bash tool calls
|
||||
TOOL_NAME=$(echo "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_name',''))" 2>/dev/null)
|
||||
[ "$TOOL_NAME" = "Bash" ] || exit 0
|
||||
|
||||
COMMAND=$(echo "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_input',{}).get('command',''))" 2>/dev/null)
|
||||
|
||||
# Only act on git write commands — skip read-only operations
|
||||
case "$COMMAND" in
|
||||
git\ add*|git\ commit*|git\ merge*|git\ push*|git\ pull*|\
|
||||
git\ checkout*|git\ stash*|git\ rebase*|git\ reset*|\
|
||||
git\ cherry-pick*|git\ rm*|git\ mv*|git\ fetch*)
|
||||
;;
|
||||
*)
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
# Resolve the git directory for the current working directory
|
||||
CWD=$(echo "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('cwd',''))" 2>/dev/null)
|
||||
[ -n "$CWD" ] || exit 0
|
||||
|
||||
# Find the .git directory (handles both regular repos and worktrees)
|
||||
GIT_DIR=$(git -C "$CWD" rev-parse --git-dir 2>/dev/null) || exit 0
|
||||
|
||||
# For worktrees, also check the common git dir (shared index operations)
|
||||
GIT_COMMON_DIR=$(git -C "$CWD" rev-parse --git-common-dir 2>/dev/null) || GIT_COMMON_DIR="$GIT_DIR"
|
||||
|
||||
for DIR in "$GIT_DIR" "$GIT_COMMON_DIR"; do
|
||||
LOCK="$DIR/index.lock"
|
||||
[ -f "$LOCK" ] || continue
|
||||
|
||||
# Check if any process holds the lock
|
||||
if command -v lsof &>/dev/null; then
|
||||
if lsof "$LOCK" &>/dev/null; then
|
||||
# Lock is held by a live process — don't touch it
|
||||
continue
|
||||
fi
|
||||
elif command -v fuser &>/dev/null; then
|
||||
if fuser "$LOCK" &>/dev/null 2>&1; then
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
# Stale lock — remove it
|
||||
rm -f "$LOCK" 2>/dev/null
|
||||
done
|
||||
|
||||
# Always allow the command to proceed
|
||||
exit 0
|
||||
@@ -11,8 +11,9 @@ tea pr list --login schweitz --repo jpmschweitzer/settled-reach --state open --o
|
||||
# View a PR with comments
|
||||
tea pr --login schweitz --repo jpmschweitzer/settled-reach --comments -o simple <PR_NUMBER>
|
||||
|
||||
# Post a comment on a PR (or issue)
|
||||
tooling/tea-comment <NUMBER> "comment body"
|
||||
# Post a comment on a PR (or issue) — use @filepath for long comments
|
||||
tooling/tea-comment <NUMBER> @/tmp/review.md
|
||||
tooling/tea-comment <NUMBER> "short inline comment"
|
||||
|
||||
# Approve a PR
|
||||
tea pr approve --login schweitz --repo jpmschweitzer/settled-reach <PR_NUMBER>
|
||||
@@ -25,7 +26,7 @@ tea issue list --login schweitz --repo jpmschweitzer/settled-reach --state open
|
||||
|
||||
- **All flags must be explicit** — omitting `--login` or `--repo` triggers interactive prompts that crash in Claude Code (no TTY)
|
||||
- **Use `--output simple`** for machine-readable output (no table borders)
|
||||
- **For comments, use `tooling/tea-comment <number> "body"`** — handles temp files and cleanup automatically. Works with multi-line strings.
|
||||
- **For comments, use `tooling/tea-comment <number> @/tmp/file.md`** for long comments (write to file first, then pass `@filepath`). Short inline strings also work: `tooling/tea-comment <number> "body"`. The `@filepath` form avoids `$()` subshells which break permission matching.
|
||||
- **`tea pr reject` does not work on your own PRs** — use `tea comment` instead
|
||||
- **Never delete protected branches:** `main`, `maintenance`, `server`, `client`, `copy`, `audio`, `visual`, `ci` are protected on Gitea. Do not use `tea pr clean`, `git push --delete`, or `git branch -D` on these branches.
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{
|
||||
"autoMemoryDirectory": "/home/jeroenschweitzer/Projects/settled-reach/.memory",
|
||||
"env": {
|
||||
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
|
||||
},
|
||||
@@ -79,5 +80,19 @@
|
||||
"Bash(git clean -f *)",
|
||||
"Bash(rm -rf *)"
|
||||
]
|
||||
},
|
||||
"hooks": {
|
||||
"PreToolUse": [
|
||||
{
|
||||
"matcher": "Bash",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": ".claude/hooks/git-lock-guard.sh",
|
||||
"timeout": 5
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -185,10 +185,15 @@ After presenting results to the user, post the review as a PR comment.
|
||||
|
||||
Note: `tea pr reject` does not work on your own PRs. Use `tea comment` instead.
|
||||
|
||||
Post using the `tea-comment` wrapper (handles temp files and cleanup):
|
||||
Post using the `tea-comment` wrapper (handles temp files and cleanup).
|
||||
Write the review to a temp file first, then pass via `@filepath` syntax:
|
||||
|
||||
```bash
|
||||
tooling/tea-comment <PR_NUMBER> "review markdown here"
|
||||
# Write review to file, then post — avoids $() in the command which breaks permissions
|
||||
cat > /tmp/pr-review-<NUMBER>.md << 'EOF'
|
||||
...review content...
|
||||
EOF
|
||||
tooling/tea-comment <PR_NUMBER> @/tmp/pr-review-<NUMBER>.md
|
||||
```
|
||||
|
||||
## 7. Merging approved PRs
|
||||
|
||||
@@ -6,6 +6,47 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [v0.1.26] — 2026-03-13
|
||||
|
||||
### Added
|
||||
- ContentType::Factual — lines with numbers, denials, causal chains bypass LLM and serve base text directly (#650, D-138)
|
||||
- Voice pipeline observer integration — enrichment systems rewrite dialogue/conversation text with voiced versions before snapshot assembly (#652)
|
||||
- SQLite settings storage — per-player persistent settings via rusqlite (bundled), IPC protocol v20 with ChangeSettings/RequestAllSettings/DeleteSetting commands (#627)
|
||||
- Composable behavior engine — three-layer action+modifier+context primitives replace flat culture×zone×role behavior strings (#633, D-139, Q-057 resolved)
|
||||
- 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)
|
||||
- All 18 agent briefings updated for v0.2 pivot — removed detective/smuggler/hand-authored references, aligned with generator-first approach (#658)
|
||||
- 5 agent profiles (miri, ozzie, paula, inigo, hoshe) updated to remove stale v0.1 framing (#658)
|
||||
- Q-015 closed as obsolete (D-122 eliminates hand-authored FRIEND content)
|
||||
- D-018 perception model: franchise-specific example replaced with generic framing
|
||||
|
||||
## [v0.1.25] — 2026-03-07
|
||||
|
||||
### Fixed
|
||||
|
||||
@@ -194,6 +194,12 @@ settings:
|
||||
text_speed: "Text Speed"
|
||||
fullscreen: "Fullscreen"
|
||||
language: "Language"
|
||||
# #646: AI-Enhanced Dialogue toggle (D-138)
|
||||
ai_section_header: "AI DIALOGUE"
|
||||
ai_dialogue_toggle: "AI-Enhanced Dialogue"
|
||||
ai_status_checking: "Speed not yet measured — will check on first enable."
|
||||
ai_status_ram_marginal: "Low memory — performance may vary."
|
||||
ai_battery_warning: "High battery usage"
|
||||
|
||||
# ============================================================
|
||||
# CHARACTER SELECTION (if applicable in v0.1)
|
||||
|
||||
@@ -17,6 +17,10 @@ config/icon="res://icon.svg"
|
||||
|
||||
[autoload]
|
||||
|
||||
; PlatformInfo MUST remain first — HardwareDetector (and other autoloads) depend on it
|
||||
; being initialised before their own _ready() runs. Do not reorder.
|
||||
PlatformInfo="*res://scripts/autoloads/platform_info.gd"
|
||||
Protocol="*res://scripts/protocol/protocol.gd"
|
||||
SimBridge="*res://scripts/autoloads/sim_bridge.gd"
|
||||
GameState="*res://scripts/autoloads/game_state.gd"
|
||||
InputMapper="*res://scripts/autoloads/input_mapper.gd"
|
||||
@@ -24,6 +28,7 @@ UIStrings="*res://scripts/autoloads/ui_strings.gd"
|
||||
FogState="*res://scripts/autoloads/fog_state.gd"
|
||||
AudioManager="*res://scripts/autoloads/audio_manager.gd"
|
||||
SessionManager="*res://scripts/autoloads/session_manager.gd"
|
||||
HardwareDetector="*res://ui/hardware_detector.gd"
|
||||
|
||||
[audio]
|
||||
|
||||
|
||||
@@ -97,6 +97,17 @@ var pending_load_path: String = ""
|
||||
# Default: "detective" — fallback for legacy saves without character.txt.
|
||||
var character_archetype: String = "detective"
|
||||
|
||||
# #646: AI-Enhanced Dialogue enabled state (D-138).
|
||||
# Runtime toggle — true means the LLM re-voicing pipeline should run (server-side).
|
||||
# Default: true (opt-out model per D-138 §8). Hardware detector may disable at startup
|
||||
# if RAM is insufficient. Persisted to server SQLite via ChangeSettings IPC.
|
||||
var ai_enhanced_dialogue_enabled: bool = true
|
||||
|
||||
# v20 fields (#627, D-138): settings response from server.
|
||||
# One-shot: {kind: "full", settings: [{key, value}]} or {kind: "ack", success, key, error} or null.
|
||||
# "full" response hydrates ai_enhanced_dialogue_enabled (server is authoritative for persisted state).
|
||||
var settings_response: Variant = null
|
||||
|
||||
# v7 fields (#431, D-059/D-060)
|
||||
var pending_recognitions: Array = [] # [{entity_id, x, y, z, remaining_ticks, total_delay_ticks}]
|
||||
|
||||
@@ -328,6 +339,24 @@ func apply_snapshot(snapshot: Dictionary) -> void:
|
||||
else:
|
||||
debug_response = null
|
||||
|
||||
# v20: settings_response (#627, D-138) — one-shot settings ack/dump from server.
|
||||
# "full" kind → iterate settings array and hydrate matching fields.
|
||||
if snapshot.has("settings_response") and snapshot.settings_response is Dictionary:
|
||||
settings_response = snapshot.settings_response
|
||||
var sr: Dictionary = snapshot.settings_response
|
||||
if sr.get("kind") == "full":
|
||||
var sr_settings: Variant = sr.get("settings")
|
||||
if sr_settings is Array:
|
||||
for entry in sr_settings:
|
||||
if not entry is Dictionary:
|
||||
continue
|
||||
if entry.get("key") == "ai_dialogue.enabled":
|
||||
var val: Variant = entry.get("value")
|
||||
if val != null:
|
||||
ai_enhanced_dialogue_enabled = _extract_bool_setting("ai_dialogue.enabled", val)
|
||||
else:
|
||||
settings_response = null
|
||||
|
||||
# v14: player_knowledge (#264, D-041) — partial KG dump for journal panel.
|
||||
# Only update when field is present (null means no change, server sends when KG changes).
|
||||
if snapshot.has("player_knowledge") and snapshot.player_knowledge is Dictionary:
|
||||
@@ -374,3 +403,16 @@ func apply_snapshot(snapshot: Dictionary) -> void:
|
||||
boundary_positions[pos] = true
|
||||
elif not has_explicit_positions:
|
||||
visible_positions[pos] = true
|
||||
|
||||
|
||||
# -- Helpers ------------------------------------------------------------------
|
||||
|
||||
## Extract a bool from a tagged-union {"Bool": true} or plain bool value.
|
||||
## Handles both serde encoding styles; emits push_warning on unrecognised format.
|
||||
static func _extract_bool_setting(key: String, val: Variant) -> bool:
|
||||
if val is bool:
|
||||
return val
|
||||
if val is Dictionary and val.has("Bool"):
|
||||
return bool(val["Bool"])
|
||||
push_warning("GameState: unexpected type for setting '%s': %s" % [key, str(val)])
|
||||
return false
|
||||
|
||||
@@ -25,6 +25,9 @@ enum Action {
|
||||
SAVE_GAME, # #554: F5 quicksave — sends SaveGame to server with save path
|
||||
LOAD_GAME, # #554: F6 quickload — sends LoadGame to server with save path
|
||||
DEBUG_COMMAND, # #581: debug console command dispatch — sends DebugCommandKind to server
|
||||
CHANGE_SETTINGS, # #646: persist a setting to server SQLite — sends {key, value} to server
|
||||
REQUEST_ALL_SETTINGS, # #646: request full settings dump from server after handshake (unit variant)
|
||||
DELETE_SETTING, # #646: delete a setting by key from server SQLite (struct variant)
|
||||
}
|
||||
|
||||
var input_queue: Array[Dictionary] = []
|
||||
|
||||
@@ -0,0 +1,348 @@
|
||||
extends Node
|
||||
## Platform abstraction layer — D-138 §8, D-141. Central location for all OS queries.
|
||||
## Owned by Stig (UI Developer). Registered FIRST in project.godot so other
|
||||
## autoloads can read its properties in their own _ready().
|
||||
##
|
||||
## Sections:
|
||||
## Power: PowerProfile enum, 30s poll timer, power_profile_changed signal.
|
||||
## raw_power_state / battery_percent updated each poll.
|
||||
## Memory: free_memory_mb / total_memory_mb, refresh_memory() on demand.
|
||||
## CPU: cpu_name / cpu_logical_cores — read once in _ready().
|
||||
## GPU: gpu_name / gpu_vendor / gpu_api_version / gpu_type / gpu_driver_info.
|
||||
## Guarded for headless/server builds where RenderingServer has no device.
|
||||
## Platform: platform_name / os_version / distribution / is_sandboxed.
|
||||
## Display: screen_count / screen_size / screen_dpi / screen_refresh_rate / display_scale.
|
||||
## Locale: locale / locale_language.
|
||||
## Paths: Read-once OS path constants, populated in _ready().
|
||||
## Diag: get_diagnostics() — flat dict of all properties for bug reports.
|
||||
|
||||
|
||||
# -- Power profile ------------------------------------------------------------
|
||||
|
||||
## High-level power classification. POWER_SAVER reserved for future OS API.
|
||||
enum PowerProfile {
|
||||
FULL = 0, # Plugged in (charged, charging, or no battery) — no restrictions
|
||||
BATTERY = 1, # On battery — AI inference should be suspended per D-138 §8 Layer 3
|
||||
POWER_SAVER = 2 # System-level power-saver mode (future: no cross-platform API yet)
|
||||
}
|
||||
|
||||
## Emitted when the detected power profile changes.
|
||||
signal power_profile_changed(old_profile: int, new_profile: int)
|
||||
|
||||
## Current power profile. Updated by the 30-second poll timer.
|
||||
var power_profile: PowerProfile = PowerProfile.FULL
|
||||
|
||||
## Raw OS power_state integer from the last poll. 0 = unknown, 1 = on battery, etc.
|
||||
var raw_power_state: int = 0
|
||||
|
||||
## Battery charge percentage (0–100). -1 if not available or not on battery.
|
||||
var battery_percent: int = -1
|
||||
|
||||
## How often (seconds) to re-poll OS for power state changes.
|
||||
const POWER_POLL_INTERVAL := 30.0
|
||||
|
||||
# OS power_state integer constants (Godot 4 — same values as POWERSTATE_* enum).
|
||||
const _POWER_STATE_UNKNOWN := 0
|
||||
const _POWER_STATE_ON_BATTERY := 1
|
||||
const _POWER_STATE_NO_BATTERY := 2
|
||||
const _POWER_STATE_CHARGING := 3
|
||||
const _POWER_STATE_CHARGED := 4
|
||||
|
||||
|
||||
# -- Memory -------------------------------------------------------------------
|
||||
|
||||
## Free physical RAM in megabytes. Call refresh_memory() before reading if staleness matters.
|
||||
var free_memory_mb: float = 0.0
|
||||
|
||||
## Total physical RAM in megabytes. Populated once in _ready(); doesn't change at runtime.
|
||||
var total_memory_mb: float = 0.0
|
||||
|
||||
|
||||
# -- CPU ----------------------------------------------------------------------
|
||||
|
||||
## Human-readable processor name (e.g. "Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz").
|
||||
var cpu_name: String = ""
|
||||
|
||||
## Number of logical CPU cores reported by the OS.
|
||||
var cpu_logical_cores: int = 0
|
||||
|
||||
|
||||
# -- GPU ----------------------------------------------------------------------
|
||||
|
||||
## GPU display name (e.g. "NVIDIA GeForce RTX 3080").
|
||||
var gpu_name: String = ""
|
||||
|
||||
## GPU vendor string (e.g. "NVIDIA Corporation").
|
||||
var gpu_vendor: String = ""
|
||||
|
||||
## Graphics API version string (e.g. "OpenGL 4.6.0 ...").
|
||||
var gpu_api_version: String = ""
|
||||
|
||||
## GPU type classification: "discrete" | "integrated" | "virtual" | "cpu" | "other".
|
||||
var gpu_type: String = "other"
|
||||
|
||||
## Low-level driver info strings from the OS (may be empty on some platforms).
|
||||
var gpu_driver_info: PackedStringArray = PackedStringArray()
|
||||
|
||||
|
||||
# -- Platform identity --------------------------------------------------------
|
||||
|
||||
## OS name reported by Godot (e.g. "Linux", "Windows", "macOS").
|
||||
var platform_name: String = ""
|
||||
|
||||
## Full OS version string (e.g. "Ubuntu 22.04.3 LTS").
|
||||
var os_version: String = ""
|
||||
|
||||
## Linux distribution name (e.g. "Ubuntu"); empty on non-Linux platforms.
|
||||
var distribution: String = ""
|
||||
|
||||
## True if the application is running inside a sandbox (Flatpak, Snap, macOS sandbox, etc.).
|
||||
var is_sandboxed: bool = false
|
||||
|
||||
|
||||
# -- Display ------------------------------------------------------------------
|
||||
|
||||
## Number of connected screens.
|
||||
var screen_count: int = 1
|
||||
|
||||
## Size of the primary screen in pixels.
|
||||
var screen_size: Vector2i = Vector2i(1920, 1080)
|
||||
|
||||
## DPI of the primary screen.
|
||||
var screen_dpi: int = 96
|
||||
|
||||
## Refresh rate of the primary screen in Hz. Falls back to 60.0 if OS reports < 0.
|
||||
var screen_refresh_rate: float = 60.0
|
||||
|
||||
## UI scale factor. Uses OS-reported scale on macOS; falls back to dpi / 96.0 elsewhere.
|
||||
var display_scale: float = 1.0
|
||||
|
||||
|
||||
# -- Locale -------------------------------------------------------------------
|
||||
|
||||
## Full locale string (e.g. "en_US").
|
||||
var locale: String = ""
|
||||
|
||||
## Language portion of the locale (e.g. "en").
|
||||
var locale_language: String = ""
|
||||
|
||||
|
||||
# -- File paths ---------------------------------------------------------------
|
||||
|
||||
## Base user data directory (user://).
|
||||
var user_data_dir: String = ""
|
||||
|
||||
## Directory where settings.cfg is written. Same as user_data_dir in Godot 4.
|
||||
var config_dir: String = ""
|
||||
|
||||
## Full path to AI benchmark cache (ai-dialogue-config.json).
|
||||
var benchmark_cache_path: String = ""
|
||||
|
||||
## Directory where the game binary lives (install location).
|
||||
var install_dir: String = ""
|
||||
|
||||
## Full path to the game executable.
|
||||
var executable_path: String = ""
|
||||
|
||||
## OS-provided cache directory, or user_data_dir/cache as fallback.
|
||||
var cache_dir: String = ""
|
||||
|
||||
## Directory where the bundled Gemma 2 model lives (derived from install_dir).
|
||||
var model_dir: String = ""
|
||||
|
||||
|
||||
# -- Lifecycle ----------------------------------------------------------------
|
||||
|
||||
func _ready() -> void:
|
||||
_init_paths()
|
||||
_init_hardware()
|
||||
refresh_memory()
|
||||
_poll_power()
|
||||
|
||||
var timer := Timer.new()
|
||||
timer.wait_time = POWER_POLL_INTERVAL
|
||||
timer.autostart = true
|
||||
timer.timeout.connect(_poll_power)
|
||||
add_child(timer)
|
||||
|
||||
|
||||
func _init_paths() -> void:
|
||||
user_data_dir = OS.get_user_data_dir()
|
||||
config_dir = user_data_dir
|
||||
benchmark_cache_path = "user://ai-dialogue-config.json"
|
||||
executable_path = OS.get_executable_path()
|
||||
install_dir = executable_path.get_base_dir()
|
||||
model_dir = install_dir + "/models"
|
||||
# get_cache_dir() may not exist on all Godot builds — use callv for safety.
|
||||
var os_cache: String = ""
|
||||
if OS.has_method("get_cache_dir"):
|
||||
var result: Variant = OS.callv("get_cache_dir", [])
|
||||
if result is String:
|
||||
os_cache = result
|
||||
cache_dir = os_cache if not os_cache.is_empty() else user_data_dir + "/cache"
|
||||
|
||||
|
||||
func _init_hardware() -> void:
|
||||
# -- CPU
|
||||
cpu_name = OS.get_processor_name()
|
||||
cpu_logical_cores = OS.get_processor_count()
|
||||
|
||||
# -- GPU (guarded: RenderingServer methods may return empty in headless mode)
|
||||
gpu_name = RenderingServer.get_video_adapter_name()
|
||||
gpu_vendor = RenderingServer.get_video_adapter_vendor()
|
||||
gpu_api_version = RenderingServer.get_video_adapter_api_version()
|
||||
gpu_driver_info = OS.get_video_adapter_driver_info()
|
||||
if RenderingServer.has_method("get_video_adapter_type"):
|
||||
var adapter_type: int = RenderingServer.callv("get_video_adapter_type", [])
|
||||
gpu_type = _map_adapter_type(adapter_type)
|
||||
|
||||
# -- Platform identity
|
||||
platform_name = OS.get_name()
|
||||
os_version = OS.get_version()
|
||||
if OS.has_method("get_distribution_name"):
|
||||
var dist: Variant = OS.callv("get_distribution_name", [])
|
||||
if dist is String:
|
||||
distribution = dist
|
||||
is_sandboxed = OS.is_sandboxed()
|
||||
|
||||
# -- Display
|
||||
screen_count = DisplayServer.get_screen_count()
|
||||
screen_size = DisplayServer.screen_get_size()
|
||||
screen_dpi = DisplayServer.screen_get_dpi()
|
||||
var raw_rate: float = DisplayServer.screen_get_refresh_rate()
|
||||
screen_refresh_rate = raw_rate if raw_rate >= 0.0 else 60.0
|
||||
display_scale = _compute_display_scale()
|
||||
|
||||
# -- Locale
|
||||
locale = OS.get_locale()
|
||||
locale_language = OS.get_locale_language()
|
||||
|
||||
|
||||
## Map RenderingDevice.DeviceType int to a readable string.
|
||||
## Values: 0=OTHER, 1=INTEGRATED, 2=DISCRETE, 3=VIRTUAL, 4=CPU.
|
||||
static func _map_adapter_type(adapter_type: int) -> String:
|
||||
match adapter_type:
|
||||
1: return "integrated"
|
||||
2: return "discrete"
|
||||
3: return "virtual"
|
||||
4: return "cpu"
|
||||
_: return "other"
|
||||
|
||||
|
||||
## Compute display scale for the primary screen.
|
||||
## macOS reports via screen_get_scale(); all others fall back to dpi / 96.0.
|
||||
func _compute_display_scale() -> float:
|
||||
if platform_name == "macOS" and DisplayServer.has_method("screen_get_scale"):
|
||||
var scale: Variant = DisplayServer.callv("screen_get_scale", [])
|
||||
if scale is float and scale > 0.0:
|
||||
return scale
|
||||
return float(screen_dpi) / 96.0
|
||||
|
||||
|
||||
# -- Memory API ---------------------------------------------------------------
|
||||
|
||||
## Refresh free/total memory readings from the OS. Call before read if freshness matters.
|
||||
func refresh_memory() -> void:
|
||||
var mem := OS.get_memory_info()
|
||||
# "available" = Linux MemAvailable / Windows ullAvailPhys (includes reclaimable pages).
|
||||
# Fall back to "free" on platforms that don't provide "available".
|
||||
free_memory_mb = float(mem.get("available", mem.get("free", 0))) / (1024.0 * 1024.0)
|
||||
total_memory_mb = float(mem.get("physical", 0)) / (1024.0 * 1024.0)
|
||||
|
||||
|
||||
# -- Power API ----------------------------------------------------------------
|
||||
|
||||
## Classify an OS power_state integer into a human-readable string.
|
||||
## 1 (ON_BATTERY) → "battery", 2/3/4 (plugged) → "plugged", 0 → "unknown".
|
||||
static func classify_power_state(power_state: int) -> String:
|
||||
match power_state:
|
||||
_POWER_STATE_ON_BATTERY:
|
||||
return "battery"
|
||||
_POWER_STATE_NO_BATTERY, _POWER_STATE_CHARGING, _POWER_STATE_CHARGED:
|
||||
return "plugged"
|
||||
_:
|
||||
return "unknown"
|
||||
|
||||
|
||||
## True only when the OS reports the device is on battery — used by Layer 3 suspend.
|
||||
static func should_suspend_inference(power_state: int) -> bool:
|
||||
return power_state == _POWER_STATE_ON_BATTERY
|
||||
|
||||
|
||||
## Read current OS power state integer. Returns 0 (UNKNOWN) if unavailable.
|
||||
## Uses callv() to defer method resolution to runtime — avoids compile errors on builds
|
||||
## where OS.get_power_info() is not available (e.g. headless).
|
||||
func current_power_state() -> int:
|
||||
# Try Godot 4.x: OS.get_power_info() → {"power_state": int, "percent": int, ...}
|
||||
if OS.has_method("get_power_info"):
|
||||
var info: Variant = OS.callv("get_power_info", [])
|
||||
if info is Dictionary:
|
||||
return int(info.get("power_state", _POWER_STATE_UNKNOWN))
|
||||
# Fallback: unknown power state → treat as FULL (no inference suspension).
|
||||
return _POWER_STATE_UNKNOWN
|
||||
|
||||
|
||||
func _poll_power() -> void:
|
||||
# Read raw state + battery percent from OS.
|
||||
raw_power_state = _POWER_STATE_UNKNOWN
|
||||
battery_percent = -1
|
||||
if OS.has_method("get_power_info"):
|
||||
var info: Variant = OS.callv("get_power_info", [])
|
||||
if info is Dictionary:
|
||||
raw_power_state = int(info.get("power_state", _POWER_STATE_UNKNOWN))
|
||||
if raw_power_state == _POWER_STATE_ON_BATTERY:
|
||||
battery_percent = int(info.get("percent", -1))
|
||||
|
||||
var new_profile: PowerProfile = PowerProfile.BATTERY \
|
||||
if raw_power_state == _POWER_STATE_ON_BATTERY \
|
||||
else PowerProfile.FULL
|
||||
if new_profile != power_profile:
|
||||
var old_profile := power_profile
|
||||
power_profile = new_profile
|
||||
power_profile_changed.emit(int(old_profile), int(new_profile))
|
||||
|
||||
|
||||
# -- Diagnostics --------------------------------------------------------------
|
||||
|
||||
## Returns all platform properties as a flat dictionary for inclusion in bug reports.
|
||||
func get_diagnostics() -> Dictionary:
|
||||
return {
|
||||
# Power
|
||||
"power_profile": int(power_profile),
|
||||
"raw_power_state": raw_power_state,
|
||||
"battery_percent": battery_percent,
|
||||
# Memory
|
||||
"free_memory_mb": free_memory_mb,
|
||||
"total_memory_mb": total_memory_mb,
|
||||
# CPU
|
||||
"cpu_name": cpu_name,
|
||||
"cpu_logical_cores": cpu_logical_cores,
|
||||
# GPU
|
||||
"gpu_name": gpu_name,
|
||||
"gpu_vendor": gpu_vendor,
|
||||
"gpu_api_version": gpu_api_version,
|
||||
"gpu_type": gpu_type,
|
||||
"gpu_driver_info": Array(gpu_driver_info),
|
||||
# Platform
|
||||
"platform_name": platform_name,
|
||||
"os_version": os_version,
|
||||
"distribution": distribution,
|
||||
"is_sandboxed": is_sandboxed,
|
||||
# Display
|
||||
"screen_count": screen_count,
|
||||
"screen_size": {"x": screen_size.x, "y": screen_size.y},
|
||||
"screen_dpi": screen_dpi,
|
||||
"screen_refresh_rate": screen_refresh_rate,
|
||||
"display_scale": display_scale,
|
||||
# Locale
|
||||
"locale": locale,
|
||||
"locale_language": locale_language,
|
||||
# Paths
|
||||
"user_data_dir": user_data_dir,
|
||||
"config_dir": config_dir,
|
||||
"benchmark_cache_path": benchmark_cache_path,
|
||||
"install_dir": install_dir,
|
||||
"executable_path": executable_path,
|
||||
"cache_dir": cache_dir,
|
||||
"model_dir": model_dir,
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
uid://platform_info_sr
|
||||
@@ -253,6 +253,12 @@ func _process(delta: float) -> void:
|
||||
|
||||
handshake_complete.emit(server_version)
|
||||
_set_state(ConnectionState.CONNECTED)
|
||||
# #646: Request full settings dump on connect — hydrates GameState.ai_enhanced_dialogue_enabled
|
||||
# from server SQLite so the client reflects the authoritative persisted state (D-138).
|
||||
_outbound_buffer.append({
|
||||
"tick": 0,
|
||||
"action_name": "RequestAllSettings",
|
||||
})
|
||||
return
|
||||
|
||||
if _bridge == null:
|
||||
@@ -375,6 +381,9 @@ func receive_bytes(bytes: PackedByteArray) -> void:
|
||||
# #554: Carry forward save/load result (one-shot, consumed by main.gd)
|
||||
if snapshot.get("save_result") == null and _last_snapshot.get("save_result") != null:
|
||||
snapshot["save_result"] = _last_snapshot["save_result"]
|
||||
# #646: Carry forward settings_response (one-shot, consumed by game_state apply_snapshot)
|
||||
if snapshot.get("settings_response") == null and _last_snapshot.get("settings_response") != null:
|
||||
snapshot["settings_response"] = _last_snapshot["settings_response"]
|
||||
_last_snapshot = snapshot
|
||||
|
||||
# Drain the outbound buffer. Returns raw input entries for batch encoding.
|
||||
@@ -418,6 +427,12 @@ static func action_enum_to_wire(action: int) -> String:
|
||||
return "LoadGame" # #554: F6 quickload (D-085)
|
||||
InputMapper.Action.DEBUG_COMMAND:
|
||||
return "DebugCommand" # #581: debug console command dispatch
|
||||
InputMapper.Action.CHANGE_SETTINGS:
|
||||
return "ChangeSettings" # #646: persist setting to server SQLite (D-138)
|
||||
InputMapper.Action.REQUEST_ALL_SETTINGS:
|
||||
return "RequestAllSettings" # #646: unit variant — server sends full settings dump
|
||||
InputMapper.Action.DELETE_SETTING:
|
||||
return "DeleteSetting" # #646: struct variant — delete setting by key
|
||||
_:
|
||||
push_warning("SimBridge: unknown action enum %s" % action)
|
||||
return ""
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
class_name Protocol
|
||||
extends Node
|
||||
## MessagePack codec for the Rust↔Godot wire protocol (D-020).
|
||||
##
|
||||
## Encodes/decodes ObserverSnapshot and PlayerInput to match
|
||||
@@ -11,8 +11,8 @@ class_name Protocol
|
||||
|
||||
## Protocol version — must match server PROTOCOL_VERSION in bridge/types.rs.
|
||||
## Reject snapshots where version != this value.
|
||||
## v19: adds character_archetype field to StartupMessage (#588, #587).
|
||||
const PROTOCOL_VERSION: int = 19
|
||||
## v20: adds settings_response field to ObserverSnapshot (#627, D-138).
|
||||
const PROTOCOL_VERSION: int = 20
|
||||
|
||||
|
||||
# -- Decode: bytes from server → GDScript types --------------------------------
|
||||
@@ -270,6 +270,32 @@ static func decode_snapshot(bytes: PackedByteArray) -> Variant:
|
||||
"triangle_id": int(raw_ev["triangle_id"]),
|
||||
})
|
||||
|
||||
# v20: settings_response (#627, D-138) — server ack after ChangeSettings / full settings dump
|
||||
# after RequestAllSettings. kind = "full"|"ack". "full": settings array [{key, value}].
|
||||
# "ack": {success: bool, key: String, error: String|null}.
|
||||
var settings_response: Variant = null
|
||||
var raw_sr: Variant = raw.get("settings_response")
|
||||
if raw_sr is Dictionary:
|
||||
var sr_kind: String = str(raw_sr.get("kind", ""))
|
||||
if sr_kind == "full":
|
||||
var sr_settings: Array = []
|
||||
var raw_sr_settings: Variant = raw_sr.get("settings")
|
||||
if raw_sr_settings is Array:
|
||||
for raw_s in raw_sr_settings:
|
||||
if raw_s is Dictionary and raw_s.has("key"):
|
||||
sr_settings.append({
|
||||
"key": str(raw_s["key"]),
|
||||
"value": raw_s.get("value"),
|
||||
})
|
||||
settings_response = {"kind": "full", "settings": sr_settings}
|
||||
elif sr_kind == "ack":
|
||||
settings_response = {
|
||||
"kind": "ack",
|
||||
"success": bool(raw_sr.get("success", false)),
|
||||
"key": str(raw_sr.get("key", "")),
|
||||
"error": raw_sr.get("error"),
|
||||
}
|
||||
|
||||
# v19: current_ticker (#592) — scrolling news headline when in The Last Shift zone.
|
||||
# {id: String, text: String, category: String} or null when player outside bar zone.
|
||||
var current_ticker: Variant = null
|
||||
@@ -362,6 +388,7 @@ static func decode_snapshot(bytes: PackedByteArray) -> Variant:
|
||||
"zone_id": zone_id,
|
||||
"triangle_crisis_events": triangle_crisis_events,
|
||||
"current_ticker": current_ticker,
|
||||
"settings_response": settings_response,
|
||||
}
|
||||
|
||||
|
||||
@@ -548,6 +575,24 @@ static func _encode_action(action_name: String, action_data: Variant) -> Variant
|
||||
return action_name
|
||||
|
||||
|
||||
## Encode a ChangeSettings action for the AI-Enhanced Dialogue toggle (#646, D-138).
|
||||
## Returns a MessagePack-encoded Vec<PlayerInput> in buffer-entry format
|
||||
## (action_name + action_data), suitable for inspection in tests and for
|
||||
## queuing via SimBridge._outbound_buffer.
|
||||
## The server receives this as a PlayerAction::ChangeSettings variant.
|
||||
static func encode_change_settings(enabled: bool) -> PackedByteArray:
|
||||
var entries: Array = [{
|
||||
"tick": 0,
|
||||
"action_name": "ChangeSettings",
|
||||
"action_data": {"ai_enhanced_dialogue": enabled},
|
||||
}]
|
||||
var result = Messagepack.encode(entries)
|
||||
if result.status != null:
|
||||
push_error("Protocol: encode_change_settings failed: %s" % result.status)
|
||||
return PackedByteArray()
|
||||
return result.value
|
||||
|
||||
|
||||
## Decode a PlayerInput from MessagePack bytes (used in tests / echo scenarios).
|
||||
## Returns { "tick": int, "action": { "variant": String, "data": Variant } } or null.
|
||||
static func decode_player_input(bytes: PackedByteArray) -> Variant:
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,898 @@
|
||||
## Sprint 26 — AI-Enhanced Dialogue toggle + hardware detection (#646)
|
||||
##
|
||||
## Test-first: written before Stig's implementation. All tests referencing
|
||||
## HardwareDetector or unimplemented settings_dialog methods will be skipped
|
||||
## via push_warning() until the implementation lands.
|
||||
##
|
||||
## Spec: D-138 (LLM re-voicing pipeline — hardware detection requirement)
|
||||
## Workshop: docs/workshops/llm-voice-pipeline/workshop-outcomes.md §8
|
||||
## Ticket: #646
|
||||
class_name TestAiDialogueSprint26
|
||||
extends GdUnitTestSuite
|
||||
|
||||
|
||||
var _original_ai_enabled: bool = true
|
||||
|
||||
|
||||
func before_test() -> void:
|
||||
_original_ai_enabled = GameState.get("ai_enhanced_dialogue_enabled") if \
|
||||
"ai_enhanced_dialogue_enabled" in GameState else true
|
||||
|
||||
|
||||
func after_test() -> void:
|
||||
if "ai_enhanced_dialogue_enabled" in GameState:
|
||||
GameState.set("ai_enhanced_dialogue_enabled", _original_ai_enabled)
|
||||
|
||||
|
||||
func _get_detector() -> Object:
|
||||
var node := get_node_or_null("/root/HardwareDetector")
|
||||
if node == null:
|
||||
push_warning("TestAiDialogueSprint26: HardwareDetector autoload not found — test skipped (awaiting #646)")
|
||||
return node
|
||||
|
||||
|
||||
# -- GameState field ----------------------------------------------------------
|
||||
|
||||
func test_game_state_has_ai_enhanced_dialogue_field() -> void:
|
||||
# D-138: toggle state must live in GameState so all subsystems can read it.
|
||||
assert_bool("ai_enhanced_dialogue_enabled" in GameState).override_failure_message(
|
||||
"GameState must have ai_enhanced_dialogue_enabled field (#646)"
|
||||
).is_true()
|
||||
|
||||
|
||||
func test_game_state_ai_enhanced_dialogue_default_is_true() -> void:
|
||||
# D-138: feature on by default — player can opt out, not opt in.
|
||||
var enabled: Variant = GameState.get("ai_enhanced_dialogue_enabled")
|
||||
assert_bool(enabled).override_failure_message(
|
||||
"GameState.ai_enhanced_dialogue_enabled must default to true (D-138)"
|
||||
).is_true()
|
||||
|
||||
|
||||
func test_game_state_ai_dialogue_toggle_can_be_set_false() -> void:
|
||||
# Toggle must be writable — settings dialog needs to persist changes.
|
||||
GameState.set("ai_enhanced_dialogue_enabled", false)
|
||||
assert_bool(GameState.ai_enhanced_dialogue_enabled).override_failure_message(
|
||||
"GameState.ai_enhanced_dialogue_enabled must be settable to false"
|
||||
).is_false()
|
||||
|
||||
|
||||
func test_game_state_ai_dialogue_toggle_can_be_set_true() -> void:
|
||||
# Re-enable after disable — full round-trip.
|
||||
GameState.set("ai_enhanced_dialogue_enabled", false)
|
||||
GameState.set("ai_enhanced_dialogue_enabled", true)
|
||||
assert_bool(GameState.ai_enhanced_dialogue_enabled).override_failure_message(
|
||||
"GameState.ai_enhanced_dialogue_enabled must be re-settable to true"
|
||||
).is_true()
|
||||
|
||||
|
||||
# -- InputMapper.Action enum --------------------------------------------------
|
||||
|
||||
func test_input_mapper_has_change_settings_action() -> void:
|
||||
# ChangeSettings dispatches through the existing PlayerInput pipeline.
|
||||
assert_bool("CHANGE_SETTINGS" in InputMapper.Action).override_failure_message(
|
||||
"InputMapper.Action must include CHANGE_SETTINGS variant (#646)"
|
||||
).is_true()
|
||||
|
||||
|
||||
# -- Wire protocol (sim_bridge → server) --------------------------------------
|
||||
|
||||
func test_sim_bridge_maps_change_settings_to_wire_name() -> void:
|
||||
# sim_bridge must not silently drop the action — empty string = dropped.
|
||||
if not "CHANGE_SETTINGS" in InputMapper.Action:
|
||||
push_warning("TestAiDialogueSprint26: CHANGE_SETTINGS action not found — test skipped")
|
||||
return
|
||||
var wire_name: String = SimBridge.action_enum_to_wire(InputMapper.Action.CHANGE_SETTINGS)
|
||||
assert_str(wire_name).override_failure_message(
|
||||
"CHANGE_SETTINGS must map to 'ChangeSettings' wire name"
|
||||
).is_equal("ChangeSettings")
|
||||
|
||||
|
||||
func test_protocol_encode_change_settings_produces_valid_bytes() -> void:
|
||||
# Protocol.encode_change_settings() is the helper for testability (mirrors encode_startup_message).
|
||||
var bytes: PackedByteArray = Protocol.encode_change_settings(true)
|
||||
assert_bool(bytes.size() > 0).override_failure_message(
|
||||
"Protocol.encode_change_settings(true) must produce non-empty bytes"
|
||||
).is_true()
|
||||
|
||||
|
||||
func test_protocol_change_settings_wire_has_action_name_key() -> void:
|
||||
# Wire payload is Vec<PlayerInput> — each input map must have "action_name".
|
||||
var bytes: PackedByteArray = Protocol.encode_change_settings(true)
|
||||
var decoded = Messagepack.decode(bytes)
|
||||
assert_that(decoded.status).is_null()
|
||||
var inputs: Array = decoded.value
|
||||
assert_bool(inputs.size() > 0).override_failure_message(
|
||||
"ChangeSettings wire payload must be a non-empty array of PlayerInputs"
|
||||
).is_true()
|
||||
assert_str(inputs[0].get("action_name", "")).override_failure_message(
|
||||
"PlayerInput.action_name must be 'ChangeSettings'"
|
||||
).is_equal("ChangeSettings")
|
||||
|
||||
|
||||
func test_protocol_change_settings_wire_enabled_true() -> void:
|
||||
# action_data.ai_enhanced_dialogue = true when enabling.
|
||||
var bytes: PackedByteArray = Protocol.encode_change_settings(true)
|
||||
var decoded = Messagepack.decode(bytes)
|
||||
assert_that(decoded.status).is_null()
|
||||
var inputs: Array = decoded.value
|
||||
var action_data: Dictionary = inputs[0].get("action_data", {})
|
||||
assert_bool(action_data.get("ai_enhanced_dialogue", false)).override_failure_message(
|
||||
"ChangeSettings action_data.ai_enhanced_dialogue must be true when enabling"
|
||||
).is_true()
|
||||
|
||||
|
||||
func test_protocol_change_settings_wire_enabled_false() -> void:
|
||||
# action_data.ai_enhanced_dialogue = false when disabling.
|
||||
var bytes: PackedByteArray = Protocol.encode_change_settings(false)
|
||||
var decoded = Messagepack.decode(bytes)
|
||||
assert_that(decoded.status).is_null()
|
||||
var inputs: Array = decoded.value
|
||||
var action_data: Dictionary = inputs[0].get("action_data", {})
|
||||
assert_bool(action_data.get("ai_enhanced_dialogue", true)).override_failure_message(
|
||||
"ChangeSettings action_data.ai_enhanced_dialogue must be false when disabling"
|
||||
).is_false()
|
||||
|
||||
|
||||
# -- HardwareDetector constants (D-138 §8) ------------------------------------
|
||||
|
||||
func test_hardware_detector_ram_pass_threshold_is_2000mb() -> void:
|
||||
# D-138 §8 Layer 1: ≥ 2.0 GB free RAM → pass.
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_float(float(det.RAM_PASS_THRESHOLD_MB)).override_failure_message(
|
||||
"RAM_PASS_THRESHOLD_MB must be 2000.0 (D-138 §8)"
|
||||
).is_equal(2000.0)
|
||||
|
||||
|
||||
func test_hardware_detector_ram_marginal_threshold_is_1600mb() -> void:
|
||||
# D-138 §8 Layer 1: 1.6–2.0 GB → marginal (warn, let player proceed).
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_float(float(det.RAM_MARGINAL_THRESHOLD_MB)).override_failure_message(
|
||||
"RAM_MARGINAL_THRESHOLD_MB must be 1600.0 (D-138 §8)"
|
||||
).is_equal(1600.0)
|
||||
|
||||
|
||||
func test_hardware_detector_tpt_green_threshold_is_6() -> void:
|
||||
# D-138 §8 Layer 2: ≥ 6 t/s → green (enable silently).
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_float(float(det.TPT_GREEN_THRESHOLD)).override_failure_message(
|
||||
"TPT_GREEN_THRESHOLD must be 6.0 (D-138 §8)"
|
||||
).is_equal(6.0)
|
||||
|
||||
|
||||
func test_hardware_detector_tpt_yellow_threshold_is_3() -> void:
|
||||
# D-138 §8 Layer 2: 3–6 t/s → yellow (partial pre-voicing message).
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_float(float(det.TPT_YELLOW_THRESHOLD)).override_failure_message(
|
||||
"TPT_YELLOW_THRESHOLD must be 3.0 (D-138 §8)"
|
||||
).is_equal(3.0)
|
||||
|
||||
|
||||
func test_hardware_detector_degradation_threshold_is_0_4() -> void:
|
||||
# D-138 §8 Layer 3: sustained >40% TPT drop from baseline → yellow status.
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_float(float(det.TPT_DEGRADATION_THRESHOLD)).override_failure_message(
|
||||
"TPT_DEGRADATION_THRESHOLD must be 0.4 (D-138 §8 Layer 3)"
|
||||
).is_equal(0.4)
|
||||
|
||||
|
||||
# -- Layer 1: classify_ram() --------------------------------------------------
|
||||
|
||||
func test_hardware_classify_ram_pass_above_2gb() -> void:
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_str(det.classify_ram(2048.0)).override_failure_message(
|
||||
"classify_ram(2048) must return 'pass' (D-138 §8)"
|
||||
).is_equal("pass")
|
||||
|
||||
|
||||
func test_hardware_classify_ram_pass_at_exact_boundary() -> void:
|
||||
# Exactly 2000 MB is a pass (≥ 2.0 GB).
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_str(det.classify_ram(2000.0)).override_failure_message(
|
||||
"classify_ram(2000) must return 'pass' — exact boundary"
|
||||
).is_equal("pass")
|
||||
|
||||
|
||||
func test_hardware_classify_ram_marginal_between_1600_and_2000() -> void:
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_str(det.classify_ram(1800.0)).override_failure_message(
|
||||
"classify_ram(1800) must return 'marginal' (1.6–2.0 GB range)"
|
||||
).is_equal("marginal")
|
||||
|
||||
|
||||
func test_hardware_classify_ram_marginal_at_lower_boundary() -> void:
|
||||
# Exactly 1600 MB — marginal (≥ 1.6 GB but < 2.0 GB).
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_str(det.classify_ram(1600.0)).override_failure_message(
|
||||
"classify_ram(1600) must return 'marginal' — exact lower boundary"
|
||||
).is_equal("marginal")
|
||||
|
||||
|
||||
func test_hardware_classify_ram_fail_below_1600() -> void:
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_str(det.classify_ram(1024.0)).override_failure_message(
|
||||
"classify_ram(1024) must return 'fail' (< 1.6 GB)"
|
||||
).is_equal("fail")
|
||||
|
||||
|
||||
func test_hardware_classify_ram_fail_just_below_marginal_threshold() -> void:
|
||||
# 1599 MB — just below marginal, must be fail not marginal.
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_str(det.classify_ram(1599.0)).override_failure_message(
|
||||
"classify_ram(1599) must return 'fail' — 1 MB below marginal threshold"
|
||||
).is_equal("fail")
|
||||
|
||||
|
||||
# -- Layer 2: classify_tpt() --------------------------------------------------
|
||||
|
||||
func test_hardware_classify_tpt_green_above_6() -> void:
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_str(det.classify_tpt(8.0)).override_failure_message(
|
||||
"classify_tpt(8.0) must return 'green' (D-138 §8)"
|
||||
).is_equal("green")
|
||||
|
||||
|
||||
func test_hardware_classify_tpt_green_at_exact_threshold() -> void:
|
||||
# Exactly 6 t/s → green.
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_str(det.classify_tpt(6.0)).override_failure_message(
|
||||
"classify_tpt(6.0) must return 'green' — exact boundary"
|
||||
).is_equal("green")
|
||||
|
||||
|
||||
func test_hardware_classify_tpt_yellow_between_3_and_6() -> void:
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_str(det.classify_tpt(4.5)).override_failure_message(
|
||||
"classify_tpt(4.5) must return 'yellow' (3–6 t/s range)"
|
||||
).is_equal("yellow")
|
||||
|
||||
|
||||
func test_hardware_classify_tpt_yellow_at_lower_boundary() -> void:
|
||||
# Exactly 3 t/s → yellow (≥ 3 t/s but < 6 t/s).
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_str(det.classify_tpt(3.0)).override_failure_message(
|
||||
"classify_tpt(3.0) must return 'yellow' — exact lower boundary"
|
||||
).is_equal("yellow")
|
||||
|
||||
|
||||
func test_hardware_classify_tpt_red_below_3() -> void:
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_str(det.classify_tpt(1.5)).override_failure_message(
|
||||
"classify_tpt(1.5) must return 'red' (< 3 t/s)"
|
||||
).is_equal("red")
|
||||
|
||||
|
||||
func test_hardware_classify_tpt_red_just_below_yellow_threshold() -> void:
|
||||
# 2.9 t/s — just below yellow.
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_str(det.classify_tpt(2.9)).override_failure_message(
|
||||
"classify_tpt(2.9) must return 'red' — just below yellow threshold"
|
||||
).is_equal("red")
|
||||
|
||||
|
||||
# -- Layer 3: classify_degradation() -----------------------------------------
|
||||
|
||||
func test_hardware_classify_degradation_ok_at_25_percent() -> void:
|
||||
# 25% slower than baseline → ok (threshold is >40%).
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
var baseline: float = 8.0
|
||||
var current_avg: float = baseline * 0.75
|
||||
assert_str(det.classify_degradation(baseline, current_avg)).override_failure_message(
|
||||
"25%% degradation must return 'ok' (threshold is >40%%)"
|
||||
).is_equal("ok")
|
||||
|
||||
|
||||
func test_hardware_classify_degradation_yellow_at_55_percent() -> void:
|
||||
# 55% slower — thermal throttling triggers yellow notification.
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
var baseline: float = 8.0
|
||||
var current_avg: float = baseline * 0.45
|
||||
assert_str(det.classify_degradation(baseline, current_avg)).override_failure_message(
|
||||
"55%% degradation must return 'yellow' (D-138 §8 Layer 3)"
|
||||
).is_equal("yellow")
|
||||
|
||||
|
||||
func test_hardware_classify_degradation_ok_at_exact_40_percent() -> void:
|
||||
# Spec says ">40%" → at exactly 40% the result is still "ok".
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
var baseline: float = 10.0
|
||||
var current_avg: float = 6.0 # exactly 40% slower
|
||||
assert_str(det.classify_degradation(baseline, current_avg)).override_failure_message(
|
||||
"Exactly 40%% degradation must return 'ok' — spec says >40%% triggers yellow"
|
||||
).is_equal("ok")
|
||||
|
||||
|
||||
# -- Settings dialog: toggle label and greyed-out state -----------------------
|
||||
|
||||
func test_settings_dialog_exposes_ai_dialogue_label_text_method() -> void:
|
||||
# settings_dialog needs a testable API — hardcoded UI strings are easy to drift.
|
||||
var scene := load("res://ui/settings_dialog.tscn") as PackedScene
|
||||
if scene == null:
|
||||
push_warning("TestAiDialogueSprint26: settings_dialog.tscn not found — skipped")
|
||||
return
|
||||
var dialog := scene.instantiate()
|
||||
auto_free(dialog)
|
||||
add_child(dialog)
|
||||
assert_bool(dialog.has_method("get_ai_dialogue_label_text")).override_failure_message(
|
||||
"settings_dialog must expose get_ai_dialogue_label_text() for label drift detection"
|
||||
).is_true()
|
||||
|
||||
|
||||
func test_settings_dialog_ai_dialogue_label_is_correct() -> void:
|
||||
# D-138: label must be exactly "AI-Enhanced Dialogue" (Jeroen's wording).
|
||||
var scene := load("res://ui/settings_dialog.tscn") as PackedScene
|
||||
if scene == null:
|
||||
push_warning("TestAiDialogueSprint26: settings_dialog.tscn not found — skipped")
|
||||
return
|
||||
var dialog := scene.instantiate()
|
||||
auto_free(dialog)
|
||||
add_child(dialog)
|
||||
if not dialog.has_method("get_ai_dialogue_label_text"):
|
||||
push_warning("TestAiDialogueSprint26: get_ai_dialogue_label_text() not implemented — skipped")
|
||||
return
|
||||
assert_str(dialog.get_ai_dialogue_label_text()).override_failure_message(
|
||||
"AI-Enhanced Dialogue toggle label must be exactly 'AI-Enhanced Dialogue' (D-138)"
|
||||
).is_equal("AI-Enhanced Dialogue")
|
||||
|
||||
|
||||
func test_settings_dialog_toggle_disabled_when_hardware_fails() -> void:
|
||||
# D-138 §8: RAM < 1.6 GB → feature disabled, toggle greyed out.
|
||||
# Player receives message but cannot enable the feature.
|
||||
var scene := load("res://ui/settings_dialog.tscn") as PackedScene
|
||||
if scene == null:
|
||||
push_warning("TestAiDialogueSprint26: settings_dialog.tscn not found — skipped")
|
||||
return
|
||||
var dialog := scene.instantiate()
|
||||
auto_free(dialog)
|
||||
add_child(dialog)
|
||||
if not dialog.has_method("set_ai_dialogue_hardware_status") \
|
||||
or not dialog.has_method("is_ai_dialogue_toggle_enabled"):
|
||||
push_warning("TestAiDialogueSprint26: hardware status API not implemented — skipped")
|
||||
return
|
||||
dialog.set_ai_dialogue_hardware_status("fail")
|
||||
assert_bool(dialog.is_ai_dialogue_toggle_enabled()).override_failure_message(
|
||||
"Toggle must be disabled (greyed out) when hardware status is 'fail' (D-138 §8)"
|
||||
).is_false()
|
||||
|
||||
|
||||
func test_settings_dialog_toggle_enabled_when_hardware_passes() -> void:
|
||||
# "pass" → toggle available to interact with.
|
||||
var scene := load("res://ui/settings_dialog.tscn") as PackedScene
|
||||
if scene == null:
|
||||
push_warning("TestAiDialogueSprint26: settings_dialog.tscn not found — skipped")
|
||||
return
|
||||
var dialog := scene.instantiate()
|
||||
auto_free(dialog)
|
||||
add_child(dialog)
|
||||
if not dialog.has_method("set_ai_dialogue_hardware_status") \
|
||||
or not dialog.has_method("is_ai_dialogue_toggle_enabled"):
|
||||
push_warning("TestAiDialogueSprint26: hardware status API not implemented — skipped")
|
||||
return
|
||||
dialog.set_ai_dialogue_hardware_status("pass")
|
||||
assert_bool(dialog.is_ai_dialogue_toggle_enabled()).override_failure_message(
|
||||
"Toggle must be enabled when hardware status is 'pass'"
|
||||
).is_true()
|
||||
|
||||
|
||||
func test_settings_dialog_toggle_enabled_when_hardware_marginal() -> void:
|
||||
# D-138 §8: "marginal" → warn but let player proceed. Never force-disable.
|
||||
var scene := load("res://ui/settings_dialog.tscn") as PackedScene
|
||||
if scene == null:
|
||||
push_warning("TestAiDialogueSprint26: settings_dialog.tscn not found — skipped")
|
||||
return
|
||||
var dialog := scene.instantiate()
|
||||
auto_free(dialog)
|
||||
add_child(dialog)
|
||||
if not dialog.has_method("set_ai_dialogue_hardware_status") \
|
||||
or not dialog.has_method("is_ai_dialogue_toggle_enabled"):
|
||||
push_warning("TestAiDialogueSprint26: hardware status API not implemented — skipped")
|
||||
return
|
||||
dialog.set_ai_dialogue_hardware_status("marginal")
|
||||
assert_bool(dialog.is_ai_dialogue_toggle_enabled()).override_failure_message(
|
||||
"Toggle must remain enabled when status is 'marginal' — player can always override (D-138)"
|
||||
).is_true()
|
||||
|
||||
|
||||
# -- Benchmark cache path (D-138 §8 Layer 2) ----------------------------------
|
||||
|
||||
func test_hardware_detector_benchmark_cache_path_is_correct() -> void:
|
||||
# D-138 §8 Layer 2: cached in {user_data}/ai-dialogue-config.json.
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_str(det.BENCHMARK_CACHE_PATH).override_failure_message(
|
||||
"BENCHMARK_CACHE_PATH must be 'user://ai-dialogue-config.json' (D-138 §8)"
|
||||
).is_equal("user://ai-dialogue-config.json")
|
||||
|
||||
|
||||
# -- Startup pref loading (regression guard) ----------------------------------
|
||||
|
||||
func test_hardware_detector_has_load_ai_pref_method_or_game_state_loads_on_startup() -> void:
|
||||
# REGRESSION: Player preference must survive session restarts.
|
||||
# Either HardwareDetector exposes load_ai_pref() so _ready() can restore
|
||||
# GameState.ai_enhanced_dialogue_enabled, or another autoload must do it.
|
||||
# This test fails until the startup-load path is implemented.
|
||||
# Spec: D-138 §8 toggle persists via #627 (SQLite) + ConfigFile (client-local).
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_bool(det.has_method("load_ai_pref")).override_failure_message(
|
||||
"HardwareDetector must expose load_ai_pref() — called at startup to restore " +
|
||||
"GameState.ai_enhanced_dialogue_enabled from user://settings.cfg. " +
|
||||
"Without this, the toggle resets to true on every session restart."
|
||||
).is_true()
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# PlatformInfo (D-141) — power profile, constants, classification
|
||||
# =============================================================================
|
||||
#
|
||||
# Power state integer mapping (Godot 4, matches OS.POWERSTATE_* values):
|
||||
# 0 = UNKNOWN, 1 = ON_BATTERY, 2 = NO_BATTERY, 3 = CHARGING, 4 = CHARGED
|
||||
#
|
||||
# Integer literals are used throughout — OS.POWERSTATE_* don't exist in this build.
|
||||
# PlatformInfo._POWER_STATE_* are private; PlatformInfo.PowerProfile enum is public.
|
||||
|
||||
|
||||
func _get_platform_info() -> Node:
|
||||
var node := get_node_or_null("/root/PlatformInfo")
|
||||
if node == null:
|
||||
push_warning("TestAiDialogueSprint26: PlatformInfo autoload not found — test skipped (awaiting #659)")
|
||||
return node
|
||||
|
||||
|
||||
# -- PowerProfile enum (D-141) ------------------------------------------------
|
||||
|
||||
func test_platform_info_power_profile_full_is_0() -> void:
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
assert_int(pi.PowerProfile.FULL).override_failure_message(
|
||||
"PowerProfile.FULL must be 0 (D-141)"
|
||||
).is_equal(0)
|
||||
|
||||
|
||||
func test_platform_info_power_profile_battery_is_1() -> void:
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
assert_int(pi.PowerProfile.BATTERY).override_failure_message(
|
||||
"PowerProfile.BATTERY must be 1 (D-141)"
|
||||
).is_equal(1)
|
||||
|
||||
|
||||
func test_platform_info_power_profile_power_saver_is_2() -> void:
|
||||
# POWER_SAVER = 2 is reserved for future OS API — no cross-platform detection yet.
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
assert_int(pi.PowerProfile.POWER_SAVER).override_failure_message(
|
||||
"PowerProfile.POWER_SAVER must be 2 (D-141 — reserved for future API)"
|
||||
).is_equal(2)
|
||||
|
||||
|
||||
func test_platform_info_power_poll_interval_is_30_seconds() -> void:
|
||||
# 30-second poll timer — balances responsiveness vs CPU cost (D-141).
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
assert_float(float(pi.POWER_POLL_INTERVAL)).override_failure_message(
|
||||
"POWER_POLL_INTERVAL must be 30.0 seconds (D-141)"
|
||||
).is_equal(30.0)
|
||||
|
||||
|
||||
# -- classify_power_state() (D-141 / D-138 §8) --------------------------------
|
||||
|
||||
func test_platform_info_classify_on_battery_returns_battery() -> void:
|
||||
# 1 = OS ON_BATTERY → "battery" — this is the suspend trigger.
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
assert_str(pi.classify_power_state(1)).override_failure_message(
|
||||
"classify_power_state(1 = ON_BATTERY) must return 'battery'"
|
||||
).is_equal("battery")
|
||||
|
||||
|
||||
func test_platform_info_classify_no_battery_returns_plugged() -> void:
|
||||
# 2 = NO_BATTERY (desktop) → "plugged" — never suspend on a desktop.
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
assert_str(pi.classify_power_state(2)).override_failure_message(
|
||||
"classify_power_state(2 = NO_BATTERY) must return 'plugged'"
|
||||
).is_equal("plugged")
|
||||
|
||||
|
||||
func test_platform_info_classify_charging_returns_plugged() -> void:
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
assert_str(pi.classify_power_state(3)).override_failure_message(
|
||||
"classify_power_state(3 = CHARGING) must return 'plugged'"
|
||||
).is_equal("plugged")
|
||||
|
||||
|
||||
func test_platform_info_classify_charged_returns_plugged() -> void:
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
assert_str(pi.classify_power_state(4)).override_failure_message(
|
||||
"classify_power_state(4 = CHARGED) must return 'plugged'"
|
||||
).is_equal("plugged")
|
||||
|
||||
|
||||
func test_platform_info_classify_unknown_returns_unknown() -> void:
|
||||
# 0 = UNKNOWN → do not suspend. Erring toward inference on ambiguous state.
|
||||
# Also the default Godot returns on platforms without power API support.
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
assert_str(pi.classify_power_state(0)).override_failure_message(
|
||||
"classify_power_state(0 = UNKNOWN) must return 'unknown' — do not suspend on ambiguous state"
|
||||
).is_equal("unknown")
|
||||
|
||||
|
||||
# -- should_suspend_inference() (D-141 / D-138 §8) ----------------------------
|
||||
|
||||
func test_platform_info_should_suspend_on_battery() -> void:
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
assert_bool(pi.should_suspend_inference(1)).override_failure_message(
|
||||
"should_suspend_inference(1 = ON_BATTERY) must return true (D-138 §8 Layer 3)"
|
||||
).is_true()
|
||||
|
||||
|
||||
func test_platform_info_should_not_suspend_on_no_battery() -> void:
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
assert_bool(pi.should_suspend_inference(2)).override_failure_message(
|
||||
"should_suspend_inference(2 = NO_BATTERY) must return false — desktop"
|
||||
).is_false()
|
||||
|
||||
|
||||
func test_platform_info_should_not_suspend_when_charging() -> void:
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
assert_bool(pi.should_suspend_inference(3)).override_failure_message(
|
||||
"should_suspend_inference(3 = CHARGING) must return false"
|
||||
).is_false()
|
||||
|
||||
|
||||
func test_platform_info_should_not_suspend_when_charged() -> void:
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
assert_bool(pi.should_suspend_inference(4)).override_failure_message(
|
||||
"should_suspend_inference(4 = CHARGED) must return false"
|
||||
).is_false()
|
||||
|
||||
|
||||
func test_platform_info_should_not_suspend_on_unknown() -> void:
|
||||
# UNKNOWN → do not suspend. Prevents false-positive suspension on platforms
|
||||
# where Godot's power API returns 0 unconditionally (e.g. some headless builds).
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
assert_bool(pi.should_suspend_inference(0)).override_failure_message(
|
||||
"should_suspend_inference(0 = UNKNOWN) must return false — do not suspend on unknown state"
|
||||
).is_false()
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# HardwareDetector — power state delegation + battery suspend/resume
|
||||
# =============================================================================
|
||||
|
||||
|
||||
func test_hardware_detector_classify_power_state_delegates_to_platform_info() -> void:
|
||||
# HardwareDetector.classify_power_state() must agree with PlatformInfo (D-141).
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_str(det.classify_power_state(1)).override_failure_message(
|
||||
"HardwareDetector.classify_power_state(1) must return 'battery' (delegates to PlatformInfo)"
|
||||
).is_equal("battery")
|
||||
assert_str(det.classify_power_state(3)).override_failure_message(
|
||||
"HardwareDetector.classify_power_state(3) must return 'plugged'"
|
||||
).is_equal("plugged")
|
||||
assert_str(det.classify_power_state(0)).override_failure_message(
|
||||
"HardwareDetector.classify_power_state(0) must return 'unknown'"
|
||||
).is_equal("unknown")
|
||||
|
||||
|
||||
func test_hardware_detector_should_suspend_delegates_to_platform_info() -> void:
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
assert_bool(det.should_suspend_inference(1)).override_failure_message(
|
||||
"HardwareDetector.should_suspend_inference(1) must return true (delegates to PlatformInfo)"
|
||||
).is_true()
|
||||
assert_bool(det.should_suspend_inference(2)).override_failure_message(
|
||||
"HardwareDetector.should_suspend_inference(2) must return false"
|
||||
).is_false()
|
||||
|
||||
|
||||
func test_hardware_detector_check_power_state_returns_required_keys() -> void:
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
var result: Dictionary = det.check_power_state()
|
||||
assert_bool(result.has("power_state")).override_failure_message(
|
||||
"check_power_state() must include 'power_state' key (raw int)"
|
||||
).is_true()
|
||||
assert_bool(result.has("classification")).override_failure_message(
|
||||
"check_power_state() must include 'classification' key"
|
||||
).is_true()
|
||||
assert_bool(result.has("should_suspend")).override_failure_message(
|
||||
"check_power_state() must include 'should_suspend' key"
|
||||
).is_true()
|
||||
|
||||
|
||||
func test_hardware_detector_check_power_state_fields_are_consistent() -> void:
|
||||
# The three fields must be internally consistent — not independently computed.
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
var result: Dictionary = det.check_power_state()
|
||||
var expected_class: String = det.classify_power_state(result["power_state"])
|
||||
var expected_suspend: bool = det.should_suspend_inference(result["power_state"])
|
||||
assert_str(result["classification"]).override_failure_message(
|
||||
"check_power_state().classification must match classify_power_state(power_state)"
|
||||
).is_equal(expected_class)
|
||||
assert_bool(result["should_suspend"]).override_failure_message(
|
||||
"check_power_state().should_suspend must match should_suspend_inference(power_state)"
|
||||
).is_equal(expected_suspend)
|
||||
|
||||
|
||||
func test_hardware_detector_inference_not_suspended_by_default() -> void:
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
# Skip if CI is running on battery hardware — power state 1 = ON_BATTERY.
|
||||
# Integer literal used: OS.POWERSTATE_* constants don't exist in this build.
|
||||
var pi := _get_platform_info()
|
||||
if pi != null and pi.current_power_state() == 1:
|
||||
push_warning("TestAiDialogueSprint26: system is on battery (state=1) — skipping default-suspended test")
|
||||
return
|
||||
assert_bool(det.is_inference_suspended()).override_failure_message(
|
||||
"is_inference_suspended() must be false when hardware is FULL/plugged (D-138 §8)"
|
||||
).is_false()
|
||||
|
||||
|
||||
func test_hardware_detector_suspend_sets_inference_suspended() -> void:
|
||||
# Directly trigger the signal handler to simulate battery transition.
|
||||
# Uses PlatformInfo.PowerProfile enum values — no OS.POWERSTATE_* dependency.
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
# Ensure a clean starting state.
|
||||
det._on_power_profile_changed(pi.PowerProfile.BATTERY, pi.PowerProfile.FULL)
|
||||
assert_bool(det.is_inference_suspended()).is_false()
|
||||
# Simulate plug-out → battery.
|
||||
det._on_power_profile_changed(pi.PowerProfile.FULL, pi.PowerProfile.BATTERY)
|
||||
assert_bool(det.is_inference_suspended()).override_failure_message(
|
||||
"inference_suspended must be true after FULL→BATTERY transition (D-138 §8 Layer 3)"
|
||||
).is_true()
|
||||
# Cleanup — restore before next test.
|
||||
det._on_power_profile_changed(pi.PowerProfile.BATTERY, pi.PowerProfile.FULL)
|
||||
|
||||
|
||||
func test_hardware_detector_resume_clears_inference_suspended() -> void:
|
||||
# Suspend then resume — verify suspended flag is cleared on plug-in.
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
det._on_power_profile_changed(pi.PowerProfile.FULL, pi.PowerProfile.BATTERY)
|
||||
assert_bool(det.is_inference_suspended()).is_true()
|
||||
det._on_power_profile_changed(pi.PowerProfile.BATTERY, pi.PowerProfile.FULL)
|
||||
assert_bool(det.is_inference_suspended()).override_failure_message(
|
||||
"is_inference_suspended() must be false after BATTERY→FULL transition (resume on plug-in)"
|
||||
).is_false()
|
||||
|
||||
|
||||
func test_hardware_detector_battery_suspend_preserves_player_pref_false() -> void:
|
||||
# If the player had disabled AI dialogue, battery suspend must NOT re-enable it on resume.
|
||||
# _pre_battery_pref is saved as false → resume does NOT send ChangeSettings(true).
|
||||
# We verify this indirectly: inference_suspended goes false and GameState is unchanged.
|
||||
var det := _get_detector()
|
||||
if det == null:
|
||||
return
|
||||
var pi := _get_platform_info()
|
||||
if pi == null:
|
||||
return
|
||||
var saved_pref: bool = GameState.ai_enhanced_dialogue_enabled
|
||||
GameState.ai_enhanced_dialogue_enabled = false
|
||||
det._on_power_profile_changed(pi.PowerProfile.FULL, pi.PowerProfile.BATTERY)
|
||||
det._on_power_profile_changed(pi.PowerProfile.BATTERY, pi.PowerProfile.FULL)
|
||||
assert_bool(det.is_inference_suspended()).is_false()
|
||||
assert_bool(GameState.ai_enhanced_dialogue_enabled).override_failure_message(
|
||||
"GameState.ai_enhanced_dialogue_enabled must remain false after battery resume — " +
|
||||
"player's opt-out must survive a battery suspend/resume cycle"
|
||||
).is_false()
|
||||
# Restore.
|
||||
GameState.ai_enhanced_dialogue_enabled = saved_pref
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# Settings dialog — battery-suspended state display (D-138 §8 Layer 3)
|
||||
# =============================================================================
|
||||
|
||||
|
||||
func test_settings_dialog_inference_suspended_state_defaults_false() -> void:
|
||||
var scene := load("res://ui/settings_dialog.tscn") as PackedScene
|
||||
if scene == null:
|
||||
push_warning("TestAiDialogueSprint26: settings_dialog.tscn not found — skipped")
|
||||
return
|
||||
var dialog := scene.instantiate()
|
||||
auto_free(dialog)
|
||||
add_child(dialog)
|
||||
assert_bool(dialog.is_ai_inference_suspended()).override_failure_message(
|
||||
"is_ai_inference_suspended() must default to false"
|
||||
).is_false()
|
||||
|
||||
|
||||
func test_settings_dialog_set_inference_suspended_true() -> void:
|
||||
var scene := load("res://ui/settings_dialog.tscn") as PackedScene
|
||||
if scene == null:
|
||||
push_warning("TestAiDialogueSprint26: settings_dialog.tscn not found — skipped")
|
||||
return
|
||||
var dialog := scene.instantiate()
|
||||
auto_free(dialog)
|
||||
add_child(dialog)
|
||||
dialog.set_ai_inference_suspended(true)
|
||||
assert_bool(dialog.is_ai_inference_suspended()).override_failure_message(
|
||||
"is_ai_inference_suspended() must return true after set_ai_inference_suspended(true)"
|
||||
).is_true()
|
||||
|
||||
|
||||
func test_settings_dialog_resume_clears_suspended_state() -> void:
|
||||
# D-138 §8: resume when plugged in — suspended state clears.
|
||||
var scene := load("res://ui/settings_dialog.tscn") as PackedScene
|
||||
if scene == null:
|
||||
push_warning("TestAiDialogueSprint26: settings_dialog.tscn not found — skipped")
|
||||
return
|
||||
var dialog := scene.instantiate()
|
||||
auto_free(dialog)
|
||||
add_child(dialog)
|
||||
dialog.set_ai_inference_suspended(true)
|
||||
dialog.set_ai_inference_suspended(false)
|
||||
assert_bool(dialog.is_ai_inference_suspended()).override_failure_message(
|
||||
"is_ai_inference_suspended() must return false after set_ai_inference_suspended(false)"
|
||||
).is_false()
|
||||
|
||||
|
||||
func test_settings_dialog_toggle_remains_enabled_when_battery_suspended() -> void:
|
||||
# D-138: player autonomy is respected at every hardware decision.
|
||||
# Battery suspend auto-pauses inference but must NOT grey the toggle —
|
||||
# the player can click it to override the suspension.
|
||||
# Only hardware "fail" (RAM < 1.6 GB) may disable the toggle.
|
||||
var scene := load("res://ui/settings_dialog.tscn") as PackedScene
|
||||
if scene == null:
|
||||
push_warning("TestAiDialogueSprint26: settings_dialog.tscn not found — skipped")
|
||||
return
|
||||
var dialog := scene.instantiate()
|
||||
auto_free(dialog)
|
||||
add_child(dialog)
|
||||
dialog.set_ai_dialogue_hardware_status("pass")
|
||||
dialog.set_ai_inference_suspended(true)
|
||||
assert_bool(dialog.is_ai_dialogue_toggle_enabled()).override_failure_message(
|
||||
"Toggle must remain clickable when battery-suspended — player can override (D-138)"
|
||||
).is_true()
|
||||
|
||||
|
||||
func test_settings_dialog_toggle_enabled_after_resume() -> void:
|
||||
# After resume (plug-in), toggle must be enabled again.
|
||||
var scene := load("res://ui/settings_dialog.tscn") as PackedScene
|
||||
if scene == null:
|
||||
push_warning("TestAiDialogueSprint26: settings_dialog.tscn not found — skipped")
|
||||
return
|
||||
var dialog := scene.instantiate()
|
||||
auto_free(dialog)
|
||||
add_child(dialog)
|
||||
dialog.set_ai_dialogue_hardware_status("pass")
|
||||
dialog.set_ai_inference_suspended(true)
|
||||
dialog.set_ai_inference_suspended(false)
|
||||
assert_bool(dialog.is_ai_dialogue_toggle_enabled()).override_failure_message(
|
||||
"Toggle must be re-enabled after battery resume (set_ai_inference_suspended(false))"
|
||||
).is_true()
|
||||
|
||||
|
||||
func test_settings_dialog_toggle_disabled_by_hardware_fail_even_when_suspended() -> void:
|
||||
# Hardware "fail" disables the toggle regardless of battery state.
|
||||
# RAM < 1.6 GB is the only hard disable — battery suspend is not.
|
||||
var scene := load("res://ui/settings_dialog.tscn") as PackedScene
|
||||
if scene == null:
|
||||
push_warning("TestAiDialogueSprint26: settings_dialog.tscn not found — skipped")
|
||||
return
|
||||
var dialog := scene.instantiate()
|
||||
auto_free(dialog)
|
||||
add_child(dialog)
|
||||
dialog.set_ai_dialogue_hardware_status("fail")
|
||||
dialog.set_ai_inference_suspended(true)
|
||||
assert_bool(dialog.is_ai_dialogue_toggle_enabled()).override_failure_message(
|
||||
"Toggle must be disabled when hardware is 'fail' — battery suspend state is irrelevant"
|
||||
).is_false()
|
||||
|
||||
|
||||
func test_settings_dialog_warning_label_shown_when_battery_suspended() -> void:
|
||||
# When inference is battery-suspended, a warning label must be visible
|
||||
# so the player knows why inference isn't running (even though toggle is enabled).
|
||||
var scene := load("res://ui/settings_dialog.tscn") as PackedScene
|
||||
if scene == null:
|
||||
push_warning("TestAiDialogueSprint26: settings_dialog.tscn not found — skipped")
|
||||
return
|
||||
var dialog := scene.instantiate()
|
||||
auto_free(dialog)
|
||||
add_child(dialog)
|
||||
if not dialog.has_method("get_battery_warning_visible"):
|
||||
push_warning("TestAiDialogueSprint26: get_battery_warning_visible() not yet implemented — skipped")
|
||||
return
|
||||
dialog.set_ai_inference_suspended(true)
|
||||
assert_bool(dialog.get_battery_warning_visible()).override_failure_message(
|
||||
"Battery warning label must be visible when inference is suspended (toggle is on but paused)"
|
||||
).is_true()
|
||||
|
||||
|
||||
func test_settings_dialog_warning_label_hidden_when_not_suspended() -> void:
|
||||
# Warning label must not show when plugged in — no battery message needed.
|
||||
var scene := load("res://ui/settings_dialog.tscn") as PackedScene
|
||||
if scene == null:
|
||||
push_warning("TestAiDialogueSprint26: settings_dialog.tscn not found — skipped")
|
||||
return
|
||||
var dialog := scene.instantiate()
|
||||
auto_free(dialog)
|
||||
add_child(dialog)
|
||||
if not dialog.has_method("get_battery_warning_visible"):
|
||||
push_warning("TestAiDialogueSprint26: get_battery_warning_visible() not yet implemented — skipped")
|
||||
return
|
||||
dialog.set_ai_inference_suspended(false)
|
||||
assert_bool(dialog.get_battery_warning_visible()).override_failure_message(
|
||||
"Battery warning label must be hidden when inference is not suspended"
|
||||
).is_false()
|
||||
@@ -0,0 +1,203 @@
|
||||
extends Node
|
||||
## Hardware detection autoload for AI-Enhanced Dialogue (D-138, #646).
|
||||
##
|
||||
## Exposes classification methods for Layer 1 (RAM), Layer 2 (TPT benchmark),
|
||||
## Layer 3 (TPT degradation + battery power state monitoring).
|
||||
##
|
||||
## Consumes PlatformInfo for all OS queries (memory, power state, paths).
|
||||
## Loaded as HardwareDetector autoload. Tests access via get_node("/root/HardwareDetector").
|
||||
## Settings dialog reads classification strings and power-state methods to configure the UI.
|
||||
|
||||
const RAM_PASS_THRESHOLD_MB := 2000.0
|
||||
const RAM_MARGINAL_THRESHOLD_MB := 1600.0
|
||||
const TPT_GREEN_THRESHOLD := 6.0 # tokens/sec — enable silently
|
||||
const TPT_YELLOW_THRESHOLD := 3.0 # tokens/sec — partial pre-voicing note
|
||||
const TPT_DEGRADATION_THRESHOLD := 0.4 # fraction — >40% sustained drop → yellow
|
||||
|
||||
## Benchmark cache path — reads from PlatformInfo for cross-platform correctness.
|
||||
var BENCHMARK_CACHE_PATH: String:
|
||||
get:
|
||||
return PlatformInfo.benchmark_cache_path
|
||||
|
||||
# -- Battery suspension state -------------------------------------------------
|
||||
|
||||
## True when AI inference has been auto-suspended due to battery power.
|
||||
## Separate from GameState.ai_enhanced_dialogue_enabled (player preference preserved).
|
||||
var inference_suspended: bool = false
|
||||
|
||||
# User's preference at the moment battery suspension activated (to restore on plug-in).
|
||||
var _pre_battery_pref: bool = true
|
||||
|
||||
|
||||
# -- Lifecycle ----------------------------------------------------------------
|
||||
|
||||
func _ready() -> void:
|
||||
assert(PlatformInfo != null, "PlatformInfo must load before HardwareDetector")
|
||||
load_ai_pref()
|
||||
_pre_battery_pref = GameState.ai_enhanced_dialogue_enabled
|
||||
PlatformInfo.power_profile_changed.connect(_on_power_profile_changed)
|
||||
|
||||
|
||||
# -- Layer 1: RAM classification ----------------------------------------------
|
||||
|
||||
## Layer 1 — RAM classification.
|
||||
## Accepts free MB as input; returns "pass" | "marginal" | "fail".
|
||||
func classify_ram(free_mb: float) -> String:
|
||||
if free_mb >= RAM_PASS_THRESHOLD_MB:
|
||||
return "pass"
|
||||
elif free_mb >= RAM_MARGINAL_THRESHOLD_MB:
|
||||
return "marginal"
|
||||
else:
|
||||
return "fail"
|
||||
|
||||
|
||||
## Query RAM via PlatformInfo and return classification + raw MB value.
|
||||
## Returns: {classification: String, free_mb: float}
|
||||
func check_ram() -> Dictionary:
|
||||
PlatformInfo.refresh_memory()
|
||||
return {"classification": classify_ram(PlatformInfo.free_memory_mb), "free_mb": PlatformInfo.free_memory_mb}
|
||||
|
||||
|
||||
# -- Layer 2: TPT benchmark classification ------------------------------------
|
||||
|
||||
## Layer 2 — TPT benchmark classification.
|
||||
## Accepts tokens/sec as input; returns "green" | "yellow" | "red".
|
||||
func classify_tpt(tps: float) -> String:
|
||||
if tps >= TPT_GREEN_THRESHOLD:
|
||||
return "green"
|
||||
elif tps >= TPT_YELLOW_THRESHOLD:
|
||||
return "yellow"
|
||||
else:
|
||||
return "red"
|
||||
|
||||
|
||||
## Read the cached TPT benchmark result written by the server on first model load.
|
||||
## Returns: {tps: float, classification: String} or null if no cache file exists.
|
||||
func read_benchmark_cache() -> Variant:
|
||||
var cache_path: String = PlatformInfo.benchmark_cache_path
|
||||
if not FileAccess.file_exists(cache_path):
|
||||
return null
|
||||
var text: String = FileAccess.get_file_as_string(cache_path)
|
||||
if text.is_empty():
|
||||
return null
|
||||
var json := JSON.new()
|
||||
if json.parse(text) != OK:
|
||||
return null
|
||||
var data: Variant = json.get_data()
|
||||
if not data is Dictionary or not data.has("tps"):
|
||||
return null
|
||||
var tps: float = float(data["tps"])
|
||||
return {"tps": tps, "classification": classify_tpt(tps)}
|
||||
|
||||
|
||||
# -- Layer 3: degradation + battery -------------------------------------------
|
||||
|
||||
## Layer 3 — Ongoing TPT degradation classification.
|
||||
## D-138 §8: >40% sustained drop from baseline → yellow (not forced disable).
|
||||
## Returns "ok" | "yellow".
|
||||
func classify_degradation(baseline_tps: float, current_avg_tps: float) -> String:
|
||||
if baseline_tps <= 0.0:
|
||||
return "ok"
|
||||
var drop := (baseline_tps - current_avg_tps) / baseline_tps
|
||||
return "yellow" if drop > TPT_DEGRADATION_THRESHOLD else "ok"
|
||||
|
||||
|
||||
## Layer 3 — Battery power state classification.
|
||||
## Delegates to PlatformInfo for the actual integer → string mapping.
|
||||
## power_state: OS power_state integer (0=unknown, 1=on_battery, 2=no_battery, 3=charging, 4=charged).
|
||||
## Returns "battery" | "plugged" | "unknown".
|
||||
func classify_power_state(power_state: int) -> String:
|
||||
return PlatformInfo.classify_power_state(power_state)
|
||||
|
||||
|
||||
## True only when the OS reports on-battery power — inference suspend trigger.
|
||||
func should_suspend_inference(power_state: int) -> bool:
|
||||
return PlatformInfo.should_suspend_inference(power_state)
|
||||
|
||||
|
||||
## Query current OS power state and return {power_state: int, classification: String, should_suspend: bool}.
|
||||
func check_power_state() -> Dictionary:
|
||||
var state := PlatformInfo.current_power_state()
|
||||
return {
|
||||
"power_state": state,
|
||||
"classification": classify_power_state(state),
|
||||
"should_suspend": should_suspend_inference(state),
|
||||
}
|
||||
|
||||
|
||||
## True if AI inference is currently suspended due to battery power.
|
||||
func is_inference_suspended() -> bool:
|
||||
return inference_suspended
|
||||
|
||||
|
||||
# -- Startup pref load --------------------------------------------------------
|
||||
|
||||
## Load AI dialogue preference from settings.cfg and apply to GameState.
|
||||
## Called from _ready() to restore the toggle state across session restarts.
|
||||
## Spec: D-138 §8 — toggle persists via ConfigFile (client-local) + server SQLite (#627).
|
||||
func load_ai_pref() -> void:
|
||||
var cfg := ConfigFile.new()
|
||||
if cfg.load("user://settings.cfg") != OK:
|
||||
return
|
||||
var enabled: Variant = cfg.get_value("ai_dialogue", "enabled", null)
|
||||
if enabled is bool:
|
||||
GameState.ai_enhanced_dialogue_enabled = enabled
|
||||
|
||||
|
||||
# -- Battery suspend/resume ---------------------------------------------------
|
||||
|
||||
func _on_power_profile_changed(old_profile: int, new_profile: int) -> void:
|
||||
if new_profile == PlatformInfo.PowerProfile.BATTERY:
|
||||
_suspend_for_battery()
|
||||
elif old_profile == PlatformInfo.PowerProfile.BATTERY:
|
||||
_resume_from_battery()
|
||||
|
||||
|
||||
## Suspend AI inference when transitioning to battery power.
|
||||
## Preserves the player's preference so it can be restored on plug-in.
|
||||
func _suspend_for_battery() -> void:
|
||||
if inference_suspended:
|
||||
return
|
||||
_pre_battery_pref = GameState.ai_enhanced_dialogue_enabled
|
||||
inference_suspended = true
|
||||
if _pre_battery_pref:
|
||||
# Only send to server if inference was actually running — no-op if already disabled.
|
||||
_send_settings_change(false)
|
||||
|
||||
|
||||
## Resume AI inference when plugging back in.
|
||||
## Restores inference only if the player had it enabled before battery kicked in.
|
||||
func _resume_from_battery() -> void:
|
||||
if not inference_suspended:
|
||||
return
|
||||
inference_suspended = false
|
||||
if _pre_battery_pref:
|
||||
_send_settings_change(true)
|
||||
|
||||
|
||||
func _send_settings_change(enabled: bool) -> void:
|
||||
if SimBridge.state != SimBridge.ConnectionState.CONNECTED:
|
||||
return
|
||||
SimBridge.send_input({
|
||||
"action": InputMapper.Action.CHANGE_SETTINGS,
|
||||
"action_data": {"ai_enhanced_dialogue": enabled},
|
||||
"timestamp_msec": Time.get_ticks_msec(),
|
||||
})
|
||||
|
||||
|
||||
# -- Status message -----------------------------------------------------------
|
||||
|
||||
## Compose a human-readable status message for the settings dialog.
|
||||
## classification: "pass" | "marginal" | "fail" (RAM) or "green" | "yellow" | "red" (TPT).
|
||||
## Returns empty string when no message is needed.
|
||||
func status_message(ram_classification: String, tpt_classification: String, free_mb: float, tps: float) -> String:
|
||||
if ram_classification == "fail":
|
||||
return "AI-Enhanced Dialogue requires 2 GB of free memory. Your system currently has %.0f MB available. Close other applications and try again, or leave the setting off — the game is complete either way." % free_mb
|
||||
if ram_classification == "marginal":
|
||||
return "Only %.0f MB free — performance may vary. You can still enable it." % free_mb
|
||||
match tpt_classification:
|
||||
"yellow":
|
||||
return "Running at %.0f t/s — pre-voicing will work for main characters and key scenes. Background NPCs may show base text until the queue catches up." % tps
|
||||
"red":
|
||||
return "Running very slowly at %.0f t/s — we recommend leaving this off, but the choice is yours." % tps
|
||||
return ""
|
||||
@@ -0,0 +1 @@
|
||||
uid://hardware_detector_sr
|
||||
@@ -1,18 +1,27 @@
|
||||
extends Control
|
||||
|
||||
## #528: Audio settings dialog — 5-bus volume sliders.
|
||||
## #646: AI-Enhanced Dialogue toggle + hardware detection status (D-138).
|
||||
## Opens on OPEN_MENU (ESC) from main.gd. Closes on OPEN_MENU again or CLOSE button.
|
||||
## Volumes persist via AudioManager._save_prefs() on each slider change.
|
||||
## AI Dialogue toggle persists via ConfigFile (client-local) + ChangeSettings IPC (server SQLite).
|
||||
|
||||
const BG_COLOR := Color(0.05, 0.05, 0.08, 0.90)
|
||||
const BORDER_COLOR := Color("#4a9ebb")
|
||||
const TEXT_COLOR := Color(0.878, 0.969, 0.98, 1)
|
||||
const TITLE_COLOR := Color("#4a9ebb")
|
||||
const STATUS_GREEN := Color("#6bc9a6")
|
||||
const STATUS_YELLOW := Color("#e8c547")
|
||||
const STATUS_RED := Color("#c84040")
|
||||
const FONT_SIZE := 14
|
||||
const FONT_SIZE_SMALL := 11
|
||||
|
||||
const BOX_WIDTH := 460
|
||||
const BOX_HEIGHT := 376 # +36 for Debug Console row
|
||||
const PADDING := 20
|
||||
## Shared client preferences file — avoids compile-time dependency on DebugConsole for path.
|
||||
const SETTINGS_CFG_PATH := "user://settings.cfg"
|
||||
|
||||
const BOX_WIDTH := 460
|
||||
const BOX_HEIGHT := 500 # +36 debug console, +88 AI dialogue section
|
||||
const PADDING := 20
|
||||
const ROW_HEIGHT := 36
|
||||
|
||||
# Bus display labels → bus name strings (must match AudioManager BUS_* constants)
|
||||
@@ -27,8 +36,15 @@ const BUS_ROWS: Array = [
|
||||
var _active: bool = false
|
||||
var _container: VBoxContainer = null
|
||||
|
||||
# #646: AI Dialogue hardware status and toggle node ref — used by testable API methods
|
||||
var _ai_hw_status: String = "" # "pass" | "marginal" | "fail" | "" (not yet checked)
|
||||
var _ai_check_node: CheckButton = null
|
||||
var _ai_inference_suspended: bool = false # D-138 §8 Layer 3 battery auto-suspend state
|
||||
var _ai_battery_warning_label: Label = null # shown when on battery; toggle stays enabled
|
||||
|
||||
signal closed
|
||||
signal debug_console_toggled(enabled: bool) # #581: debug console enabled/disabled
|
||||
signal ai_dialogue_toggled(enabled: bool) # #646: AI-Enhanced Dialogue enabled/disabled
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
@@ -138,6 +154,111 @@ func _build_ui() -> void:
|
||||
)
|
||||
debug_hbox.add_child(debug_check)
|
||||
|
||||
# #646: AI Dialogue section divider
|
||||
var ai_divider := Control.new()
|
||||
ai_divider.custom_minimum_size = Vector2(0, 8)
|
||||
_container.add_child(ai_divider)
|
||||
|
||||
var ai_section_label := Label.new()
|
||||
ai_section_label.text = "AI DIALOGUE"
|
||||
ai_section_label.add_theme_font_size_override("font_size", FONT_SIZE - 2)
|
||||
ai_section_label.add_theme_color_override("font_color", TITLE_COLOR)
|
||||
_container.add_child(ai_section_label)
|
||||
|
||||
# #646: Detect hardware and set status
|
||||
var ram_result := HardwareDetector.check_ram()
|
||||
var tpt_cache: Variant = HardwareDetector.read_benchmark_cache()
|
||||
var ram_class: String = ram_result["classification"]
|
||||
var tpt_class: String = "green"
|
||||
var tpt_tps: float = 0.0
|
||||
if tpt_cache != null:
|
||||
tpt_class = tpt_cache["classification"]
|
||||
tpt_tps = tpt_cache["tps"]
|
||||
# Composite status: RAM fail overrides TPT; RAM marginal keeps its own category
|
||||
var hw_status: String
|
||||
if ram_class == "fail":
|
||||
hw_status = "fail"
|
||||
elif ram_class == "marginal":
|
||||
hw_status = "marginal"
|
||||
else:
|
||||
# RAM passes — status follows TPT if benchmarked, else "pass"
|
||||
hw_status = "pass" if tpt_cache == null else tpt_class
|
||||
set_ai_dialogue_hardware_status(hw_status)
|
||||
# D-138 §8 Layer 3: reflect current battery-suspension state from HardwareDetector.
|
||||
_ai_inference_suspended = HardwareDetector.inference_suspended
|
||||
|
||||
var ai_hbox := HBoxContainer.new()
|
||||
ai_hbox.custom_minimum_size = Vector2(0, ROW_HEIGHT)
|
||||
_container.add_child(ai_hbox)
|
||||
|
||||
var ai_label := Label.new()
|
||||
ai_label.text = get_ai_dialogue_label_text()
|
||||
ai_label.custom_minimum_size = Vector2(200, 0)
|
||||
ai_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
|
||||
ai_label.add_theme_font_size_override("font_size", FONT_SIZE)
|
||||
ai_label.add_theme_color_override("font_color", TEXT_COLOR)
|
||||
ai_hbox.add_child(ai_label)
|
||||
|
||||
# Status dot — colored square indicating hardware classification
|
||||
var status_dot := ColorRect.new()
|
||||
status_dot.custom_minimum_size = Vector2(10, 10)
|
||||
status_dot.size_flags_vertical = Control.SIZE_SHRINK_CENTER
|
||||
match _ai_hw_status:
|
||||
"pass", "green":
|
||||
status_dot.color = STATUS_GREEN
|
||||
"marginal", "yellow":
|
||||
status_dot.color = STATUS_YELLOW
|
||||
_: # "red", "fail"
|
||||
status_dot.color = STATUS_RED
|
||||
ai_hbox.add_child(status_dot)
|
||||
|
||||
var dot_spacer := Control.new()
|
||||
dot_spacer.custom_minimum_size = Vector2(8, 0)
|
||||
ai_hbox.add_child(dot_spacer)
|
||||
|
||||
_ai_check_node = CheckButton.new()
|
||||
_ai_check_node.button_pressed = GameState.ai_enhanced_dialogue_enabled
|
||||
_ai_check_node.disabled = (_ai_hw_status == "fail")
|
||||
ai_hbox.add_child(_ai_check_node)
|
||||
|
||||
# Status message label — only shown when non-empty
|
||||
var status_msg: String = HardwareDetector.status_message(
|
||||
ram_class, tpt_class, ram_result["free_mb"], tpt_tps)
|
||||
var ai_status_label := Label.new()
|
||||
ai_status_label.text = status_msg
|
||||
ai_status_label.add_theme_font_size_override("font_size", FONT_SIZE_SMALL)
|
||||
ai_status_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
|
||||
ai_status_label.custom_minimum_size = Vector2(BOX_WIDTH - PADDING * 2, 0)
|
||||
match _ai_hw_status:
|
||||
"marginal", "yellow":
|
||||
ai_status_label.add_theme_color_override("font_color", STATUS_YELLOW)
|
||||
"red", "fail":
|
||||
ai_status_label.add_theme_color_override("font_color", STATUS_RED)
|
||||
_:
|
||||
ai_status_label.add_theme_color_override("font_color", TEXT_COLOR)
|
||||
ai_status_label.visible = not status_msg.is_empty()
|
||||
_container.add_child(ai_status_label)
|
||||
|
||||
# Battery warning label — visible when on battery power; toggle stays enabled per D-138.
|
||||
_ai_battery_warning_label = Label.new()
|
||||
_ai_battery_warning_label.text = UIStrings.get_text("settings.ai_battery_warning")
|
||||
_ai_battery_warning_label.add_theme_font_size_override("font_size", FONT_SIZE_SMALL)
|
||||
_ai_battery_warning_label.add_theme_color_override("font_color", STATUS_YELLOW)
|
||||
_ai_battery_warning_label.visible = _ai_inference_suspended
|
||||
_container.add_child(_ai_battery_warning_label)
|
||||
|
||||
_ai_check_node.toggled.connect(func(enabled: bool) -> void:
|
||||
GameState.ai_enhanced_dialogue_enabled = enabled
|
||||
_save_ai_pref(enabled)
|
||||
if SimBridge.state == SimBridge.ConnectionState.CONNECTED:
|
||||
SimBridge.send_input({
|
||||
"action": InputMapper.Action.CHANGE_SETTINGS,
|
||||
"action_data": {"ai_enhanced_dialogue": enabled},
|
||||
"timestamp_msec": Time.get_ticks_msec(),
|
||||
})
|
||||
ai_dialogue_toggled.emit(enabled)
|
||||
)
|
||||
|
||||
# Spacer
|
||||
var spacer := Control.new()
|
||||
spacer.custom_minimum_size = Vector2(0, 8)
|
||||
@@ -163,6 +284,64 @@ func _destroy_ui() -> void:
|
||||
if _container:
|
||||
_container.queue_free()
|
||||
_container = null
|
||||
_ai_check_node = null # freed with _container
|
||||
_ai_battery_warning_label = null
|
||||
|
||||
|
||||
# -- #646: AI Dialogue testable API -------------------------------------------
|
||||
|
||||
## Returns the canonical label text for the AI-Enhanced Dialogue toggle (D-138).
|
||||
## Reads from UIStrings yaml (settings.ai_dialogue_toggle) for localization support.
|
||||
func get_ai_dialogue_label_text() -> String:
|
||||
return UIStrings.get_text("settings.ai_dialogue_toggle")
|
||||
|
||||
|
||||
## Set the hardware detection status — drives toggle enabled/disabled state.
|
||||
## Accepts: "pass" | "marginal" | "fail" (RAM) or "green" | "yellow" | "red" (TPT).
|
||||
## Only "fail" (insufficient RAM) disables the toggle. All others leave it enabled —
|
||||
## D-138: no hard minimum spec floor; player can always override recommendations.
|
||||
func set_ai_dialogue_hardware_status(status: String) -> void:
|
||||
_ai_hw_status = status
|
||||
if _ai_check_node != null:
|
||||
_ai_check_node.disabled = (status == "fail")
|
||||
|
||||
|
||||
## Returns true if the AI-Enhanced Dialogue toggle is currently enabled (not greyed out).
|
||||
## Only disabled by RAM "fail" — battery suspension shows a warning but never greys the toggle.
|
||||
func is_ai_dialogue_toggle_enabled() -> bool:
|
||||
return _ai_hw_status != "fail"
|
||||
|
||||
|
||||
## Returns true if AI inference is currently auto-suspended due to battery power (D-138 §8 Layer 3).
|
||||
## Set by set_ai_inference_suspended() when HardwareDetector detects battery profile.
|
||||
func is_ai_inference_suspended() -> bool:
|
||||
return _ai_inference_suspended
|
||||
|
||||
|
||||
## Returns true if the battery warning label is currently visible.
|
||||
func get_battery_warning_visible() -> bool:
|
||||
if _ai_battery_warning_label == null:
|
||||
return false
|
||||
return _ai_battery_warning_label.visible
|
||||
|
||||
|
||||
## Update battery suspension display state.
|
||||
## Shows/hides the battery warning label; toggle stays enabled — player autonomy wins (D-138).
|
||||
## Called when PlatformInfo.power_profile_changed fires (via main.gd or HardwareDetector).
|
||||
## Tests can inject suspended=true to verify the warning label appears.
|
||||
func set_ai_inference_suspended(suspended: bool) -> void:
|
||||
_ai_inference_suspended = suspended
|
||||
if _ai_battery_warning_label != null:
|
||||
_ai_battery_warning_label.visible = suspended
|
||||
|
||||
|
||||
## Persist the AI Dialogue enabled state to the local prefs file.
|
||||
## Uses the same settings.cfg as DebugConsole — different section ("ai_dialogue").
|
||||
func _save_ai_pref(enabled: bool) -> void:
|
||||
var cfg := ConfigFile.new()
|
||||
cfg.load(SETTINGS_CFG_PATH)
|
||||
cfg.set_value("ai_dialogue", "enabled", enabled)
|
||||
cfg.save(SETTINGS_CFG_PATH)
|
||||
|
||||
|
||||
func _draw() -> void:
|
||||
@@ -186,7 +365,7 @@ func _draw() -> void:
|
||||
var font := ThemeDB.fallback_font
|
||||
draw_string(font,
|
||||
box_pos + Vector2(PADDING, PADDING + 18),
|
||||
"AUDIO SETTINGS",
|
||||
"SETTINGS",
|
||||
HORIZONTAL_ALIGNMENT_LEFT, -1, FONT_SIZE + 2, TITLE_COLOR)
|
||||
|
||||
|
||||
|
||||
-184
@@ -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."
|
||||
-379
@@ -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]
|
||||
-77
@@ -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]
|
||||
-382
@@ -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]
|
||||
-360
@@ -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]
|
||||
-311
@@ -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]
|
||||
-90
@@ -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.
|
||||
-235
@@ -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."
|
||||
-38
@@ -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]
|
||||
-39
@@ -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]
|
||||
-701
@@ -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."
|
||||
-269
@@ -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]
|
||||
-397
@@ -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]
|
||||
-480
@@ -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."
|
||||
-86
@@ -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]
|
||||
-264
@@ -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]
|
||||
-64
@@ -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]
|
||||
-64
@@ -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]
|
||||
-371
@@ -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]
|
||||
-356
@@ -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]
|
||||
+1
-45
@@ -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]
|
||||
|
||||
+2
-41
@@ -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]
|
||||
|
||||
-225
@@ -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).
|
||||
-193
@@ -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).
|
||||
-281
@@ -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
|
||||
-306
@@ -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]
|
||||
-236
@@ -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.
|
||||
-92
@@ -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]
|
||||
-274
@@ -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]
|
||||
-166
@@ -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."
|
||||
-133
@@ -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]
|
||||
-525
@@ -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]
|
||||
-522
@@ -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
|
||||
-243
@@ -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.
|
||||
-228
@@ -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.
|
||||
-92
@@ -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]
|
||||
-270
@@ -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]
|
||||
-152
@@ -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."
|
||||
-124
@@ -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]
|
||||
-303
@@ -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]
|
||||
-427
@@ -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]
|
||||
-449
@@ -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
|
||||
-229
@@ -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).
|
||||
-269
@@ -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.
|
||||
-160
@@ -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.
|
||||
-167
@@ -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.
|
||||
-143
@@ -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.
|
||||
-105
@@ -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).
|
||||
-246
@@ -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)
|
||||
-245
@@ -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.
|
||||
-255
@@ -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).
|
||||
-139
@@ -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.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user