feat(content): replace overheard.yaml with generator-compatible RON format

Archives the 48 hand-authored overheard conversations that referenced
deleted named NPCs (Kael, Sera, Torek). New RON pool format is
parameterized by role pair and zone type, culture-neutral, with
knowledge_payload for investigative value. 15 sample conversations
across 5 zone types. Adds content pattern note to decisions/content.md.

Ticket: #664

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-17 10:57:49 +01:00
co-authored by Claude Opus 4.6
parent 9a89d0cc7c
commit d9c2811842
3 changed files with 1166 additions and 1 deletions
+295
View File
@@ -0,0 +1,295 @@
// Overheard Conversations Pool
//
// Schema: server/src/npc/overheard.rs :: OverheardPool (TBD — pending #663)
// Ticket: #664 (copy team, Sprint 27)
// Decision refs: D-078 (occlusion-resilient authoring), D-142 (zone-type architecture),
// D-122 (all NPCs generated), D-139 (behavior primitives model)
//
// FORMAT NOTE: This file introduces a new content pattern — generator-compatible overheard
// conversations parameterized by role pair and zone type. Pending D-record (see Q-WTF
// note at end of decisions/content.md). The format is authored independently of any
// specific NPC instance: role_pair draws from zone-type template role IDs; the generator
// resolves role → NPC at runtime.
//
// HOW THIS WORKS:
// At runtime, the generator finds two NPCs in proximity whose roles match `role_pair`
// and whose zone type matches an entry in `zone_types`. The conversation is assembled
// with per-word occlusion applied based on player distance, ambient noise level, and
// ListeningFocus stance (D-078). Culture modifier can be applied to the assembled text
// at the same layer as behavior primitive assembly.
//
// OCCLUSION-RESILIENT AUTHORING RULES (D-078 — apply to every line authored here):
// 1. Front-load key information — most important word in the first third of the line.
// 2. Short declarative sentences — one idea per turn.
// 3. No pronoun-first openers — first word has highest drop risk under occlusion.
// A dropped pronoun without antecedent is unresolvable. Use role nouns or subjects.
// 4. Each turn is self-contained — a player who hears only one side gets a complete thought.
//
// REGISTERS:
// Work — shift logistics, job gripes, operational notes
// Social — idle chat, personal news, relationship signals
// Gossip — third-party information with player-relevant knowledge payload
//
// RELATIONSHIP CONTEXT:
// Colleague — same-level co-workers
// Acquaintance — recognize each other, not close
// Friend — off-duty warmth, shared history signals
// Superior — one holds authority over the other (speaker_a is superior)
// Subordinate — one defers to the other (speaker_a is subordinate)
//
// KNOWLEDGE PAYLOAD:
// Describes what a player can infer from a fully-heard exchange, or the
// key fragment retained under partial occlusion. None if the exchange is
// social atmosphere with no investigative value.
//
// PRIMITIVES ARE CULTURE-NEUTRAL. No cultural attitudes in action or speech text.
(
conversations: [
// =====================================================================
// INDUSTRIAL FREIGHT
// =====================================================================
(
id: "ovh_ifr_001",
zone_types: ["industrial_freight"],
role_pair: (a: "dock_worker", b: "dock_worker"),
register: Work,
relationship_context: Colleague,
topic: "equipment_fault",
lines: [
( speaker: A, text: "Loading arm three is grinding again. Filed the report last week." ),
( speaker: B, text: "Maintenance says next cycle. Someone loses a hand before anything moves." ),
],
knowledge_payload: None,
),
(
id: "ovh_ifr_002",
zone_types: ["industrial_freight"],
role_pair: (a: "dock_worker", b: "dock_worker"),
register: Work,
relationship_context: Colleague,
topic: "manifest_discrepancy",
lines: [
( speaker: A, text: "Weight manifest came in four hundred kilos short again. Third time this month." ),
( speaker: B, text: "Four hundred kilos doesn't disappear from a calibration error. It goes somewhere." ),
],
knowledge_payload: Some("Recurring manifest weight discrepancy. Dock workers suspicious of the official explanation. Potential signal of systematic removal."),
),
(
id: "ovh_ifr_003",
zone_types: ["industrial_freight"],
role_pair: (a: "foreman", b: "dock_worker"),
register: Work,
relationship_context: Superior,
topic: "bay_assignment",
lines: [
( speaker: A, text: "Bay seven crew is two short tonight. Fill the gap from B-section." ),
( speaker: B, text: "Bay seven's low traffic. Less oversight. Someone wanted that." ),
],
knowledge_payload: Some("Bay seven has been given a reduced crew in a low-oversight slot. The subordinate speaker suspects this is deliberate rather than operational."),
),
(
id: "ovh_ifr_004",
zone_types: ["industrial_freight"],
role_pair: (a: "technician", b: "technician"),
register: Work,
relationship_context: Colleague,
topic: "camera_anomaly",
lines: [
( speaker: A, text: "Junction camera at C-corridor was repositioned. Nobody filed a maintenance request." ),
( speaker: B, text: "Camera moved without logging is a compliance violation. Someone did it off-book." ),
],
knowledge_payload: Some("A surveillance camera was moved without documentation. Suggests deliberate manipulation of oversight coverage."),
),
(
id: "ovh_ifr_005",
zone_types: ["industrial_freight"],
role_pair: (a: "dock_worker", b: "dock_worker"),
register: Social,
relationship_context: Friend,
topic: "career_stasis",
lines: [
( speaker: A, text: "Transfer application went through. Third time. Got rejected again." ),
( speaker: B, text: "Some people just belong to a place whether they want to or not." ),
],
knowledge_payload: None,
),
// =====================================================================
// ENTERTAINMENT HOSPITALITY
// =====================================================================
(
id: "ovh_hos_001",
zone_types: ["entertainment_hospitality"],
role_pair: (a: "hospitality_staff", b: "hospitality_staff"),
register: Social,
relationship_context: Colleague,
topic: "guest_behavior",
lines: [
( speaker: A, text: "Room fourteen left every amenity in the bath untouched. For three nights." ),
( speaker: B, text: "Some guests want the illusion of service, not the thing itself." ),
],
knowledge_payload: None,
),
(
id: "ovh_hos_002",
zone_types: ["entertainment_hospitality"],
role_pair: (a: "concierge", b: "security"),
register: Work,
relationship_context: Colleague,
topic: "guest_anomaly",
lines: [
( speaker: A, text: "Guest in room nine hasn't left the room since check-in. Thirty-six hours." ),
( speaker: B, text: "Tray service three times, no housekeeping, no movement. Worth a wellness check." ),
],
knowledge_payload: Some("A guest has been isolated in their room for an extended period. Security and front desk are beginning to flag this as unusual."),
),
(
id: "ovh_hos_003",
zone_types: ["entertainment_hospitality"],
role_pair: (a: "kitchen_worker", b: "kitchen_worker"),
register: Work,
relationship_context: Colleague,
topic: "supply_chain",
lines: [
( speaker: A, text: "Supplier changed the protein spec again. Third reformulation this cycle." ),
( speaker: B, text: "Changed means cheaper. Guests won't notice until they do, and then they'll blame us." ),
],
knowledge_payload: None,
),
(
id: "ovh_hos_004",
zone_types: ["entertainment_hospitality"],
role_pair: (a: "security", b: "security"),
register: Work,
relationship_context: Colleague,
topic: "access_pattern",
lines: [
( speaker: A, text: "Service corridor had three badge reads last night. All outside shift hours." ),
( speaker: B, text: "Off-hours service access should be logged with management. Check if it was." ),
],
knowledge_payload: Some("Service corridor is being accessed outside normal hours without clear authorization. Pattern may indicate unauthorized activity."),
),
// =====================================================================
// RESIDENTIAL STATION
// =====================================================================
(
id: "ovh_rst_001",
zone_types: ["residential_station"],
role_pair: (a: "resident", b: "resident"),
register: Social,
relationship_context: Acquaintance,
topic: "block_conditions",
lines: [
( speaker: A, text: "Air recycler on deck six has been cycling short again. Reported it twice." ),
( speaker: B, text: "Block admin is backed up. Three units filed the same fault this cycle." ),
],
knowledge_payload: None,
),
(
id: "ovh_rst_002",
zone_types: ["residential_station"],
role_pair: (a: "block_admin", b: "maintenance_tech"),
register: Work,
relationship_context: Superior,
topic: "welfare_concern",
lines: [
( speaker: A, text: "Unit forty-two hasn't answered welfare checks in four days. Filing it formal." ),
( speaker: B, text: "Saw lights on two nights ago. Someone's in there. Not answering is a choice." ),
],
knowledge_payload: Some("A residential unit occupant has been avoiding contact for days. Conflicting information: lights suggest presence, but no response to welfare checks."),
),
(
id: "ovh_rst_003",
zone_types: ["residential_station"],
role_pair: (a: "resident", b: "resident"),
register: Gossip,
relationship_context: Friend,
topic: "unexplained_income",
lines: [
( speaker: A, text: "New furniture in unit thirty. Nice furniture. Station dock pay doesn't cover that." ),
( speaker: B, text: "Extra shift somewhere, or extra something. Nobody asks too closely." ),
],
knowledge_payload: Some("A block resident has acquired unexplained goods above their apparent income level. Other residents have noticed and are deliberately not inquiring further."),
),
// =====================================================================
// RESIDENTIAL DISPERSED
// =====================================================================
(
id: "ovh_dis_001",
zone_types: ["residential_dispersed"],
role_pair: (a: "supply_runner", b: "homesteader"),
register: Work,
relationship_context: Acquaintance,
topic: "missing_resident",
lines: [
( speaker: A, text: "Eastern claim hasn't put out a supply crate in six weeks. Door closed on three runs." ),
( speaker: B, text: "Six weeks is a long time to be quiet out there. Someone should go properly." ),
],
knowledge_payload: Some("A dispersed homestead has been unresponsive for six weeks. Supply runner has made three passes without contact. Welfare concern escalating."),
),
(
id: "ovh_dis_002",
zone_types: ["residential_dispersed"],
role_pair: (a: "frontier_medic", b: "liaison"),
register: Gossip,
relationship_context: Colleague,
topic: "off_grid_activity",
lines: [
( speaker: A, text: "New structure went up on the ridge claim. Not on any filed homestead record." ),
( speaker: B, text: "Unfiled structure means someone doesn't want the location in the regional system." ),
],
knowledge_payload: Some("An unregistered structure has appeared in a dispersed residential area. Both speakers recognize the deliberate omission from regional records as significant."),
),
// =====================================================================
// RURAL AGRICULTURAL
// =====================================================================
(
id: "ovh_rag_001",
zone_types: ["rural_agricultural"],
role_pair: (a: "farmer", b: "trader"),
register: Work,
relationship_context: Acquaintance,
topic: "supply_shortage",
lines: [
( speaker: A, text: "Irrigation fittings haven't come through in two cycles. Runner said the supplier changed terms." ),
( speaker: B, text: "Supplier changed terms means the price went up or someone else got the contract." ),
],
knowledge_payload: None,
),
(
id: "ovh_rag_002",
zone_types: ["rural_agricultural"],
role_pair: (a: "militia", b: "militia"),
register: Social,
relationship_context: Colleague,
topic: "visitor_pattern",
lines: [
( speaker: A, text: "Same vehicle came through the gate three times this week. Different plates each time." ),
( speaker: B, text: "Different plates, same vehicle. That's not a coincidence, that's a method." ),
],
knowledge_payload: Some("A vehicle has visited the settlement three times in one week under different registration plates. Both militia members recognize this as suspicious rather than operational."),
),
],
)
@@ -0,0 +1,855 @@
# DEPRECATED — archived by ticket #664 (copy team, Sprint 27)
#
# This file is NOT served at runtime. It is preserved for authoring reference only.
#
# WHY DEPRECATED: Every entry in this file references named NPCs from the Sova Transit
# District vertical slice (Kael Davan, Sera Venn, Naia Tamm, Voss, Torek, Renn, Maret,
# Lera, Nils, Drin, Olin, etc.). Per D-122 (all NPCs generated, no hand-authored
# characters), all named character references in this file are invalid against the
# generated NPC population. The drama module system (ticket #158) that these entries
# were authored for was superseded before implementation.
#
# WHAT REPLACED IT: content/npc-conversations/overheard.ron
# Generator-compatible RON pool. Parameterized by role pair and zone type.
# No named NPC references. Culture-neutral text accepting culture modifier at assembly.
#
# WHAT IS STRUCTURALLY WORTH PRESERVING (applied in overheard.ron):
# - Overheard conversations as ambient information layer (D-078)
# - Register taxonomy: social / work / gossip
# - Occlusion-resilient authoring rules (D-078): front-load key info, short
# declarative sentences, no pronoun-first openers, each turn self-contained
# - knowledge_payload pattern for investigative inference
#
# Original file header below:
# NPC-to-NPC Overheard Dialogue Pool
# Ticket: #536 | Author: Mellanie | Sprint: 14
# Decision refs: D-078, D-018, D-071, D-035
#
# LEGACY CONTENT — v0.1 hand-authored pool. DO NOT DELETE.
# All entries in this file reference named NPCs from the Sova Transit District
# vertical slice (Kael Davan, Sera Venn, Naia Tamm, Voss, Nils, Maret Korr, etc.).
# These named NPCs were authored for the drama module system (ticket #158), which
# was superseded before implementation. The named references in this file are
# therefore broken — they reference characters that do not exist in the generated
# NPC population.
# Ticket #664 tracks replacement of this file with a zone-type-aware overheard
# generator that produces conversations from role pairs rather than named characters.
# Until #664 ships, this file is not served at runtime.
#
# These are conversations the player can overhear when stationary near two
# NPCs. The passive dialogue panel (D-078) displays them with per-word
# occlusion based on distance, ambient noise, and ListeningFocus stance.
#
# 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."
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."
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."
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."
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."
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."
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."
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."
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."
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]
+16 -1
View File
@@ -569,4 +569,19 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
---
*44 decisions. Last updated: 2026-03-17 (D-147 aesthetic taste trait)*
---
### Content Pattern Note: Generator-compatible overheard conversation format (ticket #664)
- **Date:** 2026-03-17
- **Status:** Content pattern noted — pending formal D-record (check with Qatux before claiming ID)
- **Pattern:** `content/npc-conversations/overheard.ron` introduces a new content type: a pool of NPC-to-NPC overheard conversations parameterized by `role_pair` and `zone_types` (matching zone-type template role IDs from D-142). No named NPC references. Culture-neutral text that accepts culture modifier at assembly time. Replaces `overheard.yaml.deprecated` (v0.1 hand-authored pool with named NPCs, superseded by D-122).
- **Format fields:** `id`, `zone_types[]`, `role_pair(a, b)`, `register` (Work|Social|Gossip), `relationship_context` (Colleague|Acquaintance|Friend|Superior|Subordinate), `topic`, `lines[(speaker:A|B, text)]`, `knowledge_payload (Option<String>)`
- **Occlusion authoring rules:** D-078 rules apply unchanged — front-load key info, short declarative sentences, no pronoun-first openers, each turn self-contained.
- **Runtime resolution:** Generator selects conversations where two nearby NPCs match `role_pair` and `zone_types`. Knowledge payload is exposed to player inference layer (partial occlusion reduces but cannot eliminate inference value of a fully-heard payload).
- **Schema location:** `server/src/npc/overheard.rs :: OverheardPool` — TBD pending #663 struct changes.
- **Raised by:** Paula (Sprint 27, ticket #664)
- **Decision needed:** Whether to formalize this as D-NNN or treat as sub-pattern of D-142. Recommend D-record since it introduces the `knowledge_payload` field as a new ambient information delivery mechanism distinct from existing dialogue architecture (D-028).
---
*44 decisions. Last updated: 2026-03-17 (D-147 aesthetic taste trait; content pattern note for overheard.ron format added)*