# yaml-language-server: $schema=../../schemas/drama_module.schema.yaml # # Tier 1 Drama Module: The Smuggling Ring (v0.1) # The vertical slice Tier 1 module for D-027. # # NARRATIVE CORE: # A logistics worker (the smuggler PC, if played) is embedded in a small ring # smuggling unlicensed lattice components through Sova Transit District (D-037). # The ring is led by Voss from The Terminal. Kael Davan — a ring member and the # smuggler's FRIEND — is quietly trying to exit to protect his partner Naia Tamm. # Sera Venn (the detective's FRIEND) has noticed Kael's manifest discrepancies # but hasn't reported them, protecting Naia by proxy. # # DUAL-LENS EXPERIENCE: # Smuggler plays INSIDE the ring: manage drops, cover tracks, notice Kael going cold. # Detective plays OUTSIDE: cargo anomalies → follow Kael → witness secret meeting → # confront or protect. # # SUCCESS CRITERIA (D-027): # #1: 30 minutes of daily-life play before the ring activates (min_play_ticks: 2100) # #3: Player names Kael as an NPC they felt conflicted about # #4: observe→notice→follow→discover emerges from systems, not scripts module_id: smuggling_ring_v0_1 display_name: "The Smuggling Ring" version: "0.1" tier: 1 description: > A small ring of logistics workers smuggling unlicensed lattice components through Sova Transit District. The ring's weakest link — Kael Davan — is trying to exit to protect his partner. The detective investigates cargo anomalies. The smuggler manages ring operations and navigates Kael's loyalty crisis. Neither character knows the other's full picture until confrontation forces it. notes: > This module IS the vertical slice (D-027). It exercises every system at full depth: dual-lens NPC observation, tell progression, trust-gated dialogue, knowledge graph confidence accumulation, confrontation weight (D-063), walk-away consequences (D-064), and THE FRIEND contradiction arc (D-034). All outcome paths must feel earned. No outcome is "the right answer" — Kael's situation has no clean resolution. dual_lens: smuggler: > You're inside the ring. Voss manages operations; you handle logistics cover. Kael used to be reliable. Lately he's absent, distracted, making excuses. The drop schedule is at risk. Do you pressure him, cover for him, or cut him? You don't know he's trying to get out. He doesn't know you've noticed. detective: > Cargo manifest discrepancies in The Terminal. Small, systematic, deniable. Your analytical lattice flags them before your conscious mind does. Follow the thread: discrepancy → dock worker with odd schedule → Kael Davan → maintenance corridors → someone he shouldn't be meeting. And then what? Arrest a man trying to leave a ring he never wanted to join? pool: weight: 8 compatible_districts: - sova-transit max_concurrent: 1 # ── ENTRY CONDITIONS ───────────────────────────────────────────────────────── # Ring activity begins after player has had time to establish routine (D-027 #1). # The ring is already running at game start — the module activates when the # storyteller decides the tension has built enough to surface. entry_conditions: world_state: - type: npc_present role: ring-leader - type: npc_present role: ring-member-exiting - type: location_accessible location: the-terminal - type: location_accessible location: maintenance-corridors activation: trigger: storyteller_push min_play_ticks: 2100 # ~35 minutes at 1 tick/second — D-027 criterion #1 # The storyteller pushes activation when player has established presence # in The Terminal or The Last Shift through routine interaction. # Proximity trigger (maintenance-corridors) is a secondary activation path # if the player wanders there early. # ── NPC REQUIREMENTS ───────────────────────────────────────────────────────── # All core roles are named (hand-authored NPCs from the vertical slice). # No generated NPC slots in v0.1 — the smuggling ring uses the 15 authored NPCs. npc_requirements: - role: ring-leader display_hint: > Runs the ring from The Terminal. Logistics authority = cover. Never handles contraband directly. Pressure source for Kael. binding: named named_npc: "npc:voss" must_have_motivation: HANDLER - role: ring-member-exiting display_hint: > Kael Davan. Dock worker, ring member, smuggler's FRIEND. Trying to exit quietly to protect Naia. This is THE FRIEND contradiction. Every event sequence runs through this role. binding: named named_npc: "npc:kael-davan" must_have_pattern: FRIEND must_have_motivation: TURNCOAT - role: partner-uninvolved display_hint: > Naia Tamm. Kael's partner. Does not know about the ring. Her safety is Kael's motivation for exiting. Her ignorance is the moral weight. Discovery of her connection to Kael is a late-investigation revelation. binding: named named_npc: "npc:naia-tamm" must_have_motivation: CIVILIAN - role: evidence-holder display_hint: > Sera Venn. Detective's FRIEND. Commission field tech. She has noticed Kael's manifest discrepancies but hasn't reported them — she knows Naia, and filing means Kael's arrest and Naia's exposure. Her silence IS the detective's investigation blocker in phase 1. binding: named named_npc: "npc:sera-venn" must_have_pattern: FRIEND must_have_motivation: WITNESS - role: ring-operative display_hint: > The ring's operational member in maintenance corridors. Handles physical drops. Not a speaking character — observable behavior only. Can be the anonymous contact Kael meets. binding: named named_npc: "npc:nils-davan" is_optional: false - role: institutional-watcher display_hint: > Maret Korr. A Commission observer embedded at The Terminal. Her growing attention is the external pressure that accelerates the timeline. She doesn't know about the ring specifically — she's tracking cargo patterns. binding: named named_npc: "npc:maret-korr" must_have_motivation: OPERATOR is_optional: true # Module runs without Maret, but with degraded tension arc # ── EVENTS ─────────────────────────────────────────────────────────────────── # Two sequences + one pool. # Sequence A: Kael's exit arc (the FRIEND contradiction backbone) # Sequence B: Investigation pressure arc (escalating discovery opportunities) # Pool: ambient ring activity (fires opportunistically throughout the module) events: sequences: # SEQUENCE A: Kael's Exit Arc # The narrative spine. Each step makes Kael's contradiction more visible. # Observable to both characters, interpreted differently. - sequence_id: kael_exit_arc label: "Kael's Exit Arc" description: > Kael Davan's progressive attempt to leave the ring. Tells intensify. Routine deviations appear. The secret meeting is the pivot point — after it fires, both characters' understanding shifts. steps: - event_id: kael_goes_cold label: "Kael Goes Cold" description: > Kael starts missing social patterns he'd normally keep — fewer bar visits, shorter responses at The Terminal, leaving early. His tell system activates: the shoulder-check behavior appears. Nothing dramatic. Just absence where there was presence. The smuggler notices because they work together. The detective might notice if they've been tracking Kael's baseline. triggers: - type: ticks_since_activation ticks: 300 # ~5 minutes after module activates effects: - type: npc_routine_deviation npc_role: ring-member-exiting description: > Kael skips his usual post-shift drink at The Last Shift. Leaves the terminal 15 minutes early. No explanation. - type: tell_intensify npc_role: ring-member-exiting description: > Kael's shoulder-check behavior activates at The Terminal. Visible to any character with forward vision cone in his direction. sets_flag: kael_behavior_changed - event_id: drop_happens_without_kael label: "Scheduled Drop — Kael Absent" description: > A ring drop occurs in maintenance corridor C-7. Kael was supposed to verify the cargo. He wasn't there. Nils covered it. The smuggler notices the irregularity in the paperwork. The detective — if watching cargo patterns — sees a manifest entry with no verifying signature where one is normally present. triggers: - type: ticks_since_event after_event: kael_goes_cold ticks: 450 # ~7.5 minutes after goes-cold effects: - type: fact_becomes_discoverable fact_id: "ring.kael_missed_verification" discoverable_by: any discovery_method: > Smuggler: check the cargo manifest in The Terminal office. Detective: analytical lattice flags unsigned verification entry. - type: location_state location: maintenance-corridors description: "An unsigned cargo verification entry exists in corridor C-7's log." sets_flag: kael_missed_drop - event_id: kael_secret_meeting label: "Kael's Secret Meeting" description: > Kael meets an off-district contact in maintenance corridor B-7. This is the observable contradiction (D-034): Kael, in a restricted area he has no logged reason to be in, talking to someone who's not in any district NPC roster. His body language is tense. If the player is in visual range: this is the pivot moment. If not: the meeting happens anyway — the world doesn't wait. triggers: - type: ticks_since_event after_event: drop_happens_without_kael ticks: 600 # ~10 minutes after the dropped verification - type: player_proximity target_type: location target: maintenance-corridors radius_tiles: 12 # Player wandering near triggers the meeting early effects: - type: npc_routine_deviation npc_role: ring-member-exiting description: > Kael enters maintenance corridor B-7. Locked door to restricted supply closet. Emerges with the ring-operative 8 minutes later. Neither acknowledges the encounter publicly. - type: fact_becomes_discoverable fact_id: "ring.kael_unauthorized_corridor_access" discoverable_by: any discovery_method: > Player must be in visual range of corridor B-7. Or examine the corridor door access log (investigative action). - type: tell_intensify npc_role: ring-member-exiting description: > After the meeting, Kael's shoulder-check frequency doubles. Also: he avoids eye contact with the smuggler at The Terminal. sets_flag: secret_meeting_occurred - event_id: kael_sends_message label: "Kael Sends the Message" description: > Kael sends an encrypted Meridian message to an off-district contact. The detective's analytical lattice can detect an anomalous outgoing packet from the district node — not the content, just the pattern (frequent, encrypted, sent from cargo bay terminals, not personal devices). The smuggler won't see this unless they're specifically watching Kael. triggers: - type: ticks_since_event after_event: kael_secret_meeting ticks: 200 effects: - type: fact_becomes_discoverable fact_id: "ring.kael_unusual_meridian_activity" discoverable_by: detective discovery_method: > Detective's analytical lattice flags the outgoing packet pattern. Requires player to be in or adjacent to The Terminal cargo bay. sets_flag: kael_message_sent - event_id: ring_leader_confronts_kael label: "Voss Confronts Kael" description: > Voss calls Kael into The Terminal supervisor's office. Closed door. Raised voices (audible only from adjacent room/position). Kael emerges pale. Voss emerges neutral. The smuggler can witness the approach/departure without hearing content. The detective can observe Kael's state immediately after if in The Terminal. This is Voss applying pressure. Kael is now visibly under strain. triggers: - type: flag_set flag: kael_message_sent - type: ticks_since_event after_event: kael_message_sent ticks: 400 effects: - type: npc_routine_deviation npc_role: ring-leader description: "Voss calls Kael into the supervisor's office. Door closed." - type: npc_routine_deviation npc_role: ring-member-exiting description: > Kael emerges from the meeting looking strained. His shoulder-check is now constant. He takes an unscheduled break outside, alone. - type: tell_intensify npc_role: ring-member-exiting description: > Kael's contentment hits lowest observed level. He now actively avoids the ring-operative (Nils) in public. The disconnection is visible. - type: fact_becomes_discoverable fact_id: "ring.voss_kael_private_meeting" discoverable_by: any discovery_method: > Observe the meeting room door (spatial). Or ask Kael directly after (trust-gated dialogue unlocks "Are you alright?" option). sets_flag: voss_pressure_applied # SEQUENCE B: Investigation Pressure Arc # External pressure that escalates the timeline. # Fires in parallel with Sequence A. - sequence_id: investigation_pressure label: "Investigation Pressure Arc" description: > Maret Korr's institutional attention creates a closing window. Her growing interest is the reason the module can't stay in equilibrium forever. She doesn't know about the ring — she's a pattern-watcher. But patterns are what the detective investigates too. Their paths converge. steps: - event_id: maret_flags_anomaly label: "Maret Flags the Cargo Anomaly" description: > Maret Korr files an internal Commission note flagging The Terminal's cargo variance rate as statistically unusual. Not an investigation — just a flag. The detective's institutional access can pull this note. The smuggler has no way to know it exists (unless the detective tells them). triggers: - type: ticks_since_activation ticks: 900 # ~15 minutes after activation effects: - type: fact_becomes_discoverable fact_id: "ring.commission_cargo_flag" discoverable_by: detective discovery_method: > Detective queries Commission data via institutional access (authority access tier, Terminal records). sets_flag: commission_flag_exists - event_id: maret_increases_presence label: "Maret Increases Her Presence" description: > Maret starts spending more time in The Terminal. More frequent walkthroughs during shift changes. Her attention to the cargo bay area is noticeable to anyone watching. Ring members are unnerved. Voss starts accelerating the timeline to close operations before institutional attention becomes formal investigation. triggers: - type: ticks_since_event after_event: maret_flags_anomaly ticks: 600 - type: player_action action: examine target_role: institutional-watcher effects: - type: npc_routine_deviation npc_role: institutional-watcher description: > Maret adds two extra Terminal walkthroughs per shift cycle. Spends 15 minutes studying the cargo bay manifest terminals. - type: tell_intensify npc_role: ring-leader description: > Voss becomes quieter, more deliberate. Less casual conversation. His tell — the stillness before speaking — becomes more frequent. - type: fact_becomes_discoverable fact_id: "ring.voss_accelerating_timeline" discoverable_by: any discovery_method: > Smuggler: Voss mentions "the schedule moving up" in a guarded conversation (trust-gated, ring-insider access required). Detective: observe Voss and Nils in two exchanges within same shift. sets_flag: timeline_accelerating - event_id: final_shipment_scheduled label: "The Final Shipment Is Scheduled" description: > The ring schedules the last major drop — after this, they go dark. This is the closing window. If the detective hasn't uncovered enough by the time this fires, the ring disperses and the operation closes without exposure (escaped outcome). If they have, confrontation becomes unavoidable. The smuggler knows about this drop. Kael doesn't want to participate. Voss insists. triggers: - type: flag_set flag: timeline_accelerating - type: ticks_since_event after_event: maret_increases_presence ticks: 800 effects: - type: fact_becomes_discoverable fact_id: "ring.final_shipment_scheduled" discoverable_by: any discovery_method: > Smuggler: direct notification from Voss. Detective: cargo manifest shows an unusual large entry for 3 days out. - type: npc_routine_deviation npc_role: ring-member-exiting description: > Kael's schedule changes: he's assigned to the cargo bay during the drop window. He doesn't want to be there. sets_flag: final_shipment_known pools: # POOL: Ambient ring activity — opportunistic events that add texture - pool_id: ambient_ring_activity label: "Ambient Ring Activity" description: > Low-level ring business that happens throughout the module regardless of player engagement. Creates the sense that the ring exists independently. Players who look closely will find more; players who don't still feel the world moving. events: - event_id: cargo_discrepancy_appears label: "Small Cargo Discrepancy Appears" description: > A minor manifest irregularity appears in The Terminal records. Small enough to be deniable. Systematic enough to be a pattern. The detective's analytical lattice may flag it. The smuggler can correct it if they notice it — covering tracks is part of their role. triggers: - type: ticks_since_activation ticks: 150 # Fires early and repeats effects: - type: fact_becomes_discoverable fact_id: "ring.cargo_discrepancy_pattern" discoverable_by: any discovery_method: > Detective: analytical lattice flags during Terminal walkthrough. Smuggler: check manifest terminals (or get flagged by the discrepancy in their own work). once: false # Repeats — pattern builds over time - event_id: sera_avoids_torek label: "Sera Avoids Torek at The Bar" description: > Sera Venn reroutes her usual path through The Last Shift to avoid standing near Torek Lintar (the Commission enforcement officer). Anyone watching Sera's normal pattern would notice. This is the detective's first clue that Sera's behavior is odd. triggers: - type: ticks_since_activation ticks: 500 effects: - type: npc_routine_deviation npc_role: evidence-holder description: > Sera takes a longer route to her usual seat, passing through the back of the bar to avoid Torek's sightline. - type: fact_becomes_discoverable fact_id: "ring.sera_avoidance_behavior" discoverable_by: detective discovery_method: > Observe Sera's path through the bar on two separate occasions. Requires forward vision cone and awareness of her baseline route. once: false - event_id: nils_makes_supply_run label: "Nils Makes an Unscheduled Supply Run" description: > The ring-operative (Nils) enters the maintenance corridors with a small container logged as "calibration tools". The container isn't logged for return. Someone paying attention to cargo flow would notice. triggers: - type: ticks_since_activation ticks: 700 effects: - type: npc_routine_deviation npc_role: ring-operative description: "Nils takes a container to maintenance corridor C-7." - type: fact_becomes_discoverable fact_id: "ring.nils_unlogged_cargo" discoverable_by: any discovery_method: > Watch Nils's cargo handling pattern over two shifts. Or examine maintenance corridor C-7 access log. once: false # ── OUTCOMES ───────────────────────────────────────────────────────────────── # Five resolution states. Checked each tick after the first sequence step fires. # Order matters — the storyteller applies the first matching outcome. # is_terminal: true ends the module. outcomes: # 1. RING EXPOSED # Detective successfully uncovers the operation. # Commission becomes involved. Arrests/flight follow. - outcome_id: ring_exposed label: "Ring Exposed" is_terminal: true description: > The detective accumulates enough evidence to trigger a formal Commission inquiry. The ring collapses: arrests, flight, or both. Voss is detained. Kael's situation is now public. The smuggler (if played) faces consequences. Naia learns what Kael was doing — and why he was trying to leave. No clean endings. The right outcome for the detective who goes all the way. conditions: facts_known: - "ring.cargo_discrepancy_pattern" - "ring.kael_unauthorized_corridor_access" - "ring.voss_kael_private_meeting" flags_set: - secret_meeting_occurred # set by kael_secret_meeting event - commission_flag_exists # Commission was watching before exposure effects: - type: npc_disposition npc_role: ring-leader shift: hostile description: "Voss is detained or flees. Commission inquiry opens." - type: npc_disposition npc_role: ring-member-exiting shift: hostile description: > Kael is arrested or disappears. His exit attempt is now moot. His relationship with Naia is exposed. - type: faction_reaction faction: lattice-commission reaction: grateful description: "Commission credits the detective's investigation." - type: npc_exit npc_role: ring-leader description: "Voss leaves the district — detained, fled, or both." # 2. KAEL ESCAPES THE RING # Unique path. Requires the player to engage with Kael directly # and choose to help him rather than expose the ring wholesale. - outcome_id: kael_escapes label: "Kael Escapes the Ring" is_terminal: true description: > Through the player's choices — helping Kael cover his exit, or warning him, or simply choosing not to act on what they know — Kael successfully leaves the ring before the final shipment. He and Naia leave the district quietly. The ring continues without him, smaller and more cautious. This outcome requires discovering Kael's secret AND choosing restraint. The smuggler can engineer this by covering for Kael with Voss. The detective can achieve this by confronting Kael privately rather than filing a report. The most morally complicated path. conditions: facts_known: - "ring.kael_unauthorized_corridor_access" flags_set: - kael_behavior_changed # set by kael_goes_cold — his exit arc begins here - secret_meeting_occurred # set by kael_secret_meeting — the pivot moment - voss_pressure_applied # set by ring_leader_confronts_kael — pressure applied # ring_exposed is checked first in the outcomes list and is terminal, # so kael_escapes only evaluates if ring_exposed hasn't fired. # No flags_not_set needed here — outcome ordering handles priority. effects: - type: npc_disposition npc_role: ring-member-exiting shift: friendly description: "Kael remembers whoever helped him. He's gone, but grateful." - type: npc_exit npc_role: ring-member-exiting description: "Kael and Naia leave Sova Transit District." - type: faction_reaction faction: the-ring reaction: suspicious description: "The ring is destabilized by Kael's exit. Voss is alert to further leaks." # 3. RING COMPLETES OPERATION # The ring finishes the final shipment and goes dark before discovery. # Default path if the detective doesn't move fast enough. - outcome_id: ring_completes label: "Ring Completes the Operation" is_terminal: true description: > The final shipment clears. The ring disperses. Voss transfers. Nils goes quiet. Kael stays — he's now out by default, the ring having dissolved around him. The evidence trail goes cold. The detective closes the case as inconclusive. The smuggler completes their last run and waits to see if there's another. Unsatisfying only if you expected a tidy resolution. The world moved on. conditions: flags_set: - final_shipment_known # set by final_shipment_scheduled event - timeline_accelerating # set by maret_increases_presence — Maret forced their hand facts_not_known: - "ring.cargo_discrepancy_pattern" # detective never found the basic pattern — no investigation ticks_since_activation: 3600 # Module ran for ~60 minutes without full exposure # kael_message_sent was previously gated here but auto-fires at tick ~1550, # making this outcome permanently unreachable. Replaced with player-action fact gate. effects: - type: faction_reaction faction: the-ring reaction: neutral description: "The ring successfully completed this operation. They'll be back." - type: npc_exit npc_role: ring-leader description: "Voss transfers to another station for 'career development'." - type: location_access_change location: maintenance-corridors change: open description: "The restricted supply closet is now empty. Access log shows it cleared." # 4. RING SPLINTERS # Partial discovery. The ring fractures but doesn't fully collapse. # An incomplete ending that leaves threads for future investigation. - outcome_id: ring_splinters label: "Ring Splinters" is_terminal: false # Not terminal — splinter state can evolve description: > Enough evidence surfaces that the ring knows it's been partially seen. Voss shuts down active operations. Nils disappears. Kael stays — now the one person in the district who knows what happened and has no one to tell. The formal investigation stalls for lack of a clear chain of evidence. The detective has facts but not the complete picture. The smuggler faces an awkward return to normalcy. Both know the ring isn't gone — just quiet. conditions: facts_known: - "ring.cargo_discrepancy_pattern" # detective found some evidence — ring responds events_fired: - kael_goes_cold # event ID — Kael's behavioral shift fired flags_set: - kael_missed_drop # set by drop_happens_without_kael — ring destabilized ticks_since_activation: 2400 # Mutually exclusive with ring_completes via facts_known/facts_not_known on # ring.cargo_discrepancy_pattern. No auto-flag gate needed. effects: - type: npc_disposition npc_role: ring-leader shift: suspicious description: "Voss goes quiet. He's watching to see who knows what." - type: npc_exit npc_role: ring-operative description: "Nils stops appearing at The Terminal. Transferred, officially." - type: faction_reaction faction: the-ring reaction: suspicious description: "The ring is alerted to exposure risk. Future operations will be more careful." # 5. INVESTIGATION STALLS (post-splinter exit) # The ring splinters but the detective never breaks through to the pivot evidence. # Explicit terminal exit for the non-terminal ring_splinters state. - outcome_id: ring_stalemate label: "Investigation Stalls" is_terminal: true description: > The ring went dark after the splinter. The detective has the cargo discrepancy on record — enough to flag, not enough to pursue. The case stays open but cold. No arrests. No answers. Kael stays in the district, the only person who knows the full shape of what happened, with no one left to tell it to. The ring will reconstitute elsewhere. It always does. conditions: facts_known: - "ring.cargo_discrepancy_pattern" # ring_splinters already fired (same gate) facts_not_known: - "ring.kael_unauthorized_corridor_access" # detective never reached the pivot evidence flags_set: - kael_missed_drop - final_shipment_known # ring finished while investigation stalled ticks_since_activation: 4500 # 2100 ticks after ring_splinters window — investigation ran cold effects: - type: faction_reaction faction: lattice-commission reaction: neutral description: "The discrepancy flag stays in Maret's file. No follow-up action." - type: npc_exit npc_role: ring-leader description: "Voss quietly transfers. No announcement, no incident report." # 6. MODULE EXPIRY (quiet exit) # Player never engaged at all. Module times out without drama. # NOTE (Gestalt, Sprint 18): Condition uses facts_not_known, not flags_not_set. # kael_behavior_changed fires automatically at tick 300 (time-triggered), making # flags_not_set: [kael_behavior_changed] permanently false after tick 300. # Gate expiry on player-action-required facts instead. - outcome_id: module_abandoned label: "Module Abandoned" is_terminal: true is_expiry: true description: > The player never engaged with the ring's signals. The final shipment completed without incident. The ring disperses on its own schedule. Kael stays. The world is unchanged. This is not failure — it's the game acknowledging that not every conspiracy needs a protagonist. The 70% mundane majority (D-029) plays out: life continued. conditions: facts_not_known: - "ring.cargo_discrepancy_pattern" # Only known via player examination of terminal - "ring.kael_unauthorized_corridor_access" # Only known via player observing Kael in B-7 ticks_since_activation: 5400 # ~90 minutes with zero player investigation effects: - type: faction_reaction faction: the-ring reaction: neutral description: "The ring closed operations without incident. No record of compromise."