diff --git a/content/npc-conversations/overheard.ron b/content/npc-conversations/overheard.ron new file mode 100644 index 000000000..9d3a13af3 --- /dev/null +++ b/content/npc-conversations/overheard.ron @@ -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."), + ), + + ], +) diff --git a/content/npc-conversations/overheard.yaml.deprecated b/content/npc-conversations/overheard.yaml.deprecated new file mode 100644 index 000000000..4de669bbd --- /dev/null +++ b/content/npc-conversations/overheard.yaml.deprecated @@ -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] diff --git a/decisions/content.md b/decisions/content.md index 4f55809ee..62fde9b21 100644 --- a/decisions/content.md +++ b/decisions/content.md @@ -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)` +- **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)*