feat(schema): implement D-035 converged tag taxonomy as canonical JSON Schema (#168)
- Add content/_schema/dialogue-line.schema.json — canonical standalone line schema with all 6 structural + 3 selection + 2 authoring-only tags and $defs for monologue extension (character, trigger, prerequisite) - Update dialogue-pool.schema.json: add dual_lens and notes authoring-only tags, add additionalProperties: false to knowledge_grant - Update monologue-pool.schema.json: add all 6 structural tags as required fields for schema compliance (role=player_character, access=[public], trust=surface are constrained constants); add topic, mood, dual_lens, notes - Enumerate all 14 v0.1 situations and 9 v0.1 topics as allowed enum values per D-035 - Fix Rust sync gap: add Situation::Greeting and Mood::Focused to line_pool.rs (D-035 Sprint 8 amendments — were in schema but missing from Rust enums, causing content with these values to be silently dropped at runtime) - Update line_preview.rs situation_str, mood_str match arms and help text for new variants; all 25 line_pool tests pass Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,290 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "dialogue-line.schema.json",
|
||||
"title": "Dialogue Line — canonical D-035 tag taxonomy",
|
||||
"description": "Canonical single-line schema for dialogue and monologue pools. Implements the converged tag taxonomy from D-035 (6 structural + 3 selection + 2 authoring-only tags). Monologue-specific additions (character, trigger, prerequisite) are defined in $defs/monologue_extension.\n\nRust sync note: server/src/content/line_pool.rs is missing two Sprint 8 amendments — Situation::Greeting (14th situation) and Mood::Focused (9th mood). Content authored with these values will be silently skipped by the Rust parser until the server branch catches up. Filed as a server team sync issue.",
|
||||
"type": "object",
|
||||
"required": ["id", "text", "role", "access", "trust", "situation"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*_(d|m)_[0-9]{3}$",
|
||||
"description": "Stable machine-parseable line ID: {template}_{d|m}_{###}. d = dialogue, m = monologue."
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"description": "The authored line text."
|
||||
},
|
||||
"role": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*$",
|
||||
"description": "Template-defined role slug (e.g. dock-worker, bar-owner, player_character). Not NPC name — NPC assignment is runtime."
|
||||
},
|
||||
"access": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": ["public", "insider", "authority", "peer", "hostile"]
|
||||
},
|
||||
"minItems": 1,
|
||||
"uniqueItems": true,
|
||||
"description": "D-028 Layer 1: access tiers this line is eligible for. List — a line can be eligible for multiple tiers. Hard filter."
|
||||
},
|
||||
"trust": {
|
||||
"type": "string",
|
||||
"enum": ["surface", "real", "secret"],
|
||||
"description": "D-028 Layer 3: minimum trust tier required. Hard filter. Ordering: surface < real < secret."
|
||||
},
|
||||
"situation": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"arrival",
|
||||
"shift_start",
|
||||
"shift_end",
|
||||
"shift_transition",
|
||||
"bar_evening",
|
||||
"night_shift",
|
||||
"investigation",
|
||||
"confrontation",
|
||||
"social",
|
||||
"alone",
|
||||
"emergency",
|
||||
"routine",
|
||||
"observation",
|
||||
"greeting"
|
||||
]
|
||||
},
|
||||
"minItems": 1,
|
||||
"uniqueItems": true,
|
||||
"description": "D-028 Layer 2: situations in which this line can fire. 14 v0.1 values (13 original + greeting added Sprint 8 for PC dialogue initial contact lines). NOTE: 'greeting' is not yet in server/src/content/line_pool.rs — lines using it will be skipped until Rust is updated."
|
||||
},
|
||||
"topic": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"colleague",
|
||||
"routine",
|
||||
"cargo",
|
||||
"money",
|
||||
"trust",
|
||||
"danger",
|
||||
"institution",
|
||||
"personal",
|
||||
"investigation"
|
||||
]
|
||||
},
|
||||
"uniqueItems": true,
|
||||
"description": "D-028 Layer 4: topic tags for weighted selection. 9 v0.1 values. Optional — defaults to empty if omitted. Note: 'crime' deliberately excluded; NPCs think of it as 'cargo' or 'money'."
|
||||
},
|
||||
"mood": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"fond",
|
||||
"comfortable",
|
||||
"worried",
|
||||
"suspicious",
|
||||
"analytical",
|
||||
"conflicted",
|
||||
"concerned",
|
||||
"relieved",
|
||||
"focused"
|
||||
]
|
||||
},
|
||||
"uniqueItems": true,
|
||||
"description": "D-028 Layer 4: mood tags for weighted selection. 9 v0.1 values (8 original + focused added Sprint 8 for Kael dialogue). Optional — defaults to empty if omitted. NOTE: 'focused' is not yet in server/src/content/line_pool.rs — lines using it will be skipped until Rust is updated."
|
||||
},
|
||||
"tags": {
|
||||
"type": "array",
|
||||
"items": { "type": "string" },
|
||||
"description": "Freeform escape hatch for author intent not covered by the structured taxonomy. Not consumed by the engine selection pipeline."
|
||||
},
|
||||
"knowledge_grant": {
|
||||
"type": "object",
|
||||
"description": "Knowledge the player gains from hearing this line. Feeds into the knowledge graph (D-041).",
|
||||
"required": ["fact_id", "confidence"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"fact_id": {
|
||||
"type": "string",
|
||||
"description": "FactId from the knowledge vocabulary (#368)."
|
||||
},
|
||||
"confidence": {
|
||||
"type": "string",
|
||||
"enum": ["suspects", "knows_of", "knows_details", "direct"],
|
||||
"description": "D-041 confidence tier granted."
|
||||
}
|
||||
}
|
||||
},
|
||||
"dual_lens": {
|
||||
"type": "object",
|
||||
"description": "Authoring-only: per-character notes for content with different resonance for smuggler vs detective. NOT consumed by the engine.",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"smuggler": { "type": "string" },
|
||||
"detective": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"type": "string",
|
||||
"description": "Authoring-only: freeform author notes, context, or intent documentation. NOT consumed by the engine."
|
||||
}
|
||||
},
|
||||
"$defs": {
|
||||
"monologue_extension": {
|
||||
"title": "Monologue-specific additions (D-035)",
|
||||
"description": "Additional required fields for monologue lines. Applied ON TOP OF the base dialogue line schema. Pool-level character partitioning (D-032) is enforced at the pool root, not per-line.",
|
||||
"type": "object",
|
||||
"required": ["trigger"],
|
||||
"properties": {
|
||||
"character": {
|
||||
"type": "string",
|
||||
"enum": ["smuggler", "detective"],
|
||||
"description": "D-032: hard partition tag. Which playable character this line belongs to. Must match the parent pool's character field."
|
||||
},
|
||||
"trigger": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"enter_location",
|
||||
"observe_npc",
|
||||
"hear_sound",
|
||||
"observe_anomaly",
|
||||
"post_conversation",
|
||||
"discover_evidence",
|
||||
"witness_interaction",
|
||||
"time_idle",
|
||||
"return_visit"
|
||||
],
|
||||
"description": "What causes this monologue line to fire. 9 v0.1 trigger types."
|
||||
},
|
||||
"prerequisite": {
|
||||
"description": "Knowledge state gate. null = unconditional (fires whenever triggered). Conditions are AND-evaluated. Uses FactIds from the knowledge vocabulary (#368, D-041).",
|
||||
"oneOf": [
|
||||
{ "type": "null" },
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"facts": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/fact_prerequisite" }
|
||||
},
|
||||
"entity_attributes": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/attribute_prerequisite" }
|
||||
},
|
||||
"relationship": {
|
||||
"type": "object",
|
||||
"required": ["target", "state"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"target": { "type": "string" },
|
||||
"state": {
|
||||
"type": "string",
|
||||
"enum": ["unknown", "known", "friendly", "person_of_interest", "hostile"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"priority": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 10,
|
||||
"default": 5,
|
||||
"description": "Selection priority. Higher = more likely to fire when multiple lines are eligible. Default: 5."
|
||||
},
|
||||
"cooldown": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"default": 0,
|
||||
"description": "Minimum simulation ticks before this line can fire again. Default: 0 (no cooldown)."
|
||||
}
|
||||
}
|
||||
},
|
||||
"fact_prerequisite": {
|
||||
"type": "object",
|
||||
"required": ["fact_id", "min_confidence"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"fact_id": {
|
||||
"type": "string",
|
||||
"description": "FactId from the knowledge vocabulary (#368, D-041)."
|
||||
},
|
||||
"min_confidence": {
|
||||
"type": "string",
|
||||
"enum": ["suspects", "knows_of", "knows_details", "direct"],
|
||||
"description": "Minimum D-041 confidence level required for this fact."
|
||||
}
|
||||
}
|
||||
},
|
||||
"attribute_prerequisite": {
|
||||
"type": "object",
|
||||
"required": ["entity", "key", "value"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"entity": { "type": "string" },
|
||||
"key": { "type": "string" },
|
||||
"value": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"situation_enum": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"arrival",
|
||||
"shift_start",
|
||||
"shift_end",
|
||||
"shift_transition",
|
||||
"bar_evening",
|
||||
"night_shift",
|
||||
"investigation",
|
||||
"confrontation",
|
||||
"social",
|
||||
"alone",
|
||||
"emergency",
|
||||
"routine",
|
||||
"observation",
|
||||
"greeting"
|
||||
],
|
||||
"description": "14 v0.1 situation values (D-035 + Sprint 8 amendment)."
|
||||
},
|
||||
"topic_enum": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"colleague",
|
||||
"routine",
|
||||
"cargo",
|
||||
"money",
|
||||
"trust",
|
||||
"danger",
|
||||
"institution",
|
||||
"personal",
|
||||
"investigation"
|
||||
],
|
||||
"description": "9 v0.1 topic values (D-035)."
|
||||
},
|
||||
"mood_enum": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"fond",
|
||||
"comfortable",
|
||||
"worried",
|
||||
"suspicious",
|
||||
"analytical",
|
||||
"conflicted",
|
||||
"concerned",
|
||||
"relieved",
|
||||
"focused"
|
||||
],
|
||||
"description": "9 v0.1 mood values (D-035 + Sprint 8 amendment: focused added)."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -106,14 +106,28 @@
|
||||
"knowledge_grant": {
|
||||
"type": "object",
|
||||
"description": "Knowledge the player gains from hearing this line",
|
||||
"required": ["fact_id", "confidence"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"fact_id": { "type": "string" },
|
||||
"confidence": {
|
||||
"type": "string",
|
||||
"enum": ["suspects", "knows_of", "knows_details", "direct"]
|
||||
}
|
||||
},
|
||||
"required": ["fact_id", "confidence"]
|
||||
}
|
||||
},
|
||||
"dual_lens": {
|
||||
"type": "object",
|
||||
"description": "Authoring-only: per-character resonance notes (NOT consumed by engine)",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"smuggler": { "type": "string" },
|
||||
"detective": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"type": "string",
|
||||
"description": "Authoring-only: freeform author notes (NOT consumed by engine)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "monologue-pool.schema.json",
|
||||
"title": "Monologue Line Pool",
|
||||
"description": "Tagged monologue lines, hard-partitioned by character (D-032, D-035).",
|
||||
"description": "Tagged monologue lines, hard-partitioned by character (D-032, D-035). Monologue lines carry all 6 D-035 structural tags for schema compliance, but role/access/trust are fixed constants for player-character internal voice (role=player_character, access=[public], trust=surface). The engine does not gate monologue on access or trust — these tags exist for taxonomy uniformity only.",
|
||||
"type": "object",
|
||||
"required": ["character", "location", "lines"],
|
||||
"additionalProperties": false,
|
||||
@@ -10,12 +10,12 @@
|
||||
"character": {
|
||||
"type": "string",
|
||||
"enum": ["smuggler", "detective"],
|
||||
"description": "Playable character this pool belongs to (hard partition per D-032)"
|
||||
"description": "Playable character this pool belongs to (hard partition per D-032). All lines in this pool belong to this character."
|
||||
},
|
||||
"location": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*$",
|
||||
"description": "Location slug, or 'general' for location-independent lines"
|
||||
"description": "Location slug, or 'general' for location-independent lines."
|
||||
},
|
||||
"lines": {
|
||||
"type": "array",
|
||||
@@ -26,70 +26,177 @@
|
||||
"$defs": {
|
||||
"monologue_line": {
|
||||
"type": "object",
|
||||
"required": ["id", "text", "trigger"],
|
||||
"required": ["id", "text", "role", "access", "trust", "situation", "trigger"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9-]*_m_[sd]_[0-9]{3}$",
|
||||
"description": "Stable line ID: {location_slug}_m_{s|d}_{###}"
|
||||
"description": "Stable line ID: {location_slug}_m_{s|d}_{###}. s = smuggler, d = detective."
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 160,
|
||||
"description": "Line text — 160 char max to fit monologue display without scrolling"
|
||||
"description": "Line text — 160 char max to fit monologue display without scrolling."
|
||||
},
|
||||
"role": {
|
||||
"type": "string",
|
||||
"const": "player_character",
|
||||
"description": "D-035 structural tag — always player_character for monologue. Monologue is the player character's internal voice."
|
||||
},
|
||||
"access": {
|
||||
"type": "array",
|
||||
"items": { "const": "public" },
|
||||
"minItems": 1,
|
||||
"maxItems": 1,
|
||||
"description": "D-035 structural tag — always [public] for monologue. No access gating applies to internal voice."
|
||||
},
|
||||
"trust": {
|
||||
"type": "string",
|
||||
"const": "surface",
|
||||
"description": "D-035 structural tag — always surface for monologue. No trust gating applies to internal voice."
|
||||
},
|
||||
"situation": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"arrival",
|
||||
"shift_start",
|
||||
"shift_end",
|
||||
"shift_transition",
|
||||
"bar_evening",
|
||||
"night_shift",
|
||||
"investigation",
|
||||
"confrontation",
|
||||
"social",
|
||||
"alone",
|
||||
"emergency",
|
||||
"routine",
|
||||
"observation",
|
||||
"greeting"
|
||||
]
|
||||
},
|
||||
"minItems": 1,
|
||||
"uniqueItems": true,
|
||||
"description": "D-035 structural tag: situations in which this monologue line is contextually appropriate. 14 v0.1 values. The engine selects using trigger; situation provides additional authoring context for filtering by the caller. NOTE: 'greeting' is not yet in server/src/content/line_pool.rs Situation enum."
|
||||
},
|
||||
"trigger": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"enter_location", "observe_npc", "hear_sound",
|
||||
"observe_anomaly", "post_conversation", "discover_evidence",
|
||||
"witness_interaction", "time_idle", "return_visit"
|
||||
"enter_location",
|
||||
"observe_npc",
|
||||
"hear_sound",
|
||||
"observe_anomaly",
|
||||
"post_conversation",
|
||||
"discover_evidence",
|
||||
"witness_interaction",
|
||||
"time_idle",
|
||||
"return_visit"
|
||||
],
|
||||
"description": "What causes this line to fire"
|
||||
"description": "What causes this line to fire. 9 v0.1 trigger types (D-035 monologue-specific tag)."
|
||||
},
|
||||
"prerequisites": {
|
||||
"type": "object",
|
||||
"description": "AND-only prerequisite conditions",
|
||||
"properties": {
|
||||
"facts": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/fact_prerequisite" }
|
||||
},
|
||||
"entity_attributes": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/attribute_prerequisite" }
|
||||
},
|
||||
"relationship": {
|
||||
"description": "Knowledge state gate (D-035 monologue-specific tag). null or omitted = unconditional. Conditions are AND-evaluated. Uses FactIds from the knowledge vocabulary (#368, D-041).",
|
||||
"oneOf": [
|
||||
{ "type": "null" },
|
||||
{
|
||||
"type": "object",
|
||||
"required": ["target", "state"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"target": { "type": "string" },
|
||||
"state": {
|
||||
"type": "string",
|
||||
"enum": ["unknown", "known", "friendly", "person_of_interest", "hostile"]
|
||||
"facts": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/fact_prerequisite" }
|
||||
},
|
||||
"entity_attributes": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/$defs/attribute_prerequisite" }
|
||||
},
|
||||
"relationship": {
|
||||
"type": "object",
|
||||
"required": ["target", "state"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"target": { "type": "string" },
|
||||
"state": {
|
||||
"type": "string",
|
||||
"enum": ["unknown", "known", "friendly", "person_of_interest", "hostile"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"topic": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"colleague",
|
||||
"routine",
|
||||
"cargo",
|
||||
"money",
|
||||
"trust",
|
||||
"danger",
|
||||
"institution",
|
||||
"personal",
|
||||
"investigation"
|
||||
]
|
||||
},
|
||||
"uniqueItems": true,
|
||||
"description": "D-035 selection tag: topic tags for weighted selection. 9 v0.1 values. Optional."
|
||||
},
|
||||
"mood": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"fond",
|
||||
"comfortable",
|
||||
"worried",
|
||||
"suspicious",
|
||||
"analytical",
|
||||
"conflicted",
|
||||
"concerned",
|
||||
"relieved",
|
||||
"focused"
|
||||
]
|
||||
},
|
||||
"uniqueItems": true,
|
||||
"description": "D-035 selection tag: mood tags for weighted selection. 9 v0.1 values (8 original + focused Sprint 8). Optional. NOTE: 'focused' not yet in server/src/content/line_pool.rs Mood enum."
|
||||
},
|
||||
"priority": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 10,
|
||||
"default": 5,
|
||||
"description": "Selection priority (higher = more likely to fire)"
|
||||
"description": "Selection priority (higher = more likely to fire when multiple lines are eligible). Default: 5."
|
||||
},
|
||||
"cooldown": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"description": "Minimum ticks before this line can fire again"
|
||||
"default": 0,
|
||||
"description": "Minimum simulation ticks before this line can fire again. Default: 0."
|
||||
},
|
||||
"tags": {
|
||||
"type": "array",
|
||||
"items": { "type": "string" }
|
||||
"items": { "type": "string" },
|
||||
"description": "D-035 selection tag: freeform tags. Not consumed by the selection pipeline."
|
||||
},
|
||||
"dual_lens": {
|
||||
"type": "object",
|
||||
"description": "Authoring-only: notes on how this line reads differently for smuggler vs detective. NOT consumed by engine.",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"smuggler": { "type": "string" },
|
||||
"detective": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"type": "string",
|
||||
"description": "Authoring-only: freeform author notes. NOT consumed by engine."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -98,10 +205,14 @@
|
||||
"required": ["fact_id", "min_confidence"],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"fact_id": { "type": "string" },
|
||||
"fact_id": {
|
||||
"type": "string",
|
||||
"description": "FactId from the knowledge vocabulary (#368, D-041)."
|
||||
},
|
||||
"min_confidence": {
|
||||
"type": "string",
|
||||
"enum": ["suspects", "knows_of", "knows_details", "direct"]
|
||||
"enum": ["suspects", "knows_of", "knows_details", "direct"],
|
||||
"description": "Minimum D-041 confidence level required."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
+306
@@ -0,0 +1,306 @@
|
||||
# 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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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: commission-kiosk_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]
|
||||
+303
@@ -0,0 +1,303 @@
|
||||
# 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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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: smuggling-hold_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]
|
||||
@@ -0,0 +1,821 @@
|
||||
# NPC-to-NPC Overheard Dialogue Pool
|
||||
# Ticket: #536 | Author: Mellanie | Sprint: 14
|
||||
# Decision refs: D-078, D-018, D-071, D-035
|
||||
#
|
||||
# These are conversations the player can overhear when stationary near two
|
||||
# NPCs. The passive dialogue panel (D-078) displays them with per-word
|
||||
# occlusion based on distance, ambient noise, and ListeningFocus stance.
|
||||
#
|
||||
# OCCLUSION-RESILIENT AUTHORING RULES (D-078):
|
||||
# 1. Front-load key information — most important word in first third.
|
||||
# 2. Short declarative sentences — one idea per turn.
|
||||
# 3. No pronoun-first openers — first word has highest drop risk; a dropped
|
||||
# pronoun without antecedent is unresolvable. Use names or nouns.
|
||||
# 4. Each turn is self-contained — a player who hears only one side gets
|
||||
# a complete thought.
|
||||
#
|
||||
# SCHEMA NOTE:
|
||||
# `relationship_type` and `knowledge_payload` are custom extensions to the
|
||||
# D-035 schema for this content type. NPC-sourced lines use `role: npc`,
|
||||
# `access` and `trust` apply normally. Monologue-specific tags (`character`,
|
||||
# `trigger`, `prerequisite`) are not used here.
|
||||
# Schema confirmation with Gestalt (#168) before CI validation.
|
||||
#
|
||||
# REGISTERS:
|
||||
# social — idle chat, personal news, relationship talk
|
||||
# work — shift logistics, job gripes, operational notes
|
||||
# gossip — third-party information with player-relevant knowledge payload
|
||||
#
|
||||
# RELATIONSHIP TYPES:
|
||||
# colleague, friend, hostile, romantic
|
||||
#
|
||||
# KNOWLEDGE PAYLOAD FORMAT:
|
||||
# Plain English description of what the player can infer from hearing this
|
||||
# exchange clearly — or the key fragment they retain under partial occlusion.
|
||||
# null if the exchange is social noise with no investigative value.
|
||||
|
||||
pairs:
|
||||
|
||||
# ===================================================================
|
||||
# SOCIAL register — personal news, idle chat, relationships
|
||||
# ===================================================================
|
||||
|
||||
- id: overheard_001
|
||||
register: social
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Kael brought food for the whole bay yesterday. Just showed up with it."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Naia must have made him feel guilty about something. Again."
|
||||
relationship_type: colleague
|
||||
topic: personal-gossip
|
||||
location_hints: [the-terminal, the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Kael and Naia have a relationship dynamic. Naia has leverage or emotional pull over Kael's behavior."
|
||||
tags: [kael, naia, social, atmosphere]
|
||||
|
||||
- id: overheard_002
|
||||
register: social
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Lera's keeping the kitchen open late this week. Span gate delay — crews stuck here."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Good for Lera. Bad for everyone waiting on the gate."
|
||||
relationship_type: friend
|
||||
topic: station-life
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: null
|
||||
tags: [lera, span-gate, atmosphere, social]
|
||||
|
||||
- id: overheard_003
|
||||
register: social
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Drin's applying for the transfer. Again. Third time he's tried."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Drin's never getting off Sova. Some people just belong to a place."
|
||||
relationship_type: colleague
|
||||
topic: career-gossip
|
||||
location_hints: [the-terminal, the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Drin wants out of Sova Transit. Unhappy enough to pursue transfer requests."
|
||||
tags: [drin, transfer, social, atmosphere]
|
||||
|
||||
- id: overheard_004
|
||||
register: social
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Naia and Kael had a fight. Loud enough that Lera had to step in."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Kael looked rough this morning. That tracks."
|
||||
relationship_type: friend
|
||||
topic: relationship-drama
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Kael and Naia are under relationship strain. Kael's mood is affected. Cross-reference: behavioral.kael_behavioral_change."
|
||||
tags: [kael, naia, relationship, friend-arc-adjacent, dual-lens]
|
||||
|
||||
- id: overheard_005
|
||||
register: social
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Renn's finally getting his lattice service done. Been putting it off for years."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Commission clinic wait time is eight months. Renn found someone faster."
|
||||
relationship_type: colleague
|
||||
topic: lattice-access
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Renn found a non-Commission lattice service provider. Points toward unlicensed lattice components market."
|
||||
tags: [renn, lattice, contraband-adjacent, atmosphere]
|
||||
|
||||
- id: overheard_006
|
||||
register: social
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Maret's promotion came through. Third level supervisor."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Good. Maret actually knows what she's doing. Unlike some."
|
||||
relationship_type: colleague
|
||||
topic: career-news
|
||||
location_hints: [the-last-shift, the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: null
|
||||
tags: [maret, promotion, atmosphere, social]
|
||||
|
||||
- id: overheard_007
|
||||
register: social
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Voss has been in a mood all week. Something from upstairs."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Voss is always in a mood. Week ends in -day, Voss is in a mood."
|
||||
relationship_type: colleague
|
||||
topic: supervisor-gossip
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Voss is under external pressure from 'upstairs.' Something is stressing management."
|
||||
tags: [voss, management, atmosphere, social]
|
||||
|
||||
- id: overheard_008
|
||||
register: social
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Sera's been coming here every evening this week. Thought Commission people didn't drink."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Sera's different. She fits here better than she fits over there."
|
||||
relationship_type: colleague
|
||||
topic: social-observation
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Sera Venn is a regular at The Last Shift, unusual for a Commission employee. She has social roots in the district."
|
||||
tags: [sera, commission, atmosphere, social, dual-lens]
|
||||
|
||||
- id: overheard_009
|
||||
register: social
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Nils covered Kael's morning slot yesterday. No explanation, just a roster note."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Kael's been doing that a lot lately. Taking sick leave, then showing up mid-shift."
|
||||
relationship_type: colleague
|
||||
topic: roster-anomaly
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Kael's schedule is irregular. Unexplained absences and late arrivals. Cross-reference: observe_anomaly triggers for Kael."
|
||||
tags: [kael, nils, roster, friend-arc-adjacent]
|
||||
|
||||
- id: overheard_010
|
||||
register: social
|
||||
speaker_a:
|
||||
role: maintenance-tech
|
||||
text: "Olin's kid got into the Commission cadet program. Starts next cycle."
|
||||
speaker_b:
|
||||
role: maintenance-tech
|
||||
text: "Olin must be pleased. Cost of living here, Commission pay makes sense."
|
||||
relationship_type: colleague
|
||||
topic: family-news
|
||||
location_hints: [maintenance-corridors, the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: null
|
||||
tags: [olin, commission, atmosphere, social]
|
||||
|
||||
# ===================================================================
|
||||
# WORK register — shift logistics, operational gripes, job talk
|
||||
# ===================================================================
|
||||
|
||||
- id: overheard_011
|
||||
register: work
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Maret shifted the roster again. Bay four to bay seven, no reason given."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Bay seven's the low-traffic slot. Somebody wanted less oversight over there."
|
||||
relationship_type: colleague
|
||||
topic: roster-change
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Bay seven has been given a low-oversight crew deliberately. This is operationally significant."
|
||||
tags: [maret, roster, bay-seven, investigation-adjacent]
|
||||
|
||||
- id: overheard_012
|
||||
register: work
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Loading arm three is grinding again. Filed the report last week."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Maintenance says next cycle. Means nothing gets done until someone loses a hand."
|
||||
relationship_type: colleague
|
||||
topic: equipment-maintenance
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: null
|
||||
tags: [equipment, maintenance, atmosphere, work]
|
||||
|
||||
- id: overheard_013
|
||||
register: work
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Container 4471's been in temp for three days. Someone should move it."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Routing says hold. Don't ask me, I just process what the board says."
|
||||
relationship_type: colleague
|
||||
topic: container-routing
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Container 4471 is being deliberately held in temp storage. 'Routing says hold' — someone modified the routing instruction. Cross-reference: investigation.container_delay."
|
||||
tags: [container-4471, routing, contraband-adjacent, investigation-payload]
|
||||
|
||||
- id: overheard_014
|
||||
register: work
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Voss cut the B-section crew by two. Says it's budget. Doesn't feel like budget."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Less crew in B-section means less oversight. Could be budget. Could be something else."
|
||||
relationship_type: colleague
|
||||
topic: crew-reduction
|
||||
location_hints: [the-terminal, maintenance-corridors]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "B-section is understaffed. The speaker suspects this is deliberate. Cross-reference: ring oversight windows."
|
||||
tags: [voss, b-section, oversight, investigation-payload]
|
||||
|
||||
- id: overheard_015
|
||||
register: work
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Span gate's backed up again. Forty-minute delay on the freight queue."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Forty minutes is nothing. Last month it was three hours. Patience."
|
||||
relationship_type: colleague
|
||||
topic: span-gate-delay
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: null
|
||||
tags: [span-gate, freight, atmosphere, work]
|
||||
|
||||
- id: overheard_016
|
||||
register: work
|
||||
speaker_a:
|
||||
role: maintenance-tech
|
||||
text: "Junction C-2's camera was repositioned. Nobody filed a maintenance request."
|
||||
speaker_b:
|
||||
role: maintenance-tech
|
||||
text: "Someone moved it without logging it. That's a compliance violation."
|
||||
relationship_type: colleague
|
||||
topic: camera-anomaly
|
||||
location_hints: [maintenance-corridors]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Camera at junction C-2 was moved without documentation. Suggests deliberate surveillance manipulation. Cross-reference: awareness.surveillance_change."
|
||||
tags: [camera, surveillance, c-2, investigation-payload]
|
||||
|
||||
- id: overheard_017
|
||||
register: work
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Commission wants another inspection. Fourth one this quarter."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Inspections mean overtime. Inspections mean everyone's watching everyone."
|
||||
relationship_type: colleague
|
||||
topic: commission-inspection
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Commission is conducting elevated inspections of the terminal. Something has drawn their attention."
|
||||
tags: [commission, inspection, atmosphere, investigation-adjacent]
|
||||
|
||||
- id: overheard_018
|
||||
register: work
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Weight manifest on the morning freight came in five hundred kilos short. Recalibration error."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Five hundred kilos doesn't disappear from a calibration error. It disappears from somewhere else."
|
||||
relationship_type: colleague
|
||||
topic: weight-discrepancy
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Manifest weight discrepancy exists and dock workers are suspicious of the official explanation. Cross-reference: investigation.manifest_discrepancy."
|
||||
tags: [manifest, weight-discrepancy, contraband-adjacent, investigation-payload]
|
||||
|
||||
- id: overheard_019
|
||||
register: work
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Shift handover's going to be rough tonight. Torek's team hasn't filed."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Torek's team never files on time. Let Maret handle it."
|
||||
relationship_type: colleague
|
||||
topic: shift-handover
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: null
|
||||
tags: [torek, maret, shift, atmosphere, work]
|
||||
|
||||
- id: overheard_020
|
||||
register: work
|
||||
speaker_a:
|
||||
role: maintenance-tech
|
||||
text: "Sub-level access has been requested twice this week. Both times outside shift hours."
|
||||
speaker_b:
|
||||
role: maintenance-tech
|
||||
text: "Scheduled maintenance happens in-shift. Off-hours access needs sign-off."
|
||||
relationship_type: colleague
|
||||
topic: sub-level-access
|
||||
location_hints: [maintenance-corridors]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Someone has been accessing sub-level spaces outside normal hours. No sign-off implies unauthorized use. Cross-reference: smuggling-hold activity."
|
||||
tags: [sub-level, access, maintenance, investigation-payload]
|
||||
|
||||
- id: overheard_021
|
||||
register: work
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Bay four's been sealed for inspection since yesterday morning."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Commission authorized it. Not Voss. Commission went over his head."
|
||||
relationship_type: colleague
|
||||
topic: bay-inspection
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Bay four inspection bypassed Voss's authority. Commission is operating independently of local management."
|
||||
tags: [bay-four, commission, voss, inspection, investigation-payload]
|
||||
|
||||
- id: overheard_022
|
||||
register: work
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Kael's running Renn's route today. Renn's supposed to be on that."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Kael volunteered. Said Renn had something come up."
|
||||
relationship_type: colleague
|
||||
topic: route-substitution
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Kael is voluntarily taking routes outside his assignment. Could be covering for Renn, could be operational flexibility needed by the ring."
|
||||
tags: [kael, renn, route, ring-adjacent]
|
||||
|
||||
- id: overheard_023
|
||||
register: work
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Lera's dealing with the supply chain issue again. Grain spirit supplier changed terms."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Lera will figure it out. Lera always figures it out."
|
||||
relationship_type: friend
|
||||
topic: supply-chain
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: null
|
||||
tags: [lera, supply, atmosphere, work]
|
||||
|
||||
- id: overheard_024
|
||||
register: work
|
||||
speaker_a:
|
||||
role: maintenance-tech
|
||||
text: "Condensation in the B-corridor's gotten worse. Someone's running heat-generation equipment down there."
|
||||
speaker_b:
|
||||
role: maintenance-tech
|
||||
text: "Heat-gen in a maintenance corridor. That's either a storage issue or a very bad idea."
|
||||
relationship_type: colleague
|
||||
topic: corridor-anomaly
|
||||
location_hints: [maintenance-corridors]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Heat-generating equipment is being used in maintenance corridors unofficially. Points toward the smuggling hold or ring operations."
|
||||
tags: [b-corridor, heat, maintenance, smuggling-adjacent]
|
||||
|
||||
- id: overheard_025
|
||||
register: work
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Torek's been doing double manifests for a month. Every container logged twice."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Double logging means one version goes somewhere it shouldn't."
|
||||
relationship_type: colleague
|
||||
topic: manifest-anomaly
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Torek is maintaining duplicate manifest records. One version is falsified. Direct evidence of ring operation at the administrative level."
|
||||
tags: [torek, manifest, contraband, investigation-payload, high-value]
|
||||
|
||||
# ===================================================================
|
||||
# GOSSIP register — third-party knowledge with investigative payload
|
||||
# ===================================================================
|
||||
|
||||
- id: overheard_026
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Kael was in corridor B-7 last night. Saw him myself. Off shift, wrong time, wrong place."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Kael lives near B-section. Could have been heading home the long way."
|
||||
relationship_type: colleague
|
||||
topic: kael-location
|
||||
location_hints: [the-terminal, the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Kael was in corridor B-7 off-shift. Eyewitness account. Cross-reference: investigation.kael_corridor_meeting."
|
||||
tags: [kael, corridor-b7, investigation-payload, friend-arc, high-value]
|
||||
|
||||
- id: overheard_027
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Kael was talking to someone near B-7 last night. Person I didn't recognize."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Unknown people at junction B-7 at night. That's not normal."
|
||||
relationship_type: friend
|
||||
topic: kael-unknown-contact
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Kael met with an unidentified person at corridor B-7 during off-hours. Cross-reference: investigation.kael_unknown_contact."
|
||||
tags: [kael, unknown-contact, corridor-b7, friend-arc, high-value, investigation-payload]
|
||||
|
||||
- id: overheard_028
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Torek spent three thousand credits at Lera's last week. Three thousand. On a dock worker's salary."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Torek's either very lucky or very stupid. Either way, someone's going to notice."
|
||||
relationship_type: friend
|
||||
topic: torek-spending
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Torek is spending significantly above his salary at The Last Shift. Cross-reference: investigation.torek_spending_pattern."
|
||||
tags: [torek, spending, lera, investigation-payload, ring-adjacent]
|
||||
|
||||
- id: overheard_029
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Renn got new boots. Commission-grade. Renn can't afford Commission-grade boots."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Renn's been running extra shifts. Or extra something."
|
||||
relationship_type: colleague
|
||||
topic: renn-spending
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Renn has unexplained extra income. Cross-reference: ring membership payments."
|
||||
tags: [renn, income, ring-adjacent, investigation-adjacent]
|
||||
|
||||
- id: overheard_030
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Sera Venn avoids Torek every time he's here. Every single time. Noticed it three weeks straight."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Torek does that to people. He talks too much and says things he shouldn't."
|
||||
relationship_type: colleague
|
||||
topic: sera-torek-avoidance
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Sera Venn has a consistent avoidance pattern toward Torek Lintar. Cross-reference: behavioral.sera_avoidance_pattern."
|
||||
tags: [sera, torek, avoidance, friend-arc, investigation-payload, high-value]
|
||||
|
||||
- id: overheard_031
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Commission officer's been asking questions at The Terminal. Polite questions. Thorough ones."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Polite and thorough is the worst combination. That's someone who has time."
|
||||
relationship_type: colleague
|
||||
topic: commission-investigation
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "A Commission officer is conducting a quiet investigation at The Terminal. Cross-reference: awareness.detective_presence."
|
||||
tags: [commission, detective, investigation-payload, awareness]
|
||||
|
||||
- id: overheard_032
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Lattice components went through last month. Unlicensed grade. Manifest said 'mechanical parts.'"
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Mechanical parts. Right. People find ways when the Commission won't."
|
||||
relationship_type: colleague
|
||||
topic: contraband-transit
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Unlicensed lattice components are moving through The Terminal under falsified manifests. Cross-reference: contraband operation confirmed."
|
||||
tags: [lattice, contraband, manifest, investigation-payload, high-value]
|
||||
|
||||
- id: overheard_033
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: maintenance-tech
|
||||
text: "Sub-level temp storage has been accessed four times this week. Door log shows it."
|
||||
speaker_b:
|
||||
role: maintenance-tech
|
||||
text: "Four times and no maintenance ticket filed. Someone's using it off-book."
|
||||
relationship_type: colleague
|
||||
topic: unauthorized-access
|
||||
location_hints: [maintenance-corridors]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "The sub-level storage (smuggling hold) has heavy unauthorized use documented in door logs. Direct evidence of ring operations."
|
||||
tags: [sub-level, access-log, ring, investigation-payload, high-value]
|
||||
|
||||
- id: overheard_034
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Voss changed the B-section rotation. Kael and Renn are both on the overnight slot now."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Kael and Renn on overnight in B-section. That's a very specific combination."
|
||||
relationship_type: colleague
|
||||
topic: roster-combination
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Kael and Renn have been placed on the same overnight B-section rotation. This creates the oversight gap the ring needs."
|
||||
tags: [kael, renn, voss, roster, ring-adjacent, investigation-payload]
|
||||
|
||||
- id: overheard_035
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Sera asked me about container routing last week. Wanted to know who approves temp storage extensions."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Commission tech asking about temp storage approvals. That's outside her job scope."
|
||||
relationship_type: colleague
|
||||
topic: sera-investigation
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Sera Venn is conducting her own investigation into temp storage approvals, outside her Commission mandate. Cross-reference: behavioral.sera_kiosk_pattern."
|
||||
tags: [sera, storage, investigation-payload, friend-arc, dual-lens, high-value]
|
||||
|
||||
- id: overheard_036
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Naia told me Kael hasn't been sleeping. Says he's up late, doesn't explain where."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Naia's worried about him. Kael won't talk about whatever it is."
|
||||
relationship_type: friend
|
||||
topic: kael-behavioral-change
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Kael's behavior has changed at home. Sleepless, secretive, won't explain to Naia. Cross-reference: behavioral.kael_behavioral_change, investigation.kael_attempting_exit."
|
||||
tags: [kael, naia, behavior, friend-arc, investigation-payload]
|
||||
|
||||
- id: overheard_037
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Someone flagged a manifest discrepancy on the morning freight. Voss cleared the flag himself."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Voss doesn't clear flags. That's Maret's job. Or Commission's."
|
||||
relationship_type: colleague
|
||||
topic: manifest-flag-cleared
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Voss manually cleared a manifest discrepancy flag, bypassing protocol. Suggests Voss is actively covering for ring activity."
|
||||
tags: [voss, manifest, flag-cleared, investigation-payload, high-value]
|
||||
|
||||
- id: overheard_038
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Kael's been asking about exit options. Not just talk — actually asking Lera if she knows anyone who could help someone disappear quietly."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Kael wants out of something. That's the only reason people ask that kind of question."
|
||||
relationship_type: friend
|
||||
topic: kael-exit-attempt
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Kael is actively trying to leave 'something' — most likely the ring. He's researching options. Cross-reference: investigation.kael_attempting_exit."
|
||||
tags: [kael, exit, ring-adjacent, friend-arc, investigation-payload, high-value]
|
||||
|
||||
- id: overheard_039
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Medical lattice upgrades are showing up on the black-side. Commission-grade, no paperwork."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "People who need them can't wait on Commission approval. Someone's doing a service."
|
||||
relationship_type: colleague
|
||||
topic: black-market-lattice
|
||||
location_hints: [the-terminal, the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Medical-grade lattice components are available outside Commission channels. Confirms the moral framing of the contraband operation — it serves real medical need."
|
||||
tags: [lattice, medical, black-market, contraband, moral-framing]
|
||||
|
||||
- id: overheard_040
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Torek told someone he had a meeting last night. Past midnight. In maintenance."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Torek having midnight maintenance meetings. Sure. That's completely normal."
|
||||
relationship_type: colleague
|
||||
topic: torek-late-meeting
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Torek met with someone in the maintenance corridors late at night. Cross-reference: investigation.torek_ring_meeting."
|
||||
tags: [torek, maintenance, midnight, ring-adjacent, investigation-payload]
|
||||
|
||||
# ===================================================================
|
||||
# BONUS PAIRS — social and work depth
|
||||
# ===================================================================
|
||||
|
||||
- id: overheard_041
|
||||
register: social
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Lera's thinking about expanding. Back room could seat twenty more."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Back room's the only reason this place has any privacy. Expand it and we lose that."
|
||||
relationship_type: friend
|
||||
topic: bar-expansion
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: null
|
||||
tags: [lera, bar, atmosphere, social]
|
||||
|
||||
- id: overheard_042
|
||||
register: work
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Shift change is late again. Maret says weather on Velen is delaying the span gate."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Weather on Velen. Which means fog. Which means the morning run is going to be rough."
|
||||
relationship_type: colleague
|
||||
topic: weather-delay
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: null
|
||||
tags: [velen, fog, span-gate, weather, atmosphere]
|
||||
|
||||
- id: overheard_043
|
||||
register: social
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Olin's getting a commendation from Commission. Ten years of service."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Ten years. Commission gives you a piece of paper and a handshake."
|
||||
relationship_type: colleague
|
||||
topic: commission-recognition
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: null
|
||||
tags: [olin, commission, atmosphere, social]
|
||||
|
||||
- id: overheard_044
|
||||
register: work
|
||||
speaker_a:
|
||||
role: maintenance-tech
|
||||
text: "Power fluctuation in sub-level B last night. Lasted three minutes."
|
||||
speaker_b:
|
||||
role: maintenance-tech
|
||||
text: "Three minutes is enough to blind the cameras if you know the timing."
|
||||
relationship_type: colleague
|
||||
topic: power-fluctuation
|
||||
location_hints: [maintenance-corridors]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "A power fluctuation in sub-level B temporarily disabled cameras. Could be timed to enable unobserved access."
|
||||
tags: [power, cameras, sub-level, timing, investigation-adjacent]
|
||||
|
||||
- id: overheard_045
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Commission officer asked Drin about cargo manifest irregularities. Drin told him everything he knows, which isn't much."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Drin doesn't know much by design. That's why Drin's on inspection detail."
|
||||
relationship_type: colleague
|
||||
topic: commission-inquiry
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "The Commission officer is asking dock workers directly about manifest irregularities. Drin has been interviewed. Cross-reference: awareness.detective_presence."
|
||||
tags: [drin, commission, detective, interview, investigation-payload]
|
||||
|
||||
- id: overheard_046
|
||||
register: gossip
|
||||
speaker_a:
|
||||
role: bar-regular
|
||||
text: "Sera's been keeping a list. Someone told Naia. Private list, personal data."
|
||||
speaker_b:
|
||||
role: bar-regular
|
||||
text: "Sera keeping a list of what? And why would Naia know?"
|
||||
relationship_type: friend
|
||||
topic: sera-documentation
|
||||
location_hints: [the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Sera is documenting something privately — possibly her own investigation or evidence she's sitting on. Cross-reference: investigation.sera_unreported_evidence."
|
||||
tags: [sera, naia, list, evidence, friend-arc, investigation-payload, dual-lens]
|
||||
|
||||
- id: overheard_047
|
||||
register: social
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Sova's been home for twenty years. Still don't know if I love it or just got used to it."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Twenty years is the same thing."
|
||||
relationship_type: friend
|
||||
topic: station-life
|
||||
location_hints: [the-terminal, the-last-shift]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: null
|
||||
tags: [sova, atmosphere, personal, social]
|
||||
|
||||
- id: overheard_048
|
||||
register: work
|
||||
speaker_a:
|
||||
role: dock-worker
|
||||
text: "Voss approved overtime for two extra heads on the B-section night shift. Unusual."
|
||||
speaker_b:
|
||||
role: dock-worker
|
||||
text: "Overtime plus extra bodies in B at night. Either something's wrong or something's being made to look right."
|
||||
relationship_type: colleague
|
||||
topic: overtime-approval
|
||||
location_hints: [the-terminal]
|
||||
access: [public]
|
||||
trust: surface
|
||||
knowledge_payload: "Voss approved extra overnight staffing in B-section — possibly to create cover or provide legitimate-looking explanation for movement in that area."
|
||||
tags: [voss, overtime, b-section, night-shift, investigation-adjacent]
|
||||
@@ -0,0 +1,573 @@
|
||||
# Access Tier Shift Design Document
|
||||
|
||||
**Ticket:** #328 | **Feeds:** #169 (Layer 1 access tier filtering, S15)
|
||||
**Authors:** Paula (narrative design), Mellanie (line content, to be co-authored)
|
||||
**Date:** 2026-02-20
|
||||
**Status:** Draft
|
||||
|
||||
**Decision cross-references:** D-028 (dialogue architecture — tagged line pools, four relational layers), D-033 (entity color = relationship to player), D-035 (converged tag taxonomy), D-062 (invisible locked dialogue options), D-063 (confrontation mechanics), D-064 (walk-away consequences), D-075 (dialogue filtering — layered confidence gate)
|
||||
|
||||
**Fact ID source:** `docs/design/knowledge-vocabulary-v01.md` (ticket #368)
|
||||
|
||||
---
|
||||
|
||||
## What This Document Is
|
||||
|
||||
This document specifies when and how a player character's access tier changes with a given social site or NPC cluster during v0.1 play. Access tiers (D-028 Layer 1) are hard filters on dialogue line eligibility — they determine *which categories of conversation* the player can have, not which specific lines they get.
|
||||
|
||||
**Access tier map:**
|
||||
|
||||
| Tier | Who Has It | Relationship State | Social Position |
|
||||
|------|-----------|-------------------|----------------|
|
||||
| `public` | Anyone | Unknown or any | Stranger or authority |
|
||||
| `peer` | Known or Friendly | Known · Friendly | Recognized colleague, social equal |
|
||||
| `insider` | Friendly only | Friendly | Trusted member, community in-group |
|
||||
| `authority` | Detective only | Unknown through PersonOfInterest | Institutional leverage operative |
|
||||
| `hostile` | Post-relationship-break | Hostile | Enemy, threat, someone actively managing you out |
|
||||
|
||||
**Key design axiom from D-062:** Players don't know what they're missing. When access tier shifts downward, locked-out content disappears silently. No "you've lost Kael's trust" notification. The absence *is* the signal. Monologue is the only permitted narrator of shift events.
|
||||
|
||||
---
|
||||
|
||||
## How Access Tier Shifts Work (Engine Model)
|
||||
|
||||
Access tier is derived from `RelationshipState` (per D-033) — the engine looks up the player's relationship state with the target NPC at dialogue selection time and applies the tier filter automatically. Content authors do not tag shift events; they author the content that exists on both sides of the transition.
|
||||
|
||||
**RelationshipState → AccessTier mapping:**
|
||||
|
||||
| RelationshipState | Available Tiers |
|
||||
|-------------------|----------------|
|
||||
| `Unknown` | `public`; `authority` (detective) |
|
||||
| `Known` | `public` · `peer`; `authority` (detective) |
|
||||
| `Friendly` | `public` · `peer` · `insider` |
|
||||
| `PersonOfInterest` | `public`; `authority` (detective); `hostile` (if escalated) |
|
||||
| `Hostile` | `hostile` only |
|
||||
|
||||
**What triggers a RelationshipState change** is simulation-side: NPC reactions to player behavior, witnessed events, conversation outcomes, KG fact accumulation. This document specifies the *content conditions* — the game state conditions that must be true for a transition to be meaningful and authoritatively triggered. These map to FactIds and entity attribute checks in the prerequisite system (D-035).
|
||||
|
||||
---
|
||||
|
||||
## Social Site 1: The Terminal (Logistics Hub)
|
||||
|
||||
### Smuggler at The Terminal
|
||||
|
||||
**Starting state:** `insider` + `peer` with ring members (Kael, Nils, Voss, Renn); `peer` with non-ring colleagues (Maret, Drin, Harek); `public` with strangers
|
||||
|
||||
The Terminal is the smuggler's home ground. They've worked here for two years. The warm `insider` access with ring colleagues is the baseline — ring operational talk, corridor scheduling, quiet coordination between shift tasks. The smuggler doesn't know what it feels like to be `public` here. They will, if things go wrong.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 1-S-T: `insider → hostile` (ring turns on smuggler; cover blown)
|
||||
|
||||
**Direction:** Downward. The most severe possible transition.
|
||||
|
||||
**Narrative context:** The ring has concluded the smuggler is a liability — either actively cooperating with the Commission investigation, or so visibly compromised that they're a risk to operations. Once this threshold is crossed, ring members stop sharing operational information and begin actively managing the smuggler's exposure: giving false scheduling, monitoring their movements, possibly preparing to eject them from the ring entirely.
|
||||
|
||||
**Observable event that triggers transition:**
|
||||
One of the following event chains completes:
|
||||
1. Smuggler is observed in direct sustained conversation with the detective in a non-public context (e.g., maintenance corridor, isolated terminal bay) by a ring operative (Voss, Nils, or Renn)
|
||||
2. Smuggler's cover story fails under questioning by Nils — Nils determines the smuggler knew about the detective's investigation and didn't report it
|
||||
3. Ring discovers the smuggler has been observed by Commission surveillance (Sera Venn's unofficial compliance scan results surface)
|
||||
|
||||
**Required KG facts at transition point:**
|
||||
|
||||
| Fact ID | Min Confidence | Role in Transition |
|
||||
|---------|---------------|-------------------|
|
||||
| `awareness.detective_presence` | `knows_of` | Ring knows a Commission detective is on station |
|
||||
| `awareness.detective_investigating_ring` | `suspects` | Ring suspects (or knows) the investigation targets them specifically |
|
||||
| `awareness.ring_route_compromise` | `suspects` | The current route is perceived as compromised |
|
||||
| `investigation.ring_existence` | `knows_of` | (Detective's version; smuggler doesn't need this, but the simulation uses it to assess ring panic level) |
|
||||
|
||||
**Entity state required:**
|
||||
- Ring operative (Nils or Voss) RelationshipState to smuggler: shifts from `Friendly` → `PersonOfInterest` → `Hostile`
|
||||
- This chain typically passes through `PersonOfInterest` first (suspicion phase) before completing to `Hostile`
|
||||
|
||||
**Content requirement:**
|
||||
The dialogue pool must include `hostile`-tier lines that feel like community closure, not just interpersonal conflict. Voss gives clipped operational answers. Nils stops acknowledging the smuggler in shared spaces. Renn averts eye contact. These are `hostile`-access lines tagged `situation: [shift_encounter, workplace]` that communicate ostracism through normalcy-performance rather than explicit threat.
|
||||
|
||||
**Monologue requirement:**
|
||||
Smuggler monologue at this transition must do what D-063's pre-delivery beat does for confrontation: surface the weight before the player feels it mechanically. Suggested trigger: `observe_npc` when the smuggler sees a ring member at The Terminal post-transition.
|
||||
|
||||
```
|
||||
trigger: observe_npc
|
||||
character: smuggler
|
||||
prerequisite:
|
||||
relationship:
|
||||
target: npc:voss # or nils / renn
|
||||
state: hostile
|
||||
text: "Voss walked past me without nodding. Two years on the same shift. He just... walked past."
|
||||
mood: [shocked]
|
||||
```
|
||||
|
||||
**Reversibility:** Near-irreversible within v0.1. The ring operates on operational security logic, not personal forgiveness. To reverse this, the smuggler would need to demonstrate the detective has been misled or has left the station — a scenario beyond the v0.1 scope. Flag as permanent-for-sprint for content authoring purposes.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 2-S-T: `insider → peer` (ring caution mode; Kael situation escalates ring tension)
|
||||
|
||||
**Direction:** Partial downward. `insider` access to ring-specific operational dialogue narrows; `peer` access to social/colleague dialogue remains.
|
||||
|
||||
**Narrative context:** This is not a trust collapse — it's a trust contraction. As the ring senses internal pressure (Kael's unauthorized contacts, ring tension escalation), Voss and Nils begin compartmentalizing operational information. The smuggler still belongs, still gets treated like a colleague, but the operational coordination talk goes quiet. Ring members are self-protective, not hostile. They're not excluding the smuggler — they're excluding *everyone* from the sensitive operational layer while they assess.
|
||||
|
||||
**Observable event that triggers transition:**
|
||||
- Nils or Voss observes or suspects Kael's unauthorized meeting (the same event the smuggler may discover independently in THE FRIEND arc — different observer, same event)
|
||||
- Ring tension escalation manifests as shortened coordination exchanges at The Terminal
|
||||
|
||||
**Required KG facts at transition point:**
|
||||
|
||||
| Fact ID | Min Confidence | Role in Transition |
|
||||
|---------|---------------|-------------------|
|
||||
| `awareness.ring_tension_escalation` | `suspects` | Ring senses internal stress; caution spreading |
|
||||
| `investigation.kael_corridor_meeting` | `suspects` | Kael seen with unknown contact (ring operative observed this, not necessarily the player) |
|
||||
| `investigation.kael_unknown_contact` | `suspects` | The contact is unrecognized — potential exposure |
|
||||
|
||||
**Entity state required:**
|
||||
- Ring operative RelationshipState to smuggler: remains `Friendly` (no state change), but `insider`-tagged dialogue pool for ring operations is gated by a ring-internal caution flag
|
||||
- This is a content-authored partial exclusion, not a RelationshipState change — implemented by adding a runtime flag to the selection system that suppresses `insider, trust: real` ring-coordination lines even for Friendly NPCs
|
||||
|
||||
> **Implementation note for #169:** This transition requires a ring-internal state variable (`ring_on_caution`) that the content team will need to reference in prerequisite format. Proposed fact: `awareness.ring_tension_escalation` at `knows_of` triggers this suppression server-side. Content authors should tag ring-operational insider lines with `tags: [ring-coordination]` and the server system can suppress that tag cluster when the caution flag is active.
|
||||
|
||||
**Content requirement:**
|
||||
Two parallel dialogue pools needed: ring-coordination pool (suppressed when `ring_on_caution` active) and social-colleague pool (always available while Friendly). The player notices that Voss stops mentioning shift windows. Kael stops asking about container routing. The conversation continues, but operational content disappears.
|
||||
|
||||
**Reversibility:** Yes. If ring tension resolves (e.g., Kael's situation normalizes, the threat passes), operational talk resumes. Reversible via `awareness.ring_tension_escalation` falling below `suspects` threshold — which in practice means the ring stops tracking the anomaly.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 3-S-T: `peer → peer` to `hostile` (non-ring colleagues react to cover exposure)
|
||||
|
||||
**Direction:** Downward, distinct pathway from Transition 1-S-T.
|
||||
|
||||
**Narrative context:** Maret Korr, Harek, and legitimate dock workers don't know about the ring. Their hostility toward the smuggler comes not from ring logic but from community logic: they discover (via detective's investigation becoming public, or visible confrontation at The Terminal) that someone they trusted was running contraband operations through their workspace. Maret, who's been a scheduling colleague for two years, feels used.
|
||||
|
||||
**Observable event that triggers transition:**
|
||||
- Detective's investigation becomes visible enough at The Terminal that legitimate workers understand what's been happening
|
||||
- Required: detective has interrogated Maret or Drin visibly (witnessed by other dock workers)
|
||||
|
||||
**Required KG facts at transition point:**
|
||||
|
||||
| Fact ID | Min Confidence | Role in Transition |
|
||||
|---------|---------------|-------------------|
|
||||
| `investigation.ring_existence` | `knows_of` | Legitimate workers now know a ring was operating |
|
||||
| `investigation.manifest_discrepancy` | `knows_of` | The discrepancies are understood as intentional, not clerical |
|
||||
|
||||
**Reversibility:** Moderate difficulty. Unlike ring-member hostility (operational logic), this hostility is personal-moral. If the smuggler demonstrates they weren't a core operator (partial truth), some colleagues might return to neutral `public` tier.
|
||||
|
||||
---
|
||||
|
||||
### Detective at The Terminal
|
||||
|
||||
**Starting state:** `authority` with Voss, Maret, Drin; `public` with most hub workers; no `insider` access (investigator is always an outsider to the ring's in-group)
|
||||
|
||||
The Terminal is adversarial ground for the detective. Authority access gives institutional leverage — the detective can ask hard questions, invoke Commission standing, access records — but it creates social friction. Every exercise of authority makes the `peer` path harder.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 1-D-T: `authority → peer` (collaboration event; institutional authority softens to personal rapport)
|
||||
|
||||
**Direction:** Sideways (not strictly up or down — `authority` and `peer` provide different content, not hierarchically ranked).
|
||||
|
||||
**Narrative context:** This transition is the detective learning to work *with* the community rather than on top of it. A specific collaboration event — helping Maret with a non-smuggling problem, or letting a minor infraction go — signals to a hub worker that the detective is operating in good faith. The hub worker begins treating the detective as a person, not a badge. This unlocks `peer`-tier content from that NPC: honest opinions, unguarded speech, actual feelings. These are the lines that contain the most useful investigative texture.
|
||||
|
||||
**Observable event that triggers transition:**
|
||||
- Detective witnesses or intercepts a minor infraction unrelated to the ring investigation (dock worker running personal cargo through, Harek's unofficial equipment borrowing) and explicitly does not file it
|
||||
- OR: Detective helps Maret resolve a scheduling conflict caused by simulation-generated NPC behavior (non-ring-related problem), giving Maret reason to feel reciprocal goodwill
|
||||
|
||||
**Required KG facts at transition point:**
|
||||
|
||||
| Fact ID | Min Confidence | Role in Transition |
|
||||
|---------|---------------|-------------------|
|
||||
| `investigation.ring_existence` | `suspects` | Detective is on station for a reason; Maret knows this |
|
||||
| `social.bar_regular_status` | `suspects` | Detective is becoming a known presence on Sova (not bar-specific, but signals integration) |
|
||||
|
||||
**Entity state required:**
|
||||
- Target NPC (Maret, most likely): RelationshipState transitions `Known` → `Friendly`
|
||||
- Once `Friendly`, `peer`-tier dialogue becomes available; `authority`-tier remains available simultaneously (detective can shift registers within a conversation)
|
||||
|
||||
**Content requirement:**
|
||||
`peer`-tier Maret dialogue should feel warmer, more candid, and more useful than `authority`-tier Maret dialogue — but for different reasons. `authority` lines give formal, procedurally correct answers. `peer` lines give informal reads: "Voss has been different lately. Can't say why. Just tighter." That line is `trust: real`, `access: [peer]`.
|
||||
|
||||
**Reversibility:** Yes, but fragile. If detective subsequently uses institutional leverage against Maret (authority interrogation, official filing of any minor infraction), RelationshipState may revert to `Known` and `peer` access narrows back to `authority`.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 2-D-T: `authority → hostile` (confrontation fails; community closes ranks)
|
||||
|
||||
**Direction:** Downward. The most damaging investigative outcome — hub workers who were cooperating under authority pressure now actively stonewall.
|
||||
|
||||
**Narrative context:** If the detective uses institutional leverage badly — pressing too hard in a way that's visible to other workers, making an accusation that doesn't stick, or invoking Commission authority in a situation where the community reads it as overreach — the hub shifts from grudging cooperation to collective non-cooperation. This isn't ring coordination; it's community immune response. Dock workers closing ranks around their own.
|
||||
|
||||
**Observable event that triggers transition:**
|
||||
- Detective conducts a visible confrontation (D-063) with Voss or Maret in a public area of The Terminal, the confrontation fails (NPC successfully deflects, detective doesn't have sufficient evidence), and other workers witness the exchange
|
||||
- OR: Detective formally reports a minor infraction that hub workers considered a normal part of life — the report reads as persecution, not investigation
|
||||
|
||||
**Required KG facts at transition point:**
|
||||
|
||||
| Fact ID | Min Confidence | Role in Transition |
|
||||
|---------|---------------|-------------------|
|
||||
| `investigation.oversight_gap_pattern` | `suspects` | Detective has been probing, not finding clean answers |
|
||||
| `awareness.commission_audit_scheduled` | `knows_of` | Hub workers know a formal audit is coming; fear is already elevated |
|
||||
|
||||
**Key design tension — confrontation + walkaway (D-063/D-064):**
|
||||
A confrontation that the detective walks away from (WASD during exchange) doesn't just end the confrontation — the KG records incompleteness. If the detective starts a confrontation with Voss and then leaves mid-exchange, Voss's `contradiction_flagged` attribute gets set, and the ring interprets this as: the detective has partial evidence and couldn't follow through. This triggers ring defensiveness *faster* than a completed confrontation. Content authors should note: `investigation.shift_mismatch` at `knows_of` + an incomplete confrontation event = ring caution acceleration.
|
||||
|
||||
**Content requirement:**
|
||||
Post-hostile Terminal NPCs need `hostile`-tier dialogue that sounds like bureaucratic compliance, not aggression. "Shifts are logged in the system." "You'll want to check with oversight." "I don't have anything more for you." These are lines that technically cooperate while providing nothing — the institutional version of closed doors.
|
||||
|
||||
**Reversibility:** Moderate difficulty. The detective would need to either produce evidence that justifies the confrontation retrospectively (making the community feel the investigation was warranted) or wait long enough for the community's defensive posture to relax. Within v0.1 timeline: effectively permanent once triggered.
|
||||
|
||||
---
|
||||
|
||||
## Social Site 2: The Last Shift (Bar)
|
||||
|
||||
### Smuggler at The Last Shift
|
||||
|
||||
**Starting state:** The smuggler's starting tier at The Last Shift depends on their history with the bar. If played as a regular (the intended interpretation), they begin at `peer` with most bar regulars and `insider` with Lera (ring-aware, bar owner who runs quiet coordination). With strangers or recent arrivals (Sera Venn, Commission-adjacent individuals), they begin at `public`.
|
||||
|
||||
The bar is a social pressure valve. It's where the district's people become people. The smuggler is comfortable here — but comfort makes the downward transition more disorienting.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 1-S-B: `public → insider` (Kael introduction; bar community adopts smuggler)
|
||||
|
||||
**Direction:** Upward. Unusual in the design — most documented transitions are downward. This one represents the smuggler extending their community standing into the bar's inner circle.
|
||||
|
||||
**Narrative context:** The smuggler knows Lera and the ring-aware bar regulars already. But Kael's social circle at the bar — Naia, her friends, some bar regulars who are ring-adjacent but not ring members — is a separate network. Kael making a formal introduction signals to this circle that the smuggler belongs. This unlocks insider-tier content from Naia and her social cluster: actual feelings, honest opinions, personal context. Naia's worry about Kael surfaces here.
|
||||
|
||||
This transition is the mechanism by which the smuggler gains access to the warning signs of Kael's situation before the corridor B-7 contradiction. Naia is visibly anxious. Her concern is `insider`-tier content — she wouldn't share it with a stranger.
|
||||
|
||||
**Observable event that triggers transition:**
|
||||
- Kael and the smuggler are both present at The Last Shift; Kael initiates introduction exchange ("She's on my shift, been here as long as I have") with Naia or her immediate social circle
|
||||
- This is a simulation-generated interaction — Kael's routine includes this social gesture if his relationship with the smuggler is `Friendly` and his relationship with Naia is `Friendly`
|
||||
|
||||
**Required KG facts at transition point:**
|
||||
|
||||
| Fact ID | Min Confidence | Role in Transition |
|
||||
|---------|---------------|-------------------|
|
||||
| `social.bar_regular_status` | `suspects` | Smuggler is becoming a regular; the introduction lands as socially coherent |
|
||||
| `relationship.kael_naia_connection` | `knows_of` | Smuggler knows Kael and Naia are connected; the introduction isn't out of nowhere |
|
||||
|
||||
**Entity state required:**
|
||||
- Kael RelationshipState to smuggler: `Friendly`
|
||||
- Naia RelationshipState to smuggler: `Unknown` → `Known` (minimum for transition to trigger)
|
||||
- Full `insider` access to Naia unlocks at `Known` → `Friendly` (second threshold, requires sustained positive interaction)
|
||||
|
||||
**Content requirement:**
|
||||
Naia's `insider`-tier content at The Last Shift should surface her anxiety about Kael in a way that doesn't explain it — it creates the question without the answer. "He's been working late. I don't... he gets like this sometimes." Tagged `trust: real`, `access: [insider]`. This is the content the smuggler can't get as a stranger, and it's the warning they carry into the corridor B-7 observation.
|
||||
|
||||
**Reversibility:** Yes. If the smuggler stops visiting the bar, Naia's RelationshipState drifts back to `Known` over time. The `insider` access requires sustained interaction.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 2-S-B: `insider → hostile` (social contamination from ring crisis)
|
||||
|
||||
**Direction:** Downward. Social contamination spreads from ring context to bar context.
|
||||
|
||||
**Narrative context:** The bar is where ring community and legitimate community overlap. When the ring turns on the smuggler, the contamination spreads through this overlap. Lera stops holding the smuggler's usual seat. Torek stops buying rounds. Bar regulars who are ring-adjacent start looking uncomfortable when the smuggler arrives. This isn't organized — it's social contagion. Lera doesn't want trouble at her bar. The regulars follow her lead.
|
||||
|
||||
**Observable event that triggers transition:**
|
||||
- Ring has already moved to `hostile` tier with the smuggler at The Terminal (Transition 1-S-T has completed)
|
||||
- A ring member (Renn or Torek) is present at the bar when the smuggler arrives and visibly changes behavior — leaves, signals to Lera, or gives the smuggler a warning look
|
||||
|
||||
**Required KG facts at transition point:**
|
||||
|
||||
| Fact ID | Min Confidence | Role in Transition |
|
||||
|---------|---------------|-------------------|
|
||||
| `awareness.ring_tension_escalation` | `knows_of` | Bar regulars who are ring-adjacent have sensed something's wrong |
|
||||
| `awareness.ring_route_compromise` | `suspects` | The ring is protecting its operational footprint |
|
||||
|
||||
**Entity state required:**
|
||||
- At least one ring-adjacent bar regular (Torek or Renn): RelationshipState to smuggler has moved to `PersonOfInterest` or `Hostile`
|
||||
- Lera: RelationshipState shifts from `Friendly` → `Known` (bar owner withdraws warmth without active hostility; bar is still `public` accessible, but the home feeling is gone)
|
||||
|
||||
**Secondary contamination — Naia:**
|
||||
If Naia has learned (through Kael or indirect observation) that the smuggler is suspected by the ring, her RelationshipState also shifts. Naia's hostility is different from the ring's — it's protective fear, not operational defense. She doesn't want to lose Kael to whatever the smuggler has gotten caught up in. Content for Naia at this stage should feel like hurt and worry compressed into withdrawal, not anger.
|
||||
|
||||
**Content requirement:**
|
||||
The `hostile`-tier bar content is some of the most important emotional writing in the game. The bar was comfort. The bar is now hostile territory with familiar faces. Lera's lines should feel like professional neutral — no warmth, no cold, just a bartender doing her job. Torek's lines (if present) should feel like he's trying to warn the smuggler while staying deniable. This requires careful access tagging: Torek's warning is `access: [peer]`, `trust: real` — he'll only deliver it if the player is still `Known` with him, not yet `Hostile`.
|
||||
|
||||
**Reversibility:** Hard. Requires terminal-level crisis to resolve first. The bar follows the ring's social signal.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 3-S-B: `insider → hostile` (contraband conversation overheard by hostile observer)
|
||||
|
||||
**Direction:** Downward, distinct from Transition 2-S-B. This is an in-bar event, not contamination from outside.
|
||||
|
||||
**Narrative context:** The bar creates a specific risk: ring-relevant conversation in a space with poor sound isolation. D-078 established that NPC-to-NPC conversations are Voice events the player can overhear — the same applies in reverse. If the smuggler and a ring member have an `insider`-tier conversation at The Last Shift within earshot of an unfriendly observer (the detective, a Commission-tagged NPC, or a bar regular who's been marked as informant), the result is catastrophic.
|
||||
|
||||
**Observable event that triggers transition:**
|
||||
- Smuggler and ring member (Kael, Voss, or Renn) are in `insider`-tier dialogue at The Last Shift
|
||||
- A third party with `PersonOfInterest` or `Hostile` relationship to the ring is within Voice range (D-018 three-range sound model)
|
||||
- The overheard content triggers a KG fact update for the observer
|
||||
|
||||
**Required KG facts at transition point (observer's perspective):**
|
||||
|
||||
| Fact ID | Min Confidence | Role in Transition |
|
||||
|---------|---------------|-------------------|
|
||||
| `investigation.ring_existence` | `suspects` | Observer already suspected a ring; the conversation confirms it |
|
||||
| `contraband.ring_lattice_components` | `suspects` | Observer now understands what's being moved |
|
||||
|
||||
**The asymmetry:** From D-018's three-range model, the player controls whether they're within Voice range of overheard conversations — but NPCs don't know they're being overheard. If the detective is nearby and the player (as smuggler) initiates ring-coordination dialogue, this is a player error with consequence. The simulation shouldn't make this easy to do accidentally, but it should make the consequence clear and immediate.
|
||||
|
||||
**Reversibility:** None. Fact knowledge is retained by the observer. Once the detective has `contraband.ring_lattice_components` at `knows_of`, that confidence doesn't decay to zero.
|
||||
|
||||
---
|
||||
|
||||
### Detective at The Last Shift
|
||||
|
||||
**Starting state:** `public` with bar regulars; `peer` with Sera Venn (pre-existing contact, established friendship); `authority` over Torek (ring-adjacent, financial tells create leverage potential)
|
||||
|
||||
The bar is the detective's only social toehold. Sera is the social anchor. Every other transition at the bar depends on either sustaining Sera's goodwill or making it on personal terms.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 1-D-B: `public → peer` via Sera Venn (social introduction; district integration)
|
||||
|
||||
**Direction:** Upward.
|
||||
|
||||
**Narrative context:** Sera is the detective's guide to the bar's social geography. She knows the regulars, knows the history, knows who's approachable and who isn't. When she introduces the detective to bar regulars — "We work the same beat, sort of" — she's vouching for the detective as a person, not a badge. This shifts the detective from institutional stranger to known face. `peer`-tier bar content (gossip, complaints, personal context) unlocks.
|
||||
|
||||
This is the primary path to bar integration. The buy-rounds path (Transition 2-D-B) is secondary and slower.
|
||||
|
||||
**Observable event that triggers transition:**
|
||||
- Detective has visited The Last Shift 2+ times with Sera present
|
||||
- Sera is in `Friendly` RelationshipState with detective
|
||||
- On the third or later visit, Sera initiates an introduction event with a bar regular (Lera, most likely, or a mundane-triangle bar regular)
|
||||
|
||||
**Required KG facts at transition point:**
|
||||
|
||||
| Fact ID | Min Confidence | Role in Transition |
|
||||
|---------|---------------|-------------------|
|
||||
| `social.bar_regular_status` | `suspects` | Detective is becoming a recognized face |
|
||||
| `behavioral.sera_kiosk_pattern` | `knows_of` | Detective knows Sera's habits — signals the relationship has texture |
|
||||
|
||||
**Entity state required:**
|
||||
- Sera RelationshipState to detective: `Friendly`
|
||||
- Target bar regular RelationshipState to detective: `Unknown` → `Known` (introduction creates Known; Friendly requires follow-up interaction)
|
||||
|
||||
**Sera dependency risk:** If Sera moves to `PersonOfInterest` (Phase 3 of THE FRIEND arc), this introduction path is compromised. Sera still may be physically present, but her social vouching becomes ambiguous — she might introduce the detective, but bar regulars who are sensitive to institutional dynamics may read the introduction differently. This creates a content authoring requirement: bar regular reactions to Sera-mediated introductions should have two variants — pre-contradiction and post-contradiction.
|
||||
|
||||
**Content requirement:**
|
||||
`peer`-tier bar content for the detective should feel like the community briefly letting the badge off the hook. Lera's peer lines are informal and dry: "You're still here." "Thought Commission people didn't do grain spirit." This is trust-as-tolerance, which is honest to the bar's relationship with institutions.
|
||||
|
||||
**Reversibility:** Yes, but depends entirely on Sera's RelationshipState. If Sera's contradiction is confronted badly and she moves to hostile tier, the detective loses the introduction pipeline and must earn bar integration directly.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 2-D-B: `authority → peer` after buying rounds (social gesture; institutionality dropped)
|
||||
|
||||
**Direction:** Sideways, same dynamic as Transition 1-D-T but in the bar context.
|
||||
|
||||
**Narrative context:** The detective has authority access to Torek (ring-adjacent, financial tells create leverage). But authority access at a bar is uncomfortable — for everyone, including the detective. At some point the detective can choose a different register: stop invoking institutional leverage and just buy a round. This social gesture — explicitly off-the-record, no questions, just drinks — shifts a specific NPC from authority-tier to peer-tier for that interaction and potentially permanently if sustained.
|
||||
|
||||
This is the slower path to bar integration — not mediated by Sera, but earned directly through social investment.
|
||||
|
||||
**Observable event that triggers transition:**
|
||||
- Detective is at The Last Shift with Torek present
|
||||
- Detective initiates a non-investigative social exchange (no use of `authority`-tagged dialogue options for 2+ consecutive conversations)
|
||||
- Buys drinks as a social action (if implemented as an interaction verb in the v0.1 interaction set)
|
||||
|
||||
**Required KG facts at transition point:**
|
||||
|
||||
| Fact ID | Min Confidence | Role in Transition |
|
||||
|---------|---------------|-------------------|
|
||||
| `social.bar_regular_status` | `knows_of` | Detective is now recognized as a regular, not a visitor |
|
||||
|
||||
**Entity state required:**
|
||||
- Torek RelationshipState to detective: `Known` → `Friendly`
|
||||
- Once `Friendly`, `peer`-tier content unlocks; `authority`-tier remains available but the player must actively choose it
|
||||
|
||||
**The buy-rounds mechanism:** The interaction system (D-interaction-verbs) needs a "buy drinks" verb that registers as a positive social action toward present NPCs without triggering dialogue. This is a goodwill investment that accumulates toward RelationshipState advancement. For #169 (S15 implementation): this should be a flagged interaction event that the simulation picks up and applies as relationship credit to all `Known`+ NPCs in proximity.
|
||||
|
||||
**Torek content note:** Torek is ring-adjacent and has financial tells (`investigation.torek_spending_pattern`). Peer-tier Torek content is valuable for the investigation — he's more likely to let something slip in casual conversation than under authority questioning. The buy-rounds path is a legitimate investigative technique, not just social filler. Torek's `peer, trust: real` lines should carry genuine investigative texture.
|
||||
|
||||
**Reversibility:** Yes. If the detective subsequently invokes authority leverage against Torek (raises `investigation.torek_spending_pattern` as direct confrontation material), Torek's RelationshipState reverts. The trust investment is not permanent.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 3-D-B: `peer → authority` (Sera arc activates; trust contaminated)
|
||||
|
||||
**Direction:** Sideways. The detective's relationship with Sera shifts from warm peer-tier to analytically-charged authority-tier as THE FRIEND arc progresses.
|
||||
|
||||
**Narrative context:** Per D-063 and the FRIEND arc specification, when Sera moves to `PersonOfInterest` (Phase 3 of the detective's FRIEND arc), the detective gains access to `authority`-tier dialogue with Sera — institutional leverage questions, direct evidence-seeking. This is distinct from standard authority access (the detective doesn't arrest Sera, doesn't invoke formal Commission processes). The authority content here is personal authority: "I know you know something. I'm asking you." The formality is in the weight of the question, not the institutional mechanism.
|
||||
|
||||
**Observable event that triggers transition:**
|
||||
- Detective observes Sera leave when Torek arrives for the third time (or any two confirmed avoidance events matching the same pattern)
|
||||
- `behavioral.sera_avoidance_pattern` reaches `knows_of`
|
||||
- Monologue triggers Phase 3 recognition: "That's the third time."
|
||||
|
||||
**Required KG facts at transition point:**
|
||||
|
||||
| Fact ID | Min Confidence | Role in Transition |
|
||||
|---------|---------------|-------------------|
|
||||
| `behavioral.sera_avoidance_pattern` | `knows_of` | Pattern is confirmed, not suspected |
|
||||
| `behavioral.sera_topic_deflection` | `suspects` | Sera has deflected at least one sensitive topic |
|
||||
| `investigation.sera_evidence_held` | `suspects` | Detective senses Sera knows something she hasn't shared |
|
||||
|
||||
**Entity state required:**
|
||||
- Sera RelationshipState to detective: `Friendly` → `PersonOfInterest`
|
||||
- `peer`-tier Sera content remains available (it doesn't vanish), but `authority`-tier content unlocks alongside it
|
||||
- The player can choose which register to use — and the choice has consequences (D-064 walk-away logic applies: if detective initiates authority-tier inquiry and then drops it, the KG logs the incompleteness)
|
||||
|
||||
**Content requirement:**
|
||||
The `authority`-tier Sera dialogue should feel qualitatively different from authority-tier dialogue with Voss or Maret. Voss authority lines are evasive, procedural. Sera authority lines are emotionally charged — she knows the detective knows, and she's working to contain that. Her `authority, trust: surface` lines are careful, calibrated. Her `authority, trust: real` lines (if unlocked) are the closest she gets to disclosure: "Some things aren't mine to report. You know how it is." This is the line that changes everything.
|
||||
|
||||
**Reversibility:** Conditional. If the detective chooses not to press (avoids authority-tier options with Sera across 2+ subsequent interactions), Sera's RelationshipState may re-stabilize at `Friendly`. But `investigation.sera_evidence_held` remains in the KG at `suspects` — the detective knows something is wrong, even if the relationship surface normalizes.
|
||||
|
||||
---
|
||||
|
||||
## Social Site 3: Maintenance Corridors (Smuggling Spaces)
|
||||
|
||||
### Smuggler at Maintenance Corridors
|
||||
|
||||
**Starting state:** `insider` with all ring members (Kael, Nils, Renn); this is the ring's operational space. The smuggler knows the layout, the camera gaps, the timing windows.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 1-S-M: `insider → hostile` (corridor operations suspended; smuggler shut out)
|
||||
|
||||
**Direction:** Downward.
|
||||
|
||||
**Narrative context:** If ring crisis reaches operational shutdown level (investigation too hot, Kael situation destabilizing the ring's trust structure), Nils may suspend corridor operations entirely or change the access protocol. The smuggler's knowledge of the old layout becomes liability — they know where the blind spots are, but those blind spots may have been deliberately exposed to flush out threats. The smuggler navigating the corridors under these conditions is walking into a trap.
|
||||
|
||||
**Required KG facts at transition point:**
|
||||
|
||||
| Fact ID | Min Confidence | Role in Transition |
|
||||
|---------|---------------|-------------------|
|
||||
| `awareness.ring_tension_escalation` | `knows_of` | Operations are suspended or restructuring |
|
||||
| `awareness.surveillance_change` | `suspects` | The surveillance pattern has changed |
|
||||
| `investigation.kael_ring_membership` | `knows_details` | Kael's exit attempt is now broadly known inside the ring |
|
||||
|
||||
**Reversibility:** No. If the ring has suspended the smuggler's access, that's a terminal state for their ring membership in v0.1.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 2-S-M: `insider → isolated` (Kael not present; smuggler has operational access but no coordination)
|
||||
|
||||
**Direction:** Partial downward. Technical access to the corridors remains, but social coordination disappears.
|
||||
|
||||
**Narrative context:** If Kael is the smuggler's primary coordination contact in the corridors and Kael has shifted to `PersonOfInterest` (Phase 3-4 of THE FRIEND arc), the smuggler navigates the corridors without their usual partner. They have access. They don't have backup. Monologue in this state should reflect operational vulnerability without dialogue partner.
|
||||
|
||||
**Required KG facts at transition point:**
|
||||
|
||||
| Fact ID | Min Confidence | Role in Transition |
|
||||
|---------|---------------|-------------------|
|
||||
| `investigation.kael_corridor_meeting` | `knows_of` | Smuggler has discovered Kael's unauthorized contact |
|
||||
|
||||
**Entity state required:**
|
||||
- Kael RelationshipState to smuggler: `PersonOfInterest`
|
||||
|
||||
**Content requirement:**
|
||||
No `insider` Kael dialogue in corridors post-transition. Instead: monologue lines triggered by locations where Kael would normally have been present. The absence of a colleague, not a confrontation.
|
||||
|
||||
**Reversibility:** Yes, if THE FRIEND arc resolves toward reconciliation.
|
||||
|
||||
---
|
||||
|
||||
### Detective at Maintenance Corridors
|
||||
|
||||
**Starting state:** `public`; the corridors are officially restricted (`location.corridor_b7_restricted` is `knows_of`), but the detective has institutional basis to enter with credentials or cause.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 1-D-M: `public → peer` (legitimate investigative access established)
|
||||
|
||||
**Direction:** Upward.
|
||||
|
||||
**Narrative context:** The detective earns corridor access not through breaking in but through institutional process — flagging the surveillance gaps, getting Maret's cooperation, or invoking Commission authority to access restricted zones. Once inside legitimately, NPCs who are present (maintenance workers, off-duty dock workers moving through) treat the detective as a known investigator rather than a suspicious intruder.
|
||||
|
||||
**Required KG facts at transition point:**
|
||||
|
||||
| Fact ID | Min Confidence | Role in Transition |
|
||||
|---------|---------------|-------------------|
|
||||
| `location.corridor_b7_restricted` | `knows_of` | Detective knows the official access structure |
|
||||
| `investigation.surveillance_gaps` | `knows_of` | Detective has identified the pattern — not just noticed one gap |
|
||||
| `investigation.oversight_gap_pattern` | `suspects` | Investigation gives the detective standing to be in the corridors |
|
||||
|
||||
**Reversibility:** Yes, conditional on investigation standing.
|
||||
|
||||
---
|
||||
|
||||
#### Transition 2-D-M: `public → hostile` (trespassing observed; ring response)
|
||||
|
||||
**Direction:** Downward. The most immediate downward transition in the entire tier system — ring operatives in the corridors are not subtle.
|
||||
|
||||
**Narrative context:** If the detective enters the corridors without establishing legitimate access, and a ring operative (Renn is the most likely; Nils if the drop is tonight) observes the intrusion, the ring defensive response is immediate. They don't confront the detective physically in v0.1 — they evacuate, alert, and begin managing their exposure. The detective has triggered ring paranoia, which both accelerates the investigation (the ring is now visible through its defensive behavior) and destroys any chance of observation before the ring goes dark.
|
||||
|
||||
**Required KG facts at trigger point:**
|
||||
|
||||
| Fact ID | Min Confidence | Role |
|
||||
|---------|---------------|------|
|
||||
| `location.maintenance_corridors_access` | `suspects` (detective) | Detective knows approximately where the corridors are |
|
||||
| `contraband.drop_tonight` | `suspects` (smuggler/ring) | If a drop is scheduled, ring presence in corridors is high |
|
||||
|
||||
**The observation paradox:** The most investigatively valuable time to enter the corridors is when a drop is scheduled (`contraband.drop_tonight` at `knows_details` for the smuggler). The most dangerous time is the same. Content for this transition should reflect that the detective's discovery is genuinely useful (they may observe the drop in progress, gain `investigation.smuggling_route` at `knows_of`) even as it triggers hostile ring response.
|
||||
|
||||
**Reversibility:** None within v0.1. The ring will not forget an investigator in the corridors.
|
||||
|
||||
---
|
||||
|
||||
## Reversibility Summary
|
||||
|
||||
| Transition | Reversible? | Reversal Condition |
|
||||
|-----------|------------|-------------------|
|
||||
| 1-S-T: `insider → hostile` (ring burns smuggler) | No | Ring trust requires full departure from investigation pressure — out of scope v0.1 |
|
||||
| 2-S-T: `insider → peer` (ring caution mode) | Yes | `awareness.ring_tension_escalation` falls below `suspects`; ring stabilizes |
|
||||
| 3-S-T: `peer → hostile` (legitimate colleagues react) | Moderate | Smuggler demonstrates non-core role; social repair over time |
|
||||
| 1-D-T: `authority → peer` (collaboration at Terminal) | Yes, fragile | Detective re-invokes authority leverage; trust reverts |
|
||||
| 2-D-T: `authority → hostile` (confrontation fails) | Moderate | Retrospective evidence justifies the confrontation; community accepts it |
|
||||
| 1-S-B: `public → insider` (Kael introduces smuggler at bar) | Yes | Requires sustained bar attendance; decays if absent |
|
||||
| 2-S-B: `insider → hostile` (social contamination from ring) | Hard | Requires ring crisis to resolve first |
|
||||
| 3-S-B: `insider → hostile` (overheard contraband talk) | None | Fact knowledge is permanent in detective's KG |
|
||||
| 1-D-B: `public → peer` via Sera (bar integration) | Yes | Depends on Sera RelationshipState; breaks if Sera moves hostile |
|
||||
| 2-D-B: `authority → peer` (buy-rounds path) | Yes | Detective reinvokes authority; trust reverts |
|
||||
| 3-D-B: `peer → authority` (Sera arc activates) | Conditional | Detective avoids pressing; surface normalizes, but KG suspicion persists |
|
||||
| 1-S-M: `insider → hostile` (corridors suspended) | No | Terminal state for ring membership |
|
||||
| 2-S-M: `insider → isolated` (Kael absent) | Yes | Kael arc resolves toward reconciliation |
|
||||
| 1-D-M: `public → peer` (investigative access) | Yes | Investigation standing maintained |
|
||||
| 2-D-M: `public → hostile` (trespassing) | None | Ring defensive response is permanent |
|
||||
|
||||
---
|
||||
|
||||
## Content Authoring Implications
|
||||
|
||||
### Rule: Every social site needs three pools per character
|
||||
|
||||
For each of the three social sites, content authors must produce:
|
||||
|
||||
1. **Starting-state pool** — the baseline access tier, representing the first hour of play. Heavy on `public` and `peer` for the detective; heavy on `insider` and `peer` for the smuggler. This is the content that makes the world feel normal.
|
||||
|
||||
2. **Shifted-state pool** — dialogue for the 1-2 most likely tier transition per character per site. The hostile-tier ring dialogue. The peer-tier bar content after Sera's introduction. These pools are smaller but carry heavier narrative weight.
|
||||
|
||||
3. **Monologue tracking pool** — internal voice lines that run parallel to access tier changes. The smuggler noticing that Voss didn't nod. The detective noticing that bar regulars are warmer. Monologue is the only system that communicates access tier shift to the player (per D-062 — no UI signals, no notifications).
|
||||
|
||||
### The hostile-tier authoring challenge
|
||||
|
||||
`hostile`-tier dialogue is the hardest to write. The temptation is to write it as confrontational, explicit. But most hostile-tier dialogue in this setting is *bureaucratic hostility* — people performing cooperation while providing nothing. Maret gives the detective technically accurate answers that advance nothing. Voss gives the smuggler shift updates that contain no ring coordination. Lera pours drinks without warmth.
|
||||
|
||||
The exception: confrontation-specific lines (D-063). These are the lines written in the character's internal voice, italicized, first-person. *"I saw you in corridor B-7."* These require their own pool: `access: [hostile], trust: real, situation: [confrontation]`.
|
||||
|
||||
### The transition-moment authoring challenge
|
||||
|
||||
There is a brief, critical window around tier transitions where monologue should surface what the system cannot say. When Kael's `insider` content locks out, the first post-transition observation of Kael should trigger a monologue line that acknowledges the absence without naming the mechanism. The player shouldn't think "I've lost insider access to Kael." They should think "something is different."
|
||||
|
||||
Suggested approach: author a `post_conversation` monologue line for each major downward transition that fires once on the first post-transition interaction. These are `priority: 9` lines (high priority, likely to be selected) that serve as narrative transition markers.
|
||||
|
||||
---
|
||||
|
||||
## Implementation Notes for #169 (S15 Dependency)
|
||||
|
||||
This document feeds the Layer 1 access tier filtering implementation (deferred to Sprint 15). The following architectural notes are for Dudley/Tyre when implementing:
|
||||
|
||||
1. **The ring-caution suppression** (Transition 2-S-T) requires a runtime flag — not a RelationshipState change, but a content-tag suppression. The proposed mechanism: a `ring_caution_active` boolean in the simulation state that the line selection system checks before returning `insider, tags: [ring-coordination]` lines. FactId gate: `awareness.ring_tension_escalation` at `knows_of`.
|
||||
|
||||
2. **The buy-rounds interaction** (Transition 2-D-B) requires a non-dialogue interaction verb that registers social goodwill. The v0.1 interaction verb set (D-interaction-verbs) should include "buy drinks" as a social investment action. Simulation should apply a small positive relationship_state weight to all `Known`+ NPCs in Voice range.
|
||||
|
||||
3. **The `authority`-to-`peer` coexistence** (Transitions 1-D-T, 1-D-B, 2-D-B) is an important design point: these are not mutually exclusive tiers. When a detective NPC relationship reaches `Friendly`, both `authority` and `peer` content should be available. The selection system should prefer `peer` in casual contexts and `authority` when the player selects investigative dialogue options. The selection algorithm needs a context signal for this (conversation-type flag, or topic tag check).
|
||||
|
||||
4. **The overheard-conversation hostile trigger** (Transition 3-S-B) is the only tier shift triggered by the player's presence in Voice range rather than by direct interaction. This requires the D-018 three-range sound model implementation to cross-reference the player's current relationship states with nearby NPCs. If the player is in Voice range of ring-coordination NPC dialogue and the NPC is in `PersonOfInterest`-or-better relationship with an observer also in range, the observer's KG should be updated.
|
||||
|
||||
---
|
||||
|
||||
*Document current as of 2026-02-20. All FactIds sourced from `docs/design/knowledge-vocabulary-v01.md` (#368). Implementation dependency: #169 (S15). Content dependency: #120 (line pool files), #121 (voice variation guide).*
|
||||
@@ -0,0 +1,554 @@
|
||||
# Monologue Content Architecture
|
||||
|
||||
**Ticket:** #253
|
||||
**Authors:** Mellanie (primary), Paula (narrative review), Gestalt (KG validation)
|
||||
**Date:** 2026-02-20
|
||||
**Status:** Draft v1.0
|
||||
**Decisions:** D-016, D-032, D-034, D-035, D-041
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
This document is the authoring contract for all internal monologue content in The Settled Reach. It defines:
|
||||
|
||||
- The interpretive frame each character applies to the same world
|
||||
- The five monologue categories and what each does
|
||||
- Which triggers map to which categories (and why)
|
||||
- Volume targets for v0.1 by trigger type and location
|
||||
- The prerequisite map system and how it gates lines from KG state
|
||||
|
||||
Every monologue line authored for this game — past, present, and future — should be writable against this spec without ambiguity. If the spec doesn't cover a case, that's a gap to resolve here before writing lines.
|
||||
|
||||
**Cross-references:**
|
||||
- [Voice Patterns](voice-patterns.md) — sentence-level execution (contractions, punctuation, sentence length)
|
||||
- [Dual Lens Authoring Guide](dual-lens-authoring-guide.md) — high-level character perspective framework
|
||||
- [Knowledge Vocabulary v0.1](knowledge-vocabulary-v01.md) — all prerequisite formats and fact IDs
|
||||
- D-016: the four functions of internal monologue
|
||||
- D-032: hard partition between character pools
|
||||
- D-035: tag taxonomy including monologue-specific additions
|
||||
|
||||
---
|
||||
|
||||
## 1. Identity-Driven Interpretation Frame
|
||||
|
||||
The same event produces different monologue because the characters are different people, not because the system routes differently. The engine fires a `witness_interaction` trigger for both characters when they see Voss and Maret arguing. What they think about it depends on who they are.
|
||||
|
||||
This section defines the interpretive lens for each character. Every line should be writable from this frame. If you can't explain why this character would think this, in these terms, the line is wrong.
|
||||
|
||||
### 1.1 The Smuggler
|
||||
|
||||
**What she cares about:**
|
||||
- Kael's loyalty and safety (he's the person she trusts most in the ring)
|
||||
- The ring's operational security — routes, timing, who knows what
|
||||
- The moral dimension: this is access, not weapons; she needs to believe it matters
|
||||
- Naia's wellbeing (Kael's partner, the emotional stake beneath everything)
|
||||
|
||||
**What she fears:**
|
||||
- Exposure — for herself, for Kael, for anyone she pulled into this
|
||||
- Kael pulling away, changing, hiding something she can't protect him from
|
||||
- The Commission finding the routes before she can clear the slate
|
||||
- Her own judgment being wrong — that she's put good people in danger
|
||||
|
||||
**What she feels responsible for:**
|
||||
- Every member of the ring she enabled or included
|
||||
- Kael, specifically — his involvement is partly her
|
||||
- The shipments and what they're used for; she has opinions about every cargo type
|
||||
|
||||
**The interpretive consequence:** The smuggler reads every situation for operational risk and personal loyalty. A sealed bay isn't interesting infrastructure — it's a threat vector or a cover. Torek pacing isn't distressing behavior — it's someone who might talk. Kael eating alone isn't a social signal — it's a break in a pattern she memorized for exactly this kind of moment.
|
||||
|
||||
**What the smuggler doesn't notice:** systemic patterns, documentation trails, jurisdictional implications, institutional relationships. She notices people, not processes.
|
||||
|
||||
---
|
||||
|
||||
### 1.2 The Detective
|
||||
|
||||
**What he cares about:**
|
||||
- Institutional duty — the case, the evidence, the commission mandate
|
||||
- Procedural integrity — how evidence is gathered matters, not just what it says
|
||||
- Sera's reliability as a social anchor (the one person in the district who speaks his language)
|
||||
- Getting to the actual truth, not just a closable case
|
||||
|
||||
**What he fears:**
|
||||
- Personal cost compromising the case — particularly the Sera question (D-034)
|
||||
- Being wrong about a core assumption after committing to it
|
||||
- Institutional failure: the Commission missing something they should have caught
|
||||
- Losing objectivity; his analytical frame is protective, and he knows it
|
||||
|
||||
**What he feels responsible for:**
|
||||
- The investigation — what he sees, what he files, what he flags
|
||||
- Not contaminating the case with personal relationships
|
||||
- Doing the duty correctly even when the correct action is uncomfortable
|
||||
|
||||
**The interpretive consequence:** The detective reads every situation for evidentiary value and behavioral deviation from established baseline. The same sealed bay is a documentation anomaly, not a personal threat. Kael eating alone is a deviation from observed routine. Voss pacing is an elevated behavioral indicator. He files, he notes, he compares to baseline.
|
||||
|
||||
**What the detective doesn't notice:** interpersonal warmth (at baseline), intuitive risk, the moral weight of what the ring is doing. He notices patterns, not people — until Sera makes him notice a person, which is its own problem.
|
||||
|
||||
---
|
||||
|
||||
### 1.3 The Dual-Lens Test
|
||||
|
||||
Before writing any line, ask: **could this line belong to either character?** If yes, it's not specific enough.
|
||||
|
||||
| Same event | Smuggler | Detective |
|
||||
|------------|----------|-----------|
|
||||
| Voss changes the rotation | "Voss changed the rotation again. Third time this month. Covering something." | "Davan's rotation has shifted three times in thirty days. Pattern or coincidence?" |
|
||||
| Kael eats alone | "Kael's eating alone today. He always eats with me." | "Davan, K. — not with his usual group. Worth monitoring." |
|
||||
| Loading arm grinds | "Loading arm three is grinding again. Someone should file that." | "Loading arm three has a grind in its cycle. Maintenance deferred — budget, or negligence?" |
|
||||
| Bay 4 sealed | "Bay three's been sealed off. Inspection, or something else?" | "Containers stacked to regulation height in most bays. Bay four is the exception." |
|
||||
|
||||
The smuggler makes it personal. The detective files it analytically. They're both right. Neither has the full picture.
|
||||
|
||||
---
|
||||
|
||||
## 2. Monologue Categories
|
||||
|
||||
D-016 defines four functions for internal monologue. This spec extends those into five authoring categories, each with distinct content goals, trigger affinities, and voice requirements.
|
||||
|
||||
### 2.1 Perception
|
||||
|
||||
**D-016 function:** Translating non-visual senses — things the camera can't show.
|
||||
|
||||
**What it does:** Converts audio/haptic/olfactory events into the character's voice. The player hears footsteps at the fog edge; the monologue tells them what that means to this character.
|
||||
|
||||
**Primary trigger:** `hear_sound`
|
||||
**Secondary trigger:** `enter_location` (smell, air quality, ambient temperature on arrival)
|
||||
|
||||
**Key rule:** Perception lines interpret *what the character senses*, not what they conclude. Conclusion is Investigation. *"Footsteps behind me. Two people, unhurried."* is Perception. *"That's not the usual patrol pattern."* is Investigation.
|
||||
|
||||
**Smuggler examples:**
|
||||
- *"Footsteps behind me. Light. Someone I know."*
|
||||
- *"Cargo lubricant and recycled air. Home sweet home."*
|
||||
- *"The conveyor hums at a different pitch when it's loaded heavy. This one's heavy."*
|
||||
|
||||
**Detective examples:**
|
||||
- *"Loading arm three has a grind in its cycle. Maintenance deferred."*
|
||||
- *"Something in the air beyond the lubricant. Chemical, faint. Not standard freight residue."*
|
||||
- *"Footsteps in the service corridor. Measured pace — not trying to be quiet."*
|
||||
|
||||
---
|
||||
|
||||
### 2.2 Atmosphere
|
||||
|
||||
**D-016 function:** Character's running commentary on environment, mood, situation.
|
||||
|
||||
**What it does:** Establishes location identity, time of day, and the character's emotional register at that moment. These are the "color" lines — they don't advance investigation but they make the world feel inhabited.
|
||||
|
||||
**Primary triggers:** `enter_location`, `time_idle`, `return_visit`
|
||||
**Secondary triggers:** `witness_interaction` (when the atmosphere is the point, not the content)
|
||||
|
||||
**Key rule:** Atmosphere lines are mostly unconditional — they fire regardless of what the player knows. They establish the baseline feel of a location. A location without atmosphere lines feels hollow.
|
||||
|
||||
**Smuggler examples:**
|
||||
- *"Morning shift. Recycled air and cargo lubricant. Home sweet home."*
|
||||
- *"The freight bay looks better in the dark."*
|
||||
- *"Quiet morning. Containers moving, nobody talking. I like it this way."*
|
||||
|
||||
**Detective examples:**
|
||||
- *"Logistics hub. Standard prefab, heavy foot traffic. Let's see what the shift change tells me."*
|
||||
- *"Only place in the district that doesn't smell like freight lubricant."* [The Last Shift]
|
||||
- *"Back at the hub. Different shift, different faces. Same manifest board."*
|
||||
|
||||
---
|
||||
|
||||
### 2.3 Tutorial
|
||||
|
||||
**D-016 function:** Diegetic hints — character thinks about what they might do. No UI popups.
|
||||
|
||||
**What it does:** Teaches mechanics and interactables through the character's voice. The character thinks *"That terminal might have access logs"* and the player learns that terminals are interactable. Everything the tutorial needs to convey, the character can plausibly think.
|
||||
|
||||
**Primary triggers:** `discover_evidence`, `enter_location` (first visit to a new space)
|
||||
**Secondary triggers:** `observe_anomaly` (anomaly prompts consideration of action)
|
||||
|
||||
**Key rule:** Tutorial lines are almost always unconditional. They fire on first encounter, not on investigation depth. A player who already knows what a terminal does doesn't need the tutorial line again — the engine manages repetition via the cooldown system, but the content itself shouldn't gate on knowledge.
|
||||
|
||||
**Smuggler examples:**
|
||||
- *"Manifest board updates live. Container movement, weight, destination. Easy to check if you know what you're looking for."*
|
||||
- *"The terminal's accessible from here. Useful."*
|
||||
- *"That container's been in temp storage since yesterday. Someone put it there on purpose."*
|
||||
|
||||
**Detective examples:**
|
||||
- *"Commission terminal access. That'll have import logs, weight discrepancies, anything flagged in the last thirty days."*
|
||||
- *"The manifest board updates in real-time. Container movement, weight, destination. All logged."*
|
||||
- *"Locked bay. Inspection record will show who authorized it."*
|
||||
|
||||
**Cross-character rule:** Tutorial lines don't reference character-specific knowledge or relationships. They explain the world, not the case. If you find yourself writing a tutorial line that only one character would think, it's probably Investigation wearing a tutorial hat.
|
||||
|
||||
---
|
||||
|
||||
### 2.4 Observation
|
||||
|
||||
**D-016 function:** Character-specific commentary on NPCs — who they see, what they notice.
|
||||
|
||||
**What it does:** Produces NPC-specific monologue that reflects the character's relationship to that NPC and their current emotional register. This is where character voice does the most work — the same NPC looks completely different from each character's perspective.
|
||||
|
||||
**Primary triggers:** `observe_npc`, `witness_interaction`
|
||||
**Secondary triggers:** `post_conversation` (observations from conversation, not Investigation conclusions)
|
||||
|
||||
**Key rule:** Observation lines read *what the character sees*. The emotional color comes from the relationship. A friendly NPC gets warm observation. A person_of_interest gets wary observation. A hostile NPC gets guarded observation.
|
||||
|
||||
**Smuggler examples (Kael, progressive):**
|
||||
- Friendly baseline: *"Kael's already at the dock. Good. The day's better when he's on shift."*
|
||||
- Early concern: *"Kael's distracted today. Probably nothing."*
|
||||
- Person of interest: *"Kael nodded at me across the bay. Same as always. Exactly the same as always."*
|
||||
|
||||
**Detective examples (Sera, progressive):**
|
||||
- Friendly baseline: *"Venn, S. — already at the bar. At least someone speaks my language here."*
|
||||
- Early concern: *"Sera's avoiding the corner near the window. She's usually over there."*
|
||||
- Person of interest: *"Sera ordered the usual. Didn't look at me when I came in. That's new."*
|
||||
|
||||
**Named NPC coverage requirement:** Every named NPC in a location needs at least 3 Observation lines per character who could plausibly observe them there, across the relationship arc (baseline, early concern, person_of_interest). FRIEND NPCs need 8-10.
|
||||
|
||||
---
|
||||
|
||||
### 2.5 Investigation
|
||||
|
||||
**What it does:** The character builds a mental case — connecting dots, forming hypotheses, processing what they've just learned. This is where the internal monologue becomes an unreliable narrator (D-016): the character reaches a conclusion that may be wrong.
|
||||
|
||||
**Primary triggers:** `post_conversation`, `discover_evidence`, `observe_anomaly`
|
||||
**Secondary triggers:** `time_idle` (ruminative investigation — sitting with unresolved questions), `witness_interaction` (when the content of the interaction matters, not just the fact of it)
|
||||
|
||||
**Key rule:** Investigation lines are almost always prerequisite-gated. The character can't investigate what they don't know. A smuggler without knowledge of Kael's corridor meeting can't ruminate about it. The prerequisite map (Section 5) is how we gate these.
|
||||
|
||||
**Smuggler examples (knowledge-gated):**
|
||||
- `suspects(investigation.kael_corridor_meeting)`: *"Kael was in corridor B-7 last night. Off-shift. Off-route. That's not nothing."*
|
||||
- `suspects(investigation.kael_unknown_contact)`: *"Who was Kael talking to? Not anyone from our rotation. I'd know the face."*
|
||||
- `direct(behavioral.kael_evasion)`: *"He looked left before answering. He always looks left when he's lying."*
|
||||
|
||||
**Detective examples (knowledge-gated):**
|
||||
- `knows_of(investigation.kael_corridor_meeting)`: *"Davan, K. — Corridor B-7, off-shift. Unregistered contact. Not a coincidence."*
|
||||
- `suspects(behavioral.sera_avoidance)`: *"She moved away from Lintar, T. immediately. Pre-existing avoidance pattern, or recent?"*
|
||||
- `knows_details(investigation.manifest_discrepancy)`: *"Container 4471. Wrong weight class, wrong routing, wrong time of day. Three deviations. That's data."*
|
||||
|
||||
**The unreliable narrator rule:** Investigation lines can be wrong. The smuggler might conclude Voss is covering for himself when Voss is covering for someone else. The detective might file an observation as coincidence that isn't. The engine doesn't correct them. The monologue is character interpretation, not game truth.
|
||||
|
||||
---
|
||||
|
||||
## 3. Trigger → Category Mapping
|
||||
|
||||
One trigger can source multiple categories. The category is determined by what the line *does*, not which trigger fires it.
|
||||
|
||||
| Trigger | Primary Category | Secondary Category | Notes |
|
||||
|---------|-----------------|-------------------|-------|
|
||||
| `enter_location` | Atmosphere | Tutorial | First visit: tutorial. Return: atmosphere only. |
|
||||
| `observe_npc` | Observation | Investigation | Post-discovery, Observation lines gain Investigation coloring. |
|
||||
| `hear_sound` | Perception | Observation | If the sound is an identifiable NPC (recognized voice, steps), it's also Observation. |
|
||||
| `observe_anomaly` | Observation | Investigation | Anomaly = deviation from known baseline → triggers Investigation query. Requires some prior knowledge. |
|
||||
| `post_conversation` | Investigation | Observation | Processes what just happened. Reflection before action. |
|
||||
| `discover_evidence` | Tutorial | Investigation | Tutorial for new interactable types. Investigation for case-relevant content. |
|
||||
| `witness_interaction` | Observation | Investigation | Named pair interacting = Observation. Named pair + player knows one has a secret = Investigation. |
|
||||
| `time_idle` | Atmosphere | Investigation | Short idle: ambient atmosphere. Long idle: ruminative Investigation if knowledge gates open. |
|
||||
| `return_visit` | Atmosphere | Observation | "Something's different" — comparison to last visit. Observation of change. |
|
||||
|
||||
**Not 1:1:** A single `observe_anomaly` trigger can fire either an Observation line ("Torek's spending too much at Lera's. Someone's going to notice.") or an Investigation line ("Torek's spending too much at Lera's. Someone's going to notice." with a prerequisite linking it to ring finance). The difference is whether the line requires knowledge state to fire.
|
||||
|
||||
---
|
||||
|
||||
## 4. Volume Targets for v0.1
|
||||
|
||||
All volumes are per-character (D-032 hard partition). These are minimum targets for v0.1, not caps.
|
||||
|
||||
### 4.1 Per Trigger Per Location
|
||||
|
||||
| Trigger | Min lines per location per character | Notes |
|
||||
|---------|--------------------------------------|-------|
|
||||
| `enter_location` | 5 | 3 unconditional, 2 knowledge-gated. Mix atmosphere/tutorial. |
|
||||
| `time_idle` | 4 | 2 unconditional (ambient), 2 knowledge-gated (investigation). |
|
||||
| `observe_npc` | 3 per named NPC present | Named NPCs only. Generic NPCs get 1 line ("New face at dock seven."). FRIEND NPCs: 8-10. |
|
||||
| `hear_sound` | 3 | 2 environmental, 1 NPC-identifying (conditionally). |
|
||||
| `observe_anomaly` | 4 | 2 unconditional (structural anomalies), 2 knowledge-gated (behavioral). |
|
||||
| `witness_interaction` | 3 per named pair | Named pairs (Voss+Maret, Kael+unknown). Generic: 1. |
|
||||
| `post_conversation` | 3 per named NPC | After each major NPC, across arc phases. |
|
||||
| `discover_evidence` | 2 per evidence type | Tutorial + 1 investigation variant. |
|
||||
| `return_visit` | 3 | 1 baseline, 2 knowledge-gated comparisons. |
|
||||
|
||||
### 4.2 Sprint 14 Minimum Deliverable (#120)
|
||||
|
||||
For Sprint 14, the minimum deliverable covers `enter_location` and `time_idle` across eight locations, two characters:
|
||||
|
||||
| Location | Characters | `enter_location` | `time_idle` | Total lines |
|
||||
|----------|-----------|------------------|-------------|-------------|
|
||||
| The Terminal (hub) | Smuggler + Detective | 5+5 | 4+4 | 18 |
|
||||
| The Last Shift (bar) | Smuggler + Detective | 5+5 | 4+4 | 18 |
|
||||
| Maintenance Corridor A | Smuggler + Detective | 5+5 | 4+4 | 18 |
|
||||
| Maintenance Corridor B | Smuggler + Detective | 5+5 | 4+4 | 18 |
|
||||
| Smuggling Hold | Smuggler only | 5 | 4 | 9 |
|
||||
| Commission Kiosk | Detective only | 5 | 4 | 9 |
|
||||
| Transit Passage | Smuggler + Detective | 3+3 | 2+2 | 10 |
|
||||
| Span Gate Approach | Smuggler + Detective | 3+3 | 2+2 | 10 |
|
||||
|
||||
**Sprint 14 minimum total: ~110 lines.** Full v0.1 (all triggers, all named NPCs) projects to ~320-380 lines across both characters.
|
||||
|
||||
### 4.3 FRIEND NPC Volume
|
||||
|
||||
FRIEND NPCs (Kael Davan for smuggler, Sera Venn for detective) require expanded coverage because they carry D-034's arc across multiple phases. These do not use generation expansion (D-034: "no generation expansion" applies here).
|
||||
|
||||
| Trigger | Kael (smuggler) | Sera (detective) | Notes |
|
||||
|---------|-----------------|-----------------|-------|
|
||||
| `observe_npc` | 10 | 10 | Across 3 relationship phases: friendly / early concern / poi |
|
||||
| `post_conversation` | 8 | 8 | After major arc beats: warmth / evasion / confrontation |
|
||||
| `observe_anomaly` | 6 | 6 | Behavioral tells, pattern deviations |
|
||||
| `witness_interaction` | 4 | 4 | Named pair with FRIEND |
|
||||
| `time_idle` | 4 | 4 | Ruminative Investigation about FRIEND |
|
||||
|
||||
**FRIEND total per character: ~32 lines.** All gated except 3-4 baseline warmth lines.
|
||||
|
||||
---
|
||||
|
||||
## 5. Prerequisite Map Design
|
||||
|
||||
Monologue prerequisites gate lines on knowledge state. The `prerequisite` field (D-035) accepts three gate types: `relationship`, `entity_attributes`, and `facts`. These reflect what's queryable from the KG (D-041).
|
||||
|
||||
All prerequisite formats are defined in full in [Knowledge Vocabulary v0.1](knowledge-vocabulary-v01.md). This section covers the *design logic* — which gate type to use when, and example mappings for common cases.
|
||||
|
||||
### 5.1 Gate Types
|
||||
|
||||
**Relationship gates** — use when the line's emotional register depends on the character's relationship to a specific NPC.
|
||||
|
||||
```yaml
|
||||
prerequisites:
|
||||
relationship:
|
||||
target: npc:kael-davan
|
||||
state: friendly # unknown | known | friendly | person_of_interest | hostile
|
||||
```
|
||||
|
||||
*Use for:* warmth lines (require `friendly`), suspicion lines (require `person_of_interest`), observation lines that assume prior contact.
|
||||
|
||||
**Entity attribute gates** — use when the line responds to a specific behavioral flag on an NPC.
|
||||
|
||||
```yaml
|
||||
prerequisites:
|
||||
entity_attributes:
|
||||
- entity: npc:kael-davan
|
||||
key: behavior_flags
|
||||
value: avoidance
|
||||
```
|
||||
|
||||
*Use for:* tell-observation lines (requires `tell_observed: true`), avoidance pattern lines, behavioral contradiction lines.
|
||||
|
||||
**Fact gates** — use when the line requires knowledge of a world event or fact, not just a relationship.
|
||||
|
||||
```yaml
|
||||
prerequisites:
|
||||
facts:
|
||||
- fact_id: investigation.kael_corridor_meeting
|
||||
min_confidence: suspects
|
||||
```
|
||||
|
||||
*Use for:* investigation lines that connect dots, operational lines that require ring knowledge, awareness lines about other characters.
|
||||
|
||||
**Compound gates** — AND logic. All conditions must be true. Use sparingly — most lines need one gate type. Compounds are for late-arc lines where relationship depth AND specific knowledge must both be present.
|
||||
|
||||
```yaml
|
||||
prerequisites:
|
||||
relationship:
|
||||
target: npc:kael-davan
|
||||
state: person_of_interest
|
||||
facts:
|
||||
- fact_id: investigation.kael_unknown_contact
|
||||
min_confidence: suspects
|
||||
```
|
||||
|
||||
### 5.2 Common Prerequisite Patterns
|
||||
|
||||
These are recurring patterns across the monologue pools. Write these before the edge cases.
|
||||
|
||||
**Baseline (no prerequisite):**
|
||||
- Arrival atmosphere lines
|
||||
- Generic environmental perception lines
|
||||
- Tutorial lines for interactables
|
||||
- Generic NPC presence lines for unnamed NPCs
|
||||
|
||||
**Ring awareness (smuggler-specific):**
|
||||
```yaml
|
||||
facts:
|
||||
- fact_id: knowledge.ring_routing_knowledge
|
||||
min_confidence: knows_details
|
||||
```
|
||||
*Gates:* lines about specific routes, container timings, next drops.
|
||||
|
||||
**Detective presence (smuggler):**
|
||||
```yaml
|
||||
facts:
|
||||
- fact_id: awareness.detective_presence
|
||||
min_confidence: knows_of
|
||||
```
|
||||
*Gates:* lines about the detective, caution lines when detective is visible.
|
||||
|
||||
**Kael's corridor meeting (both characters, different emotional color):**
|
||||
```yaml
|
||||
facts:
|
||||
- fact_id: investigation.kael_corridor_meeting
|
||||
min_confidence: suspects
|
||||
```
|
||||
*Smuggler:* worry, confusion, loyalty strain.
|
||||
*Detective:* evidentiary interest, pattern notation.
|
||||
|
||||
**Kael's unknown contact:**
|
||||
```yaml
|
||||
facts:
|
||||
- fact_id: investigation.kael_unknown_contact
|
||||
min_confidence: suspects
|
||||
```
|
||||
*Smuggler:* "Not anyone from our rotation."
|
||||
*Detective:* "Unregistered contact. Worth investigating."
|
||||
|
||||
**Kael behavioral tell (post-conversation):**
|
||||
```yaml
|
||||
facts:
|
||||
- fact_id: behavioral.kael_evasion
|
||||
min_confidence: direct
|
||||
```
|
||||
*Gates:* the tell-recognition line ("He looked left before answering"). Requires Direct confidence — player witnessed this themselves.
|
||||
|
||||
**Sera avoidance pattern (detective-specific):**
|
||||
```yaml
|
||||
entity_attributes:
|
||||
- entity: npc:sera-venn
|
||||
key: behavior_flags
|
||||
value: avoidance
|
||||
```
|
||||
*Gates:* detective's observation that Sera is avoiding someone or something.
|
||||
|
||||
**Manifest discrepancy (detective):**
|
||||
```yaml
|
||||
facts:
|
||||
- fact_id: investigation.manifest_discrepancy
|
||||
min_confidence: knows_of
|
||||
```
|
||||
*Gates:* investigative lines connecting container weight anomalies to the ring.
|
||||
|
||||
**FRIEND trust-contamination (both characters, highest priority):**
|
||||
```yaml
|
||||
relationship:
|
||||
target: npc:kael-davan # or npc:sera-venn
|
||||
state: person_of_interest
|
||||
facts:
|
||||
- fact_id: investigation.kael_corridor_meeting # or behavioral.sera_avoidance
|
||||
min_confidence: suspects
|
||||
```
|
||||
*Gates:* the knife-twist lines that mark the moment trust begins to curdle. These are the emotional core of the FRIEND arc.
|
||||
|
||||
### 5.3 Priority Field
|
||||
|
||||
Lines with prerequisites should carry a `priority` field (1-10, default 5). Higher priority wins when multiple eligible lines compete for the same trigger slot.
|
||||
|
||||
**Priority guidelines:**
|
||||
- Unconditional atmosphere: 3-5
|
||||
- Generic NPC observation: 4
|
||||
- Named NPC observation (no prerequisite): 5-6
|
||||
- Knowledge-gated investigation: 6-8
|
||||
- FRIEND arc lines (knowledge-gated): 7-9
|
||||
- FRIEND trust-contamination (highest stakes): 9-10
|
||||
|
||||
The priority system ensures that when the player has uncovered something significant, the monologue fires the most relevant line rather than a generic arrival comment.
|
||||
|
||||
### 5.4 KG Expressibility
|
||||
|
||||
Gestalt validates that all prerequisite conditions in authored content are queryable from the KG. The design constraint: **if the prerequisite references a fact_id or entity attribute, that fact_id must exist in a `content/global/knowledge/*.yaml` file.**
|
||||
|
||||
New prerequisite patterns that reference fact_ids not currently in the vocabulary must be added to the knowledge vocabulary document before the lines using them can be marked complete.
|
||||
|
||||
**Fact categories available for prerequisites:**
|
||||
- `investigation.*` — case facts (corridor meeting, unknown contact, manifest discrepancy)
|
||||
- `knowledge.*` — ring operational facts (routing, cargo types)
|
||||
- `awareness.*` — situational awareness (detective presence, Commission activity)
|
||||
- `behavioral.*` — observed behavioral patterns (kael_evasion, sera_avoidance)
|
||||
- `social.*` — relationship network facts
|
||||
- `contraband.*` — ring membership, cargo specifics
|
||||
- `location.*` — spatial facts (who was where, when)
|
||||
- `progress.*` — narrative progress gates (first conversation with FRIEND, confrontation attempted)
|
||||
|
||||
---
|
||||
|
||||
## 6. Authoring Notes
|
||||
|
||||
### 6.1 Category-to-Tag Mapping
|
||||
|
||||
Monologue lines use freeform `tags` (D-035 selection tag) for filtering and tooling. The category system above maps to tag conventions:
|
||||
|
||||
| Category | Recommended tags |
|
||||
|----------|-----------------|
|
||||
| Perception | `environmental`, `perception`, `sensory` |
|
||||
| Atmosphere | `arrival`, `atmospheric`, `ambient`, `operational` |
|
||||
| Tutorial | `tutorial`, `orientation`, `interactable` |
|
||||
| Observation | `npc`, `[npc-name]`, `tell`, `behavior` |
|
||||
| Investigation | `investigation`, `contraband`, `caution`, `friend-arc`, `contradiction` |
|
||||
|
||||
FRIEND arc lines always include `friend-arc` tag. This enables filtering for arc-coherence review.
|
||||
|
||||
### 6.2 Display Constraints
|
||||
|
||||
All monologue lines display in the z-layer 7 overlay (D-049). Hard constraints from voice patterns spec:
|
||||
|
||||
- **Max characters:** ~160
|
||||
- **Max visual lines:** 2
|
||||
- **Target word count:** 10-25 words (smuggler avg 10, detective avg 13)
|
||||
- **Display time:** 4-6 seconds, length-adjusted
|
||||
- **Must be self-contained:** Each line reads independently; no setup line required
|
||||
|
||||
### 6.3 Review Responsibilities
|
||||
|
||||
| Review gate | Who | What they check |
|
||||
|-------------|-----|----------------|
|
||||
| Voice consistency | Mellanie | Every line matches voice-patterns.md. Contraction test, name test, length targets. |
|
||||
| Narrative coherence | Paula | FRIEND arc lines and `friend-arc` tagged content honor D-034 arc structure. Kael/Sera arcs are internally consistent. |
|
||||
| KG expressibility | Gestalt | All prerequisite fact_ids exist in knowledge vocabulary. Compound gates are achievable from KG state. Priority values are reasonable. |
|
||||
|
||||
Mellanie is final authority on voice. Paula is final authority on arc coherence. Gestalt is final authority on KG expressibility. No line that fails any review is shippable.
|
||||
|
||||
---
|
||||
|
||||
## 7. Open Questions for Sprint 14
|
||||
|
||||
1. **`progress.*` fact IDs** — the `progress` knowledge category covers narrative milestones (first Kael conversation, confrontation attempted). These are needed for some late-arc gating but the fact_ids aren't fully defined yet. **Action:** Gestalt to confirm `progress.*` fact_id format before #120 writes late-arc Investigation lines.
|
||||
|
||||
2. **Span Gate Approach atmosphere** — the span gate approach location is in the Sprint 14 minimum list but no NPC profiles exist there. Atmosphere and Perception lines only; no Observation lines. **Paula's answer (2026-02-20):** No named NPC routines bring characters to the span gate approach in normal play. This is a transitional space — liminal, between home and away. Monologue here should reflect that liminality: the smuggler thinks about what she's leaving behind or returning to; the detective thinks about what the arrival is telling him. The span gate approach is where internal monologue speaks to the gap between worlds, not to specific NPCs. Author 3 unconditional Atmosphere lines per character (arrival version + departure version + idle version), no Observation lines needed.
|
||||
|
||||
3. **`time_idle` cooldown handling** — the engine prevents the same line firing twice within a session. The spec assumes this is handled engine-side. If the cooldown is content-layer (authored `cooldown_ticks` field), the schema needs updating before #120. **Action:** Gestalt to confirm.
|
||||
|
||||
4. **Witness_interaction pair detection** — the trigger fires when two NPCs interact near the player. Does the trigger pass which two NPCs are interacting, so the line pool can filter for `[npc-a, npc-b]` tagged lines? If not, witness_interaction lines can't target specific pairs. **Action:** Dudley/Gestalt to confirm trigger payload before #120 writes witness_interaction lines.
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## 8. Paula — Narrative Review (2026-02-20)
|
||||
|
||||
**Overall assessment:** The architecture is sound and coherent with THE FRIEND arc. All critical design constraints (D-032 hard partition, D-034 no generation expansion, D-016 four functions) are correctly applied. No blocking issues.
|
||||
|
||||
**Specific notes:**
|
||||
|
||||
**1. FRIEND arc prerequisite patterns (Section 5.2) — approved with one clarification:**
|
||||
The `FRIEND trust-contamination` pattern correctly identifies the emotional core lines. One addition: the intermediate phase (Phase 2 — early concern, before contradiction is confirmed) needs its own prerequisite pattern. These are the lines that sit between baseline warmth and the knife-twist — the "probably nothing" lines that retroactively become ominous. Suggested gate:
|
||||
|
||||
```yaml
|
||||
# Phase 2 "early concern" gate — not yet contradiction, but off-baseline
|
||||
facts:
|
||||
- fact_id: behavioral.kael_behavioral_change # or behavioral.sera_topic_deflection
|
||||
min_confidence: suspects
|
||||
# Do NOT add relationship: person_of_interest — that would gate them too late.
|
||||
# These lines must fire while the relationship is still Friendly.
|
||||
```
|
||||
|
||||
These lines are the most valuable in the FRIEND arc — they only land correctly on second playthrough, when the player knows what they missed. Mellanie: please author at least 3 per FRIEND NPC in this intermediate gate range.
|
||||
|
||||
**2. Identity-driven interpretation frame (Section 1.1/1.2) — approved:**
|
||||
The "what she fears" and "what she feels responsible for" axes correctly anchor the FRIEND arc. Kael's betrayal lands as devastating for the smuggler because she feels responsible for his ring involvement. Sera's concealment lands as devastating for the detective because it costs him the one thing that wasn't institutional. The section captures this well.
|
||||
|
||||
**3. Observation line examples (Section 2.4) — minor authoring gap:**
|
||||
The examples for Phase 3 `person_of_interest` observation (`"Kael nodded at me across the bay. Same as always. Exactly the same as always."`) don't show the prerequisite that makes them fire at the right time. In the YAML, these need:
|
||||
```yaml
|
||||
prerequisite:
|
||||
relationship:
|
||||
target: npc:kael-davan
|
||||
state: person_of_interest
|
||||
```
|
||||
Without this gate, they'll fire too early and spoil the contradiction. Not a doc issue — it's an authoring reminder for #120.
|
||||
|
||||
**4. THE FRIEND arc coherence across the two characters:**
|
||||
One verification needed before #120 ships: the FRIEND arc observation lines for the *other* character (smuggler's monologue about Sera, detective's monologue about Kael) need to be internally consistent with what each character would plausibly know. The smuggler sees Sera as Commission presence — her observation lines about Sera should be cautious, not warm. The detective sees Kael as "Davan, K." until late in the arc — his observation lines about Kael should maintain surname-first register throughout, even at `person_of_interest`. The emotional weight is different, not the naming convention.
|
||||
|
||||
**5. Open question #2 answered** — see above in Section 7.
|
||||
|
||||
**Status: Narrative review complete. Document approved for #120 authoring to proceed.**
|
||||
@@ -0,0 +1,458 @@
|
||||
# Monologue Voice Guide: Trait, Background, and Mood Modifiers
|
||||
|
||||
**Ticket:** #121
|
||||
**Authors:** Paula (narrative framing), Mellanie (example lines — see Section notes)
|
||||
**Gestalt:** validate mood → delivery mappings are mechanically coherent
|
||||
**Date:** 2026-02-20
|
||||
**Status:** Draft — narrative framing complete; Mellanie to supply example lines per section
|
||||
|
||||
**Cross-references:**
|
||||
- [Monologue Content Architecture](monologue-content-architecture.md) — the authoring contract this document extends
|
||||
- [Voice Patterns](voice-patterns.md) — sentence-level execution (contractions, punctuation, sentence length)
|
||||
- [Dual Lens Authoring Guide](dual-lens-authoring-guide.md) — Chapter 7 (base voice registers)
|
||||
- D-024: NPC triangle model — PersonalityTraits list (10 axes)
|
||||
- D-035: tag taxonomy — mood enum (8+1 moods)
|
||||
|
||||
---
|
||||
|
||||
## Document Purpose
|
||||
|
||||
This document answers one question: **given that both characters have established voice registers, what happens to those registers when we vary personality traits, character backgrounds, and mood states?**
|
||||
|
||||
The monologue architecture defines *what* characters think about. The voice patterns spec defines *how* they write sentences. This document defines the *inflection layer* — how the same thought sounds different from a Cautious smuggler versus a Bold one, from a character with Guardian background versus Worker background, in an Anxious moment versus a Content one.
|
||||
|
||||
The goal is not separate scripts per trait/background/mood. The goal is a **transformation guide**: a set of rules that let Mellanie take a base line and render it correctly for any combination of modifiers, without writing from scratch.
|
||||
|
||||
---
|
||||
|
||||
## Chapter 1: Base Voice Registers — The Narrative Framing
|
||||
|
||||
The voice-patterns.md spec describes the mechanics of each character's voice. This chapter explains *why* those mechanics exist — the psychological and experiential logic that makes the voice real. Understanding the "why" allows you to make correct decisions when the spec doesn't cover an edge case.
|
||||
|
||||
### 1.1 The Smuggler: Concrete Cognition
|
||||
|
||||
The smuggler's voice is not the result of low intelligence or limited vocabulary. It's the result of two years of professional survival in a context where abstract thinking is dangerous.
|
||||
|
||||
When you're running contraband through a logistics hub, you can't afford to think in categories — you think in specifics. Not "this situation is getting risky" but "Voss changed the rotation and Kael's not answering his lattice." Abstract framing makes patterns invisible. Concrete framing catches the deviation.
|
||||
|
||||
The smuggler's internal voice is trained, not natural. She developed it. It served her. The short sentences and fragments aren't lack of complexity — they're the mental habit of someone who learned to think in real-time decision points. "Kael's late. Wrong. Move." Three thoughts, three beats, three potential action triggers. Abstract cognition is a liability she's edited out.
|
||||
|
||||
**The emotional truth beneath the voice:** She cares about people first. Operations second. Institutions never. The concrete voice maps onto this: she sees people, not systems. She notices Kael is distracted before she notices the manifest is wrong. The world is a network of relationships, and her monologue is live monitoring of that network.
|
||||
|
||||
**What this means for trait and mood modifiers:** When trait or mood modifiers inflect the smuggler's voice, they do so within this framework. A Bold smuggler is still concrete-first — she just acts on partial information faster. An Anxious smuggler is still relational — she just cycles through the network faster, checking and rechecking. The base is immovable. The modifiers inflect it.
|
||||
|
||||
### 1.2 The Detective: Analytical Cognitive Frame
|
||||
|
||||
The detective's voice is institutional training running as an operating system. He was taught to externalise his cognition — to turn observations into filed reports, to name patterns as data, to treat emotional reactions as information to be processed rather than feelings to be felt.
|
||||
|
||||
This is not coldness. It's self-protection. Investigators who let themselves feel first make bad decisions. The detective learned that lesson somewhere — we don't know where, but it's in the bone. The analytical frame is a tool he uses so well he's forgotten it's a tool. Except when Sera makes him forget.
|
||||
|
||||
The longer sentences and complete syntactic structures aren't pretension. They're habits of evidence: a complete sentence has a subject, verb, and object, which means it has an agent, an action, and a consequence. The detective's brain naturally produces complete sentences because incomplete sentences don't file well.
|
||||
|
||||
**The emotional truth beneath the voice:** He cares about doing the work correctly. Not because he's a rule-follower (he'd bend a rule if the evidence demanded it), but because he believes the correct process produces the correct result. When Sera introduces doubt into that belief, the whole framework shudders. His fear isn't being wrong about a fact — it's discovering that correct process produced an unjust outcome, and having no language for what comes next.
|
||||
|
||||
**What this means for trait and mood modifiers:** Detective trait modifiers inflate or compress the analytical frame. A Compassionate detective lets the personal break through the professional more easily. A Ruthless detective turns the analytical frame into a weapon — identifies leverage faster, doesn't dwell on moral weight. Mood modifiers thin or thicken the professional veneer. The base is the analyst. The modifiers determine how much of the person shows through.
|
||||
|
||||
---
|
||||
|
||||
## Chapter 2: Personality Trait Modifiers
|
||||
|
||||
D-024 defines 10 personality traits across 5 opposing pairs. These modify the *delivery* of monologue, not the *content*. The same base line should be writable in any trait version. The trait changes the sentence-level texture: hedging vs. assertion, relational vs. operational framing, question vs. declaration.
|
||||
|
||||
**Authoring note:** Traits come in pairs. An NPC (or player character) has values along the axis — a 3-point scale: Trait A (strong), Trait A (mild), Neutral, Trait B (mild), Trait B (strong). For monologue, we write for the strong expression of each trait. Mild expressions are interpolations that Mellanie can derive.
|
||||
|
||||
---
|
||||
|
||||
### 2.1 Cautious ↔ Bold
|
||||
|
||||
**The axis:** How much information does the character need before acting (or thinking forward to action)?
|
||||
|
||||
**Cautious — transformation logic:**
|
||||
A Cautious character qualifies her observations before she acts on them. She notices things in the same order as a neutral character, but she checks her own conclusions. She hedges internally. She is not less intelligent — she is more aware that she might be wrong.
|
||||
|
||||
- Declarations become conditionals: "That's Kael's route" → "That looks like Kael's route"
|
||||
- Observations become questions: "Something's off" → "Something might be off"
|
||||
- Concern arrives earlier and stays longer (more re-checking)
|
||||
- The voice is slower, more tentative
|
||||
|
||||
**How this inflects each character:**
|
||||
- *Cautious smuggler:* More checking, more revisiting. Sees the same deviation, holds the conclusion longer before committing. Her concern accumulates quietly rather than crystallizing fast. Phrases like "probably," "maybe," "could be" appear more. She doesn't voice suspicion until she's sure — then she's very sure.
|
||||
- *Cautious detective:* Qualifies his filings. "Unusual behavior" becomes "behavior that may deviate from baseline." He is extremely careful about premature conclusions. His analytical questions multiply before resolving. This character is hard to rattle because he expects to be uncertain.
|
||||
|
||||
**Bold — transformation logic:**
|
||||
A Bold character acts on partial information. She names the conclusion before she has the evidence. She's often right — bold cognition built on competence. But she's also capable of committing to a wrong read and holding it too long.
|
||||
|
||||
- Questions become declarations: "Something might be off" → "Something's off"
|
||||
- Hedges disappear: "That looks like Kael's route" → "That's Kael's route"
|
||||
- Concern arrives fast and crystallizes immediately
|
||||
- The voice is faster, more assertive, shorter latency between observation and conclusion
|
||||
|
||||
**How this inflects each character:**
|
||||
- *Bold smuggler:* She names it. Fast. Doesn't wait for confirmation. Her operational thinking has a "move first, verify later" quality. Lines are shorter, more declarative, fewer qualifiers.
|
||||
- *Bold detective:* His analytical sentences become more assertive. Fewer conditionals. He "flags" things as facts before he's confirmed them. This character is easier to manipulate through his own confidence.
|
||||
|
||||
**Mellanie — write 2-3 example rewrite pairs per character (base line → Cautious version, base line → Bold version). Reference the voice anchors from voice-patterns.md Chapter 7 as the base.**
|
||||
|
||||
---
|
||||
|
||||
### 2.2 Honest ↔ Deceptive
|
||||
|
||||
**The axis:** How accurately does the character represent observations — to themselves, in their own internal voice?
|
||||
|
||||
**Honest — transformation logic:**
|
||||
An Honest character's monologue is self-correcting. She catches her own spin and revises it. She doesn't lie to herself to feel better. This makes her monologue have a characteristic pattern: initial reaction, then correction.
|
||||
|
||||
- Self-correction appears: "Kael's fine. — No. He's not fine."
|
||||
- Less motivated reasoning: she acknowledges evidence she doesn't want to see
|
||||
- The voice is slightly more uncomfortable with its own conclusions
|
||||
- She doesn't minimize things that scare her
|
||||
|
||||
**Deceptive — transformation logic:**
|
||||
A Deceptive character's internal voice shows motivated reasoning. She rationalizes what she wants to be true. She notices threatening evidence and then explains it away. This is not dishonest *about others* — it's dishonest with herself.
|
||||
|
||||
- Conclusions favor the preferred reading: "Kael's meeting someone I don't know. Probably work."
|
||||
- Dismissal appears quickly after observation: "Could be nothing. Probably is nothing."
|
||||
- She notices the tell and then chooses not to follow it
|
||||
- The voice has a self-soothing quality, particularly under threat
|
||||
|
||||
**How this inflects each character:**
|
||||
- *Honest smuggler / Honest detective:* Harder on themselves. The self-correction pattern creates vulnerability — they see things they don't want to see and say so.
|
||||
- *Deceptive smuggler / Deceptive detective:* The internal voice becomes unreliable in a new way (D-016 establishes the unreliable narrator function — this makes it more pronounced). They rationalize the FRIEND contradiction longer. The player has to read against the grain.
|
||||
|
||||
**Mellanie — write 2-3 example rewrite pairs: same observation, Honest version vs. Deceptive version.**
|
||||
|
||||
---
|
||||
|
||||
### 2.3 Compassionate ↔ Ruthless
|
||||
|
||||
**The axis:** How much does concern for others' wellbeing inflect the character's internal assessment?
|
||||
|
||||
**Compassionate — transformation logic:**
|
||||
A Compassionate character's first read of a situation is through the lens of what it means for people she cares about. She identifies the person most likely to be hurt before she identifies the operational implication.
|
||||
|
||||
- People-first sequencing: observation of person → emotional assessment → operational conclusion
|
||||
- Concern is named: "Naia looks exhausted. Something's wrong at home."
|
||||
- She personalizes abstract threats: not "ring security is compromised" but "Kael could get caught"
|
||||
- Moral weight is felt quickly and stays present
|
||||
|
||||
**Ruthless — transformation logic:**
|
||||
A Ruthless character assesses utility before empathy. She notices a threat and immediately calculates how to neutralize it, including through people. This is not cruelty — it's a habit of assessment that puts operational outcome first.
|
||||
|
||||
- Utility assessment appears early: "Kael's behavior is risky. If he cracks, he takes the route with him."
|
||||
- Moral weight is noted and set aside: "He might not deserve this. Doesn't matter right now."
|
||||
- People are resources first: "Maret's nervous. That's usable."
|
||||
|
||||
**How this inflects each character:**
|
||||
- *Compassionate smuggler:* Most Naia-and-Kael-focused. Her FRIEND arc lines emphasize relationship cost over operational cost. She confronts Kael later because she keeps hoping he'll explain.
|
||||
- *Ruthless smuggler:* Calculates exposure fast. Cuts contact with Kael earlier once he's flagged. Sees Naia's distress as a data point about Kael's reliability, not as a human problem.
|
||||
- *Compassionate detective:* The Sera question hits harder and sooner. He identifies the personal cost before the institutional obligation.
|
||||
- *Ruthless detective:* Uses Sera's knowledge instrumentally. The friendship is real, but usable.
|
||||
|
||||
**Mellanie — write 2 example rewrite pairs per character: the same FRIEND-arc moment in Compassionate vs. Ruthless voice.**
|
||||
|
||||
---
|
||||
|
||||
### 2.4 Curious ↔ Incurious
|
||||
|
||||
**The axis:** Does the character lean into questions they can't immediately answer, or redirect to what they know?
|
||||
|
||||
**Curious — transformation logic:**
|
||||
A Curious character asks more internal questions, including questions she can't answer. She sits with open threads longer. She generates hypotheses and lets them hang.
|
||||
|
||||
- Questions multiply before resolving: "What was Kael doing there? Who was that? Is the route changing? Is Nils moving the window?"
|
||||
- The voice has more speculative energy — she follows the thread
|
||||
- She notices more at the margins: background details, things that don't connect yet
|
||||
- Open-endedness is comfortable
|
||||
|
||||
**Incurious — transformation logic:**
|
||||
An Incurious character categorizes and moves on. She notices, files, and redirects to the actionable. Open questions without operational payoff are dead weight.
|
||||
|
||||
- Questions resolve fast or don't appear: "That's wrong." Not "Is that wrong? Why?"
|
||||
- The voice is more efficient, less ruminative
|
||||
- She notices less at the margins — processes what's relevant
|
||||
- Ambiguity is uncomfortable; she resolves it one way or another and moves
|
||||
|
||||
**Mellanie — write 1-2 example rewrite pairs: same observation, Curious vs. Incurious voice.**
|
||||
|
||||
---
|
||||
|
||||
### 2.5 Social ↔ Reclusive
|
||||
|
||||
**The axis:** How much does the character define situations through social relationships vs. environmental or operational facts?
|
||||
|
||||
**Social — transformation logic:**
|
||||
A Social character's monologue is populated. She mentions people when she could just mention actions. She frames operations through the network.
|
||||
|
||||
- People are named when not necessary: "The route's clear. Kael cleared it."
|
||||
- She reads absence: "Where's Renn today? He's always here at this hour."
|
||||
- Mood-reads appear: "Voss is different today. Tired, or something else."
|
||||
|
||||
**Reclusive — transformation logic:**
|
||||
A Reclusive character's monologue is depopulated. People appear when they're directly relevant. The environment and operation carry more weight.
|
||||
|
||||
- Operations are mentioned without actors: "Route's clear." Not "Kael cleared the route."
|
||||
- Absence of people is comfortable: she doesn't notice it
|
||||
- The environment gets more attention: she describes the space, the sounds, the texture
|
||||
|
||||
**Mellanie — write 1-2 example rewrite pairs: same moment, Social vs. Reclusive voice.**
|
||||
|
||||
---
|
||||
|
||||
## Chapter 3: Background-Dependent Phrasing
|
||||
|
||||
Character background (selected at game start) shapes three things in monologue: the idioms and references the character uses, the assumptions they make about institutions and authority, and how they frame the moral dimension of what's happening in Sova Transit District.
|
||||
|
||||
Three backgrounds for v0.1:
|
||||
|
||||
| Background | Core assumption | Relationship to institutions |
|
||||
|-----------|----------------|------------------------------|
|
||||
| **Guardian** | Institutions serve the powerful; collective protection requires network | Distrust of Commission; network solidarity as primary value |
|
||||
| **Senator** | Systems can be worked; leverage and process are the tools | Works within institutions while managing them; political capital logic |
|
||||
| **Worker** | Survival in tight margins; coworker loyalty is the only reliable thing | Neither trusts institutions nor fights them; accepts them as weather |
|
||||
|
||||
---
|
||||
|
||||
### 3.1 Guardian Background
|
||||
|
||||
**Narrative framing:** Someone with Guardian background has, at some point, been in a network that operated outside or against institutional authority — Guardians of Autonomy, community mutual aid, or simply lived experience of Commission overreach in their origin system. They think in terms of *who protects whom* and *who's watching*. They're not necessarily political; they may have absorbed these values experientially without ideological labels.
|
||||
|
||||
**How it inflects the smuggler:**
|
||||
The ring's activities are, to a Guardian-background smuggler, a natural extension of the protective network logic she already believes in. She doesn't see herself as a criminal — she sees herself as part of a system that serves people the regulated system won't. This changes how she frames the ring's cargo: medical lattice components aren't contraband, they're access. The Commission's regulation is a monopoly problem, not a safety protection.
|
||||
|
||||
Her monologue references network solidarity: "We look after our own" is a value, not just a statement. When the network is threatened (Kael's situation), her response is to protect, not to report. The Commission is not a solution to her problems — it's the problem with different uniforms.
|
||||
|
||||
Idiom signals: phrases that imply collective or mutual protection ("we look after our own," "this keeps us safe," "not their business"), references to surveillance as adversarial ("they're watching the corridors closer"), reflexive Commission-skepticism ("another Commission inspection" carries more weight, more contempt).
|
||||
|
||||
**Mellanie — write 2 examples:** (a) Guardian-background smuggler entering The Terminal on a normal morning; (b) Guardian-background smuggler seeing the detective for the first time.
|
||||
|
||||
**How it inflects the detective:**
|
||||
A Guardian-background detective is in a structurally uncomfortable position: she believes in a community's right to self-determination but is employed by the institution that overrides it. She may have unexamined tension between her institutional role and her network values. Her internal voice sometimes catches itself applying institutional logic and stops — not from disloyalty, but from the habit of checking whether what she's doing serves people or just process.
|
||||
|
||||
This creates a more nuanced reading of the ring: she notices earlier that it isn't weaponry, that the people running it aren't villains, that the moral picture is complicated. The analytical frame doesn't disappear — it processes the evidence correctly — but the conclusion "this is a crime" arrives with more friction than for a default-background detective.
|
||||
|
||||
Idiom signals: slight Commission-skepticism applied to her own role, instinct toward community protection over prosecution, "who does this actually hurt?" appears as an internal question earlier in the arc.
|
||||
|
||||
**Mellanie — write 2 examples:** (a) Guardian-background detective walking through The Terminal for the first time; (b) Guardian-background detective after a confrontation with Voss that didn't land.
|
||||
|
||||
---
|
||||
|
||||
### 3.2 Senator Background
|
||||
|
||||
**Narrative framing:** Senator background means exposure to Concord Assembly political culture — either through family, prior work, or a posting in an administrative center. This character thinks in terms of leverage, political capital, and institutional process as tools to be used. They believe in systems (not naively — they've seen how they work), they communicate strategically, and they think about consequences in terms of how they're recorded and remembered.
|
||||
|
||||
**How it inflects the smuggler:**
|
||||
A Senator-background smuggler is an unusual animal. She ended up on Sova with this background for reasons that suggest a fall — political family, bad posting, something that deposited her in freight work. She still thinks in political terms. The ring is, to her, a structure with power dynamics that can be managed. She assesses Nils as a faction leader, Voss as a compromisable middle manager, Kael as an uncertain ally. She has more framework for navigating institutional pressure than the default smuggler.
|
||||
|
||||
Her monologue carries strategic calculation that the default smuggler doesn't have: "If Nils moves against us, who has leverage over Nils?" She names power structures. She's more comfortable with authority figures because she spent time being one or adjacent to one.
|
||||
|
||||
Idiom signals: political vocabulary deployed in operational context ("who holds the leverage here," "what does this cost us politically," "that's a favor spent"), more awareness of chain of command, comfort with complexity and multiple-move thinking.
|
||||
|
||||
**Mellanie — write 2 examples:** (a) Senator-background smuggler reading a tense moment between Voss and Nils; (b) Senator-background smuggler deciding whether to warn Kael about the detective.
|
||||
|
||||
**How it inflects the detective:**
|
||||
A Senator-background detective is most at home in the Commission's formal institutional structure. He knows how to work the process because he's seen political process at close range. He's less likely to be frustrated by bureaucratic obstacles and more likely to use them as tools. He's also more aware of how investigations can be used politically — and more careful to distinguish between evidence that serves justice and evidence that serves someone's career.
|
||||
|
||||
This can work two ways: he's more sophisticated about when to file and when not to, and he's more aware that the ring is a political problem as well as a criminal one. The Syndic connections in the ring's supply chain are visible to him as political economy, not just logistics.
|
||||
|
||||
Idiom signals: references to political process ("that'll go on record," "who is this actually going to serve"), awareness of institutional optics, formal courtesy in internal voice (he holds standards in private that mirror public institutional expectations).
|
||||
|
||||
**Mellanie — write 2 examples:** (a) Senator-background detective receiving unhelpful cooperation from Maret (deflection, formal compliance); (b) Senator-background detective realizing Sera has evidence she hasn't reported.
|
||||
|
||||
---
|
||||
|
||||
### 3.3 Worker Background
|
||||
|
||||
**Narrative framing:** Worker background is the default — or close to it. Born and raised in the working logistics economy of a station or freight hub. Grew up with shift schedules, margin pressure, and coworker bonds as primary social fabric. Institutions are not enemies (the Guardian stance) or tools (the Senator stance) — they're weather. You work around them when you can, you deal with them when you can't, and you don't waste energy on ideology about them.
|
||||
|
||||
**How it inflects the smuggler:**
|
||||
The Worker-background smuggler is the closest to the spec as written — she *is* the baseline. The ring isn't an ideological project; it's a response to economic conditions. The moral dimension is simple: this is what keeps people fed. She doesn't dress it up. She doesn't philosophize about Commission regulation. She just runs the job.
|
||||
|
||||
Her monologue about the ring's cargo is practical, not moral: "Medical components. That's for people who need lattice work they can't afford." She's not celebrating it. She's explaining it to herself, briefly, and moving on. She's the character most likely to be genuinely conflicted when the ring puts people she knows at risk — because she joined for community, and the community is now in danger.
|
||||
|
||||
Idiom signals: shift-economy references ("that's a week's pay gone"), physical work vocabulary, coworker solidarity language that's practical not sentimental ("you cover for your people"), no ideological framing.
|
||||
|
||||
**Mellanie — write 2 examples:** (a) Worker-background smuggler after a long shift where nothing went wrong (genuine relief in mundane form); (b) Worker-background smuggler finding out about Kael's corridor meeting.
|
||||
|
||||
**How it inflects the detective:**
|
||||
A Worker-background detective is a less common institutional profile — someone who came up from the logistics world, or the adjacent working community of a station, and then entered Commission work. This creates the most dramatic read of the Sova Transit District: he *knows* what this world looks like from inside. The community's distrust of him isn't abstract — he grew up in a community that had this relationship with Commission investigators.
|
||||
|
||||
His analytical frame is the same, but its application produces a different emotional texture. He reads Voss not just as a shift supervisor but as someone managing his people in a system that gives them no margin. He reads the ring not just as a crime but as what people do when the legal option doesn't work. He's not excusing it — but he's explaining it to himself in ways a Senator-background detective wouldn't.
|
||||
|
||||
Idiom signals: working vocabulary that leaks through the institutional frame ("another form to fill out" with genuine frustration), more personal reads on community behavior, faster comprehension of coworker loyalty dynamics.
|
||||
|
||||
**Mellanie — write 2 examples:** (a) Worker-background detective entering The Terminal and recognizing it as a place he knows in his bones; (b) Worker-background detective having a moment of sympathy for Kael that he then has to file away.
|
||||
|
||||
---
|
||||
|
||||
## Chapter 4: Mood Modifiers
|
||||
|
||||
The 8+1 moods from D-035 (`neutral`, `anxious`, `frustrated`, `content`, `suspicious`, `warm`, `hostile`, `focused`) are line-selection tags and delivery expectations. They work together: a line tagged `mood: anxious` is preferred when the character's current mood state is Anxious, and it is *authored to sound anxious*.
|
||||
|
||||
Mood modifiers are **not separate line pools.** They are a) selection weights that surface mood-appropriate lines, and b) authoring constraints on how lines in a given mood register should feel. The goal is not that the player is explicitly told "you're anxious now" — it's that anxious-mood lines surface when they should and sound anxious when they play.
|
||||
|
||||
### 4.1 The Core Principle: Mood Inflects Register
|
||||
|
||||
Each mood bends the character's voice toward a version of itself. The base register (Chapter 1) doesn't change. The mood is an adjective applied to that register, not a replacement for it.
|
||||
|
||||
| Mood | Smuggler inflection | Detective inflection |
|
||||
|------|-------------------|---------------------|
|
||||
| `neutral` | Baseline. Dry warmth. Measured. | Baseline. Professional. Structured. |
|
||||
| `anxious` | Goes smaller and faster. More questions. Physical sensation surfaces. | Goes shorter and more personal. Contractions increase. Self-directs. |
|
||||
| `frustrated` | Goes flat. Sarcasm. "Of course." | Sardonic understatement. Cold. |
|
||||
| `content` | Warms, expands slightly. More humor. | Structured satisfaction. Humor surfaces. |
|
||||
| `suspicious` | Narrows. More observation of specific people. Hypotheses pile up. | Files faster. More quantification. "Coincidence?" frequency increases. |
|
||||
| `warm` | More name-drops. Affectionate observations. Longer people-reads. | First-name register expands beyond Sera. More personal disclosure. |
|
||||
| `hostile` | Edges. Fewer words about the hostile object. Watchful. | Clinical distance increases. Dehumanizing label (surname-only). |
|
||||
| `focused` | Strips down. Only the current task. Environmental and NPC data pruned ruthlessly. | Most structured voice. Near-mechanical. Labels and flags only. |
|
||||
|
||||
---
|
||||
|
||||
### 4.2 Mood Modifier Details
|
||||
|
||||
**`neutral` — baseline delivery**
|
||||
|
||||
Both characters at their natural resting state. Not happy, not stressed. Working. This is the voice that carries most of the game's content. Lines tagged `neutral` or untagged should default to this register.
|
||||
|
||||
Key authoring note: Neutral smuggler is NOT flat or bland — she has dry warmth and laconic humor. Neutral detective is NOT cold — he has professional engagement and occasional wry observation. "Neutral" means the voice is itself, not that the voice is suppressed.
|
||||
|
||||
**`anxious` — compression and acceleration**
|
||||
|
||||
The threat or uncertainty feels present. The character's cognitive bandwidth is partially occupied by monitoring something they can't resolve.
|
||||
|
||||
- *Smuggler:* Sentences get shorter. Questions pile up. Physical sensation surfaces ("Hands are cold." / "Stomach's tight."). Humor disappears. First names become clipped. The operational countdown appears as a comfort mechanism — counting what she can control.
|
||||
- *Detective:* Contractions multiply. Complete sentences break up. Self-monitoring appears ("I'm too close to this."). The analytical questions become self-directed rather than case-directed. Physical sensation barely surfaces but does: "Need to focus."
|
||||
|
||||
Lines tagged `mood: anxious` should feel compressed. Not panicked — the characters are experienced — but alert in a way that presses on the surface of the text.
|
||||
|
||||
**`frustrated` — controlled deflation**
|
||||
|
||||
Something isn't working. The block is structural, not threatening.
|
||||
|
||||
- *Smuggler:* Flat declarations. Sarcastic understatement. "Of course." / "Great." Dark humor returns — she goes wry under frustration. Names get blamed: "Voss did it again." Swearing surfaces (mild — the character swears, but not obscenely).
|
||||
- *Detective:* Sardonic compression. Dismissive shorthand: "Standard." meaning the opposite. The institutional frame holds but it fits uncomfortably. He doesn't swear; frustration surfaces as brittle patience.
|
||||
|
||||
Lines tagged `mood: frustrated` should feel like controlled flat. Both characters have learned not to waste anger — they spend it in specific, pointed ways.
|
||||
|
||||
**`content` — expansion and warmth**
|
||||
|
||||
Things are working. The current moment is manageable or even good.
|
||||
|
||||
- *Smuggler:* Slight expansion — still short, but more generous. More humor. First names carry warmth. Environmental description picks up (she actually notices the space when she's not scanning for threats). "Home sweet home" is a content line.
|
||||
- *Detective:* More complete and elegant sentences. Humor surfaces without prompting. The analytical frame fits comfortably — it's doing its job. Fewer corrective self-directives.
|
||||
|
||||
Lines tagged `mood: content` are the hardest to write because they need to feel genuinely good without being saccharine. The character's voice remains itself; it just sits in it more easily.
|
||||
|
||||
**`suspicious` — narrowing and intensification**
|
||||
|
||||
Something's off. The character's attention is directing toward a specific object or pattern.
|
||||
|
||||
- *Smuggler:* More NPC-specific observation. Questions multiply around the specific person or thing. Hedges fall off — she trusts her read. Operational contingency thinking activates: "If that's what I think it is, then..."
|
||||
- *Detective:* Filing rate increases. "Coincidence?" appears more. He cross-references against baseline more explicitly. The analytical questions become hypotheses rather than open threads.
|
||||
|
||||
Lines tagged `mood: suspicious` should feel *directed*. The suspicion has an object — even if the character can't name it yet. The voice narrows toward whatever is generating the suspicion.
|
||||
|
||||
**`warm` — relational softening**
|
||||
|
||||
The character is in a moment of genuine positive connection. This is not `content` (good situation) — this is specifically warm *toward someone*.
|
||||
|
||||
- *Smuggler:* More name-drops with positive color. People-reads are generous and long. She notices when someone seems well, not just when they seem off. Humor becomes inclusive rather than dry. She might express something like affection, obliquely.
|
||||
- *Detective:* First-name register expands beyond Sera — he might first-name someone he normally surnames if the moment calls for it. Personal disclosure is slightly more available. The analytical frame softens: he observes without immediately filing.
|
||||
|
||||
Lines tagged `mood: warm` are most visible in the detective because they represent a departure from his baseline. For the smuggler, warmth is closer to her baseline; the lines should be a slightly more saturated version of her natural register.
|
||||
|
||||
**`hostile` — clinical or defensive reduction**
|
||||
|
||||
The relationship to the hostile object is adversarial. The character is managing threat.
|
||||
|
||||
- *Smuggler:* Less said, more watched. She goes quiet around the hostile object — mentions them tersely, observations are monitoring-reads rather than social-reads. "Nils walked past." Period. No color.
|
||||
- *Detective:* Dehumanizing label returns even for NPCs who have previously graduated to first-name in his monologue. "Venn, S." instead of "Sera" signals the relationship has turned. Analytical lines about the hostile object are more clinical.
|
||||
|
||||
Lines tagged `mood: hostile` should feel like distance enforced deliberately. Neither character becomes cruel — cruelty requires emotional investment. The hostile register is managed withdrawal.
|
||||
|
||||
**`focused` — operational reduction**
|
||||
|
||||
The character is executing a task. Everything not relevant is stripped out.
|
||||
|
||||
- *Smuggler:* The operational countdown is at maximum. Times, routes, names in task-relevant order. Environmental texture disappears. People are reduced to their role in the current operation. She's not cold — she's locked in.
|
||||
- *Detective:* The analytical frame at its most mechanical. Labels only. No editorial. "Terminal. Commission access. Logging in." He strips his voice to the minimum that keeps the investigation moving.
|
||||
|
||||
Lines tagged `mood: focused` should feel efficient to the point of austerity. For the smuggler especially, this is the mode that feels most competent — she's at her best when she's locked in.
|
||||
|
||||
---
|
||||
|
||||
### 4.3 Mood-as-Selection-Weight (Technical Note for Gestalt)
|
||||
|
||||
The mood tags on monologue lines function as selection weights in the engine:
|
||||
|
||||
1. The simulation produces a current `mood_state` for the player character (server-side, from the mood system in #323)
|
||||
2. The line selection system applies a weight bonus to lines tagged with the matching mood
|
||||
3. Lines tagged `mood: [neutral]` or untagged are always eligible; lines tagged with specific moods are preferred when the mood matches
|
||||
|
||||
**The same base line should NOT be re-authored per mood.** A smuggler entering The Terminal does not need 9 `enter_location` variants (one per mood). The system should:
|
||||
- Select from the available `enter_location` pool
|
||||
- Apply mood-weight bonuses to lines with the matching mood tag
|
||||
- Ensure at least 1-2 lines per trigger/location have each major mood tagged
|
||||
|
||||
For FRIEND arc content specifically, mood-specific variants are most valuable at crisis beats (Phase 3-4 of the arc), where the emotional register shifts dramatically and the mood state is predictable. Authors should prioritize mood-tagging for:
|
||||
- Post-contradiction observation lines (likely `suspicious` or `anxious`)
|
||||
- Post-confrontation post-conversation lines (likely `warm` → `hostile` transition zone)
|
||||
- Contaminated trust time_idle lines (likely `suspicious` + `warm` collision)
|
||||
|
||||
---
|
||||
|
||||
## Chapter 5: Modifier Combination Logic
|
||||
|
||||
Traits, backgrounds, and moods interact. Some combinations have emergent properties:
|
||||
|
||||
**High coherence combinations** (reinforce each other):
|
||||
- Cautious + Guardian background: more second-guessing of institutional solutions, more checking of network alternatives
|
||||
- Bold + Ruthless: decisive and instrumental — the fastest decision-maker, for better or worse
|
||||
- Compassionate + Worker background: the character who most viscerally feels the human cost of what's happening to Kael and Naia
|
||||
- Suspicious mood + Curious trait: questions multiply exponentially — the character follows every thread simultaneously
|
||||
|
||||
**High tension combinations** (create internal conflict):
|
||||
- Honest + Deceptive situation (character who can't self-lie encountering a situation where she needs to): the monologue catches itself mid-rationalization and overrides it
|
||||
- Ruthless + warm mood: the warmth is visible and slightly uncomfortable — the character senses she's letting her guard down, notes it
|
||||
- Senator background + Worker background idioms (where the character's formation bleeds through the professional veneer): the occasional shift vocabulary surfaces in otherwise formal speech
|
||||
|
||||
**FRIEND arc special case:**
|
||||
Trait and background modifiers should be considered especially carefully for lines in the FRIEND arc. The same arc beat — "Kael met someone I don't know" — produces dramatically different emotional readings depending on trait combination:
|
||||
|
||||
| Trait | Smuggler's first-move internal response to the Kael contradiction |
|
||||
|-------|------------------------------------------------------------------|
|
||||
| Cautious | Checks herself: "Maybe it's nothing. There could be a work reason." (sits with it longer) |
|
||||
| Bold | Names it immediately: "That's a breach. Kael met someone unauthorized." |
|
||||
| Compassionate | Worries about Kael first: "What's he gotten himself into?" |
|
||||
| Ruthless | Calculates exposure: "How much does this contact know?" |
|
||||
| Honest | Won't minimize: "He was there. That wasn't anyone we know." |
|
||||
| Deceptive | Minimizes: "Kael's allowed his own contacts. It's fine." (not fine) |
|
||||
|
||||
These aren't separate arc paths — they're the same arc with different pacing and emotional texture. A Cautious smuggler reaches the confrontation later. A Bold one gets there faster and possibly too fast. The arc is the same. The voice is not.
|
||||
|
||||
---
|
||||
|
||||
## Appendix: Background Phrasing Quick Reference
|
||||
|
||||
For Mellanie — a vocabulary guide per background to use when writing example lines:
|
||||
|
||||
**Guardian background idioms:**
|
||||
- "Looking out for your people" / "covering for each other" (protection network language)
|
||||
- References to Commission as "them," surveillance as a threat
|
||||
- Collective pronouns where others might use "I": "we don't report things like this"
|
||||
- Suspicion of institutional solutions: "who does that actually serve?"
|
||||
|
||||
**Senator background idioms:**
|
||||
- "On record" / "that goes on record" / "recorded as"
|
||||
- Leverage vocabulary: "what does that cost us," "who holds the note on that"
|
||||
- Chain-of-command awareness: "above Nils" / "below Voss on that"
|
||||
- Process language: "formally," "through channels," "the filing on that says"
|
||||
|
||||
**Worker background idioms:**
|
||||
- Shift-economy references: "that's a week's difference," "shift schedule says"
|
||||
- Practical solidarity: "you cover your people," "that's what you do"
|
||||
- Acceptance of conditions: "that's how the station runs" (not resigned — just realistic)
|
||||
- Concrete physical references: "the smell of cargo lubricant," "my feet ache"
|
||||
|
||||
---
|
||||
|
||||
*Narrative framing complete as of 2026-02-20. Mellanie to supply example lines for all section prompts marked "Mellanie — write X examples." Gestalt to validate mood → delivery mappings in Chapter 4 for mechanical coherence with server-side mood system (#323).*
|
||||
@@ -348,7 +348,7 @@ fn run_dialogue(index: &LinePoolIndex, args: &Args) {
|
||||
"situation",
|
||||
"arrival, shift_start, shift_end, shift_transition, bar_evening, \
|
||||
night_shift, investigation, confrontation, social, alone, \
|
||||
emergency, routine, observation",
|
||||
emergency, routine, observation, greeting",
|
||||
)
|
||||
})
|
||||
.collect()
|
||||
@@ -596,6 +596,7 @@ fn situation_str(s: &Situation) -> &'static str {
|
||||
Situation::Emergency => "emergency",
|
||||
Situation::Routine => "routine",
|
||||
Situation::Observation => "observation",
|
||||
Situation::Greeting => "greeting",
|
||||
}
|
||||
}
|
||||
|
||||
@@ -637,5 +638,6 @@ fn mood_str(m: &Mood) -> &'static str {
|
||||
Mood::Conflicted => "conflicted",
|
||||
Mood::Concerned => "concerned",
|
||||
Mood::Relieved => "relieved",
|
||||
Mood::Focused => "focused",
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,6 +79,9 @@ impl FromStr for TrustTier {
|
||||
}
|
||||
|
||||
/// D-028 Layer 2: Situation context — when this line can fire.
|
||||
///
|
||||
/// 14 v0.1 values: 13 original + Greeting added Sprint 8 (D-035 amendment)
|
||||
/// for PC dialogue pools initial contact lines.
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
pub enum Situation {
|
||||
Arrival,
|
||||
@@ -94,6 +97,8 @@ pub enum Situation {
|
||||
Emergency,
|
||||
Routine,
|
||||
Observation,
|
||||
/// Added Sprint 8 (D-035 amendment): PC dialogue initial contact lines.
|
||||
Greeting,
|
||||
}
|
||||
|
||||
impl FromStr for Situation {
|
||||
@@ -113,6 +118,7 @@ impl FromStr for Situation {
|
||||
"emergency" => Ok(Self::Emergency),
|
||||
"routine" => Ok(Self::Routine),
|
||||
"observation" => Ok(Self::Observation),
|
||||
"greeting" => Ok(Self::Greeting),
|
||||
_ => Err(ParseEnumError {
|
||||
kind: "Situation",
|
||||
value: s.to_string(),
|
||||
@@ -157,6 +163,9 @@ impl FromStr for Topic {
|
||||
}
|
||||
|
||||
/// D-028 Layer 4: Mood tag — influences weighted selection.
|
||||
///
|
||||
/// 9 v0.1 values: 8 original + Focused added Sprint 8 (D-035 amendment)
|
||||
/// for Kael dialogue at The Terminal and maintenance corridors.
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
pub enum Mood {
|
||||
Fond,
|
||||
@@ -167,6 +176,8 @@ pub enum Mood {
|
||||
Conflicted,
|
||||
Concerned,
|
||||
Relieved,
|
||||
/// Added Sprint 8 (D-035 amendment): Kael dialogue at Terminal/corridors.
|
||||
Focused,
|
||||
}
|
||||
|
||||
impl FromStr for Mood {
|
||||
@@ -181,6 +192,7 @@ impl FromStr for Mood {
|
||||
"conflicted" => Ok(Self::Conflicted),
|
||||
"concerned" => Ok(Self::Concerned),
|
||||
"relieved" => Ok(Self::Relieved),
|
||||
"focused" => Ok(Self::Focused),
|
||||
_ => Err(ParseEnumError {
|
||||
kind: "Mood",
|
||||
value: s.to_string(),
|
||||
@@ -664,6 +676,7 @@ mod tests {
|
||||
"emergency",
|
||||
"routine",
|
||||
"observation",
|
||||
"greeting", // Sprint 8 amendment (D-035)
|
||||
];
|
||||
for v in values {
|
||||
assert!(
|
||||
@@ -704,6 +717,7 @@ mod tests {
|
||||
"conflicted",
|
||||
"concerned",
|
||||
"relieved",
|
||||
"focused", // Sprint 8 amendment (D-035)
|
||||
];
|
||||
for v in values {
|
||||
assert!(v.parse::<Mood>().is_ok(), "Failed to parse mood: {}", v);
|
||||
|
||||
Reference in New Issue
Block a user