// 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 again. Low traffic, less oversight. Funny how that keeps happening." ), ], knowledge_payload: Some("Bay seven has been given a reduced crew in a low-oversight slot. The subordinate speaker notes the pattern without directly accusing anyone."), ), ( 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: Superior, 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."), ), ], )